From 02da6501911976575d26579057c0ab6f5b2bd9da Mon Sep 17 00:00:00 2001 From: fledge68 Date: Sun, 22 May 2016 00:54:38 +0000 Subject: [PATCH] - added plugins branch - added snes_gx 4.3.4 --- plugins/snes9x_gx/Makefile | 163 + plugins/snes9x_gx/Makefile.gc | 159 + plugins/snes9x_gx/Makefile.xenon | 161 + plugins/snes9x_gx/Makefile1 | 25 + plugins/snes9x_gx/hbc/icon.png | Bin 0 -> 7417 bytes plugins/snes9x_gx/hbc/meta.xml | 10 + plugins/snes9x_gx/portlibs/include/ext2.h | 106 + .../freetype2/freetype/config/ftconfig.h | 477 ++ .../freetype2/freetype/config/ftheader.h | 780 +++ .../freetype2/freetype/config/ftmodule.h | 20 + .../freetype2/freetype/config/ftoption.h | 733 +++ .../freetype2/freetype/config/ftstdlib.h | 173 + .../include/freetype2/freetype/freetype.h | 3919 ++++++++++++++ .../include/freetype2/freetype/ftadvanc.h | 179 + .../include/freetype2/freetype/ftbbox.h | 94 + .../include/freetype2/freetype/ftbdf.h | 209 + .../include/freetype2/freetype/ftbitmap.h | 227 + .../include/freetype2/freetype/ftcache.h | 1125 ++++ .../include/freetype2/freetype/ftchapters.h | 103 + .../include/freetype2/freetype/ftcid.h | 166 + .../include/freetype2/freetype/fterrdef.h | 244 + .../include/freetype2/freetype/fterrors.h | 206 + .../include/freetype2/freetype/ftgasp.h | 120 + .../include/freetype2/freetype/ftglyph.h | 613 +++ .../include/freetype2/freetype/ftgxval.h | 358 ++ .../include/freetype2/freetype/ftgzip.h | 102 + .../include/freetype2/freetype/ftimage.h | 1301 +++++ .../include/freetype2/freetype/ftincrem.h | 353 ++ .../include/freetype2/freetype/ftlcdfil.h | 213 + .../include/freetype2/freetype/ftlist.h | 277 + .../include/freetype2/freetype/ftlzw.h | 99 + .../include/freetype2/freetype/ftmac.h | 274 + .../include/freetype2/freetype/ftmm.h | 378 ++ .../include/freetype2/freetype/ftmodapi.h | 483 ++ .../include/freetype2/freetype/ftmoderr.h | 155 + .../include/freetype2/freetype/ftotval.h | 203 + .../include/freetype2/freetype/ftoutln.h | 537 ++ .../include/freetype2/freetype/ftpfr.h | 172 + .../include/freetype2/freetype/ftrender.h | 230 + .../include/freetype2/freetype/ftsizes.h | 159 + .../include/freetype2/freetype/ftsnames.h | 200 + .../include/freetype2/freetype/ftstroke.h | 716 +++ .../include/freetype2/freetype/ftsynth.h | 80 + .../include/freetype2/freetype/ftsystem.h | 347 ++ .../include/freetype2/freetype/fttrigon.h | 350 ++ .../include/freetype2/freetype/fttypes.h | 588 +++ .../include/freetype2/freetype/ftwinfnt.h | 274 + .../include/freetype2/freetype/ftxf86.h | 83 + .../include/freetype2/freetype/t1tables.h | 504 ++ .../include/freetype2/freetype/ttnameid.h | 1247 +++++ .../include/freetype2/freetype/tttables.h | 759 +++ .../include/freetype2/freetype/tttags.h | 107 + .../include/freetype2/freetype/ttunpat.h | 59 + plugins/snes9x_gx/portlibs/include/ft2build.h | 61 + plugins/snes9x_gx/portlibs/include/gd.h | 889 ++++ plugins/snes9x_gx/portlibs/include/gd_io.h | 52 + plugins/snes9x_gx/portlibs/include/gdfx.h | 73 + plugins/snes9x_gx/portlibs/include/jconfig.h | 44 + plugins/snes9x_gx/portlibs/include/jerror.h | 304 ++ plugins/snes9x_gx/portlibs/include/jmorecfg.h | 369 ++ plugins/snes9x_gx/portlibs/include/jpeglib.h | 1160 +++++ .../portlibs/include/libunrar/archive.hpp | 126 + .../portlibs/include/libunrar/array.hpp | 122 + .../portlibs/include/libunrar/cmddata.hpp | 57 + .../portlibs/include/libunrar/coder.hpp | 24 + .../portlibs/include/libunrar/compress.hpp | 36 + .../portlibs/include/libunrar/consio.hpp | 46 + .../portlibs/include/libunrar/crc.hpp | 10 + .../portlibs/include/libunrar/crypt.hpp | 62 + .../portlibs/include/libunrar/dll.hpp | 140 + .../portlibs/include/libunrar/encname.hpp | 20 + .../portlibs/include/libunrar/errhnd.hpp | 63 + .../portlibs/include/libunrar/extinfo.hpp | 8 + .../portlibs/include/libunrar/extract.hpp | 43 + .../portlibs/include/libunrar/filcreat.hpp | 13 + .../portlibs/include/libunrar/file.hpp | 98 + .../portlibs/include/libunrar/filefn.hpp | 44 + .../portlibs/include/libunrar/filestr.hpp | 9 + .../portlibs/include/libunrar/find.hpp | 53 + .../portlibs/include/libunrar/getbits.hpp | 51 + .../portlibs/include/libunrar/global.hpp | 14 + .../portlibs/include/libunrar/headers.hpp | 308 ++ .../portlibs/include/libunrar/isnt.hpp | 6 + .../portlibs/include/libunrar/list.hpp | 6 + .../portlibs/include/libunrar/loclang.hpp | 354 ++ .../portlibs/include/libunrar/log.hpp | 18 + .../portlibs/include/libunrar/match.hpp | 27 + .../portlibs/include/libunrar/model.hpp | 132 + .../portlibs/include/libunrar/options.hpp | 162 + .../portlibs/include/libunrar/os.hpp | 259 + .../portlibs/include/libunrar/pathfn.hpp | 49 + .../portlibs/include/libunrar/rar.hpp | 77 + .../portlibs/include/libunrar/rardefs.hpp | 24 + .../portlibs/include/libunrar/rarlang.hpp | 10 + .../portlibs/include/libunrar/raros.hpp | 41 + .../portlibs/include/libunrar/rartypes.hpp | 47 + .../portlibs/include/libunrar/rarvm.hpp | 113 + .../portlibs/include/libunrar/rawread.hpp | 32 + .../portlibs/include/libunrar/rdwrfn.hpp | 89 + .../portlibs/include/libunrar/recvol.hpp | 16 + .../portlibs/include/libunrar/resource.hpp | 14 + .../portlibs/include/libunrar/rijndael.hpp | 37 + .../portlibs/include/libunrar/rs.hpp | 32 + .../portlibs/include/libunrar/savepos.hpp | 15 + .../portlibs/include/libunrar/scantree.hpp | 60 + .../portlibs/include/libunrar/sha1.hpp | 17 + .../portlibs/include/libunrar/smallfn.hpp | 8 + .../portlibs/include/libunrar/strfn.hpp | 41 + .../portlibs/include/libunrar/strlist.hpp | 39 + .../portlibs/include/libunrar/suballoc.hpp | 87 + .../portlibs/include/libunrar/system.hpp | 26 + .../portlibs/include/libunrar/timefn.hpp | 54 + .../portlibs/include/libunrar/ulinks.hpp | 9 + .../portlibs/include/libunrar/unicode.hpp | 83 + .../portlibs/include/libunrar/unpack.hpp | 221 + .../portlibs/include/libunrar/version.hpp | 6 + .../portlibs/include/libunrar/volume.hpp | 11 + .../snes9x_gx/portlibs/include/mupdf/fitz.h | 10 + .../portlibs/include/mupdf/fitz_base.h | 249 + .../portlibs/include/mupdf/fitz_draw.h | 121 + .../portlibs/include/mupdf/fitz_res.h | 385 ++ .../portlibs/include/mupdf/fitz_stream.h | 401 ++ .../snes9x_gx/portlibs/include/mupdf/mupdf.h | 680 +++ .../portlibs/include/mupdf/pdftool.h | 27 + plugins/snes9x_gx/portlibs/include/mxml.h | 308 ++ plugins/snes9x_gx/portlibs/include/nfs.h | 60 + plugins/snes9x_gx/portlibs/include/ntfs.h | 148 + plugins/snes9x_gx/portlibs/include/png.h | 2658 ++++++++++ plugins/snes9x_gx/portlibs/include/pngconf.h | 596 +++ .../snes9x_gx/portlibs/include/pnglibconf.h | 180 + .../portlibs/include/sevenzip/7zAlloc.h | 15 + .../portlibs/include/sevenzip/7zBuf.h | 31 + .../portlibs/include/sevenzip/7zCrc.h | 24 + .../portlibs/include/sevenzip/7zDecode.h | 13 + .../portlibs/include/sevenzip/7zExtract.h | 41 + .../portlibs/include/sevenzip/7zFile.h | 74 + .../portlibs/include/sevenzip/7zHeader.h | 57 + .../portlibs/include/sevenzip/7zIn.h | 41 + .../portlibs/include/sevenzip/7zItem.h | 84 + .../portlibs/include/sevenzip/7zVersion.h | 7 + .../portlibs/include/sevenzip/Bcj2.h | 30 + .../snes9x_gx/portlibs/include/sevenzip/Bra.h | 60 + .../portlibs/include/sevenzip/CpuArch.h | 69 + .../portlibs/include/sevenzip/LzmaDec.h | 223 + .../portlibs/include/sevenzip/Types.h | 208 + .../snes9x_gx/portlibs/include/tif_config.h | 260 + plugins/snes9x_gx/portlibs/include/tiff.h | 647 +++ plugins/snes9x_gx/portlibs/include/tiffconf.h | 104 + plugins/snes9x_gx/portlibs/include/tiffio.h | 515 ++ plugins/snes9x_gx/portlibs/include/tiffvers.h | 9 + .../portlibs/include/tremor/config_types.h | 26 + .../portlibs/include/tremor/ivorbiscodec.h | 104 + .../portlibs/include/tremor/ivorbisfile.h | 122 + .../snes9x_gx/portlibs/include/tremor/ogg.h | 206 + .../portlibs/include/tremor/os_types.h | 94 + .../snes9x_gx/portlibs/include/wupc/wupc.h | 49 + plugins/snes9x_gx/portlibs/include/zconf.h | 428 ++ .../snes9x_gx/portlibs/include/zip/ioapi.h | 75 + .../snes9x_gx/portlibs/include/zip/unzip.h | 354 ++ plugins/snes9x_gx/portlibs/include/zip/zip.h | 235 + plugins/snes9x_gx/portlibs/include/zlib.h | 1613 ++++++ plugins/snes9x_gx/readme.txt | 880 ++++ plugins/snes9x_gx/source/audio.cpp | 166 + plugins/snes9x_gx/source/audio.h | 16 + plugins/snes9x_gx/source/button_mapping.c | 117 + plugins/snes9x_gx/source/button_mapping.h | 39 + plugins/snes9x_gx/source/cheatmgr.cpp | 80 + plugins/snes9x_gx/source/filebrowser.cpp | 666 +++ plugins/snes9x_gx/source/filebrowser.h | 79 + plugins/snes9x_gx/source/filelist.h | 327 ++ plugins/snes9x_gx/source/fileop.cpp | 962 ++++ plugins/snes9x_gx/source/fileop.h | 54 + plugins/snes9x_gx/source/filter.cpp | 561 ++ plugins/snes9x_gx/source/filter.h | 64 + plugins/snes9x_gx/source/fonts/font.ttf | Bin 0 -> 55620 bytes plugins/snes9x_gx/source/freeze.cpp | 168 + plugins/snes9x_gx/source/freeze.h | 20 + plugins/snes9x_gx/source/gcunzip.cpp | 529 ++ plugins/snes9x_gx/source/gcunzip.h | 22 + plugins/snes9x_gx/source/gui/gui.h | 1064 ++++ plugins/snes9x_gx/source/gui/gui_button.cpp | 372 ++ plugins/snes9x_gx/source/gui/gui_element.cpp | 582 +++ .../snes9x_gx/source/gui/gui_filebrowser.cpp | 457 ++ plugins/snes9x_gx/source/gui/gui_image.cpp | 255 + .../snes9x_gx/source/gui/gui_imagedata.cpp | 51 + plugins/snes9x_gx/source/gui/gui_keyboard.cpp | 372 ++ .../source/gui/gui_optionbrowser.cpp | 366 ++ .../snes9x_gx/source/gui/gui_savebrowser.cpp | 398 ++ plugins/snes9x_gx/source/gui/gui_sound.cpp | 155 + plugins/snes9x_gx/source/gui/gui_text.cpp | 480 ++ plugins/snes9x_gx/source/gui/gui_trigger.cpp | 303 ++ plugins/snes9x_gx/source/gui/gui_window.cpp | 451 ++ plugins/snes9x_gx/source/images/battery.png | Bin 0 -> 216 bytes .../snes9x_gx/source/images/battery_bar.png | Bin 0 -> 145 bytes .../snes9x_gx/source/images/battery_red.png | Bin 0 -> 230 bytes plugins/snes9x_gx/source/images/bg_bottom.png | Bin 0 -> 838 bytes .../source/images/bg_game_selection.png | Bin 0 -> 1409 bytes .../source/images/bg_game_selection_entry.png | Bin 0 -> 35487 bytes .../snes9x_gx/source/images/bg_options.png | Bin 0 -> 1637 bytes .../source/images/bg_options_entry.png | Bin 0 -> 299 bytes .../snes9x_gx/source/images/bg_preview.png | Bin 0 -> 19890 bytes plugins/snes9x_gx/source/images/bg_top.png | Bin 0 -> 771 bytes plugins/snes9x_gx/source/images/button.png | Bin 0 -> 1842 bytes .../source/images/button_arrow_down.png | Bin 0 -> 792 bytes .../source/images/button_arrow_down_over.png | Bin 0 -> 764 bytes .../source/images/button_arrow_left.png | Bin 0 -> 842 bytes .../source/images/button_arrow_left_over.png | Bin 0 -> 776 bytes .../source/images/button_arrow_right.png | Bin 0 -> 821 bytes .../source/images/button_arrow_right_over.png | Bin 0 -> 775 bytes .../source/images/button_arrow_up.png | Bin 0 -> 746 bytes .../source/images/button_arrow_up_over.png | Bin 0 -> 710 bytes .../source/images/button_gamesave.png | Bin 0 -> 546 bytes .../source/images/button_gamesave_blank.png | Bin 0 -> 1100 bytes .../source/images/button_gamesave_over.png | Bin 0 -> 549 bytes .../snes9x_gx/source/images/button_large.png | Bin 0 -> 3327 bytes .../source/images/button_large_over.png | Bin 0 -> 3442 bytes .../snes9x_gx/source/images/button_long.png | Bin 0 -> 1866 bytes .../source/images/button_long_over.png | Bin 0 -> 1896 bytes .../snes9x_gx/source/images/button_over.png | Bin 0 -> 1911 bytes .../snes9x_gx/source/images/button_prompt.png | Bin 0 -> 1855 bytes .../source/images/button_prompt_over.png | Bin 0 -> 1625 bytes .../snes9x_gx/source/images/button_short.png | Bin 0 -> 1821 bytes .../source/images/button_short_over.png | Bin 0 -> 1907 bytes .../snes9x_gx/source/images/button_small.png | Bin 0 -> 1241 bytes .../source/images/button_small_over.png | Bin 0 -> 1261 bytes .../snes9x_gx/source/images/credits_box.png | Bin 0 -> 2521 bytes .../snes9x_gx/source/images/dialogue_box.png | Bin 0 -> 4827 bytes plugins/snes9x_gx/source/images/icon_dvd.png | Bin 0 -> 1227 bytes .../snes9x_gx/source/images/icon_folder.png | Bin 0 -> 1323 bytes .../source/images/icon_game_cheats.png | Bin 0 -> 3550 bytes .../source/images/icon_game_controllers.png | Bin 0 -> 11068 bytes .../source/images/icon_game_load.png | Bin 0 -> 5705 bytes .../source/images/icon_game_reset.png | Bin 0 -> 5460 bytes .../source/images/icon_game_save.png | Bin 0 -> 5649 bytes .../source/images/icon_game_settings.png | Bin 0 -> 1098 bytes plugins/snes9x_gx/source/images/icon_home.png | Bin 0 -> 294 bytes plugins/snes9x_gx/source/images/icon_sd.png | Bin 0 -> 644 bytes .../snes9x_gx/source/images/icon_settings.png | Bin 0 -> 434 bytes .../source/images/icon_settings_classic.png | Bin 0 -> 7662 bytes .../source/images/icon_settings_file.png | Bin 0 -> 7169 bytes .../source/images/icon_settings_gamecube.png | Bin 0 -> 16094 bytes .../source/images/icon_settings_justifier.png | Bin 0 -> 7628 bytes .../source/images/icon_settings_mappings.png | Bin 0 -> 13082 bytes .../source/images/icon_settings_menu.png | Bin 0 -> 1236 bytes .../source/images/icon_settings_mouse.png | Bin 0 -> 5037 bytes .../source/images/icon_settings_network.png | Bin 0 -> 7205 bytes .../source/images/icon_settings_nunchuk.png | Bin 0 -> 9654 bytes .../images/icon_settings_screenshot.png | Bin 0 -> 11719 bytes .../images/icon_settings_snescontroller.png | Bin 0 -> 10158 bytes .../images/icon_settings_superscope.png | Bin 0 -> 5431 bytes .../source/images/icon_settings_video.png | Bin 0 -> 3613 bytes .../source/images/icon_settings_wiimote.png | Bin 0 -> 5108 bytes .../source/images/icon_settings_wiiupro.png | Bin 0 -> 10729 bytes plugins/snes9x_gx/source/images/icon_smb.png | Bin 0 -> 1064 bytes plugins/snes9x_gx/source/images/icon_usb.png | Bin 0 -> 888 bytes .../snes9x_gx/source/images/keyboard_key.png | Bin 0 -> 524 bytes .../source/images/keyboard_key_over.png | Bin 0 -> 537 bytes .../source/images/keyboard_largekey.png | Bin 0 -> 632 bytes .../source/images/keyboard_largekey_over.png | Bin 0 -> 666 bytes .../source/images/keyboard_mediumkey.png | Bin 0 -> 582 bytes .../source/images/keyboard_mediumkey_over.png | Bin 0 -> 599 bytes .../source/images/keyboard_textbox.png | Bin 0 -> 714 bytes plugins/snes9x_gx/source/images/logo.png | Bin 0 -> 8887 bytes plugins/snes9x_gx/source/images/logo_over.png | Bin 0 -> 10463 bytes .../snes9x_gx/source/images/player1_grab.png | Bin 0 -> 2293 bytes .../snes9x_gx/source/images/player1_point.png | Bin 0 -> 2339 bytes .../snes9x_gx/source/images/player2_grab.png | Bin 0 -> 2434 bytes .../snes9x_gx/source/images/player2_point.png | Bin 0 -> 2500 bytes .../snes9x_gx/source/images/player3_grab.png | Bin 0 -> 2485 bytes .../snes9x_gx/source/images/player3_point.png | Bin 0 -> 2527 bytes .../snes9x_gx/source/images/player4_grab.png | Bin 0 -> 2460 bytes .../snes9x_gx/source/images/player4_point.png | Bin 0 -> 2474 bytes .../snes9x_gx/source/images/progressbar.png | Bin 0 -> 160 bytes .../source/images/progressbar_empty.png | Bin 0 -> 279 bytes .../source/images/progressbar_outline.png | Bin 0 -> 810 bytes .../source/images/screen_position.png | Bin 0 -> 1372 bytes plugins/snes9x_gx/source/images/scrollbar.png | Bin 0 -> 270 bytes .../source/images/scrollbar_arrowdown.png | Bin 0 -> 721 bytes .../images/scrollbar_arrowdown_over.png | Bin 0 -> 733 bytes .../source/images/scrollbar_arrowup.png | Bin 0 -> 700 bytes .../source/images/scrollbar_arrowup_over.png | Bin 0 -> 739 bytes .../snes9x_gx/source/images/scrollbar_box.png | Bin 0 -> 481 bytes .../source/images/scrollbar_box_over.png | Bin 0 -> 469 bytes plugins/snes9x_gx/source/images/throbber.png | Bin 0 -> 2542 bytes plugins/snes9x_gx/source/input.cpp | 791 +++ plugins/snes9x_gx/source/input.h | 38 + plugins/snes9x_gx/source/lang/ca.lang | 854 +++ plugins/snes9x_gx/source/lang/de.lang | 854 +++ plugins/snes9x_gx/source/lang/en.lang | 2 + plugins/snes9x_gx/source/lang/es.lang | 446 ++ plugins/snes9x_gx/source/lang/fr.lang | 866 ++++ plugins/snes9x_gx/source/lang/it.lang | 917 ++++ plugins/snes9x_gx/source/lang/jp.lang | 935 ++++ plugins/snes9x_gx/source/lang/ko.lang | 2 + plugins/snes9x_gx/source/lang/nl.lang | 840 +++ plugins/snes9x_gx/source/lang/pt.lang | 872 ++++ plugins/snes9x_gx/source/lang/pt_br.lang | 857 +++ plugins/snes9x_gx/source/lang/tr.lang | 935 ++++ plugins/snes9x_gx/source/lang/zh.lang | 2 + plugins/snes9x_gx/source/mem2.cpp | 43 + plugins/snes9x_gx/source/mem2.h | 22 + plugins/snes9x_gx/source/menu.cpp | 4091 +++++++++++++++ plugins/snes9x_gx/source/menu.h | 46 + plugins/snes9x_gx/source/networkop.cpp | 399 ++ plugins/snes9x_gx/source/networkop.h | 23 + plugins/snes9x_gx/source/preferences.cpp | 661 +++ plugins/snes9x_gx/source/preferences.h | 14 + plugins/snes9x_gx/source/s9xsupport.cpp | 268 + plugins/snes9x_gx/source/snes9x/65c816.h | 276 + .../snes9x_gx/source/snes9x/apu/SNES_SPC.cpp | 564 ++ .../snes9x_gx/source/snes9x/apu/SNES_SPC.h | 316 ++ .../source/snes9x/apu/SNES_SPC_misc.cpp | 855 +++ .../source/snes9x/apu/SNES_SPC_state.cpp | 142 + plugins/snes9x_gx/source/snes9x/apu/SPC_CPU.h | 1228 +++++ .../snes9x_gx/source/snes9x/apu/SPC_DSP.cpp | 1072 ++++ plugins/snes9x_gx/source/snes9x/apu/SPC_DSP.h | 319 ++ .../source/snes9x/apu/SPC_Filter.cpp | 68 + .../snes9x_gx/source/snes9x/apu/SPC_Filter.h | 47 + plugins/snes9x_gx/source/snes9x/apu/apu.cpp | 661 +++ plugins/snes9x_gx/source/snes9x/apu/apu.h | 219 + .../source/snes9x/apu/blargg_common.h | 186 + .../source/snes9x/apu/blargg_config.h | 24 + .../source/snes9x/apu/blargg_endian.h | 185 + .../source/snes9x/apu/blargg_source.h | 100 + .../source/snes9x/apu/hermite_resampler.h | 144 + .../snes9x_gx/source/snes9x/apu/license.txt | 504 ++ .../source/snes9x/apu/linear_resampler.h | 115 + .../snes9x_gx/source/snes9x/apu/resampler.h | 60 + .../snes9x_gx/source/snes9x/apu/ring_buffer.h | 111 + plugins/snes9x_gx/source/snes9x/bsx.cpp | 1206 +++++ plugins/snes9x_gx/source/snes9x/bsx.h | 211 + plugins/snes9x_gx/source/snes9x/c4.cpp | 330 ++ plugins/snes9x_gx/source/snes9x/c4.h | 211 + plugins/snes9x_gx/source/snes9x/c4emu.cpp | 1245 +++++ plugins/snes9x_gx/source/snes9x/cheats.cpp | 578 +++ plugins/snes9x_gx/source/snes9x/cheats.h | 262 + plugins/snes9x_gx/source/snes9x/cheats2.cpp | 406 ++ plugins/snes9x_gx/source/snes9x/clip.cpp | 405 ++ plugins/snes9x_gx/source/snes9x/controls.cpp | 3710 +++++++++++++ plugins/snes9x_gx/source/snes9x/controls.h | 453 ++ plugins/snes9x_gx/source/snes9x/cpu.cpp | 338 ++ plugins/snes9x_gx/source/snes9x/cpuaddr.h | 690 +++ plugins/snes9x_gx/source/snes9x/cpuexec.cpp | 594 +++ plugins/snes9x_gx/source/snes9x/cpuexec.h | 353 ++ plugins/snes9x_gx/source/snes9x/cpumacro.h | 904 ++++ plugins/snes9x_gx/source/snes9x/cpuops.cpp | 4027 ++++++++++++++ plugins/snes9x_gx/source/snes9x/cpuops.h | 188 + .../snes9x_gx/source/snes9x/crosshairs.cpp | 682 +++ plugins/snes9x_gx/source/snes9x/crosshairs.h | 233 + plugins/snes9x_gx/source/snes9x/display.h | 235 + plugins/snes9x_gx/source/snes9x/dma.cpp | 1808 +++++++ plugins/snes9x_gx/source/snes9x/dma.h | 211 + plugins/snes9x_gx/source/snes9x/dsp.cpp | 229 + plugins/snes9x_gx/source/snes9x/dsp.h | 618 +++ plugins/snes9x_gx/source/snes9x/dsp1.cpp | 1894 +++++++ plugins/snes9x_gx/source/snes9x/dsp2.cpp | 532 ++ plugins/snes9x_gx/source/snes9x/dsp3.cpp | 1268 +++++ plugins/snes9x_gx/source/snes9x/dsp4.cpp | 2220 ++++++++ plugins/snes9x_gx/source/snes9x/font.h | 325 ++ plugins/snes9x_gx/source/snes9x/fxdbg.cpp | 1425 +++++ plugins/snes9x_gx/source/snes9x/fxemu.cpp | 987 ++++ plugins/snes9x_gx/source/snes9x/fxemu.h | 208 + plugins/snes9x_gx/source/snes9x/fxinst.cpp | 4424 ++++++++++++++++ plugins/snes9x_gx/source/snes9x/fxinst.h | 542 ++ plugins/snes9x_gx/source/snes9x/getset.h | 1089 ++++ plugins/snes9x_gx/source/snes9x/gfx.cpp | 2413 +++++++++ plugins/snes9x_gx/source/snes9x/gfx.h | 366 ++ plugins/snes9x_gx/source/snes9x/globals.cpp | 399 ++ plugins/snes9x_gx/source/snes9x/language.h | 202 + plugins/snes9x_gx/source/snes9x/logger.cpp | 267 + plugins/snes9x_gx/source/snes9x/logger.h | 186 + plugins/snes9x_gx/source/snes9x/memmap.cpp | 4613 +++++++++++++++++ plugins/snes9x_gx/source/snes9x/memmap.h | 381 ++ plugins/snes9x_gx/source/snes9x/messages.h | 228 + plugins/snes9x_gx/source/snes9x/missing.h | 256 + plugins/snes9x_gx/source/snes9x/movie.cpp | 1201 +++++ plugins/snes9x_gx/source/snes9x/movie.h | 254 + plugins/snes9x_gx/source/snes9x/obc1.cpp | 276 + plugins/snes9x_gx/source/snes9x/obc1.h | 196 + plugins/snes9x_gx/source/snes9x/pixform.h | 407 ++ plugins/snes9x_gx/source/snes9x/port.h | 362 ++ plugins/snes9x_gx/source/snes9x/ppu.cpp | 2223 ++++++++ plugins/snes9x_gx/source/snes9x/ppu.h | 752 +++ plugins/snes9x_gx/source/snes9x/reader.cpp | 353 ++ plugins/snes9x_gx/source/snes9x/reader.h | 228 + plugins/snes9x_gx/source/snes9x/sa1.cpp | 1136 ++++ plugins/snes9x_gx/source/snes9x/sa1.h | 323 ++ plugins/snes9x_gx/source/snes9x/sa1cpu.cpp | 303 ++ plugins/snes9x_gx/source/snes9x/sar.h | 223 + .../snes9x_gx/source/snes9x/screenshot.cpp | 315 ++ plugins/snes9x_gx/source/snes9x/screenshot.h | 183 + plugins/snes9x_gx/source/snes9x/sdd1.cpp | 211 + plugins/snes9x_gx/source/snes9x/sdd1.h | 185 + plugins/snes9x_gx/source/snes9x/sdd1emu.cpp | 503 ++ plugins/snes9x_gx/source/snes9x/sdd1emu.h | 183 + plugins/snes9x_gx/source/snes9x/seta.cpp | 193 + plugins/snes9x_gx/source/snes9x/seta.h | 238 + plugins/snes9x_gx/source/snes9x/seta010.cpp | 863 +++ plugins/snes9x_gx/source/snes9x/seta011.cpp | 309 ++ plugins/snes9x_gx/source/snes9x/seta018.cpp | 353 ++ plugins/snes9x_gx/source/snes9x/snapshot.cpp | 2250 ++++++++ plugins/snes9x_gx/source/snes9x/snapshot.h | 199 + plugins/snes9x_gx/source/snes9x/snes9x.h | 480 ++ plugins/snes9x_gx/source/snes9x/spc7110.cpp | 488 ++ plugins/snes9x_gx/source/snes9x/spc7110.h | 275 + .../snes9x_gx/source/snes9x/spc7110dec.cpp | 529 ++ plugins/snes9x_gx/source/snes9x/spc7110dec.h | 67 + .../snes9x_gx/source/snes9x/spc7110emu.cpp | 647 +++ plugins/snes9x_gx/source/snes9x/spc7110emu.h | 136 + plugins/snes9x_gx/source/snes9x/srtc.cpp | 245 + plugins/snes9x_gx/source/snes9x/srtc.h | 203 + plugins/snes9x_gx/source/snes9x/srtcemu.cpp | 225 + plugins/snes9x_gx/source/snes9x/srtcemu.h | 30 + plugins/snes9x_gx/source/snes9x/tile.cpp | 1514 ++++++ plugins/snes9x_gx/source/snes9x/tile.h | 185 + plugins/snes9x_gx/source/snes9xgx.cpp | 574 ++ plugins/snes9x_gx/source/snes9xgx.h | 134 + plugins/snes9x_gx/source/sounds/bg_music.ogg | Bin 0 -> 3086744 bytes .../snes9x_gx/source/sounds/button_click.pcm | Bin 0 -> 7204 bytes .../snes9x_gx/source/sounds/button_over.pcm | Bin 0 -> 2876 bytes plugins/snes9x_gx/source/sounds/enter.ogg | Bin 0 -> 59779 bytes plugins/snes9x_gx/source/sounds/exit.ogg | Bin 0 -> 51898 bytes plugins/snes9x_gx/source/sram.cpp | 173 + plugins/snes9x_gx/source/sram.h | 16 + plugins/snes9x_gx/source/utils/FreeTypeGX.cpp | 667 +++ plugins/snes9x_gx/source/utils/FreeTypeGX.h | 168 + plugins/snes9x_gx/source/utils/gettext.cpp | 290 ++ plugins/snes9x_gx/source/utils/gettext.h | 12 + plugins/snes9x_gx/source/utils/http.cpp | 411 ++ plugins/snes9x_gx/source/utils/http.h | 25 + plugins/snes9x_gx/source/utils/oggplayer.c | 546 ++ plugins/snes9x_gx/source/utils/oggplayer.h | 112 + plugins/snes9x_gx/source/utils/pngu.c | 755 +++ plugins/snes9x_gx/source/utils/pngu.h | 75 + plugins/snes9x_gx/source/utils/sz/7zAlloc.c | 70 + plugins/snes9x_gx/source/utils/sz/7zAlloc.h | 20 + plugins/snes9x_gx/source/utils/sz/7zBuffer.c | 29 + plugins/snes9x_gx/source/utils/sz/7zBuffer.h | 19 + plugins/snes9x_gx/source/utils/sz/7zCrc.c | 76 + plugins/snes9x_gx/source/utils/sz/7zCrc.h | 24 + plugins/snes9x_gx/source/utils/sz/7zDecode.c | 361 ++ plugins/snes9x_gx/source/utils/sz/7zDecode.h | 37 + plugins/snes9x_gx/source/utils/sz/7zExtract.c | 254 + plugins/snes9x_gx/source/utils/sz/7zExtract.h | 60 + plugins/snes9x_gx/source/utils/sz/7zHeader.c | 5 + plugins/snes9x_gx/source/utils/sz/7zHeader.h | 55 + plugins/snes9x_gx/source/utils/sz/7zIn.c | 1281 +++++ plugins/snes9x_gx/source/utils/sz/7zIn.h | 55 + plugins/snes9x_gx/source/utils/sz/7zItem.c | 133 + plugins/snes9x_gx/source/utils/sz/7zItem.h | 90 + .../snes9x_gx/source/utils/sz/7zMethodID.c | 14 + .../snes9x_gx/source/utils/sz/7zMethodID.h | 18 + plugins/snes9x_gx/source/utils/sz/7zTypes.h | 72 + .../snes9x_gx/source/utils/sz/LzmaDecode.c | 584 +++ .../snes9x_gx/source/utils/sz/LzmaDecode.h | 113 + plugins/snes9x_gx/source/utils/sz/LzmaTypes.h | 45 + plugins/snes9x_gx/source/utils/unzip/crypt.h | 132 + plugins/snes9x_gx/source/utils/unzip/ioapi.c | 177 + plugins/snes9x_gx/source/utils/unzip/ioapi.h | 75 + .../snes9x_gx/source/utils/unzip/miniunz.cpp | 324 ++ .../snes9x_gx/source/utils/unzip/miniunz.h | 9 + plugins/snes9x_gx/source/utils/unzip/unzip.c | 1598 ++++++ plugins/snes9x_gx/source/utils/unzip/unzip.h | 354 ++ plugins/snes9x_gx/source/video.cpp | 1068 ++++ plugins/snes9x_gx/source/video.h | 43 + plugins/snes9x_gx/source/xenon/README | 7 + plugins/snes9x_gx/source/xenon/ffs_content.c | 45 + plugins/snes9x_gx/source/xenon/filebrowser.h | 0 plugins/snes9x_gx/source/xenon/fileop.h | 0 plugins/snes9x_gx/source/xenon/freeze.cpp | 70 + plugins/snes9x_gx/source/xenon/freeze.h | 0 plugins/snes9x_gx/source/xenon/gccore.h | 0 plugins/snes9x_gx/source/xenon/main.cpp | 382 ++ plugins/snes9x_gx/source/xenon/png.h | 0 plugins/snes9x_gx/source/xenon/pngu/pngu.h | 0 plugins/snes9x_gx/source/xenon/s9xconfig.cpp | 159 + plugins/snes9x_gx/source/xenon/s9xconfig.h | 22 + plugins/snes9x_gx/source/xenon/s9xsupport.cpp | 288 + plugins/snes9x_gx/source/xenon/snes9xGX.h | 0 plugins/snes9x_gx/source/xenon/video.cpp | 160 + plugins/snes9x_gx/source/xenon/video.h | 4 + plugins/snes9x_gx/update.xml | 4 + plugins/snes9x_gx/wfsnesplugin.pnproj | 1 + plugins/snes9x_gx/wfsnesplugin.pnps | 1 + 484 files changed, 146706 insertions(+) create mode 100644 plugins/snes9x_gx/Makefile create mode 100644 plugins/snes9x_gx/Makefile.gc create mode 100644 plugins/snes9x_gx/Makefile.xenon create mode 100644 plugins/snes9x_gx/Makefile1 create mode 100644 plugins/snes9x_gx/hbc/icon.png create mode 100644 plugins/snes9x_gx/hbc/meta.xml create mode 100644 plugins/snes9x_gx/portlibs/include/ext2.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/config/ftconfig.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/config/ftheader.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/config/ftmodule.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/config/ftoption.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/config/ftstdlib.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/freetype.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftadvanc.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftbbox.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftbdf.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftbitmap.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftcache.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftchapters.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftcid.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/fterrdef.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/fterrors.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftgasp.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftglyph.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftgxval.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftgzip.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftimage.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftincrem.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftlcdfil.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftlist.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftlzw.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftmac.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftmm.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftmodapi.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftmoderr.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftotval.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftoutln.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftpfr.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftrender.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftsizes.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftsnames.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftstroke.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftsynth.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftsystem.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/fttrigon.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/fttypes.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftwinfnt.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftxf86.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/t1tables.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ttnameid.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/tttables.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/tttags.h create mode 100644 plugins/snes9x_gx/portlibs/include/freetype2/freetype/ttunpat.h create mode 100644 plugins/snes9x_gx/portlibs/include/ft2build.h create mode 100644 plugins/snes9x_gx/portlibs/include/gd.h create mode 100644 plugins/snes9x_gx/portlibs/include/gd_io.h create mode 100644 plugins/snes9x_gx/portlibs/include/gdfx.h create mode 100644 plugins/snes9x_gx/portlibs/include/jconfig.h create mode 100644 plugins/snes9x_gx/portlibs/include/jerror.h create mode 100644 plugins/snes9x_gx/portlibs/include/jmorecfg.h create mode 100644 plugins/snes9x_gx/portlibs/include/jpeglib.h create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/archive.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/array.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/cmddata.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/coder.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/compress.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/consio.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/crc.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/crypt.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/dll.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/encname.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/errhnd.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/extinfo.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/extract.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/filcreat.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/file.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/filefn.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/filestr.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/find.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/getbits.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/global.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/headers.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/isnt.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/list.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/loclang.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/log.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/match.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/model.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/options.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/os.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/pathfn.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/rar.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/rardefs.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/rarlang.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/raros.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/rartypes.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/rarvm.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/rawread.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/rdwrfn.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/recvol.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/resource.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/rijndael.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/rs.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/savepos.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/scantree.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/sha1.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/smallfn.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/strfn.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/strlist.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/suballoc.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/system.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/timefn.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/ulinks.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/unicode.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/unpack.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/version.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/libunrar/volume.hpp create mode 100644 plugins/snes9x_gx/portlibs/include/mupdf/fitz.h create mode 100644 plugins/snes9x_gx/portlibs/include/mupdf/fitz_base.h create mode 100644 plugins/snes9x_gx/portlibs/include/mupdf/fitz_draw.h create mode 100644 plugins/snes9x_gx/portlibs/include/mupdf/fitz_res.h create mode 100644 plugins/snes9x_gx/portlibs/include/mupdf/fitz_stream.h create mode 100644 plugins/snes9x_gx/portlibs/include/mupdf/mupdf.h create mode 100644 plugins/snes9x_gx/portlibs/include/mupdf/pdftool.h create mode 100644 plugins/snes9x_gx/portlibs/include/mxml.h create mode 100644 plugins/snes9x_gx/portlibs/include/nfs.h create mode 100644 plugins/snes9x_gx/portlibs/include/ntfs.h create mode 100644 plugins/snes9x_gx/portlibs/include/png.h create mode 100644 plugins/snes9x_gx/portlibs/include/pngconf.h create mode 100644 plugins/snes9x_gx/portlibs/include/pnglibconf.h create mode 100644 plugins/snes9x_gx/portlibs/include/sevenzip/7zAlloc.h create mode 100644 plugins/snes9x_gx/portlibs/include/sevenzip/7zBuf.h create mode 100644 plugins/snes9x_gx/portlibs/include/sevenzip/7zCrc.h create mode 100644 plugins/snes9x_gx/portlibs/include/sevenzip/7zDecode.h create mode 100644 plugins/snes9x_gx/portlibs/include/sevenzip/7zExtract.h create mode 100644 plugins/snes9x_gx/portlibs/include/sevenzip/7zFile.h create mode 100644 plugins/snes9x_gx/portlibs/include/sevenzip/7zHeader.h create mode 100644 plugins/snes9x_gx/portlibs/include/sevenzip/7zIn.h create mode 100644 plugins/snes9x_gx/portlibs/include/sevenzip/7zItem.h create mode 100644 plugins/snes9x_gx/portlibs/include/sevenzip/7zVersion.h create mode 100644 plugins/snes9x_gx/portlibs/include/sevenzip/Bcj2.h create mode 100644 plugins/snes9x_gx/portlibs/include/sevenzip/Bra.h create mode 100644 plugins/snes9x_gx/portlibs/include/sevenzip/CpuArch.h create mode 100644 plugins/snes9x_gx/portlibs/include/sevenzip/LzmaDec.h create mode 100644 plugins/snes9x_gx/portlibs/include/sevenzip/Types.h create mode 100644 plugins/snes9x_gx/portlibs/include/tif_config.h create mode 100644 plugins/snes9x_gx/portlibs/include/tiff.h create mode 100644 plugins/snes9x_gx/portlibs/include/tiffconf.h create mode 100644 plugins/snes9x_gx/portlibs/include/tiffio.h create mode 100644 plugins/snes9x_gx/portlibs/include/tiffvers.h create mode 100644 plugins/snes9x_gx/portlibs/include/tremor/config_types.h create mode 100644 plugins/snes9x_gx/portlibs/include/tremor/ivorbiscodec.h create mode 100644 plugins/snes9x_gx/portlibs/include/tremor/ivorbisfile.h create mode 100644 plugins/snes9x_gx/portlibs/include/tremor/ogg.h create mode 100644 plugins/snes9x_gx/portlibs/include/tremor/os_types.h create mode 100644 plugins/snes9x_gx/portlibs/include/wupc/wupc.h create mode 100644 plugins/snes9x_gx/portlibs/include/zconf.h create mode 100644 plugins/snes9x_gx/portlibs/include/zip/ioapi.h create mode 100644 plugins/snes9x_gx/portlibs/include/zip/unzip.h create mode 100644 plugins/snes9x_gx/portlibs/include/zip/zip.h create mode 100644 plugins/snes9x_gx/portlibs/include/zlib.h create mode 100644 plugins/snes9x_gx/readme.txt create mode 100644 plugins/snes9x_gx/source/audio.cpp create mode 100644 plugins/snes9x_gx/source/audio.h create mode 100644 plugins/snes9x_gx/source/button_mapping.c create mode 100644 plugins/snes9x_gx/source/button_mapping.h create mode 100644 plugins/snes9x_gx/source/cheatmgr.cpp create mode 100644 plugins/snes9x_gx/source/filebrowser.cpp create mode 100644 plugins/snes9x_gx/source/filebrowser.h create mode 100644 plugins/snes9x_gx/source/filelist.h create mode 100644 plugins/snes9x_gx/source/fileop.cpp create mode 100644 plugins/snes9x_gx/source/fileop.h create mode 100644 plugins/snes9x_gx/source/filter.cpp create mode 100644 plugins/snes9x_gx/source/filter.h create mode 100644 plugins/snes9x_gx/source/fonts/font.ttf create mode 100644 plugins/snes9x_gx/source/freeze.cpp create mode 100644 plugins/snes9x_gx/source/freeze.h create mode 100644 plugins/snes9x_gx/source/gcunzip.cpp create mode 100644 plugins/snes9x_gx/source/gcunzip.h create mode 100644 plugins/snes9x_gx/source/gui/gui.h create mode 100644 plugins/snes9x_gx/source/gui/gui_button.cpp create mode 100644 plugins/snes9x_gx/source/gui/gui_element.cpp create mode 100644 plugins/snes9x_gx/source/gui/gui_filebrowser.cpp create mode 100644 plugins/snes9x_gx/source/gui/gui_image.cpp create mode 100644 plugins/snes9x_gx/source/gui/gui_imagedata.cpp create mode 100644 plugins/snes9x_gx/source/gui/gui_keyboard.cpp create mode 100644 plugins/snes9x_gx/source/gui/gui_optionbrowser.cpp create mode 100644 plugins/snes9x_gx/source/gui/gui_savebrowser.cpp create mode 100644 plugins/snes9x_gx/source/gui/gui_sound.cpp create mode 100644 plugins/snes9x_gx/source/gui/gui_text.cpp create mode 100644 plugins/snes9x_gx/source/gui/gui_trigger.cpp create mode 100644 plugins/snes9x_gx/source/gui/gui_window.cpp create mode 100644 plugins/snes9x_gx/source/images/battery.png create mode 100644 plugins/snes9x_gx/source/images/battery_bar.png create mode 100644 plugins/snes9x_gx/source/images/battery_red.png create mode 100644 plugins/snes9x_gx/source/images/bg_bottom.png create mode 100644 plugins/snes9x_gx/source/images/bg_game_selection.png create mode 100644 plugins/snes9x_gx/source/images/bg_game_selection_entry.png create mode 100644 plugins/snes9x_gx/source/images/bg_options.png create mode 100644 plugins/snes9x_gx/source/images/bg_options_entry.png create mode 100644 plugins/snes9x_gx/source/images/bg_preview.png create mode 100644 plugins/snes9x_gx/source/images/bg_top.png create mode 100644 plugins/snes9x_gx/source/images/button.png create mode 100644 plugins/snes9x_gx/source/images/button_arrow_down.png create mode 100644 plugins/snes9x_gx/source/images/button_arrow_down_over.png create mode 100644 plugins/snes9x_gx/source/images/button_arrow_left.png create mode 100644 plugins/snes9x_gx/source/images/button_arrow_left_over.png create mode 100644 plugins/snes9x_gx/source/images/button_arrow_right.png create mode 100644 plugins/snes9x_gx/source/images/button_arrow_right_over.png create mode 100644 plugins/snes9x_gx/source/images/button_arrow_up.png create mode 100644 plugins/snes9x_gx/source/images/button_arrow_up_over.png create mode 100644 plugins/snes9x_gx/source/images/button_gamesave.png create mode 100644 plugins/snes9x_gx/source/images/button_gamesave_blank.png create mode 100644 plugins/snes9x_gx/source/images/button_gamesave_over.png create mode 100644 plugins/snes9x_gx/source/images/button_large.png create mode 100644 plugins/snes9x_gx/source/images/button_large_over.png create mode 100644 plugins/snes9x_gx/source/images/button_long.png create mode 100644 plugins/snes9x_gx/source/images/button_long_over.png create mode 100644 plugins/snes9x_gx/source/images/button_over.png create mode 100644 plugins/snes9x_gx/source/images/button_prompt.png create mode 100644 plugins/snes9x_gx/source/images/button_prompt_over.png create mode 100644 plugins/snes9x_gx/source/images/button_short.png create mode 100644 plugins/snes9x_gx/source/images/button_short_over.png create mode 100644 plugins/snes9x_gx/source/images/button_small.png create mode 100644 plugins/snes9x_gx/source/images/button_small_over.png create mode 100644 plugins/snes9x_gx/source/images/credits_box.png create mode 100644 plugins/snes9x_gx/source/images/dialogue_box.png create mode 100644 plugins/snes9x_gx/source/images/icon_dvd.png create mode 100644 plugins/snes9x_gx/source/images/icon_folder.png create mode 100644 plugins/snes9x_gx/source/images/icon_game_cheats.png create mode 100644 plugins/snes9x_gx/source/images/icon_game_controllers.png create mode 100644 plugins/snes9x_gx/source/images/icon_game_load.png create mode 100644 plugins/snes9x_gx/source/images/icon_game_reset.png create mode 100644 plugins/snes9x_gx/source/images/icon_game_save.png create mode 100644 plugins/snes9x_gx/source/images/icon_game_settings.png create mode 100644 plugins/snes9x_gx/source/images/icon_home.png create mode 100644 plugins/snes9x_gx/source/images/icon_sd.png create mode 100644 plugins/snes9x_gx/source/images/icon_settings.png create mode 100644 plugins/snes9x_gx/source/images/icon_settings_classic.png create mode 100644 plugins/snes9x_gx/source/images/icon_settings_file.png create mode 100644 plugins/snes9x_gx/source/images/icon_settings_gamecube.png create mode 100644 plugins/snes9x_gx/source/images/icon_settings_justifier.png create mode 100644 plugins/snes9x_gx/source/images/icon_settings_mappings.png create mode 100644 plugins/snes9x_gx/source/images/icon_settings_menu.png create mode 100644 plugins/snes9x_gx/source/images/icon_settings_mouse.png create mode 100644 plugins/snes9x_gx/source/images/icon_settings_network.png create mode 100644 plugins/snes9x_gx/source/images/icon_settings_nunchuk.png create mode 100644 plugins/snes9x_gx/source/images/icon_settings_screenshot.png create mode 100644 plugins/snes9x_gx/source/images/icon_settings_snescontroller.png create mode 100644 plugins/snes9x_gx/source/images/icon_settings_superscope.png create mode 100644 plugins/snes9x_gx/source/images/icon_settings_video.png create mode 100644 plugins/snes9x_gx/source/images/icon_settings_wiimote.png create mode 100644 plugins/snes9x_gx/source/images/icon_settings_wiiupro.png create mode 100644 plugins/snes9x_gx/source/images/icon_smb.png create mode 100644 plugins/snes9x_gx/source/images/icon_usb.png create mode 100644 plugins/snes9x_gx/source/images/keyboard_key.png create mode 100644 plugins/snes9x_gx/source/images/keyboard_key_over.png create mode 100644 plugins/snes9x_gx/source/images/keyboard_largekey.png create mode 100644 plugins/snes9x_gx/source/images/keyboard_largekey_over.png create mode 100644 plugins/snes9x_gx/source/images/keyboard_mediumkey.png create mode 100644 plugins/snes9x_gx/source/images/keyboard_mediumkey_over.png create mode 100644 plugins/snes9x_gx/source/images/keyboard_textbox.png create mode 100644 plugins/snes9x_gx/source/images/logo.png create mode 100644 plugins/snes9x_gx/source/images/logo_over.png create mode 100644 plugins/snes9x_gx/source/images/player1_grab.png create mode 100644 plugins/snes9x_gx/source/images/player1_point.png create mode 100644 plugins/snes9x_gx/source/images/player2_grab.png create mode 100644 plugins/snes9x_gx/source/images/player2_point.png create mode 100644 plugins/snes9x_gx/source/images/player3_grab.png create mode 100644 plugins/snes9x_gx/source/images/player3_point.png create mode 100644 plugins/snes9x_gx/source/images/player4_grab.png create mode 100644 plugins/snes9x_gx/source/images/player4_point.png create mode 100644 plugins/snes9x_gx/source/images/progressbar.png create mode 100644 plugins/snes9x_gx/source/images/progressbar_empty.png create mode 100644 plugins/snes9x_gx/source/images/progressbar_outline.png create mode 100644 plugins/snes9x_gx/source/images/screen_position.png create mode 100644 plugins/snes9x_gx/source/images/scrollbar.png create mode 100644 plugins/snes9x_gx/source/images/scrollbar_arrowdown.png create mode 100644 plugins/snes9x_gx/source/images/scrollbar_arrowdown_over.png create mode 100644 plugins/snes9x_gx/source/images/scrollbar_arrowup.png create mode 100644 plugins/snes9x_gx/source/images/scrollbar_arrowup_over.png create mode 100644 plugins/snes9x_gx/source/images/scrollbar_box.png create mode 100644 plugins/snes9x_gx/source/images/scrollbar_box_over.png create mode 100644 plugins/snes9x_gx/source/images/throbber.png create mode 100644 plugins/snes9x_gx/source/input.cpp create mode 100644 plugins/snes9x_gx/source/input.h create mode 100644 plugins/snes9x_gx/source/lang/ca.lang create mode 100644 plugins/snes9x_gx/source/lang/de.lang create mode 100644 plugins/snes9x_gx/source/lang/en.lang create mode 100644 plugins/snes9x_gx/source/lang/es.lang create mode 100644 plugins/snes9x_gx/source/lang/fr.lang create mode 100644 plugins/snes9x_gx/source/lang/it.lang create mode 100644 plugins/snes9x_gx/source/lang/jp.lang create mode 100644 plugins/snes9x_gx/source/lang/ko.lang create mode 100644 plugins/snes9x_gx/source/lang/nl.lang create mode 100644 plugins/snes9x_gx/source/lang/pt.lang create mode 100644 plugins/snes9x_gx/source/lang/pt_br.lang create mode 100644 plugins/snes9x_gx/source/lang/tr.lang create mode 100644 plugins/snes9x_gx/source/lang/zh.lang create mode 100644 plugins/snes9x_gx/source/mem2.cpp create mode 100644 plugins/snes9x_gx/source/mem2.h create mode 100644 plugins/snes9x_gx/source/menu.cpp create mode 100644 plugins/snes9x_gx/source/menu.h create mode 100644 plugins/snes9x_gx/source/networkop.cpp create mode 100644 plugins/snes9x_gx/source/networkop.h create mode 100644 plugins/snes9x_gx/source/preferences.cpp create mode 100644 plugins/snes9x_gx/source/preferences.h create mode 100644 plugins/snes9x_gx/source/s9xsupport.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/65c816.h create mode 100644 plugins/snes9x_gx/source/snes9x/apu/SNES_SPC.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/apu/SNES_SPC.h create mode 100644 plugins/snes9x_gx/source/snes9x/apu/SNES_SPC_misc.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/apu/SNES_SPC_state.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/apu/SPC_CPU.h create mode 100644 plugins/snes9x_gx/source/snes9x/apu/SPC_DSP.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/apu/SPC_DSP.h create mode 100644 plugins/snes9x_gx/source/snes9x/apu/SPC_Filter.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/apu/SPC_Filter.h create mode 100644 plugins/snes9x_gx/source/snes9x/apu/apu.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/apu/apu.h create mode 100644 plugins/snes9x_gx/source/snes9x/apu/blargg_common.h create mode 100644 plugins/snes9x_gx/source/snes9x/apu/blargg_config.h create mode 100644 plugins/snes9x_gx/source/snes9x/apu/blargg_endian.h create mode 100644 plugins/snes9x_gx/source/snes9x/apu/blargg_source.h create mode 100644 plugins/snes9x_gx/source/snes9x/apu/hermite_resampler.h create mode 100644 plugins/snes9x_gx/source/snes9x/apu/license.txt create mode 100644 plugins/snes9x_gx/source/snes9x/apu/linear_resampler.h create mode 100644 plugins/snes9x_gx/source/snes9x/apu/resampler.h create mode 100644 plugins/snes9x_gx/source/snes9x/apu/ring_buffer.h create mode 100644 plugins/snes9x_gx/source/snes9x/bsx.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/bsx.h create mode 100644 plugins/snes9x_gx/source/snes9x/c4.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/c4.h create mode 100644 plugins/snes9x_gx/source/snes9x/c4emu.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/cheats.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/cheats.h create mode 100644 plugins/snes9x_gx/source/snes9x/cheats2.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/clip.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/controls.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/controls.h create mode 100644 plugins/snes9x_gx/source/snes9x/cpu.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/cpuaddr.h create mode 100644 plugins/snes9x_gx/source/snes9x/cpuexec.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/cpuexec.h create mode 100644 plugins/snes9x_gx/source/snes9x/cpumacro.h create mode 100644 plugins/snes9x_gx/source/snes9x/cpuops.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/cpuops.h create mode 100644 plugins/snes9x_gx/source/snes9x/crosshairs.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/crosshairs.h create mode 100644 plugins/snes9x_gx/source/snes9x/display.h create mode 100644 plugins/snes9x_gx/source/snes9x/dma.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/dma.h create mode 100644 plugins/snes9x_gx/source/snes9x/dsp.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/dsp.h create mode 100644 plugins/snes9x_gx/source/snes9x/dsp1.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/dsp2.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/dsp3.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/dsp4.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/font.h create mode 100644 plugins/snes9x_gx/source/snes9x/fxdbg.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/fxemu.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/fxemu.h create mode 100644 plugins/snes9x_gx/source/snes9x/fxinst.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/fxinst.h create mode 100644 plugins/snes9x_gx/source/snes9x/getset.h create mode 100644 plugins/snes9x_gx/source/snes9x/gfx.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/gfx.h create mode 100644 plugins/snes9x_gx/source/snes9x/globals.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/language.h create mode 100644 plugins/snes9x_gx/source/snes9x/logger.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/logger.h create mode 100644 plugins/snes9x_gx/source/snes9x/memmap.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/memmap.h create mode 100644 plugins/snes9x_gx/source/snes9x/messages.h create mode 100644 plugins/snes9x_gx/source/snes9x/missing.h create mode 100644 plugins/snes9x_gx/source/snes9x/movie.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/movie.h create mode 100644 plugins/snes9x_gx/source/snes9x/obc1.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/obc1.h create mode 100644 plugins/snes9x_gx/source/snes9x/pixform.h create mode 100644 plugins/snes9x_gx/source/snes9x/port.h create mode 100644 plugins/snes9x_gx/source/snes9x/ppu.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/ppu.h create mode 100644 plugins/snes9x_gx/source/snes9x/reader.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/reader.h create mode 100644 plugins/snes9x_gx/source/snes9x/sa1.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/sa1.h create mode 100644 plugins/snes9x_gx/source/snes9x/sa1cpu.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/sar.h create mode 100644 plugins/snes9x_gx/source/snes9x/screenshot.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/screenshot.h create mode 100644 plugins/snes9x_gx/source/snes9x/sdd1.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/sdd1.h create mode 100644 plugins/snes9x_gx/source/snes9x/sdd1emu.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/sdd1emu.h create mode 100644 plugins/snes9x_gx/source/snes9x/seta.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/seta.h create mode 100644 plugins/snes9x_gx/source/snes9x/seta010.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/seta011.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/seta018.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/snapshot.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/snapshot.h create mode 100644 plugins/snes9x_gx/source/snes9x/snes9x.h create mode 100644 plugins/snes9x_gx/source/snes9x/spc7110.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/spc7110.h create mode 100644 plugins/snes9x_gx/source/snes9x/spc7110dec.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/spc7110dec.h create mode 100644 plugins/snes9x_gx/source/snes9x/spc7110emu.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/spc7110emu.h create mode 100644 plugins/snes9x_gx/source/snes9x/srtc.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/srtc.h create mode 100644 plugins/snes9x_gx/source/snes9x/srtcemu.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/srtcemu.h create mode 100644 plugins/snes9x_gx/source/snes9x/tile.cpp create mode 100644 plugins/snes9x_gx/source/snes9x/tile.h create mode 100644 plugins/snes9x_gx/source/snes9xgx.cpp create mode 100644 plugins/snes9x_gx/source/snes9xgx.h create mode 100644 plugins/snes9x_gx/source/sounds/bg_music.ogg create mode 100644 plugins/snes9x_gx/source/sounds/button_click.pcm create mode 100644 plugins/snes9x_gx/source/sounds/button_over.pcm create mode 100644 plugins/snes9x_gx/source/sounds/enter.ogg create mode 100644 plugins/snes9x_gx/source/sounds/exit.ogg create mode 100644 plugins/snes9x_gx/source/sram.cpp create mode 100644 plugins/snes9x_gx/source/sram.h create mode 100644 plugins/snes9x_gx/source/utils/FreeTypeGX.cpp create mode 100644 plugins/snes9x_gx/source/utils/FreeTypeGX.h create mode 100644 plugins/snes9x_gx/source/utils/gettext.cpp create mode 100644 plugins/snes9x_gx/source/utils/gettext.h create mode 100644 plugins/snes9x_gx/source/utils/http.cpp create mode 100644 plugins/snes9x_gx/source/utils/http.h create mode 100644 plugins/snes9x_gx/source/utils/oggplayer.c create mode 100644 plugins/snes9x_gx/source/utils/oggplayer.h create mode 100644 plugins/snes9x_gx/source/utils/pngu.c create mode 100644 plugins/snes9x_gx/source/utils/pngu.h create mode 100644 plugins/snes9x_gx/source/utils/sz/7zAlloc.c create mode 100644 plugins/snes9x_gx/source/utils/sz/7zAlloc.h create mode 100644 plugins/snes9x_gx/source/utils/sz/7zBuffer.c create mode 100644 plugins/snes9x_gx/source/utils/sz/7zBuffer.h create mode 100644 plugins/snes9x_gx/source/utils/sz/7zCrc.c create mode 100644 plugins/snes9x_gx/source/utils/sz/7zCrc.h create mode 100644 plugins/snes9x_gx/source/utils/sz/7zDecode.c create mode 100644 plugins/snes9x_gx/source/utils/sz/7zDecode.h create mode 100644 plugins/snes9x_gx/source/utils/sz/7zExtract.c create mode 100644 plugins/snes9x_gx/source/utils/sz/7zExtract.h create mode 100644 plugins/snes9x_gx/source/utils/sz/7zHeader.c create mode 100644 plugins/snes9x_gx/source/utils/sz/7zHeader.h create mode 100644 plugins/snes9x_gx/source/utils/sz/7zIn.c create mode 100644 plugins/snes9x_gx/source/utils/sz/7zIn.h create mode 100644 plugins/snes9x_gx/source/utils/sz/7zItem.c create mode 100644 plugins/snes9x_gx/source/utils/sz/7zItem.h create mode 100644 plugins/snes9x_gx/source/utils/sz/7zMethodID.c create mode 100644 plugins/snes9x_gx/source/utils/sz/7zMethodID.h create mode 100644 plugins/snes9x_gx/source/utils/sz/7zTypes.h create mode 100644 plugins/snes9x_gx/source/utils/sz/LzmaDecode.c create mode 100644 plugins/snes9x_gx/source/utils/sz/LzmaDecode.h create mode 100644 plugins/snes9x_gx/source/utils/sz/LzmaTypes.h create mode 100644 plugins/snes9x_gx/source/utils/unzip/crypt.h create mode 100644 plugins/snes9x_gx/source/utils/unzip/ioapi.c create mode 100644 plugins/snes9x_gx/source/utils/unzip/ioapi.h create mode 100644 plugins/snes9x_gx/source/utils/unzip/miniunz.cpp create mode 100644 plugins/snes9x_gx/source/utils/unzip/miniunz.h create mode 100644 plugins/snes9x_gx/source/utils/unzip/unzip.c create mode 100644 plugins/snes9x_gx/source/utils/unzip/unzip.h create mode 100644 plugins/snes9x_gx/source/video.cpp create mode 100644 plugins/snes9x_gx/source/video.h create mode 100644 plugins/snes9x_gx/source/xenon/README create mode 100644 plugins/snes9x_gx/source/xenon/ffs_content.c create mode 100644 plugins/snes9x_gx/source/xenon/filebrowser.h create mode 100644 plugins/snes9x_gx/source/xenon/fileop.h create mode 100644 plugins/snes9x_gx/source/xenon/freeze.cpp create mode 100644 plugins/snes9x_gx/source/xenon/freeze.h create mode 100644 plugins/snes9x_gx/source/xenon/gccore.h create mode 100644 plugins/snes9x_gx/source/xenon/main.cpp create mode 100644 plugins/snes9x_gx/source/xenon/png.h create mode 100644 plugins/snes9x_gx/source/xenon/pngu/pngu.h create mode 100644 plugins/snes9x_gx/source/xenon/s9xconfig.cpp create mode 100644 plugins/snes9x_gx/source/xenon/s9xconfig.h create mode 100644 plugins/snes9x_gx/source/xenon/s9xsupport.cpp create mode 100644 plugins/snes9x_gx/source/xenon/snes9xGX.h create mode 100644 plugins/snes9x_gx/source/xenon/video.cpp create mode 100644 plugins/snes9x_gx/source/xenon/video.h create mode 100644 plugins/snes9x_gx/update.xml create mode 100644 plugins/snes9x_gx/wfsnesplugin.pnproj create mode 100644 plugins/snes9x_gx/wfsnesplugin.pnps diff --git a/plugins/snes9x_gx/Makefile b/plugins/snes9x_gx/Makefile new file mode 100644 index 00000000..7e9faa14 --- /dev/null +++ b/plugins/snes9x_gx/Makefile @@ -0,0 +1,163 @@ +#--------------------------------------------------------------------------------- +# Clear the implicit built in rules +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- +ifeq ($(strip $(DEVKITPPC)),) +$(error "Please set DEVKITPPC in your environment. export DEVKITPPC=devkitPPC") +endif + +include $(DEVKITPPC)/wii_rules + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# INCLUDES is a list of directories containing extra header files +#--------------------------------------------------------------------------------- +TARGET := snes9xgx-wii +TARGETDIR := executables +BUILD := build_wii +SOURCES := source source/images source/sounds source/fonts source/lang \ + source/gui source/utils source/utils/sz source/utils/unzip \ + source/snes9x source/snes9x/apu +INCLUDES := source source/snes9x + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- + +CFLAGS = -g -O3 -Wall $(MACHDEP) $(INCLUDE) \ + -DZLIB -DRIGHTSHIFT_IS_SAR -DCPU_SHUTDOWN -DCORRECT_VRAM_READS \ + -D_SZ_ONE_DIRECTORY -D_LZMA_IN_CB -D_LZMA_OUT_READ \ + -fomit-frame-pointer \ + -Wno-unused-parameter -Wno-strict-aliasing \ + -Wno-write-strings -Wno-parentheses +CXXFLAGS = $(CFLAGS) +LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map,-wrap,wiiuse_register + +#--------------------------------------------------------------------------------- +# any extra libraries we wish to link with the project +#--------------------------------------------------------------------------------- +LIBS := -ldi -liso9660 -lpng -lmxml \ + -lfat -lwiiuse -lwupc -lz -lbte -lasnd -logc -lvorbisidec -lfreetype -ltinysmb +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(CURDIR)/portlibs + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/$(TARGETDIR)/$(TARGET) +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) +export DEPSDIR := $(CURDIR)/$(BUILD) + +#--------------------------------------------------------------------------------- +# automatically build a list of object files for our project +#--------------------------------------------------------------------------------- +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +sFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S))) +TTFFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.ttf))) +LANGFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.lang))) +PNGFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.png))) +OGGFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.ogg))) +PCMFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.pcm))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) + export LD := $(CC) +else + export LD := $(CXX) +endif + +export OFILES := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \ + $(sFILES:.s=.o) $(SFILES:.S=.o) \ + $(TTFFILES:.ttf=.ttf.o) $(LANGFILES:.lang=.lang.o) \ + $(PNGFILES:.png=.png.o) \ + $(OGGFILES:.ogg=.ogg.o) $(PCMFILES:.pcm=.pcm.o) +#--------------------------------------------------------------------------------- +# build a list of include paths +#--------------------------------------------------------------------------------- +export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) \ + -I$(LIBOGC_INC) -I$(CURDIR)/portlibs/include/freetype2 + +#--------------------------------------------------------------------------------- +# build a list of library paths +#--------------------------------------------------------------------------------- +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \ + -L$(LIBOGC_LIB) + +export OUTPUT := $(CURDIR)/$(TARGETDIR)/$(TARGET) +.PHONY: $(BUILD) clean + +#--------------------------------------------------------------------------------- +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @[ -d $(TARGETDIR) ] || mkdir -p $(TARGETDIR) + @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) $(OUTPUT).elf $(OUTPUT).dol + +#--------------------------------------------------------------------------------- +run: + wiiload $(OUTPUT).dol + +#--------------------------------------------------------------------------------- +reload: + wiiload -r $(OUTPUT).dol + + +#--------------------------------------------------------------------------------- +else + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +$(OUTPUT).dol: $(OUTPUT).elf +$(OUTPUT).elf: $(OFILES) + +#--------------------------------------------------------------------------------- +# This rule links in binary data with these extensions: ttf lang png ogg pcm +#--------------------------------------------------------------------------------- +%.ttf.o : %.ttf + @echo $(notdir $<) + $(bin2o) + +%.lang.o : %.lang + @echo $(notdir $<) + $(bin2o) + +%.png.o : %.png + @echo $(notdir $<) + $(bin2o) + +%.ogg.o : %.ogg + @echo $(notdir $<) + $(bin2o) + +%.pcm.o : %.pcm + @echo $(notdir $<) + $(bin2o) + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- diff --git a/plugins/snes9x_gx/Makefile.gc b/plugins/snes9x_gx/Makefile.gc new file mode 100644 index 00000000..d3a870b2 --- /dev/null +++ b/plugins/snes9x_gx/Makefile.gc @@ -0,0 +1,159 @@ +#--------------------------------------------------------------------------------- +# Clear the implicit built in rules +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- +ifeq ($(strip $(DEVKITPPC)),) +$(error "Please set DEVKITPPC in your environment. export DEVKITPPC=devkitPPC") +endif + +include $(DEVKITPPC)/gamecube_rules + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# INCLUDES is a list of directories containing extra header files +#--------------------------------------------------------------------------------- +TARGET := snes9xgx-gc +TARGETDIR := executables +BUILD := build_gc +SOURCES := source source/images source/sounds source/fonts source/lang \ + source/gui source/utils source/utils/sz \ + source/snes9x source/snes9x/apu +INCLUDES := source source/snes9x + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- + +CFLAGS = -g -O3 -Wall $(MACHDEP) $(INCLUDE) -DNO_SOUND \ + -DZLIB -DRIGHTSHIFT_IS_SAR -DCPU_SHUTDOWN -DCORRECT_VRAM_READS \ + -D_SZ_ONE_DIRECTORY -D_LZMA_IN_CB -D_LZMA_OUT_READ \ + -fomit-frame-pointer \ + -Wno-unused-parameter -Wno-strict-aliasing \ + -Wno-write-strings -Wno-parentheses +CXXFLAGS = $(CFLAGS) +LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map + +#--------------------------------------------------------------------------------- +# any extra libraries we wish to link with the project +#--------------------------------------------------------------------------------- +LIBS := -lpng -lmxml -ltinysmb -lbba -lfat -liso9660 -lz -logc -lfreetype + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(PORTLIBS) + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/$(TARGETDIR)/$(TARGET) +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) +export DEPSDIR := $(CURDIR)/$(BUILD) + +#--------------------------------------------------------------------------------- +# automatically build a list of object files for our project +#--------------------------------------------------------------------------------- +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +sFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S))) +TTFFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.ttf))) +LANGFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.lang))) +PNGFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.png))) +PCMFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.pcm))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) + export LD := $(CC) +else + export LD := $(CXX) +endif + +export OFILES := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \ + $(sFILES:.s=.o) $(SFILES:.S=.o) \ + $(TTFFILES:.ttf=.ttf.o) $(LANGFILES:.lang=.lang.o) \ + $(PNGFILES:.png=.png.o) \ + $(PCMFILES:.pcm=.pcm.o) + +#--------------------------------------------------------------------------------- +# build a list of include paths +#--------------------------------------------------------------------------------- +export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) \ + -I$(LIBOGC_INC) -I$(PORTLIBS)/include/freetype2 + +#--------------------------------------------------------------------------------- +# build a list of library paths +#--------------------------------------------------------------------------------- +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \ + -L$(LIBOGC_LIB) + +export OUTPUT := $(CURDIR)/$(TARGETDIR)/$(TARGET) +.PHONY: $(BUILD) clean + +#--------------------------------------------------------------------------------- +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @[ -d $(TARGETDIR) ] || mkdir -p $(TARGETDIR) + @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile.gc + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) $(OUTPUT).elf $(OUTPUT).dol + +#--------------------------------------------------------------------------------- +run: + psoload $(OUTPUT).dol + +#--------------------------------------------------------------------------------- +reload: + psoload -r $(OUTPUT).dol + + +#--------------------------------------------------------------------------------- +else + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +$(OUTPUT).dol: $(OUTPUT).elf +$(OUTPUT).elf: $(OFILES) + +#--------------------------------------------------------------------------------- +# This rule links in binary data with these extensions: ttf lang png pcm +#--------------------------------------------------------------------------------- +%.ttf.o : %.ttf + @echo $(notdir $<) + $(bin2o) + +%.lang.o : %.lang + @echo $(notdir $<) + $(bin2o) + +%.png.o : %.png + @echo $(notdir $<) + $(bin2o) + +%.pcm.o : %.pcm + @echo $(notdir $<) + $(bin2o) + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- diff --git a/plugins/snes9x_gx/Makefile.xenon b/plugins/snes9x_gx/Makefile.xenon new file mode 100644 index 00000000..f97ab717 --- /dev/null +++ b/plugins/snes9x_gx/Makefile.xenon @@ -0,0 +1,161 @@ +#--------------------------------------------------------------------------------- +# Clear the implicit built in rules +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- +ifeq ($(strip $(DEVKITXENON)),) +$(error "Please set DEVKITXENON in your environment. export DEVKITXENON=devkitxenon") +endif + +include $(DEVKITXENON)/rules + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# INCLUDES is a list of directories containing extra header files +#--------------------------------------------------------------------------------- +TARGET := snes9xgx-xenon +TARGETDIR := executables +BUILD := build_xenon +SOURCES := source/xenon source/snes9x source/utils/sz +INCLUDES := source/snes9x source/xenon + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- + +CFLAGS = -g -O3 -Wall $(MACHDEP) $(INCLUDE) \ + -DNGC -DNO_SOUND \ + -DNO_ASM -DRIGHTSHIFT_IS_SAR \ + -DCPU_SHUTDOWN -DSPC700_SHUTDOWN \ + -DSPC700_C -DSDD1_DECOMP \ + -DCORRECT_VRAM_READS -DNEW_COLOUR_BLENDING \ + -D_SZ_ONE_DIRECTORY -D_LZMA_IN_CB -D_LZMA_OUT_READ \ + -fomit-frame-pointer \ + -Wno-unused-parameter -Wno-strict-aliasing + +CXXFLAGS = -save-temps -Xassembler -aln=$@.lst $(CFLAGS) + +LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map + +#--------------------------------------------------------------------------------- +# any extra libraries we wish to link with the project +#--------------------------------------------------------------------------------- +LIBS = -lm -lxenon + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(CURDIR) + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/$(TARGETDIR)/$(TARGET) +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) +export DEPSDIR := $(CURDIR)/$(BUILD) + +#--------------------------------------------------------------------------------- +# automatically build a list of object files for our project +#--------------------------------------------------------------------------------- +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +sFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S))) +TTFFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.ttf))) +PNGFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.png))) +OGGFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.ogg))) +PCMFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.pcm))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) + export LD := $(CC) +else + export LD := $(CXX) +endif + +export OFILES := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \ + $(sFILES:.s=.o) $(SFILES:.S=.o) \ + $(TTFFILES:.ttf=.ttf.o) $(PNGFILES:.png=.png.o) \ + $(OGGFILES:.ogg=.ogg.o) $(PCMFILES:.pcm=.pcm.o) + +#--------------------------------------------------------------------------------- +# build a list of include paths +#--------------------------------------------------------------------------------- +export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) \ + -I$(LIBXENON_INC) + +#--------------------------------------------------------------------------------- +# build a list of library paths +#--------------------------------------------------------------------------------- +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \ + -L$(LIBXENON_LIB) + +export OUTPUT := $(CURDIR)/$(TARGETDIR)/$(TARGET) +.PHONY: $(BUILD) clean + +#--------------------------------------------------------------------------------- +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @[ -d $(TARGETDIR) ] || mkdir -p $(TARGETDIR) + @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile.xenon + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) $(OUTPUT).elf $(OUTPUT).elf32 + +#--------------------------------------------------------------------------------- + +source/xenon/ffs_content.c: genffs.py data/ps.psu data/vs.vsu + python genffs.py > source/xenon/ffs_content.c + +run: $(OUTPUT).elf32 + cp $(OUTPUT).elf32 /tftpboot/xenon + /home/dev360/run + +#--------------------------------------------------------------------------------- +else + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +$(OUTPUT).elf32: $(OUTPUT).elf +$(OUTPUT).elf: $(OFILES) + +#--------------------------------------------------------------------------------- +# This rule links in binary data with .ttf, .png, and .mp3 extensions +#--------------------------------------------------------------------------------- +%.ttf.o : %.ttf + @echo $(notdir $<) + $(bin2o) + +%.png.o : %.png + @echo $(notdir $<) + $(bin2o) + +%.ogg.o : %.ogg + @echo $(notdir $<) + $(bin2o) + +%.pcm.o : %.pcm + @echo $(notdir $<) + $(bin2o) + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- diff --git a/plugins/snes9x_gx/Makefile1 b/plugins/snes9x_gx/Makefile1 new file mode 100644 index 00000000..9b2ee1d6 --- /dev/null +++ b/plugins/snes9x_gx/Makefile1 @@ -0,0 +1,25 @@ +.PHONY = all wii gc wii-clean gc-clean wii-run gc-run + +all: wii gc + +run: wii-run + +clean: wii-clean gc-clean + +wii: + $(MAKE) -f Makefile.wii + +wii-clean: + $(MAKE) -f Makefile.wii clean + +wii-run: wii + $(MAKE) -f Makefile.wii run + +gc: + $(MAKE) -f Makefile.gc + +gc-clean: + $(MAKE) -f Makefile.gc clean + +gc-run: gc + $(MAKE) -f Makefile.gc run diff --git a/plugins/snes9x_gx/hbc/icon.png b/plugins/snes9x_gx/hbc/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c095f638c673cfed2987c158c041ea986c28d27a GIT binary patch literal 7417 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 literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/hbc/meta.xml b/plugins/snes9x_gx/hbc/meta.xml new file mode 100644 index 00000000..1323becd --- /dev/null +++ b/plugins/snes9x_gx/hbc/meta.xml @@ -0,0 +1,10 @@ + + + Snes9x GX + Tantric + 4.3.4 + 20121109 + Super Nintendo Emulator + A port of Snes9x to the Wii. + + diff --git a/plugins/snes9x_gx/portlibs/include/ext2.h b/plugins/snes9x_gx/portlibs/include/ext2.h new file mode 100644 index 00000000..1f1f58c5 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/ext2.h @@ -0,0 +1,106 @@ +/******************************************************************************** + * ext2.h - devoptab file routines for EXT2/3/4-based devices. * + * * + * Copyright (c) 2010 Dimok * + * * + * This program/include file is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License as published * + * by the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program/include file is distributed in the hope that it will be * + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty * + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the Free Software Foundation, * + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + ********************************************************************************/ +#ifndef __EXT2_H_ +#define __EXT2_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +/** + * EXT2 cache options + * + * It is recommended to use more pages instead of large page sizes for cache due to the sporadic write behaviour of ext file system. + * It will significantly increase the speed. A page size of 32 is mostly suffiecient. The larger the page count the faster the + * read/write between smaller files will be. Larger page sizes result in faster read/write of single big files. + */ +#define EXT2_CACHE_DEFAULT_PAGE_COUNT 64 /* The default number of pages in the cache */ +#define EXT2_CACHE_DEFAULT_PAGE_SIZE 32 /* The default number of sectors per cache page */ + +/* EXT2 mount flags */ +#define EXT2_FLAG_RW 0x00001 /* Open the filesystem for reading and writing. Without this flag, the filesystem is opened for reading only. */ +#define EXT2_FLAG_FORCE 0x00400 /* Open the filesystem regardless of the feature sets listed in the superblock */ +#define EXT2_FLAG_JOURNAL_DEV_OK 0x01000 /* Only open external journal devices if this flag is set (e.g. ext3/ext4) */ +#define EXT2_FLAG_64BITS 0x20000 /* Allow 64-bit bitfields (needed for large filesystems) */ +#define EXT2_FLAG_PRINT_PROGRESS 0x40000 /* If this flag is set the progress of file operations will be printed to stdout */ +#define EXT2_FLAG_SKIP_MMP 0x100000 /* Open without multi-mount protection check. */ +#define EXT2_FLAG_DEFAULT (EXT2_FLAG_RW | EXT2_FLAG_64BITS | EXT2_FLAG_JOURNAL_DEV_OK | EXT2_FLAG_SKIP_MMP) + +/** + * Find all EXT2/3/4 partitions on a block device. + * + * @param INTERFACE The block device to search + * @param PARTITIONS (out) A pointer to receive the array of partition start sectors + * + * @return The number of entries in PARTITIONS or -1 if an error occurred (see errno) + * @note The caller is responsible for freeing PARTITIONS when finished with it + */ +int ext2FindPartitions(const DISC_INTERFACE *interface, sec_t **partitions); + +/** + * Mount a EXT2/3/4 partition from a specific sector on a block device. + * + * @param NAME The name to mount the device under (can then be accessed as "NAME:/") + * @param INTERFACE The block device to mount + * @param STARTSECTOR The sector the partition begins at + * @param CACHEPAGECOUNT The total number of pages in the device cache + * @param CACHEPAGESIZE The number of sectors per cache page + * @param FLAGS Additional mounting flags (see above) + * + * @return True if mount was successful, false if no partition was found or an error occurred (see errno) + */ +bool ext2Mount(const char *name, const DISC_INTERFACE *interface, sec_t startSector, u32 cachePageCount, u32 cachePageSize, u32 flags); + +/** + * Unmount a EXT2/3/4 partition. + * + * @param NAME The name of mount used in ext2Mount() + */ +void ext2Unmount(const char *name); + +/** + * Get the volume name of a mounted EXT2/3/4 partition. + * + * @param NAME The name of mount + * + * @return The volumes name if successful or NULL if an error occurred (see errno) + */ +const char *ext2GetVolumeName (const char *name); + +/** + * Set the volume name of a mounted EXT2/3/4 partition. + * + * @param NAME The name of mount + * @param VOLUMENAME The new volume name + * + * @return True if mount was successful, false if an error occurred (see errno) + * @note The mount must be write-enabled else this will fail + */ +bool ext2SetVolumeName (const char *name, const char *volumeName); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/config/ftconfig.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/config/ftconfig.h new file mode 100644 index 00000000..9ceab5c2 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/config/ftconfig.h @@ -0,0 +1,477 @@ +/* ftconfig.h. Generated from ftconfig.in by configure. */ +/***************************************************************************/ +/* */ +/* ftconfig.in */ +/* */ +/* UNIX-specific configuration file (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This header file contains a number of macro definitions that are used */ + /* by the rest of the engine. Most of the macros here are automatically */ + /* determined at compile time, and you should not need to change it to */ + /* port FreeType, except to compile the library with a non-ANSI */ + /* compiler. */ + /* */ + /* Note however that if some specific modifications are needed, we */ + /* advise you to place a modified copy in your build directory. */ + /* */ + /* The build directory is usually `freetype/builds/', and */ + /* contains system-specific files that are always included first when */ + /* building the library. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTCONFIG_H__ +#define __FTCONFIG_H__ + +#include +#include FT_CONFIG_OPTIONS_H +#include FT_CONFIG_STANDARD_LIBRARY_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* PLATFORM-SPECIFIC CONFIGURATION MACROS */ + /* */ + /* These macros can be toggled to suit a specific system. The current */ + /* ones are defaults used to compile FreeType in an ANSI C environment */ + /* (16bit compilers are also supported). Copy this file to your own */ + /* `freetype/builds/' directory, and edit it to port the engine. */ + /* */ + /*************************************************************************/ + + +#define HAVE_UNISTD_H 1 +#define HAVE_FCNTL_H 1 +#define HAVE_STDINT_H 1 + + + /* There are systems (like the Texas Instruments 'C54x) where a `char' */ + /* has 16 bits. ANSI C says that sizeof(char) is always 1. Since an */ + /* `int' has 16 bits also for this system, sizeof(int) gives 1 which */ + /* is probably unexpected. */ + /* */ + /* `CHAR_BIT' (defined in limits.h) gives the number of bits in a */ + /* `char' type. */ + +#ifndef FT_CHAR_BIT +#define FT_CHAR_BIT CHAR_BIT +#endif + + +/* #undef FT_USE_AUTOCONF_SIZEOF_TYPES */ +#ifdef FT_USE_AUTOCONF_SIZEOF_TYPES + +#define SIZEOF_INT 4 +#define SIZEOF_LONG 4 +#define FT_SIZEOF_INT SIZEOF_INT +#define FT_SIZEOF_LONG SIZEOF_LONG + +#else /* !FT_USE_AUTOCONF_SIZEOF_TYPES */ + + /* Following cpp computation of the bit length of int and long */ + /* is copied from default include/freetype/config/ftconfig.h. */ + /* If any improvement is required for this file, it should be */ + /* applied to the original header file for the builders that */ + /* does not use configure script. */ + + /* The size of an `int' type. */ +#if FT_UINT_MAX == 0xFFFFUL +#define FT_SIZEOF_INT (16 / FT_CHAR_BIT) +#elif FT_UINT_MAX == 0xFFFFFFFFUL +#define FT_SIZEOF_INT (32 / FT_CHAR_BIT) +#elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL +#define FT_SIZEOF_INT (64 / FT_CHAR_BIT) +#else +#error "Unsupported size of `int' type!" +#endif + + /* The size of a `long' type. A five-byte `long' (as used e.g. on the */ + /* DM642) is recognized but avoided. */ +#if FT_ULONG_MAX == 0xFFFFFFFFUL +#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT) +#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL +#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT) +#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL +#define FT_SIZEOF_LONG (64 / FT_CHAR_BIT) +#else +#error "Unsupported size of `long' type!" +#endif + +#endif /* !FT_USE_AUTOCONF_SIZEOF_TYPES */ + + + /* Preferred alignment of data */ +#define FT_ALIGNMENT 8 + + + /* FT_UNUSED is a macro used to indicate that a given parameter is not */ + /* used -- this is only used to get rid of unpleasant compiler warnings */ +#ifndef FT_UNUSED +#define FT_UNUSED( arg ) ( (arg) = (arg) ) +#endif + + + /*************************************************************************/ + /* */ + /* AUTOMATIC CONFIGURATION MACROS */ + /* */ + /* These macros are computed from the ones defined above. Don't touch */ + /* their definition, unless you know precisely what you are doing. No */ + /* porter should need to mess with them. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Mac support */ + /* */ + /* This is the only necessary change, so it is defined here instead */ + /* providing a new configuration file. */ + /* */ +#if ( defined( __APPLE__ ) && !defined( DARWIN_NO_CARBON ) ) || \ + ( defined( __MWERKS__ ) && defined( macintosh ) ) + /* no Carbon frameworks for 64bit 10.4.x */ +#include "AvailabilityMacros.h" +#if defined( __LP64__ ) && \ + ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 ) +#define DARWIN_NO_CARBON 1 +#else +#define FT_MACINTOSH 1 +#endif + +#elif defined( __SC__ ) || defined( __MRC__ ) + /* Classic MacOS compilers */ +#include "ConditionalMacros.h" +#if TARGET_OS_MAC +#define FT_MACINTOSH 1 +#endif + +#endif + + + /* Fix compiler warning with sgi compiler */ +#if defined( __sgi ) && !defined( __GNUC__ ) +#if defined( _COMPILER_VERSION ) && ( _COMPILER_VERSION >= 730 ) +#pragma set woff 3505 +#endif +#endif + + + /*************************************************************************/ + /* */ + /* IntN types */ + /* */ + /* Used to guarantee the size of some specific integers. */ + /* */ + typedef signed short FT_Int16; + typedef unsigned short FT_UInt16; + +#if FT_SIZEOF_INT == 4 + + typedef signed int FT_Int32; + typedef unsigned int FT_UInt32; + +#elif FT_SIZEOF_LONG == 4 + + typedef signed long FT_Int32; + typedef unsigned long FT_UInt32; + +#else +#error "no 32bit type found -- please check your configuration files" +#endif + + + /* look up an integer type that is at least 32 bits */ +#if FT_SIZEOF_INT >= 4 + + typedef int FT_Fast; + typedef unsigned int FT_UFast; + +#elif FT_SIZEOF_LONG >= 4 + + typedef long FT_Fast; + typedef unsigned long FT_UFast; + +#endif + + + /* determine whether we have a 64-bit int type for platforms without */ + /* Autoconf */ +#if FT_SIZEOF_LONG == 8 + + /* FT_LONG64 must be defined if a 64-bit type is available */ +#define FT_LONG64 +#define FT_INT64 long + +#elif defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ + + /* this compiler provides the __int64 type */ +#define FT_LONG64 +#define FT_INT64 __int64 + +#elif defined( __BORLANDC__ ) /* Borland C++ */ + + /* XXXX: We should probably check the value of __BORLANDC__ in order */ + /* to test the compiler version. */ + + /* this compiler provides the __int64 type */ +#define FT_LONG64 +#define FT_INT64 __int64 + +#elif defined( __WATCOMC__ ) /* Watcom C++ */ + + /* Watcom doesn't provide 64-bit data types */ + +#elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */ + +#define FT_LONG64 +#define FT_INT64 long long int + +#elif defined( __GNUC__ ) + + /* GCC provides the `long long' type */ +#define FT_LONG64 +#define FT_INT64 long long int + +#endif /* FT_SIZEOF_LONG == 8 */ + + + /*************************************************************************/ + /* */ + /* A 64-bit data type will create compilation problems if you compile */ + /* in strict ANSI mode. To avoid them, we disable its use if __STDC__ */ + /* is defined. You can however ignore this rule by defining the */ + /* FT_CONFIG_OPTION_FORCE_INT64 configuration macro. */ + /* */ +#if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 ) + +#ifdef __STDC__ + + /* Undefine the 64-bit macros in strict ANSI compilation mode. */ + /* Since `#undef' doesn't survive in configuration header files */ + /* we use the postprocessing facility of AC_CONFIG_HEADERS to */ + /* replace the leading `/' with `#'. */ +#undef FT_LONG64 +#undef FT_INT64 + +#endif /* __STDC__ */ + +#endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */ + + +#define FT_BEGIN_STMNT do { +#define FT_END_STMNT } while ( 0 ) +#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT + + +#ifndef FT_CONFIG_OPTION_NO_ASSEMBLER + /* Provide assembler fragments for performance-critical functions. */ + /* These must be defined `static __inline__' with GCC. */ + +#ifdef __GNUC__ + +#if defined( __arm__ ) && !defined( __thumb__ ) +#define FT_MULFIX_ASSEMBLER FT_MulFix_arm + + static __inline__ FT_Int32 + FT_MulFix_arm( FT_Int32 a, + FT_Int32 b ) + { + register FT_Int32 t, t2; + + + __asm__ __volatile__ ( + "smull %1, %2, %4, %3\n\t" /* (lo=%1,hi=%2) = a*b */ + "mov %0, %2, asr #31\n\t" /* %0 = (hi >> 31) */ + "add %0, %0, #0x8000\n\t" /* %0 += 0x8000 */ + "adds %1, %1, %0\n\t" /* %1 += %0 */ + "adc %2, %2, #0\n\t" /* %2 += carry */ + "mov %0, %1, lsr #16\n\t" /* %0 = %1 >> 16 */ + "orr %0, %0, %2, lsl #16\n\t" /* %0 |= %2 << 16 */ + : "=r"(a), "=&r"(t2), "=&r"(t) + : "r"(a), "r"(b) ); + return a; + } + +#endif /* __arm__ && !__thumb__ */ + +#if defined( __i386__ ) +#define FT_MULFIX_ASSEMBLER FT_MulFix_i386 + + static __inline__ FT_Int32 + FT_MulFix_i386( FT_Int32 a, + FT_Int32 b ) + { + register FT_Int32 result; + + + __asm__ __volatile__ ( + "imul %%edx\n" + "movl %%edx, %%ecx\n" + "sarl $31, %%ecx\n" + "addl $0x8000, %%ecx\n" + "addl %%ecx, %%eax\n" + "adcl $0, %%edx\n" + "shrl $16, %%eax\n" + "shll $16, %%edx\n" + "addl %%edx, %%eax\n" + : "=a"(result), "+d"(b) + : "a"(a) + : "%ecx" ); + return result; + } + +#endif /* i386 */ + +#endif /* __GNUC__ */ + +#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */ + + +#ifdef FT_CONFIG_OPTION_INLINE_MULFIX +#ifdef FT_MULFIX_ASSEMBLER +#define FT_MULFIX_INLINED FT_MULFIX_ASSEMBLER +#endif +#endif + + +#ifdef FT_MAKE_OPTION_SINGLE_OBJECT + +#define FT_LOCAL( x ) static x +#define FT_LOCAL_DEF( x ) static x + +#else + +#ifdef __cplusplus +#define FT_LOCAL( x ) extern "C" x +#define FT_LOCAL_DEF( x ) extern "C" x +#else +#define FT_LOCAL( x ) extern x +#define FT_LOCAL_DEF( x ) x +#endif + +#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */ + + +#ifndef FT_BASE + +#ifdef __cplusplus +#define FT_BASE( x ) extern "C" x +#else +#define FT_BASE( x ) extern x +#endif + +#endif /* !FT_BASE */ + + +#ifndef FT_BASE_DEF + +#ifdef __cplusplus +#define FT_BASE_DEF( x ) x +#else +#define FT_BASE_DEF( x ) x +#endif + +#endif /* !FT_BASE_DEF */ + + +#ifndef FT_EXPORT + +#ifdef __cplusplus +#define FT_EXPORT( x ) extern "C" x +#else +#define FT_EXPORT( x ) extern x +#endif + +#endif /* !FT_EXPORT */ + + +#ifndef FT_EXPORT_DEF + +#ifdef __cplusplus +#define FT_EXPORT_DEF( x ) extern "C" x +#else +#define FT_EXPORT_DEF( x ) extern x +#endif + +#endif /* !FT_EXPORT_DEF */ + + +#ifndef FT_EXPORT_VAR + +#ifdef __cplusplus +#define FT_EXPORT_VAR( x ) extern "C" x +#else +#define FT_EXPORT_VAR( x ) extern x +#endif + +#endif /* !FT_EXPORT_VAR */ + + /* The following macros are needed to compile the library with a */ + /* C++ compiler and with 16bit compilers. */ + /* */ + + /* This is special. Within C++, you must specify `extern "C"' for */ + /* functions which are used via function pointers, and you also */ + /* must do that for structures which contain function pointers to */ + /* assure C linkage -- it's not possible to have (local) anonymous */ + /* functions which are accessed by (global) function pointers. */ + /* */ + /* */ + /* FT_CALLBACK_DEF is used to _define_ a callback function. */ + /* */ + /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */ + /* contains pointers to callback functions. */ + /* */ + /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable */ + /* that contains pointers to callback functions. */ + /* */ + /* */ + /* Some 16bit compilers have to redefine these macros to insert */ + /* the infamous `_cdecl' or `__fastcall' declarations. */ + /* */ +#ifndef FT_CALLBACK_DEF +#ifdef __cplusplus +#define FT_CALLBACK_DEF( x ) extern "C" x +#else +#define FT_CALLBACK_DEF( x ) static x +#endif +#endif /* FT_CALLBACK_DEF */ + +#ifndef FT_CALLBACK_TABLE +#ifdef __cplusplus +#define FT_CALLBACK_TABLE extern "C" +#define FT_CALLBACK_TABLE_DEF extern "C" +#else +#define FT_CALLBACK_TABLE extern +#define FT_CALLBACK_TABLE_DEF /* nothing */ +#endif +#endif /* FT_CALLBACK_TABLE */ + + +FT_END_HEADER + + +#endif /* __FTCONFIG_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/config/ftheader.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/config/ftheader.h new file mode 100644 index 00000000..b63945dc --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/config/ftheader.h @@ -0,0 +1,780 @@ +/***************************************************************************/ +/* */ +/* ftheader.h */ +/* */ +/* Build macros of the FreeType 2 library. */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#ifndef __FT_HEADER_H__ +#define __FT_HEADER_H__ + + + /*@***********************************************************************/ + /* */ + /* */ + /* FT_BEGIN_HEADER */ + /* */ + /* */ + /* This macro is used in association with @FT_END_HEADER in header */ + /* files to ensure that the declarations within are properly */ + /* encapsulated in an `extern "C" { .. }' block when included from a */ + /* C++ compiler. */ + /* */ +#ifdef __cplusplus +#define FT_BEGIN_HEADER extern "C" { +#else +#define FT_BEGIN_HEADER /* nothing */ +#endif + + + /*@***********************************************************************/ + /* */ + /* */ + /* FT_END_HEADER */ + /* */ + /* */ + /* This macro is used in association with @FT_BEGIN_HEADER in header */ + /* files to ensure that the declarations within are properly */ + /* encapsulated in an `extern "C" { .. }' block when included from a */ + /* C++ compiler. */ + /* */ +#ifdef __cplusplus +#define FT_END_HEADER } +#else +#define FT_END_HEADER /* nothing */ +#endif + + + /*************************************************************************/ + /* */ + /* Aliases for the FreeType 2 public and configuration files. */ + /* */ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /*
*/ + /* header_file_macros */ + /* */ + /* */ + /* Header File Macros */ + /* */ + /* <Abstract> */ + /* Macro definitions used to #include specific header files. */ + /* */ + /* <Description> */ + /* The following macros are defined to the name of specific */ + /* FreeType~2 header files. They can be used directly in #include */ + /* statements as in: */ + /* */ + /* { */ + /* #include FT_FREETYPE_H */ + /* #include FT_MULTIPLE_MASTERS_H */ + /* #include FT_GLYPH_H */ + /* } */ + /* */ + /* There are several reasons why we are now using macros to name */ + /* public header files. The first one is that such macros are not */ + /* limited to the infamous 8.3~naming rule required by DOS (and */ + /* `FT_MULTIPLE_MASTERS_H' is a lot more meaningful than `ftmm.h'). */ + /* */ + /* The second reason is that it allows for more flexibility in the */ + /* way FreeType~2 is installed on a given system. */ + /* */ + /*************************************************************************/ + + + /* configuration files */ + + /************************************************************************* + * + * @macro: + * FT_CONFIG_CONFIG_H + * + * @description: + * A macro used in #include statements to name the file containing + * FreeType~2 configuration data. + * + */ +#ifndef FT_CONFIG_CONFIG_H +#define FT_CONFIG_CONFIG_H <freetype/config/ftconfig.h> +#endif + + + /************************************************************************* + * + * @macro: + * FT_CONFIG_STANDARD_LIBRARY_H + * + * @description: + * A macro used in #include statements to name the file containing + * FreeType~2 interface to the standard C library functions. + * + */ +#ifndef FT_CONFIG_STANDARD_LIBRARY_H +#define FT_CONFIG_STANDARD_LIBRARY_H <freetype/config/ftstdlib.h> +#endif + + + /************************************************************************* + * + * @macro: + * FT_CONFIG_OPTIONS_H + * + * @description: + * A macro used in #include statements to name the file containing + * FreeType~2 project-specific configuration options. + * + */ +#ifndef FT_CONFIG_OPTIONS_H +#define FT_CONFIG_OPTIONS_H <freetype/config/ftoption.h> +#endif + + + /************************************************************************* + * + * @macro: + * FT_CONFIG_MODULES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * list of FreeType~2 modules that are statically linked to new library + * instances in @FT_Init_FreeType. + * + */ +#ifndef FT_CONFIG_MODULES_H +#define FT_CONFIG_MODULES_H <freetype/config/ftmodule.h> +#endif + + /* */ + + /* public headers */ + + /************************************************************************* + * + * @macro: + * FT_FREETYPE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * base FreeType~2 API. + * + */ +#define FT_FREETYPE_H <freetype/freetype.h> + + + /************************************************************************* + * + * @macro: + * FT_ERRORS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * list of FreeType~2 error codes (and messages). + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_ERRORS_H <freetype/fterrors.h> + + + /************************************************************************* + * + * @macro: + * FT_MODULE_ERRORS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * list of FreeType~2 module error offsets (and messages). + * + */ +#define FT_MODULE_ERRORS_H <freetype/ftmoderr.h> + + + /************************************************************************* + * + * @macro: + * FT_SYSTEM_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 interface to low-level operations (i.e., memory management + * and stream i/o). + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_SYSTEM_H <freetype/ftsystem.h> + + + /************************************************************************* + * + * @macro: + * FT_IMAGE_H + * + * @description: + * A macro used in #include statements to name the file containing type + * definitions related to glyph images (i.e., bitmaps, outlines, + * scan-converter parameters). + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_IMAGE_H <freetype/ftimage.h> + + + /************************************************************************* + * + * @macro: + * FT_TYPES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * basic data types defined by FreeType~2. + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_TYPES_H <freetype/fttypes.h> + + + /************************************************************************* + * + * @macro: + * FT_LIST_H + * + * @description: + * A macro used in #include statements to name the file containing the + * list management API of FreeType~2. + * + * (Most applications will never need to include this file.) + * + */ +#define FT_LIST_H <freetype/ftlist.h> + + + /************************************************************************* + * + * @macro: + * FT_OUTLINE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * scalable outline management API of FreeType~2. + * + */ +#define FT_OUTLINE_H <freetype/ftoutln.h> + + + /************************************************************************* + * + * @macro: + * FT_SIZES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * API which manages multiple @FT_Size objects per face. + * + */ +#define FT_SIZES_H <freetype/ftsizes.h> + + + /************************************************************************* + * + * @macro: + * FT_MODULE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * module management API of FreeType~2. + * + */ +#define FT_MODULE_H <freetype/ftmodapi.h> + + + /************************************************************************* + * + * @macro: + * FT_RENDER_H + * + * @description: + * A macro used in #include statements to name the file containing the + * renderer module management API of FreeType~2. + * + */ +#define FT_RENDER_H <freetype/ftrender.h> + + + /************************************************************************* + * + * @macro: + * FT_TYPE1_TABLES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * types and API specific to the Type~1 format. + * + */ +#define FT_TYPE1_TABLES_H <freetype/t1tables.h> + + + /************************************************************************* + * + * @macro: + * FT_TRUETYPE_IDS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * enumeration values which identify name strings, languages, encodings, + * etc. This file really contains a _large_ set of constant macro + * definitions, taken from the TrueType and OpenType specifications. + * + */ +#define FT_TRUETYPE_IDS_H <freetype/ttnameid.h> + + + /************************************************************************* + * + * @macro: + * FT_TRUETYPE_TABLES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * types and API specific to the TrueType (as well as OpenType) format. + * + */ +#define FT_TRUETYPE_TABLES_H <freetype/tttables.h> + + + /************************************************************************* + * + * @macro: + * FT_TRUETYPE_TAGS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * definitions of TrueType four-byte `tags' which identify blocks in + * SFNT-based font formats (i.e., TrueType and OpenType). + * + */ +#define FT_TRUETYPE_TAGS_H <freetype/tttags.h> + + + /************************************************************************* + * + * @macro: + * FT_BDF_H + * + * @description: + * A macro used in #include statements to name the file containing the + * definitions of an API which accesses BDF-specific strings from a + * face. + * + */ +#define FT_BDF_H <freetype/ftbdf.h> + + + /************************************************************************* + * + * @macro: + * FT_CID_H + * + * @description: + * A macro used in #include statements to name the file containing the + * definitions of an API which access CID font information from a + * face. + * + */ +#define FT_CID_H <freetype/ftcid.h> + + + /************************************************************************* + * + * @macro: + * FT_GZIP_H + * + * @description: + * A macro used in #include statements to name the file containing the + * definitions of an API which supports gzip-compressed files. + * + */ +#define FT_GZIP_H <freetype/ftgzip.h> + + + /************************************************************************* + * + * @macro: + * FT_LZW_H + * + * @description: + * A macro used in #include statements to name the file containing the + * definitions of an API which supports LZW-compressed files. + * + */ +#define FT_LZW_H <freetype/ftlzw.h> + + + /************************************************************************* + * + * @macro: + * FT_WINFONTS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * definitions of an API which supports Windows FNT files. + * + */ +#define FT_WINFONTS_H <freetype/ftwinfnt.h> + + + /************************************************************************* + * + * @macro: + * FT_GLYPH_H + * + * @description: + * A macro used in #include statements to name the file containing the + * API of the optional glyph management component. + * + */ +#define FT_GLYPH_H <freetype/ftglyph.h> + + + /************************************************************************* + * + * @macro: + * FT_BITMAP_H + * + * @description: + * A macro used in #include statements to name the file containing the + * API of the optional bitmap conversion component. + * + */ +#define FT_BITMAP_H <freetype/ftbitmap.h> + + + /************************************************************************* + * + * @macro: + * FT_BBOX_H + * + * @description: + * A macro used in #include statements to name the file containing the + * API of the optional exact bounding box computation routines. + * + */ +#define FT_BBOX_H <freetype/ftbbox.h> + + + /************************************************************************* + * + * @macro: + * FT_CACHE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * API of the optional FreeType~2 cache sub-system. + * + */ +#define FT_CACHE_H <freetype/ftcache.h> + + + /************************************************************************* + * + * @macro: + * FT_CACHE_IMAGE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * `glyph image' API of the FreeType~2 cache sub-system. + * + * It is used to define a cache for @FT_Glyph elements. You can also + * use the API defined in @FT_CACHE_SMALL_BITMAPS_H if you only need to + * store small glyph bitmaps, as it will use less memory. + * + * This macro is deprecated. Simply include @FT_CACHE_H to have all + * glyph image-related cache declarations. + * + */ +#define FT_CACHE_IMAGE_H FT_CACHE_H + + + /************************************************************************* + * + * @macro: + * FT_CACHE_SMALL_BITMAPS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * `small bitmaps' API of the FreeType~2 cache sub-system. + * + * It is used to define a cache for small glyph bitmaps in a relatively + * memory-efficient way. You can also use the API defined in + * @FT_CACHE_IMAGE_H if you want to cache arbitrary glyph images, + * including scalable outlines. + * + * This macro is deprecated. Simply include @FT_CACHE_H to have all + * small bitmaps-related cache declarations. + * + */ +#define FT_CACHE_SMALL_BITMAPS_H FT_CACHE_H + + + /************************************************************************* + * + * @macro: + * FT_CACHE_CHARMAP_H + * + * @description: + * A macro used in #include statements to name the file containing the + * `charmap' API of the FreeType~2 cache sub-system. + * + * This macro is deprecated. Simply include @FT_CACHE_H to have all + * charmap-based cache declarations. + * + */ +#define FT_CACHE_CHARMAP_H FT_CACHE_H + + + /************************************************************************* + * + * @macro: + * FT_MAC_H + * + * @description: + * A macro used in #include statements to name the file containing the + * Macintosh-specific FreeType~2 API. The latter is used to access + * fonts embedded in resource forks. + * + * This header file must be explicitly included by client applications + * compiled on the Mac (note that the base API still works though). + * + */ +#define FT_MAC_H <freetype/ftmac.h> + + + /************************************************************************* + * + * @macro: + * FT_MULTIPLE_MASTERS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * optional multiple-masters management API of FreeType~2. + * + */ +#define FT_MULTIPLE_MASTERS_H <freetype/ftmm.h> + + + /************************************************************************* + * + * @macro: + * FT_SFNT_NAMES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * optional FreeType~2 API which accesses embedded `name' strings in + * SFNT-based font formats (i.e., TrueType and OpenType). + * + */ +#define FT_SFNT_NAMES_H <freetype/ftsnames.h> + + + /************************************************************************* + * + * @macro: + * FT_OPENTYPE_VALIDATE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * optional FreeType~2 API which validates OpenType tables (BASE, GDEF, + * GPOS, GSUB, JSTF). + * + */ +#define FT_OPENTYPE_VALIDATE_H <freetype/ftotval.h> + + + /************************************************************************* + * + * @macro: + * FT_GX_VALIDATE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * optional FreeType~2 API which validates TrueTypeGX/AAT tables (feat, + * mort, morx, bsln, just, kern, opbd, trak, prop). + * + */ +#define FT_GX_VALIDATE_H <freetype/ftgxval.h> + + + /************************************************************************* + * + * @macro: + * FT_PFR_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which accesses PFR-specific data. + * + */ +#define FT_PFR_H <freetype/ftpfr.h> + + + /************************************************************************* + * + * @macro: + * FT_STROKER_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which provides functions to stroke outline paths. + */ +#define FT_STROKER_H <freetype/ftstroke.h> + + + /************************************************************************* + * + * @macro: + * FT_SYNTHESIS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which performs artificial obliquing and emboldening. + */ +#define FT_SYNTHESIS_H <freetype/ftsynth.h> + + + /************************************************************************* + * + * @macro: + * FT_XFREE86_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which provides functions specific to the XFree86 and + * X.Org X11 servers. + */ +#define FT_XFREE86_H <freetype/ftxf86.h> + + + /************************************************************************* + * + * @macro: + * FT_TRIGONOMETRY_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which performs trigonometric computations (e.g., + * cosines and arc tangents). + */ +#define FT_TRIGONOMETRY_H <freetype/fttrigon.h> + + + /************************************************************************* + * + * @macro: + * FT_LCD_FILTER_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which performs color filtering for subpixel rendering. + */ +#define FT_LCD_FILTER_H <freetype/ftlcdfil.h> + + + /************************************************************************* + * + * @macro: + * FT_UNPATENTED_HINTING_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which performs color filtering for subpixel rendering. + */ +#define FT_UNPATENTED_HINTING_H <freetype/ttunpat.h> + + + /************************************************************************* + * + * @macro: + * FT_INCREMENTAL_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which performs color filtering for subpixel rendering. + */ +#define FT_INCREMENTAL_H <freetype/ftincrem.h> + + + /************************************************************************* + * + * @macro: + * FT_GASP_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which returns entries from the TrueType GASP table. + */ +#define FT_GASP_H <freetype/ftgasp.h> + + + /************************************************************************* + * + * @macro: + * FT_ADVANCES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which returns individual and ranged glyph advances. + */ +#define FT_ADVANCES_H <freetype/ftadvanc.h> + + + /* */ + +#define FT_ERROR_DEFINITIONS_H <freetype/fterrdef.h> + + + /* The internals of the cache sub-system are no longer exposed. We */ + /* default to FT_CACHE_H at the moment just in case, but we know of */ + /* no rogue client that uses them. */ + /* */ +#define FT_CACHE_MANAGER_H <freetype/ftcache.h> +#define FT_CACHE_INTERNAL_MRU_H <freetype/ftcache.h> +#define FT_CACHE_INTERNAL_MANAGER_H <freetype/ftcache.h> +#define FT_CACHE_INTERNAL_CACHE_H <freetype/ftcache.h> +#define FT_CACHE_INTERNAL_GLYPH_H <freetype/ftcache.h> +#define FT_CACHE_INTERNAL_IMAGE_H <freetype/ftcache.h> +#define FT_CACHE_INTERNAL_SBITS_H <freetype/ftcache.h> + + +#define FT_INCREMENTAL_H <freetype/ftincrem.h> + +#define FT_TRUETYPE_UNPATENTED_H <freetype/ttunpat.h> + + + /* + * Include internal headers definitions from <freetype/internal/...> + * only when building the library. + */ +#ifdef FT2_BUILD_LIBRARY +#define FT_INTERNAL_INTERNAL_H <freetype/internal/internal.h> +#include FT_INTERNAL_INTERNAL_H +#endif /* FT2_BUILD_LIBRARY */ + + +#endif /* __FT2_BUILD_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/config/ftmodule.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/config/ftmodule.h new file mode 100644 index 00000000..b7299779 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/config/ftmodule.h @@ -0,0 +1,20 @@ +/* This is a generated file. */ +FT_USE_MODULE( FT_Driver_ClassRec, tt_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class ) +FT_USE_MODULE( FT_Module_Class, sfnt_module_class ) +FT_USE_MODULE( FT_Module_Class, autofit_module_class ) +FT_USE_MODULE( FT_Module_Class, pshinter_module_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcd_renderer_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcdv_renderer_class ) +FT_USE_MODULE( FT_Module_Class, psaux_module_class ) +FT_USE_MODULE( FT_Module_Class, psnames_module_class ) +/* EOF */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/config/ftoption.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/config/ftoption.h new file mode 100644 index 00000000..2b46259c --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/config/ftoption.h @@ -0,0 +1,733 @@ +/***************************************************************************/ +/* */ +/* ftoption.h */ +/* */ +/* User-selectable configuration macros (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTOPTION_H__ +#define __FTOPTION_H__ + + +#include <ft2build.h> + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* USER-SELECTABLE CONFIGURATION MACROS */ + /* */ + /* This file contains the default configuration macro definitions for */ + /* a standard build of the FreeType library. There are three ways to */ + /* use this file to build project-specific versions of the library: */ + /* */ + /* - You can modify this file by hand, but this is not recommended in */ + /* cases where you would like to build several versions of the */ + /* library from a single source directory. */ + /* */ + /* - You can put a copy of this file in your build directory, more */ + /* precisely in `$BUILD/freetype/config/ftoption.h', where `$BUILD' */ + /* is the name of a directory that is included _before_ the FreeType */ + /* include path during compilation. */ + /* */ + /* The default FreeType Makefiles and Jamfiles use the build */ + /* directory `builds/<system>' by default, but you can easily change */ + /* that for your own projects. */ + /* */ + /* - Copy the file <ft2build.h> to `$BUILD/ft2build.h' and modify it */ + /* slightly to pre-define the macro FT_CONFIG_OPTIONS_H used to */ + /* locate this file during the build. For example, */ + /* */ + /* #define FT_CONFIG_OPTIONS_H <myftoptions.h> */ + /* #include <freetype/config/ftheader.h> */ + /* */ + /* will use `$BUILD/myftoptions.h' instead of this file for macro */ + /* definitions. */ + /* */ + /* Note also that you can similarly pre-define the macro */ + /* FT_CONFIG_MODULES_H used to locate the file listing of the modules */ + /* that are statically linked to the library at compile time. By */ + /* default, this file is <freetype/config/ftmodule.h>. */ + /* */ + /* We highly recommend using the third method whenever possible. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** G E N E R A L F R E E T Y P E 2 C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Uncomment the line below if you want to activate sub-pixel rendering */ + /* (a.k.a. LCD rendering, or ClearType) in this build of the library. */ + /* */ + /* Note that this feature is covered by several Microsoft patents */ + /* and should not be activated in any default build of the library. */ + /* */ + /* This macro has no impact on the FreeType API, only on its */ + /* _implementation_. For example, using FT_RENDER_MODE_LCD when calling */ + /* FT_Render_Glyph still generates a bitmap that is 3 times wider than */ + /* the original size in case this macro isn't defined; however, each */ + /* triplet of subpixels has R=G=B. */ + /* */ + /* This is done to allow FreeType clients to run unmodified, forcing */ + /* them to display normal gray-level anti-aliased glyphs. */ + /* */ +/* #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + + /*************************************************************************/ + /* */ + /* Many compilers provide a non-ANSI 64-bit data type that can be used */ + /* by FreeType to speed up some computations. However, this will create */ + /* some problems when compiling the library in strict ANSI mode. */ + /* */ + /* For this reason, the use of 64-bit integers is normally disabled when */ + /* the __STDC__ macro is defined. You can however disable this by */ + /* defining the macro FT_CONFIG_OPTION_FORCE_INT64 here. */ + /* */ + /* For most compilers, this will only create compilation warnings when */ + /* building the library. */ + /* */ + /* ObNote: The compiler-specific 64-bit integers are detected in the */ + /* file `ftconfig.h' either statically or through the */ + /* `configure' script on supported platforms. */ + /* */ +#undef FT_CONFIG_OPTION_FORCE_INT64 + + + /*************************************************************************/ + /* */ + /* If this macro is defined, do not try to use an assembler version of */ + /* performance-critical functions (e.g. FT_MulFix). You should only do */ + /* that to verify that the assembler function works properly, or to */ + /* execute benchmark tests of the various implementations. */ +/* #define FT_CONFIG_OPTION_NO_ASSEMBLER */ + + + /*************************************************************************/ + /* */ + /* If this macro is defined, try to use an inlined assembler version of */ + /* the `FT_MulFix' function, which is a `hotspot' when loading and */ + /* hinting glyphs, and which should be executed as fast as possible. */ + /* */ + /* Note that if your compiler or CPU is not supported, this will default */ + /* to the standard and portable implementation found in `ftcalc.c'. */ + /* */ +#define FT_CONFIG_OPTION_INLINE_MULFIX + + + /*************************************************************************/ + /* */ + /* LZW-compressed file support. */ + /* */ + /* FreeType now handles font files that have been compressed with the */ + /* `compress' program. This is mostly used to parse many of the PCF */ + /* files that come with various X11 distributions. The implementation */ + /* uses NetBSD's `zopen' to partially uncompress the file on the fly */ + /* (see src/lzw/ftgzip.c). */ + /* */ + /* Define this macro if you want to enable this `feature'. */ + /* */ +#define FT_CONFIG_OPTION_USE_LZW + + + /*************************************************************************/ + /* */ + /* Gzip-compressed file support. */ + /* */ + /* FreeType now handles font files that have been compressed with the */ + /* `gzip' program. This is mostly used to parse many of the PCF files */ + /* that come with XFree86. The implementation uses `zlib' to */ + /* partially uncompress the file on the fly (see src/gzip/ftgzip.c). */ + /* */ + /* Define this macro if you want to enable this `feature'. See also */ + /* the macro FT_CONFIG_OPTION_SYSTEM_ZLIB below. */ + /* */ +#define FT_CONFIG_OPTION_USE_ZLIB + + + /*************************************************************************/ + /* */ + /* ZLib library selection */ + /* */ + /* This macro is only used when FT_CONFIG_OPTION_USE_ZLIB is defined. */ + /* It allows FreeType's `ftgzip' component to link to the system's */ + /* installation of the ZLib library. This is useful on systems like */ + /* Unix or VMS where it generally is already available. */ + /* */ + /* If you let it undefined, the component will use its own copy */ + /* of the zlib sources instead. These have been modified to be */ + /* included directly within the component and *not* export external */ + /* function names. This allows you to link any program with FreeType */ + /* _and_ ZLib without linking conflicts. */ + /* */ + /* Do not #undef this macro here since the build system might define */ + /* it for certain configurations only. */ + /* */ +/* #define FT_CONFIG_OPTION_SYSTEM_ZLIB */ + + + /*************************************************************************/ + /* */ + /* DLL export compilation */ + /* */ + /* When compiling FreeType as a DLL, some systems/compilers need a */ + /* special keyword in front OR after the return type of function */ + /* declarations. */ + /* */ + /* Two macros are used within the FreeType source code to define */ + /* exported library functions: FT_EXPORT and FT_EXPORT_DEF. */ + /* */ + /* FT_EXPORT( return_type ) */ + /* */ + /* is used in a function declaration, as in */ + /* */ + /* FT_EXPORT( FT_Error ) */ + /* FT_Init_FreeType( FT_Library* alibrary ); */ + /* */ + /* */ + /* FT_EXPORT_DEF( return_type ) */ + /* */ + /* is used in a function definition, as in */ + /* */ + /* FT_EXPORT_DEF( FT_Error ) */ + /* FT_Init_FreeType( FT_Library* alibrary ) */ + /* { */ + /* ... some code ... */ + /* return FT_Err_Ok; */ + /* } */ + /* */ + /* You can provide your own implementation of FT_EXPORT and */ + /* FT_EXPORT_DEF here if you want. If you leave them undefined, they */ + /* will be later automatically defined as `extern return_type' to */ + /* allow normal compilation. */ + /* */ + /* Do not #undef these macros here since the build system might define */ + /* them for certain configurations only. */ + /* */ +/* #define FT_EXPORT(x) extern x */ +/* #define FT_EXPORT_DEF(x) x */ + + + /*************************************************************************/ + /* */ + /* Glyph Postscript Names handling */ + /* */ + /* By default, FreeType 2 is compiled with the `psnames' module. This */ + /* module is in charge of converting a glyph name string into a */ + /* Unicode value, or return a Macintosh standard glyph name for the */ + /* use with the TrueType `post' table. */ + /* */ + /* Undefine this macro if you do not want `psnames' compiled in your */ + /* build of FreeType. This has the following effects: */ + /* */ + /* - The TrueType driver will provide its own set of glyph names, */ + /* if you build it to support postscript names in the TrueType */ + /* `post' table. */ + /* */ + /* - The Type 1 driver will not be able to synthesize a Unicode */ + /* charmap out of the glyphs found in the fonts. */ + /* */ + /* You would normally undefine this configuration macro when building */ + /* a version of FreeType that doesn't contain a Type 1 or CFF driver. */ + /* */ +#define FT_CONFIG_OPTION_POSTSCRIPT_NAMES + + + /*************************************************************************/ + /* */ + /* Postscript Names to Unicode Values support */ + /* */ + /* By default, FreeType 2 is built with the `PSNames' module compiled */ + /* in. Among other things, the module is used to convert a glyph name */ + /* into a Unicode value. This is especially useful in order to */ + /* synthesize on the fly a Unicode charmap from the CFF/Type 1 driver */ + /* through a big table named the `Adobe Glyph List' (AGL). */ + /* */ + /* Undefine this macro if you do not want the Adobe Glyph List */ + /* compiled in your `PSNames' module. The Type 1 driver will not be */ + /* able to synthesize a Unicode charmap out of the glyphs found in the */ + /* fonts. */ + /* */ +#define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + + + /*************************************************************************/ + /* */ + /* Support for Mac fonts */ + /* */ + /* Define this macro if you want support for outline fonts in Mac */ + /* format (mac dfont, mac resource, macbinary containing a mac */ + /* resource) on non-Mac platforms. */ + /* */ + /* Note that the `FOND' resource isn't checked. */ + /* */ +#define FT_CONFIG_OPTION_MAC_FONTS + + + /*************************************************************************/ + /* */ + /* Guessing methods to access embedded resource forks */ + /* */ + /* Enable extra Mac fonts support on non-Mac platforms (e.g. */ + /* GNU/Linux). */ + /* */ + /* Resource forks which include fonts data are stored sometimes in */ + /* locations which users or developers don't expected. In some cases, */ + /* resource forks start with some offset from the head of a file. In */ + /* other cases, the actual resource fork is stored in file different */ + /* from what the user specifies. If this option is activated, */ + /* FreeType tries to guess whether such offsets or different file */ + /* names must be used. */ + /* */ + /* Note that normal, direct access of resource forks is controlled via */ + /* the FT_CONFIG_OPTION_MAC_FONTS option. */ + /* */ +#ifdef FT_CONFIG_OPTION_MAC_FONTS +#define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK +#endif + + + /*************************************************************************/ + /* */ + /* Allow the use of FT_Incremental_Interface to load typefaces that */ + /* contain no glyph data, but supply it via a callback function. */ + /* This is required by clients supporting document formats which */ + /* supply font data incrementally as the document is parsed, such */ + /* as the Ghostscript interpreter for the PostScript language. */ + /* */ +#define FT_CONFIG_OPTION_INCREMENTAL + + + /*************************************************************************/ + /* */ + /* The size in bytes of the render pool used by the scan-line converter */ + /* to do all of its work. */ + /* */ + /* This must be greater than 4KByte if you use FreeType to rasterize */ + /* glyphs; otherwise, you may set it to zero to avoid unnecessary */ + /* allocation of the render pool. */ + /* */ +#define FT_RENDER_POOL_SIZE 16384L + + + /*************************************************************************/ + /* */ + /* FT_MAX_MODULES */ + /* */ + /* The maximum number of modules that can be registered in a single */ + /* FreeType library object. 32 is the default. */ + /* */ +#define FT_MAX_MODULES 32 + + + /*************************************************************************/ + /* */ + /* Debug level */ + /* */ + /* FreeType can be compiled in debug or trace mode. In debug mode, */ + /* errors are reported through the `ftdebug' component. In trace */ + /* mode, additional messages are sent to the standard output during */ + /* execution. */ + /* */ + /* Define FT_DEBUG_LEVEL_ERROR to build the library in debug mode. */ + /* Define FT_DEBUG_LEVEL_TRACE to build it in trace mode. */ + /* */ + /* Don't define any of these macros to compile in `release' mode! */ + /* */ + /* Do not #undef these macros here since the build system might define */ + /* them for certain configurations only. */ + /* */ +/* #define FT_DEBUG_LEVEL_ERROR */ +/* #define FT_DEBUG_LEVEL_TRACE */ + + + /*************************************************************************/ + /* */ + /* Memory Debugging */ + /* */ + /* FreeType now comes with an integrated memory debugger that is */ + /* capable of detecting simple errors like memory leaks or double */ + /* deletes. To compile it within your build of the library, you */ + /* should define FT_DEBUG_MEMORY here. */ + /* */ + /* Note that the memory debugger is only activated at runtime when */ + /* when the _environment_ variable `FT2_DEBUG_MEMORY' is defined also! */ + /* */ + /* Do not #undef this macro here since the build system might define */ + /* it for certain configurations only. */ + /* */ +/* #define FT_DEBUG_MEMORY */ + + + /*************************************************************************/ + /* */ + /* Module errors */ + /* */ + /* If this macro is set (which is _not_ the default), the higher byte */ + /* of an error code gives the module in which the error has occurred, */ + /* while the lower byte is the real error code. */ + /* */ + /* Setting this macro makes sense for debugging purposes only, since */ + /* it would break source compatibility of certain programs that use */ + /* FreeType 2. */ + /* */ + /* More details can be found in the files ftmoderr.h and fterrors.h. */ + /* */ +#undef FT_CONFIG_OPTION_USE_MODULE_ERRORS + + + /*************************************************************************/ + /* */ + /* Position Independent Code */ + /* */ + /* If this macro is set (which is _not_ the default), FreeType2 will */ + /* avoid creating constants that require address fixups. Instead the */ + /* constants will be moved into a struct and additional intialization */ + /* code will be used. */ + /* */ + /* Setting this macro is needed for systems that prohibit address */ + /* fixups, such as BREW. */ + /* */ +/* #define FT_CONFIG_OPTION_PIC */ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** S F N T D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_EMBEDDED_BITMAPS if you want to support */ + /* embedded bitmaps in all formats using the SFNT module (namely */ + /* TrueType & OpenType). */ + /* */ +#define TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_POSTSCRIPT_NAMES if you want to be able to */ + /* load and enumerate the glyph Postscript names in a TrueType or */ + /* OpenType file. */ + /* */ + /* Note that when you do not compile the `PSNames' module by undefining */ + /* the above FT_CONFIG_OPTION_POSTSCRIPT_NAMES, the `sfnt' module will */ + /* contain additional code used to read the PS Names table from a font. */ + /* */ + /* (By default, the module uses `PSNames' to extract glyph names.) */ + /* */ +#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_SFNT_NAMES if your applications need to */ + /* access the internal name table in a SFNT-based format like TrueType */ + /* or OpenType. The name table contains various strings used to */ + /* describe the font, like family name, copyright, version, etc. It */ + /* does not contain any glyph name though. */ + /* */ + /* Accessing SFNT names is done through the functions declared in */ + /* `freetype/ftsnames.h'. */ + /* */ +#define TT_CONFIG_OPTION_SFNT_NAMES + + + /*************************************************************************/ + /* */ + /* TrueType CMap support */ + /* */ + /* Here you can fine-tune which TrueType CMap table format shall be */ + /* supported. */ +#define TT_CONFIG_CMAP_FORMAT_0 +#define TT_CONFIG_CMAP_FORMAT_2 +#define TT_CONFIG_CMAP_FORMAT_4 +#define TT_CONFIG_CMAP_FORMAT_6 +#define TT_CONFIG_CMAP_FORMAT_8 +#define TT_CONFIG_CMAP_FORMAT_10 +#define TT_CONFIG_CMAP_FORMAT_12 +#define TT_CONFIG_CMAP_FORMAT_13 +#define TT_CONFIG_CMAP_FORMAT_14 + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** T R U E T Y P E D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_BYTECODE_INTERPRETER if you want to compile */ + /* a bytecode interpreter in the TrueType driver. */ + /* */ + /* By undefining this, you will only compile the code necessary to load */ + /* TrueType glyphs without hinting. */ + /* */ + /* Do not #undef this macro here, since the build system might */ + /* define it for certain configurations only. */ + /* */ +#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + + /*************************************************************************/ + /* */ + /* If you define TT_CONFIG_OPTION_UNPATENTED_HINTING, a special version */ + /* of the TrueType bytecode interpreter is used that doesn't implement */ + /* any of the patented opcodes and algorithms. The patents related to */ + /* TrueType hinting have expired worldwide since May 2010; this option */ + /* is now deprecated. */ + /* */ + /* Note that the TT_CONFIG_OPTION_UNPATENTED_HINTING macro is *ignored* */ + /* if you define TT_CONFIG_OPTION_BYTECODE_INTERPRETER; in other words, */ + /* either define TT_CONFIG_OPTION_BYTECODE_INTERPRETER or */ + /* TT_CONFIG_OPTION_UNPATENTED_HINTING but not both at the same time. */ + /* */ + /* This macro is only useful for a small number of font files (mostly */ + /* for Asian scripts) that require bytecode interpretation to properly */ + /* load glyphs. For all other fonts, this produces unpleasant results, */ + /* thus the unpatented interpreter is never used to load glyphs from */ + /* TrueType fonts unless one of the following two options is used. */ + /* */ + /* - The unpatented interpreter is explicitly activated by the user */ + /* through the FT_PARAM_TAG_UNPATENTED_HINTING parameter tag */ + /* when opening the FT_Face. */ + /* */ + /* - FreeType detects that the FT_Face corresponds to one of the */ + /* `trick' fonts (e.g., `Mingliu') it knows about. The font engine */ + /* contains a hard-coded list of font names and other matching */ + /* parameters (see function `tt_face_init' in file */ + /* `src/truetype/ttobjs.c'). */ + /* */ + /* Here a sample code snippet for using FT_PARAM_TAG_UNPATENTED_HINTING. */ + /* */ + /* { */ + /* FT_Parameter parameter; */ + /* FT_Open_Args open_args; */ + /* */ + /* */ + /* parameter.tag = FT_PARAM_TAG_UNPATENTED_HINTING; */ + /* */ + /* open_args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS; */ + /* open_args.pathname = my_font_pathname; */ + /* open_args.num_params = 1; */ + /* open_args.params = ¶meter; */ + /* */ + /* error = FT_Open_Face( library, &open_args, index, &face ); */ + /* ... */ + /* } */ + /* */ +/* #define TT_CONFIG_OPTION_UNPATENTED_HINTING */ + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_INTERPRETER_SWITCH to compile the TrueType */ + /* bytecode interpreter with a huge switch statement, rather than a call */ + /* table. This results in smaller and faster code for a number of */ + /* architectures. */ + /* */ + /* Note however that on some compiler/processor combinations, undefining */ + /* this macro will generate faster, though larger, code. */ + /* */ +#define TT_CONFIG_OPTION_INTERPRETER_SWITCH + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED to compile the */ + /* TrueType glyph loader to use Apple's definition of how to handle */ + /* component offsets in composite glyphs. */ + /* */ + /* Apple and MS disagree on the default behavior of component offsets */ + /* in composites. Apple says that they should be scaled by the scaling */ + /* factors in the transformation matrix (roughly, it's more complex) */ + /* while MS says they should not. OpenType defines two bits in the */ + /* composite flags array which can be used to disambiguate, but old */ + /* fonts will not have them. */ + /* */ + /* http://partners.adobe.com/asn/developer/opentype/glyf.html */ + /* http://fonts.apple.com/TTRefMan/RM06/Chap6glyf.html */ + /* */ +#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_GX_VAR_SUPPORT if you want to include */ + /* support for Apple's distortable font technology (fvar, gvar, cvar, */ + /* and avar tables). This has many similarities to Type 1 Multiple */ + /* Masters support. */ + /* */ +#define TT_CONFIG_OPTION_GX_VAR_SUPPORT + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_BDF if you want to include support for */ + /* an embedded `BDF ' table within SFNT-based bitmap formats. */ + /* */ +#define TT_CONFIG_OPTION_BDF + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** T Y P E 1 D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* T1_MAX_DICT_DEPTH is the maximal depth of nest dictionaries and */ + /* arrays in the Type 1 stream (see t1load.c). A minimum of 4 is */ + /* required. */ + /* */ +#define T1_MAX_DICT_DEPTH 5 + + + /*************************************************************************/ + /* */ + /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine */ + /* calls during glyph loading. */ + /* */ +#define T1_MAX_SUBRS_CALLS 16 + + + /*************************************************************************/ + /* */ + /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A */ + /* minimum of 16 is required. */ + /* */ + /* The Chinese font MingTiEG-Medium (CNS 11643 character set) needs 256. */ + /* */ +#define T1_MAX_CHARSTRINGS_OPERANDS 256 + + + /*************************************************************************/ + /* */ + /* Define this configuration macro if you want to prevent the */ + /* compilation of `t1afm', which is in charge of reading Type 1 AFM */ + /* files into an existing face. Note that if set, the T1 driver will be */ + /* unable to produce kerning distances. */ + /* */ +#undef T1_CONFIG_OPTION_NO_AFM + + + /*************************************************************************/ + /* */ + /* Define this configuration macro if you want to prevent the */ + /* compilation of the Multiple Masters font support in the Type 1 */ + /* driver. */ + /* */ +#undef T1_CONFIG_OPTION_NO_MM_SUPPORT + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** A U T O F I T M O D U L E C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Compile autofit module with CJK (Chinese, Japanese, Korean) script */ + /* support. */ + /* */ +#define AF_CONFIG_OPTION_CJK + + /*************************************************************************/ + /* */ + /* Compile autofit module with Indic script support. */ + /* */ +#define AF_CONFIG_OPTION_INDIC + + /* */ + + + /* + * Define this variable if you want to keep the layout of internal + * structures that was used prior to FreeType 2.2. This also compiles in + * a few obsolete functions to avoid linking problems on typical Unix + * distributions. + * + * For embedded systems or building a new distribution from scratch, it + * is recommended to disable the macro since it reduces the library's code + * size and activates a few memory-saving optimizations as well. + */ +#define FT_CONFIG_OPTION_OLD_INTERNALS + + + /* + * To detect legacy cache-lookup call from a rogue client (<= 2.1.7), + * we restrict the number of charmaps in a font. The current API of + * FTC_CMapCache_Lookup() takes cmap_index & charcode, but old API + * takes charcode only. To determine the passed value is for cmap_index + * or charcode, the possible cmap_index is restricted not to exceed + * the minimum possible charcode by a rogue client. It is also very + * unlikely that a rogue client is interested in Unicode values 0 to 15. + * + * NOTE: The original threshold was 4 deduced from popular number of + * cmap subtables in UCS-4 TrueType fonts, but now it is not + * irregular for OpenType fonts to have more than 4 subtables, + * because variation selector subtables are available for Apple + * and Microsoft platforms. + */ + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS +#define FT_MAX_CHARMAP_CACHEABLE 15 +#endif + + + /* + * This macro is defined if either unpatented or native TrueType + * hinting is requested by the definitions above. + */ +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER +#define TT_USE_BYTECODE_INTERPRETER +#undef TT_CONFIG_OPTION_UNPATENTED_HINTING +#elif defined TT_CONFIG_OPTION_UNPATENTED_HINTING +#define TT_USE_BYTECODE_INTERPRETER +#endif + +FT_END_HEADER + + +#endif /* __FTOPTION_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/config/ftstdlib.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/config/ftstdlib.h new file mode 100644 index 00000000..30ec14e7 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/config/ftstdlib.h @@ -0,0 +1,173 @@ +/***************************************************************************/ +/* */ +/* ftstdlib.h */ +/* */ +/* ANSI-specific library and header configuration file (specification */ +/* only). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to group all #includes to the ANSI C library that */ + /* FreeType normally requires. It also defines macros to rename the */ + /* standard functions within the FreeType source code. */ + /* */ + /* Load a file which defines __FTSTDLIB_H__ before this one to override */ + /* it. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTSTDLIB_H__ +#define __FTSTDLIB_H__ + + +#include <stddef.h> + +#define ft_ptrdiff_t ptrdiff_t + + + /**********************************************************************/ + /* */ + /* integer limits */ + /* */ + /* UINT_MAX and ULONG_MAX are used to automatically compute the size */ + /* of `int' and `long' in bytes at compile-time. So far, this works */ + /* for all platforms the library has been tested on. */ + /* */ + /* Note that on the extremely rare platforms that do not provide */ + /* integer types that are _exactly_ 16 and 32 bits wide (e.g. some */ + /* old Crays where `int' is 36 bits), we do not make any guarantee */ + /* about the correct behaviour of FT2 with all fonts. */ + /* */ + /* In these case, `ftconfig.h' will refuse to compile anyway with a */ + /* message like `couldn't find 32-bit type' or something similar. */ + /* */ + /**********************************************************************/ + + +#include <limits.h> + +#define FT_CHAR_BIT CHAR_BIT +#define FT_INT_MAX INT_MAX +#define FT_INT_MIN INT_MIN +#define FT_UINT_MAX UINT_MAX +#define FT_ULONG_MAX ULONG_MAX + + + /**********************************************************************/ + /* */ + /* character and string processing */ + /* */ + /**********************************************************************/ + + +#include <string.h> + +#define ft_memchr memchr +#define ft_memcmp memcmp +#define ft_memcpy memcpy +#define ft_memmove memmove +#define ft_memset memset +#define ft_strcat strcat +#define ft_strcmp strcmp +#define ft_strcpy strcpy +#define ft_strlen strlen +#define ft_strncmp strncmp +#define ft_strncpy strncpy +#define ft_strrchr strrchr +#define ft_strstr strstr + + + /**********************************************************************/ + /* */ + /* file handling */ + /* */ + /**********************************************************************/ + + +#include <stdio.h> + +#define FT_FILE FILE +#define ft_fclose fclose +#define ft_fopen fopen +#define ft_fread fread +#define ft_fseek fseek +#define ft_ftell ftell +#define ft_sprintf sprintf + + + /**********************************************************************/ + /* */ + /* sorting */ + /* */ + /**********************************************************************/ + + +#include <stdlib.h> + +#define ft_qsort qsort + + + /**********************************************************************/ + /* */ + /* memory allocation */ + /* */ + /**********************************************************************/ + + +#define ft_scalloc calloc +#define ft_sfree free +#define ft_smalloc malloc +#define ft_srealloc realloc + + + /**********************************************************************/ + /* */ + /* miscellaneous */ + /* */ + /**********************************************************************/ + + +#define ft_atol atol +#define ft_labs labs + + + /**********************************************************************/ + /* */ + /* execution control */ + /* */ + /**********************************************************************/ + + +#include <setjmp.h> + +#define ft_jmp_buf jmp_buf /* note: this cannot be a typedef since */ + /* jmp_buf is defined as a macro */ + /* on certain platforms */ + +#define ft_longjmp longjmp +#define ft_setjmp( b ) setjmp( *(jmp_buf*) &(b) ) /* same thing here */ + + + /* the following is only used for debugging purposes, i.e., if */ + /* FT_DEBUG_LEVEL_ERROR or FT_DEBUG_LEVEL_TRACE are defined */ + +#include <stdarg.h> + + +#endif /* __FTSTDLIB_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/freetype.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/freetype.h new file mode 100644 index 00000000..7799b70b --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/freetype.h @@ -0,0 +1,3919 @@ +/***************************************************************************/ +/* */ +/* freetype.h */ +/* */ +/* FreeType high-level API and common types (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef FT_FREETYPE_H +#error "`ft2build.h' hasn't been included yet!" +#error "Please always use macros to include FreeType header files." +#error "Example:" +#error " #include <ft2build.h>" +#error " #include FT_FREETYPE_H" +#endif + + +#ifndef __FREETYPE_H__ +#define __FREETYPE_H__ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_ERRORS_H +#include FT_TYPES_H + + +FT_BEGIN_HEADER + + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* user_allocation */ + /* */ + /* <Title> */ + /* User allocation */ + /* */ + /* <Abstract> */ + /* How client applications should allocate FreeType data structures. */ + /* */ + /* <Description> */ + /* FreeType assumes that structures allocated by the user and passed */ + /* as arguments are zeroed out except for the actual data. In other */ + /* words, it is recommended to use `calloc' (or variants of it) */ + /* instead of `malloc' for allocation. */ + /* */ + /*************************************************************************/ + + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* B A S I C T Y P E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* base_interface */ + /* */ + /* <Title> */ + /* Base Interface */ + /* */ + /* <Abstract> */ + /* The FreeType~2 base font interface. */ + /* */ + /* <Description> */ + /* This section describes the public high-level API of FreeType~2. */ + /* */ + /* <Order> */ + /* FT_Library */ + /* FT_Face */ + /* FT_Size */ + /* FT_GlyphSlot */ + /* FT_CharMap */ + /* FT_Encoding */ + /* */ + /* FT_FaceRec */ + /* */ + /* FT_FACE_FLAG_SCALABLE */ + /* FT_FACE_FLAG_FIXED_SIZES */ + /* FT_FACE_FLAG_FIXED_WIDTH */ + /* FT_FACE_FLAG_HORIZONTAL */ + /* FT_FACE_FLAG_VERTICAL */ + /* FT_FACE_FLAG_SFNT */ + /* FT_FACE_FLAG_KERNING */ + /* FT_FACE_FLAG_MULTIPLE_MASTERS */ + /* FT_FACE_FLAG_GLYPH_NAMES */ + /* FT_FACE_FLAG_EXTERNAL_STREAM */ + /* FT_FACE_FLAG_FAST_GLYPHS */ + /* FT_FACE_FLAG_HINTER */ + /* */ + /* FT_STYLE_FLAG_BOLD */ + /* FT_STYLE_FLAG_ITALIC */ + /* */ + /* FT_SizeRec */ + /* FT_Size_Metrics */ + /* */ + /* FT_GlyphSlotRec */ + /* FT_Glyph_Metrics */ + /* FT_SubGlyph */ + /* */ + /* FT_Bitmap_Size */ + /* */ + /* FT_Init_FreeType */ + /* FT_Done_FreeType */ + /* */ + /* FT_New_Face */ + /* FT_Done_Face */ + /* FT_New_Memory_Face */ + /* FT_Open_Face */ + /* FT_Open_Args */ + /* FT_Parameter */ + /* FT_Attach_File */ + /* FT_Attach_Stream */ + /* */ + /* FT_Set_Char_Size */ + /* FT_Set_Pixel_Sizes */ + /* FT_Request_Size */ + /* FT_Select_Size */ + /* FT_Size_Request_Type */ + /* FT_Size_Request */ + /* FT_Set_Transform */ + /* FT_Load_Glyph */ + /* FT_Get_Char_Index */ + /* FT_Get_Name_Index */ + /* FT_Load_Char */ + /* */ + /* FT_OPEN_MEMORY */ + /* FT_OPEN_STREAM */ + /* FT_OPEN_PATHNAME */ + /* FT_OPEN_DRIVER */ + /* FT_OPEN_PARAMS */ + /* */ + /* FT_LOAD_DEFAULT */ + /* FT_LOAD_RENDER */ + /* FT_LOAD_MONOCHROME */ + /* FT_LOAD_LINEAR_DESIGN */ + /* FT_LOAD_NO_SCALE */ + /* FT_LOAD_NO_HINTING */ + /* FT_LOAD_NO_BITMAP */ + /* FT_LOAD_CROP_BITMAP */ + /* */ + /* FT_LOAD_VERTICAL_LAYOUT */ + /* FT_LOAD_IGNORE_TRANSFORM */ + /* FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH */ + /* FT_LOAD_FORCE_AUTOHINT */ + /* FT_LOAD_NO_RECURSE */ + /* FT_LOAD_PEDANTIC */ + /* */ + /* FT_LOAD_TARGET_NORMAL */ + /* FT_LOAD_TARGET_LIGHT */ + /* FT_LOAD_TARGET_MONO */ + /* FT_LOAD_TARGET_LCD */ + /* FT_LOAD_TARGET_LCD_V */ + /* */ + /* FT_Render_Glyph */ + /* FT_Render_Mode */ + /* FT_Get_Kerning */ + /* FT_Kerning_Mode */ + /* FT_Get_Track_Kerning */ + /* FT_Get_Glyph_Name */ + /* FT_Get_Postscript_Name */ + /* */ + /* FT_CharMapRec */ + /* FT_Select_Charmap */ + /* FT_Set_Charmap */ + /* FT_Get_Charmap_Index */ + /* */ + /* FT_FSTYPE_INSTALLABLE_EMBEDDING */ + /* FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING */ + /* FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING */ + /* FT_FSTYPE_EDITABLE_EMBEDDING */ + /* FT_FSTYPE_NO_SUBSETTING */ + /* FT_FSTYPE_BITMAP_EMBEDDING_ONLY */ + /* */ + /* FT_Get_FSType_Flags */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Glyph_Metrics */ + /* */ + /* <Description> */ + /* A structure used to model the metrics of a single glyph. The */ + /* values are expressed in 26.6 fractional pixel format; if the flag */ + /* @FT_LOAD_NO_SCALE has been used while loading the glyph, values */ + /* are expressed in font units instead. */ + /* */ + /* <Fields> */ + /* width :: */ + /* The glyph's width. */ + /* */ + /* height :: */ + /* The glyph's height. */ + /* */ + /* horiBearingX :: */ + /* Left side bearing for horizontal layout. */ + /* */ + /* horiBearingY :: */ + /* Top side bearing for horizontal layout. */ + /* */ + /* horiAdvance :: */ + /* Advance width for horizontal layout. */ + /* */ + /* vertBearingX :: */ + /* Left side bearing for vertical layout. */ + /* */ + /* vertBearingY :: */ + /* Top side bearing for vertical layout. */ + /* */ + /* vertAdvance :: */ + /* Advance height for vertical layout. */ + /* */ + /* <Note> */ + /* If not disabled with @FT_LOAD_NO_HINTING, the values represent */ + /* dimensions of the hinted glyph (in case hinting is applicable). */ + /* */ + typedef struct FT_Glyph_Metrics_ + { + FT_Pos width; + FT_Pos height; + + FT_Pos horiBearingX; + FT_Pos horiBearingY; + FT_Pos horiAdvance; + + FT_Pos vertBearingX; + FT_Pos vertBearingY; + FT_Pos vertAdvance; + + } FT_Glyph_Metrics; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Bitmap_Size */ + /* */ + /* <Description> */ + /* This structure models the metrics of a bitmap strike (i.e., a set */ + /* of glyphs for a given point size and resolution) in a bitmap font. */ + /* It is used for the `available_sizes' field of @FT_Face. */ + /* */ + /* <Fields> */ + /* height :: The vertical distance, in pixels, between two */ + /* consecutive baselines. It is always positive. */ + /* */ + /* width :: The average width, in pixels, of all glyphs in the */ + /* strike. */ + /* */ + /* size :: The nominal size of the strike in 26.6 fractional */ + /* points. This field is not very useful. */ + /* */ + /* x_ppem :: The horizontal ppem (nominal width) in 26.6 fractional */ + /* pixels. */ + /* */ + /* y_ppem :: The vertical ppem (nominal height) in 26.6 fractional */ + /* pixels. */ + /* */ + /* <Note> */ + /* Windows FNT: */ + /* The nominal size given in a FNT font is not reliable. Thus when */ + /* the driver finds it incorrect, it sets `size' to some calculated */ + /* values and sets `x_ppem' and `y_ppem' to the pixel width and */ + /* height given in the font, respectively. */ + /* */ + /* TrueType embedded bitmaps: */ + /* `size', `width', and `height' values are not contained in the */ + /* bitmap strike itself. They are computed from the global font */ + /* parameters. */ + /* */ + typedef struct FT_Bitmap_Size_ + { + FT_Short height; + FT_Short width; + + FT_Pos size; + + FT_Pos x_ppem; + FT_Pos y_ppem; + + } FT_Bitmap_Size; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* O B J E C T C L A S S E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Library */ + /* */ + /* <Description> */ + /* A handle to a FreeType library instance. Each `library' is */ + /* completely independent from the others; it is the `root' of a set */ + /* of objects like fonts, faces, sizes, etc. */ + /* */ + /* It also embeds a memory manager (see @FT_Memory), as well as a */ + /* scan-line converter object (see @FT_Raster). */ + /* */ + /* For multi-threading applications each thread should have its own */ + /* FT_Library object. */ + /* */ + /* <Note> */ + /* Library objects are normally created by @FT_Init_FreeType, and */ + /* destroyed with @FT_Done_FreeType. */ + /* */ + typedef struct FT_LibraryRec_ *FT_Library; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Module */ + /* */ + /* <Description> */ + /* A handle to a given FreeType module object. Each module can be a */ + /* font driver, a renderer, or anything else that provides services */ + /* to the formers. */ + /* */ + typedef struct FT_ModuleRec_* FT_Module; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Driver */ + /* */ + /* <Description> */ + /* A handle to a given FreeType font driver object. Each font driver */ + /* is a special module capable of creating faces from font files. */ + /* */ + typedef struct FT_DriverRec_* FT_Driver; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Renderer */ + /* */ + /* <Description> */ + /* A handle to a given FreeType renderer. A renderer is a special */ + /* module in charge of converting a glyph image to a bitmap, when */ + /* necessary. Each renderer supports a given glyph image format, and */ + /* one or more target surface depths. */ + /* */ + typedef struct FT_RendererRec_* FT_Renderer; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Face */ + /* */ + /* <Description> */ + /* A handle to a given typographic face object. A face object models */ + /* a given typeface, in a given style. */ + /* */ + /* <Note> */ + /* Each face object also owns a single @FT_GlyphSlot object, as well */ + /* as one or more @FT_Size objects. */ + /* */ + /* Use @FT_New_Face or @FT_Open_Face to create a new face object from */ + /* a given filepathname or a custom input stream. */ + /* */ + /* Use @FT_Done_Face to destroy it (along with its slot and sizes). */ + /* */ + /* <Also> */ + /* See @FT_FaceRec for the publicly accessible fields of a given face */ + /* object. */ + /* */ + typedef struct FT_FaceRec_* FT_Face; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Size */ + /* */ + /* <Description> */ + /* A handle to an object used to model a face scaled to a given */ + /* character size. */ + /* */ + /* <Note> */ + /* Each @FT_Face has an _active_ @FT_Size object that is used by */ + /* functions like @FT_Load_Glyph to determine the scaling */ + /* transformation which is used to load and hint glyphs and metrics. */ + /* */ + /* You can use @FT_Set_Char_Size, @FT_Set_Pixel_Sizes, */ + /* @FT_Request_Size or even @FT_Select_Size to change the content */ + /* (i.e., the scaling values) of the active @FT_Size. */ + /* */ + /* You can use @FT_New_Size to create additional size objects for a */ + /* given @FT_Face, but they won't be used by other functions until */ + /* you activate it through @FT_Activate_Size. Only one size can be */ + /* activated at any given time per face. */ + /* */ + /* <Also> */ + /* See @FT_SizeRec for the publicly accessible fields of a given size */ + /* object. */ + /* */ + typedef struct FT_SizeRec_* FT_Size; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_GlyphSlot */ + /* */ + /* <Description> */ + /* A handle to a given `glyph slot'. A slot is a container where it */ + /* is possible to load any of the glyphs contained in its parent */ + /* face. */ + /* */ + /* In other words, each time you call @FT_Load_Glyph or */ + /* @FT_Load_Char, the slot's content is erased by the new glyph data, */ + /* i.e., the glyph's metrics, its image (bitmap or outline), and */ + /* other control information. */ + /* */ + /* <Also> */ + /* See @FT_GlyphSlotRec for the publicly accessible glyph fields. */ + /* */ + typedef struct FT_GlyphSlotRec_* FT_GlyphSlot; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_CharMap */ + /* */ + /* <Description> */ + /* A handle to a given character map. A charmap is used to translate */ + /* character codes in a given encoding into glyph indexes for its */ + /* parent's face. Some font formats may provide several charmaps per */ + /* font. */ + /* */ + /* Each face object owns zero or more charmaps, but only one of them */ + /* can be `active' and used by @FT_Get_Char_Index or @FT_Load_Char. */ + /* */ + /* The list of available charmaps in a face is available through the */ + /* `face->num_charmaps' and `face->charmaps' fields of @FT_FaceRec. */ + /* */ + /* The currently active charmap is available as `face->charmap'. */ + /* You should call @FT_Set_Charmap to change it. */ + /* */ + /* <Note> */ + /* When a new face is created (either through @FT_New_Face or */ + /* @FT_Open_Face), the library looks for a Unicode charmap within */ + /* the list and automatically activates it. */ + /* */ + /* <Also> */ + /* See @FT_CharMapRec for the publicly accessible fields of a given */ + /* character map. */ + /* */ + typedef struct FT_CharMapRec_* FT_CharMap; + + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_ENC_TAG */ + /* */ + /* <Description> */ + /* This macro converts four-letter tags into an unsigned long. It is */ + /* used to define `encoding' identifiers (see @FT_Encoding). */ + /* */ + /* <Note> */ + /* Since many 16-bit compilers don't like 32-bit enumerations, you */ + /* should redefine this macro in case of problems to something like */ + /* this: */ + /* */ + /* { */ + /* #define FT_ENC_TAG( value, a, b, c, d ) value */ + /* } */ + /* */ + /* to get a simple enumeration without assigning special numbers. */ + /* */ + +#ifndef FT_ENC_TAG +#define FT_ENC_TAG( value, a, b, c, d ) \ + value = ( ( (FT_UInt32)(a) << 24 ) | \ + ( (FT_UInt32)(b) << 16 ) | \ + ( (FT_UInt32)(c) << 8 ) | \ + (FT_UInt32)(d) ) + +#endif /* FT_ENC_TAG */ + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Encoding */ + /* */ + /* <Description> */ + /* An enumeration used to specify character sets supported by */ + /* charmaps. Used in the @FT_Select_Charmap API function. */ + /* */ + /* <Note> */ + /* Despite the name, this enumeration lists specific character */ + /* repertories (i.e., charsets), and not text encoding methods (e.g., */ + /* UTF-8, UTF-16, etc.). */ + /* */ + /* Other encodings might be defined in the future. */ + /* */ + /* <Values> */ + /* FT_ENCODING_NONE :: */ + /* The encoding value~0 is reserved. */ + /* */ + /* FT_ENCODING_UNICODE :: */ + /* Corresponds to the Unicode character set. This value covers */ + /* all versions of the Unicode repertoire, including ASCII and */ + /* Latin-1. Most fonts include a Unicode charmap, but not all */ + /* of them. */ + /* */ + /* For example, if you want to access Unicode value U+1F028 (and */ + /* the font contains it), use value 0x1F028 as the input value for */ + /* @FT_Get_Char_Index. */ + /* */ + /* FT_ENCODING_MS_SYMBOL :: */ + /* Corresponds to the Microsoft Symbol encoding, used to encode */ + /* mathematical symbols in the 32..255 character code range. For */ + /* more information, see `http://www.ceviz.net/symbol.htm'. */ + /* */ + /* FT_ENCODING_SJIS :: */ + /* Corresponds to Japanese SJIS encoding. More info at */ + /* at `http://langsupport.japanreference.com/encoding.shtml'. */ + /* See note on multi-byte encodings below. */ + /* */ + /* FT_ENCODING_GB2312 :: */ + /* Corresponds to an encoding system for Simplified Chinese as used */ + /* used in mainland China. */ + /* */ + /* FT_ENCODING_BIG5 :: */ + /* Corresponds to an encoding system for Traditional Chinese as */ + /* used in Taiwan and Hong Kong. */ + /* */ + /* FT_ENCODING_WANSUNG :: */ + /* Corresponds to the Korean encoding system known as Wansung. */ + /* For more information see */ + /* `http://www.microsoft.com/typography/unicode/949.txt'. */ + /* */ + /* FT_ENCODING_JOHAB :: */ + /* The Korean standard character set (KS~C 5601-1992), which */ + /* corresponds to MS Windows code page 1361. This character set */ + /* includes all possible Hangeul character combinations. */ + /* */ + /* FT_ENCODING_ADOBE_LATIN_1 :: */ + /* Corresponds to a Latin-1 encoding as defined in a Type~1 */ + /* PostScript font. It is limited to 256 character codes. */ + /* */ + /* FT_ENCODING_ADOBE_STANDARD :: */ + /* Corresponds to the Adobe Standard encoding, as found in Type~1, */ + /* CFF, and OpenType/CFF fonts. It is limited to 256 character */ + /* codes. */ + /* */ + /* FT_ENCODING_ADOBE_EXPERT :: */ + /* Corresponds to the Adobe Expert encoding, as found in Type~1, */ + /* CFF, and OpenType/CFF fonts. It is limited to 256 character */ + /* codes. */ + /* */ + /* FT_ENCODING_ADOBE_CUSTOM :: */ + /* Corresponds to a custom encoding, as found in Type~1, CFF, and */ + /* OpenType/CFF fonts. It is limited to 256 character codes. */ + /* */ + /* FT_ENCODING_APPLE_ROMAN :: */ + /* Corresponds to the 8-bit Apple roman encoding. Many TrueType */ + /* and OpenType fonts contain a charmap for this encoding, since */ + /* older versions of Mac OS are able to use it. */ + /* */ + /* FT_ENCODING_OLD_LATIN_2 :: */ + /* This value is deprecated and was never used nor reported by */ + /* FreeType. Don't use or test for it. */ + /* */ + /* FT_ENCODING_MS_SJIS :: */ + /* Same as FT_ENCODING_SJIS. Deprecated. */ + /* */ + /* FT_ENCODING_MS_GB2312 :: */ + /* Same as FT_ENCODING_GB2312. Deprecated. */ + /* */ + /* FT_ENCODING_MS_BIG5 :: */ + /* Same as FT_ENCODING_BIG5. Deprecated. */ + /* */ + /* FT_ENCODING_MS_WANSUNG :: */ + /* Same as FT_ENCODING_WANSUNG. Deprecated. */ + /* */ + /* FT_ENCODING_MS_JOHAB :: */ + /* Same as FT_ENCODING_JOHAB. Deprecated. */ + /* */ + /* <Note> */ + /* By default, FreeType automatically synthesizes a Unicode charmap */ + /* for PostScript fonts, using their glyph names dictionaries. */ + /* However, it also reports the encodings defined explicitly in the */ + /* font file, for the cases when they are needed, with the Adobe */ + /* values as well. */ + /* */ + /* FT_ENCODING_NONE is set by the BDF and PCF drivers if the charmap */ + /* is neither Unicode nor ISO-8859-1 (otherwise it is set to */ + /* FT_ENCODING_UNICODE). Use @FT_Get_BDF_Charset_ID to find out */ + /* which encoding is really present. If, for example, the */ + /* `cs_registry' field is `KOI8' and the `cs_encoding' field is `R', */ + /* the font is encoded in KOI8-R. */ + /* */ + /* FT_ENCODING_NONE is always set (with a single exception) by the */ + /* winfonts driver. Use @FT_Get_WinFNT_Header and examine the */ + /* `charset' field of the @FT_WinFNT_HeaderRec structure to find out */ + /* which encoding is really present. For example, */ + /* @FT_WinFNT_ID_CP1251 (204) means Windows code page 1251 (for */ + /* Russian). */ + /* */ + /* FT_ENCODING_NONE is set if `platform_id' is @TT_PLATFORM_MACINTOSH */ + /* and `encoding_id' is not @TT_MAC_ID_ROMAN (otherwise it is set to */ + /* FT_ENCODING_APPLE_ROMAN). */ + /* */ + /* If `platform_id' is @TT_PLATFORM_MACINTOSH, use the function */ + /* @FT_Get_CMap_Language_ID to query the Mac language ID which may */ + /* be needed to be able to distinguish Apple encoding variants. See */ + /* */ + /* http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/README.TXT */ + /* */ + /* to get an idea how to do that. Basically, if the language ID */ + /* is~0, don't use it, otherwise subtract 1 from the language ID. */ + /* Then examine `encoding_id'. If, for example, `encoding_id' is */ + /* @TT_MAC_ID_ROMAN and the language ID (minus~1) is */ + /* `TT_MAC_LANGID_GREEK', it is the Greek encoding, not Roman. */ + /* @TT_MAC_ID_ARABIC with `TT_MAC_LANGID_FARSI' means the Farsi */ + /* variant the Arabic encoding. */ + /* */ + typedef enum FT_Encoding_ + { + FT_ENC_TAG( FT_ENCODING_NONE, 0, 0, 0, 0 ), + + FT_ENC_TAG( FT_ENCODING_MS_SYMBOL, 's', 'y', 'm', 'b' ), + FT_ENC_TAG( FT_ENCODING_UNICODE, 'u', 'n', 'i', 'c' ), + + FT_ENC_TAG( FT_ENCODING_SJIS, 's', 'j', 'i', 's' ), + FT_ENC_TAG( FT_ENCODING_GB2312, 'g', 'b', ' ', ' ' ), + FT_ENC_TAG( FT_ENCODING_BIG5, 'b', 'i', 'g', '5' ), + FT_ENC_TAG( FT_ENCODING_WANSUNG, 'w', 'a', 'n', 's' ), + FT_ENC_TAG( FT_ENCODING_JOHAB, 'j', 'o', 'h', 'a' ), + + /* for backwards compatibility */ + FT_ENCODING_MS_SJIS = FT_ENCODING_SJIS, + FT_ENCODING_MS_GB2312 = FT_ENCODING_GB2312, + FT_ENCODING_MS_BIG5 = FT_ENCODING_BIG5, + FT_ENCODING_MS_WANSUNG = FT_ENCODING_WANSUNG, + FT_ENCODING_MS_JOHAB = FT_ENCODING_JOHAB, + + FT_ENC_TAG( FT_ENCODING_ADOBE_STANDARD, 'A', 'D', 'O', 'B' ), + FT_ENC_TAG( FT_ENCODING_ADOBE_EXPERT, 'A', 'D', 'B', 'E' ), + FT_ENC_TAG( FT_ENCODING_ADOBE_CUSTOM, 'A', 'D', 'B', 'C' ), + FT_ENC_TAG( FT_ENCODING_ADOBE_LATIN_1, 'l', 'a', 't', '1' ), + + FT_ENC_TAG( FT_ENCODING_OLD_LATIN_2, 'l', 'a', 't', '2' ), + + FT_ENC_TAG( FT_ENCODING_APPLE_ROMAN, 'a', 'r', 'm', 'n' ) + + } FT_Encoding; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* ft_encoding_xxx */ + /* */ + /* <Description> */ + /* These constants are deprecated; use the corresponding @FT_Encoding */ + /* values instead. */ + /* */ +#define ft_encoding_none FT_ENCODING_NONE +#define ft_encoding_unicode FT_ENCODING_UNICODE +#define ft_encoding_symbol FT_ENCODING_MS_SYMBOL +#define ft_encoding_latin_1 FT_ENCODING_ADOBE_LATIN_1 +#define ft_encoding_latin_2 FT_ENCODING_OLD_LATIN_2 +#define ft_encoding_sjis FT_ENCODING_SJIS +#define ft_encoding_gb2312 FT_ENCODING_GB2312 +#define ft_encoding_big5 FT_ENCODING_BIG5 +#define ft_encoding_wansung FT_ENCODING_WANSUNG +#define ft_encoding_johab FT_ENCODING_JOHAB + +#define ft_encoding_adobe_standard FT_ENCODING_ADOBE_STANDARD +#define ft_encoding_adobe_expert FT_ENCODING_ADOBE_EXPERT +#define ft_encoding_adobe_custom FT_ENCODING_ADOBE_CUSTOM +#define ft_encoding_apple_roman FT_ENCODING_APPLE_ROMAN + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_CharMapRec */ + /* */ + /* <Description> */ + /* The base charmap structure. */ + /* */ + /* <Fields> */ + /* face :: A handle to the parent face object. */ + /* */ + /* encoding :: An @FT_Encoding tag identifying the charmap. Use */ + /* this with @FT_Select_Charmap. */ + /* */ + /* platform_id :: An ID number describing the platform for the */ + /* following encoding ID. This comes directly from */ + /* the TrueType specification and should be emulated */ + /* for other formats. */ + /* */ + /* encoding_id :: A platform specific encoding number. This also */ + /* comes from the TrueType specification and should be */ + /* emulated similarly. */ + /* */ + typedef struct FT_CharMapRec_ + { + FT_Face face; + FT_Encoding encoding; + FT_UShort platform_id; + FT_UShort encoding_id; + + } FT_CharMapRec; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* B A S E O B J E C T C L A S S E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Face_Internal */ + /* */ + /* <Description> */ + /* An opaque handle to an `FT_Face_InternalRec' structure, used to */ + /* model private data of a given @FT_Face object. */ + /* */ + /* This structure might change between releases of FreeType~2 and is */ + /* not generally available to client applications. */ + /* */ + typedef struct FT_Face_InternalRec_* FT_Face_Internal; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_FaceRec */ + /* */ + /* <Description> */ + /* FreeType root face class structure. A face object models a */ + /* typeface in a font file. */ + /* */ + /* <Fields> */ + /* num_faces :: The number of faces in the font file. Some */ + /* font formats can have multiple faces in */ + /* a font file. */ + /* */ + /* face_index :: The index of the face in the font file. It */ + /* is set to~0 if there is only one face in */ + /* the font file. */ + /* */ + /* face_flags :: A set of bit flags that give important */ + /* information about the face; see */ + /* @FT_FACE_FLAG_XXX for the details. */ + /* */ + /* style_flags :: A set of bit flags indicating the style of */ + /* the face; see @FT_STYLE_FLAG_XXX for the */ + /* details. */ + /* */ + /* num_glyphs :: The number of glyphs in the face. If the */ + /* face is scalable and has sbits (see */ + /* `num_fixed_sizes'), it is set to the number */ + /* of outline glyphs. */ + /* */ + /* For CID-keyed fonts, this value gives the */ + /* highest CID used in the font. */ + /* */ + /* family_name :: The face's family name. This is an ASCII */ + /* string, usually in English, which describes */ + /* the typeface's family (like `Times New */ + /* Roman', `Bodoni', `Garamond', etc). This */ + /* is a least common denominator used to list */ + /* fonts. Some formats (TrueType & OpenType) */ + /* provide localized and Unicode versions of */ + /* this string. Applications should use the */ + /* format specific interface to access them. */ + /* Can be NULL (e.g., in fonts embedded in a */ + /* PDF file). */ + /* */ + /* style_name :: The face's style name. This is an ASCII */ + /* string, usually in English, which describes */ + /* the typeface's style (like `Italic', */ + /* `Bold', `Condensed', etc). Not all font */ + /* formats provide a style name, so this field */ + /* is optional, and can be set to NULL. As */ + /* for `family_name', some formats provide */ + /* localized and Unicode versions of this */ + /* string. Applications should use the format */ + /* specific interface to access them. */ + /* */ + /* num_fixed_sizes :: The number of bitmap strikes in the face. */ + /* Even if the face is scalable, there might */ + /* still be bitmap strikes, which are called */ + /* `sbits' in that case. */ + /* */ + /* available_sizes :: An array of @FT_Bitmap_Size for all bitmap */ + /* strikes in the face. It is set to NULL if */ + /* there is no bitmap strike. */ + /* */ + /* num_charmaps :: The number of charmaps in the face. */ + /* */ + /* charmaps :: An array of the charmaps of the face. */ + /* */ + /* generic :: A field reserved for client uses. See the */ + /* @FT_Generic type description. */ + /* */ + /* bbox :: The font bounding box. Coordinates are */ + /* expressed in font units (see */ + /* `units_per_EM'). The box is large enough */ + /* to contain any glyph from the font. Thus, */ + /* `bbox.yMax' can be seen as the `maximal */ + /* ascender', and `bbox.yMin' as the `minimal */ + /* descender'. Only relevant for scalable */ + /* formats. */ + /* */ + /* Note that the bounding box might be off by */ + /* (at least) one pixel for hinted fonts. See */ + /* @FT_Size_Metrics for further discussion. */ + /* */ + /* units_per_EM :: The number of font units per EM square for */ + /* this face. This is typically 2048 for */ + /* TrueType fonts, and 1000 for Type~1 fonts. */ + /* Only relevant for scalable formats. */ + /* */ + /* ascender :: The typographic ascender of the face, */ + /* expressed in font units. For font formats */ + /* not having this information, it is set to */ + /* `bbox.yMax'. Only relevant for scalable */ + /* formats. */ + /* */ + /* descender :: The typographic descender of the face, */ + /* expressed in font units. For font formats */ + /* not having this information, it is set to */ + /* `bbox.yMin'. Note that this field is */ + /* usually negative. Only relevant for */ + /* scalable formats. */ + /* */ + /* height :: The height is the vertical distance */ + /* between two consecutive baselines, */ + /* expressed in font units. It is always */ + /* positive. Only relevant for scalable */ + /* formats. */ + /* */ + /* max_advance_width :: The maximal advance width, in font units, */ + /* for all glyphs in this face. This can be */ + /* used to make word wrapping computations */ + /* faster. Only relevant for scalable */ + /* formats. */ + /* */ + /* max_advance_height :: The maximal advance height, in font units, */ + /* for all glyphs in this face. This is only */ + /* relevant for vertical layouts, and is set */ + /* to `height' for fonts that do not provide */ + /* vertical metrics. Only relevant for */ + /* scalable formats. */ + /* */ + /* underline_position :: The position, in font units, of the */ + /* underline line for this face. It is the */ + /* center of the underlining stem. Only */ + /* relevant for scalable formats. */ + /* */ + /* underline_thickness :: The thickness, in font units, of the */ + /* underline for this face. Only relevant for */ + /* scalable formats. */ + /* */ + /* glyph :: The face's associated glyph slot(s). */ + /* */ + /* size :: The current active size for this face. */ + /* */ + /* charmap :: The current active charmap for this face. */ + /* */ + /* <Note> */ + /* Fields may be changed after a call to @FT_Attach_File or */ + /* @FT_Attach_Stream. */ + /* */ + typedef struct FT_FaceRec_ + { + FT_Long num_faces; + FT_Long face_index; + + FT_Long face_flags; + FT_Long style_flags; + + FT_Long num_glyphs; + + FT_String* family_name; + FT_String* style_name; + + FT_Int num_fixed_sizes; + FT_Bitmap_Size* available_sizes; + + FT_Int num_charmaps; + FT_CharMap* charmaps; + + FT_Generic generic; + + /*# The following member variables (down to `underline_thickness') */ + /*# are only relevant to scalable outlines; cf. @FT_Bitmap_Size */ + /*# for bitmap fonts. */ + FT_BBox bbox; + + FT_UShort units_per_EM; + FT_Short ascender; + FT_Short descender; + FT_Short height; + + FT_Short max_advance_width; + FT_Short max_advance_height; + + FT_Short underline_position; + FT_Short underline_thickness; + + FT_GlyphSlot glyph; + FT_Size size; + FT_CharMap charmap; + + /*@private begin */ + + FT_Driver driver; + FT_Memory memory; + FT_Stream stream; + + FT_ListRec sizes_list; + + FT_Generic autohint; + void* extensions; + + FT_Face_Internal internal; + + /*@private end */ + + } FT_FaceRec; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_FACE_FLAG_XXX */ + /* */ + /* <Description> */ + /* A list of bit flags used in the `face_flags' field of the */ + /* @FT_FaceRec structure. They inform client applications of */ + /* properties of the corresponding face. */ + /* */ + /* <Values> */ + /* FT_FACE_FLAG_SCALABLE :: */ + /* Indicates that the face contains outline glyphs. This doesn't */ + /* prevent bitmap strikes, i.e., a face can have both this and */ + /* and @FT_FACE_FLAG_FIXED_SIZES set. */ + /* */ + /* FT_FACE_FLAG_FIXED_SIZES :: */ + /* Indicates that the face contains bitmap strikes. See also the */ + /* `num_fixed_sizes' and `available_sizes' fields of @FT_FaceRec. */ + /* */ + /* FT_FACE_FLAG_FIXED_WIDTH :: */ + /* Indicates that the face contains fixed-width characters (like */ + /* Courier, Lucido, MonoType, etc.). */ + /* */ + /* FT_FACE_FLAG_SFNT :: */ + /* Indicates that the face uses the `sfnt' storage scheme. For */ + /* now, this means TrueType and OpenType. */ + /* */ + /* FT_FACE_FLAG_HORIZONTAL :: */ + /* Indicates that the face contains horizontal glyph metrics. This */ + /* should be set for all common formats. */ + /* */ + /* FT_FACE_FLAG_VERTICAL :: */ + /* Indicates that the face contains vertical glyph metrics. This */ + /* is only available in some formats, not all of them. */ + /* */ + /* FT_FACE_FLAG_KERNING :: */ + /* Indicates that the face contains kerning information. If set, */ + /* the kerning distance can be retrieved through the function */ + /* @FT_Get_Kerning. Otherwise the function always return the */ + /* vector (0,0). Note that FreeType doesn't handle kerning data */ + /* from the `GPOS' table (as present in some OpenType fonts). */ + /* */ + /* FT_FACE_FLAG_FAST_GLYPHS :: */ + /* THIS FLAG IS DEPRECATED. DO NOT USE OR TEST IT. */ + /* */ + /* FT_FACE_FLAG_MULTIPLE_MASTERS :: */ + /* Indicates that the font contains multiple masters and is capable */ + /* of interpolating between them. See the multiple-masters */ + /* specific API for details. */ + /* */ + /* FT_FACE_FLAG_GLYPH_NAMES :: */ + /* Indicates that the font contains glyph names that can be */ + /* retrieved through @FT_Get_Glyph_Name. Note that some TrueType */ + /* fonts contain broken glyph name tables. Use the function */ + /* @FT_Has_PS_Glyph_Names when needed. */ + /* */ + /* FT_FACE_FLAG_EXTERNAL_STREAM :: */ + /* Used internally by FreeType to indicate that a face's stream was */ + /* provided by the client application and should not be destroyed */ + /* when @FT_Done_Face is called. Don't read or test this flag. */ + /* */ + /* FT_FACE_FLAG_HINTER :: */ + /* Set if the font driver has a hinting machine of its own. For */ + /* example, with TrueType fonts, it makes sense to use data from */ + /* the SFNT `gasp' table only if the native TrueType hinting engine */ + /* (with the bytecode interpreter) is available and active. */ + /* */ + /* FT_FACE_FLAG_CID_KEYED :: */ + /* Set if the font is CID-keyed. In that case, the font is not */ + /* accessed by glyph indices but by CID values. For subsetted */ + /* CID-keyed fonts this has the consequence that not all index */ + /* values are a valid argument to FT_Load_Glyph. Only the CID */ + /* values for which corresponding glyphs in the subsetted font */ + /* exist make FT_Load_Glyph return successfully; in all other cases */ + /* you get an `FT_Err_Invalid_Argument' error. */ + /* */ + /* Note that CID-keyed fonts which are in an SFNT wrapper don't */ + /* have this flag set since the glyphs are accessed in the normal */ + /* way (using contiguous indices); the `CID-ness' isn't visible to */ + /* the application. */ + /* */ + /* FT_FACE_FLAG_TRICKY :: */ + /* Set if the font is `tricky', this is, it always needs the */ + /* font format's native hinting engine to get a reasonable result. */ + /* A typical example is the Chinese font `mingli.ttf' which uses */ + /* TrueType bytecode instructions to move and scale all of its */ + /* subglyphs. */ + /* */ + /* It is not possible to autohint such fonts using */ + /* @FT_LOAD_FORCE_AUTOHINT; it will also ignore */ + /* @FT_LOAD_NO_HINTING. You have to set both FT_LOAD_NO_HINTING */ + /* and @FT_LOAD_NO_AUTOHINT to really disable hinting; however, you */ + /* probably never want this except for demonstration purposes. */ + /* */ + /* Currently, there are six TrueType fonts in the list of tricky */ + /* fonts; they are hard-coded in file `ttobjs.c'. */ + /* */ +#define FT_FACE_FLAG_SCALABLE ( 1L << 0 ) +#define FT_FACE_FLAG_FIXED_SIZES ( 1L << 1 ) +#define FT_FACE_FLAG_FIXED_WIDTH ( 1L << 2 ) +#define FT_FACE_FLAG_SFNT ( 1L << 3 ) +#define FT_FACE_FLAG_HORIZONTAL ( 1L << 4 ) +#define FT_FACE_FLAG_VERTICAL ( 1L << 5 ) +#define FT_FACE_FLAG_KERNING ( 1L << 6 ) +#define FT_FACE_FLAG_FAST_GLYPHS ( 1L << 7 ) +#define FT_FACE_FLAG_MULTIPLE_MASTERS ( 1L << 8 ) +#define FT_FACE_FLAG_GLYPH_NAMES ( 1L << 9 ) +#define FT_FACE_FLAG_EXTERNAL_STREAM ( 1L << 10 ) +#define FT_FACE_FLAG_HINTER ( 1L << 11 ) +#define FT_FACE_FLAG_CID_KEYED ( 1L << 12 ) +#define FT_FACE_FLAG_TRICKY ( 1L << 13 ) + + + /************************************************************************* + * + * @macro: + * FT_HAS_HORIZONTAL( face ) + * + * @description: + * A macro that returns true whenever a face object contains + * horizontal metrics (this is true for all font formats though). + * + * @also: + * @FT_HAS_VERTICAL can be used to check for vertical metrics. + * + */ +#define FT_HAS_HORIZONTAL( face ) \ + ( face->face_flags & FT_FACE_FLAG_HORIZONTAL ) + + + /************************************************************************* + * + * @macro: + * FT_HAS_VERTICAL( face ) + * + * @description: + * A macro that returns true whenever a face object contains vertical + * metrics. + * + */ +#define FT_HAS_VERTICAL( face ) \ + ( face->face_flags & FT_FACE_FLAG_VERTICAL ) + + + /************************************************************************* + * + * @macro: + * FT_HAS_KERNING( face ) + * + * @description: + * A macro that returns true whenever a face object contains kerning + * data that can be accessed with @FT_Get_Kerning. + * + */ +#define FT_HAS_KERNING( face ) \ + ( face->face_flags & FT_FACE_FLAG_KERNING ) + + + /************************************************************************* + * + * @macro: + * FT_IS_SCALABLE( face ) + * + * @description: + * A macro that returns true whenever a face object contains a scalable + * font face (true for TrueType, Type~1, Type~42, CID, OpenType/CFF, + * and PFR font formats. + * + */ +#define FT_IS_SCALABLE( face ) \ + ( face->face_flags & FT_FACE_FLAG_SCALABLE ) + + + /************************************************************************* + * + * @macro: + * FT_IS_SFNT( face ) + * + * @description: + * A macro that returns true whenever a face object contains a font + * whose format is based on the SFNT storage scheme. This usually + * means: TrueType fonts, OpenType fonts, as well as SFNT-based embedded + * bitmap fonts. + * + * If this macro is true, all functions defined in @FT_SFNT_NAMES_H and + * @FT_TRUETYPE_TABLES_H are available. + * + */ +#define FT_IS_SFNT( face ) \ + ( face->face_flags & FT_FACE_FLAG_SFNT ) + + + /************************************************************************* + * + * @macro: + * FT_IS_FIXED_WIDTH( face ) + * + * @description: + * A macro that returns true whenever a face object contains a font face + * that contains fixed-width (or `monospace', `fixed-pitch', etc.) + * glyphs. + * + */ +#define FT_IS_FIXED_WIDTH( face ) \ + ( face->face_flags & FT_FACE_FLAG_FIXED_WIDTH ) + + + /************************************************************************* + * + * @macro: + * FT_HAS_FIXED_SIZES( face ) + * + * @description: + * A macro that returns true whenever a face object contains some + * embedded bitmaps. See the `available_sizes' field of the + * @FT_FaceRec structure. + * + */ +#define FT_HAS_FIXED_SIZES( face ) \ + ( face->face_flags & FT_FACE_FLAG_FIXED_SIZES ) + + + /************************************************************************* + * + * @macro: + * FT_HAS_FAST_GLYPHS( face ) + * + * @description: + * Deprecated. + * + */ +#define FT_HAS_FAST_GLYPHS( face ) 0 + + + /************************************************************************* + * + * @macro: + * FT_HAS_GLYPH_NAMES( face ) + * + * @description: + * A macro that returns true whenever a face object contains some glyph + * names that can be accessed through @FT_Get_Glyph_Name. + * + */ +#define FT_HAS_GLYPH_NAMES( face ) \ + ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) + + + /************************************************************************* + * + * @macro: + * FT_HAS_MULTIPLE_MASTERS( face ) + * + * @description: + * A macro that returns true whenever a face object contains some + * multiple masters. The functions provided by @FT_MULTIPLE_MASTERS_H + * are then available to choose the exact design you want. + * + */ +#define FT_HAS_MULTIPLE_MASTERS( face ) \ + ( face->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS ) + + + /************************************************************************* + * + * @macro: + * FT_IS_CID_KEYED( face ) + * + * @description: + * A macro that returns true whenever a face object contains a CID-keyed + * font. See the discussion of @FT_FACE_FLAG_CID_KEYED for more + * details. + * + * If this macro is true, all functions defined in @FT_CID_H are + * available. + * + */ +#define FT_IS_CID_KEYED( face ) \ + ( face->face_flags & FT_FACE_FLAG_CID_KEYED ) + + + /************************************************************************* + * + * @macro: + * FT_IS_TRICKY( face ) + * + * @description: + * A macro that returns true whenever a face represents a `tricky' font. + * See the discussion of @FT_FACE_FLAG_TRICKY for more details. + * + */ +#define FT_IS_TRICKY( face ) \ + ( face->face_flags & FT_FACE_FLAG_TRICKY ) + + + /*************************************************************************/ + /* */ + /* <Const> */ + /* FT_STYLE_FLAG_XXX */ + /* */ + /* <Description> */ + /* A list of bit-flags used to indicate the style of a given face. */ + /* These are used in the `style_flags' field of @FT_FaceRec. */ + /* */ + /* <Values> */ + /* FT_STYLE_FLAG_ITALIC :: */ + /* Indicates that a given face style is italic or oblique. */ + /* */ + /* FT_STYLE_FLAG_BOLD :: */ + /* Indicates that a given face is bold. */ + /* */ + /* <Note> */ + /* The style information as provided by FreeType is very basic. More */ + /* details are beyond the scope and should be done on a higher level */ + /* (for example, by analyzing various fields of the `OS/2' table in */ + /* SFNT based fonts). */ + /* */ +#define FT_STYLE_FLAG_ITALIC ( 1 << 0 ) +#define FT_STYLE_FLAG_BOLD ( 1 << 1 ) + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Size_Internal */ + /* */ + /* <Description> */ + /* An opaque handle to an `FT_Size_InternalRec' structure, used to */ + /* model private data of a given @FT_Size object. */ + /* */ + typedef struct FT_Size_InternalRec_* FT_Size_Internal; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Size_Metrics */ + /* */ + /* <Description> */ + /* The size metrics structure gives the metrics of a size object. */ + /* */ + /* <Fields> */ + /* x_ppem :: The width of the scaled EM square in pixels, hence */ + /* the term `ppem' (pixels per EM). It is also */ + /* referred to as `nominal width'. */ + /* */ + /* y_ppem :: The height of the scaled EM square in pixels, */ + /* hence the term `ppem' (pixels per EM). It is also */ + /* referred to as `nominal height'. */ + /* */ + /* x_scale :: A 16.16 fractional scaling value used to convert */ + /* horizontal metrics from font units to 26.6 */ + /* fractional pixels. Only relevant for scalable */ + /* font formats. */ + /* */ + /* y_scale :: A 16.16 fractional scaling value used to convert */ + /* vertical metrics from font units to 26.6 */ + /* fractional pixels. Only relevant for scalable */ + /* font formats. */ + /* */ + /* ascender :: The ascender in 26.6 fractional pixels. See */ + /* @FT_FaceRec for the details. */ + /* */ + /* descender :: The descender in 26.6 fractional pixels. See */ + /* @FT_FaceRec for the details. */ + /* */ + /* height :: The height in 26.6 fractional pixels. See */ + /* @FT_FaceRec for the details. */ + /* */ + /* max_advance :: The maximal advance width in 26.6 fractional */ + /* pixels. See @FT_FaceRec for the details. */ + /* */ + /* <Note> */ + /* The scaling values, if relevant, are determined first during a */ + /* size changing operation. The remaining fields are then set by the */ + /* driver. For scalable formats, they are usually set to scaled */ + /* values of the corresponding fields in @FT_FaceRec. */ + /* */ + /* Note that due to glyph hinting, these values might not be exact */ + /* for certain fonts. Thus they must be treated as unreliable */ + /* with an error margin of at least one pixel! */ + /* */ + /* Indeed, the only way to get the exact metrics is to render _all_ */ + /* glyphs. As this would be a definite performance hit, it is up to */ + /* client applications to perform such computations. */ + /* */ + /* The FT_Size_Metrics structure is valid for bitmap fonts also. */ + /* */ + typedef struct FT_Size_Metrics_ + { + FT_UShort x_ppem; /* horizontal pixels per EM */ + FT_UShort y_ppem; /* vertical pixels per EM */ + + FT_Fixed x_scale; /* scaling values used to convert font */ + FT_Fixed y_scale; /* units to 26.6 fractional pixels */ + + FT_Pos ascender; /* ascender in 26.6 frac. pixels */ + FT_Pos descender; /* descender in 26.6 frac. pixels */ + FT_Pos height; /* text height in 26.6 frac. pixels */ + FT_Pos max_advance; /* max horizontal advance, in 26.6 pixels */ + + } FT_Size_Metrics; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_SizeRec */ + /* */ + /* <Description> */ + /* FreeType root size class structure. A size object models a face */ + /* object at a given size. */ + /* */ + /* <Fields> */ + /* face :: Handle to the parent face object. */ + /* */ + /* generic :: A typeless pointer, which is unused by the FreeType */ + /* library or any of its drivers. It can be used by */ + /* client applications to link their own data to each size */ + /* object. */ + /* */ + /* metrics :: Metrics for this size object. This field is read-only. */ + /* */ + typedef struct FT_SizeRec_ + { + FT_Face face; /* parent face object */ + FT_Generic generic; /* generic pointer for client uses */ + FT_Size_Metrics metrics; /* size metrics */ + FT_Size_Internal internal; + + } FT_SizeRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_SubGlyph */ + /* */ + /* <Description> */ + /* The subglyph structure is an internal object used to describe */ + /* subglyphs (for example, in the case of composites). */ + /* */ + /* <Note> */ + /* The subglyph implementation is not part of the high-level API, */ + /* hence the forward structure declaration. */ + /* */ + /* You can however retrieve subglyph information with */ + /* @FT_Get_SubGlyph_Info. */ + /* */ + typedef struct FT_SubGlyphRec_* FT_SubGlyph; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Slot_Internal */ + /* */ + /* <Description> */ + /* An opaque handle to an `FT_Slot_InternalRec' structure, used to */ + /* model private data of a given @FT_GlyphSlot object. */ + /* */ + typedef struct FT_Slot_InternalRec_* FT_Slot_Internal; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_GlyphSlotRec */ + /* */ + /* <Description> */ + /* FreeType root glyph slot class structure. A glyph slot is a */ + /* container where individual glyphs can be loaded, be they in */ + /* outline or bitmap format. */ + /* */ + /* <Fields> */ + /* library :: A handle to the FreeType library instance */ + /* this slot belongs to. */ + /* */ + /* face :: A handle to the parent face object. */ + /* */ + /* next :: In some cases (like some font tools), several */ + /* glyph slots per face object can be a good */ + /* thing. As this is rare, the glyph slots are */ + /* listed through a direct, single-linked list */ + /* using its `next' field. */ + /* */ + /* generic :: A typeless pointer which is unused by the */ + /* FreeType library or any of its drivers. It */ + /* can be used by client applications to link */ + /* their own data to each glyph slot object. */ + /* */ + /* metrics :: The metrics of the last loaded glyph in the */ + /* slot. The returned values depend on the last */ + /* load flags (see the @FT_Load_Glyph API */ + /* function) and can be expressed either in 26.6 */ + /* fractional pixels or font units. */ + /* */ + /* Note that even when the glyph image is */ + /* transformed, the metrics are not. */ + /* */ + /* linearHoriAdvance :: The advance width of the unhinted glyph. */ + /* Its value is expressed in 16.16 fractional */ + /* pixels, unless @FT_LOAD_LINEAR_DESIGN is set */ + /* when loading the glyph. This field can be */ + /* important to perform correct WYSIWYG layout. */ + /* Only relevant for outline glyphs. */ + /* */ + /* linearVertAdvance :: The advance height of the unhinted glyph. */ + /* Its value is expressed in 16.16 fractional */ + /* pixels, unless @FT_LOAD_LINEAR_DESIGN is set */ + /* when loading the glyph. This field can be */ + /* important to perform correct WYSIWYG layout. */ + /* Only relevant for outline glyphs. */ + /* */ + /* advance :: This shorthand is, depending on */ + /* @FT_LOAD_IGNORE_TRANSFORM, the transformed */ + /* advance width for the glyph (in 26.6 */ + /* fractional pixel format). As specified with */ + /* @FT_LOAD_VERTICAL_LAYOUT, it uses either the */ + /* `horiAdvance' or the `vertAdvance' value of */ + /* `metrics' field. */ + /* */ + /* format :: This field indicates the format of the image */ + /* contained in the glyph slot. Typically */ + /* @FT_GLYPH_FORMAT_BITMAP, */ + /* @FT_GLYPH_FORMAT_OUTLINE, or */ + /* @FT_GLYPH_FORMAT_COMPOSITE, but others are */ + /* possible. */ + /* */ + /* bitmap :: This field is used as a bitmap descriptor */ + /* when the slot format is */ + /* @FT_GLYPH_FORMAT_BITMAP. Note that the */ + /* address and content of the bitmap buffer can */ + /* change between calls of @FT_Load_Glyph and a */ + /* few other functions. */ + /* */ + /* bitmap_left :: This is the bitmap's left bearing expressed */ + /* in integer pixels. Of course, this is only */ + /* valid if the format is */ + /* @FT_GLYPH_FORMAT_BITMAP. */ + /* */ + /* bitmap_top :: This is the bitmap's top bearing expressed in */ + /* integer pixels. Remember that this is the */ + /* distance from the baseline to the top-most */ + /* glyph scanline, upwards y~coordinates being */ + /* *positive*. */ + /* */ + /* outline :: The outline descriptor for the current glyph */ + /* image if its format is */ + /* @FT_GLYPH_FORMAT_OUTLINE. Once a glyph is */ + /* loaded, `outline' can be transformed, */ + /* distorted, embolded, etc. However, it must */ + /* not be freed. */ + /* */ + /* num_subglyphs :: The number of subglyphs in a composite glyph. */ + /* This field is only valid for the composite */ + /* glyph format that should normally only be */ + /* loaded with the @FT_LOAD_NO_RECURSE flag. */ + /* For now this is internal to FreeType. */ + /* */ + /* subglyphs :: An array of subglyph descriptors for */ + /* composite glyphs. There are `num_subglyphs' */ + /* elements in there. Currently internal to */ + /* FreeType. */ + /* */ + /* control_data :: Certain font drivers can also return the */ + /* control data for a given glyph image (e.g. */ + /* TrueType bytecode, Type~1 charstrings, etc.). */ + /* This field is a pointer to such data. */ + /* */ + /* control_len :: This is the length in bytes of the control */ + /* data. */ + /* */ + /* other :: Really wicked formats can use this pointer to */ + /* present their own glyph image to client */ + /* applications. Note that the application */ + /* needs to know about the image format. */ + /* */ + /* lsb_delta :: The difference between hinted and unhinted */ + /* left side bearing while autohinting is */ + /* active. Zero otherwise. */ + /* */ + /* rsb_delta :: The difference between hinted and unhinted */ + /* right side bearing while autohinting is */ + /* active. Zero otherwise. */ + /* */ + /* <Note> */ + /* If @FT_Load_Glyph is called with default flags (see */ + /* @FT_LOAD_DEFAULT) the glyph image is loaded in the glyph slot in */ + /* its native format (e.g., an outline glyph for TrueType and Type~1 */ + /* formats). */ + /* */ + /* This image can later be converted into a bitmap by calling */ + /* @FT_Render_Glyph. This function finds the current renderer for */ + /* the native image's format, then invokes it. */ + /* */ + /* The renderer is in charge of transforming the native image through */ + /* the slot's face transformation fields, then converting it into a */ + /* bitmap that is returned in `slot->bitmap'. */ + /* */ + /* Note that `slot->bitmap_left' and `slot->bitmap_top' are also used */ + /* to specify the position of the bitmap relative to the current pen */ + /* position (e.g., coordinates (0,0) on the baseline). Of course, */ + /* `slot->format' is also changed to @FT_GLYPH_FORMAT_BITMAP. */ + /* */ + /* <Note> */ + /* Here a small pseudo code fragment which shows how to use */ + /* `lsb_delta' and `rsb_delta': */ + /* */ + /* { */ + /* FT_Pos origin_x = 0; */ + /* FT_Pos prev_rsb_delta = 0; */ + /* */ + /* */ + /* for all glyphs do */ + /* <compute kern between current and previous glyph and add it to */ + /* `origin_x'> */ + /* */ + /* <load glyph with `FT_Load_Glyph'> */ + /* */ + /* if ( prev_rsb_delta - face->glyph->lsb_delta >= 32 ) */ + /* origin_x -= 64; */ + /* else if ( prev_rsb_delta - face->glyph->lsb_delta < -32 ) */ + /* origin_x += 64; */ + /* */ + /* prev_rsb_delta = face->glyph->rsb_delta; */ + /* */ + /* <save glyph image, or render glyph, or ...> */ + /* */ + /* origin_x += face->glyph->advance.x; */ + /* endfor */ + /* } */ + /* */ + typedef struct FT_GlyphSlotRec_ + { + FT_Library library; + FT_Face face; + FT_GlyphSlot next; + FT_UInt reserved; /* retained for binary compatibility */ + FT_Generic generic; + + FT_Glyph_Metrics metrics; + FT_Fixed linearHoriAdvance; + FT_Fixed linearVertAdvance; + FT_Vector advance; + + FT_Glyph_Format format; + + FT_Bitmap bitmap; + FT_Int bitmap_left; + FT_Int bitmap_top; + + FT_Outline outline; + + FT_UInt num_subglyphs; + FT_SubGlyph subglyphs; + + void* control_data; + long control_len; + + FT_Pos lsb_delta; + FT_Pos rsb_delta; + + void* other; + + FT_Slot_Internal internal; + + } FT_GlyphSlotRec; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* F U N C T I O N S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Init_FreeType */ + /* */ + /* <Description> */ + /* Initialize a new FreeType library object. The set of modules */ + /* that are registered by this function is determined at build time. */ + /* */ + /* <Output> */ + /* alibrary :: A handle to a new library object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* In case you want to provide your own memory allocating routines, */ + /* use @FT_New_Library instead, followed by a call to */ + /* @FT_Add_Default_Modules (or a series of calls to @FT_Add_Module). */ + /* */ + FT_EXPORT( FT_Error ) + FT_Init_FreeType( FT_Library *alibrary ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_FreeType */ + /* */ + /* <Description> */ + /* Destroy a given FreeType library object and all of its children, */ + /* including resources, drivers, faces, sizes, etc. */ + /* */ + /* <Input> */ + /* library :: A handle to the target library object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Done_FreeType( FT_Library library ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_OPEN_XXX */ + /* */ + /* <Description> */ + /* A list of bit-field constants used within the `flags' field of the */ + /* @FT_Open_Args structure. */ + /* */ + /* <Values> */ + /* FT_OPEN_MEMORY :: This is a memory-based stream. */ + /* */ + /* FT_OPEN_STREAM :: Copy the stream from the `stream' field. */ + /* */ + /* FT_OPEN_PATHNAME :: Create a new input stream from a C~path */ + /* name. */ + /* */ + /* FT_OPEN_DRIVER :: Use the `driver' field. */ + /* */ + /* FT_OPEN_PARAMS :: Use the `num_params' and `params' fields. */ + /* */ + /* ft_open_memory :: Deprecated; use @FT_OPEN_MEMORY instead. */ + /* */ + /* ft_open_stream :: Deprecated; use @FT_OPEN_STREAM instead. */ + /* */ + /* ft_open_pathname :: Deprecated; use @FT_OPEN_PATHNAME instead. */ + /* */ + /* ft_open_driver :: Deprecated; use @FT_OPEN_DRIVER instead. */ + /* */ + /* ft_open_params :: Deprecated; use @FT_OPEN_PARAMS instead. */ + /* */ + /* <Note> */ + /* The `FT_OPEN_MEMORY', `FT_OPEN_STREAM', and `FT_OPEN_PATHNAME' */ + /* flags are mutually exclusive. */ + /* */ +#define FT_OPEN_MEMORY 0x1 +#define FT_OPEN_STREAM 0x2 +#define FT_OPEN_PATHNAME 0x4 +#define FT_OPEN_DRIVER 0x8 +#define FT_OPEN_PARAMS 0x10 + +#define ft_open_memory FT_OPEN_MEMORY /* deprecated */ +#define ft_open_stream FT_OPEN_STREAM /* deprecated */ +#define ft_open_pathname FT_OPEN_PATHNAME /* deprecated */ +#define ft_open_driver FT_OPEN_DRIVER /* deprecated */ +#define ft_open_params FT_OPEN_PARAMS /* deprecated */ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Parameter */ + /* */ + /* <Description> */ + /* A simple structure used to pass more or less generic parameters to */ + /* @FT_Open_Face. */ + /* */ + /* <Fields> */ + /* tag :: A four-byte identification tag. */ + /* */ + /* data :: A pointer to the parameter data. */ + /* */ + /* <Note> */ + /* The ID and function of parameters are driver-specific. See the */ + /* various FT_PARAM_TAG_XXX flags for more information. */ + /* */ + typedef struct FT_Parameter_ + { + FT_ULong tag; + FT_Pointer data; + + } FT_Parameter; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Open_Args */ + /* */ + /* <Description> */ + /* A structure used to indicate how to open a new font file or */ + /* stream. A pointer to such a structure can be used as a parameter */ + /* for the functions @FT_Open_Face and @FT_Attach_Stream. */ + /* */ + /* <Fields> */ + /* flags :: A set of bit flags indicating how to use the */ + /* structure. */ + /* */ + /* memory_base :: The first byte of the file in memory. */ + /* */ + /* memory_size :: The size in bytes of the file in memory. */ + /* */ + /* pathname :: A pointer to an 8-bit file pathname. */ + /* */ + /* stream :: A handle to a source stream object. */ + /* */ + /* driver :: This field is exclusively used by @FT_Open_Face; */ + /* it simply specifies the font driver to use to open */ + /* the face. If set to~0, FreeType tries to load the */ + /* face with each one of the drivers in its list. */ + /* */ + /* num_params :: The number of extra parameters. */ + /* */ + /* params :: Extra parameters passed to the font driver when */ + /* opening a new face. */ + /* */ + /* <Note> */ + /* The stream type is determined by the contents of `flags' which */ + /* are tested in the following order by @FT_Open_Face: */ + /* */ + /* If the `FT_OPEN_MEMORY' bit is set, assume that this is a */ + /* memory file of `memory_size' bytes, located at `memory_address'. */ + /* The data are are not copied, and the client is responsible for */ + /* releasing and destroying them _after_ the corresponding call to */ + /* @FT_Done_Face. */ + /* */ + /* Otherwise, if the `FT_OPEN_STREAM' bit is set, assume that a */ + /* custom input stream `stream' is used. */ + /* */ + /* Otherwise, if the `FT_OPEN_PATHNAME' bit is set, assume that this */ + /* is a normal file and use `pathname' to open it. */ + /* */ + /* If the `FT_OPEN_DRIVER' bit is set, @FT_Open_Face only tries to */ + /* open the file with the driver whose handler is in `driver'. */ + /* */ + /* If the `FT_OPEN_PARAMS' bit is set, the parameters given by */ + /* `num_params' and `params' is used. They are ignored otherwise. */ + /* */ + /* Ideally, both the `pathname' and `params' fields should be tagged */ + /* as `const'; this is missing for API backwards compatibility. In */ + /* other words, applications should treat them as read-only. */ + /* */ + typedef struct FT_Open_Args_ + { + FT_UInt flags; + const FT_Byte* memory_base; + FT_Long memory_size; + FT_String* pathname; + FT_Stream stream; + FT_Module driver; + FT_Int num_params; + FT_Parameter* params; + + } FT_Open_Args; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Face */ + /* */ + /* <Description> */ + /* This function calls @FT_Open_Face to open a font by its pathname. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* pathname :: A path to the font file. */ + /* */ + /* face_index :: The index of the face within the font. The first */ + /* face has index~0. */ + /* */ + /* <Output> */ + /* aface :: A handle to a new face object. If `face_index' is */ + /* greater than or equal to zero, it must be non-NULL. */ + /* See @FT_Open_Face for more details. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Face( FT_Library library, + const char* filepathname, + FT_Long face_index, + FT_Face *aface ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Memory_Face */ + /* */ + /* <Description> */ + /* This function calls @FT_Open_Face to open a font which has been */ + /* loaded into memory. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* file_base :: A pointer to the beginning of the font data. */ + /* */ + /* file_size :: The size of the memory chunk used by the font data. */ + /* */ + /* face_index :: The index of the face within the font. The first */ + /* face has index~0. */ + /* */ + /* <Output> */ + /* aface :: A handle to a new face object. If `face_index' is */ + /* greater than or equal to zero, it must be non-NULL. */ + /* See @FT_Open_Face for more details. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* You must not deallocate the memory before calling @FT_Done_Face. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Memory_Face( FT_Library library, + const FT_Byte* file_base, + FT_Long file_size, + FT_Long face_index, + FT_Face *aface ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Open_Face */ + /* */ + /* <Description> */ + /* Create a face object from a given resource described by */ + /* @FT_Open_Args. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* args :: A pointer to an `FT_Open_Args' structure which must */ + /* be filled by the caller. */ + /* */ + /* face_index :: The index of the face within the font. The first */ + /* face has index~0. */ + /* */ + /* <Output> */ + /* aface :: A handle to a new face object. If `face_index' is */ + /* greater than or equal to zero, it must be non-NULL. */ + /* See note below. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* Unlike FreeType 1.x, this function automatically creates a glyph */ + /* slot for the face object which can be accessed directly through */ + /* `face->glyph'. */ + /* */ + /* FT_Open_Face can be used to quickly check whether the font */ + /* format of a given font resource is supported by FreeType. If the */ + /* `face_index' field is negative, the function's return value is~0 */ + /* if the font format is recognized, or non-zero otherwise; */ + /* the function returns a more or less empty face handle in `*aface' */ + /* (if `aface' isn't NULL). The only useful field in this special */ + /* case is `face->num_faces' which gives the number of faces within */ + /* the font file. After examination, the returned @FT_Face structure */ + /* should be deallocated with a call to @FT_Done_Face. */ + /* */ + /* Each new face object created with this function also owns a */ + /* default @FT_Size object, accessible as `face->size'. */ + /* */ + /* See the discussion of reference counters in the description of */ + /* @FT_Reference_Face. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Open_Face( FT_Library library, + const FT_Open_Args* args, + FT_Long face_index, + FT_Face *aface ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Attach_File */ + /* */ + /* <Description> */ + /* This function calls @FT_Attach_Stream to attach a file. */ + /* */ + /* <InOut> */ + /* face :: The target face object. */ + /* */ + /* <Input> */ + /* filepathname :: The pathname. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Attach_File( FT_Face face, + const char* filepathname ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Attach_Stream */ + /* */ + /* <Description> */ + /* `Attach' data to a face object. Normally, this is used to read */ + /* additional information for the face object. For example, you can */ + /* attach an AFM file that comes with a Type~1 font to get the */ + /* kerning values and other metrics. */ + /* */ + /* <InOut> */ + /* face :: The target face object. */ + /* */ + /* <Input> */ + /* parameters :: A pointer to @FT_Open_Args which must be filled by */ + /* the caller. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The meaning of the `attach' (i.e., what really happens when the */ + /* new file is read) is not fixed by FreeType itself. It really */ + /* depends on the font format (and thus the font driver). */ + /* */ + /* Client applications are expected to know what they are doing */ + /* when invoking this function. Most drivers simply do not implement */ + /* file attachments. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Attach_Stream( FT_Face face, + FT_Open_Args* parameters ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Reference_Face */ + /* */ + /* <Description> */ + /* A counter gets initialized to~1 at the time an @FT_Face structure */ + /* is created. This function increments the counter. @FT_Done_Face */ + /* then only destroys a face if the counter is~1, otherwise it simply */ + /* decrements the counter. */ + /* */ + /* This function helps in managing life-cycles of structures which */ + /* reference @FT_Face objects. */ + /* */ + /* <Input> */ + /* face :: A handle to a target face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Since> */ + /* 2.4.2 */ + /* */ + FT_EXPORT( FT_Error ) + FT_Reference_Face( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_Face */ + /* */ + /* <Description> */ + /* Discard a given face object, as well as all of its child slots and */ + /* sizes. */ + /* */ + /* <Input> */ + /* face :: A handle to a target face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* See the discussion of reference counters in the description of */ + /* @FT_Reference_Face. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Done_Face( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Select_Size */ + /* */ + /* <Description> */ + /* Select a bitmap strike. */ + /* */ + /* <InOut> */ + /* face :: A handle to a target face object. */ + /* */ + /* <Input> */ + /* strike_index :: The index of the bitmap strike in the */ + /* `available_sizes' field of @FT_FaceRec structure. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Select_Size( FT_Face face, + FT_Int strike_index ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Size_Request_Type */ + /* */ + /* <Description> */ + /* An enumeration type that lists the supported size request types. */ + /* */ + /* <Values> */ + /* FT_SIZE_REQUEST_TYPE_NOMINAL :: */ + /* The nominal size. The `units_per_EM' field of @FT_FaceRec is */ + /* used to determine both scaling values. */ + /* */ + /* FT_SIZE_REQUEST_TYPE_REAL_DIM :: */ + /* The real dimension. The sum of the the `Ascender' and (minus */ + /* of) the `Descender' fields of @FT_FaceRec are used to determine */ + /* both scaling values. */ + /* */ + /* FT_SIZE_REQUEST_TYPE_BBOX :: */ + /* The font bounding box. The width and height of the `bbox' field */ + /* of @FT_FaceRec are used to determine the horizontal and vertical */ + /* scaling value, respectively. */ + /* */ + /* FT_SIZE_REQUEST_TYPE_CELL :: */ + /* The `max_advance_width' field of @FT_FaceRec is used to */ + /* determine the horizontal scaling value; the vertical scaling */ + /* value is determined the same way as */ + /* @FT_SIZE_REQUEST_TYPE_REAL_DIM does. Finally, both scaling */ + /* values are set to the smaller one. This type is useful if you */ + /* want to specify the font size for, say, a window of a given */ + /* dimension and 80x24 cells. */ + /* */ + /* FT_SIZE_REQUEST_TYPE_SCALES :: */ + /* Specify the scaling values directly. */ + /* */ + /* <Note> */ + /* The above descriptions only apply to scalable formats. For bitmap */ + /* formats, the behaviour is up to the driver. */ + /* */ + /* See the note section of @FT_Size_Metrics if you wonder how size */ + /* requesting relates to scaling values. */ + /* */ + typedef enum FT_Size_Request_Type_ + { + FT_SIZE_REQUEST_TYPE_NOMINAL, + FT_SIZE_REQUEST_TYPE_REAL_DIM, + FT_SIZE_REQUEST_TYPE_BBOX, + FT_SIZE_REQUEST_TYPE_CELL, + FT_SIZE_REQUEST_TYPE_SCALES, + + FT_SIZE_REQUEST_TYPE_MAX + + } FT_Size_Request_Type; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Size_RequestRec */ + /* */ + /* <Description> */ + /* A structure used to model a size request. */ + /* */ + /* <Fields> */ + /* type :: See @FT_Size_Request_Type. */ + /* */ + /* width :: The desired width. */ + /* */ + /* height :: The desired height. */ + /* */ + /* horiResolution :: The horizontal resolution. If set to zero, */ + /* `width' is treated as a 26.6 fractional pixel */ + /* value. */ + /* */ + /* vertResolution :: The vertical resolution. If set to zero, */ + /* `height' is treated as a 26.6 fractional pixel */ + /* value. */ + /* */ + /* <Note> */ + /* If `width' is zero, then the horizontal scaling value is set equal */ + /* to the vertical scaling value, and vice versa. */ + /* */ + typedef struct FT_Size_RequestRec_ + { + FT_Size_Request_Type type; + FT_Long width; + FT_Long height; + FT_UInt horiResolution; + FT_UInt vertResolution; + + } FT_Size_RequestRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Size_Request */ + /* */ + /* <Description> */ + /* A handle to a size request structure. */ + /* */ + typedef struct FT_Size_RequestRec_ *FT_Size_Request; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Request_Size */ + /* */ + /* <Description> */ + /* Resize the scale of the active @FT_Size object in a face. */ + /* */ + /* <InOut> */ + /* face :: A handle to a target face object. */ + /* */ + /* <Input> */ + /* req :: A pointer to a @FT_Size_RequestRec. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* Although drivers may select the bitmap strike matching the */ + /* request, you should not rely on this if you intend to select a */ + /* particular bitmap strike. Use @FT_Select_Size instead in that */ + /* case. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Request_Size( FT_Face face, + FT_Size_Request req ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Char_Size */ + /* */ + /* <Description> */ + /* This function calls @FT_Request_Size to request the nominal size */ + /* (in points). */ + /* */ + /* <InOut> */ + /* face :: A handle to a target face object. */ + /* */ + /* <Input> */ + /* char_width :: The nominal width, in 26.6 fractional points. */ + /* */ + /* char_height :: The nominal height, in 26.6 fractional points. */ + /* */ + /* horz_resolution :: The horizontal resolution in dpi. */ + /* */ + /* vert_resolution :: The vertical resolution in dpi. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* If either the character width or height is zero, it is set equal */ + /* to the other value. */ + /* */ + /* If either the horizontal or vertical resolution is zero, it is set */ + /* equal to the other value. */ + /* */ + /* A character width or height smaller than 1pt is set to 1pt; if */ + /* both resolution values are zero, they are set to 72dpi. */ + /* */ + /* Don't use this function if you are using the FreeType cache API. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_Char_Size( FT_Face face, + FT_F26Dot6 char_width, + FT_F26Dot6 char_height, + FT_UInt horz_resolution, + FT_UInt vert_resolution ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Pixel_Sizes */ + /* */ + /* <Description> */ + /* This function calls @FT_Request_Size to request the nominal size */ + /* (in pixels). */ + /* */ + /* <InOut> */ + /* face :: A handle to the target face object. */ + /* */ + /* <Input> */ + /* pixel_width :: The nominal width, in pixels. */ + /* */ + /* pixel_height :: The nominal height, in pixels. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_Pixel_Sizes( FT_Face face, + FT_UInt pixel_width, + FT_UInt pixel_height ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Load_Glyph */ + /* */ + /* <Description> */ + /* A function used to load a single glyph into the glyph slot of a */ + /* face object. */ + /* */ + /* <InOut> */ + /* face :: A handle to the target face object where the glyph */ + /* is loaded. */ + /* */ + /* <Input> */ + /* glyph_index :: The index of the glyph in the font file. For */ + /* CID-keyed fonts (either in PS or in CFF format) */ + /* this argument specifies the CID value. */ + /* */ + /* load_flags :: A flag indicating what to load for this glyph. The */ + /* @FT_LOAD_XXX constants can be used to control the */ + /* glyph loading process (e.g., whether the outline */ + /* should be scaled, whether to load bitmaps or not, */ + /* whether to hint the outline, etc). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The loaded glyph may be transformed. See @FT_Set_Transform for */ + /* the details. */ + /* */ + /* For subsetted CID-keyed fonts, `FT_Err_Invalid_Argument' is */ + /* returned for invalid CID values (this is, for CID values which */ + /* don't have a corresponding glyph in the font). See the discussion */ + /* of the @FT_FACE_FLAG_CID_KEYED flag for more details. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Load_Glyph( FT_Face face, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Load_Char */ + /* */ + /* <Description> */ + /* A function used to load a single glyph into the glyph slot of a */ + /* face object, according to its character code. */ + /* */ + /* <InOut> */ + /* face :: A handle to a target face object where the glyph */ + /* is loaded. */ + /* */ + /* <Input> */ + /* char_code :: The glyph's character code, according to the */ + /* current charmap used in the face. */ + /* */ + /* load_flags :: A flag indicating what to load for this glyph. The */ + /* @FT_LOAD_XXX constants can be used to control the */ + /* glyph loading process (e.g., whether the outline */ + /* should be scaled, whether to load bitmaps or not, */ + /* whether to hint the outline, etc). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* This function simply calls @FT_Get_Char_Index and @FT_Load_Glyph. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Load_Char( FT_Face face, + FT_ULong char_code, + FT_Int32 load_flags ); + + + /************************************************************************* + * + * @enum: + * FT_LOAD_XXX + * + * @description: + * A list of bit-field constants used with @FT_Load_Glyph to indicate + * what kind of operations to perform during glyph loading. + * + * @values: + * FT_LOAD_DEFAULT :: + * Corresponding to~0, this value is used as the default glyph load + * operation. In this case, the following happens: + * + * 1. FreeType looks for a bitmap for the glyph corresponding to the + * face's current size. If one is found, the function returns. + * The bitmap data can be accessed from the glyph slot (see note + * below). + * + * 2. If no embedded bitmap is searched or found, FreeType looks for a + * scalable outline. If one is found, it is loaded from the font + * file, scaled to device pixels, then `hinted' to the pixel grid + * in order to optimize it. The outline data can be accessed from + * the glyph slot (see note below). + * + * Note that by default, the glyph loader doesn't render outlines into + * bitmaps. The following flags are used to modify this default + * behaviour to more specific and useful cases. + * + * FT_LOAD_NO_SCALE :: + * Don't scale the outline glyph loaded, but keep it in font units. + * + * This flag implies @FT_LOAD_NO_HINTING and @FT_LOAD_NO_BITMAP, and + * unsets @FT_LOAD_RENDER. + * + * FT_LOAD_NO_HINTING :: + * Disable hinting. This generally generates `blurrier' bitmap glyph + * when the glyph is rendered in any of the anti-aliased modes. See + * also the note below. + * + * This flag is implied by @FT_LOAD_NO_SCALE. + * + * FT_LOAD_RENDER :: + * Call @FT_Render_Glyph after the glyph is loaded. By default, the + * glyph is rendered in @FT_RENDER_MODE_NORMAL mode. This can be + * overridden by @FT_LOAD_TARGET_XXX or @FT_LOAD_MONOCHROME. + * + * This flag is unset by @FT_LOAD_NO_SCALE. + * + * FT_LOAD_NO_BITMAP :: + * Ignore bitmap strikes when loading. Bitmap-only fonts ignore this + * flag. + * + * @FT_LOAD_NO_SCALE always sets this flag. + * + * FT_LOAD_VERTICAL_LAYOUT :: + * Load the glyph for vertical text layout. _Don't_ use it as it is + * problematic currently. + * + * FT_LOAD_FORCE_AUTOHINT :: + * Indicates that the auto-hinter is preferred over the font's native + * hinter. See also the note below. + * + * FT_LOAD_CROP_BITMAP :: + * Indicates that the font driver should crop the loaded bitmap glyph + * (i.e., remove all space around its black bits). Not all drivers + * implement this. + * + * FT_LOAD_PEDANTIC :: + * Indicates that the font driver should perform pedantic verifications + * during glyph loading. This is mostly used to detect broken glyphs + * in fonts. By default, FreeType tries to handle broken fonts also. + * + * FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH :: + * Indicates that the font driver should ignore the global advance + * width defined in the font. By default, that value is used as the + * advance width for all glyphs when the face has + * @FT_FACE_FLAG_FIXED_WIDTH set. + * + * This flag exists for historical reasons (to support buggy CJK + * fonts). + * + * FT_LOAD_NO_RECURSE :: + * This flag is only used internally. It merely indicates that the + * font driver should not load composite glyphs recursively. Instead, + * it should set the `num_subglyph' and `subglyphs' values of the + * glyph slot accordingly, and set `glyph->format' to + * @FT_GLYPH_FORMAT_COMPOSITE. + * + * The description of sub-glyphs is not available to client + * applications for now. + * + * This flag implies @FT_LOAD_NO_SCALE and @FT_LOAD_IGNORE_TRANSFORM. + * + * FT_LOAD_IGNORE_TRANSFORM :: + * Indicates that the transform matrix set by @FT_Set_Transform should + * be ignored. + * + * FT_LOAD_MONOCHROME :: + * This flag is used with @FT_LOAD_RENDER to indicate that you want to + * render an outline glyph to a 1-bit monochrome bitmap glyph, with + * 8~pixels packed into each byte of the bitmap data. + * + * Note that this has no effect on the hinting algorithm used. You + * should rather use @FT_LOAD_TARGET_MONO so that the + * monochrome-optimized hinting algorithm is used. + * + * FT_LOAD_LINEAR_DESIGN :: + * Indicates that the `linearHoriAdvance' and `linearVertAdvance' + * fields of @FT_GlyphSlotRec should be kept in font units. See + * @FT_GlyphSlotRec for details. + * + * FT_LOAD_NO_AUTOHINT :: + * Disable auto-hinter. See also the note below. + * + * @note: + * By default, hinting is enabled and the font's native hinter (see + * @FT_FACE_FLAG_HINTER) is preferred over the auto-hinter. You can + * disable hinting by setting @FT_LOAD_NO_HINTING or change the + * precedence by setting @FT_LOAD_FORCE_AUTOHINT. You can also set + * @FT_LOAD_NO_AUTOHINT in case you don't want the auto-hinter to be + * used at all. + * + * See the description of @FT_FACE_FLAG_TRICKY for a special exception + * (affecting only a handful of Asian fonts). + * + * Besides deciding which hinter to use, you can also decide which + * hinting algorithm to use. See @FT_LOAD_TARGET_XXX for details. + * + */ +#define FT_LOAD_DEFAULT 0x0 +#define FT_LOAD_NO_SCALE 0x1 +#define FT_LOAD_NO_HINTING 0x2 +#define FT_LOAD_RENDER 0x4 +#define FT_LOAD_NO_BITMAP 0x8 +#define FT_LOAD_VERTICAL_LAYOUT 0x10 +#define FT_LOAD_FORCE_AUTOHINT 0x20 +#define FT_LOAD_CROP_BITMAP 0x40 +#define FT_LOAD_PEDANTIC 0x80 +#define FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH 0x200 +#define FT_LOAD_NO_RECURSE 0x400 +#define FT_LOAD_IGNORE_TRANSFORM 0x800 +#define FT_LOAD_MONOCHROME 0x1000 +#define FT_LOAD_LINEAR_DESIGN 0x2000 +#define FT_LOAD_NO_AUTOHINT 0x8000U + + /* */ + + /* used internally only by certain font drivers! */ +#define FT_LOAD_ADVANCE_ONLY 0x100 +#define FT_LOAD_SBITS_ONLY 0x4000 + + + /************************************************************************** + * + * @enum: + * FT_LOAD_TARGET_XXX + * + * @description: + * A list of values that are used to select a specific hinting algorithm + * to use by the hinter. You should OR one of these values to your + * `load_flags' when calling @FT_Load_Glyph. + * + * Note that font's native hinters may ignore the hinting algorithm you + * have specified (e.g., the TrueType bytecode interpreter). You can set + * @FT_LOAD_FORCE_AUTOHINT to ensure that the auto-hinter is used. + * + * Also note that @FT_LOAD_TARGET_LIGHT is an exception, in that it + * always implies @FT_LOAD_FORCE_AUTOHINT. + * + * @values: + * FT_LOAD_TARGET_NORMAL :: + * This corresponds to the default hinting algorithm, optimized for + * standard gray-level rendering. For monochrome output, use + * @FT_LOAD_TARGET_MONO instead. + * + * FT_LOAD_TARGET_LIGHT :: + * A lighter hinting algorithm for non-monochrome modes. Many + * generated glyphs are more fuzzy but better resemble its original + * shape. A bit like rendering on Mac OS~X. + * + * As a special exception, this target implies @FT_LOAD_FORCE_AUTOHINT. + * + * FT_LOAD_TARGET_MONO :: + * Strong hinting algorithm that should only be used for monochrome + * output. The result is probably unpleasant if the glyph is rendered + * in non-monochrome modes. + * + * FT_LOAD_TARGET_LCD :: + * A variant of @FT_LOAD_TARGET_NORMAL optimized for horizontally + * decimated LCD displays. + * + * FT_LOAD_TARGET_LCD_V :: + * A variant of @FT_LOAD_TARGET_NORMAL optimized for vertically + * decimated LCD displays. + * + * @note: + * You should use only _one_ of the FT_LOAD_TARGET_XXX values in your + * `load_flags'. They can't be ORed. + * + * If @FT_LOAD_RENDER is also set, the glyph is rendered in the + * corresponding mode (i.e., the mode which matches the used algorithm + * best) unless @FT_LOAD_MONOCHROME is set. + * + * You can use a hinting algorithm that doesn't correspond to the same + * rendering mode. As an example, it is possible to use the `light' + * hinting algorithm and have the results rendered in horizontal LCD + * pixel mode, with code like + * + * { + * FT_Load_Glyph( face, glyph_index, + * load_flags | FT_LOAD_TARGET_LIGHT ); + * + * FT_Render_Glyph( face->glyph, FT_RENDER_MODE_LCD ); + * } + * + */ +#define FT_LOAD_TARGET_( x ) ( (FT_Int32)( (x) & 15 ) << 16 ) + +#define FT_LOAD_TARGET_NORMAL FT_LOAD_TARGET_( FT_RENDER_MODE_NORMAL ) +#define FT_LOAD_TARGET_LIGHT FT_LOAD_TARGET_( FT_RENDER_MODE_LIGHT ) +#define FT_LOAD_TARGET_MONO FT_LOAD_TARGET_( FT_RENDER_MODE_MONO ) +#define FT_LOAD_TARGET_LCD FT_LOAD_TARGET_( FT_RENDER_MODE_LCD ) +#define FT_LOAD_TARGET_LCD_V FT_LOAD_TARGET_( FT_RENDER_MODE_LCD_V ) + + + /************************************************************************** + * + * @macro: + * FT_LOAD_TARGET_MODE + * + * @description: + * Return the @FT_Render_Mode corresponding to a given + * @FT_LOAD_TARGET_XXX value. + * + */ +#define FT_LOAD_TARGET_MODE( x ) ( (FT_Render_Mode)( ( (x) >> 16 ) & 15 ) ) + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Transform */ + /* */ + /* <Description> */ + /* A function used to set the transformation that is applied to glyph */ + /* images when they are loaded into a glyph slot through */ + /* @FT_Load_Glyph. */ + /* */ + /* <InOut> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Input> */ + /* matrix :: A pointer to the transformation's 2x2 matrix. Use~0 for */ + /* the identity matrix. */ + /* delta :: A pointer to the translation vector. Use~0 for the null */ + /* vector. */ + /* */ + /* <Note> */ + /* The transformation is only applied to scalable image formats after */ + /* the glyph has been loaded. It means that hinting is unaltered by */ + /* the transformation and is performed on the character size given in */ + /* the last call to @FT_Set_Char_Size or @FT_Set_Pixel_Sizes. */ + /* */ + /* Note that this also transforms the `face.glyph.advance' field, but */ + /* *not* the values in `face.glyph.metrics'. */ + /* */ + FT_EXPORT( void ) + FT_Set_Transform( FT_Face face, + FT_Matrix* matrix, + FT_Vector* delta ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Render_Mode */ + /* */ + /* <Description> */ + /* An enumeration type that lists the render modes supported by */ + /* FreeType~2. Each mode corresponds to a specific type of scanline */ + /* conversion performed on the outline. */ + /* */ + /* For bitmap fonts and embedded bitmaps the `bitmap->pixel_mode' */ + /* field in the @FT_GlyphSlotRec structure gives the format of the */ + /* returned bitmap. */ + /* */ + /* All modes except @FT_RENDER_MODE_MONO use 256 levels of opacity. */ + /* */ + /* <Values> */ + /* FT_RENDER_MODE_NORMAL :: */ + /* This is the default render mode; it corresponds to 8-bit */ + /* anti-aliased bitmaps. */ + /* */ + /* FT_RENDER_MODE_LIGHT :: */ + /* This is equivalent to @FT_RENDER_MODE_NORMAL. It is only */ + /* defined as a separate value because render modes are also used */ + /* indirectly to define hinting algorithm selectors. See */ + /* @FT_LOAD_TARGET_XXX for details. */ + /* */ + /* FT_RENDER_MODE_MONO :: */ + /* This mode corresponds to 1-bit bitmaps (with 2~levels of */ + /* opacity). */ + /* */ + /* FT_RENDER_MODE_LCD :: */ + /* This mode corresponds to horizontal RGB and BGR sub-pixel */ + /* displays like LCD screens. It produces 8-bit bitmaps that are */ + /* 3~times the width of the original glyph outline in pixels, and */ + /* which use the @FT_PIXEL_MODE_LCD mode. */ + /* */ + /* FT_RENDER_MODE_LCD_V :: */ + /* This mode corresponds to vertical RGB and BGR sub-pixel displays */ + /* (like PDA screens, rotated LCD displays, etc.). It produces */ + /* 8-bit bitmaps that are 3~times the height of the original */ + /* glyph outline in pixels and use the @FT_PIXEL_MODE_LCD_V mode. */ + /* */ + /* <Note> */ + /* The LCD-optimized glyph bitmaps produced by FT_Render_Glyph can be */ + /* filtered to reduce color-fringes by using @FT_Library_SetLcdFilter */ + /* (not active in the default builds). It is up to the caller to */ + /* either call @FT_Library_SetLcdFilter (if available) or do the */ + /* filtering itself. */ + /* */ + /* The selected render mode only affects vector glyphs of a font. */ + /* Embedded bitmaps often have a different pixel mode like */ + /* @FT_PIXEL_MODE_MONO. You can use @FT_Bitmap_Convert to transform */ + /* them into 8-bit pixmaps. */ + /* */ + typedef enum FT_Render_Mode_ + { + FT_RENDER_MODE_NORMAL = 0, + FT_RENDER_MODE_LIGHT, + FT_RENDER_MODE_MONO, + FT_RENDER_MODE_LCD, + FT_RENDER_MODE_LCD_V, + + FT_RENDER_MODE_MAX + + } FT_Render_Mode; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* ft_render_mode_xxx */ + /* */ + /* <Description> */ + /* These constants are deprecated. Use the corresponding */ + /* @FT_Render_Mode values instead. */ + /* */ + /* <Values> */ + /* ft_render_mode_normal :: see @FT_RENDER_MODE_NORMAL */ + /* ft_render_mode_mono :: see @FT_RENDER_MODE_MONO */ + /* */ +#define ft_render_mode_normal FT_RENDER_MODE_NORMAL +#define ft_render_mode_mono FT_RENDER_MODE_MONO + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Render_Glyph */ + /* */ + /* <Description> */ + /* Convert a given glyph image to a bitmap. It does so by inspecting */ + /* the glyph image format, finding the relevant renderer, and */ + /* invoking it. */ + /* */ + /* <InOut> */ + /* slot :: A handle to the glyph slot containing the image to */ + /* convert. */ + /* */ + /* <Input> */ + /* render_mode :: This is the render mode used to render the glyph */ + /* image into a bitmap. See @FT_Render_Mode for a */ + /* list of possible values. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Render_Glyph( FT_GlyphSlot slot, + FT_Render_Mode render_mode ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Kerning_Mode */ + /* */ + /* <Description> */ + /* An enumeration used to specify which kerning values to return in */ + /* @FT_Get_Kerning. */ + /* */ + /* <Values> */ + /* FT_KERNING_DEFAULT :: Return scaled and grid-fitted kerning */ + /* distances (value is~0). */ + /* */ + /* FT_KERNING_UNFITTED :: Return scaled but un-grid-fitted kerning */ + /* distances. */ + /* */ + /* FT_KERNING_UNSCALED :: Return the kerning vector in original font */ + /* units. */ + /* */ + typedef enum FT_Kerning_Mode_ + { + FT_KERNING_DEFAULT = 0, + FT_KERNING_UNFITTED, + FT_KERNING_UNSCALED + + } FT_Kerning_Mode; + + + /*************************************************************************/ + /* */ + /* <Const> */ + /* ft_kerning_default */ + /* */ + /* <Description> */ + /* This constant is deprecated. Please use @FT_KERNING_DEFAULT */ + /* instead. */ + /* */ +#define ft_kerning_default FT_KERNING_DEFAULT + + + /*************************************************************************/ + /* */ + /* <Const> */ + /* ft_kerning_unfitted */ + /* */ + /* <Description> */ + /* This constant is deprecated. Please use @FT_KERNING_UNFITTED */ + /* instead. */ + /* */ +#define ft_kerning_unfitted FT_KERNING_UNFITTED + + + /*************************************************************************/ + /* */ + /* <Const> */ + /* ft_kerning_unscaled */ + /* */ + /* <Description> */ + /* This constant is deprecated. Please use @FT_KERNING_UNSCALED */ + /* instead. */ + /* */ +#define ft_kerning_unscaled FT_KERNING_UNSCALED + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Kerning */ + /* */ + /* <Description> */ + /* Return the kerning vector between two glyphs of a same face. */ + /* */ + /* <Input> */ + /* face :: A handle to a source face object. */ + /* */ + /* left_glyph :: The index of the left glyph in the kern pair. */ + /* */ + /* right_glyph :: The index of the right glyph in the kern pair. */ + /* */ + /* kern_mode :: See @FT_Kerning_Mode for more information. */ + /* Determines the scale and dimension of the returned */ + /* kerning vector. */ + /* */ + /* <Output> */ + /* akerning :: The kerning vector. This is either in font units */ + /* or in pixels (26.6 format) for scalable formats, */ + /* and in pixels for fixed-sizes formats. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* Only horizontal layouts (left-to-right & right-to-left) are */ + /* supported by this method. Other layouts, or more sophisticated */ + /* kernings, are out of the scope of this API function -- they can be */ + /* implemented through format-specific interfaces. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Kerning( FT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_UInt kern_mode, + FT_Vector *akerning ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Track_Kerning */ + /* */ + /* <Description> */ + /* Return the track kerning for a given face object at a given size. */ + /* */ + /* <Input> */ + /* face :: A handle to a source face object. */ + /* */ + /* point_size :: The point size in 16.16 fractional points. */ + /* */ + /* degree :: The degree of tightness. */ + /* */ + /* <Output> */ + /* akerning :: The kerning in 16.16 fractional points. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Track_Kerning( FT_Face face, + FT_Fixed point_size, + FT_Int degree, + FT_Fixed* akerning ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Glyph_Name */ + /* */ + /* <Description> */ + /* Retrieve the ASCII name of a given glyph in a face. This only */ + /* works for those faces where @FT_HAS_GLYPH_NAMES(face) returns~1. */ + /* */ + /* <Input> */ + /* face :: A handle to a source face object. */ + /* */ + /* glyph_index :: The glyph index. */ + /* */ + /* buffer_max :: The maximal number of bytes available in the */ + /* buffer. */ + /* */ + /* <Output> */ + /* buffer :: A pointer to a target buffer where the name is */ + /* copied to. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* An error is returned if the face doesn't provide glyph names or if */ + /* the glyph index is invalid. In all cases of failure, the first */ + /* byte of `buffer' is set to~0 to indicate an empty name. */ + /* */ + /* The glyph name is truncated to fit within the buffer if it is too */ + /* long. The returned string is always zero-terminated. */ + /* */ + /* This function is not compiled within the library if the config */ + /* macro `FT_CONFIG_OPTION_NO_GLYPH_NAMES' is defined in */ + /* `include/freetype/config/ftoptions.h'. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Glyph_Name( FT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Postscript_Name */ + /* */ + /* <Description> */ + /* Retrieve the ASCII PostScript name of a given face, if available. */ + /* This only works with PostScript and TrueType fonts. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Return> */ + /* A pointer to the face's PostScript name. NULL if unavailable. */ + /* */ + /* <Note> */ + /* The returned pointer is owned by the face and is destroyed with */ + /* it. */ + /* */ + FT_EXPORT( const char* ) + FT_Get_Postscript_Name( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Select_Charmap */ + /* */ + /* <Description> */ + /* Select a given charmap by its encoding tag (as listed in */ + /* `freetype.h'). */ + /* */ + /* <InOut> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Input> */ + /* encoding :: A handle to the selected encoding. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* This function returns an error if no charmap in the face */ + /* corresponds to the encoding queried here. */ + /* */ + /* Because many fonts contain more than a single cmap for Unicode */ + /* encoding, this function has some special code to select the one */ + /* which covers Unicode best (`best' in the sense that a UCS-4 cmap */ + /* is preferred to a UCS-2 cmap). It is thus preferable to */ + /* @FT_Set_Charmap in this case. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Select_Charmap( FT_Face face, + FT_Encoding encoding ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Charmap */ + /* */ + /* <Description> */ + /* Select a given charmap for character code to glyph index mapping. */ + /* */ + /* <InOut> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Input> */ + /* charmap :: A handle to the selected charmap. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* This function returns an error if the charmap is not part of */ + /* the face (i.e., if it is not listed in the `face->charmaps' */ + /* table). */ + /* */ + /* It also fails if a type~14 charmap is selected. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_Charmap( FT_Face face, + FT_CharMap charmap ); + + + /************************************************************************* + * + * @function: + * FT_Get_Charmap_Index + * + * @description: + * Retrieve index of a given charmap. + * + * @input: + * charmap :: + * A handle to a charmap. + * + * @return: + * The index into the array of character maps within the face to which + * `charmap' belongs. If an error occurs, -1 is returned. + * + */ + FT_EXPORT( FT_Int ) + FT_Get_Charmap_Index( FT_CharMap charmap ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Char_Index */ + /* */ + /* <Description> */ + /* Return the glyph index of a given character code. This function */ + /* uses a charmap object to do the mapping. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* charcode :: The character code. */ + /* */ + /* <Return> */ + /* The glyph index. 0~means `undefined character code'. */ + /* */ + /* <Note> */ + /* If you use FreeType to manipulate the contents of font files */ + /* directly, be aware that the glyph index returned by this function */ + /* doesn't always correspond to the internal indices used within */ + /* the file. This is done to ensure that value~0 always corresponds */ + /* to the `missing glyph'. */ + /* */ + FT_EXPORT( FT_UInt ) + FT_Get_Char_Index( FT_Face face, + FT_ULong charcode ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_First_Char */ + /* */ + /* <Description> */ + /* This function is used to return the first character code in the */ + /* current charmap of a given face. It also returns the */ + /* corresponding glyph index. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Output> */ + /* agindex :: Glyph index of first character code. 0~if charmap is */ + /* empty. */ + /* */ + /* <Return> */ + /* The charmap's first character code. */ + /* */ + /* <Note> */ + /* You should use this function with @FT_Get_Next_Char to be able to */ + /* parse all character codes available in a given charmap. The code */ + /* should look like this: */ + /* */ + /* { */ + /* FT_ULong charcode; */ + /* FT_UInt gindex; */ + /* */ + /* */ + /* charcode = FT_Get_First_Char( face, &gindex ); */ + /* while ( gindex != 0 ) */ + /* { */ + /* ... do something with (charcode,gindex) pair ... */ + /* */ + /* charcode = FT_Get_Next_Char( face, charcode, &gindex ); */ + /* } */ + /* } */ + /* */ + /* Note that `*agindex' is set to~0 if the charmap is empty. The */ + /* result itself can be~0 in two cases: if the charmap is empty or */ + /* if the value~0 is the first valid character code. */ + /* */ + FT_EXPORT( FT_ULong ) + FT_Get_First_Char( FT_Face face, + FT_UInt *agindex ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Next_Char */ + /* */ + /* <Description> */ + /* This function is used to return the next character code in the */ + /* current charmap of a given face following the value `char_code', */ + /* as well as the corresponding glyph index. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* char_code :: The starting character code. */ + /* */ + /* <Output> */ + /* agindex :: Glyph index of next character code. 0~if charmap */ + /* is empty. */ + /* */ + /* <Return> */ + /* The charmap's next character code. */ + /* */ + /* <Note> */ + /* You should use this function with @FT_Get_First_Char to walk */ + /* over all character codes available in a given charmap. See the */ + /* note for this function for a simple code example. */ + /* */ + /* Note that `*agindex' is set to~0 when there are no more codes in */ + /* the charmap. */ + /* */ + FT_EXPORT( FT_ULong ) + FT_Get_Next_Char( FT_Face face, + FT_ULong char_code, + FT_UInt *agindex ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Name_Index */ + /* */ + /* <Description> */ + /* Return the glyph index of a given glyph name. This function uses */ + /* driver specific objects to do the translation. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* glyph_name :: The glyph name. */ + /* */ + /* <Return> */ + /* The glyph index. 0~means `undefined character code'. */ + /* */ + FT_EXPORT( FT_UInt ) + FT_Get_Name_Index( FT_Face face, + FT_String* glyph_name ); + + + /************************************************************************* + * + * @macro: + * FT_SUBGLYPH_FLAG_XXX + * + * @description: + * A list of constants used to describe subglyphs. Please refer to the + * TrueType specification for the meaning of the various flags. + * + * @values: + * FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS :: + * FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES :: + * FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID :: + * FT_SUBGLYPH_FLAG_SCALE :: + * FT_SUBGLYPH_FLAG_XY_SCALE :: + * FT_SUBGLYPH_FLAG_2X2 :: + * FT_SUBGLYPH_FLAG_USE_MY_METRICS :: + * + */ +#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS 1 +#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES 2 +#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID 4 +#define FT_SUBGLYPH_FLAG_SCALE 8 +#define FT_SUBGLYPH_FLAG_XY_SCALE 0x40 +#define FT_SUBGLYPH_FLAG_2X2 0x80 +#define FT_SUBGLYPH_FLAG_USE_MY_METRICS 0x200 + + + /************************************************************************* + * + * @func: + * FT_Get_SubGlyph_Info + * + * @description: + * Retrieve a description of a given subglyph. Only use it if + * `glyph->format' is @FT_GLYPH_FORMAT_COMPOSITE; an error is + * returned otherwise. + * + * @input: + * glyph :: + * The source glyph slot. + * + * sub_index :: + * The index of the subglyph. Must be less than + * `glyph->num_subglyphs'. + * + * @output: + * p_index :: + * The glyph index of the subglyph. + * + * p_flags :: + * The subglyph flags, see @FT_SUBGLYPH_FLAG_XXX. + * + * p_arg1 :: + * The subglyph's first argument (if any). + * + * p_arg2 :: + * The subglyph's second argument (if any). + * + * p_transform :: + * The subglyph transformation (if any). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The values of `*p_arg1', `*p_arg2', and `*p_transform' must be + * interpreted depending on the flags returned in `*p_flags'. See the + * TrueType specification for details. + * + */ + FT_EXPORT( FT_Error ) + FT_Get_SubGlyph_Info( FT_GlyphSlot glyph, + FT_UInt sub_index, + FT_Int *p_index, + FT_UInt *p_flags, + FT_Int *p_arg1, + FT_Int *p_arg2, + FT_Matrix *p_transform ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_FSTYPE_XXX */ + /* */ + /* <Description> */ + /* A list of bit flags used in the `fsType' field of the OS/2 table */ + /* in a TrueType or OpenType font and the `FSType' entry in a */ + /* PostScript font. These bit flags are returned by */ + /* @FT_Get_FSType_Flags; they inform client applications of embedding */ + /* and subsetting restrictions associated with a font. */ + /* */ + /* See http://www.adobe.com/devnet/acrobat/pdfs/FontPolicies.pdf for */ + /* more details. */ + /* */ + /* <Values> */ + /* FT_FSTYPE_INSTALLABLE_EMBEDDING :: */ + /* Fonts with no fsType bit set may be embedded and permanently */ + /* installed on the remote system by an application. */ + /* */ + /* FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING :: */ + /* Fonts that have only this bit set must not be modified, embedded */ + /* or exchanged in any manner without first obtaining permission of */ + /* the font software copyright owner. */ + /* */ + /* FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING :: */ + /* If this bit is set, the font may be embedded and temporarily */ + /* loaded on the remote system. Documents containing Preview & */ + /* Print fonts must be opened `read-only'; no edits can be applied */ + /* to the document. */ + /* */ + /* FT_FSTYPE_EDITABLE_EMBEDDING :: */ + /* If this bit is set, the font may be embedded but must only be */ + /* installed temporarily on other systems. In contrast to Preview */ + /* & Print fonts, documents containing editable fonts may be opened */ + /* for reading, editing is permitted, and changes may be saved. */ + /* */ + /* FT_FSTYPE_NO_SUBSETTING :: */ + /* If this bit is set, the font may not be subsetted prior to */ + /* embedding. */ + /* */ + /* FT_FSTYPE_BITMAP_EMBEDDING_ONLY :: */ + /* If this bit is set, only bitmaps contained in the font may be */ + /* embedded; no outline data may be embedded. If there are no */ + /* bitmaps available in the font, then the font is unembeddable. */ + /* */ + /* <Note> */ + /* While the fsType flags can indicate that a font may be embedded, a */ + /* license with the font vendor may be separately required to use the */ + /* font in this way. */ + /* */ +#define FT_FSTYPE_INSTALLABLE_EMBEDDING 0x0000 +#define FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING 0x0002 +#define FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING 0x0004 +#define FT_FSTYPE_EDITABLE_EMBEDDING 0x0008 +#define FT_FSTYPE_NO_SUBSETTING 0x0100 +#define FT_FSTYPE_BITMAP_EMBEDDING_ONLY 0x0200 + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_FSType_Flags */ + /* */ + /* <Description> */ + /* Return the fsType flags for a font. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Return> */ + /* The fsType flags, @FT_FSTYPE_XXX. */ + /* */ + /* <Note> */ + /* Use this function rather than directly reading the `fs_type' field */ + /* in the @PS_FontInfoRec structure which is only guaranteed to */ + /* return the correct results for Type~1 fonts. */ + /* */ + FT_EXPORT( FT_UShort ) + FT_Get_FSType_Flags( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* glyph_variants */ + /* */ + /* <Title> */ + /* Glyph Variants */ + /* */ + /* <Abstract> */ + /* The FreeType~2 interface to Unicode Ideographic Variation */ + /* Sequences (IVS), using the SFNT cmap format~14. */ + /* */ + /* <Description> */ + /* Many CJK characters have variant forms. They are a sort of grey */ + /* area somewhere between being totally irrelevant and semantically */ + /* distinct; for this reason, the Unicode consortium decided to */ + /* introduce Ideographic Variation Sequences (IVS), consisting of a */ + /* Unicode base character and one of 240 variant selectors */ + /* (U+E0100-U+E01EF), instead of further extending the already huge */ + /* code range for CJK characters. */ + /* */ + /* An IVS is registered and unique; for further details please refer */ + /* to Unicode Technical Report #37, the Ideographic Variation */ + /* Database. To date (October 2007), the character with the most */ + /* variants is U+908A, having 8~such IVS. */ + /* */ + /* Adobe and MS decided to support IVS with a new cmap subtable */ + /* (format~14). It is an odd subtable because it is not a mapping of */ + /* input code points to glyphs, but contains lists of all variants */ + /* supported by the font. */ + /* */ + /* A variant may be either `default' or `non-default'. A default */ + /* variant is the one you will get for that code point if you look it */ + /* up in the standard Unicode cmap. A non-default variant is a */ + /* different glyph. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Face_GetCharVariantIndex */ + /* */ + /* <Description> */ + /* Return the glyph index of a given character code as modified by */ + /* the variation selector. */ + /* */ + /* <Input> */ + /* face :: */ + /* A handle to the source face object. */ + /* */ + /* charcode :: */ + /* The character code point in Unicode. */ + /* */ + /* variantSelector :: */ + /* The Unicode code point of the variation selector. */ + /* */ + /* <Return> */ + /* The glyph index. 0~means either `undefined character code', or */ + /* `undefined selector code', or `no variation selector cmap */ + /* subtable', or `current CharMap is not Unicode'. */ + /* */ + /* <Note> */ + /* If you use FreeType to manipulate the contents of font files */ + /* directly, be aware that the glyph index returned by this function */ + /* doesn't always correspond to the internal indices used within */ + /* the file. This is done to ensure that value~0 always corresponds */ + /* to the `missing glyph'. */ + /* */ + /* This function is only meaningful if */ + /* a) the font has a variation selector cmap sub table, */ + /* and */ + /* b) the current charmap has a Unicode encoding. */ + /* */ + /* <Since> */ + /* 2.3.6 */ + /* */ + FT_EXPORT( FT_UInt ) + FT_Face_GetCharVariantIndex( FT_Face face, + FT_ULong charcode, + FT_ULong variantSelector ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Face_GetCharVariantIsDefault */ + /* */ + /* <Description> */ + /* Check whether this variant of this Unicode character is the one to */ + /* be found in the `cmap'. */ + /* */ + /* <Input> */ + /* face :: */ + /* A handle to the source face object. */ + /* */ + /* charcode :: */ + /* The character codepoint in Unicode. */ + /* */ + /* variantSelector :: */ + /* The Unicode codepoint of the variation selector. */ + /* */ + /* <Return> */ + /* 1~if found in the standard (Unicode) cmap, 0~if found in the */ + /* variation selector cmap, or -1 if it is not a variant. */ + /* */ + /* <Note> */ + /* This function is only meaningful if the font has a variation */ + /* selector cmap subtable. */ + /* */ + /* <Since> */ + /* 2.3.6 */ + /* */ + FT_EXPORT( FT_Int ) + FT_Face_GetCharVariantIsDefault( FT_Face face, + FT_ULong charcode, + FT_ULong variantSelector ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Face_GetVariantSelectors */ + /* */ + /* <Description> */ + /* Return a zero-terminated list of Unicode variant selectors found */ + /* in the font. */ + /* */ + /* <Input> */ + /* face :: */ + /* A handle to the source face object. */ + /* */ + /* <Return> */ + /* A pointer to an array of selector code points, or NULL if there is */ + /* no valid variant selector cmap subtable. */ + /* */ + /* <Note> */ + /* The last item in the array is~0; the array is owned by the */ + /* @FT_Face object but can be overwritten or released on the next */ + /* call to a FreeType function. */ + /* */ + /* <Since> */ + /* 2.3.6 */ + /* */ + FT_EXPORT( FT_UInt32* ) + FT_Face_GetVariantSelectors( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Face_GetVariantsOfChar */ + /* */ + /* <Description> */ + /* Return a zero-terminated list of Unicode variant selectors found */ + /* for the specified character code. */ + /* */ + /* <Input> */ + /* face :: */ + /* A handle to the source face object. */ + /* */ + /* charcode :: */ + /* The character codepoint in Unicode. */ + /* */ + /* <Return> */ + /* A pointer to an array of variant selector code points which are */ + /* active for the given character, or NULL if the corresponding list */ + /* is empty. */ + /* */ + /* <Note> */ + /* The last item in the array is~0; the array is owned by the */ + /* @FT_Face object but can be overwritten or released on the next */ + /* call to a FreeType function. */ + /* */ + /* <Since> */ + /* 2.3.6 */ + /* */ + FT_EXPORT( FT_UInt32* ) + FT_Face_GetVariantsOfChar( FT_Face face, + FT_ULong charcode ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Face_GetCharsOfVariant */ + /* */ + /* <Description> */ + /* Return a zero-terminated list of Unicode character codes found for */ + /* the specified variant selector. */ + /* */ + /* <Input> */ + /* face :: */ + /* A handle to the source face object. */ + /* */ + /* variantSelector :: */ + /* The variant selector code point in Unicode. */ + /* */ + /* <Return> */ + /* A list of all the code points which are specified by this selector */ + /* (both default and non-default codes are returned) or NULL if there */ + /* is no valid cmap or the variant selector is invalid. */ + /* */ + /* <Note> */ + /* The last item in the array is~0; the array is owned by the */ + /* @FT_Face object but can be overwritten or released on the next */ + /* call to a FreeType function. */ + /* */ + /* <Since> */ + /* 2.3.6 */ + /* */ + FT_EXPORT( FT_UInt32* ) + FT_Face_GetCharsOfVariant( FT_Face face, + FT_ULong variantSelector ); + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* computations */ + /* */ + /* <Title> */ + /* Computations */ + /* */ + /* <Abstract> */ + /* Crunching fixed numbers and vectors. */ + /* */ + /* <Description> */ + /* This section contains various functions used to perform */ + /* computations on 16.16 fixed-float numbers or 2d vectors. */ + /* */ + /* <Order> */ + /* FT_MulDiv */ + /* FT_MulFix */ + /* FT_DivFix */ + /* FT_RoundFix */ + /* FT_CeilFix */ + /* FT_FloorFix */ + /* FT_Vector_Transform */ + /* FT_Matrix_Multiply */ + /* FT_Matrix_Invert */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_MulDiv */ + /* */ + /* <Description> */ + /* A very simple function used to perform the computation `(a*b)/c' */ + /* with maximal accuracy (it uses a 64-bit intermediate integer */ + /* whenever necessary). */ + /* */ + /* This function isn't necessarily as fast as some processor specific */ + /* operations, but is at least completely portable. */ + /* */ + /* <Input> */ + /* a :: The first multiplier. */ + /* b :: The second multiplier. */ + /* c :: The divisor. */ + /* */ + /* <Return> */ + /* The result of `(a*b)/c'. This function never traps when trying to */ + /* divide by zero; it simply returns `MaxInt' or `MinInt' depending */ + /* on the signs of `a' and `b'. */ + /* */ + FT_EXPORT( FT_Long ) + FT_MulDiv( FT_Long a, + FT_Long b, + FT_Long c ); + + + /* */ + + /* The following #if 0 ... #endif is for the documentation formatter, */ + /* hiding the internal `FT_MULFIX_INLINED' macro. */ + +#if 0 + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_MulFix */ + /* */ + /* <Description> */ + /* A very simple function used to perform the computation */ + /* `(a*b)/0x10000' with maximal accuracy. Most of the time this is */ + /* used to multiply a given value by a 16.16 fixed float factor. */ + /* */ + /* <Input> */ + /* a :: The first multiplier. */ + /* b :: The second multiplier. Use a 16.16 factor here whenever */ + /* possible (see note below). */ + /* */ + /* <Return> */ + /* The result of `(a*b)/0x10000'. */ + /* */ + /* <Note> */ + /* This function has been optimized for the case where the absolute */ + /* value of `a' is less than 2048, and `b' is a 16.16 scaling factor. */ + /* As this happens mainly when scaling from notional units to */ + /* fractional pixels in FreeType, it resulted in noticeable speed */ + /* improvements between versions 2.x and 1.x. */ + /* */ + /* As a conclusion, always try to place a 16.16 factor as the */ + /* _second_ argument of this function; this can make a great */ + /* difference. */ + /* */ + FT_EXPORT( FT_Long ) + FT_MulFix( FT_Long a, + FT_Long b ); + + /* */ +#endif + +#ifdef FT_MULFIX_INLINED +#define FT_MulFix( a, b ) FT_MULFIX_INLINED( a, b ) +#else + FT_EXPORT( FT_Long ) + FT_MulFix( FT_Long a, + FT_Long b ); +#endif + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_DivFix */ + /* */ + /* <Description> */ + /* A very simple function used to perform the computation */ + /* `(a*0x10000)/b' with maximal accuracy. Most of the time, this is */ + /* used to divide a given value by a 16.16 fixed float factor. */ + /* */ + /* <Input> */ + /* a :: The first multiplier. */ + /* b :: The second multiplier. Use a 16.16 factor here whenever */ + /* possible (see note below). */ + /* */ + /* <Return> */ + /* The result of `(a*0x10000)/b'. */ + /* */ + /* <Note> */ + /* The optimization for FT_DivFix() is simple: If (a~<<~16) fits in */ + /* 32~bits, then the division is computed directly. Otherwise, we */ + /* use a specialized version of @FT_MulDiv. */ + /* */ + FT_EXPORT( FT_Long ) + FT_DivFix( FT_Long a, + FT_Long b ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_RoundFix */ + /* */ + /* <Description> */ + /* A very simple function used to round a 16.16 fixed number. */ + /* */ + /* <Input> */ + /* a :: The number to be rounded. */ + /* */ + /* <Return> */ + /* The result of `(a + 0x8000) & -0x10000'. */ + /* */ + FT_EXPORT( FT_Fixed ) + FT_RoundFix( FT_Fixed a ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_CeilFix */ + /* */ + /* <Description> */ + /* A very simple function used to compute the ceiling function of a */ + /* 16.16 fixed number. */ + /* */ + /* <Input> */ + /* a :: The number for which the ceiling function is to be computed. */ + /* */ + /* <Return> */ + /* The result of `(a + 0x10000 - 1) & -0x10000'. */ + /* */ + FT_EXPORT( FT_Fixed ) + FT_CeilFix( FT_Fixed a ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_FloorFix */ + /* */ + /* <Description> */ + /* A very simple function used to compute the floor function of a */ + /* 16.16 fixed number. */ + /* */ + /* <Input> */ + /* a :: The number for which the floor function is to be computed. */ + /* */ + /* <Return> */ + /* The result of `a & -0x10000'. */ + /* */ + FT_EXPORT( FT_Fixed ) + FT_FloorFix( FT_Fixed a ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Vector_Transform */ + /* */ + /* <Description> */ + /* Transform a single vector through a 2x2 matrix. */ + /* */ + /* <InOut> */ + /* vector :: The target vector to transform. */ + /* */ + /* <Input> */ + /* matrix :: A pointer to the source 2x2 matrix. */ + /* */ + /* <Note> */ + /* The result is undefined if either `vector' or `matrix' is invalid. */ + /* */ + FT_EXPORT( void ) + FT_Vector_Transform( FT_Vector* vec, + const FT_Matrix* matrix ); + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* version */ + /* */ + /* <Title> */ + /* FreeType Version */ + /* */ + /* <Abstract> */ + /* Functions and macros related to FreeType versions. */ + /* */ + /* <Description> */ + /* Note that those functions and macros are of limited use because */ + /* even a new release of FreeType with only documentation changes */ + /* increases the version number. */ + /* */ + /*************************************************************************/ + + + /************************************************************************* + * + * @enum: + * FREETYPE_XXX + * + * @description: + * These three macros identify the FreeType source code version. + * Use @FT_Library_Version to access them at runtime. + * + * @values: + * FREETYPE_MAJOR :: The major version number. + * FREETYPE_MINOR :: The minor version number. + * FREETYPE_PATCH :: The patch level. + * + * @note: + * The version number of FreeType if built as a dynamic link library + * with the `libtool' package is _not_ controlled by these three + * macros. + * + */ +#define FREETYPE_MAJOR 2 +#define FREETYPE_MINOR 4 +#define FREETYPE_PATCH 2 + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Library_Version */ + /* */ + /* <Description> */ + /* Return the version of the FreeType library being used. This is */ + /* useful when dynamically linking to the library, since one cannot */ + /* use the macros @FREETYPE_MAJOR, @FREETYPE_MINOR, and */ + /* @FREETYPE_PATCH. */ + /* */ + /* <Input> */ + /* library :: A source library handle. */ + /* */ + /* <Output> */ + /* amajor :: The major version number. */ + /* */ + /* aminor :: The minor version number. */ + /* */ + /* apatch :: The patch version number. */ + /* */ + /* <Note> */ + /* The reason why this function takes a `library' argument is because */ + /* certain programs implement library initialization in a custom way */ + /* that doesn't use @FT_Init_FreeType. */ + /* */ + /* In such cases, the library version might not be available before */ + /* the library object has been created. */ + /* */ + FT_EXPORT( void ) + FT_Library_Version( FT_Library library, + FT_Int *amajor, + FT_Int *aminor, + FT_Int *apatch ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Face_CheckTrueTypePatents */ + /* */ + /* <Description> */ + /* Parse all bytecode instructions of a TrueType font file to check */ + /* whether any of the patented opcodes are used. This is only useful */ + /* if you want to be able to use the unpatented hinter with */ + /* fonts that do *not* use these opcodes. */ + /* */ + /* Note that this function parses *all* glyph instructions in the */ + /* font file, which may be slow. */ + /* */ + /* <Input> */ + /* face :: A face handle. */ + /* */ + /* <Return> */ + /* 1~if this is a TrueType font that uses one of the patented */ + /* opcodes, 0~otherwise. */ + /* */ + /* <Note> */ + /* Since May 2010, TrueType hinting is no longer patented. */ + /* */ + /* <Since> */ + /* 2.3.5 */ + /* */ + FT_EXPORT( FT_Bool ) + FT_Face_CheckTrueTypePatents( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Face_SetUnpatentedHinting */ + /* */ + /* <Description> */ + /* Enable or disable the unpatented hinter for a given face. */ + /* Only enable it if you have determined that the face doesn't */ + /* use any patented opcodes (see @FT_Face_CheckTrueTypePatents). */ + /* */ + /* <Input> */ + /* face :: A face handle. */ + /* */ + /* value :: New boolean setting. */ + /* */ + /* <Return> */ + /* The old setting value. This will always be false if this is not */ + /* an SFNT font, or if the unpatented hinter is not compiled in this */ + /* instance of the library. */ + /* */ + /* <Note> */ + /* Since May 2010, TrueType hinting is no longer patented. */ + /* */ + /* <Since> */ + /* 2.3.5 */ + /* */ + FT_EXPORT( FT_Bool ) + FT_Face_SetUnpatentedHinting( FT_Face face, + FT_Bool value ); + + /* */ + + +FT_END_HEADER + +#endif /* __FREETYPE_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftadvanc.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftadvanc.h new file mode 100644 index 00000000..b2451bec --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftadvanc.h @@ -0,0 +1,179 @@ +/***************************************************************************/ +/* */ +/* ftadvanc.h */ +/* */ +/* Quick computation of advance widths (specification only). */ +/* */ +/* Copyright 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTADVANC_H__ +#define __FTADVANC_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * quick_advance + * + * @title: + * Quick retrieval of advance values + * + * @abstract: + * Retrieve horizontal and vertical advance values without processing + * glyph outlines, if possible. + * + * @description: + * This section contains functions to quickly extract advance values + * without handling glyph outlines, if possible. + */ + + + /*************************************************************************/ + /* */ + /* <Const> */ + /* FT_ADVANCE_FLAG_FAST_ONLY */ + /* */ + /* <Description> */ + /* A bit-flag to be OR-ed with the `flags' parameter of the */ + /* @FT_Get_Advance and @FT_Get_Advances functions. */ + /* */ + /* If set, it indicates that you want these functions to fail if the */ + /* corresponding hinting mode or font driver doesn't allow for very */ + /* quick advance computation. */ + /* */ + /* Typically, glyphs which are either unscaled, unhinted, bitmapped, */ + /* or light-hinted can have their advance width computed very */ + /* quickly. */ + /* */ + /* Normal and bytecode hinted modes, which require loading, scaling, */ + /* and hinting of the glyph outline, are extremely slow by */ + /* comparison. */ + /* */ +#define FT_ADVANCE_FLAG_FAST_ONLY 0x20000000UL + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Advance */ + /* */ + /* <Description> */ + /* Retrieve the advance value of a given glyph outline in an */ + /* @FT_Face. By default, the unhinted advance is returned in font */ + /* units. */ + /* */ + /* <Input> */ + /* face :: The source @FT_Face handle. */ + /* */ + /* gindex :: The glyph index. */ + /* */ + /* load_flags :: A set of bit flags similar to those used when */ + /* calling @FT_Load_Glyph, used to determine what kind */ + /* of advances you need. */ + /* <Output> */ + /* padvance :: The advance value, in either font units or 16.16 */ + /* format. */ + /* */ + /* If @FT_LOAD_VERTICAL_LAYOUT is set, this is the */ + /* vertical advance corresponding to a vertical layout. */ + /* Otherwise, it is the horizontal advance in a */ + /* horizontal layout. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and */ + /* if the corresponding font backend doesn't have a quick way to */ + /* retrieve the advances. */ + /* */ + /* A scaled advance is returned in 16.16 format but isn't transformed */ + /* by the affine transformation specified by @FT_Set_Transform. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Advance( FT_Face face, + FT_UInt gindex, + FT_Int32 load_flags, + FT_Fixed *padvance ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Advances */ + /* */ + /* <Description> */ + /* Retrieve the advance values of several glyph outlines in an */ + /* @FT_Face. By default, the unhinted advances are returned in font */ + /* units. */ + /* */ + /* <Input> */ + /* face :: The source @FT_Face handle. */ + /* */ + /* start :: The first glyph index. */ + /* */ + /* count :: The number of advance values you want to retrieve. */ + /* */ + /* load_flags :: A set of bit flags similar to those used when */ + /* calling @FT_Load_Glyph. */ + /* */ + /* <Output> */ + /* padvance :: The advances, in either font units or 16.16 format. */ + /* This array must contain at least `count' elements. */ + /* */ + /* If @FT_LOAD_VERTICAL_LAYOUT is set, these are the */ + /* vertical advances corresponding to a vertical layout. */ + /* Otherwise, they are the horizontal advances in a */ + /* horizontal layout. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and */ + /* if the corresponding font backend doesn't have a quick way to */ + /* retrieve the advances. */ + /* */ + /* Scaled advances are returned in 16.16 format but aren't */ + /* transformed by the affine transformation specified by */ + /* @FT_Set_Transform. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Advances( FT_Face face, + FT_UInt start, + FT_UInt count, + FT_Int32 load_flags, + FT_Fixed *padvances ); + +/* */ + + +FT_END_HEADER + +#endif /* __FTADVANC_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftbbox.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftbbox.h new file mode 100644 index 00000000..01fe3fb0 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftbbox.h @@ -0,0 +1,94 @@ +/***************************************************************************/ +/* */ +/* ftbbox.h */ +/* */ +/* FreeType exact bbox computation (specification). */ +/* */ +/* Copyright 1996-2001, 2003, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This component has a _single_ role: to compute exact outline bounding */ + /* boxes. */ + /* */ + /* It is separated from the rest of the engine for various technical */ + /* reasons. It may well be integrated in `ftoutln' later. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTBBOX_H__ +#define __FTBBOX_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* outline_processing */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Get_BBox */ + /* */ + /* <Description> */ + /* Compute the exact bounding box of an outline. This is slower */ + /* than computing the control box. However, it uses an advanced */ + /* algorithm which returns _very_ quickly when the two boxes */ + /* coincide. Otherwise, the outline Bézier arcs are traversed to */ + /* extract their extrema. */ + /* */ + /* <Input> */ + /* outline :: A pointer to the source outline. */ + /* */ + /* <Output> */ + /* abbox :: The outline's exact bounding box. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Get_BBox( FT_Outline* outline, + FT_BBox *abbox ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTBBOX_H__ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftbdf.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftbdf.h new file mode 100644 index 00000000..4f8baf84 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftbdf.h @@ -0,0 +1,209 @@ +/***************************************************************************/ +/* */ +/* ftbdf.h */ +/* */ +/* FreeType API for accessing BDF-specific strings (specification). */ +/* */ +/* Copyright 2002, 2003, 2004, 2006, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTBDF_H__ +#define __FTBDF_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* bdf_fonts */ + /* */ + /* <Title> */ + /* BDF and PCF Files */ + /* */ + /* <Abstract> */ + /* BDF and PCF specific API. */ + /* */ + /* <Description> */ + /* This section contains the declaration of functions specific to BDF */ + /* and PCF fonts. */ + /* */ + /*************************************************************************/ + + + /********************************************************************** + * + * @enum: + * FT_PropertyType + * + * @description: + * A list of BDF property types. + * + * @values: + * BDF_PROPERTY_TYPE_NONE :: + * Value~0 is used to indicate a missing property. + * + * BDF_PROPERTY_TYPE_ATOM :: + * Property is a string atom. + * + * BDF_PROPERTY_TYPE_INTEGER :: + * Property is a 32-bit signed integer. + * + * BDF_PROPERTY_TYPE_CARDINAL :: + * Property is a 32-bit unsigned integer. + */ + typedef enum BDF_PropertyType_ + { + BDF_PROPERTY_TYPE_NONE = 0, + BDF_PROPERTY_TYPE_ATOM = 1, + BDF_PROPERTY_TYPE_INTEGER = 2, + BDF_PROPERTY_TYPE_CARDINAL = 3 + + } BDF_PropertyType; + + + /********************************************************************** + * + * @type: + * BDF_Property + * + * @description: + * A handle to a @BDF_PropertyRec structure to model a given + * BDF/PCF property. + */ + typedef struct BDF_PropertyRec_* BDF_Property; + + + /********************************************************************** + * + * @struct: + * BDF_PropertyRec + * + * @description: + * This structure models a given BDF/PCF property. + * + * @fields: + * type :: + * The property type. + * + * u.atom :: + * The atom string, if type is @BDF_PROPERTY_TYPE_ATOM. + * + * u.integer :: + * A signed integer, if type is @BDF_PROPERTY_TYPE_INTEGER. + * + * u.cardinal :: + * An unsigned integer, if type is @BDF_PROPERTY_TYPE_CARDINAL. + */ + typedef struct BDF_PropertyRec_ + { + BDF_PropertyType type; + union { + const char* atom; + FT_Int32 integer; + FT_UInt32 cardinal; + + } u; + + } BDF_PropertyRec; + + + /********************************************************************** + * + * @function: + * FT_Get_BDF_Charset_ID + * + * @description: + * Retrieve a BDF font character set identity, according to + * the BDF specification. + * + * @input: + * face :: + * A handle to the input face. + * + * @output: + * acharset_encoding :: + * Charset encoding, as a C~string, owned by the face. + * + * acharset_registry :: + * Charset registry, as a C~string, owned by the face. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with BDF faces, returning an error otherwise. + */ + FT_EXPORT( FT_Error ) + FT_Get_BDF_Charset_ID( FT_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ); + + + /********************************************************************** + * + * @function: + * FT_Get_BDF_Property + * + * @description: + * Retrieve a BDF property from a BDF or PCF font file. + * + * @input: + * face :: A handle to the input face. + * + * name :: The property name. + * + * @output: + * aproperty :: The property. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function works with BDF _and_ PCF fonts. It returns an error + * otherwise. It also returns an error if the property is not in the + * font. + * + * A `property' is a either key-value pair within the STARTPROPERTIES + * ... ENDPROPERTIES block of a BDF font or a key-value pair from the + * `info->props' array within a `FontRec' structure of a PCF font. + * + * Integer properties are always stored as `signed' within PCF fonts; + * consequently, @BDF_PROPERTY_TYPE_CARDINAL is a possible return value + * for BDF fonts only. + * + * In case of error, `aproperty->type' is always set to + * @BDF_PROPERTY_TYPE_NONE. + */ + FT_EXPORT( FT_Error ) + FT_Get_BDF_Property( FT_Face face, + const char* prop_name, + BDF_PropertyRec *aproperty ); + + /* */ + +FT_END_HEADER + +#endif /* __FTBDF_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftbitmap.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftbitmap.h new file mode 100644 index 00000000..92742369 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftbitmap.h @@ -0,0 +1,227 @@ +/***************************************************************************/ +/* */ +/* ftbitmap.h */ +/* */ +/* FreeType utility functions for bitmaps (specification). */ +/* */ +/* Copyright 2004, 2005, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTBITMAP_H__ +#define __FTBITMAP_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* bitmap_handling */ + /* */ + /* <Title> */ + /* Bitmap Handling */ + /* */ + /* <Abstract> */ + /* Handling FT_Bitmap objects. */ + /* */ + /* <Description> */ + /* This section contains functions for converting FT_Bitmap objects. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Bitmap_New */ + /* */ + /* <Description> */ + /* Initialize a pointer to an @FT_Bitmap structure. */ + /* */ + /* <InOut> */ + /* abitmap :: A pointer to the bitmap structure. */ + /* */ + FT_EXPORT( void ) + FT_Bitmap_New( FT_Bitmap *abitmap ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Bitmap_Copy */ + /* */ + /* <Description> */ + /* Copy a bitmap into another one. */ + /* */ + /* <Input> */ + /* library :: A handle to a library object. */ + /* */ + /* source :: A handle to the source bitmap. */ + /* */ + /* <Output> */ + /* target :: A handle to the target bitmap. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Copy( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Bitmap_Embolden */ + /* */ + /* <Description> */ + /* Embolden a bitmap. The new bitmap will be about `xStrength' */ + /* pixels wider and `yStrength' pixels higher. The left and bottom */ + /* borders are kept unchanged. */ + /* */ + /* <Input> */ + /* library :: A handle to a library object. */ + /* */ + /* xStrength :: How strong the glyph is emboldened horizontally. */ + /* Expressed in 26.6 pixel format. */ + /* */ + /* yStrength :: How strong the glyph is emboldened vertically. */ + /* Expressed in 26.6 pixel format. */ + /* */ + /* <InOut> */ + /* bitmap :: A handle to the target bitmap. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The current implementation restricts `xStrength' to be less than */ + /* or equal to~8 if bitmap is of pixel_mode @FT_PIXEL_MODE_MONO. */ + /* */ + /* If you want to embolden the bitmap owned by a @FT_GlyphSlotRec, */ + /* you should call @FT_GlyphSlot_Own_Bitmap on the slot first. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Embolden( FT_Library library, + FT_Bitmap* bitmap, + FT_Pos xStrength, + FT_Pos yStrength ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Bitmap_Convert */ + /* */ + /* <Description> */ + /* Convert a bitmap object with depth 1bpp, 2bpp, 4bpp, or 8bpp to a */ + /* bitmap object with depth 8bpp, making the number of used bytes per */ + /* line (a.k.a. the `pitch') a multiple of `alignment'. */ + /* */ + /* <Input> */ + /* library :: A handle to a library object. */ + /* */ + /* source :: The source bitmap. */ + /* */ + /* alignment :: The pitch of the bitmap is a multiple of this */ + /* parameter. Common values are 1, 2, or 4. */ + /* */ + /* <Output> */ + /* target :: The target bitmap. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* It is possible to call @FT_Bitmap_Convert multiple times without */ + /* calling @FT_Bitmap_Done (the memory is simply reallocated). */ + /* */ + /* Use @FT_Bitmap_Done to finally remove the bitmap object. */ + /* */ + /* The `library' argument is taken to have access to FreeType's */ + /* memory handling functions. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Convert( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target, + FT_Int alignment ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_GlyphSlot_Own_Bitmap */ + /* */ + /* <Description> */ + /* Make sure that a glyph slot owns `slot->bitmap'. */ + /* */ + /* <Input> */ + /* slot :: The glyph slot. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* This function is to be used in combination with */ + /* @FT_Bitmap_Embolden. */ + /* */ + FT_EXPORT( FT_Error ) + FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot slot ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Bitmap_Done */ + /* */ + /* <Description> */ + /* Destroy a bitmap object created with @FT_Bitmap_New. */ + /* */ + /* <Input> */ + /* library :: A handle to a library object. */ + /* */ + /* bitmap :: The bitmap object to be freed. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The `library' argument is taken to have access to FreeType's */ + /* memory handling functions. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Done( FT_Library library, + FT_Bitmap *bitmap ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTBITMAP_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftcache.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftcache.h new file mode 100644 index 00000000..a9e1237b --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftcache.h @@ -0,0 +1,1125 @@ +/***************************************************************************/ +/* */ +/* ftcache.h */ +/* */ +/* FreeType Cache subsystem (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTCACHE_H__ +#define __FTCACHE_H__ + + +#include <ft2build.h> +#include FT_GLYPH_H + + +FT_BEGIN_HEADER + + + /************************************************************************* + * + * <Section> + * cache_subsystem + * + * <Title> + * Cache Sub-System + * + * <Abstract> + * How to cache face, size, and glyph data with FreeType~2. + * + * <Description> + * This section describes the FreeType~2 cache sub-system, which is used + * to limit the number of concurrently opened @FT_Face and @FT_Size + * objects, as well as caching information like character maps and glyph + * images while limiting their maximum memory usage. + * + * Note that all types and functions begin with the `FTC_' prefix. + * + * The cache is highly portable and thus doesn't know anything about the + * fonts installed on your system, or how to access them. This implies + * the following scheme: + * + * First, available or installed font faces are uniquely identified by + * @FTC_FaceID values, provided to the cache by the client. Note that + * the cache only stores and compares these values, and doesn't try to + * interpret them in any way. + * + * Second, the cache calls, only when needed, a client-provided function + * to convert a @FTC_FaceID into a new @FT_Face object. The latter is + * then completely managed by the cache, including its termination + * through @FT_Done_Face. + * + * Clients are free to map face IDs to anything else. The most simple + * usage is to associate them to a (pathname,face_index) pair that is + * used to call @FT_New_Face. However, more complex schemes are also + * possible. + * + * Note that for the cache to work correctly, the face ID values must be + * *persistent*, which means that the contents they point to should not + * change at runtime, or that their value should not become invalid. + * + * If this is unavoidable (e.g., when a font is uninstalled at runtime), + * you should call @FTC_Manager_RemoveFaceID as soon as possible, to let + * the cache get rid of any references to the old @FTC_FaceID it may + * keep internally. Failure to do so will lead to incorrect behaviour + * or even crashes. + * + * To use the cache, start with calling @FTC_Manager_New to create a new + * @FTC_Manager object, which models a single cache instance. You can + * then look up @FT_Face and @FT_Size objects with + * @FTC_Manager_LookupFace and @FTC_Manager_LookupSize, respectively. + * + * If you want to use the charmap caching, call @FTC_CMapCache_New, then + * later use @FTC_CMapCache_Lookup to perform the equivalent of + * @FT_Get_Char_Index, only much faster. + * + * If you want to use the @FT_Glyph caching, call @FTC_ImageCache, then + * later use @FTC_ImageCache_Lookup to retrieve the corresponding + * @FT_Glyph objects from the cache. + * + * If you need lots of small bitmaps, it is much more memory efficient + * to call @FTC_SBitCache_New followed by @FTC_SBitCache_Lookup. This + * returns @FTC_SBitRec structures, which are used to store small + * bitmaps directly. (A small bitmap is one whose metrics and + * dimensions all fit into 8-bit integers). + * + * We hope to also provide a kerning cache in the near future. + * + * + * <Order> + * FTC_Manager + * FTC_FaceID + * FTC_Face_Requester + * + * FTC_Manager_New + * FTC_Manager_Reset + * FTC_Manager_Done + * FTC_Manager_LookupFace + * FTC_Manager_LookupSize + * FTC_Manager_RemoveFaceID + * + * FTC_Node + * FTC_Node_Unref + * + * FTC_ImageCache + * FTC_ImageCache_New + * FTC_ImageCache_Lookup + * + * FTC_SBit + * FTC_SBitCache + * FTC_SBitCache_New + * FTC_SBitCache_Lookup + * + * FTC_CMapCache + * FTC_CMapCache_New + * FTC_CMapCache_Lookup + * + *************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BASIC TYPE DEFINITIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************* + * + * @type: FTC_FaceID + * + * @description: + * An opaque pointer type that is used to identity face objects. The + * contents of such objects is application-dependent. + * + * These pointers are typically used to point to a user-defined + * structure containing a font file path, and face index. + * + * @note: + * Never use NULL as a valid @FTC_FaceID. + * + * Face IDs are passed by the client to the cache manager, which calls, + * when needed, the @FTC_Face_Requester to translate them into new + * @FT_Face objects. + * + * If the content of a given face ID changes at runtime, or if the value + * becomes invalid (e.g., when uninstalling a font), you should + * immediately call @FTC_Manager_RemoveFaceID before any other cache + * function. + * + * Failure to do so will result in incorrect behaviour or even + * memory leaks and crashes. + */ + typedef FT_Pointer FTC_FaceID; + + + /************************************************************************ + * + * @functype: + * FTC_Face_Requester + * + * @description: + * A callback function provided by client applications. It is used by + * the cache manager to translate a given @FTC_FaceID into a new valid + * @FT_Face object, on demand. + * + * <Input> + * face_id :: + * The face ID to resolve. + * + * library :: + * A handle to a FreeType library object. + * + * req_data :: + * Application-provided request data (see note below). + * + * <Output> + * aface :: + * A new @FT_Face handle. + * + * <Return> + * FreeType error code. 0~means success. + * + * <Note> + * The third parameter `req_data' is the same as the one passed by the + * client when @FTC_Manager_New is called. + * + * The face requester should not perform funny things on the returned + * face object, like creating a new @FT_Size for it, or setting a + * transformation through @FT_Set_Transform! + */ + typedef FT_Error + (*FTC_Face_Requester)( FTC_FaceID face_id, + FT_Library library, + FT_Pointer request_data, + FT_Face* aface ); + + /* */ + +#define FT_POINTER_TO_ULONG( p ) ( (FT_ULong)(FT_Pointer)(p) ) + +#define FTC_FACE_ID_HASH( i ) \ + ((FT_UInt32)(( FT_POINTER_TO_ULONG( i ) >> 3 ) ^ \ + ( FT_POINTER_TO_ULONG( i ) << 7 ) ) ) + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CACHE MANAGER OBJECT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FTC_Manager */ + /* */ + /* <Description> */ + /* This object corresponds to one instance of the cache-subsystem. */ + /* It is used to cache one or more @FT_Face objects, along with */ + /* corresponding @FT_Size objects. */ + /* */ + /* The manager intentionally limits the total number of opened */ + /* @FT_Face and @FT_Size objects to control memory usage. See the */ + /* `max_faces' and `max_sizes' parameters of @FTC_Manager_New. */ + /* */ + /* The manager is also used to cache `nodes' of various types while */ + /* limiting their total memory usage. */ + /* */ + /* All limitations are enforced by keeping lists of managed objects */ + /* in most-recently-used order, and flushing old nodes to make room */ + /* for new ones. */ + /* */ + typedef struct FTC_ManagerRec_* FTC_Manager; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FTC_Node */ + /* */ + /* <Description> */ + /* An opaque handle to a cache node object. Each cache node is */ + /* reference-counted. A node with a count of~0 might be flushed */ + /* out of a full cache whenever a lookup request is performed. */ + /* */ + /* If you look up nodes, you have the ability to `acquire' them, */ + /* i.e., to increment their reference count. This will prevent the */ + /* node from being flushed out of the cache until you explicitly */ + /* `release' it (see @FTC_Node_Unref). */ + /* */ + /* See also @FTC_SBitCache_Lookup and @FTC_ImageCache_Lookup. */ + /* */ + typedef struct FTC_NodeRec_* FTC_Node; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Manager_New */ + /* */ + /* <Description> */ + /* Create a new cache manager. */ + /* */ + /* <Input> */ + /* library :: The parent FreeType library handle to use. */ + /* */ + /* max_faces :: Maximum number of opened @FT_Face objects managed by */ + /* this cache instance. Use~0 for defaults. */ + /* */ + /* max_sizes :: Maximum number of opened @FT_Size objects managed by */ + /* this cache instance. Use~0 for defaults. */ + /* */ + /* max_bytes :: Maximum number of bytes to use for cached data nodes. */ + /* Use~0 for defaults. Note that this value does not */ + /* account for managed @FT_Face and @FT_Size objects. */ + /* */ + /* requester :: An application-provided callback used to translate */ + /* face IDs into real @FT_Face objects. */ + /* */ + /* req_data :: A generic pointer that is passed to the requester */ + /* each time it is called (see @FTC_Face_Requester). */ + /* */ + /* <Output> */ + /* amanager :: A handle to a new manager object. 0~in case of */ + /* failure. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_Manager_New( FT_Library library, + FT_UInt max_faces, + FT_UInt max_sizes, + FT_ULong max_bytes, + FTC_Face_Requester requester, + FT_Pointer req_data, + FTC_Manager *amanager ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Manager_Reset */ + /* */ + /* <Description> */ + /* Empty a given cache manager. This simply gets rid of all the */ + /* currently cached @FT_Face and @FT_Size objects within the manager. */ + /* */ + /* <InOut> */ + /* manager :: A handle to the manager. */ + /* */ + FT_EXPORT( void ) + FTC_Manager_Reset( FTC_Manager manager ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Manager_Done */ + /* */ + /* <Description> */ + /* Destroy a given manager after emptying it. */ + /* */ + /* <Input> */ + /* manager :: A handle to the target cache manager object. */ + /* */ + FT_EXPORT( void ) + FTC_Manager_Done( FTC_Manager manager ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Manager_LookupFace */ + /* */ + /* <Description> */ + /* Retrieve the @FT_Face object that corresponds to a given face ID */ + /* through a cache manager. */ + /* */ + /* <Input> */ + /* manager :: A handle to the cache manager. */ + /* */ + /* face_id :: The ID of the face object. */ + /* */ + /* <Output> */ + /* aface :: A handle to the face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The returned @FT_Face object is always owned by the manager. You */ + /* should never try to discard it yourself. */ + /* */ + /* The @FT_Face object doesn't necessarily have a current size object */ + /* (i.e., face->size can be 0). If you need a specific `font size', */ + /* use @FTC_Manager_LookupSize instead. */ + /* */ + /* Never change the face's transformation matrix (i.e., never call */ + /* the @FT_Set_Transform function) on a returned face! If you need */ + /* to transform glyphs, do it yourself after glyph loading. */ + /* */ + /* When you perform a lookup, out-of-memory errors are detected */ + /* _within_ the lookup and force incremental flushes of the cache */ + /* until enough memory is released for the lookup to succeed. */ + /* */ + /* If a lookup fails with `FT_Err_Out_Of_Memory' the cache has */ + /* already been completely flushed, and still no memory was available */ + /* for the operation. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_Manager_LookupFace( FTC_Manager manager, + FTC_FaceID face_id, + FT_Face *aface ); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FTC_ScalerRec */ + /* */ + /* <Description> */ + /* A structure used to describe a given character size in either */ + /* pixels or points to the cache manager. See */ + /* @FTC_Manager_LookupSize. */ + /* */ + /* <Fields> */ + /* face_id :: The source face ID. */ + /* */ + /* width :: The character width. */ + /* */ + /* height :: The character height. */ + /* */ + /* pixel :: A Boolean. If 1, the `width' and `height' fields are */ + /* interpreted as integer pixel character sizes. */ + /* Otherwise, they are expressed as 1/64th of points. */ + /* */ + /* x_res :: Only used when `pixel' is value~0 to indicate the */ + /* horizontal resolution in dpi. */ + /* */ + /* y_res :: Only used when `pixel' is value~0 to indicate the */ + /* vertical resolution in dpi. */ + /* */ + /* <Note> */ + /* This type is mainly used to retrieve @FT_Size objects through the */ + /* cache manager. */ + /* */ + typedef struct FTC_ScalerRec_ + { + FTC_FaceID face_id; + FT_UInt width; + FT_UInt height; + FT_Int pixel; + FT_UInt x_res; + FT_UInt y_res; + + } FTC_ScalerRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FTC_Scaler */ + /* */ + /* <Description> */ + /* A handle to an @FTC_ScalerRec structure. */ + /* */ + typedef struct FTC_ScalerRec_* FTC_Scaler; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Manager_LookupSize */ + /* */ + /* <Description> */ + /* Retrieve the @FT_Size object that corresponds to a given */ + /* @FTC_ScalerRec pointer through a cache manager. */ + /* */ + /* <Input> */ + /* manager :: A handle to the cache manager. */ + /* */ + /* scaler :: A scaler handle. */ + /* */ + /* <Output> */ + /* asize :: A handle to the size object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The returned @FT_Size object is always owned by the manager. You */ + /* should never try to discard it by yourself. */ + /* */ + /* You can access the parent @FT_Face object simply as `size->face' */ + /* if you need it. Note that this object is also owned by the */ + /* manager. */ + /* */ + /* <Note> */ + /* When you perform a lookup, out-of-memory errors are detected */ + /* _within_ the lookup and force incremental flushes of the cache */ + /* until enough memory is released for the lookup to succeed. */ + /* */ + /* If a lookup fails with `FT_Err_Out_Of_Memory' the cache has */ + /* already been completely flushed, and still no memory is available */ + /* for the operation. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_Manager_LookupSize( FTC_Manager manager, + FTC_Scaler scaler, + FT_Size *asize ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Node_Unref */ + /* */ + /* <Description> */ + /* Decrement a cache node's internal reference count. When the count */ + /* reaches 0, it is not destroyed but becomes eligible for subsequent */ + /* cache flushes. */ + /* */ + /* <Input> */ + /* node :: The cache node handle. */ + /* */ + /* manager :: The cache manager handle. */ + /* */ + FT_EXPORT( void ) + FTC_Node_Unref( FTC_Node node, + FTC_Manager manager ); + + + /************************************************************************* + * + * @function: + * FTC_Manager_RemoveFaceID + * + * @description: + * A special function used to indicate to the cache manager that + * a given @FTC_FaceID is no longer valid, either because its + * content changed, or because it was deallocated or uninstalled. + * + * @input: + * manager :: + * The cache manager handle. + * + * face_id :: + * The @FTC_FaceID to be removed. + * + * @note: + * This function flushes all nodes from the cache corresponding to this + * `face_id', with the exception of nodes with a non-null reference + * count. + * + * Such nodes are however modified internally so as to never appear + * in later lookups with the same `face_id' value, and to be immediately + * destroyed when released by all their users. + * + */ + FT_EXPORT( void ) + FTC_Manager_RemoveFaceID( FTC_Manager manager, + FTC_FaceID face_id ); + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* cache_subsystem */ + /* */ + /*************************************************************************/ + + /************************************************************************* + * + * @type: + * FTC_CMapCache + * + * @description: + * An opaque handle used to model a charmap cache. This cache is to + * hold character codes -> glyph indices mappings. + * + */ + typedef struct FTC_CMapCacheRec_* FTC_CMapCache; + + + /************************************************************************* + * + * @function: + * FTC_CMapCache_New + * + * @description: + * Create a new charmap cache. + * + * @input: + * manager :: + * A handle to the cache manager. + * + * @output: + * acache :: + * A new cache handle. NULL in case of error. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Like all other caches, this one will be destroyed with the cache + * manager. + * + */ + FT_EXPORT( FT_Error ) + FTC_CMapCache_New( FTC_Manager manager, + FTC_CMapCache *acache ); + + + /************************************************************************ + * + * @function: + * FTC_CMapCache_Lookup + * + * @description: + * Translate a character code into a glyph index, using the charmap + * cache. + * + * @input: + * cache :: + * A charmap cache handle. + * + * face_id :: + * The source face ID. + * + * cmap_index :: + * The index of the charmap in the source face. Any negative value + * means to use the cache @FT_Face's default charmap. + * + * char_code :: + * The character code (in the corresponding charmap). + * + * @return: + * Glyph index. 0~means `no glyph'. + * + */ + FT_EXPORT( FT_UInt ) + FTC_CMapCache_Lookup( FTC_CMapCache cache, + FTC_FaceID face_id, + FT_Int cmap_index, + FT_UInt32 char_code ); + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* cache_subsystem */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** IMAGE CACHE OBJECT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************* + * + * @struct: + * FTC_ImageTypeRec + * + * @description: + * A structure used to model the type of images in a glyph cache. + * + * @fields: + * face_id :: + * The face ID. + * + * width :: + * The width in pixels. + * + * height :: + * The height in pixels. + * + * flags :: + * The load flags, as in @FT_Load_Glyph. + * + */ + typedef struct FTC_ImageTypeRec_ + { + FTC_FaceID face_id; + FT_Int width; + FT_Int height; + FT_Int32 flags; + + } FTC_ImageTypeRec; + + + /************************************************************************* + * + * @type: + * FTC_ImageType + * + * @description: + * A handle to an @FTC_ImageTypeRec structure. + * + */ + typedef struct FTC_ImageTypeRec_* FTC_ImageType; + + + /* */ + + +#define FTC_IMAGE_TYPE_COMPARE( d1, d2 ) \ + ( (d1)->face_id == (d2)->face_id && \ + (d1)->width == (d2)->width && \ + (d1)->flags == (d2)->flags ) + +#define FTC_IMAGE_TYPE_HASH( d ) \ + (FT_UFast)( FTC_FACE_ID_HASH( (d)->face_id ) ^ \ + ( (d)->width << 8 ) ^ (d)->height ^ \ + ( (d)->flags << 4 ) ) + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FTC_ImageCache */ + /* */ + /* <Description> */ + /* A handle to an glyph image cache object. They are designed to */ + /* hold many distinct glyph images while not exceeding a certain */ + /* memory threshold. */ + /* */ + typedef struct FTC_ImageCacheRec_* FTC_ImageCache; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_ImageCache_New */ + /* */ + /* <Description> */ + /* Create a new glyph image cache. */ + /* */ + /* <Input> */ + /* manager :: The parent manager for the image cache. */ + /* */ + /* <Output> */ + /* acache :: A handle to the new glyph image cache object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_ImageCache_New( FTC_Manager manager, + FTC_ImageCache *acache ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_ImageCache_Lookup */ + /* */ + /* <Description> */ + /* Retrieve a given glyph image from a glyph image cache. */ + /* */ + /* <Input> */ + /* cache :: A handle to the source glyph image cache. */ + /* */ + /* type :: A pointer to a glyph image type descriptor. */ + /* */ + /* gindex :: The glyph index to retrieve. */ + /* */ + /* <Output> */ + /* aglyph :: The corresponding @FT_Glyph object. 0~in case of */ + /* failure. */ + /* */ + /* anode :: Used to return the address of of the corresponding cache */ + /* node after incrementing its reference count (see note */ + /* below). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The returned glyph is owned and managed by the glyph image cache. */ + /* Never try to transform or discard it manually! You can however */ + /* create a copy with @FT_Glyph_Copy and modify the new one. */ + /* */ + /* If `anode' is _not_ NULL, it receives the address of the cache */ + /* node containing the glyph image, after increasing its reference */ + /* count. This ensures that the node (as well as the @FT_Glyph) will */ + /* always be kept in the cache until you call @FTC_Node_Unref to */ + /* `release' it. */ + /* */ + /* If `anode' is NULL, the cache node is left unchanged, which means */ + /* that the @FT_Glyph could be flushed out of the cache on the next */ + /* call to one of the caching sub-system APIs. Don't assume that it */ + /* is persistent! */ + /* */ + FT_EXPORT( FT_Error ) + FTC_ImageCache_Lookup( FTC_ImageCache cache, + FTC_ImageType type, + FT_UInt gindex, + FT_Glyph *aglyph, + FTC_Node *anode ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_ImageCache_LookupScaler */ + /* */ + /* <Description> */ + /* A variant of @FTC_ImageCache_Lookup that uses an @FTC_ScalerRec */ + /* to specify the face ID and its size. */ + /* */ + /* <Input> */ + /* cache :: A handle to the source glyph image cache. */ + /* */ + /* scaler :: A pointer to a scaler descriptor. */ + /* */ + /* load_flags :: The corresponding load flags. */ + /* */ + /* gindex :: The glyph index to retrieve. */ + /* */ + /* <Output> */ + /* aglyph :: The corresponding @FT_Glyph object. 0~in case of */ + /* failure. */ + /* */ + /* anode :: Used to return the address of of the corresponding */ + /* cache node after incrementing its reference count */ + /* (see note below). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The returned glyph is owned and managed by the glyph image cache. */ + /* Never try to transform or discard it manually! You can however */ + /* create a copy with @FT_Glyph_Copy and modify the new one. */ + /* */ + /* If `anode' is _not_ NULL, it receives the address of the cache */ + /* node containing the glyph image, after increasing its reference */ + /* count. This ensures that the node (as well as the @FT_Glyph) will */ + /* always be kept in the cache until you call @FTC_Node_Unref to */ + /* `release' it. */ + /* */ + /* If `anode' is NULL, the cache node is left unchanged, which means */ + /* that the @FT_Glyph could be flushed out of the cache on the next */ + /* call to one of the caching sub-system APIs. Don't assume that it */ + /* is persistent! */ + /* */ + /* Calls to @FT_Set_Char_Size and friends have no effect on cached */ + /* glyphs; you should always use the FreeType cache API instead. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_ImageCache_LookupScaler( FTC_ImageCache cache, + FTC_Scaler scaler, + FT_ULong load_flags, + FT_UInt gindex, + FT_Glyph *aglyph, + FTC_Node *anode ); + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FTC_SBit */ + /* */ + /* <Description> */ + /* A handle to a small bitmap descriptor. See the @FTC_SBitRec */ + /* structure for details. */ + /* */ + typedef struct FTC_SBitRec_* FTC_SBit; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FTC_SBitRec */ + /* */ + /* <Description> */ + /* A very compact structure used to describe a small glyph bitmap. */ + /* */ + /* <Fields> */ + /* width :: The bitmap width in pixels. */ + /* */ + /* height :: The bitmap height in pixels. */ + /* */ + /* left :: The horizontal distance from the pen position to the */ + /* left bitmap border (a.k.a. `left side bearing', or */ + /* `lsb'). */ + /* */ + /* top :: The vertical distance from the pen position (on the */ + /* baseline) to the upper bitmap border (a.k.a. `top */ + /* side bearing'). The distance is positive for upwards */ + /* y~coordinates. */ + /* */ + /* format :: The format of the glyph bitmap (monochrome or gray). */ + /* */ + /* max_grays :: Maximum gray level value (in the range 1 to~255). */ + /* */ + /* pitch :: The number of bytes per bitmap line. May be positive */ + /* or negative. */ + /* */ + /* xadvance :: The horizontal advance width in pixels. */ + /* */ + /* yadvance :: The vertical advance height in pixels. */ + /* */ + /* buffer :: A pointer to the bitmap pixels. */ + /* */ + typedef struct FTC_SBitRec_ + { + FT_Byte width; + FT_Byte height; + FT_Char left; + FT_Char top; + + FT_Byte format; + FT_Byte max_grays; + FT_Short pitch; + FT_Char xadvance; + FT_Char yadvance; + + FT_Byte* buffer; + + } FTC_SBitRec; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FTC_SBitCache */ + /* */ + /* <Description> */ + /* A handle to a small bitmap cache. These are special cache objects */ + /* used to store small glyph bitmaps (and anti-aliased pixmaps) in a */ + /* much more efficient way than the traditional glyph image cache */ + /* implemented by @FTC_ImageCache. */ + /* */ + typedef struct FTC_SBitCacheRec_* FTC_SBitCache; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_SBitCache_New */ + /* */ + /* <Description> */ + /* Create a new cache to store small glyph bitmaps. */ + /* */ + /* <Input> */ + /* manager :: A handle to the source cache manager. */ + /* */ + /* <Output> */ + /* acache :: A handle to the new sbit cache. NULL in case of error. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_SBitCache_New( FTC_Manager manager, + FTC_SBitCache *acache ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_SBitCache_Lookup */ + /* */ + /* <Description> */ + /* Look up a given small glyph bitmap in a given sbit cache and */ + /* `lock' it to prevent its flushing from the cache until needed. */ + /* */ + /* <Input> */ + /* cache :: A handle to the source sbit cache. */ + /* */ + /* type :: A pointer to the glyph image type descriptor. */ + /* */ + /* gindex :: The glyph index. */ + /* */ + /* <Output> */ + /* sbit :: A handle to a small bitmap descriptor. */ + /* */ + /* anode :: Used to return the address of of the corresponding cache */ + /* node after incrementing its reference count (see note */ + /* below). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The small bitmap descriptor and its bit buffer are owned by the */ + /* cache and should never be freed by the application. They might */ + /* as well disappear from memory on the next cache lookup, so don't */ + /* treat them as persistent data. */ + /* */ + /* The descriptor's `buffer' field is set to~0 to indicate a missing */ + /* glyph bitmap. */ + /* */ + /* If `anode' is _not_ NULL, it receives the address of the cache */ + /* node containing the bitmap, after increasing its reference count. */ + /* This ensures that the node (as well as the image) will always be */ + /* kept in the cache until you call @FTC_Node_Unref to `release' it. */ + /* */ + /* If `anode' is NULL, the cache node is left unchanged, which means */ + /* that the bitmap could be flushed out of the cache on the next */ + /* call to one of the caching sub-system APIs. Don't assume that it */ + /* is persistent! */ + /* */ + FT_EXPORT( FT_Error ) + FTC_SBitCache_Lookup( FTC_SBitCache cache, + FTC_ImageType type, + FT_UInt gindex, + FTC_SBit *sbit, + FTC_Node *anode ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_SBitCache_LookupScaler */ + /* */ + /* <Description> */ + /* A variant of @FTC_SBitCache_Lookup that uses an @FTC_ScalerRec */ + /* to specify the face ID and its size. */ + /* */ + /* <Input> */ + /* cache :: A handle to the source sbit cache. */ + /* */ + /* scaler :: A pointer to the scaler descriptor. */ + /* */ + /* load_flags :: The corresponding load flags. */ + /* */ + /* gindex :: The glyph index. */ + /* */ + /* <Output> */ + /* sbit :: A handle to a small bitmap descriptor. */ + /* */ + /* anode :: Used to return the address of of the corresponding */ + /* cache node after incrementing its reference count */ + /* (see note below). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The small bitmap descriptor and its bit buffer are owned by the */ + /* cache and should never be freed by the application. They might */ + /* as well disappear from memory on the next cache lookup, so don't */ + /* treat them as persistent data. */ + /* */ + /* The descriptor's `buffer' field is set to~0 to indicate a missing */ + /* glyph bitmap. */ + /* */ + /* If `anode' is _not_ NULL, it receives the address of the cache */ + /* node containing the bitmap, after increasing its reference count. */ + /* This ensures that the node (as well as the image) will always be */ + /* kept in the cache until you call @FTC_Node_Unref to `release' it. */ + /* */ + /* If `anode' is NULL, the cache node is left unchanged, which means */ + /* that the bitmap could be flushed out of the cache on the next */ + /* call to one of the caching sub-system APIs. Don't assume that it */ + /* is persistent! */ + /* */ + FT_EXPORT( FT_Error ) + FTC_SBitCache_LookupScaler( FTC_SBitCache cache, + FTC_Scaler scaler, + FT_ULong load_flags, + FT_UInt gindex, + FTC_SBit *sbit, + FTC_Node *anode ); + + + /* */ + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /*@***********************************************************************/ + /* */ + /* <Struct> */ + /* FTC_FontRec */ + /* */ + /* <Description> */ + /* A simple structure used to describe a given `font' to the cache */ + /* manager. Note that a `font' is the combination of a given face */ + /* with a given character size. */ + /* */ + /* <Fields> */ + /* face_id :: The ID of the face to use. */ + /* */ + /* pix_width :: The character width in integer pixels. */ + /* */ + /* pix_height :: The character height in integer pixels. */ + /* */ + typedef struct FTC_FontRec_ + { + FTC_FaceID face_id; + FT_UShort pix_width; + FT_UShort pix_height; + + } FTC_FontRec; + + + /* */ + + +#define FTC_FONT_COMPARE( f1, f2 ) \ + ( (f1)->face_id == (f2)->face_id && \ + (f1)->pix_width == (f2)->pix_width && \ + (f1)->pix_height == (f2)->pix_height ) + +#define FTC_FONT_HASH( f ) \ + (FT_UInt32)( FTC_FACE_ID_HASH((f)->face_id) ^ \ + ((f)->pix_width << 8) ^ \ + ((f)->pix_height) ) + + typedef FTC_FontRec* FTC_Font; + + + FT_EXPORT( FT_Error ) + FTC_Manager_Lookup_Face( FTC_Manager manager, + FTC_FaceID face_id, + FT_Face *aface ); + + FT_EXPORT( FT_Error ) + FTC_Manager_Lookup_Size( FTC_Manager manager, + FTC_Font font, + FT_Face *aface, + FT_Size *asize ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /* */ + +FT_END_HEADER + +#endif /* __FTCACHE_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftchapters.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftchapters.h new file mode 100644 index 00000000..7775a6bb --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftchapters.h @@ -0,0 +1,103 @@ +/***************************************************************************/ +/* */ +/* This file defines the structure of the FreeType reference. */ +/* It is used by the python script which generates the HTML files. */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* <Chapter> */ +/* general_remarks */ +/* */ +/* <Title> */ +/* General Remarks */ +/* */ +/* <Sections> */ +/* user_allocation */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* <Chapter> */ +/* core_api */ +/* */ +/* <Title> */ +/* Core API */ +/* */ +/* <Sections> */ +/* version */ +/* basic_types */ +/* base_interface */ +/* glyph_variants */ +/* glyph_management */ +/* mac_specific */ +/* sizes_management */ +/* header_file_macros */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* <Chapter> */ +/* format_specific */ +/* */ +/* <Title> */ +/* Format-Specific API */ +/* */ +/* <Sections> */ +/* multiple_masters */ +/* truetype_tables */ +/* type1_tables */ +/* sfnt_names */ +/* bdf_fonts */ +/* cid_fonts */ +/* pfr_fonts */ +/* winfnt_fonts */ +/* font_formats */ +/* gasp_table */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* <Chapter> */ +/* cache_subsystem */ +/* */ +/* <Title> */ +/* Cache Sub-System */ +/* */ +/* <Sections> */ +/* cache_subsystem */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* <Chapter> */ +/* support_api */ +/* */ +/* <Title> */ +/* Support API */ +/* */ +/* <Sections> */ +/* computations */ +/* list_processing */ +/* outline_processing */ +/* quick_advance */ +/* bitmap_handling */ +/* raster */ +/* glyph_stroker */ +/* system_interface */ +/* module_management */ +/* gzip */ +/* lzw */ +/* lcd_filtering */ +/* */ +/***************************************************************************/ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftcid.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftcid.h new file mode 100644 index 00000000..203a30ca --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftcid.h @@ -0,0 +1,166 @@ +/***************************************************************************/ +/* */ +/* ftcid.h */ +/* */ +/* FreeType API for accessing CID font information (specification). */ +/* */ +/* Copyright 2007, 2009 by Dereg Clegg, Michael Toftdal. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTCID_H__ +#define __FTCID_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* cid_fonts */ + /* */ + /* <Title> */ + /* CID Fonts */ + /* */ + /* <Abstract> */ + /* CID-keyed font specific API. */ + /* */ + /* <Description> */ + /* This section contains the declaration of CID-keyed font specific */ + /* functions. */ + /* */ + /*************************************************************************/ + + + /********************************************************************** + * + * @function: + * FT_Get_CID_Registry_Ordering_Supplement + * + * @description: + * Retrieve the Registry/Ordering/Supplement triple (also known as the + * "R/O/S") from a CID-keyed font. + * + * @input: + * face :: + * A handle to the input face. + * + * @output: + * registry :: + * The registry, as a C~string, owned by the face. + * + * ordering :: + * The ordering, as a C~string, owned by the face. + * + * supplement :: + * The supplement. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with CID faces, returning an error + * otherwise. + * + * @since: + * 2.3.6 + */ + FT_EXPORT( FT_Error ) + FT_Get_CID_Registry_Ordering_Supplement( FT_Face face, + const char* *registry, + const char* *ordering, + FT_Int *supplement); + + + /********************************************************************** + * + * @function: + * FT_Get_CID_Is_Internally_CID_Keyed + * + * @description: + * Retrieve the type of the input face, CID keyed or not. In + * constrast to the @FT_IS_CID_KEYED macro this function returns + * successfully also for CID-keyed fonts in an SNFT wrapper. + * + * @input: + * face :: + * A handle to the input face. + * + * @output: + * is_cid :: + * The type of the face as an @FT_Bool. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with CID faces and OpenType fonts, + * returning an error otherwise. + * + * @since: + * 2.3.9 + */ + FT_EXPORT( FT_Error ) + FT_Get_CID_Is_Internally_CID_Keyed( FT_Face face, + FT_Bool *is_cid ); + + + /********************************************************************** + * + * @function: + * FT_Get_CID_From_Glyph_Index + * + * @description: + * Retrieve the CID of the input glyph index. + * + * @input: + * face :: + * A handle to the input face. + * + * glyph_index :: + * The input glyph index. + * + * @output: + * cid :: + * The CID as an @FT_UInt. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with CID faces and OpenType fonts, + * returning an error otherwise. + * + * @since: + * 2.3.9 + */ + FT_EXPORT( FT_Error ) + FT_Get_CID_From_Glyph_Index( FT_Face face, + FT_UInt glyph_index, + FT_UInt *cid ); + + /* */ + +FT_END_HEADER + +#endif /* __FTCID_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/fterrdef.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/fterrdef.h new file mode 100644 index 00000000..bf522206 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/fterrdef.h @@ -0,0 +1,244 @@ +/***************************************************************************/ +/* */ +/* fterrdef.h */ +/* */ +/* FreeType error codes (specification). */ +/* */ +/* Copyright 2002, 2004, 2006, 2007, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** LIST OF ERROR CODES/MESSAGES *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + + /* You need to define both FT_ERRORDEF_ and FT_NOERRORDEF_ before */ + /* including this file. */ + + + /* generic errors */ + + FT_NOERRORDEF_( Ok, 0x00, \ + "no error" ) + + FT_ERRORDEF_( Cannot_Open_Resource, 0x01, \ + "cannot open resource" ) + FT_ERRORDEF_( Unknown_File_Format, 0x02, \ + "unknown file format" ) + FT_ERRORDEF_( Invalid_File_Format, 0x03, \ + "broken file" ) + FT_ERRORDEF_( Invalid_Version, 0x04, \ + "invalid FreeType version" ) + FT_ERRORDEF_( Lower_Module_Version, 0x05, \ + "module version is too low" ) + FT_ERRORDEF_( Invalid_Argument, 0x06, \ + "invalid argument" ) + FT_ERRORDEF_( Unimplemented_Feature, 0x07, \ + "unimplemented feature" ) + FT_ERRORDEF_( Invalid_Table, 0x08, \ + "broken table" ) + FT_ERRORDEF_( Invalid_Offset, 0x09, \ + "broken offset within table" ) + FT_ERRORDEF_( Array_Too_Large, 0x0A, \ + "array allocation size too large" ) + + /* glyph/character errors */ + + FT_ERRORDEF_( Invalid_Glyph_Index, 0x10, \ + "invalid glyph index" ) + FT_ERRORDEF_( Invalid_Character_Code, 0x11, \ + "invalid character code" ) + FT_ERRORDEF_( Invalid_Glyph_Format, 0x12, \ + "unsupported glyph image format" ) + FT_ERRORDEF_( Cannot_Render_Glyph, 0x13, \ + "cannot render this glyph format" ) + FT_ERRORDEF_( Invalid_Outline, 0x14, \ + "invalid outline" ) + FT_ERRORDEF_( Invalid_Composite, 0x15, \ + "invalid composite glyph" ) + FT_ERRORDEF_( Too_Many_Hints, 0x16, \ + "too many hints" ) + FT_ERRORDEF_( Invalid_Pixel_Size, 0x17, \ + "invalid pixel size" ) + + /* handle errors */ + + FT_ERRORDEF_( Invalid_Handle, 0x20, \ + "invalid object handle" ) + FT_ERRORDEF_( Invalid_Library_Handle, 0x21, \ + "invalid library handle" ) + FT_ERRORDEF_( Invalid_Driver_Handle, 0x22, \ + "invalid module handle" ) + FT_ERRORDEF_( Invalid_Face_Handle, 0x23, \ + "invalid face handle" ) + FT_ERRORDEF_( Invalid_Size_Handle, 0x24, \ + "invalid size handle" ) + FT_ERRORDEF_( Invalid_Slot_Handle, 0x25, \ + "invalid glyph slot handle" ) + FT_ERRORDEF_( Invalid_CharMap_Handle, 0x26, \ + "invalid charmap handle" ) + FT_ERRORDEF_( Invalid_Cache_Handle, 0x27, \ + "invalid cache manager handle" ) + FT_ERRORDEF_( Invalid_Stream_Handle, 0x28, \ + "invalid stream handle" ) + + /* driver errors */ + + FT_ERRORDEF_( Too_Many_Drivers, 0x30, \ + "too many modules" ) + FT_ERRORDEF_( Too_Many_Extensions, 0x31, \ + "too many extensions" ) + + /* memory errors */ + + FT_ERRORDEF_( Out_Of_Memory, 0x40, \ + "out of memory" ) + FT_ERRORDEF_( Unlisted_Object, 0x41, \ + "unlisted object" ) + + /* stream errors */ + + FT_ERRORDEF_( Cannot_Open_Stream, 0x51, \ + "cannot open stream" ) + FT_ERRORDEF_( Invalid_Stream_Seek, 0x52, \ + "invalid stream seek" ) + FT_ERRORDEF_( Invalid_Stream_Skip, 0x53, \ + "invalid stream skip" ) + FT_ERRORDEF_( Invalid_Stream_Read, 0x54, \ + "invalid stream read" ) + FT_ERRORDEF_( Invalid_Stream_Operation, 0x55, \ + "invalid stream operation" ) + FT_ERRORDEF_( Invalid_Frame_Operation, 0x56, \ + "invalid frame operation" ) + FT_ERRORDEF_( Nested_Frame_Access, 0x57, \ + "nested frame access" ) + FT_ERRORDEF_( Invalid_Frame_Read, 0x58, \ + "invalid frame read" ) + + /* raster errors */ + + FT_ERRORDEF_( Raster_Uninitialized, 0x60, \ + "raster uninitialized" ) + FT_ERRORDEF_( Raster_Corrupted, 0x61, \ + "raster corrupted" ) + FT_ERRORDEF_( Raster_Overflow, 0x62, \ + "raster overflow" ) + FT_ERRORDEF_( Raster_Negative_Height, 0x63, \ + "negative height while rastering" ) + + /* cache errors */ + + FT_ERRORDEF_( Too_Many_Caches, 0x70, \ + "too many registered caches" ) + + /* TrueType and SFNT errors */ + + FT_ERRORDEF_( Invalid_Opcode, 0x80, \ + "invalid opcode" ) + FT_ERRORDEF_( Too_Few_Arguments, 0x81, \ + "too few arguments" ) + FT_ERRORDEF_( Stack_Overflow, 0x82, \ + "stack overflow" ) + FT_ERRORDEF_( Code_Overflow, 0x83, \ + "code overflow" ) + FT_ERRORDEF_( Bad_Argument, 0x84, \ + "bad argument" ) + FT_ERRORDEF_( Divide_By_Zero, 0x85, \ + "division by zero" ) + FT_ERRORDEF_( Invalid_Reference, 0x86, \ + "invalid reference" ) + FT_ERRORDEF_( Debug_OpCode, 0x87, \ + "found debug opcode" ) + FT_ERRORDEF_( ENDF_In_Exec_Stream, 0x88, \ + "found ENDF opcode in execution stream" ) + FT_ERRORDEF_( Nested_DEFS, 0x89, \ + "nested DEFS" ) + FT_ERRORDEF_( Invalid_CodeRange, 0x8A, \ + "invalid code range" ) + FT_ERRORDEF_( Execution_Too_Long, 0x8B, \ + "execution context too long" ) + FT_ERRORDEF_( Too_Many_Function_Defs, 0x8C, \ + "too many function definitions" ) + FT_ERRORDEF_( Too_Many_Instruction_Defs, 0x8D, \ + "too many instruction definitions" ) + FT_ERRORDEF_( Table_Missing, 0x8E, \ + "SFNT font table missing" ) + FT_ERRORDEF_( Horiz_Header_Missing, 0x8F, \ + "horizontal header (hhea) table missing" ) + FT_ERRORDEF_( Locations_Missing, 0x90, \ + "locations (loca) table missing" ) + FT_ERRORDEF_( Name_Table_Missing, 0x91, \ + "name table missing" ) + FT_ERRORDEF_( CMap_Table_Missing, 0x92, \ + "character map (cmap) table missing" ) + FT_ERRORDEF_( Hmtx_Table_Missing, 0x93, \ + "horizontal metrics (hmtx) table missing" ) + FT_ERRORDEF_( Post_Table_Missing, 0x94, \ + "PostScript (post) table missing" ) + FT_ERRORDEF_( Invalid_Horiz_Metrics, 0x95, \ + "invalid horizontal metrics" ) + FT_ERRORDEF_( Invalid_CharMap_Format, 0x96, \ + "invalid character map (cmap) format" ) + FT_ERRORDEF_( Invalid_PPem, 0x97, \ + "invalid ppem value" ) + FT_ERRORDEF_( Invalid_Vert_Metrics, 0x98, \ + "invalid vertical metrics" ) + FT_ERRORDEF_( Could_Not_Find_Context, 0x99, \ + "could not find context" ) + FT_ERRORDEF_( Invalid_Post_Table_Format, 0x9A, \ + "invalid PostScript (post) table format" ) + FT_ERRORDEF_( Invalid_Post_Table, 0x9B, \ + "invalid PostScript (post) table" ) + + /* CFF, CID, and Type 1 errors */ + + FT_ERRORDEF_( Syntax_Error, 0xA0, \ + "opcode syntax error" ) + FT_ERRORDEF_( Stack_Underflow, 0xA1, \ + "argument stack underflow" ) + FT_ERRORDEF_( Ignore, 0xA2, \ + "ignore" ) + FT_ERRORDEF_( No_Unicode_Glyph_Name, 0xA3, \ + "no Unicode glyph name found" ) + + + /* BDF errors */ + + FT_ERRORDEF_( Missing_Startfont_Field, 0xB0, \ + "`STARTFONT' field missing" ) + FT_ERRORDEF_( Missing_Font_Field, 0xB1, \ + "`FONT' field missing" ) + FT_ERRORDEF_( Missing_Size_Field, 0xB2, \ + "`SIZE' field missing" ) + FT_ERRORDEF_( Missing_Fontboundingbox_Field, 0xB3, \ + "`FONTBOUNDINGBOX' field missing" ) + FT_ERRORDEF_( Missing_Chars_Field, 0xB4, \ + "`CHARS' field missing" ) + FT_ERRORDEF_( Missing_Startchar_Field, 0xB5, \ + "`STARTCHAR' field missing" ) + FT_ERRORDEF_( Missing_Encoding_Field, 0xB6, \ + "`ENCODING' field missing" ) + FT_ERRORDEF_( Missing_Bbx_Field, 0xB7, \ + "`BBX' field missing" ) + FT_ERRORDEF_( Bbx_Too_Big, 0xB8, \ + "`BBX' too big" ) + FT_ERRORDEF_( Corrupted_Font_Header, 0xB9, \ + "Font header corrupted or missing fields" ) + FT_ERRORDEF_( Corrupted_Font_Glyphs, 0xBA, \ + "Font glyphs corrupted or missing fields" ) + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/fterrors.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/fterrors.h new file mode 100644 index 00000000..6600dadd --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/fterrors.h @@ -0,0 +1,206 @@ +/***************************************************************************/ +/* */ +/* fterrors.h */ +/* */ +/* FreeType error code handling (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This special header file is used to define the handling of FT2 */ + /* enumeration constants. It can also be used to generate error message */ + /* strings with a small macro trick explained below. */ + /* */ + /* I - Error Formats */ + /* ----------------- */ + /* */ + /* The configuration macro FT_CONFIG_OPTION_USE_MODULE_ERRORS can be */ + /* defined in ftoption.h in order to make the higher byte indicate */ + /* the module where the error has happened (this is not compatible */ + /* with standard builds of FreeType 2). You can then use the macro */ + /* FT_ERROR_BASE macro to extract the generic error code from an */ + /* FT_Error value. */ + /* */ + /* */ + /* II - Error Message strings */ + /* -------------------------- */ + /* */ + /* The error definitions below are made through special macros that */ + /* allow client applications to build a table of error message strings */ + /* if they need it. The strings are not included in a normal build of */ + /* FreeType 2 to save space (most client applications do not use */ + /* them). */ + /* */ + /* To do so, you have to define the following macros before including */ + /* this file: */ + /* */ + /* FT_ERROR_START_LIST :: */ + /* This macro is called before anything else to define the start of */ + /* the error list. It is followed by several FT_ERROR_DEF calls */ + /* (see below). */ + /* */ + /* FT_ERROR_DEF( e, v, s ) :: */ + /* This macro is called to define one single error. */ + /* `e' is the error code identifier (e.g. FT_Err_Invalid_Argument). */ + /* `v' is the error numerical value. */ + /* `s' is the corresponding error string. */ + /* */ + /* FT_ERROR_END_LIST :: */ + /* This macro ends the list. */ + /* */ + /* Additionally, you have to undefine __FTERRORS_H__ before #including */ + /* this file. */ + /* */ + /* Here is a simple example: */ + /* */ + /* { */ + /* #undef __FTERRORS_H__ */ + /* #define FT_ERRORDEF( e, v, s ) { e, s }, */ + /* #define FT_ERROR_START_LIST { */ + /* #define FT_ERROR_END_LIST { 0, 0 } }; */ + /* */ + /* const struct */ + /* { */ + /* int err_code; */ + /* const char* err_msg; */ + /* } ft_errors[] = */ + /* */ + /* #include FT_ERRORS_H */ + /* } */ + /* */ + /*************************************************************************/ + + +#ifndef __FTERRORS_H__ +#define __FTERRORS_H__ + + + /* include module base error codes */ +#include FT_MODULE_ERRORS_H + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** SETUP MACROS *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#undef FT_NEED_EXTERN_C + +#undef FT_ERR_XCAT +#undef FT_ERR_CAT + +#define FT_ERR_XCAT( x, y ) x ## y +#define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y ) + + + /* FT_ERR_PREFIX is used as a prefix for error identifiers. */ + /* By default, we use `FT_Err_'. */ + /* */ +#ifndef FT_ERR_PREFIX +#define FT_ERR_PREFIX FT_Err_ +#endif + + + /* FT_ERR_BASE is used as the base for module-specific errors. */ + /* */ +#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS + +#ifndef FT_ERR_BASE +#define FT_ERR_BASE FT_Mod_Err_Base +#endif + +#else + +#undef FT_ERR_BASE +#define FT_ERR_BASE 0 + +#endif /* FT_CONFIG_OPTION_USE_MODULE_ERRORS */ + + + /* If FT_ERRORDEF is not defined, we need to define a simple */ + /* enumeration type. */ + /* */ +#ifndef FT_ERRORDEF + +#define FT_ERRORDEF( e, v, s ) e = v, +#define FT_ERROR_START_LIST enum { +#define FT_ERROR_END_LIST FT_ERR_CAT( FT_ERR_PREFIX, Max ) }; + +#ifdef __cplusplus +#define FT_NEED_EXTERN_C + extern "C" { +#endif + +#endif /* !FT_ERRORDEF */ + + + /* this macro is used to define an error */ +#define FT_ERRORDEF_( e, v, s ) \ + FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v + FT_ERR_BASE, s ) + + /* this is only used for <module>_Err_Ok, which must be 0! */ +#define FT_NOERRORDEF_( e, v, s ) \ + FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v, s ) + + +#ifdef FT_ERROR_START_LIST + FT_ERROR_START_LIST +#endif + + + /* now include the error codes */ +#include FT_ERROR_DEFINITIONS_H + + +#ifdef FT_ERROR_END_LIST + FT_ERROR_END_LIST +#endif + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** SIMPLE CLEANUP *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + +#ifdef FT_NEED_EXTERN_C + } +#endif + +#undef FT_ERROR_START_LIST +#undef FT_ERROR_END_LIST + +#undef FT_ERRORDEF +#undef FT_ERRORDEF_ +#undef FT_NOERRORDEF_ + +#undef FT_NEED_EXTERN_C +#undef FT_ERR_CONCAT +#undef FT_ERR_BASE + + /* FT_KEEP_ERR_PREFIX is needed for ftvalid.h */ +#ifndef FT_KEEP_ERR_PREFIX +#undef FT_ERR_PREFIX +#endif + +#endif /* __FTERRORS_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftgasp.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftgasp.h new file mode 100644 index 00000000..91a769e5 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftgasp.h @@ -0,0 +1,120 @@ +/***************************************************************************/ +/* */ +/* ftgasp.h */ +/* */ +/* Access of TrueType's `gasp' table (specification). */ +/* */ +/* Copyright 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef _FT_GASP_H_ +#define _FT_GASP_H_ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + + /*************************************************************************** + * + * @section: + * gasp_table + * + * @title: + * Gasp Table + * + * @abstract: + * Retrieving TrueType `gasp' table entries. + * + * @description: + * The function @FT_Get_Gasp can be used to query a TrueType or OpenType + * font for specific entries in its `gasp' table, if any. This is + * mainly useful when implementing native TrueType hinting with the + * bytecode interpreter to duplicate the Windows text rendering results. + */ + + /************************************************************************* + * + * @enum: + * FT_GASP_XXX + * + * @description: + * A list of values and/or bit-flags returned by the @FT_Get_Gasp + * function. + * + * @values: + * FT_GASP_NO_TABLE :: + * This special value means that there is no GASP table in this face. + * It is up to the client to decide what to do. + * + * FT_GASP_DO_GRIDFIT :: + * Grid-fitting and hinting should be performed at the specified ppem. + * This *really* means TrueType bytecode interpretation. + * + * FT_GASP_DO_GRAY :: + * Anti-aliased rendering should be performed at the specified ppem. + * + * FT_GASP_SYMMETRIC_SMOOTHING :: + * Smoothing along multiple axes must be used with ClearType. + * + * FT_GASP_SYMMETRIC_GRIDFIT :: + * Grid-fitting must be used with ClearType's symmetric smoothing. + * + * @note: + * `ClearType' is Microsoft's implementation of LCD rendering, partly + * protected by patents. + * + * @since: + * 2.3.0 + */ +#define FT_GASP_NO_TABLE -1 +#define FT_GASP_DO_GRIDFIT 0x01 +#define FT_GASP_DO_GRAY 0x02 +#define FT_GASP_SYMMETRIC_SMOOTHING 0x08 +#define FT_GASP_SYMMETRIC_GRIDFIT 0x10 + + + /************************************************************************* + * + * @func: + * FT_Get_Gasp + * + * @description: + * Read the `gasp' table from a TrueType or OpenType font file and + * return the entry corresponding to a given character pixel size. + * + * @input: + * face :: The source face handle. + * ppem :: The vertical character pixel size. + * + * @return: + * Bit flags (see @FT_GASP_XXX), or @FT_GASP_NO_TABLE if there is no + * `gasp' table in the face. + * + * @since: + * 2.3.0 + */ + FT_EXPORT( FT_Int ) + FT_Get_Gasp( FT_Face face, + FT_UInt ppem ); + +/* */ + +#endif /* _FT_GASP_H_ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftglyph.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftglyph.h new file mode 100644 index 00000000..0b8f0c04 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftglyph.h @@ -0,0 +1,613 @@ +/***************************************************************************/ +/* */ +/* ftglyph.h */ +/* */ +/* FreeType convenience functions to handle glyphs (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file contains the definition of several convenience functions */ + /* that can be used by client applications to easily retrieve glyph */ + /* bitmaps and outlines from a given face. */ + /* */ + /* These functions should be optional if you are writing a font server */ + /* or text layout engine on top of FreeType. However, they are pretty */ + /* handy for many other simple uses of the library. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTGLYPH_H__ +#define __FTGLYPH_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* glyph_management */ + /* */ + /* <Title> */ + /* Glyph Management */ + /* */ + /* <Abstract> */ + /* Generic interface to manage individual glyph data. */ + /* */ + /* <Description> */ + /* This section contains definitions used to manage glyph data */ + /* through generic FT_Glyph objects. Each of them can contain a */ + /* bitmap, a vector outline, or even images in other formats. */ + /* */ + /*************************************************************************/ + + + /* forward declaration to a private type */ + typedef struct FT_Glyph_Class_ FT_Glyph_Class; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Glyph */ + /* */ + /* <Description> */ + /* Handle to an object used to model generic glyph images. It is a */ + /* pointer to the @FT_GlyphRec structure and can contain a glyph */ + /* bitmap or pointer. */ + /* */ + /* <Note> */ + /* Glyph objects are not owned by the library. You must thus release */ + /* them manually (through @FT_Done_Glyph) _before_ calling */ + /* @FT_Done_FreeType. */ + /* */ + typedef struct FT_GlyphRec_* FT_Glyph; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_GlyphRec */ + /* */ + /* <Description> */ + /* The root glyph structure contains a given glyph image plus its */ + /* advance width in 16.16 fixed float format. */ + /* */ + /* <Fields> */ + /* library :: A handle to the FreeType library object. */ + /* */ + /* clazz :: A pointer to the glyph's class. Private. */ + /* */ + /* format :: The format of the glyph's image. */ + /* */ + /* advance :: A 16.16 vector that gives the glyph's advance width. */ + /* */ + typedef struct FT_GlyphRec_ + { + FT_Library library; + const FT_Glyph_Class* clazz; + FT_Glyph_Format format; + FT_Vector advance; + + } FT_GlyphRec; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_BitmapGlyph */ + /* */ + /* <Description> */ + /* A handle to an object used to model a bitmap glyph image. This is */ + /* a sub-class of @FT_Glyph, and a pointer to @FT_BitmapGlyphRec. */ + /* */ + typedef struct FT_BitmapGlyphRec_* FT_BitmapGlyph; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_BitmapGlyphRec */ + /* */ + /* <Description> */ + /* A structure used for bitmap glyph images. This really is a */ + /* `sub-class' of @FT_GlyphRec. */ + /* */ + /* <Fields> */ + /* root :: The root @FT_Glyph fields. */ + /* */ + /* left :: The left-side bearing, i.e., the horizontal distance */ + /* from the current pen position to the left border of the */ + /* glyph bitmap. */ + /* */ + /* top :: The top-side bearing, i.e., the vertical distance from */ + /* the current pen position to the top border of the glyph */ + /* bitmap. This distance is positive for upwards~y! */ + /* */ + /* bitmap :: A descriptor for the bitmap. */ + /* */ + /* <Note> */ + /* You can typecast an @FT_Glyph to @FT_BitmapGlyph if you have */ + /* `glyph->format == FT_GLYPH_FORMAT_BITMAP'. This lets you access */ + /* the bitmap's contents easily. */ + /* */ + /* The corresponding pixel buffer is always owned by @FT_BitmapGlyph */ + /* and is thus created and destroyed with it. */ + /* */ + typedef struct FT_BitmapGlyphRec_ + { + FT_GlyphRec root; + FT_Int left; + FT_Int top; + FT_Bitmap bitmap; + + } FT_BitmapGlyphRec; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_OutlineGlyph */ + /* */ + /* <Description> */ + /* A handle to an object used to model an outline glyph image. This */ + /* is a sub-class of @FT_Glyph, and a pointer to @FT_OutlineGlyphRec. */ + /* */ + typedef struct FT_OutlineGlyphRec_* FT_OutlineGlyph; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_OutlineGlyphRec */ + /* */ + /* <Description> */ + /* A structure used for outline (vectorial) glyph images. This */ + /* really is a `sub-class' of @FT_GlyphRec. */ + /* */ + /* <Fields> */ + /* root :: The root @FT_Glyph fields. */ + /* */ + /* outline :: A descriptor for the outline. */ + /* */ + /* <Note> */ + /* You can typecast an @FT_Glyph to @FT_OutlineGlyph if you have */ + /* `glyph->format == FT_GLYPH_FORMAT_OUTLINE'. This lets you access */ + /* the outline's content easily. */ + /* */ + /* As the outline is extracted from a glyph slot, its coordinates are */ + /* expressed normally in 26.6 pixels, unless the flag */ + /* @FT_LOAD_NO_SCALE was used in @FT_Load_Glyph() or @FT_Load_Char(). */ + /* */ + /* The outline's tables are always owned by the object and are */ + /* destroyed with it. */ + /* */ + typedef struct FT_OutlineGlyphRec_ + { + FT_GlyphRec root; + FT_Outline outline; + + } FT_OutlineGlyphRec; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Glyph */ + /* */ + /* <Description> */ + /* A function used to extract a glyph image from a slot. Note that */ + /* the created @FT_Glyph object must be released with @FT_Done_Glyph. */ + /* */ + /* <Input> */ + /* slot :: A handle to the source glyph slot. */ + /* */ + /* <Output> */ + /* aglyph :: A handle to the glyph object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Glyph( FT_GlyphSlot slot, + FT_Glyph *aglyph ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Glyph_Copy */ + /* */ + /* <Description> */ + /* A function used to copy a glyph image. Note that the created */ + /* @FT_Glyph object must be released with @FT_Done_Glyph. */ + /* */ + /* <Input> */ + /* source :: A handle to the source glyph object. */ + /* */ + /* <Output> */ + /* target :: A handle to the target glyph object. 0~in case of */ + /* error. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Glyph_Copy( FT_Glyph source, + FT_Glyph *target ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Glyph_Transform */ + /* */ + /* <Description> */ + /* Transform a glyph image if its format is scalable. */ + /* */ + /* <InOut> */ + /* glyph :: A handle to the target glyph object. */ + /* */ + /* <Input> */ + /* matrix :: A pointer to a 2x2 matrix to apply. */ + /* */ + /* delta :: A pointer to a 2d vector to apply. Coordinates are */ + /* expressed in 1/64th of a pixel. */ + /* */ + /* <Return> */ + /* FreeType error code (if not 0, the glyph format is not scalable). */ + /* */ + /* <Note> */ + /* The 2x2 transformation matrix is also applied to the glyph's */ + /* advance vector. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Glyph_Transform( FT_Glyph glyph, + FT_Matrix* matrix, + FT_Vector* delta ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Glyph_BBox_Mode */ + /* */ + /* <Description> */ + /* The mode how the values of @FT_Glyph_Get_CBox are returned. */ + /* */ + /* <Values> */ + /* FT_GLYPH_BBOX_UNSCALED :: */ + /* Return unscaled font units. */ + /* */ + /* FT_GLYPH_BBOX_SUBPIXELS :: */ + /* Return unfitted 26.6 coordinates. */ + /* */ + /* FT_GLYPH_BBOX_GRIDFIT :: */ + /* Return grid-fitted 26.6 coordinates. */ + /* */ + /* FT_GLYPH_BBOX_TRUNCATE :: */ + /* Return coordinates in integer pixels. */ + /* */ + /* FT_GLYPH_BBOX_PIXELS :: */ + /* Return grid-fitted pixel coordinates. */ + /* */ + typedef enum FT_Glyph_BBox_Mode_ + { + FT_GLYPH_BBOX_UNSCALED = 0, + FT_GLYPH_BBOX_SUBPIXELS = 0, + FT_GLYPH_BBOX_GRIDFIT = 1, + FT_GLYPH_BBOX_TRUNCATE = 2, + FT_GLYPH_BBOX_PIXELS = 3 + + } FT_Glyph_BBox_Mode; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* ft_glyph_bbox_xxx */ + /* */ + /* <Description> */ + /* These constants are deprecated. Use the corresponding */ + /* @FT_Glyph_BBox_Mode values instead. */ + /* */ + /* <Values> */ + /* ft_glyph_bbox_unscaled :: See @FT_GLYPH_BBOX_UNSCALED. */ + /* ft_glyph_bbox_subpixels :: See @FT_GLYPH_BBOX_SUBPIXELS. */ + /* ft_glyph_bbox_gridfit :: See @FT_GLYPH_BBOX_GRIDFIT. */ + /* ft_glyph_bbox_truncate :: See @FT_GLYPH_BBOX_TRUNCATE. */ + /* ft_glyph_bbox_pixels :: See @FT_GLYPH_BBOX_PIXELS. */ + /* */ +#define ft_glyph_bbox_unscaled FT_GLYPH_BBOX_UNSCALED +#define ft_glyph_bbox_subpixels FT_GLYPH_BBOX_SUBPIXELS +#define ft_glyph_bbox_gridfit FT_GLYPH_BBOX_GRIDFIT +#define ft_glyph_bbox_truncate FT_GLYPH_BBOX_TRUNCATE +#define ft_glyph_bbox_pixels FT_GLYPH_BBOX_PIXELS + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Glyph_Get_CBox */ + /* */ + /* <Description> */ + /* Return a glyph's `control box'. The control box encloses all the */ + /* outline's points, including Bézier control points. Though it */ + /* coincides with the exact bounding box for most glyphs, it can be */ + /* slightly larger in some situations (like when rotating an outline */ + /* which contains Bézier outside arcs). */ + /* */ + /* Computing the control box is very fast, while getting the bounding */ + /* box can take much more time as it needs to walk over all segments */ + /* and arcs in the outline. To get the latter, you can use the */ + /* `ftbbox' component which is dedicated to this single task. */ + /* */ + /* <Input> */ + /* glyph :: A handle to the source glyph object. */ + /* */ + /* mode :: The mode which indicates how to interpret the returned */ + /* bounding box values. */ + /* */ + /* <Output> */ + /* acbox :: The glyph coordinate bounding box. Coordinates are */ + /* expressed in 1/64th of pixels if it is grid-fitted. */ + /* */ + /* <Note> */ + /* Coordinates are relative to the glyph origin, using the y~upwards */ + /* convention. */ + /* */ + /* If the glyph has been loaded with @FT_LOAD_NO_SCALE, `bbox_mode' */ + /* must be set to @FT_GLYPH_BBOX_UNSCALED to get unscaled font */ + /* units in 26.6 pixel format. The value @FT_GLYPH_BBOX_SUBPIXELS */ + /* is another name for this constant. */ + /* */ + /* Note that the maximum coordinates are exclusive, which means that */ + /* one can compute the width and height of the glyph image (be it in */ + /* integer or 26.6 pixels) as: */ + /* */ + /* { */ + /* width = bbox.xMax - bbox.xMin; */ + /* height = bbox.yMax - bbox.yMin; */ + /* } */ + /* */ + /* Note also that for 26.6 coordinates, if `bbox_mode' is set to */ + /* @FT_GLYPH_BBOX_GRIDFIT, the coordinates will also be grid-fitted, */ + /* which corresponds to: */ + /* */ + /* { */ + /* bbox.xMin = FLOOR(bbox.xMin); */ + /* bbox.yMin = FLOOR(bbox.yMin); */ + /* bbox.xMax = CEILING(bbox.xMax); */ + /* bbox.yMax = CEILING(bbox.yMax); */ + /* } */ + /* */ + /* To get the bbox in pixel coordinates, set `bbox_mode' to */ + /* @FT_GLYPH_BBOX_TRUNCATE. */ + /* */ + /* To get the bbox in grid-fitted pixel coordinates, set `bbox_mode' */ + /* to @FT_GLYPH_BBOX_PIXELS. */ + /* */ + FT_EXPORT( void ) + FT_Glyph_Get_CBox( FT_Glyph glyph, + FT_UInt bbox_mode, + FT_BBox *acbox ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Glyph_To_Bitmap */ + /* */ + /* <Description> */ + /* Convert a given glyph object to a bitmap glyph object. */ + /* */ + /* <InOut> */ + /* the_glyph :: A pointer to a handle to the target glyph. */ + /* */ + /* <Input> */ + /* render_mode :: An enumeration that describes how the data is */ + /* rendered. */ + /* */ + /* origin :: A pointer to a vector used to translate the glyph */ + /* image before rendering. Can be~0 (if no */ + /* translation). The origin is expressed in */ + /* 26.6 pixels. */ + /* */ + /* destroy :: A boolean that indicates that the original glyph */ + /* image should be destroyed by this function. It is */ + /* never destroyed in case of error. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* This function does nothing if the glyph format isn't scalable. */ + /* */ + /* The glyph image is translated with the `origin' vector before */ + /* rendering. */ + /* */ + /* The first parameter is a pointer to an @FT_Glyph handle, that will */ + /* be _replaced_ by this function (with newly allocated data). */ + /* Typically, you would use (omitting error handling): */ + /* */ + /* */ + /* { */ + /* FT_Glyph glyph; */ + /* FT_BitmapGlyph glyph_bitmap; */ + /* */ + /* */ + /* // load glyph */ + /* error = FT_Load_Char( face, glyph_index, FT_LOAD_DEFAUT ); */ + /* */ + /* // extract glyph image */ + /* error = FT_Get_Glyph( face->glyph, &glyph ); */ + /* */ + /* // convert to a bitmap (default render mode + destroying old) */ + /* if ( glyph->format != FT_GLYPH_FORMAT_BITMAP ) */ + /* { */ + /* error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL, */ + /* 0, 1 ); */ + /* if ( error ) // `glyph' unchanged */ + /* ... */ + /* } */ + /* */ + /* // access bitmap content by typecasting */ + /* glyph_bitmap = (FT_BitmapGlyph)glyph; */ + /* */ + /* // do funny stuff with it, like blitting/drawing */ + /* ... */ + /* */ + /* // discard glyph image (bitmap or not) */ + /* FT_Done_Glyph( glyph ); */ + /* } */ + /* */ + /* */ + /* Here another example, again without error handling: */ + /* */ + /* */ + /* { */ + /* FT_Glyph glyphs[MAX_GLYPHS] */ + /* */ + /* */ + /* ... */ + /* */ + /* for ( idx = 0; i < MAX_GLYPHS; i++ ) */ + /* error = FT_Load_Glyph( face, idx, FT_LOAD_DEFAULT ) || */ + /* FT_Get_Glyph ( face->glyph, &glyph[idx] ); */ + /* */ + /* ... */ + /* */ + /* for ( idx = 0; i < MAX_GLYPHS; i++ ) */ + /* { */ + /* FT_Glyph bitmap = glyphs[idx]; */ + /* */ + /* */ + /* ... */ + /* */ + /* // after this call, `bitmap' no longer points into */ + /* // the `glyphs' array (and the old value isn't destroyed) */ + /* FT_Glyph_To_Bitmap( &bitmap, FT_RENDER_MODE_MONO, 0, 0 ); */ + /* */ + /* ... */ + /* */ + /* FT_Done_Glyph( bitmap ); */ + /* } */ + /* */ + /* ... */ + /* */ + /* for ( idx = 0; i < MAX_GLYPHS; i++ ) */ + /* FT_Done_Glyph( glyphs[idx] ); */ + /* } */ + /* */ + FT_EXPORT( FT_Error ) + FT_Glyph_To_Bitmap( FT_Glyph* the_glyph, + FT_Render_Mode render_mode, + FT_Vector* origin, + FT_Bool destroy ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_Glyph */ + /* */ + /* <Description> */ + /* Destroy a given glyph. */ + /* */ + /* <Input> */ + /* glyph :: A handle to the target glyph object. */ + /* */ + FT_EXPORT( void ) + FT_Done_Glyph( FT_Glyph glyph ); + + /* */ + + + /* other helpful functions */ + + /*************************************************************************/ + /* */ + /* <Section> */ + /* computations */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Matrix_Multiply */ + /* */ + /* <Description> */ + /* Perform the matrix operation `b = a*b'. */ + /* */ + /* <Input> */ + /* a :: A pointer to matrix `a'. */ + /* */ + /* <InOut> */ + /* b :: A pointer to matrix `b'. */ + /* */ + /* <Note> */ + /* The result is undefined if either `a' or `b' is zero. */ + /* */ + FT_EXPORT( void ) + FT_Matrix_Multiply( const FT_Matrix* a, + FT_Matrix* b ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Matrix_Invert */ + /* */ + /* <Description> */ + /* Invert a 2x2 matrix. Return an error if it can't be inverted. */ + /* */ + /* <InOut> */ + /* matrix :: A pointer to the target matrix. Remains untouched in */ + /* case of error. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Matrix_Invert( FT_Matrix* matrix ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTGLYPH_H__ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftgxval.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftgxval.h new file mode 100644 index 00000000..497015c1 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftgxval.h @@ -0,0 +1,358 @@ +/***************************************************************************/ +/* */ +/* ftgxval.h */ +/* */ +/* FreeType API for validating TrueTypeGX/AAT tables (specification). */ +/* */ +/* Copyright 2004, 2005, 2006 by */ +/* Masatake YAMATO, Redhat K.K, */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTGXVAL_H__ +#define __FTGXVAL_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* gx_validation */ + /* */ + /* <Title> */ + /* TrueTypeGX/AAT Validation */ + /* */ + /* <Abstract> */ + /* An API to validate TrueTypeGX/AAT tables. */ + /* */ + /* <Description> */ + /* This section contains the declaration of functions to validate */ + /* some TrueTypeGX tables (feat, mort, morx, bsln, just, kern, opbd, */ + /* trak, prop, lcar). */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* Warning: Use FT_VALIDATE_XXX to validate a table. */ + /* Following definitions are for gxvalid developers. */ + /* */ + /* */ + /*************************************************************************/ + +#define FT_VALIDATE_feat_INDEX 0 +#define FT_VALIDATE_mort_INDEX 1 +#define FT_VALIDATE_morx_INDEX 2 +#define FT_VALIDATE_bsln_INDEX 3 +#define FT_VALIDATE_just_INDEX 4 +#define FT_VALIDATE_kern_INDEX 5 +#define FT_VALIDATE_opbd_INDEX 6 +#define FT_VALIDATE_trak_INDEX 7 +#define FT_VALIDATE_prop_INDEX 8 +#define FT_VALIDATE_lcar_INDEX 9 +#define FT_VALIDATE_GX_LAST_INDEX FT_VALIDATE_lcar_INDEX + + + /************************************************************************* + * + * @macro: + * FT_VALIDATE_GX_LENGTH + * + * @description: + * The number of tables checked in this module. Use it as a parameter + * for the `table-length' argument of function @FT_TrueTypeGX_Validate. + */ +#define FT_VALIDATE_GX_LENGTH (FT_VALIDATE_GX_LAST_INDEX + 1) + + /* */ + + /* Up to 0x1000 is used by otvalid. + Ox2xxx is reserved for feature OT extension. */ +#define FT_VALIDATE_GX_START 0x4000 +#define FT_VALIDATE_GX_BITFIELD( tag ) \ + ( FT_VALIDATE_GX_START << FT_VALIDATE_##tag##_INDEX ) + + + /********************************************************************** + * + * @enum: + * FT_VALIDATE_GXXXX + * + * @description: + * A list of bit-field constants used with @FT_TrueTypeGX_Validate to + * indicate which TrueTypeGX/AAT Type tables should be validated. + * + * @values: + * FT_VALIDATE_feat :: + * Validate `feat' table. + * + * FT_VALIDATE_mort :: + * Validate `mort' table. + * + * FT_VALIDATE_morx :: + * Validate `morx' table. + * + * FT_VALIDATE_bsln :: + * Validate `bsln' table. + * + * FT_VALIDATE_just :: + * Validate `just' table. + * + * FT_VALIDATE_kern :: + * Validate `kern' table. + * + * FT_VALIDATE_opbd :: + * Validate `opbd' table. + * + * FT_VALIDATE_trak :: + * Validate `trak' table. + * + * FT_VALIDATE_prop :: + * Validate `prop' table. + * + * FT_VALIDATE_lcar :: + * Validate `lcar' table. + * + * FT_VALIDATE_GX :: + * Validate all TrueTypeGX tables (feat, mort, morx, bsln, just, kern, + * opbd, trak, prop and lcar). + * + */ + +#define FT_VALIDATE_feat FT_VALIDATE_GX_BITFIELD( feat ) +#define FT_VALIDATE_mort FT_VALIDATE_GX_BITFIELD( mort ) +#define FT_VALIDATE_morx FT_VALIDATE_GX_BITFIELD( morx ) +#define FT_VALIDATE_bsln FT_VALIDATE_GX_BITFIELD( bsln ) +#define FT_VALIDATE_just FT_VALIDATE_GX_BITFIELD( just ) +#define FT_VALIDATE_kern FT_VALIDATE_GX_BITFIELD( kern ) +#define FT_VALIDATE_opbd FT_VALIDATE_GX_BITFIELD( opbd ) +#define FT_VALIDATE_trak FT_VALIDATE_GX_BITFIELD( trak ) +#define FT_VALIDATE_prop FT_VALIDATE_GX_BITFIELD( prop ) +#define FT_VALIDATE_lcar FT_VALIDATE_GX_BITFIELD( lcar ) + +#define FT_VALIDATE_GX ( FT_VALIDATE_feat | \ + FT_VALIDATE_mort | \ + FT_VALIDATE_morx | \ + FT_VALIDATE_bsln | \ + FT_VALIDATE_just | \ + FT_VALIDATE_kern | \ + FT_VALIDATE_opbd | \ + FT_VALIDATE_trak | \ + FT_VALIDATE_prop | \ + FT_VALIDATE_lcar ) + + + /* */ + + /********************************************************************** + * + * @function: + * FT_TrueTypeGX_Validate + * + * @description: + * Validate various TrueTypeGX tables to assure that all offsets and + * indices are valid. The idea is that a higher-level library which + * actually does the text layout can access those tables without + * error checking (which can be quite time consuming). + * + * @input: + * face :: + * A handle to the input face. + * + * validation_flags :: + * A bit field which specifies the tables to be validated. See + * @FT_VALIDATE_GXXXX for possible values. + * + * table_length :: + * The size of the `tables' array. Normally, @FT_VALIDATE_GX_LENGTH + * should be passed. + * + * @output: + * tables :: + * The array where all validated sfnt tables are stored. + * The array itself must be allocated by a client. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with TrueTypeGX fonts, returning an error + * otherwise. + * + * After use, the application should deallocate the buffers pointed to by + * each `tables' element, by calling @FT_TrueTypeGX_Free. A NULL value + * indicates that the table either doesn't exist in the font, the + * application hasn't asked for validation, or the validator doesn't have + * the ability to validate the sfnt table. + */ + FT_EXPORT( FT_Error ) + FT_TrueTypeGX_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes tables[FT_VALIDATE_GX_LENGTH], + FT_UInt table_length ); + + + /* */ + + /********************************************************************** + * + * @function: + * FT_TrueTypeGX_Free + * + * @description: + * Free the buffer allocated by TrueTypeGX validator. + * + * @input: + * face :: + * A handle to the input face. + * + * table :: + * The pointer to the buffer allocated by + * @FT_TrueTypeGX_Validate. + * + * @note: + * This function must be used to free the buffer allocated by + * @FT_TrueTypeGX_Validate only. + */ + FT_EXPORT( void ) + FT_TrueTypeGX_Free( FT_Face face, + FT_Bytes table ); + + + /* */ + + /********************************************************************** + * + * @enum: + * FT_VALIDATE_CKERNXXX + * + * @description: + * A list of bit-field constants used with @FT_ClassicKern_Validate + * to indicate the classic kern dialect or dialects. If the selected + * type doesn't fit, @FT_ClassicKern_Validate regards the table as + * invalid. + * + * @values: + * FT_VALIDATE_MS :: + * Handle the `kern' table as a classic Microsoft kern table. + * + * FT_VALIDATE_APPLE :: + * Handle the `kern' table as a classic Apple kern table. + * + * FT_VALIDATE_CKERN :: + * Handle the `kern' as either classic Apple or Microsoft kern table. + */ +#define FT_VALIDATE_MS ( FT_VALIDATE_GX_START << 0 ) +#define FT_VALIDATE_APPLE ( FT_VALIDATE_GX_START << 1 ) + +#define FT_VALIDATE_CKERN ( FT_VALIDATE_MS | FT_VALIDATE_APPLE ) + + + /* */ + + /********************************************************************** + * + * @function: + * FT_ClassicKern_Validate + * + * @description: + * Validate classic (16-bit format) kern table to assure that the offsets + * and indices are valid. The idea is that a higher-level library which + * actually does the text layout can access those tables without error + * checking (which can be quite time consuming). + * + * The `kern' table validator in @FT_TrueTypeGX_Validate deals with both + * the new 32-bit format and the classic 16-bit format, while + * FT_ClassicKern_Validate only supports the classic 16-bit format. + * + * @input: + * face :: + * A handle to the input face. + * + * validation_flags :: + * A bit field which specifies the dialect to be validated. See + * @FT_VALIDATE_CKERNXXX for possible values. + * + * @output: + * ckern_table :: + * A pointer to the kern table. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * After use, the application should deallocate the buffers pointed to by + * `ckern_table', by calling @FT_ClassicKern_Free. A NULL value + * indicates that the table doesn't exist in the font. + */ + FT_EXPORT( FT_Error ) + FT_ClassicKern_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes *ckern_table ); + + + /* */ + + /********************************************************************** + * + * @function: + * FT_ClassicKern_Free + * + * @description: + * Free the buffer allocated by classic Kern validator. + * + * @input: + * face :: + * A handle to the input face. + * + * table :: + * The pointer to the buffer that is allocated by + * @FT_ClassicKern_Validate. + * + * @note: + * This function must be used to free the buffer allocated by + * @FT_ClassicKern_Validate only. + */ + FT_EXPORT( void ) + FT_ClassicKern_Free( FT_Face face, + FT_Bytes table ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTGXVAL_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftgzip.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftgzip.h new file mode 100644 index 00000000..acbc4f03 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftgzip.h @@ -0,0 +1,102 @@ +/***************************************************************************/ +/* */ +/* ftgzip.h */ +/* */ +/* Gzip-compressed stream support. */ +/* */ +/* Copyright 2002, 2003, 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTGZIP_H__ +#define __FTGZIP_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* <Section> */ + /* gzip */ + /* */ + /* <Title> */ + /* GZIP Streams */ + /* */ + /* <Abstract> */ + /* Using gzip-compressed font files. */ + /* */ + /* <Description> */ + /* This section contains the declaration of Gzip-specific functions. */ + /* */ + /*************************************************************************/ + + + /************************************************************************ + * + * @function: + * FT_Stream_OpenGzip + * + * @description: + * Open a new stream to parse gzip-compressed font files. This is + * mainly used to support the compressed `*.pcf.gz' fonts that come + * with XFree86. + * + * @input: + * stream :: + * The target embedding stream. + * + * source :: + * The source stream. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source stream must be opened _before_ calling this function. + * + * Calling the internal function `FT_Stream_Close' on the new stream will + * *not* call `FT_Stream_Close' on the source stream. None of the stream + * objects will be released to the heap. + * + * The stream implementation is very basic and resets the decompression + * process each time seeking backwards is needed within the stream. + * + * In certain builds of the library, gzip compression recognition is + * automatically handled when calling @FT_New_Face or @FT_Open_Face. + * This means that if no font driver is capable of handling the raw + * compressed file, the library will try to open a gzipped stream from + * it and re-open the face with it. + * + * This function may return `FT_Err_Unimplemented_Feature' if your build + * of FreeType was not compiled with zlib support. + */ + FT_EXPORT( FT_Error ) + FT_Stream_OpenGzip( FT_Stream stream, + FT_Stream source ); + + /* */ + + +FT_END_HEADER + +#endif /* __FTGZIP_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftimage.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftimage.h new file mode 100644 index 00000000..0272e92d --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftimage.h @@ -0,0 +1,1301 @@ +/***************************************************************************/ +/* */ +/* ftimage.h */ +/* */ +/* FreeType glyph image formats and default raster interface */ +/* (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* Note: A `raster' is simply a scan-line converter, used to render */ + /* FT_Outlines into FT_Bitmaps. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTIMAGE_H__ +#define __FTIMAGE_H__ + + + /* _STANDALONE_ is from ftgrays.c */ +#ifndef _STANDALONE_ +#include <ft2build.h> +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* basic_types */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Pos */ + /* */ + /* <Description> */ + /* The type FT_Pos is used to store vectorial coordinates. Depending */ + /* on the context, these can represent distances in integer font */ + /* units, or 16.16, or 26.6 fixed float pixel coordinates. */ + /* */ + typedef signed long FT_Pos; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Vector */ + /* */ + /* <Description> */ + /* A simple structure used to store a 2D vector; coordinates are of */ + /* the FT_Pos type. */ + /* */ + /* <Fields> */ + /* x :: The horizontal coordinate. */ + /* y :: The vertical coordinate. */ + /* */ + typedef struct FT_Vector_ + { + FT_Pos x; + FT_Pos y; + + } FT_Vector; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_BBox */ + /* */ + /* <Description> */ + /* A structure used to hold an outline's bounding box, i.e., the */ + /* coordinates of its extrema in the horizontal and vertical */ + /* directions. */ + /* */ + /* <Fields> */ + /* xMin :: The horizontal minimum (left-most). */ + /* */ + /* yMin :: The vertical minimum (bottom-most). */ + /* */ + /* xMax :: The horizontal maximum (right-most). */ + /* */ + /* yMax :: The vertical maximum (top-most). */ + /* */ + /* <Note> */ + /* The bounding box is specified with the coordinates of the lower */ + /* left and the upper right corner. In PostScript, those values are */ + /* often called (llx,lly) and (urx,ury), respectively. */ + /* */ + /* If `yMin' is negative, this value gives the glyph's descender. */ + /* Otherwise, the glyph doesn't descend below the baseline. */ + /* Similarly, if `ymax' is positive, this value gives the glyph's */ + /* ascender. */ + /* */ + /* `xMin' gives the horizontal distance from the glyph's origin to */ + /* the left edge of the glyph's bounding box. If `xMin' is negative, */ + /* the glyph extends to the left of the origin. */ + /* */ + typedef struct FT_BBox_ + { + FT_Pos xMin, yMin; + FT_Pos xMax, yMax; + + } FT_BBox; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Pixel_Mode */ + /* */ + /* <Description> */ + /* An enumeration type used to describe the format of pixels in a */ + /* given bitmap. Note that additional formats may be added in the */ + /* future. */ + /* */ + /* <Values> */ + /* FT_PIXEL_MODE_NONE :: */ + /* Value~0 is reserved. */ + /* */ + /* FT_PIXEL_MODE_MONO :: */ + /* A monochrome bitmap, using 1~bit per pixel. Note that pixels */ + /* are stored in most-significant order (MSB), which means that */ + /* the left-most pixel in a byte has value 128. */ + /* */ + /* FT_PIXEL_MODE_GRAY :: */ + /* An 8-bit bitmap, generally used to represent anti-aliased glyph */ + /* images. Each pixel is stored in one byte. Note that the number */ + /* of `gray' levels is stored in the `num_grays' field of the */ + /* @FT_Bitmap structure (it generally is 256). */ + /* */ + /* FT_PIXEL_MODE_GRAY2 :: */ + /* A 2-bit per pixel bitmap, used to represent embedded */ + /* anti-aliased bitmaps in font files according to the OpenType */ + /* specification. We haven't found a single font using this */ + /* format, however. */ + /* */ + /* FT_PIXEL_MODE_GRAY4 :: */ + /* A 4-bit per pixel bitmap, representing embedded anti-aliased */ + /* bitmaps in font files according to the OpenType specification. */ + /* We haven't found a single font using this format, however. */ + /* */ + /* FT_PIXEL_MODE_LCD :: */ + /* An 8-bit bitmap, representing RGB or BGR decimated glyph images */ + /* used for display on LCD displays; the bitmap is three times */ + /* wider than the original glyph image. See also */ + /* @FT_RENDER_MODE_LCD. */ + /* */ + /* FT_PIXEL_MODE_LCD_V :: */ + /* An 8-bit bitmap, representing RGB or BGR decimated glyph images */ + /* used for display on rotated LCD displays; the bitmap is three */ + /* times taller than the original glyph image. See also */ + /* @FT_RENDER_MODE_LCD_V. */ + /* */ + typedef enum FT_Pixel_Mode_ + { + FT_PIXEL_MODE_NONE = 0, + FT_PIXEL_MODE_MONO, + FT_PIXEL_MODE_GRAY, + FT_PIXEL_MODE_GRAY2, + FT_PIXEL_MODE_GRAY4, + FT_PIXEL_MODE_LCD, + FT_PIXEL_MODE_LCD_V, + + FT_PIXEL_MODE_MAX /* do not remove */ + + } FT_Pixel_Mode; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* ft_pixel_mode_xxx */ + /* */ + /* <Description> */ + /* A list of deprecated constants. Use the corresponding */ + /* @FT_Pixel_Mode values instead. */ + /* */ + /* <Values> */ + /* ft_pixel_mode_none :: See @FT_PIXEL_MODE_NONE. */ + /* ft_pixel_mode_mono :: See @FT_PIXEL_MODE_MONO. */ + /* ft_pixel_mode_grays :: See @FT_PIXEL_MODE_GRAY. */ + /* ft_pixel_mode_pal2 :: See @FT_PIXEL_MODE_GRAY2. */ + /* ft_pixel_mode_pal4 :: See @FT_PIXEL_MODE_GRAY4. */ + /* */ +#define ft_pixel_mode_none FT_PIXEL_MODE_NONE +#define ft_pixel_mode_mono FT_PIXEL_MODE_MONO +#define ft_pixel_mode_grays FT_PIXEL_MODE_GRAY +#define ft_pixel_mode_pal2 FT_PIXEL_MODE_GRAY2 +#define ft_pixel_mode_pal4 FT_PIXEL_MODE_GRAY4 + + /* */ + +#if 0 + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Palette_Mode */ + /* */ + /* <Description> */ + /* THIS TYPE IS DEPRECATED. DO NOT USE IT! */ + /* */ + /* An enumeration type to describe the format of a bitmap palette, */ + /* used with ft_pixel_mode_pal4 and ft_pixel_mode_pal8. */ + /* */ + /* <Values> */ + /* ft_palette_mode_rgb :: The palette is an array of 3-byte RGB */ + /* records. */ + /* */ + /* ft_palette_mode_rgba :: The palette is an array of 4-byte RGBA */ + /* records. */ + /* */ + /* <Note> */ + /* As ft_pixel_mode_pal2, pal4 and pal8 are currently unused by */ + /* FreeType, these types are not handled by the library itself. */ + /* */ + typedef enum FT_Palette_Mode_ + { + ft_palette_mode_rgb = 0, + ft_palette_mode_rgba, + + ft_palette_mode_max /* do not remove */ + + } FT_Palette_Mode; + + /* */ + +#endif + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Bitmap */ + /* */ + /* <Description> */ + /* A structure used to describe a bitmap or pixmap to the raster. */ + /* Note that we now manage pixmaps of various depths through the */ + /* `pixel_mode' field. */ + /* */ + /* <Fields> */ + /* rows :: The number of bitmap rows. */ + /* */ + /* width :: The number of pixels in bitmap row. */ + /* */ + /* pitch :: The pitch's absolute value is the number of bytes */ + /* taken by one bitmap row, including padding. */ + /* However, the pitch is positive when the bitmap has */ + /* a `down' flow, and negative when it has an `up' */ + /* flow. In all cases, the pitch is an offset to add */ + /* to a bitmap pointer in order to go down one row. */ + /* */ + /* For the B/W rasterizer, `pitch' is always an even */ + /* number. */ + /* */ + /* buffer :: A typeless pointer to the bitmap buffer. This */ + /* value should be aligned on 32-bit boundaries in */ + /* most cases. */ + /* */ + /* num_grays :: This field is only used with */ + /* @FT_PIXEL_MODE_GRAY; it gives the number of gray */ + /* levels used in the bitmap. */ + /* */ + /* pixel_mode :: The pixel mode, i.e., how pixel bits are stored. */ + /* See @FT_Pixel_Mode for possible values. */ + /* */ + /* palette_mode :: This field is intended for paletted pixel modes; */ + /* it indicates how the palette is stored. Not */ + /* used currently. */ + /* */ + /* palette :: A typeless pointer to the bitmap palette; this */ + /* field is intended for paletted pixel modes. Not */ + /* used currently. */ + /* */ + /* <Note> */ + /* For now, the only pixel modes supported by FreeType are mono and */ + /* grays. However, drivers might be added in the future to support */ + /* more `colorful' options. */ + /* */ + typedef struct FT_Bitmap_ + { + int rows; + int width; + int pitch; + unsigned char* buffer; + short num_grays; + char pixel_mode; + char palette_mode; + void* palette; + + } FT_Bitmap; + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* outline_processing */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Outline */ + /* */ + /* <Description> */ + /* This structure is used to describe an outline to the scan-line */ + /* converter. */ + /* */ + /* <Fields> */ + /* n_contours :: The number of contours in the outline. */ + /* */ + /* n_points :: The number of points in the outline. */ + /* */ + /* points :: A pointer to an array of `n_points' @FT_Vector */ + /* elements, giving the outline's point coordinates. */ + /* */ + /* tags :: A pointer to an array of `n_points' chars, giving */ + /* each outline point's type. */ + /* */ + /* If bit~0 is unset, the point is `off' the curve, */ + /* i.e., a Bézier control point, while it is `on' if */ + /* set. */ + /* */ + /* Bit~1 is meaningful for `off' points only. If set, */ + /* it indicates a third-order Bézier arc control point; */ + /* and a second-order control point if unset. */ + /* */ + /* If bit~2 is set, bits 5-7 contain the drop-out mode */ + /* (as defined in the OpenType specification; the value */ + /* is the same as the argument to the SCANMODE */ + /* instruction). */ + /* */ + /* Bits 3 and~4 are reserved for internal purposes. */ + /* */ + /* contours :: An array of `n_contours' shorts, giving the end */ + /* point of each contour within the outline. For */ + /* example, the first contour is defined by the points */ + /* `0' to `contours[0]', the second one is defined by */ + /* the points `contours[0]+1' to `contours[1]', etc. */ + /* */ + /* flags :: A set of bit flags used to characterize the outline */ + /* and give hints to the scan-converter and hinter on */ + /* how to convert/grid-fit it. See @FT_OUTLINE_FLAGS. */ + /* */ + /* <Note> */ + /* The B/W rasterizer only checks bit~2 in the `tags' array for the */ + /* first point of each contour. The drop-out mode as given with */ + /* @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, and */ + /* @FT_OUTLINE_INCLUDE_STUBS in `flags' is then overridden. */ + /* */ + typedef struct FT_Outline_ + { + short n_contours; /* number of contours in glyph */ + short n_points; /* number of points in the glyph */ + + FT_Vector* points; /* the outline's points */ + char* tags; /* the points flags */ + short* contours; /* the contour end points */ + + int flags; /* outline masks */ + + } FT_Outline; + + /* Following limits must be consistent with */ + /* FT_Outline.{n_contours,n_points} */ +#define FT_OUTLINE_CONTOURS_MAX SHRT_MAX +#define FT_OUTLINE_POINTS_MAX SHRT_MAX + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_OUTLINE_FLAGS */ + /* */ + /* <Description> */ + /* A list of bit-field constants use for the flags in an outline's */ + /* `flags' field. */ + /* */ + /* <Values> */ + /* FT_OUTLINE_NONE :: */ + /* Value~0 is reserved. */ + /* */ + /* FT_OUTLINE_OWNER :: */ + /* If set, this flag indicates that the outline's field arrays */ + /* (i.e., `points', `flags', and `contours') are `owned' by the */ + /* outline object, and should thus be freed when it is destroyed. */ + /* */ + /* FT_OUTLINE_EVEN_ODD_FILL :: */ + /* By default, outlines are filled using the non-zero winding rule. */ + /* If set to 1, the outline will be filled using the even-odd fill */ + /* rule (only works with the smooth rasterizer). */ + /* */ + /* FT_OUTLINE_REVERSE_FILL :: */ + /* By default, outside contours of an outline are oriented in */ + /* clock-wise direction, as defined in the TrueType specification. */ + /* This flag is set if the outline uses the opposite direction */ + /* (typically for Type~1 fonts). This flag is ignored by the scan */ + /* converter. */ + /* */ + /* FT_OUTLINE_IGNORE_DROPOUTS :: */ + /* By default, the scan converter will try to detect drop-outs in */ + /* an outline and correct the glyph bitmap to ensure consistent */ + /* shape continuity. If set, this flag hints the scan-line */ + /* converter to ignore such cases. See below for more information. */ + /* */ + /* FT_OUTLINE_SMART_DROPOUTS :: */ + /* Select smart dropout control. If unset, use simple dropout */ + /* control. Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set. See */ + /* below for more information. */ + /* */ + /* FT_OUTLINE_INCLUDE_STUBS :: */ + /* If set, turn pixels on for `stubs', otherwise exclude them. */ + /* Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set. See below for */ + /* more information. */ + /* */ + /* FT_OUTLINE_HIGH_PRECISION :: */ + /* This flag indicates that the scan-line converter should try to */ + /* convert this outline to bitmaps with the highest possible */ + /* quality. It is typically set for small character sizes. Note */ + /* that this is only a hint that might be completely ignored by a */ + /* given scan-converter. */ + /* */ + /* FT_OUTLINE_SINGLE_PASS :: */ + /* This flag is set to force a given scan-converter to only use a */ + /* single pass over the outline to render a bitmap glyph image. */ + /* Normally, it is set for very large character sizes. It is only */ + /* a hint that might be completely ignored by a given */ + /* scan-converter. */ + /* */ + /* <Note> */ + /* The flags @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, */ + /* and @FT_OUTLINE_INCLUDE_STUBS are ignored by the smooth */ + /* rasterizer. */ + /* */ + /* There exists a second mechanism to pass the drop-out mode to the */ + /* B/W rasterizer; see the `tags' field in @FT_Outline. */ + /* */ + /* Please refer to the description of the `SCANTYPE' instruction in */ + /* the OpenType specification (in file `ttinst1.doc') how simple */ + /* drop-outs, smart drop-outs, and stubs are defined. */ + /* */ +#define FT_OUTLINE_NONE 0x0 +#define FT_OUTLINE_OWNER 0x1 +#define FT_OUTLINE_EVEN_ODD_FILL 0x2 +#define FT_OUTLINE_REVERSE_FILL 0x4 +#define FT_OUTLINE_IGNORE_DROPOUTS 0x8 +#define FT_OUTLINE_SMART_DROPOUTS 0x10 +#define FT_OUTLINE_INCLUDE_STUBS 0x20 + +#define FT_OUTLINE_HIGH_PRECISION 0x100 +#define FT_OUTLINE_SINGLE_PASS 0x200 + + + /************************************************************************* + * + * @enum: + * ft_outline_flags + * + * @description: + * These constants are deprecated. Please use the corresponding + * @FT_OUTLINE_FLAGS values. + * + * @values: + * ft_outline_none :: See @FT_OUTLINE_NONE. + * ft_outline_owner :: See @FT_OUTLINE_OWNER. + * ft_outline_even_odd_fill :: See @FT_OUTLINE_EVEN_ODD_FILL. + * ft_outline_reverse_fill :: See @FT_OUTLINE_REVERSE_FILL. + * ft_outline_ignore_dropouts :: See @FT_OUTLINE_IGNORE_DROPOUTS. + * ft_outline_high_precision :: See @FT_OUTLINE_HIGH_PRECISION. + * ft_outline_single_pass :: See @FT_OUTLINE_SINGLE_PASS. + */ +#define ft_outline_none FT_OUTLINE_NONE +#define ft_outline_owner FT_OUTLINE_OWNER +#define ft_outline_even_odd_fill FT_OUTLINE_EVEN_ODD_FILL +#define ft_outline_reverse_fill FT_OUTLINE_REVERSE_FILL +#define ft_outline_ignore_dropouts FT_OUTLINE_IGNORE_DROPOUTS +#define ft_outline_high_precision FT_OUTLINE_HIGH_PRECISION +#define ft_outline_single_pass FT_OUTLINE_SINGLE_PASS + + /* */ + +#define FT_CURVE_TAG( flag ) ( flag & 3 ) + +#define FT_CURVE_TAG_ON 1 +#define FT_CURVE_TAG_CONIC 0 +#define FT_CURVE_TAG_CUBIC 2 + +#define FT_CURVE_TAG_HAS_SCANMODE 4 + +#define FT_CURVE_TAG_TOUCH_X 8 /* reserved for the TrueType hinter */ +#define FT_CURVE_TAG_TOUCH_Y 16 /* reserved for the TrueType hinter */ + +#define FT_CURVE_TAG_TOUCH_BOTH ( FT_CURVE_TAG_TOUCH_X | \ + FT_CURVE_TAG_TOUCH_Y ) + +#define FT_Curve_Tag_On FT_CURVE_TAG_ON +#define FT_Curve_Tag_Conic FT_CURVE_TAG_CONIC +#define FT_Curve_Tag_Cubic FT_CURVE_TAG_CUBIC +#define FT_Curve_Tag_Touch_X FT_CURVE_TAG_TOUCH_X +#define FT_Curve_Tag_Touch_Y FT_CURVE_TAG_TOUCH_Y + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Outline_MoveToFunc */ + /* */ + /* <Description> */ + /* A function pointer type used to describe the signature of a `move */ + /* to' function during outline walking/decomposition. */ + /* */ + /* A `move to' is emitted to start a new contour in an outline. */ + /* */ + /* <Input> */ + /* to :: A pointer to the target point of the `move to'. */ + /* */ + /* user :: A typeless pointer which is passed from the caller of the */ + /* decomposition function. */ + /* */ + /* <Return> */ + /* Error code. 0~means success. */ + /* */ + typedef int + (*FT_Outline_MoveToFunc)( const FT_Vector* to, + void* user ); + +#define FT_Outline_MoveTo_Func FT_Outline_MoveToFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Outline_LineToFunc */ + /* */ + /* <Description> */ + /* A function pointer type used to describe the signature of a `line */ + /* to' function during outline walking/decomposition. */ + /* */ + /* A `line to' is emitted to indicate a segment in the outline. */ + /* */ + /* <Input> */ + /* to :: A pointer to the target point of the `line to'. */ + /* */ + /* user :: A typeless pointer which is passed from the caller of the */ + /* decomposition function. */ + /* */ + /* <Return> */ + /* Error code. 0~means success. */ + /* */ + typedef int + (*FT_Outline_LineToFunc)( const FT_Vector* to, + void* user ); + +#define FT_Outline_LineTo_Func FT_Outline_LineToFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Outline_ConicToFunc */ + /* */ + /* <Description> */ + /* A function pointer type used to describe the signature of a `conic */ + /* to' function during outline walking or decomposition. */ + /* */ + /* A `conic to' is emitted to indicate a second-order Bézier arc in */ + /* the outline. */ + /* */ + /* <Input> */ + /* control :: An intermediate control point between the last position */ + /* and the new target in `to'. */ + /* */ + /* to :: A pointer to the target end point of the conic arc. */ + /* */ + /* user :: A typeless pointer which is passed from the caller of */ + /* the decomposition function. */ + /* */ + /* <Return> */ + /* Error code. 0~means success. */ + /* */ + typedef int + (*FT_Outline_ConicToFunc)( const FT_Vector* control, + const FT_Vector* to, + void* user ); + +#define FT_Outline_ConicTo_Func FT_Outline_ConicToFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Outline_CubicToFunc */ + /* */ + /* <Description> */ + /* A function pointer type used to describe the signature of a `cubic */ + /* to' function during outline walking or decomposition. */ + /* */ + /* A `cubic to' is emitted to indicate a third-order Bézier arc. */ + /* */ + /* <Input> */ + /* control1 :: A pointer to the first Bézier control point. */ + /* */ + /* control2 :: A pointer to the second Bézier control point. */ + /* */ + /* to :: A pointer to the target end point. */ + /* */ + /* user :: A typeless pointer which is passed from the caller of */ + /* the decomposition function. */ + /* */ + /* <Return> */ + /* Error code. 0~means success. */ + /* */ + typedef int + (*FT_Outline_CubicToFunc)( const FT_Vector* control1, + const FT_Vector* control2, + const FT_Vector* to, + void* user ); + +#define FT_Outline_CubicTo_Func FT_Outline_CubicToFunc + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Outline_Funcs */ + /* */ + /* <Description> */ + /* A structure to hold various function pointers used during outline */ + /* decomposition in order to emit segments, conic, and cubic Béziers. */ + /* */ + /* <Fields> */ + /* move_to :: The `move to' emitter. */ + /* */ + /* line_to :: The segment emitter. */ + /* */ + /* conic_to :: The second-order Bézier arc emitter. */ + /* */ + /* cubic_to :: The third-order Bézier arc emitter. */ + /* */ + /* shift :: The shift that is applied to coordinates before they */ + /* are sent to the emitter. */ + /* */ + /* delta :: The delta that is applied to coordinates before they */ + /* are sent to the emitter, but after the shift. */ + /* */ + /* <Note> */ + /* The point coordinates sent to the emitters are the transformed */ + /* version of the original coordinates (this is important for high */ + /* accuracy during scan-conversion). The transformation is simple: */ + /* */ + /* { */ + /* x' = (x << shift) - delta */ + /* y' = (x << shift) - delta */ + /* } */ + /* */ + /* Set the values of `shift' and `delta' to~0 to get the original */ + /* point coordinates. */ + /* */ + typedef struct FT_Outline_Funcs_ + { + FT_Outline_MoveToFunc move_to; + FT_Outline_LineToFunc line_to; + FT_Outline_ConicToFunc conic_to; + FT_Outline_CubicToFunc cubic_to; + + int shift; + FT_Pos delta; + + } FT_Outline_Funcs; + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* basic_types */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_IMAGE_TAG */ + /* */ + /* <Description> */ + /* This macro converts four-letter tags to an unsigned long type. */ + /* */ + /* <Note> */ + /* Since many 16-bit compilers don't like 32-bit enumerations, you */ + /* should redefine this macro in case of problems to something like */ + /* this: */ + /* */ + /* { */ + /* #define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) value */ + /* } */ + /* */ + /* to get a simple enumeration without assigning special numbers. */ + /* */ +#ifndef FT_IMAGE_TAG +#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) \ + value = ( ( (unsigned long)_x1 << 24 ) | \ + ( (unsigned long)_x2 << 16 ) | \ + ( (unsigned long)_x3 << 8 ) | \ + (unsigned long)_x4 ) +#endif /* FT_IMAGE_TAG */ + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Glyph_Format */ + /* */ + /* <Description> */ + /* An enumeration type used to describe the format of a given glyph */ + /* image. Note that this version of FreeType only supports two image */ + /* formats, even though future font drivers will be able to register */ + /* their own format. */ + /* */ + /* <Values> */ + /* FT_GLYPH_FORMAT_NONE :: */ + /* The value~0 is reserved. */ + /* */ + /* FT_GLYPH_FORMAT_COMPOSITE :: */ + /* The glyph image is a composite of several other images. This */ + /* format is _only_ used with @FT_LOAD_NO_RECURSE, and is used to */ + /* report compound glyphs (like accented characters). */ + /* */ + /* FT_GLYPH_FORMAT_BITMAP :: */ + /* The glyph image is a bitmap, and can be described as an */ + /* @FT_Bitmap. You generally need to access the `bitmap' field of */ + /* the @FT_GlyphSlotRec structure to read it. */ + /* */ + /* FT_GLYPH_FORMAT_OUTLINE :: */ + /* The glyph image is a vectorial outline made of line segments */ + /* and Bézier arcs; it can be described as an @FT_Outline; you */ + /* generally want to access the `outline' field of the */ + /* @FT_GlyphSlotRec structure to read it. */ + /* */ + /* FT_GLYPH_FORMAT_PLOTTER :: */ + /* The glyph image is a vectorial path with no inside and outside */ + /* contours. Some Type~1 fonts, like those in the Hershey family, */ + /* contain glyphs in this format. These are described as */ + /* @FT_Outline, but FreeType isn't currently capable of rendering */ + /* them correctly. */ + /* */ + typedef enum FT_Glyph_Format_ + { + FT_IMAGE_TAG( FT_GLYPH_FORMAT_NONE, 0, 0, 0, 0 ), + + FT_IMAGE_TAG( FT_GLYPH_FORMAT_COMPOSITE, 'c', 'o', 'm', 'p' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_BITMAP, 'b', 'i', 't', 's' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_OUTLINE, 'o', 'u', 't', 'l' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_PLOTTER, 'p', 'l', 'o', 't' ) + + } FT_Glyph_Format; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* ft_glyph_format_xxx */ + /* */ + /* <Description> */ + /* A list of deprecated constants. Use the corresponding */ + /* @FT_Glyph_Format values instead. */ + /* */ + /* <Values> */ + /* ft_glyph_format_none :: See @FT_GLYPH_FORMAT_NONE. */ + /* ft_glyph_format_composite :: See @FT_GLYPH_FORMAT_COMPOSITE. */ + /* ft_glyph_format_bitmap :: See @FT_GLYPH_FORMAT_BITMAP. */ + /* ft_glyph_format_outline :: See @FT_GLYPH_FORMAT_OUTLINE. */ + /* ft_glyph_format_plotter :: See @FT_GLYPH_FORMAT_PLOTTER. */ + /* */ +#define ft_glyph_format_none FT_GLYPH_FORMAT_NONE +#define ft_glyph_format_composite FT_GLYPH_FORMAT_COMPOSITE +#define ft_glyph_format_bitmap FT_GLYPH_FORMAT_BITMAP +#define ft_glyph_format_outline FT_GLYPH_FORMAT_OUTLINE +#define ft_glyph_format_plotter FT_GLYPH_FORMAT_PLOTTER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** R A S T E R D E F I N I T I O N S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* A raster is a scan converter, in charge of rendering an outline into */ + /* a a bitmap. This section contains the public API for rasters. */ + /* */ + /* Note that in FreeType 2, all rasters are now encapsulated within */ + /* specific modules called `renderers'. See `freetype/ftrender.h' for */ + /* more details on renderers. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* raster */ + /* */ + /* <Title> */ + /* Scanline Converter */ + /* */ + /* <Abstract> */ + /* How vectorial outlines are converted into bitmaps and pixmaps. */ + /* */ + /* <Description> */ + /* This section contains technical definitions. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Raster */ + /* */ + /* <Description> */ + /* A handle (pointer) to a raster object. Each object can be used */ + /* independently to convert an outline into a bitmap or pixmap. */ + /* */ + typedef struct FT_RasterRec_* FT_Raster; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Span */ + /* */ + /* <Description> */ + /* A structure used to model a single span of gray (or black) pixels */ + /* when rendering a monochrome or anti-aliased bitmap. */ + /* */ + /* <Fields> */ + /* x :: The span's horizontal start position. */ + /* */ + /* len :: The span's length in pixels. */ + /* */ + /* coverage :: The span color/coverage, ranging from 0 (background) */ + /* to 255 (foreground). Only used for anti-aliased */ + /* rendering. */ + /* */ + /* <Note> */ + /* This structure is used by the span drawing callback type named */ + /* @FT_SpanFunc which takes the y~coordinate of the span as a */ + /* a parameter. */ + /* */ + /* The coverage value is always between 0 and 255. If you want less */ + /* gray values, the callback function has to reduce them. */ + /* */ + typedef struct FT_Span_ + { + short x; + unsigned short len; + unsigned char coverage; + + } FT_Span; + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_SpanFunc */ + /* */ + /* <Description> */ + /* A function used as a call-back by the anti-aliased renderer in */ + /* order to let client applications draw themselves the gray pixel */ + /* spans on each scan line. */ + /* */ + /* <Input> */ + /* y :: The scanline's y~coordinate. */ + /* */ + /* count :: The number of spans to draw on this scanline. */ + /* */ + /* spans :: A table of `count' spans to draw on the scanline. */ + /* */ + /* user :: User-supplied data that is passed to the callback. */ + /* */ + /* <Note> */ + /* This callback allows client applications to directly render the */ + /* gray spans of the anti-aliased bitmap to any kind of surfaces. */ + /* */ + /* This can be used to write anti-aliased outlines directly to a */ + /* given background bitmap, and even perform translucency. */ + /* */ + /* Note that the `count' field cannot be greater than a fixed value */ + /* defined by the `FT_MAX_GRAY_SPANS' configuration macro in */ + /* `ftoption.h'. By default, this value is set to~32, which means */ + /* that if there are more than 32~spans on a given scanline, the */ + /* callback is called several times with the same `y' parameter in */ + /* order to draw all callbacks. */ + /* */ + /* Otherwise, the callback is only called once per scan-line, and */ + /* only for those scanlines that do have `gray' pixels on them. */ + /* */ + typedef void + (*FT_SpanFunc)( int y, + int count, + const FT_Span* spans, + void* user ); + +#define FT_Raster_Span_Func FT_SpanFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_BitTest_Func */ + /* */ + /* <Description> */ + /* THIS TYPE IS DEPRECATED. DO NOT USE IT. */ + /* */ + /* A function used as a call-back by the monochrome scan-converter */ + /* to test whether a given target pixel is already set to the drawing */ + /* `color'. These tests are crucial to implement drop-out control */ + /* per-se the TrueType spec. */ + /* */ + /* <Input> */ + /* y :: The pixel's y~coordinate. */ + /* */ + /* x :: The pixel's x~coordinate. */ + /* */ + /* user :: User-supplied data that is passed to the callback. */ + /* */ + /* <Return> */ + /* 1~if the pixel is `set', 0~otherwise. */ + /* */ + typedef int + (*FT_Raster_BitTest_Func)( int y, + int x, + void* user ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_BitSet_Func */ + /* */ + /* <Description> */ + /* THIS TYPE IS DEPRECATED. DO NOT USE IT. */ + /* */ + /* A function used as a call-back by the monochrome scan-converter */ + /* to set an individual target pixel. This is crucial to implement */ + /* drop-out control according to the TrueType specification. */ + /* */ + /* <Input> */ + /* y :: The pixel's y~coordinate. */ + /* */ + /* x :: The pixel's x~coordinate. */ + /* */ + /* user :: User-supplied data that is passed to the callback. */ + /* */ + /* <Return> */ + /* 1~if the pixel is `set', 0~otherwise. */ + /* */ + typedef void + (*FT_Raster_BitSet_Func)( int y, + int x, + void* user ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_RASTER_FLAG_XXX */ + /* */ + /* <Description> */ + /* A list of bit flag constants as used in the `flags' field of a */ + /* @FT_Raster_Params structure. */ + /* */ + /* <Values> */ + /* FT_RASTER_FLAG_DEFAULT :: This value is 0. */ + /* */ + /* FT_RASTER_FLAG_AA :: This flag is set to indicate that an */ + /* anti-aliased glyph image should be */ + /* generated. Otherwise, it will be */ + /* monochrome (1-bit). */ + /* */ + /* FT_RASTER_FLAG_DIRECT :: This flag is set to indicate direct */ + /* rendering. In this mode, client */ + /* applications must provide their own span */ + /* callback. This lets them directly */ + /* draw or compose over an existing bitmap. */ + /* If this bit is not set, the target */ + /* pixmap's buffer _must_ be zeroed before */ + /* rendering. */ + /* */ + /* Note that for now, direct rendering is */ + /* only possible with anti-aliased glyphs. */ + /* */ + /* FT_RASTER_FLAG_CLIP :: This flag is only used in direct */ + /* rendering mode. If set, the output will */ + /* be clipped to a box specified in the */ + /* `clip_box' field of the */ + /* @FT_Raster_Params structure. */ + /* */ + /* Note that by default, the glyph bitmap */ + /* is clipped to the target pixmap, except */ + /* in direct rendering mode where all spans */ + /* are generated if no clipping box is set. */ + /* */ +#define FT_RASTER_FLAG_DEFAULT 0x0 +#define FT_RASTER_FLAG_AA 0x1 +#define FT_RASTER_FLAG_DIRECT 0x2 +#define FT_RASTER_FLAG_CLIP 0x4 + + /* deprecated */ +#define ft_raster_flag_default FT_RASTER_FLAG_DEFAULT +#define ft_raster_flag_aa FT_RASTER_FLAG_AA +#define ft_raster_flag_direct FT_RASTER_FLAG_DIRECT +#define ft_raster_flag_clip FT_RASTER_FLAG_CLIP + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Raster_Params */ + /* */ + /* <Description> */ + /* A structure to hold the arguments used by a raster's render */ + /* function. */ + /* */ + /* <Fields> */ + /* target :: The target bitmap. */ + /* */ + /* source :: A pointer to the source glyph image (e.g., an */ + /* @FT_Outline). */ + /* */ + /* flags :: The rendering flags. */ + /* */ + /* gray_spans :: The gray span drawing callback. */ + /* */ + /* black_spans :: The black span drawing callback. UNIMPLEMENTED! */ + /* */ + /* bit_test :: The bit test callback. UNIMPLEMENTED! */ + /* */ + /* bit_set :: The bit set callback. UNIMPLEMENTED! */ + /* */ + /* user :: User-supplied data that is passed to each drawing */ + /* callback. */ + /* */ + /* clip_box :: An optional clipping box. It is only used in */ + /* direct rendering mode. Note that coordinates here */ + /* should be expressed in _integer_ pixels (and not in */ + /* 26.6 fixed-point units). */ + /* */ + /* <Note> */ + /* An anti-aliased glyph bitmap is drawn if the @FT_RASTER_FLAG_AA */ + /* bit flag is set in the `flags' field, otherwise a monochrome */ + /* bitmap is generated. */ + /* */ + /* If the @FT_RASTER_FLAG_DIRECT bit flag is set in `flags', the */ + /* raster will call the `gray_spans' callback to draw gray pixel */ + /* spans, in the case of an aa glyph bitmap, it will call */ + /* `black_spans', and `bit_test' and `bit_set' in the case of a */ + /* monochrome bitmap. This allows direct composition over a */ + /* pre-existing bitmap through user-provided callbacks to perform the */ + /* span drawing/composition. */ + /* */ + /* Note that the `bit_test' and `bit_set' callbacks are required when */ + /* rendering a monochrome bitmap, as they are crucial to implement */ + /* correct drop-out control as defined in the TrueType specification. */ + /* */ + typedef struct FT_Raster_Params_ + { + const FT_Bitmap* target; + const void* source; + int flags; + FT_SpanFunc gray_spans; + FT_SpanFunc black_spans; /* doesn't work! */ + FT_Raster_BitTest_Func bit_test; /* doesn't work! */ + FT_Raster_BitSet_Func bit_set; /* doesn't work! */ + void* user; + FT_BBox clip_box; + + } FT_Raster_Params; + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_NewFunc */ + /* */ + /* <Description> */ + /* A function used to create a new raster object. */ + /* */ + /* <Input> */ + /* memory :: A handle to the memory allocator. */ + /* */ + /* <Output> */ + /* raster :: A handle to the new raster object. */ + /* */ + /* <Return> */ + /* Error code. 0~means success. */ + /* */ + /* <Note> */ + /* The `memory' parameter is a typeless pointer in order to avoid */ + /* un-wanted dependencies on the rest of the FreeType code. In */ + /* practice, it is an @FT_Memory object, i.e., a handle to the */ + /* standard FreeType memory allocator. However, this field can be */ + /* completely ignored by a given raster implementation. */ + /* */ + typedef int + (*FT_Raster_NewFunc)( void* memory, + FT_Raster* raster ); + +#define FT_Raster_New_Func FT_Raster_NewFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_DoneFunc */ + /* */ + /* <Description> */ + /* A function used to destroy a given raster object. */ + /* */ + /* <Input> */ + /* raster :: A handle to the raster object. */ + /* */ + typedef void + (*FT_Raster_DoneFunc)( FT_Raster raster ); + +#define FT_Raster_Done_Func FT_Raster_DoneFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_ResetFunc */ + /* */ + /* <Description> */ + /* FreeType provides an area of memory called the `render pool', */ + /* available to all registered rasters. This pool can be freely used */ + /* during a given scan-conversion but is shared by all rasters. Its */ + /* content is thus transient. */ + /* */ + /* This function is called each time the render pool changes, or just */ + /* after a new raster object is created. */ + /* */ + /* <Input> */ + /* raster :: A handle to the new raster object. */ + /* */ + /* pool_base :: The address in memory of the render pool. */ + /* */ + /* pool_size :: The size in bytes of the render pool. */ + /* */ + /* <Note> */ + /* Rasters can ignore the render pool and rely on dynamic memory */ + /* allocation if they want to (a handle to the memory allocator is */ + /* passed to the raster constructor). However, this is not */ + /* recommended for efficiency purposes. */ + /* */ + typedef void + (*FT_Raster_ResetFunc)( FT_Raster raster, + unsigned char* pool_base, + unsigned long pool_size ); + +#define FT_Raster_Reset_Func FT_Raster_ResetFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_SetModeFunc */ + /* */ + /* <Description> */ + /* This function is a generic facility to change modes or attributes */ + /* in a given raster. This can be used for debugging purposes, or */ + /* simply to allow implementation-specific `features' in a given */ + /* raster module. */ + /* */ + /* <Input> */ + /* raster :: A handle to the new raster object. */ + /* */ + /* mode :: A 4-byte tag used to name the mode or property. */ + /* */ + /* args :: A pointer to the new mode/property to use. */ + /* */ + typedef int + (*FT_Raster_SetModeFunc)( FT_Raster raster, + unsigned long mode, + void* args ); + +#define FT_Raster_Set_Mode_Func FT_Raster_SetModeFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_RenderFunc */ + /* */ + /* <Description> */ + /* Invoke a given raster to scan-convert a given glyph image into a */ + /* target bitmap. */ + /* */ + /* <Input> */ + /* raster :: A handle to the raster object. */ + /* */ + /* params :: A pointer to an @FT_Raster_Params structure used to */ + /* store the rendering parameters. */ + /* */ + /* <Return> */ + /* Error code. 0~means success. */ + /* */ + /* <Note> */ + /* The exact format of the source image depends on the raster's glyph */ + /* format defined in its @FT_Raster_Funcs structure. It can be an */ + /* @FT_Outline or anything else in order to support a large array of */ + /* glyph formats. */ + /* */ + /* Note also that the render function can fail and return a */ + /* `FT_Err_Unimplemented_Feature' error code if the raster used does */ + /* not support direct composition. */ + /* */ + /* XXX: For now, the standard raster doesn't support direct */ + /* composition but this should change for the final release (see */ + /* the files `demos/src/ftgrays.c' and `demos/src/ftgrays2.c' */ + /* for examples of distinct implementations which support direct */ + /* composition). */ + /* */ + typedef int + (*FT_Raster_RenderFunc)( FT_Raster raster, + const FT_Raster_Params* params ); + +#define FT_Raster_Render_Func FT_Raster_RenderFunc + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Raster_Funcs */ + /* */ + /* <Description> */ + /* A structure used to describe a given raster class to the library. */ + /* */ + /* <Fields> */ + /* glyph_format :: The supported glyph format for this raster. */ + /* */ + /* raster_new :: The raster constructor. */ + /* */ + /* raster_reset :: Used to reset the render pool within the raster. */ + /* */ + /* raster_render :: A function to render a glyph into a given bitmap. */ + /* */ + /* raster_done :: The raster destructor. */ + /* */ + typedef struct FT_Raster_Funcs_ + { + FT_Glyph_Format glyph_format; + FT_Raster_NewFunc raster_new; + FT_Raster_ResetFunc raster_reset; + FT_Raster_SetModeFunc raster_set_mode; + FT_Raster_RenderFunc raster_render; + FT_Raster_DoneFunc raster_done; + + } FT_Raster_Funcs; + + + /* */ + + +FT_END_HEADER + +#endif /* __FTIMAGE_H__ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftincrem.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftincrem.h new file mode 100644 index 00000000..aaf689ff --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftincrem.h @@ -0,0 +1,353 @@ +/***************************************************************************/ +/* */ +/* ftincrem.h */ +/* */ +/* FreeType incremental loading (specification). */ +/* */ +/* Copyright 2002, 2003, 2006, 2007, 2008, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTINCREM_H__ +#define __FTINCREM_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /*************************************************************************** + * + * @section: + * incremental + * + * @title: + * Incremental Loading + * + * @abstract: + * Custom Glyph Loading. + * + * @description: + * This section contains various functions used to perform so-called + * `incremental' glyph loading. This is a mode where all glyphs loaded + * from a given @FT_Face are provided by the client application, + * + * Apart from that, all other tables are loaded normally from the font + * file. This mode is useful when FreeType is used within another + * engine, e.g., a PostScript Imaging Processor. + * + * To enable this mode, you must use @FT_Open_Face, passing an + * @FT_Parameter with the @FT_PARAM_TAG_INCREMENTAL tag and an + * @FT_Incremental_Interface value. See the comments for + * @FT_Incremental_InterfaceRec for an example. + * + */ + + + /*************************************************************************** + * + * @type: + * FT_Incremental + * + * @description: + * An opaque type describing a user-provided object used to implement + * `incremental' glyph loading within FreeType. This is used to support + * embedded fonts in certain environments (e.g., PostScript interpreters), + * where the glyph data isn't in the font file, or must be overridden by + * different values. + * + * @note: + * It is up to client applications to create and implement @FT_Incremental + * objects, as long as they provide implementations for the methods + * @FT_Incremental_GetGlyphDataFunc, @FT_Incremental_FreeGlyphDataFunc + * and @FT_Incremental_GetGlyphMetricsFunc. + * + * See the description of @FT_Incremental_InterfaceRec to understand how + * to use incremental objects with FreeType. + * + */ + typedef struct FT_IncrementalRec_* FT_Incremental; + + + /*************************************************************************** + * + * @struct: + * FT_Incremental_MetricsRec + * + * @description: + * A small structure used to contain the basic glyph metrics returned + * by the @FT_Incremental_GetGlyphMetricsFunc method. + * + * @fields: + * bearing_x :: + * Left bearing, in font units. + * + * bearing_y :: + * Top bearing, in font units. + * + * advance :: + * Horizontal component of glyph advance, in font units. + * + * advance_v :: + * Vertical component of glyph advance, in font units. + * + * @note: + * These correspond to horizontal or vertical metrics depending on the + * value of the `vertical' argument to the function + * @FT_Incremental_GetGlyphMetricsFunc. + * + */ + typedef struct FT_Incremental_MetricsRec_ + { + FT_Long bearing_x; + FT_Long bearing_y; + FT_Long advance; + FT_Long advance_v; /* since 2.3.12 */ + + } FT_Incremental_MetricsRec; + + + /*************************************************************************** + * + * @struct: + * FT_Incremental_Metrics + * + * @description: + * A handle to an @FT_Incremental_MetricsRec structure. + * + */ + typedef struct FT_Incremental_MetricsRec_* FT_Incremental_Metrics; + + + /*************************************************************************** + * + * @type: + * FT_Incremental_GetGlyphDataFunc + * + * @description: + * A function called by FreeType to access a given glyph's data bytes + * during @FT_Load_Glyph or @FT_Load_Char if incremental loading is + * enabled. + * + * Note that the format of the glyph's data bytes depends on the font + * file format. For TrueType, it must correspond to the raw bytes within + * the `glyf' table. For PostScript formats, it must correspond to the + * *unencrypted* charstring bytes, without any `lenIV' header. It is + * undefined for any other format. + * + * @input: + * incremental :: + * Handle to an opaque @FT_Incremental handle provided by the client + * application. + * + * glyph_index :: + * Index of relevant glyph. + * + * @output: + * adata :: + * A structure describing the returned glyph data bytes (which will be + * accessed as a read-only byte block). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If this function returns successfully the method + * @FT_Incremental_FreeGlyphDataFunc will be called later to release + * the data bytes. + * + * Nested calls to @FT_Incremental_GetGlyphDataFunc can happen for + * compound glyphs. + * + */ + typedef FT_Error + (*FT_Incremental_GetGlyphDataFunc)( FT_Incremental incremental, + FT_UInt glyph_index, + FT_Data* adata ); + + + /*************************************************************************** + * + * @type: + * FT_Incremental_FreeGlyphDataFunc + * + * @description: + * A function used to release the glyph data bytes returned by a + * successful call to @FT_Incremental_GetGlyphDataFunc. + * + * @input: + * incremental :: + * A handle to an opaque @FT_Incremental handle provided by the client + * application. + * + * data :: + * A structure describing the glyph data bytes (which will be accessed + * as a read-only byte block). + * + */ + typedef void + (*FT_Incremental_FreeGlyphDataFunc)( FT_Incremental incremental, + FT_Data* data ); + + + /*************************************************************************** + * + * @type: + * FT_Incremental_GetGlyphMetricsFunc + * + * @description: + * A function used to retrieve the basic metrics of a given glyph index + * before accessing its data. This is necessary because, in certain + * formats like TrueType, the metrics are stored in a different place from + * the glyph images proper. + * + * @input: + * incremental :: + * A handle to an opaque @FT_Incremental handle provided by the client + * application. + * + * glyph_index :: + * Index of relevant glyph. + * + * vertical :: + * If true, return vertical metrics. + * + * ametrics :: + * This parameter is used for both input and output. + * The original glyph metrics, if any, in font units. If metrics are + * not available all the values must be set to zero. + * + * @output: + * ametrics :: + * The replacement glyph metrics in font units. + * + */ + typedef FT_Error + (*FT_Incremental_GetGlyphMetricsFunc) + ( FT_Incremental incremental, + FT_UInt glyph_index, + FT_Bool vertical, + FT_Incremental_MetricsRec *ametrics ); + + + /************************************************************************** + * + * @struct: + * FT_Incremental_FuncsRec + * + * @description: + * A table of functions for accessing fonts that load data + * incrementally. Used in @FT_Incremental_InterfaceRec. + * + * @fields: + * get_glyph_data :: + * The function to get glyph data. Must not be null. + * + * free_glyph_data :: + * The function to release glyph data. Must not be null. + * + * get_glyph_metrics :: + * The function to get glyph metrics. May be null if the font does + * not provide overriding glyph metrics. + * + */ + typedef struct FT_Incremental_FuncsRec_ + { + FT_Incremental_GetGlyphDataFunc get_glyph_data; + FT_Incremental_FreeGlyphDataFunc free_glyph_data; + FT_Incremental_GetGlyphMetricsFunc get_glyph_metrics; + + } FT_Incremental_FuncsRec; + + + /*************************************************************************** + * + * @struct: + * FT_Incremental_InterfaceRec + * + * @description: + * A structure to be used with @FT_Open_Face to indicate that the user + * wants to support incremental glyph loading. You should use it with + * @FT_PARAM_TAG_INCREMENTAL as in the following example: + * + * { + * FT_Incremental_InterfaceRec inc_int; + * FT_Parameter parameter; + * FT_Open_Args open_args; + * + * + * // set up incremental descriptor + * inc_int.funcs = my_funcs; + * inc_int.object = my_object; + * + * // set up optional parameter + * parameter.tag = FT_PARAM_TAG_INCREMENTAL; + * parameter.data = &inc_int; + * + * // set up FT_Open_Args structure + * open_args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS; + * open_args.pathname = my_font_pathname; + * open_args.num_params = 1; + * open_args.params = ¶meter; // we use one optional argument + * + * // open the font + * error = FT_Open_Face( library, &open_args, index, &face ); + * ... + * } + * + */ + typedef struct FT_Incremental_InterfaceRec_ + { + const FT_Incremental_FuncsRec* funcs; + FT_Incremental object; + + } FT_Incremental_InterfaceRec; + + + /*************************************************************************** + * + * @type: + * FT_Incremental_Interface + * + * @description: + * A pointer to an @FT_Incremental_InterfaceRec structure. + * + */ + typedef FT_Incremental_InterfaceRec* FT_Incremental_Interface; + + + /*************************************************************************** + * + * @constant: + * FT_PARAM_TAG_INCREMENTAL + * + * @description: + * A constant used as the tag of @FT_Parameter structures to indicate + * an incremental loading object to be used by FreeType. + * + */ +#define FT_PARAM_TAG_INCREMENTAL FT_MAKE_TAG( 'i', 'n', 'c', 'r' ) + + /* */ + +FT_END_HEADER + +#endif /* __FTINCREM_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftlcdfil.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftlcdfil.h new file mode 100644 index 00000000..0b55ebee --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftlcdfil.h @@ -0,0 +1,213 @@ +/***************************************************************************/ +/* */ +/* ftlcdfil.h */ +/* */ +/* FreeType API for color filtering of subpixel bitmap glyphs */ +/* (specification). */ +/* */ +/* Copyright 2006, 2007, 2008, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FT_LCD_FILTER_H__ +#define __FT_LCD_FILTER_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /*************************************************************************** + * + * @section: + * lcd_filtering + * + * @title: + * LCD Filtering + * + * @abstract: + * Reduce color fringes of LCD-optimized bitmaps. + * + * @description: + * The @FT_Library_SetLcdFilter API can be used to specify a low-pass + * filter which is then applied to LCD-optimized bitmaps generated + * through @FT_Render_Glyph. This is useful to reduce color fringes + * which would occur with unfiltered rendering. + * + * Note that no filter is active by default, and that this function is + * *not* implemented in default builds of the library. You need to + * #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING in your `ftoption.h' file + * in order to activate it. + */ + + + /**************************************************************************** + * + * @enum: + * FT_LcdFilter + * + * @description: + * A list of values to identify various types of LCD filters. + * + * @values: + * FT_LCD_FILTER_NONE :: + * Do not perform filtering. When used with subpixel rendering, this + * results in sometimes severe color fringes. + * + * FT_LCD_FILTER_DEFAULT :: + * The default filter reduces color fringes considerably, at the cost + * of a slight blurriness in the output. + * + * FT_LCD_FILTER_LIGHT :: + * The light filter is a variant that produces less blurriness at the + * cost of slightly more color fringes than the default one. It might + * be better, depending on taste, your monitor, or your personal vision. + * + * FT_LCD_FILTER_LEGACY :: + * This filter corresponds to the original libXft color filter. It + * provides high contrast output but can exhibit really bad color + * fringes if glyphs are not extremely well hinted to the pixel grid. + * In other words, it only works well if the TrueType bytecode + * interpreter is enabled *and* high-quality hinted fonts are used. + * + * This filter is only provided for comparison purposes, and might be + * disabled or stay unsupported in the future. + * + * @since: + * 2.3.0 + */ + typedef enum FT_LcdFilter_ + { + FT_LCD_FILTER_NONE = 0, + FT_LCD_FILTER_DEFAULT = 1, + FT_LCD_FILTER_LIGHT = 2, + FT_LCD_FILTER_LEGACY = 16, + + FT_LCD_FILTER_MAX /* do not remove */ + + } FT_LcdFilter; + + + /************************************************************************** + * + * @func: + * FT_Library_SetLcdFilter + * + * @description: + * This function is used to apply color filtering to LCD decimated + * bitmaps, like the ones used when calling @FT_Render_Glyph with + * @FT_RENDER_MODE_LCD or @FT_RENDER_MODE_LCD_V. + * + * @input: + * library :: + * A handle to the target library instance. + * + * filter :: + * The filter type. + * + * You can use @FT_LCD_FILTER_NONE here to disable this feature, or + * @FT_LCD_FILTER_DEFAULT to use a default filter that should work + * well on most LCD screens. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This feature is always disabled by default. Clients must make an + * explicit call to this function with a `filter' value other than + * @FT_LCD_FILTER_NONE in order to enable it. + * + * Due to *PATENTS* covering subpixel rendering, this function doesn't + * do anything except returning `FT_Err_Unimplemented_Feature' if the + * configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not + * defined in your build of the library, which should correspond to all + * default builds of FreeType. + * + * The filter affects glyph bitmaps rendered through @FT_Render_Glyph, + * @FT_Outline_Get_Bitmap, @FT_Load_Glyph, and @FT_Load_Char. + * + * It does _not_ affect the output of @FT_Outline_Render and + * @FT_Outline_Get_Bitmap. + * + * If this feature is activated, the dimensions of LCD glyph bitmaps are + * either larger or taller than the dimensions of the corresponding + * outline with regards to the pixel grid. For example, for + * @FT_RENDER_MODE_LCD, the filter adds up to 3~pixels to the left, and + * up to 3~pixels to the right. + * + * The bitmap offset values are adjusted correctly, so clients shouldn't + * need to modify their layout and glyph positioning code when enabling + * the filter. + * + * @since: + * 2.3.0 + */ + FT_EXPORT( FT_Error ) + FT_Library_SetLcdFilter( FT_Library library, + FT_LcdFilter filter ); + + + /************************************************************************** + * + * @func: + * FT_Library_SetLcdFilterWeights + * + * @description: + * Use this function to override the filter weights selected by + * @FT_Library_SetLcdFilter. By default, FreeType uses the quintuple + * (0x00, 0x55, 0x56, 0x55, 0x00) for FT_LCD_FILTER_LIGHT, and (0x10, + * 0x40, 0x70, 0x40, 0x10) for FT_LCD_FILTER_DEFAULT and + * FT_LCD_FILTER_LEGACY. + * + * @input: + * library :: + * A handle to the target library instance. + * + * weights :: + * A pointer to an array; the function copies the first five bytes and + * uses them to specify the filter weights. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Due to *PATENTS* covering subpixel rendering, this function doesn't + * do anything except returning `FT_Err_Unimplemented_Feature' if the + * configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not + * defined in your build of the library, which should correspond to all + * default builds of FreeType. + * + * This function must be called after @FT_Library_SetLcdFilter to have + * any effect. + * + * @since: + * 2.4.0 + */ + FT_EXPORT( FT_Error ) + FT_Library_SetLcdFilterWeights( FT_Library library, + unsigned char *weights ); + + /* */ + + +FT_END_HEADER + +#endif /* __FT_LCD_FILTER_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftlist.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftlist.h new file mode 100644 index 00000000..bb6f7f11 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftlist.h @@ -0,0 +1,277 @@ +/***************************************************************************/ +/* */ +/* ftlist.h */ +/* */ +/* Generic list support for FreeType (specification). */ +/* */ +/* Copyright 1996-2001, 2003, 2007, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file implements functions relative to list processing. Its */ + /* data structures are defined in `freetype.h'. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTLIST_H__ +#define __FTLIST_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* list_processing */ + /* */ + /* <Title> */ + /* List Processing */ + /* */ + /* <Abstract> */ + /* Simple management of lists. */ + /* */ + /* <Description> */ + /* This section contains various definitions related to list */ + /* processing using doubly-linked nodes. */ + /* */ + /* <Order> */ + /* FT_List */ + /* FT_ListNode */ + /* FT_ListRec */ + /* FT_ListNodeRec */ + /* */ + /* FT_List_Add */ + /* FT_List_Insert */ + /* FT_List_Find */ + /* FT_List_Remove */ + /* FT_List_Up */ + /* FT_List_Iterate */ + /* FT_List_Iterator */ + /* FT_List_Finalize */ + /* FT_List_Destructor */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Find */ + /* */ + /* <Description> */ + /* Find the list node for a given listed object. */ + /* */ + /* <Input> */ + /* list :: A pointer to the parent list. */ + /* data :: The address of the listed object. */ + /* */ + /* <Return> */ + /* List node. NULL if it wasn't found. */ + /* */ + FT_EXPORT( FT_ListNode ) + FT_List_Find( FT_List list, + void* data ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Add */ + /* */ + /* <Description> */ + /* Append an element to the end of a list. */ + /* */ + /* <InOut> */ + /* list :: A pointer to the parent list. */ + /* node :: The node to append. */ + /* */ + FT_EXPORT( void ) + FT_List_Add( FT_List list, + FT_ListNode node ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Insert */ + /* */ + /* <Description> */ + /* Insert an element at the head of a list. */ + /* */ + /* <InOut> */ + /* list :: A pointer to parent list. */ + /* node :: The node to insert. */ + /* */ + FT_EXPORT( void ) + FT_List_Insert( FT_List list, + FT_ListNode node ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Remove */ + /* */ + /* <Description> */ + /* Remove a node from a list. This function doesn't check whether */ + /* the node is in the list! */ + /* */ + /* <Input> */ + /* node :: The node to remove. */ + /* */ + /* <InOut> */ + /* list :: A pointer to the parent list. */ + /* */ + FT_EXPORT( void ) + FT_List_Remove( FT_List list, + FT_ListNode node ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Up */ + /* */ + /* <Description> */ + /* Move a node to the head/top of a list. Used to maintain LRU */ + /* lists. */ + /* */ + /* <InOut> */ + /* list :: A pointer to the parent list. */ + /* node :: The node to move. */ + /* */ + FT_EXPORT( void ) + FT_List_Up( FT_List list, + FT_ListNode node ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_List_Iterator */ + /* */ + /* <Description> */ + /* An FT_List iterator function which is called during a list parse */ + /* by @FT_List_Iterate. */ + /* */ + /* <Input> */ + /* node :: The current iteration list node. */ + /* */ + /* user :: A typeless pointer passed to @FT_List_Iterate. */ + /* Can be used to point to the iteration's state. */ + /* */ + typedef FT_Error + (*FT_List_Iterator)( FT_ListNode node, + void* user ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Iterate */ + /* */ + /* <Description> */ + /* Parse a list and calls a given iterator function on each element. */ + /* Note that parsing is stopped as soon as one of the iterator calls */ + /* returns a non-zero value. */ + /* */ + /* <Input> */ + /* list :: A handle to the list. */ + /* iterator :: An iterator function, called on each node of the list. */ + /* user :: A user-supplied field which is passed as the second */ + /* argument to the iterator. */ + /* */ + /* <Return> */ + /* The result (a FreeType error code) of the last iterator call. */ + /* */ + FT_EXPORT( FT_Error ) + FT_List_Iterate( FT_List list, + FT_List_Iterator iterator, + void* user ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_List_Destructor */ + /* */ + /* <Description> */ + /* An @FT_List iterator function which is called during a list */ + /* finalization by @FT_List_Finalize to destroy all elements in a */ + /* given list. */ + /* */ + /* <Input> */ + /* system :: The current system object. */ + /* */ + /* data :: The current object to destroy. */ + /* */ + /* user :: A typeless pointer passed to @FT_List_Iterate. It can */ + /* be used to point to the iteration's state. */ + /* */ + typedef void + (*FT_List_Destructor)( FT_Memory memory, + void* data, + void* user ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Finalize */ + /* */ + /* <Description> */ + /* Destroy all elements in the list as well as the list itself. */ + /* */ + /* <Input> */ + /* list :: A handle to the list. */ + /* */ + /* destroy :: A list destructor that will be applied to each element */ + /* of the list. */ + /* */ + /* memory :: The current memory object which handles deallocation. */ + /* */ + /* user :: A user-supplied field which is passed as the last */ + /* argument to the destructor. */ + /* */ + /* <Note> */ + /* This function expects that all nodes added by @FT_List_Add or */ + /* @FT_List_Insert have been dynamically allocated. */ + /* */ + FT_EXPORT( void ) + FT_List_Finalize( FT_List list, + FT_List_Destructor destroy, + FT_Memory memory, + void* user ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTLIST_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftlzw.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftlzw.h new file mode 100644 index 00000000..00d40169 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftlzw.h @@ -0,0 +1,99 @@ +/***************************************************************************/ +/* */ +/* ftlzw.h */ +/* */ +/* LZW-compressed stream support. */ +/* */ +/* Copyright 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTLZW_H__ +#define __FTLZW_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* <Section> */ + /* lzw */ + /* */ + /* <Title> */ + /* LZW Streams */ + /* */ + /* <Abstract> */ + /* Using LZW-compressed font files. */ + /* */ + /* <Description> */ + /* This section contains the declaration of LZW-specific functions. */ + /* */ + /*************************************************************************/ + + /************************************************************************ + * + * @function: + * FT_Stream_OpenLZW + * + * @description: + * Open a new stream to parse LZW-compressed font files. This is + * mainly used to support the compressed `*.pcf.Z' fonts that come + * with XFree86. + * + * @input: + * stream :: The target embedding stream. + * + * source :: The source stream. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source stream must be opened _before_ calling this function. + * + * Calling the internal function `FT_Stream_Close' on the new stream will + * *not* call `FT_Stream_Close' on the source stream. None of the stream + * objects will be released to the heap. + * + * The stream implementation is very basic and resets the decompression + * process each time seeking backwards is needed within the stream + * + * In certain builds of the library, LZW compression recognition is + * automatically handled when calling @FT_New_Face or @FT_Open_Face. + * This means that if no font driver is capable of handling the raw + * compressed file, the library will try to open a LZW stream from it + * and re-open the face with it. + * + * This function may return `FT_Err_Unimplemented_Feature' if your build + * of FreeType was not compiled with LZW support. + */ + FT_EXPORT( FT_Error ) + FT_Stream_OpenLZW( FT_Stream stream, + FT_Stream source ); + + /* */ + + +FT_END_HEADER + +#endif /* __FTLZW_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftmac.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftmac.h new file mode 100644 index 00000000..ab5bab51 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftmac.h @@ -0,0 +1,274 @@ +/***************************************************************************/ +/* */ +/* ftmac.h */ +/* */ +/* Additional Mac-specific API. */ +/* */ +/* Copyright 1996-2001, 2004, 2006, 2007 by */ +/* Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* NOTE: Include this file after <freetype/freetype.h> and after any */ +/* Mac-specific headers (because this header uses Mac types such as */ +/* Handle, FSSpec, FSRef, etc.) */ +/* */ +/***************************************************************************/ + + +#ifndef __FTMAC_H__ +#define __FTMAC_H__ + + +#include <ft2build.h> + + +FT_BEGIN_HEADER + + +/* gcc-3.4.1 and later can warn about functions tagged as deprecated */ +#ifndef FT_DEPRECATED_ATTRIBUTE +#if defined(__GNUC__) && \ + ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1))) +#define FT_DEPRECATED_ATTRIBUTE __attribute__((deprecated)) +#else +#define FT_DEPRECATED_ATTRIBUTE +#endif +#endif + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* mac_specific */ + /* */ + /* <Title> */ + /* Mac Specific Interface */ + /* */ + /* <Abstract> */ + /* Only available on the Macintosh. */ + /* */ + /* <Description> */ + /* The following definitions are only available if FreeType is */ + /* compiled on a Macintosh. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Face_From_FOND */ + /* */ + /* <Description> */ + /* Create a new face object from a FOND resource. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* fond :: A FOND resource. */ + /* */ + /* face_index :: Only supported for the -1 `sanity check' special */ + /* case. */ + /* */ + /* <Output> */ + /* aface :: A handle to a new face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Notes> */ + /* This function can be used to create @FT_Face objects from fonts */ + /* that are installed in the system as follows. */ + /* */ + /* { */ + /* fond = GetResource( 'FOND', fontName ); */ + /* error = FT_New_Face_From_FOND( library, fond, 0, &face ); */ + /* } */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Face_From_FOND( FT_Library library, + Handle fond, + FT_Long face_index, + FT_Face *aface ) + FT_DEPRECATED_ATTRIBUTE; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_GetFile_From_Mac_Name */ + /* */ + /* <Description> */ + /* Return an FSSpec for the disk file containing the named font. */ + /* */ + /* <Input> */ + /* fontName :: Mac OS name of the font (e.g., Times New Roman */ + /* Bold). */ + /* */ + /* <Output> */ + /* pathSpec :: FSSpec to the file. For passing to */ + /* @FT_New_Face_From_FSSpec. */ + /* */ + /* face_index :: Index of the face. For passing to */ + /* @FT_New_Face_From_FSSpec. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_GetFile_From_Mac_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + FT_DEPRECATED_ATTRIBUTE; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_GetFile_From_Mac_ATS_Name */ + /* */ + /* <Description> */ + /* Return an FSSpec for the disk file containing the named font. */ + /* */ + /* <Input> */ + /* fontName :: Mac OS name of the font in ATS framework. */ + /* */ + /* <Output> */ + /* pathSpec :: FSSpec to the file. For passing to */ + /* @FT_New_Face_From_FSSpec. */ + /* */ + /* face_index :: Index of the face. For passing to */ + /* @FT_New_Face_From_FSSpec. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_GetFile_From_Mac_ATS_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + FT_DEPRECATED_ATTRIBUTE; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_GetFilePath_From_Mac_ATS_Name */ + /* */ + /* <Description> */ + /* Return a pathname of the disk file and face index for given font */ + /* name which is handled by ATS framework. */ + /* */ + /* <Input> */ + /* fontName :: Mac OS name of the font in ATS framework. */ + /* */ + /* <Output> */ + /* path :: Buffer to store pathname of the file. For passing */ + /* to @FT_New_Face. The client must allocate this */ + /* buffer before calling this function. */ + /* */ + /* maxPathSize :: Lengths of the buffer `path' that client allocated. */ + /* */ + /* face_index :: Index of the face. For passing to @FT_New_Face. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_GetFilePath_From_Mac_ATS_Name( const char* fontName, + UInt8* path, + UInt32 maxPathSize, + FT_Long* face_index ) + FT_DEPRECATED_ATTRIBUTE; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Face_From_FSSpec */ + /* */ + /* <Description> */ + /* Create a new face object from a given resource and typeface index */ + /* using an FSSpec to the font file. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* spec :: FSSpec to the font file. */ + /* */ + /* face_index :: The index of the face within the resource. The */ + /* first face has index~0. */ + /* <Output> */ + /* aface :: A handle to a new face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* @FT_New_Face_From_FSSpec is identical to @FT_New_Face except */ + /* it accepts an FSSpec instead of a path. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Face_From_FSSpec( FT_Library library, + const FSSpec *spec, + FT_Long face_index, + FT_Face *aface ) + FT_DEPRECATED_ATTRIBUTE; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Face_From_FSRef */ + /* */ + /* <Description> */ + /* Create a new face object from a given resource and typeface index */ + /* using an FSRef to the font file. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* spec :: FSRef to the font file. */ + /* */ + /* face_index :: The index of the face within the resource. The */ + /* first face has index~0. */ + /* <Output> */ + /* aface :: A handle to a new face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* @FT_New_Face_From_FSRef is identical to @FT_New_Face except */ + /* it accepts an FSRef instead of a path. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Face_From_FSRef( FT_Library library, + const FSRef *ref, + FT_Long face_index, + FT_Face *aface ) + FT_DEPRECATED_ATTRIBUTE; + + /* */ + + +FT_END_HEADER + + +#endif /* __FTMAC_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftmm.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftmm.h new file mode 100644 index 00000000..3aefb9e4 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftmm.h @@ -0,0 +1,378 @@ +/***************************************************************************/ +/* */ +/* ftmm.h */ +/* */ +/* FreeType Multiple Master font interface (specification). */ +/* */ +/* Copyright 1996-2001, 2003, 2004, 2006, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTMM_H__ +#define __FTMM_H__ + + +#include <ft2build.h> +#include FT_TYPE1_TABLES_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* multiple_masters */ + /* */ + /* <Title> */ + /* Multiple Masters */ + /* */ + /* <Abstract> */ + /* How to manage Multiple Masters fonts. */ + /* */ + /* <Description> */ + /* The following types and functions are used to manage Multiple */ + /* Master fonts, i.e., the selection of specific design instances by */ + /* setting design axis coordinates. */ + /* */ + /* George Williams has extended this interface to make it work with */ + /* both Type~1 Multiple Masters fonts and GX distortable (var) */ + /* fonts. Some of these routines only work with MM fonts, others */ + /* will work with both types. They are similar enough that a */ + /* consistent interface makes sense. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_MM_Axis */ + /* */ + /* <Description> */ + /* A simple structure used to model a given axis in design space for */ + /* Multiple Masters fonts. */ + /* */ + /* This structure can't be used for GX var fonts. */ + /* */ + /* <Fields> */ + /* name :: The axis's name. */ + /* */ + /* minimum :: The axis's minimum design coordinate. */ + /* */ + /* maximum :: The axis's maximum design coordinate. */ + /* */ + typedef struct FT_MM_Axis_ + { + FT_String* name; + FT_Long minimum; + FT_Long maximum; + + } FT_MM_Axis; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Multi_Master */ + /* */ + /* <Description> */ + /* A structure used to model the axes and space of a Multiple Masters */ + /* font. */ + /* */ + /* This structure can't be used for GX var fonts. */ + /* */ + /* <Fields> */ + /* num_axis :: Number of axes. Cannot exceed~4. */ + /* */ + /* num_designs :: Number of designs; should be normally 2^num_axis */ + /* even though the Type~1 specification strangely */ + /* allows for intermediate designs to be present. This */ + /* number cannot exceed~16. */ + /* */ + /* axis :: A table of axis descriptors. */ + /* */ + typedef struct FT_Multi_Master_ + { + FT_UInt num_axis; + FT_UInt num_designs; + FT_MM_Axis axis[T1_MAX_MM_AXIS]; + + } FT_Multi_Master; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Var_Axis */ + /* */ + /* <Description> */ + /* A simple structure used to model a given axis in design space for */ + /* Multiple Masters and GX var fonts. */ + /* */ + /* <Fields> */ + /* name :: The axis's name. */ + /* Not always meaningful for GX. */ + /* */ + /* minimum :: The axis's minimum design coordinate. */ + /* */ + /* def :: The axis's default design coordinate. */ + /* FreeType computes meaningful default values for MM; it */ + /* is then an integer value, not in 16.16 format. */ + /* */ + /* maximum :: The axis's maximum design coordinate. */ + /* */ + /* tag :: The axis's tag (the GX equivalent to `name'). */ + /* FreeType provides default values for MM if possible. */ + /* */ + /* strid :: The entry in `name' table (another GX version of */ + /* `name'). */ + /* Not meaningful for MM. */ + /* */ + typedef struct FT_Var_Axis_ + { + FT_String* name; + + FT_Fixed minimum; + FT_Fixed def; + FT_Fixed maximum; + + FT_ULong tag; + FT_UInt strid; + + } FT_Var_Axis; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Var_Named_Style */ + /* */ + /* <Description> */ + /* A simple structure used to model a named style in a GX var font. */ + /* */ + /* This structure can't be used for MM fonts. */ + /* */ + /* <Fields> */ + /* coords :: The design coordinates for this style. */ + /* This is an array with one entry for each axis. */ + /* */ + /* strid :: The entry in `name' table identifying this style. */ + /* */ + typedef struct FT_Var_Named_Style_ + { + FT_Fixed* coords; + FT_UInt strid; + + } FT_Var_Named_Style; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_MM_Var */ + /* */ + /* <Description> */ + /* A structure used to model the axes and space of a Multiple Masters */ + /* or GX var distortable font. */ + /* */ + /* Some fields are specific to one format and not to the other. */ + /* */ + /* <Fields> */ + /* num_axis :: The number of axes. The maximum value is~4 for */ + /* MM; no limit in GX. */ + /* */ + /* num_designs :: The number of designs; should be normally */ + /* 2^num_axis for MM fonts. Not meaningful for GX */ + /* (where every glyph could have a different */ + /* number of designs). */ + /* */ + /* num_namedstyles :: The number of named styles; only meaningful for */ + /* GX which allows certain design coordinates to */ + /* have a string ID (in the `name' table) */ + /* associated with them. The font can tell the */ + /* user that, for example, Weight=1.5 is `Bold'. */ + /* */ + /* axis :: A table of axis descriptors. */ + /* GX fonts contain slightly more data than MM. */ + /* */ + /* namedstyles :: A table of named styles. */ + /* Only meaningful with GX. */ + /* */ + typedef struct FT_MM_Var_ + { + FT_UInt num_axis; + FT_UInt num_designs; + FT_UInt num_namedstyles; + FT_Var_Axis* axis; + FT_Var_Named_Style* namedstyle; + + } FT_MM_Var; + + + /* */ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Multi_Master */ + /* */ + /* <Description> */ + /* Retrieve the Multiple Master descriptor of a given font. */ + /* */ + /* This function can't be used with GX fonts. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face. */ + /* */ + /* <Output> */ + /* amaster :: The Multiple Masters descriptor. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Multi_Master( FT_Face face, + FT_Multi_Master *amaster ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_MM_Var */ + /* */ + /* <Description> */ + /* Retrieve the Multiple Master/GX var descriptor of a given font. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face. */ + /* */ + /* <Output> */ + /* amaster :: The Multiple Masters/GX var descriptor. */ + /* Allocates a data structure, which the user must free */ + /* (a single call to FT_FREE will do it). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_MM_Var( FT_Face face, + FT_MM_Var* *amaster ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_MM_Design_Coordinates */ + /* */ + /* <Description> */ + /* For Multiple Masters fonts, choose an interpolated font design */ + /* through design coordinates. */ + /* */ + /* This function can't be used with GX fonts. */ + /* */ + /* <InOut> */ + /* face :: A handle to the source face. */ + /* */ + /* <Input> */ + /* num_coords :: The number of design coordinates (must be equal to */ + /* the number of axes in the font). */ + /* */ + /* coords :: An array of design coordinates. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_MM_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Var_Design_Coordinates */ + /* */ + /* <Description> */ + /* For Multiple Master or GX Var fonts, choose an interpolated font */ + /* design through design coordinates. */ + /* */ + /* <InOut> */ + /* face :: A handle to the source face. */ + /* */ + /* <Input> */ + /* num_coords :: The number of design coordinates (must be equal to */ + /* the number of axes in the font). */ + /* */ + /* coords :: An array of design coordinates. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_Var_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_MM_Blend_Coordinates */ + /* */ + /* <Description> */ + /* For Multiple Masters and GX var fonts, choose an interpolated font */ + /* design through normalized blend coordinates. */ + /* */ + /* <InOut> */ + /* face :: A handle to the source face. */ + /* */ + /* <Input> */ + /* num_coords :: The number of design coordinates (must be equal to */ + /* the number of axes in the font). */ + /* */ + /* coords :: The design coordinates array (each element must be */ + /* between 0 and 1.0). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_MM_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Var_Blend_Coordinates */ + /* */ + /* <Description> */ + /* This is another name of @FT_Set_MM_Blend_Coordinates. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_Var_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTMM_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftmodapi.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftmodapi.h new file mode 100644 index 00000000..8f2e0179 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftmodapi.h @@ -0,0 +1,483 @@ +/***************************************************************************/ +/* */ +/* ftmodapi.h */ +/* */ +/* FreeType modules public interface (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2006, 2008, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTMODAPI_H__ +#define __FTMODAPI_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* module_management */ + /* */ + /* <Title> */ + /* Module Management */ + /* */ + /* <Abstract> */ + /* How to add, upgrade, and remove modules from FreeType. */ + /* */ + /* <Description> */ + /* The definitions below are used to manage modules within FreeType. */ + /* Modules can be added, upgraded, and removed at runtime. */ + /* */ + /*************************************************************************/ + + + /* module bit flags */ +#define FT_MODULE_FONT_DRIVER 1 /* this module is a font driver */ +#define FT_MODULE_RENDERER 2 /* this module is a renderer */ +#define FT_MODULE_HINTER 4 /* this module is a glyph hinter */ +#define FT_MODULE_STYLER 8 /* this module is a styler */ + +#define FT_MODULE_DRIVER_SCALABLE 0x100 /* the driver supports */ + /* scalable fonts */ +#define FT_MODULE_DRIVER_NO_OUTLINES 0x200 /* the driver does not */ + /* support vector outlines */ +#define FT_MODULE_DRIVER_HAS_HINTER 0x400 /* the driver provides its */ + /* own hinter */ + + + /* deprecated values */ +#define ft_module_font_driver FT_MODULE_FONT_DRIVER +#define ft_module_renderer FT_MODULE_RENDERER +#define ft_module_hinter FT_MODULE_HINTER +#define ft_module_styler FT_MODULE_STYLER + +#define ft_module_driver_scalable FT_MODULE_DRIVER_SCALABLE +#define ft_module_driver_no_outlines FT_MODULE_DRIVER_NO_OUTLINES +#define ft_module_driver_has_hinter FT_MODULE_DRIVER_HAS_HINTER + + + typedef FT_Pointer FT_Module_Interface; + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Module_Constructor */ + /* */ + /* <Description> */ + /* A function used to initialize (not create) a new module object. */ + /* */ + /* <Input> */ + /* module :: The module to initialize. */ + /* */ + typedef FT_Error + (*FT_Module_Constructor)( FT_Module module ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Module_Destructor */ + /* */ + /* <Description> */ + /* A function used to finalize (not destroy) a given module object. */ + /* */ + /* <Input> */ + /* module :: The module to finalize. */ + /* */ + typedef void + (*FT_Module_Destructor)( FT_Module module ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Module_Requester */ + /* */ + /* <Description> */ + /* A function used to query a given module for a specific interface. */ + /* */ + /* <Input> */ + /* module :: The module to finalize. */ + /* */ + /* name :: The name of the interface in the module. */ + /* */ + typedef FT_Module_Interface + (*FT_Module_Requester)( FT_Module module, + const char* name ); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Module_Class */ + /* */ + /* <Description> */ + /* The module class descriptor. */ + /* */ + /* <Fields> */ + /* module_flags :: Bit flags describing the module. */ + /* */ + /* module_size :: The size of one module object/instance in */ + /* bytes. */ + /* */ + /* module_name :: The name of the module. */ + /* */ + /* module_version :: The version, as a 16.16 fixed number */ + /* (major.minor). */ + /* */ + /* module_requires :: The version of FreeType this module requires, */ + /* as a 16.16 fixed number (major.minor). Starts */ + /* at version 2.0, i.e., 0x20000. */ + /* */ + /* module_init :: The initializing function. */ + /* */ + /* module_done :: The finalizing function. */ + /* */ + /* get_interface :: The interface requesting function. */ + /* */ + typedef struct FT_Module_Class_ + { + FT_ULong module_flags; + FT_Long module_size; + const FT_String* module_name; + FT_Fixed module_version; + FT_Fixed module_requires; + + const void* module_interface; + + FT_Module_Constructor module_init; + FT_Module_Destructor module_done; + FT_Module_Requester get_interface; + + } FT_Module_Class; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Add_Module */ + /* */ + /* <Description> */ + /* Add a new module to a given library instance. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library object. */ + /* */ + /* <Input> */ + /* clazz :: A pointer to class descriptor for the module. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* An error will be returned if a module already exists by that name, */ + /* or if the module requires a version of FreeType that is too great. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Add_Module( FT_Library library, + const FT_Module_Class* clazz ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Module */ + /* */ + /* <Description> */ + /* Find a module by its name. */ + /* */ + /* <Input> */ + /* library :: A handle to the library object. */ + /* */ + /* module_name :: The module's name (as an ASCII string). */ + /* */ + /* <Return> */ + /* A module handle. 0~if none was found. */ + /* */ + /* <Note> */ + /* FreeType's internal modules aren't documented very well, and you */ + /* should look up the source code for details. */ + /* */ + FT_EXPORT( FT_Module ) + FT_Get_Module( FT_Library library, + const char* module_name ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Remove_Module */ + /* */ + /* <Description> */ + /* Remove a given module from a library instance. */ + /* */ + /* <InOut> */ + /* library :: A handle to a library object. */ + /* */ + /* <Input> */ + /* module :: A handle to a module object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The module object is destroyed by the function in case of success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Remove_Module( FT_Library library, + FT_Module module ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Reference_Library */ + /* */ + /* <Description> */ + /* A counter gets initialized to~1 at the time an @FT_Library */ + /* structure is created. This function increments the counter. */ + /* @FT_Done_Library then only destroys a library if the counter is~1, */ + /* otherwise it simply decrements the counter. */ + /* */ + /* This function helps in managing life-cycles of structures which */ + /* reference @FT_Library objects. */ + /* */ + /* <Input> */ + /* library :: A handle to a target library object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Since> */ + /* 2.4.2 */ + /* */ + FT_EXPORT( FT_Error ) + FT_Reference_Library( FT_Library library ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Library */ + /* */ + /* <Description> */ + /* This function is used to create a new FreeType library instance */ + /* from a given memory object. It is thus possible to use libraries */ + /* with distinct memory allocators within the same program. */ + /* */ + /* Normally, you would call this function (followed by a call to */ + /* @FT_Add_Default_Modules or a series of calls to @FT_Add_Module) */ + /* instead of @FT_Init_FreeType to initialize the FreeType library. */ + /* */ + /* Don't use @FT_Done_FreeType but @FT_Done_Library to destroy a */ + /* library instance. */ + /* */ + /* <Input> */ + /* memory :: A handle to the original memory object. */ + /* */ + /* <Output> */ + /* alibrary :: A pointer to handle of a new library object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* See the discussion of reference counters in the description of */ + /* @FT_Reference_Library. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Library( FT_Memory memory, + FT_Library *alibrary ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_Library */ + /* */ + /* <Description> */ + /* Discard a given library object. This closes all drivers and */ + /* discards all resource objects. */ + /* */ + /* <Input> */ + /* library :: A handle to the target library. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* See the discussion of reference counters in the description of */ + /* @FT_Reference_Library. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Done_Library( FT_Library library ); + +/* */ + + typedef void + (*FT_DebugHook_Func)( void* arg ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Debug_Hook */ + /* */ + /* <Description> */ + /* Set a debug hook function for debugging the interpreter of a font */ + /* format. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library object. */ + /* */ + /* <Input> */ + /* hook_index :: The index of the debug hook. You should use the */ + /* values defined in `ftobjs.h', e.g., */ + /* `FT_DEBUG_HOOK_TRUETYPE'. */ + /* */ + /* debug_hook :: The function used to debug the interpreter. */ + /* */ + /* <Note> */ + /* Currently, four debug hook slots are available, but only two (for */ + /* the TrueType and the Type~1 interpreter) are defined. */ + /* */ + /* Since the internal headers of FreeType are no longer installed, */ + /* the symbol `FT_DEBUG_HOOK_TRUETYPE' isn't available publicly. */ + /* This is a bug and will be fixed in a forthcoming release. */ + /* */ + FT_EXPORT( void ) + FT_Set_Debug_Hook( FT_Library library, + FT_UInt hook_index, + FT_DebugHook_Func debug_hook ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Add_Default_Modules */ + /* */ + /* <Description> */ + /* Add the set of default drivers to a given library object. */ + /* This is only useful when you create a library object with */ + /* @FT_New_Library (usually to plug a custom memory manager). */ + /* */ + /* <InOut> */ + /* library :: A handle to a new library object. */ + /* */ + FT_EXPORT( void ) + FT_Add_Default_Modules( FT_Library library ); + + + + /************************************************************************** + * + * @section: + * truetype_engine + * + * @title: + * The TrueType Engine + * + * @abstract: + * TrueType bytecode support. + * + * @description: + * This section contains a function used to query the level of TrueType + * bytecode support compiled in this version of the library. + * + */ + + + /************************************************************************** + * + * @enum: + * FT_TrueTypeEngineType + * + * @description: + * A list of values describing which kind of TrueType bytecode + * engine is implemented in a given FT_Library instance. It is used + * by the @FT_Get_TrueType_Engine_Type function. + * + * @values: + * FT_TRUETYPE_ENGINE_TYPE_NONE :: + * The library doesn't implement any kind of bytecode interpreter. + * + * FT_TRUETYPE_ENGINE_TYPE_UNPATENTED :: + * The library implements a bytecode interpreter that doesn't + * support the patented operations of the TrueType virtual machine. + * + * Its main use is to load certain Asian fonts which position and + * scale glyph components with bytecode instructions. It produces + * bad output for most other fonts. + * + * FT_TRUETYPE_ENGINE_TYPE_PATENTED :: + * The library implements a bytecode interpreter that covers + * the full instruction set of the TrueType virtual machine (this + * was governed by patents until May 2010, hence the name). + * + * @since: + * 2.2 + * + */ + typedef enum FT_TrueTypeEngineType_ + { + FT_TRUETYPE_ENGINE_TYPE_NONE = 0, + FT_TRUETYPE_ENGINE_TYPE_UNPATENTED, + FT_TRUETYPE_ENGINE_TYPE_PATENTED + + } FT_TrueTypeEngineType; + + + /************************************************************************** + * + * @func: + * FT_Get_TrueType_Engine_Type + * + * @description: + * Return an @FT_TrueTypeEngineType value to indicate which level of + * the TrueType virtual machine a given library instance supports. + * + * @input: + * library :: + * A library instance. + * + * @return: + * A value indicating which level is supported. + * + * @since: + * 2.2 + * + */ + FT_EXPORT( FT_TrueTypeEngineType ) + FT_Get_TrueType_Engine_Type( FT_Library library ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTMODAPI_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftmoderr.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftmoderr.h new file mode 100644 index 00000000..b0115dd0 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftmoderr.h @@ -0,0 +1,155 @@ +/***************************************************************************/ +/* */ +/* ftmoderr.h */ +/* */ +/* FreeType module error offsets (specification). */ +/* */ +/* Copyright 2001, 2002, 2003, 2004, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the FreeType module error offsets. */ + /* */ + /* The lower byte gives the error code, the higher byte gives the */ + /* module. The base module has error offset 0. For example, the error */ + /* `FT_Err_Invalid_File_Format' has value 0x003, the error */ + /* `TT_Err_Invalid_File_Format' has value 0x1103, the error */ + /* `T1_Err_Invalid_File_Format' has value 0x1203, etc. */ + /* */ + /* Undefine the macro FT_CONFIG_OPTION_USE_MODULE_ERRORS in ftoption.h */ + /* to make the higher byte always zero (disabling the module error */ + /* mechanism). */ + /* */ + /* It can also be used to create a module error message table easily */ + /* with something like */ + /* */ + /* { */ + /* #undef __FTMODERR_H__ */ + /* #define FT_MODERRDEF( e, v, s ) { FT_Mod_Err_ ## e, s }, */ + /* #define FT_MODERR_START_LIST { */ + /* #define FT_MODERR_END_LIST { 0, 0 } }; */ + /* */ + /* const struct */ + /* { */ + /* int mod_err_offset; */ + /* const char* mod_err_msg */ + /* } ft_mod_errors[] = */ + /* */ + /* #include FT_MODULE_ERRORS_H */ + /* } */ + /* */ + /* To use such a table, all errors must be ANDed with 0xFF00 to remove */ + /* the error code. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTMODERR_H__ +#define __FTMODERR_H__ + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** SETUP MACROS *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#undef FT_NEED_EXTERN_C + +#ifndef FT_MODERRDEF + +#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS +#define FT_MODERRDEF( e, v, s ) FT_Mod_Err_ ## e = v, +#else +#define FT_MODERRDEF( e, v, s ) FT_Mod_Err_ ## e = 0, +#endif + +#define FT_MODERR_START_LIST enum { +#define FT_MODERR_END_LIST FT_Mod_Err_Max }; + +#ifdef __cplusplus +#define FT_NEED_EXTERN_C + extern "C" { +#endif + +#endif /* !FT_MODERRDEF */ + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** LIST MODULE ERROR BASES *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#ifdef FT_MODERR_START_LIST + FT_MODERR_START_LIST +#endif + + + FT_MODERRDEF( Base, 0x000, "base module" ) + FT_MODERRDEF( Autofit, 0x100, "autofitter module" ) + FT_MODERRDEF( BDF, 0x200, "BDF module" ) + FT_MODERRDEF( Cache, 0x300, "cache module" ) + FT_MODERRDEF( CFF, 0x400, "CFF module" ) + FT_MODERRDEF( CID, 0x500, "CID module" ) + FT_MODERRDEF( Gzip, 0x600, "Gzip module" ) + FT_MODERRDEF( LZW, 0x700, "LZW module" ) + FT_MODERRDEF( OTvalid, 0x800, "OpenType validation module" ) + FT_MODERRDEF( PCF, 0x900, "PCF module" ) + FT_MODERRDEF( PFR, 0xA00, "PFR module" ) + FT_MODERRDEF( PSaux, 0xB00, "PS auxiliary module" ) + FT_MODERRDEF( PShinter, 0xC00, "PS hinter module" ) + FT_MODERRDEF( PSnames, 0xD00, "PS names module" ) + FT_MODERRDEF( Raster, 0xE00, "raster module" ) + FT_MODERRDEF( SFNT, 0xF00, "SFNT module" ) + FT_MODERRDEF( Smooth, 0x1000, "smooth raster module" ) + FT_MODERRDEF( TrueType, 0x1100, "TrueType module" ) + FT_MODERRDEF( Type1, 0x1200, "Type 1 module" ) + FT_MODERRDEF( Type42, 0x1300, "Type 42 module" ) + FT_MODERRDEF( Winfonts, 0x1400, "Windows FON/FNT module" ) + + +#ifdef FT_MODERR_END_LIST + FT_MODERR_END_LIST +#endif + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** CLEANUP *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#ifdef FT_NEED_EXTERN_C + } +#endif + +#undef FT_MODERR_START_LIST +#undef FT_MODERR_END_LIST +#undef FT_MODERRDEF +#undef FT_NEED_EXTERN_C + + +#endif /* __FTMODERR_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftotval.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftotval.h new file mode 100644 index 00000000..027f2e88 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftotval.h @@ -0,0 +1,203 @@ +/***************************************************************************/ +/* */ +/* ftotval.h */ +/* */ +/* FreeType API for validating OpenType tables (specification). */ +/* */ +/* Copyright 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* */ +/* Warning: This module might be moved to a different library in the */ +/* future to avoid a tight dependency between FreeType and the */ +/* OpenType specification. */ +/* */ +/* */ +/***************************************************************************/ + + +#ifndef __FTOTVAL_H__ +#define __FTOTVAL_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* ot_validation */ + /* */ + /* <Title> */ + /* OpenType Validation */ + /* */ + /* <Abstract> */ + /* An API to validate OpenType tables. */ + /* */ + /* <Description> */ + /* This section contains the declaration of functions to validate */ + /* some OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH). */ + /* */ + /*************************************************************************/ + + + /********************************************************************** + * + * @enum: + * FT_VALIDATE_OTXXX + * + * @description: + * A list of bit-field constants used with @FT_OpenType_Validate to + * indicate which OpenType tables should be validated. + * + * @values: + * FT_VALIDATE_BASE :: + * Validate BASE table. + * + * FT_VALIDATE_GDEF :: + * Validate GDEF table. + * + * FT_VALIDATE_GPOS :: + * Validate GPOS table. + * + * FT_VALIDATE_GSUB :: + * Validate GSUB table. + * + * FT_VALIDATE_JSTF :: + * Validate JSTF table. + * + * FT_VALIDATE_MATH :: + * Validate MATH table. + * + * FT_VALIDATE_OT :: + * Validate all OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH). + * + */ +#define FT_VALIDATE_BASE 0x0100 +#define FT_VALIDATE_GDEF 0x0200 +#define FT_VALIDATE_GPOS 0x0400 +#define FT_VALIDATE_GSUB 0x0800 +#define FT_VALIDATE_JSTF 0x1000 +#define FT_VALIDATE_MATH 0x2000 + +#define FT_VALIDATE_OT FT_VALIDATE_BASE | \ + FT_VALIDATE_GDEF | \ + FT_VALIDATE_GPOS | \ + FT_VALIDATE_GSUB | \ + FT_VALIDATE_JSTF | \ + FT_VALIDATE_MATH + + /* */ + + /********************************************************************** + * + * @function: + * FT_OpenType_Validate + * + * @description: + * Validate various OpenType tables to assure that all offsets and + * indices are valid. The idea is that a higher-level library which + * actually does the text layout can access those tables without + * error checking (which can be quite time consuming). + * + * @input: + * face :: + * A handle to the input face. + * + * validation_flags :: + * A bit field which specifies the tables to be validated. See + * @FT_VALIDATE_OTXXX for possible values. + * + * @output: + * BASE_table :: + * A pointer to the BASE table. + * + * GDEF_table :: + * A pointer to the GDEF table. + * + * GPOS_table :: + * A pointer to the GPOS table. + * + * GSUB_table :: + * A pointer to the GSUB table. + * + * JSTF_table :: + * A pointer to the JSTF table. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with OpenType fonts, returning an error + * otherwise. + * + * After use, the application should deallocate the five tables with + * @FT_OpenType_Free. A NULL value indicates that the table either + * doesn't exist in the font, or the application hasn't asked for + * validation. + */ + FT_EXPORT( FT_Error ) + FT_OpenType_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes *BASE_table, + FT_Bytes *GDEF_table, + FT_Bytes *GPOS_table, + FT_Bytes *GSUB_table, + FT_Bytes *JSTF_table ); + + /* */ + + /********************************************************************** + * + * @function: + * FT_OpenType_Free + * + * @description: + * Free the buffer allocated by OpenType validator. + * + * @input: + * face :: + * A handle to the input face. + * + * table :: + * The pointer to the buffer that is allocated by + * @FT_OpenType_Validate. + * + * @note: + * This function must be used to free the buffer allocated by + * @FT_OpenType_Validate only. + */ + FT_EXPORT( void ) + FT_OpenType_Free( FT_Face face, + FT_Bytes table ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTOTVAL_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftoutln.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftoutln.h new file mode 100644 index 00000000..2829a05c --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftoutln.h @@ -0,0 +1,537 @@ +/***************************************************************************/ +/* */ +/* ftoutln.h */ +/* */ +/* Support for the FT_Outline type used to store glyph shapes of */ +/* most scalable font formats (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2005, 2006, 2007, 2008, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTOUTLN_H__ +#define __FTOUTLN_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* outline_processing */ + /* */ + /* <Title> */ + /* Outline Processing */ + /* */ + /* <Abstract> */ + /* Functions to create, transform, and render vectorial glyph images. */ + /* */ + /* <Description> */ + /* This section contains routines used to create and destroy scalable */ + /* glyph images known as `outlines'. These can also be measured, */ + /* transformed, and converted into bitmaps and pixmaps. */ + /* */ + /* <Order> */ + /* FT_Outline */ + /* FT_OUTLINE_FLAGS */ + /* FT_Outline_New */ + /* FT_Outline_Done */ + /* FT_Outline_Copy */ + /* FT_Outline_Translate */ + /* FT_Outline_Transform */ + /* FT_Outline_Embolden */ + /* FT_Outline_Reverse */ + /* FT_Outline_Check */ + /* */ + /* FT_Outline_Get_CBox */ + /* FT_Outline_Get_BBox */ + /* */ + /* FT_Outline_Get_Bitmap */ + /* FT_Outline_Render */ + /* */ + /* FT_Outline_Decompose */ + /* FT_Outline_Funcs */ + /* FT_Outline_MoveTo_Func */ + /* FT_Outline_LineTo_Func */ + /* FT_Outline_ConicTo_Func */ + /* FT_Outline_CubicTo_Func */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Decompose */ + /* */ + /* <Description> */ + /* Walk over an outline's structure to decompose it into individual */ + /* segments and Bézier arcs. This function also emits `move to' */ + /* operations to indicate the start of new contours in the outline. */ + /* */ + /* <Input> */ + /* outline :: A pointer to the source target. */ + /* */ + /* func_interface :: A table of `emitters', i.e., function pointers */ + /* called during decomposition to indicate path */ + /* operations. */ + /* */ + /* <InOut> */ + /* user :: A typeless pointer which is passed to each */ + /* emitter during the decomposition. It can be */ + /* used to store the state during the */ + /* decomposition. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Decompose( FT_Outline* outline, + const FT_Outline_Funcs* func_interface, + void* user ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_New */ + /* */ + /* <Description> */ + /* Create a new outline of a given size. */ + /* */ + /* <Input> */ + /* library :: A handle to the library object from where the */ + /* outline is allocated. Note however that the new */ + /* outline will *not* necessarily be *freed*, when */ + /* destroying the library, by @FT_Done_FreeType. */ + /* */ + /* numPoints :: The maximal number of points within the outline. */ + /* */ + /* numContours :: The maximal number of contours within the outline. */ + /* */ + /* <Output> */ + /* anoutline :: A handle to the new outline. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The reason why this function takes a `library' parameter is simply */ + /* to use the library's memory allocator. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_New( FT_Library library, + FT_UInt numPoints, + FT_Int numContours, + FT_Outline *anoutline ); + + + FT_EXPORT( FT_Error ) + FT_Outline_New_Internal( FT_Memory memory, + FT_UInt numPoints, + FT_Int numContours, + FT_Outline *anoutline ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Done */ + /* */ + /* <Description> */ + /* Destroy an outline created with @FT_Outline_New. */ + /* */ + /* <Input> */ + /* library :: A handle of the library object used to allocate the */ + /* outline. */ + /* */ + /* outline :: A pointer to the outline object to be discarded. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* If the outline's `owner' field is not set, only the outline */ + /* descriptor will be released. */ + /* */ + /* The reason why this function takes an `library' parameter is */ + /* simply to use ft_mem_free(). */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Done( FT_Library library, + FT_Outline* outline ); + + + FT_EXPORT( FT_Error ) + FT_Outline_Done_Internal( FT_Memory memory, + FT_Outline* outline ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Check */ + /* */ + /* <Description> */ + /* Check the contents of an outline descriptor. */ + /* */ + /* <Input> */ + /* outline :: A handle to a source outline. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Check( FT_Outline* outline ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Get_CBox */ + /* */ + /* <Description> */ + /* Return an outline's `control box'. The control box encloses all */ + /* the outline's points, including Bézier control points. Though it */ + /* coincides with the exact bounding box for most glyphs, it can be */ + /* slightly larger in some situations (like when rotating an outline */ + /* which contains Bézier outside arcs). */ + /* */ + /* Computing the control box is very fast, while getting the bounding */ + /* box can take much more time as it needs to walk over all segments */ + /* and arcs in the outline. To get the latter, you can use the */ + /* `ftbbox' component which is dedicated to this single task. */ + /* */ + /* <Input> */ + /* outline :: A pointer to the source outline descriptor. */ + /* */ + /* <Output> */ + /* acbox :: The outline's control box. */ + /* */ + FT_EXPORT( void ) + FT_Outline_Get_CBox( const FT_Outline* outline, + FT_BBox *acbox ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Translate */ + /* */ + /* <Description> */ + /* Apply a simple translation to the points of an outline. */ + /* */ + /* <InOut> */ + /* outline :: A pointer to the target outline descriptor. */ + /* */ + /* <Input> */ + /* xOffset :: The horizontal offset. */ + /* */ + /* yOffset :: The vertical offset. */ + /* */ + FT_EXPORT( void ) + FT_Outline_Translate( const FT_Outline* outline, + FT_Pos xOffset, + FT_Pos yOffset ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Copy */ + /* */ + /* <Description> */ + /* Copy an outline into another one. Both objects must have the */ + /* same sizes (number of points & number of contours) when this */ + /* function is called. */ + /* */ + /* <Input> */ + /* source :: A handle to the source outline. */ + /* */ + /* <Output> */ + /* target :: A handle to the target outline. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Copy( const FT_Outline* source, + FT_Outline *target ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Transform */ + /* */ + /* <Description> */ + /* Apply a simple 2x2 matrix to all of an outline's points. Useful */ + /* for applying rotations, slanting, flipping, etc. */ + /* */ + /* <InOut> */ + /* outline :: A pointer to the target outline descriptor. */ + /* */ + /* <Input> */ + /* matrix :: A pointer to the transformation matrix. */ + /* */ + /* <Note> */ + /* You can use @FT_Outline_Translate if you need to translate the */ + /* outline's points. */ + /* */ + FT_EXPORT( void ) + FT_Outline_Transform( const FT_Outline* outline, + const FT_Matrix* matrix ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Embolden */ + /* */ + /* <Description> */ + /* Embolden an outline. The new outline will be at most 4~times */ + /* `strength' pixels wider and higher. You may think of the left and */ + /* bottom borders as unchanged. */ + /* */ + /* Negative `strength' values to reduce the outline thickness are */ + /* possible also. */ + /* */ + /* <InOut> */ + /* outline :: A handle to the target outline. */ + /* */ + /* <Input> */ + /* strength :: How strong the glyph is emboldened. Expressed in */ + /* 26.6 pixel format. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The used algorithm to increase or decrease the thickness of the */ + /* glyph doesn't change the number of points; this means that certain */ + /* situations like acute angles or intersections are sometimes */ + /* handled incorrectly. */ + /* */ + /* If you need `better' metrics values you should call */ + /* @FT_Outline_Get_CBox ot @FT_Outline_Get_BBox. */ + /* */ + /* Example call: */ + /* */ + /* { */ + /* FT_Load_Glyph( face, index, FT_LOAD_DEFAULT ); */ + /* if ( face->slot->format == FT_GLYPH_FORMAT_OUTLINE ) */ + /* FT_Outline_Embolden( &face->slot->outline, strength ); */ + /* } */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Embolden( FT_Outline* outline, + FT_Pos strength ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Reverse */ + /* */ + /* <Description> */ + /* Reverse the drawing direction of an outline. This is used to */ + /* ensure consistent fill conventions for mirrored glyphs. */ + /* */ + /* <InOut> */ + /* outline :: A pointer to the target outline descriptor. */ + /* */ + /* <Note> */ + /* This function toggles the bit flag @FT_OUTLINE_REVERSE_FILL in */ + /* the outline's `flags' field. */ + /* */ + /* It shouldn't be used by a normal client application, unless it */ + /* knows what it is doing. */ + /* */ + FT_EXPORT( void ) + FT_Outline_Reverse( FT_Outline* outline ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Get_Bitmap */ + /* */ + /* <Description> */ + /* Render an outline within a bitmap. The outline's image is simply */ + /* OR-ed to the target bitmap. */ + /* */ + /* <Input> */ + /* library :: A handle to a FreeType library object. */ + /* */ + /* outline :: A pointer to the source outline descriptor. */ + /* */ + /* <InOut> */ + /* abitmap :: A pointer to the target bitmap descriptor. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* This function does NOT CREATE the bitmap, it only renders an */ + /* outline image within the one you pass to it! Consequently, the */ + /* various fields in `abitmap' should be set accordingly. */ + /* */ + /* It will use the raster corresponding to the default glyph format. */ + /* */ + /* The value of the `num_grays' field in `abitmap' is ignored. If */ + /* you select the gray-level rasterizer, and you want less than 256 */ + /* gray levels, you have to use @FT_Outline_Render directly. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Get_Bitmap( FT_Library library, + FT_Outline* outline, + const FT_Bitmap *abitmap ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Render */ + /* */ + /* <Description> */ + /* Render an outline within a bitmap using the current scan-convert. */ + /* This function uses an @FT_Raster_Params structure as an argument, */ + /* allowing advanced features like direct composition, translucency, */ + /* etc. */ + /* */ + /* <Input> */ + /* library :: A handle to a FreeType library object. */ + /* */ + /* outline :: A pointer to the source outline descriptor. */ + /* */ + /* <InOut> */ + /* params :: A pointer to an @FT_Raster_Params structure used to */ + /* describe the rendering operation. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* You should know what you are doing and how @FT_Raster_Params works */ + /* to use this function. */ + /* */ + /* The field `params.source' will be set to `outline' before the scan */ + /* converter is called, which means that the value you give to it is */ + /* actually ignored. */ + /* */ + /* The gray-level rasterizer always uses 256 gray levels. If you */ + /* want less gray levels, you have to provide your own span callback. */ + /* See the @FT_RASTER_FLAG_DIRECT value of the `flags' field in the */ + /* @FT_Raster_Params structure for more details. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Render( FT_Library library, + FT_Outline* outline, + FT_Raster_Params* params ); + + + /************************************************************************** + * + * @enum: + * FT_Orientation + * + * @description: + * A list of values used to describe an outline's contour orientation. + * + * The TrueType and PostScript specifications use different conventions + * to determine whether outline contours should be filled or unfilled. + * + * @values: + * FT_ORIENTATION_TRUETYPE :: + * According to the TrueType specification, clockwise contours must + * be filled, and counter-clockwise ones must be unfilled. + * + * FT_ORIENTATION_POSTSCRIPT :: + * According to the PostScript specification, counter-clockwise contours + * must be filled, and clockwise ones must be unfilled. + * + * FT_ORIENTATION_FILL_RIGHT :: + * This is identical to @FT_ORIENTATION_TRUETYPE, but is used to + * remember that in TrueType, everything that is to the right of + * the drawing direction of a contour must be filled. + * + * FT_ORIENTATION_FILL_LEFT :: + * This is identical to @FT_ORIENTATION_POSTSCRIPT, but is used to + * remember that in PostScript, everything that is to the left of + * the drawing direction of a contour must be filled. + * + * FT_ORIENTATION_NONE :: + * The orientation cannot be determined. That is, different parts of + * the glyph have different orientation. + * + */ + typedef enum FT_Orientation_ + { + FT_ORIENTATION_TRUETYPE = 0, + FT_ORIENTATION_POSTSCRIPT = 1, + FT_ORIENTATION_FILL_RIGHT = FT_ORIENTATION_TRUETYPE, + FT_ORIENTATION_FILL_LEFT = FT_ORIENTATION_POSTSCRIPT, + FT_ORIENTATION_NONE + + } FT_Orientation; + + + /************************************************************************** + * + * @function: + * FT_Outline_Get_Orientation + * + * @description: + * This function analyzes a glyph outline and tries to compute its + * fill orientation (see @FT_Orientation). This is done by computing + * the direction of each global horizontal and/or vertical extrema + * within the outline. + * + * Note that this will return @FT_ORIENTATION_TRUETYPE for empty + * outlines. + * + * @input: + * outline :: + * A handle to the source outline. + * + * @return: + * The orientation. + * + */ + FT_EXPORT( FT_Orientation ) + FT_Outline_Get_Orientation( FT_Outline* outline ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTOUTLN_H__ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftpfr.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftpfr.h new file mode 100644 index 00000000..0b7b7d42 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftpfr.h @@ -0,0 +1,172 @@ +/***************************************************************************/ +/* */ +/* ftpfr.h */ +/* */ +/* FreeType API for accessing PFR-specific data (specification only). */ +/* */ +/* Copyright 2002, 2003, 2004, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTPFR_H__ +#define __FTPFR_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* pfr_fonts */ + /* */ + /* <Title> */ + /* PFR Fonts */ + /* */ + /* <Abstract> */ + /* PFR/TrueDoc specific API. */ + /* */ + /* <Description> */ + /* This section contains the declaration of PFR-specific functions. */ + /* */ + /*************************************************************************/ + + + /********************************************************************** + * + * @function: + * FT_Get_PFR_Metrics + * + * @description: + * Return the outline and metrics resolutions of a given PFR face. + * + * @input: + * face :: Handle to the input face. It can be a non-PFR face. + * + * @output: + * aoutline_resolution :: + * Outline resolution. This is equivalent to `face->units_per_EM' + * for non-PFR fonts. Optional (parameter can be NULL). + * + * ametrics_resolution :: + * Metrics resolution. This is equivalent to `outline_resolution' + * for non-PFR fonts. Optional (parameter can be NULL). + * + * ametrics_x_scale :: + * A 16.16 fixed-point number used to scale distance expressed + * in metrics units to device sub-pixels. This is equivalent to + * `face->size->x_scale', but for metrics only. Optional (parameter + * can be NULL). + * + * ametrics_y_scale :: + * Same as `ametrics_x_scale' but for the vertical direction. + * optional (parameter can be NULL). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If the input face is not a PFR, this function will return an error. + * However, in all cases, it will return valid values. + */ + FT_EXPORT( FT_Error ) + FT_Get_PFR_Metrics( FT_Face face, + FT_UInt *aoutline_resolution, + FT_UInt *ametrics_resolution, + FT_Fixed *ametrics_x_scale, + FT_Fixed *ametrics_y_scale ); + + + /********************************************************************** + * + * @function: + * FT_Get_PFR_Kerning + * + * @description: + * Return the kerning pair corresponding to two glyphs in a PFR face. + * The distance is expressed in metrics units, unlike the result of + * @FT_Get_Kerning. + * + * @input: + * face :: A handle to the input face. + * + * left :: Index of the left glyph. + * + * right :: Index of the right glyph. + * + * @output: + * avector :: A kerning vector. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function always return distances in original PFR metrics + * units. This is unlike @FT_Get_Kerning with the @FT_KERNING_UNSCALED + * mode, which always returns distances converted to outline units. + * + * You can use the value of the `x_scale' and `y_scale' parameters + * returned by @FT_Get_PFR_Metrics to scale these to device sub-pixels. + */ + FT_EXPORT( FT_Error ) + FT_Get_PFR_Kerning( FT_Face face, + FT_UInt left, + FT_UInt right, + FT_Vector *avector ); + + + /********************************************************************** + * + * @function: + * FT_Get_PFR_Advance + * + * @description: + * Return a given glyph advance, expressed in original metrics units, + * from a PFR font. + * + * @input: + * face :: A handle to the input face. + * + * gindex :: The glyph index. + * + * @output: + * aadvance :: The glyph advance in metrics units. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You can use the `x_scale' or `y_scale' results of @FT_Get_PFR_Metrics + * to convert the advance to device sub-pixels (i.e., 1/64th of pixels). + */ + FT_EXPORT( FT_Error ) + FT_Get_PFR_Advance( FT_Face face, + FT_UInt gindex, + FT_Pos *aadvance ); + + /* */ + + +FT_END_HEADER + +#endif /* __FTPFR_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftrender.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftrender.h new file mode 100644 index 00000000..e06a8142 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftrender.h @@ -0,0 +1,230 @@ +/***************************************************************************/ +/* */ +/* ftrender.h */ +/* */ +/* FreeType renderer modules public interface (specification). */ +/* */ +/* Copyright 1996-2001, 2005, 2006, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTRENDER_H__ +#define __FTRENDER_H__ + + +#include <ft2build.h> +#include FT_MODULE_H +#include FT_GLYPH_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* module_management */ + /* */ + /*************************************************************************/ + + + /* create a new glyph object */ + typedef FT_Error + (*FT_Glyph_InitFunc)( FT_Glyph glyph, + FT_GlyphSlot slot ); + + /* destroys a given glyph object */ + typedef void + (*FT_Glyph_DoneFunc)( FT_Glyph glyph ); + + typedef void + (*FT_Glyph_TransformFunc)( FT_Glyph glyph, + const FT_Matrix* matrix, + const FT_Vector* delta ); + + typedef void + (*FT_Glyph_GetBBoxFunc)( FT_Glyph glyph, + FT_BBox* abbox ); + + typedef FT_Error + (*FT_Glyph_CopyFunc)( FT_Glyph source, + FT_Glyph target ); + + typedef FT_Error + (*FT_Glyph_PrepareFunc)( FT_Glyph glyph, + FT_GlyphSlot slot ); + +/* deprecated */ +#define FT_Glyph_Init_Func FT_Glyph_InitFunc +#define FT_Glyph_Done_Func FT_Glyph_DoneFunc +#define FT_Glyph_Transform_Func FT_Glyph_TransformFunc +#define FT_Glyph_BBox_Func FT_Glyph_GetBBoxFunc +#define FT_Glyph_Copy_Func FT_Glyph_CopyFunc +#define FT_Glyph_Prepare_Func FT_Glyph_PrepareFunc + + + struct FT_Glyph_Class_ + { + FT_Long glyph_size; + FT_Glyph_Format glyph_format; + FT_Glyph_InitFunc glyph_init; + FT_Glyph_DoneFunc glyph_done; + FT_Glyph_CopyFunc glyph_copy; + FT_Glyph_TransformFunc glyph_transform; + FT_Glyph_GetBBoxFunc glyph_bbox; + FT_Glyph_PrepareFunc glyph_prepare; + }; + + + typedef FT_Error + (*FT_Renderer_RenderFunc)( FT_Renderer renderer, + FT_GlyphSlot slot, + FT_UInt mode, + const FT_Vector* origin ); + + typedef FT_Error + (*FT_Renderer_TransformFunc)( FT_Renderer renderer, + FT_GlyphSlot slot, + const FT_Matrix* matrix, + const FT_Vector* delta ); + + + typedef void + (*FT_Renderer_GetCBoxFunc)( FT_Renderer renderer, + FT_GlyphSlot slot, + FT_BBox* cbox ); + + + typedef FT_Error + (*FT_Renderer_SetModeFunc)( FT_Renderer renderer, + FT_ULong mode_tag, + FT_Pointer mode_ptr ); + +/* deprecated identifiers */ +#define FTRenderer_render FT_Renderer_RenderFunc +#define FTRenderer_transform FT_Renderer_TransformFunc +#define FTRenderer_getCBox FT_Renderer_GetCBoxFunc +#define FTRenderer_setMode FT_Renderer_SetModeFunc + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Renderer_Class */ + /* */ + /* <Description> */ + /* The renderer module class descriptor. */ + /* */ + /* <Fields> */ + /* root :: The root @FT_Module_Class fields. */ + /* */ + /* glyph_format :: The glyph image format this renderer handles. */ + /* */ + /* render_glyph :: A method used to render the image that is in a */ + /* given glyph slot into a bitmap. */ + /* */ + /* transform_glyph :: A method used to transform the image that is in */ + /* a given glyph slot. */ + /* */ + /* get_glyph_cbox :: A method used to access the glyph's cbox. */ + /* */ + /* set_mode :: A method used to pass additional parameters. */ + /* */ + /* raster_class :: For @FT_GLYPH_FORMAT_OUTLINE renderers only. */ + /* This is a pointer to its raster's class. */ + /* */ + typedef struct FT_Renderer_Class_ + { + FT_Module_Class root; + + FT_Glyph_Format glyph_format; + + FT_Renderer_RenderFunc render_glyph; + FT_Renderer_TransformFunc transform_glyph; + FT_Renderer_GetCBoxFunc get_glyph_cbox; + FT_Renderer_SetModeFunc set_mode; + + FT_Raster_Funcs* raster_class; + + } FT_Renderer_Class; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Renderer */ + /* */ + /* <Description> */ + /* Retrieve the current renderer for a given glyph format. */ + /* */ + /* <Input> */ + /* library :: A handle to the library object. */ + /* */ + /* format :: The glyph format. */ + /* */ + /* <Return> */ + /* A renderer handle. 0~if none found. */ + /* */ + /* <Note> */ + /* An error will be returned if a module already exists by that name, */ + /* or if the module requires a version of FreeType that is too great. */ + /* */ + /* To add a new renderer, simply use @FT_Add_Module. To retrieve a */ + /* renderer by its name, use @FT_Get_Module. */ + /* */ + FT_EXPORT( FT_Renderer ) + FT_Get_Renderer( FT_Library library, + FT_Glyph_Format format ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Renderer */ + /* */ + /* <Description> */ + /* Set the current renderer to use, and set additional mode. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library object. */ + /* */ + /* <Input> */ + /* renderer :: A handle to the renderer object. */ + /* */ + /* num_params :: The number of additional parameters. */ + /* */ + /* parameters :: Additional parameters. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* In case of success, the renderer will be used to convert glyph */ + /* images in the renderer's known format into bitmaps. */ + /* */ + /* This doesn't change the current renderer for other formats. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_Renderer( FT_Library library, + FT_Renderer renderer, + FT_UInt num_params, + FT_Parameter* parameters ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTRENDER_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftsizes.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftsizes.h new file mode 100644 index 00000000..3e548cc3 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftsizes.h @@ -0,0 +1,159 @@ +/***************************************************************************/ +/* */ +/* ftsizes.h */ +/* */ +/* FreeType size objects management (specification). */ +/* */ +/* Copyright 1996-2001, 2003, 2004, 2006, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Typical application would normally not need to use these functions. */ + /* However, they have been placed in a public API for the rare cases */ + /* where they are needed. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTSIZES_H__ +#define __FTSIZES_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* sizes_management */ + /* */ + /* <Title> */ + /* Size Management */ + /* */ + /* <Abstract> */ + /* Managing multiple sizes per face. */ + /* */ + /* <Description> */ + /* When creating a new face object (e.g., with @FT_New_Face), an */ + /* @FT_Size object is automatically created and used to store all */ + /* pixel-size dependent information, available in the `face->size' */ + /* field. */ + /* */ + /* It is however possible to create more sizes for a given face, */ + /* mostly in order to manage several character pixel sizes of the */ + /* same font family and style. See @FT_New_Size and @FT_Done_Size. */ + /* */ + /* Note that @FT_Set_Pixel_Sizes and @FT_Set_Char_Size only */ + /* modify the contents of the current `active' size; you thus need */ + /* to use @FT_Activate_Size to change it. */ + /* */ + /* 99% of applications won't need the functions provided here, */ + /* especially if they use the caching sub-system, so be cautious */ + /* when using these. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Size */ + /* */ + /* <Description> */ + /* Create a new size object from a given face object. */ + /* */ + /* <Input> */ + /* face :: A handle to a parent face object. */ + /* */ + /* <Output> */ + /* asize :: A handle to a new size object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* You need to call @FT_Activate_Size in order to select the new size */ + /* for upcoming calls to @FT_Set_Pixel_Sizes, @FT_Set_Char_Size, */ + /* @FT_Load_Glyph, @FT_Load_Char, etc. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Size( FT_Face face, + FT_Size* size ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_Size */ + /* */ + /* <Description> */ + /* Discard a given size object. Note that @FT_Done_Face */ + /* automatically discards all size objects allocated with */ + /* @FT_New_Size. */ + /* */ + /* <Input> */ + /* size :: A handle to a target size object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Done_Size( FT_Size size ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Activate_Size */ + /* */ + /* <Description> */ + /* Even though it is possible to create several size objects for a */ + /* given face (see @FT_New_Size for details), functions like */ + /* @FT_Load_Glyph or @FT_Load_Char only use the one which has been */ + /* activated last to determine the `current character pixel size'. */ + /* */ + /* This function can be used to `activate' a previously created size */ + /* object. */ + /* */ + /* <Input> */ + /* size :: A handle to a target size object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* If `face' is the size's parent face object, this function changes */ + /* the value of `face->size' to the input size handle. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Activate_Size( FT_Size size ); + + /* */ + + +FT_END_HEADER + +#endif /* __FTSIZES_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftsnames.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftsnames.h new file mode 100644 index 00000000..485e4e16 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftsnames.h @@ -0,0 +1,200 @@ +/***************************************************************************/ +/* */ +/* ftsnames.h */ +/* */ +/* Simple interface to access SFNT name tables (which are used */ +/* to hold font names, copyright info, notices, etc.) (specification). */ +/* */ +/* This is _not_ used to retrieve glyph names! */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2006, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FT_SFNT_NAMES_H__ +#define __FT_SFNT_NAMES_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* sfnt_names */ + /* */ + /* <Title> */ + /* SFNT Names */ + /* */ + /* <Abstract> */ + /* Access the names embedded in TrueType and OpenType files. */ + /* */ + /* <Description> */ + /* The TrueType and OpenType specifications allow the inclusion of */ + /* a special `names table' in font files. This table contains */ + /* textual (and internationalized) information regarding the font, */ + /* like family name, copyright, version, etc. */ + /* */ + /* The definitions below are used to access them if available. */ + /* */ + /* Note that this has nothing to do with glyph names! */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_SfntName */ + /* */ + /* <Description> */ + /* A structure used to model an SFNT `name' table entry. */ + /* */ + /* <Fields> */ + /* platform_id :: The platform ID for `string'. */ + /* */ + /* encoding_id :: The encoding ID for `string'. */ + /* */ + /* language_id :: The language ID for `string'. */ + /* */ + /* name_id :: An identifier for `string'. */ + /* */ + /* string :: The `name' string. Note that its format differs */ + /* depending on the (platform,encoding) pair. It can */ + /* be a Pascal String, a UTF-16 one, etc. */ + /* */ + /* Generally speaking, the string is not */ + /* zero-terminated. Please refer to the TrueType */ + /* specification for details. */ + /* */ + /* string_len :: The length of `string' in bytes. */ + /* */ + /* <Note> */ + /* Possible values for `platform_id', `encoding_id', `language_id', */ + /* and `name_id' are given in the file `ttnameid.h'. For details */ + /* please refer to the TrueType or OpenType specification. */ + /* */ + /* See also @TT_PLATFORM_XXX, @TT_APPLE_ID_XXX, @TT_MAC_ID_XXX, */ + /* @TT_ISO_ID_XXX, and @TT_MS_ID_XXX. */ + /* */ + typedef struct FT_SfntName_ + { + FT_UShort platform_id; + FT_UShort encoding_id; + FT_UShort language_id; + FT_UShort name_id; + + FT_Byte* string; /* this string is *not* null-terminated! */ + FT_UInt string_len; /* in bytes */ + + } FT_SfntName; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Sfnt_Name_Count */ + /* */ + /* <Description> */ + /* Retrieve the number of name strings in the SFNT `name' table. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face. */ + /* */ + /* <Return> */ + /* The number of strings in the `name' table. */ + /* */ + FT_EXPORT( FT_UInt ) + FT_Get_Sfnt_Name_Count( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Sfnt_Name */ + /* */ + /* <Description> */ + /* Retrieve a string of the SFNT `name' table for a given index. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face. */ + /* */ + /* idx :: The index of the `name' string. */ + /* */ + /* <Output> */ + /* aname :: The indexed @FT_SfntName structure. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The `string' array returned in the `aname' structure is not */ + /* null-terminated. The application should deallocate it if it is no */ + /* longer in use. */ + /* */ + /* Use @FT_Get_Sfnt_Name_Count to get the total number of available */ + /* `name' table entries, then do a loop until you get the right */ + /* platform, encoding, and name ID. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Sfnt_Name( FT_Face face, + FT_UInt idx, + FT_SfntName *aname ); + + + /*************************************************************************** + * + * @constant: + * FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY + * + * @description: + * A constant used as the tag of @FT_Parameter structures to make + * FT_Open_Face() ignore preferred family subfamily names in `name' + * table since OpenType version 1.4. For backwards compatibility with + * legacy systems which has 4-face-per-family restriction. + * + */ +#define FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY FT_MAKE_TAG( 'i', 'g', 'p', 'f' ) + + + /*************************************************************************** + * + * @constant: + * FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY + * + * @description: + * A constant used as the tag of @FT_Parameter structures to make + * FT_Open_Face() ignore preferred subfamily names in `name' table since + * OpenType version 1.4. For backwards compatibility with legacy + * systems which has 4-face-per-family restriction. + * + */ +#define FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY FT_MAKE_TAG( 'i', 'g', 'p', 's' ) + + /* */ + + +FT_END_HEADER + +#endif /* __FT_SFNT_NAMES_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftstroke.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftstroke.h new file mode 100644 index 00000000..3afb87df --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftstroke.h @@ -0,0 +1,716 @@ +/***************************************************************************/ +/* */ +/* ftstroke.h */ +/* */ +/* FreeType path stroker (specification). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FT_STROKE_H__ +#define __FT_STROKE_H__ + +#include <ft2build.h> +#include FT_OUTLINE_H +#include FT_GLYPH_H + + +FT_BEGIN_HEADER + + + /************************************************************************ + * + * @section: + * glyph_stroker + * + * @title: + * Glyph Stroker + * + * @abstract: + * Generating bordered and stroked glyphs. + * + * @description: + * This component generates stroked outlines of a given vectorial + * glyph. It also allows you to retrieve the `outside' and/or the + * `inside' borders of the stroke. + * + * This can be useful to generate `bordered' glyph, i.e., glyphs + * displayed with a coloured (and anti-aliased) border around their + * shape. + */ + + + /************************************************************** + * + * @type: + * FT_Stroker + * + * @description: + * Opaque handler to a path stroker object. + */ + typedef struct FT_StrokerRec_* FT_Stroker; + + + /************************************************************** + * + * @enum: + * FT_Stroker_LineJoin + * + * @description: + * These values determine how two joining lines are rendered + * in a stroker. + * + * @values: + * FT_STROKER_LINEJOIN_ROUND :: + * Used to render rounded line joins. Circular arcs are used + * to join two lines smoothly. + * + * FT_STROKER_LINEJOIN_BEVEL :: + * Used to render beveled line joins; i.e., the two joining lines + * are extended until they intersect. + * + * FT_STROKER_LINEJOIN_MITER :: + * Same as beveled rendering, except that an additional line + * break is added if the angle between the two joining lines + * is too closed (this is useful to avoid unpleasant spikes + * in beveled rendering). + */ + typedef enum FT_Stroker_LineJoin_ + { + FT_STROKER_LINEJOIN_ROUND = 0, + FT_STROKER_LINEJOIN_BEVEL, + FT_STROKER_LINEJOIN_MITER + + } FT_Stroker_LineJoin; + + + /************************************************************** + * + * @enum: + * FT_Stroker_LineCap + * + * @description: + * These values determine how the end of opened sub-paths are + * rendered in a stroke. + * + * @values: + * FT_STROKER_LINECAP_BUTT :: + * The end of lines is rendered as a full stop on the last + * point itself. + * + * FT_STROKER_LINECAP_ROUND :: + * The end of lines is rendered as a half-circle around the + * last point. + * + * FT_STROKER_LINECAP_SQUARE :: + * The end of lines is rendered as a square around the + * last point. + */ + typedef enum FT_Stroker_LineCap_ + { + FT_STROKER_LINECAP_BUTT = 0, + FT_STROKER_LINECAP_ROUND, + FT_STROKER_LINECAP_SQUARE + + } FT_Stroker_LineCap; + + + /************************************************************** + * + * @enum: + * FT_StrokerBorder + * + * @description: + * These values are used to select a given stroke border + * in @FT_Stroker_GetBorderCounts and @FT_Stroker_ExportBorder. + * + * @values: + * FT_STROKER_BORDER_LEFT :: + * Select the left border, relative to the drawing direction. + * + * FT_STROKER_BORDER_RIGHT :: + * Select the right border, relative to the drawing direction. + * + * @note: + * Applications are generally interested in the `inside' and `outside' + * borders. However, there is no direct mapping between these and the + * `left' and `right' ones, since this really depends on the glyph's + * drawing orientation, which varies between font formats. + * + * You can however use @FT_Outline_GetInsideBorder and + * @FT_Outline_GetOutsideBorder to get these. + */ + typedef enum FT_StrokerBorder_ + { + FT_STROKER_BORDER_LEFT = 0, + FT_STROKER_BORDER_RIGHT + + } FT_StrokerBorder; + + + /************************************************************** + * + * @function: + * FT_Outline_GetInsideBorder + * + * @description: + * Retrieve the @FT_StrokerBorder value corresponding to the + * `inside' borders of a given outline. + * + * @input: + * outline :: + * The source outline handle. + * + * @return: + * The border index. @FT_STROKER_BORDER_RIGHT for empty or invalid + * outlines. + */ + FT_EXPORT( FT_StrokerBorder ) + FT_Outline_GetInsideBorder( FT_Outline* outline ); + + + /************************************************************** + * + * @function: + * FT_Outline_GetOutsideBorder + * + * @description: + * Retrieve the @FT_StrokerBorder value corresponding to the + * `outside' borders of a given outline. + * + * @input: + * outline :: + * The source outline handle. + * + * @return: + * The border index. @FT_STROKER_BORDER_LEFT for empty or invalid + * outlines. + */ + FT_EXPORT( FT_StrokerBorder ) + FT_Outline_GetOutsideBorder( FT_Outline* outline ); + + + /************************************************************** + * + * @function: + * FT_Stroker_New + * + * @description: + * Create a new stroker object. + * + * @input: + * library :: + * FreeType library handle. + * + * @output: + * astroker :: + * A new stroker object handle. NULL in case of error. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_New( FT_Library library, + FT_Stroker *astroker ); + + + /************************************************************** + * + * @function: + * FT_Stroker_Set + * + * @description: + * Reset a stroker object's attributes. + * + * @input: + * stroker :: + * The target stroker handle. + * + * radius :: + * The border radius. + * + * line_cap :: + * The line cap style. + * + * line_join :: + * The line join style. + * + * miter_limit :: + * The miter limit for the FT_STROKER_LINEJOIN_MITER style, + * expressed as 16.16 fixed point value. + * + * @note: + * The radius is expressed in the same units as the outline + * coordinates. + */ + FT_EXPORT( void ) + FT_Stroker_Set( FT_Stroker stroker, + FT_Fixed radius, + FT_Stroker_LineCap line_cap, + FT_Stroker_LineJoin line_join, + FT_Fixed miter_limit ); + + + /************************************************************** + * + * @function: + * FT_Stroker_Rewind + * + * @description: + * Reset a stroker object without changing its attributes. + * You should call this function before beginning a new + * series of calls to @FT_Stroker_BeginSubPath or + * @FT_Stroker_EndSubPath. + * + * @input: + * stroker :: + * The target stroker handle. + */ + FT_EXPORT( void ) + FT_Stroker_Rewind( FT_Stroker stroker ); + + + /************************************************************** + * + * @function: + * FT_Stroker_ParseOutline + * + * @description: + * A convenience function used to parse a whole outline with + * the stroker. The resulting outline(s) can be retrieved + * later by functions like @FT_Stroker_GetCounts and @FT_Stroker_Export. + * + * @input: + * stroker :: + * The target stroker handle. + * + * outline :: + * The source outline. + * + * opened :: + * A boolean. If~1, the outline is treated as an open path instead + * of a closed one. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If `opened' is~0 (the default), the outline is treated as a closed + * path, and the stroker generates two distinct `border' outlines. + * + * If `opened' is~1, the outline is processed as an open path, and the + * stroker generates a single `stroke' outline. + * + * This function calls @FT_Stroker_Rewind automatically. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_ParseOutline( FT_Stroker stroker, + FT_Outline* outline, + FT_Bool opened ); + + + /************************************************************** + * + * @function: + * FT_Stroker_BeginSubPath + * + * @description: + * Start a new sub-path in the stroker. + * + * @input: + * stroker :: + * The target stroker handle. + * + * to :: + * A pointer to the start vector. + * + * open :: + * A boolean. If~1, the sub-path is treated as an open one. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function is useful when you need to stroke a path that is + * not stored as an @FT_Outline object. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_BeginSubPath( FT_Stroker stroker, + FT_Vector* to, + FT_Bool open ); + + + /************************************************************** + * + * @function: + * FT_Stroker_EndSubPath + * + * @description: + * Close the current sub-path in the stroker. + * + * @input: + * stroker :: + * The target stroker handle. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function after @FT_Stroker_BeginSubPath. + * If the subpath was not `opened', this function `draws' a + * single line segment to the start position when needed. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_EndSubPath( FT_Stroker stroker ); + + + /************************************************************** + * + * @function: + * FT_Stroker_LineTo + * + * @description: + * `Draw' a single line segment in the stroker's current sub-path, + * from the last position. + * + * @input: + * stroker :: + * The target stroker handle. + * + * to :: + * A pointer to the destination point. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function between @FT_Stroker_BeginSubPath and + * @FT_Stroker_EndSubPath. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_LineTo( FT_Stroker stroker, + FT_Vector* to ); + + + /************************************************************** + * + * @function: + * FT_Stroker_ConicTo + * + * @description: + * `Draw' a single quadratic Bézier in the stroker's current sub-path, + * from the last position. + * + * @input: + * stroker :: + * The target stroker handle. + * + * control :: + * A pointer to a Bézier control point. + * + * to :: + * A pointer to the destination point. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function between @FT_Stroker_BeginSubPath and + * @FT_Stroker_EndSubPath. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_ConicTo( FT_Stroker stroker, + FT_Vector* control, + FT_Vector* to ); + + + /************************************************************** + * + * @function: + * FT_Stroker_CubicTo + * + * @description: + * `Draw' a single cubic Bézier in the stroker's current sub-path, + * from the last position. + * + * @input: + * stroker :: + * The target stroker handle. + * + * control1 :: + * A pointer to the first Bézier control point. + * + * control2 :: + * A pointer to second Bézier control point. + * + * to :: + * A pointer to the destination point. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function between @FT_Stroker_BeginSubPath and + * @FT_Stroker_EndSubPath. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_CubicTo( FT_Stroker stroker, + FT_Vector* control1, + FT_Vector* control2, + FT_Vector* to ); + + + /************************************************************** + * + * @function: + * FT_Stroker_GetBorderCounts + * + * @description: + * Call this function once you have finished parsing your paths + * with the stroker. It returns the number of points and + * contours necessary to export one of the `border' or `stroke' + * outlines generated by the stroker. + * + * @input: + * stroker :: + * The target stroker handle. + * + * border :: + * The border index. + * + * @output: + * anum_points :: + * The number of points. + * + * anum_contours :: + * The number of contours. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * When an outline, or a sub-path, is `closed', the stroker generates + * two independent `border' outlines, named `left' and `right'. + * + * When the outline, or a sub-path, is `opened', the stroker merges + * the `border' outlines with caps. The `left' border receives all + * points, while the `right' border becomes empty. + * + * Use the function @FT_Stroker_GetCounts instead if you want to + * retrieve the counts associated to both borders. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_GetBorderCounts( FT_Stroker stroker, + FT_StrokerBorder border, + FT_UInt *anum_points, + FT_UInt *anum_contours ); + + + /************************************************************** + * + * @function: + * FT_Stroker_ExportBorder + * + * @description: + * Call this function after @FT_Stroker_GetBorderCounts to + * export the corresponding border to your own @FT_Outline + * structure. + * + * Note that this function appends the border points and + * contours to your outline, but does not try to resize its + * arrays. + * + * @input: + * stroker :: + * The target stroker handle. + * + * border :: + * The border index. + * + * outline :: + * The target outline handle. + * + * @note: + * Always call this function after @FT_Stroker_GetBorderCounts to + * get sure that there is enough room in your @FT_Outline object to + * receive all new data. + * + * When an outline, or a sub-path, is `closed', the stroker generates + * two independent `border' outlines, named `left' and `right' + * + * When the outline, or a sub-path, is `opened', the stroker merges + * the `border' outlines with caps. The `left' border receives all + * points, while the `right' border becomes empty. + * + * Use the function @FT_Stroker_Export instead if you want to + * retrieve all borders at once. + */ + FT_EXPORT( void ) + FT_Stroker_ExportBorder( FT_Stroker stroker, + FT_StrokerBorder border, + FT_Outline* outline ); + + + /************************************************************** + * + * @function: + * FT_Stroker_GetCounts + * + * @description: + * Call this function once you have finished parsing your paths + * with the stroker. It returns the number of points and + * contours necessary to export all points/borders from the stroked + * outline/path. + * + * @input: + * stroker :: + * The target stroker handle. + * + * @output: + * anum_points :: + * The number of points. + * + * anum_contours :: + * The number of contours. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_GetCounts( FT_Stroker stroker, + FT_UInt *anum_points, + FT_UInt *anum_contours ); + + + /************************************************************** + * + * @function: + * FT_Stroker_Export + * + * @description: + * Call this function after @FT_Stroker_GetBorderCounts to + * export all borders to your own @FT_Outline structure. + * + * Note that this function appends the border points and + * contours to your outline, but does not try to resize its + * arrays. + * + * @input: + * stroker :: + * The target stroker handle. + * + * outline :: + * The target outline handle. + */ + FT_EXPORT( void ) + FT_Stroker_Export( FT_Stroker stroker, + FT_Outline* outline ); + + + /************************************************************** + * + * @function: + * FT_Stroker_Done + * + * @description: + * Destroy a stroker object. + * + * @input: + * stroker :: + * A stroker handle. Can be NULL. + */ + FT_EXPORT( void ) + FT_Stroker_Done( FT_Stroker stroker ); + + + /************************************************************** + * + * @function: + * FT_Glyph_Stroke + * + * @description: + * Stroke a given outline glyph object with a given stroker. + * + * @inout: + * pglyph :: + * Source glyph handle on input, new glyph handle on output. + * + * @input: + * stroker :: + * A stroker handle. + * + * destroy :: + * A Boolean. If~1, the source glyph object is destroyed + * on success. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source glyph is untouched in case of error. + */ + FT_EXPORT( FT_Error ) + FT_Glyph_Stroke( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool destroy ); + + + /************************************************************** + * + * @function: + * FT_Glyph_StrokeBorder + * + * @description: + * Stroke a given outline glyph object with a given stroker, but + * only return either its inside or outside border. + * + * @inout: + * pglyph :: + * Source glyph handle on input, new glyph handle on output. + * + * @input: + * stroker :: + * A stroker handle. + * + * inside :: + * A Boolean. If~1, return the inside border, otherwise + * the outside border. + * + * destroy :: + * A Boolean. If~1, the source glyph object is destroyed + * on success. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source glyph is untouched in case of error. + */ + FT_EXPORT( FT_Error ) + FT_Glyph_StrokeBorder( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool inside, + FT_Bool destroy ); + + /* */ + +FT_END_HEADER + +#endif /* __FT_STROKE_H__ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftsynth.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftsynth.h new file mode 100644 index 00000000..a068b792 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftsynth.h @@ -0,0 +1,80 @@ +/***************************************************************************/ +/* */ +/* ftsynth.h */ +/* */ +/* FreeType synthesizing code for emboldening and slanting */ +/* (specification). */ +/* */ +/* Copyright 2000-2001, 2003, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********* *********/ + /********* WARNING, THIS IS ALPHA CODE! THIS API *********/ + /********* IS DUE TO CHANGE UNTIL STRICTLY NOTIFIED BY THE *********/ + /********* FREETYPE DEVELOPMENT TEAM *********/ + /********* *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* Main reason for not lifting the functions in this module to a */ + /* `standard' API is that the used parameters for emboldening and */ + /* slanting are not configurable. Consider the functions as a */ + /* code resource which should be copied into the application and */ + /* adapted to the particular needs. */ + + +#ifndef __FTSYNTH_H__ +#define __FTSYNTH_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /* Embolden a glyph by a `reasonable' value (which is highly a matter of */ + /* taste). This function is actually a convenience function, providing */ + /* a wrapper for @FT_Outline_Embolden and @FT_Bitmap_Embolden. */ + /* */ + /* For emboldened outlines the metrics are estimates only; if you need */ + /* precise values you should call @FT_Outline_Get_CBox. */ + FT_EXPORT( void ) + FT_GlyphSlot_Embolden( FT_GlyphSlot slot ); + + /* Slant an outline glyph to the right by about 12 degrees. */ + FT_EXPORT( void ) + FT_GlyphSlot_Oblique( FT_GlyphSlot slot ); + + /* */ + +FT_END_HEADER + +#endif /* __FTSYNTH_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftsystem.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftsystem.h new file mode 100644 index 00000000..e07460c5 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftsystem.h @@ -0,0 +1,347 @@ +/***************************************************************************/ +/* */ +/* ftsystem.h */ +/* */ +/* FreeType low-level system interface definition (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2005, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTSYSTEM_H__ +#define __FTSYSTEM_H__ + + +#include <ft2build.h> + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* system_interface */ + /* */ + /* <Title> */ + /* System Interface */ + /* */ + /* <Abstract> */ + /* How FreeType manages memory and i/o. */ + /* */ + /* <Description> */ + /* This section contains various definitions related to memory */ + /* management and i/o access. You need to understand this */ + /* information if you want to use a custom memory manager or you own */ + /* i/o streams. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* M E M O R Y M A N A G E M E N T */ + /* */ + /*************************************************************************/ + + + /************************************************************************* + * + * @type: + * FT_Memory + * + * @description: + * A handle to a given memory manager object, defined with an + * @FT_MemoryRec structure. + * + */ + typedef struct FT_MemoryRec_* FT_Memory; + + + /************************************************************************* + * + * @functype: + * FT_Alloc_Func + * + * @description: + * A function used to allocate `size' bytes from `memory'. + * + * @input: + * memory :: + * A handle to the source memory manager. + * + * size :: + * The size in bytes to allocate. + * + * @return: + * Address of new memory block. 0~in case of failure. + * + */ + typedef void* + (*FT_Alloc_Func)( FT_Memory memory, + long size ); + + + /************************************************************************* + * + * @functype: + * FT_Free_Func + * + * @description: + * A function used to release a given block of memory. + * + * @input: + * memory :: + * A handle to the source memory manager. + * + * block :: + * The address of the target memory block. + * + */ + typedef void + (*FT_Free_Func)( FT_Memory memory, + void* block ); + + + /************************************************************************* + * + * @functype: + * FT_Realloc_Func + * + * @description: + * A function used to re-allocate a given block of memory. + * + * @input: + * memory :: + * A handle to the source memory manager. + * + * cur_size :: + * The block's current size in bytes. + * + * new_size :: + * The block's requested new size. + * + * block :: + * The block's current address. + * + * @return: + * New block address. 0~in case of memory shortage. + * + * @note: + * In case of error, the old block must still be available. + * + */ + typedef void* + (*FT_Realloc_Func)( FT_Memory memory, + long cur_size, + long new_size, + void* block ); + + + /************************************************************************* + * + * @struct: + * FT_MemoryRec + * + * @description: + * A structure used to describe a given memory manager to FreeType~2. + * + * @fields: + * user :: + * A generic typeless pointer for user data. + * + * alloc :: + * A pointer type to an allocation function. + * + * free :: + * A pointer type to an memory freeing function. + * + * realloc :: + * A pointer type to a reallocation function. + * + */ + struct FT_MemoryRec_ + { + void* user; + FT_Alloc_Func alloc; + FT_Free_Func free; + FT_Realloc_Func realloc; + }; + + + /*************************************************************************/ + /* */ + /* I / O M A N A G E M E N T */ + /* */ + /*************************************************************************/ + + + /************************************************************************* + * + * @type: + * FT_Stream + * + * @description: + * A handle to an input stream. + * + */ + typedef struct FT_StreamRec_* FT_Stream; + + + /************************************************************************* + * + * @struct: + * FT_StreamDesc + * + * @description: + * A union type used to store either a long or a pointer. This is used + * to store a file descriptor or a `FILE*' in an input stream. + * + */ + typedef union FT_StreamDesc_ + { + long value; + void* pointer; + + } FT_StreamDesc; + + + /************************************************************************* + * + * @functype: + * FT_Stream_IoFunc + * + * @description: + * A function used to seek and read data from a given input stream. + * + * @input: + * stream :: + * A handle to the source stream. + * + * offset :: + * The offset of read in stream (always from start). + * + * buffer :: + * The address of the read buffer. + * + * count :: + * The number of bytes to read from the stream. + * + * @return: + * The number of bytes effectively read by the stream. + * + * @note: + * This function might be called to perform a seek or skip operation + * with a `count' of~0. A non-zero return value then indicates an + * error. + * + */ + typedef unsigned long + (*FT_Stream_IoFunc)( FT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count ); + + + /************************************************************************* + * + * @functype: + * FT_Stream_CloseFunc + * + * @description: + * A function used to close a given input stream. + * + * @input: + * stream :: + * A handle to the target stream. + * + */ + typedef void + (*FT_Stream_CloseFunc)( FT_Stream stream ); + + + /************************************************************************* + * + * @struct: + * FT_StreamRec + * + * @description: + * A structure used to describe an input stream. + * + * @input: + * base :: + * For memory-based streams, this is the address of the first stream + * byte in memory. This field should always be set to NULL for + * disk-based streams. + * + * size :: + * The stream size in bytes. + * + * pos :: + * The current position within the stream. + * + * descriptor :: + * This field is a union that can hold an integer or a pointer. It is + * used by stream implementations to store file descriptors or `FILE*' + * pointers. + * + * pathname :: + * This field is completely ignored by FreeType. However, it is often + * useful during debugging to use it to store the stream's filename + * (where available). + * + * read :: + * The stream's input function. + * + * close :: + * The stream's close function. + * + * memory :: + * The memory manager to use to preload frames. This is set + * internally by FreeType and shouldn't be touched by stream + * implementations. + * + * cursor :: + * This field is set and used internally by FreeType when parsing + * frames. + * + * limit :: + * This field is set and used internally by FreeType when parsing + * frames. + * + */ + typedef struct FT_StreamRec_ + { + unsigned char* base; + unsigned long size; + unsigned long pos; + + FT_StreamDesc descriptor; + FT_StreamDesc pathname; + FT_Stream_IoFunc read; + FT_Stream_CloseFunc close; + + FT_Memory memory; + unsigned char* cursor; + unsigned char* limit; + + } FT_StreamRec; + + + /* */ + + +FT_END_HEADER + +#endif /* __FTSYSTEM_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/fttrigon.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/fttrigon.h new file mode 100644 index 00000000..6b77d2ee --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/fttrigon.h @@ -0,0 +1,350 @@ +/***************************************************************************/ +/* */ +/* fttrigon.h */ +/* */ +/* FreeType trigonometric functions (specification). */ +/* */ +/* Copyright 2001, 2003, 2005, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTTRIGON_H__ +#define __FTTRIGON_H__ + +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* computations */ + /* */ + /*************************************************************************/ + + + /************************************************************************* + * + * @type: + * FT_Angle + * + * @description: + * This type is used to model angle values in FreeType. Note that the + * angle is a 16.16 fixed float value expressed in degrees. + * + */ + typedef FT_Fixed FT_Angle; + + + /************************************************************************* + * + * @macro: + * FT_ANGLE_PI + * + * @description: + * The angle pi expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_PI ( 180L << 16 ) + + + /************************************************************************* + * + * @macro: + * FT_ANGLE_2PI + * + * @description: + * The angle 2*pi expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_2PI ( FT_ANGLE_PI * 2 ) + + + /************************************************************************* + * + * @macro: + * FT_ANGLE_PI2 + * + * @description: + * The angle pi/2 expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_PI2 ( FT_ANGLE_PI / 2 ) + + + /************************************************************************* + * + * @macro: + * FT_ANGLE_PI4 + * + * @description: + * The angle pi/4 expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_PI4 ( FT_ANGLE_PI / 4 ) + + + /************************************************************************* + * + * @function: + * FT_Sin + * + * @description: + * Return the sinus of a given angle in fixed point format. + * + * @input: + * angle :: + * The input angle. + * + * @return: + * The sinus value. + * + * @note: + * If you need both the sinus and cosinus for a given angle, use the + * function @FT_Vector_Unit. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Sin( FT_Angle angle ); + + + /************************************************************************* + * + * @function: + * FT_Cos + * + * @description: + * Return the cosinus of a given angle in fixed point format. + * + * @input: + * angle :: + * The input angle. + * + * @return: + * The cosinus value. + * + * @note: + * If you need both the sinus and cosinus for a given angle, use the + * function @FT_Vector_Unit. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Cos( FT_Angle angle ); + + + /************************************************************************* + * + * @function: + * FT_Tan + * + * @description: + * Return the tangent of a given angle in fixed point format. + * + * @input: + * angle :: + * The input angle. + * + * @return: + * The tangent value. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Tan( FT_Angle angle ); + + + /************************************************************************* + * + * @function: + * FT_Atan2 + * + * @description: + * Return the arc-tangent corresponding to a given vector (x,y) in + * the 2d plane. + * + * @input: + * x :: + * The horizontal vector coordinate. + * + * y :: + * The vertical vector coordinate. + * + * @return: + * The arc-tangent value (i.e. angle). + * + */ + FT_EXPORT( FT_Angle ) + FT_Atan2( FT_Fixed x, + FT_Fixed y ); + + + /************************************************************************* + * + * @function: + * FT_Angle_Diff + * + * @description: + * Return the difference between two angles. The result is always + * constrained to the ]-PI..PI] interval. + * + * @input: + * angle1 :: + * First angle. + * + * angle2 :: + * Second angle. + * + * @return: + * Constrained value of `value2-value1'. + * + */ + FT_EXPORT( FT_Angle ) + FT_Angle_Diff( FT_Angle angle1, + FT_Angle angle2 ); + + + /************************************************************************* + * + * @function: + * FT_Vector_Unit + * + * @description: + * Return the unit vector corresponding to a given angle. After the + * call, the value of `vec.x' will be `sin(angle)', and the value of + * `vec.y' will be `cos(angle)'. + * + * This function is useful to retrieve both the sinus and cosinus of a + * given angle quickly. + * + * @output: + * vec :: + * The address of target vector. + * + * @input: + * angle :: + * The address of angle. + * + */ + FT_EXPORT( void ) + FT_Vector_Unit( FT_Vector* vec, + FT_Angle angle ); + + + /************************************************************************* + * + * @function: + * FT_Vector_Rotate + * + * @description: + * Rotate a vector by a given angle. + * + * @inout: + * vec :: + * The address of target vector. + * + * @input: + * angle :: + * The address of angle. + * + */ + FT_EXPORT( void ) + FT_Vector_Rotate( FT_Vector* vec, + FT_Angle angle ); + + + /************************************************************************* + * + * @function: + * FT_Vector_Length + * + * @description: + * Return the length of a given vector. + * + * @input: + * vec :: + * The address of target vector. + * + * @return: + * The vector length, expressed in the same units that the original + * vector coordinates. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Vector_Length( FT_Vector* vec ); + + + /************************************************************************* + * + * @function: + * FT_Vector_Polarize + * + * @description: + * Compute both the length and angle of a given vector. + * + * @input: + * vec :: + * The address of source vector. + * + * @output: + * length :: + * The vector length. + * + * angle :: + * The vector angle. + * + */ + FT_EXPORT( void ) + FT_Vector_Polarize( FT_Vector* vec, + FT_Fixed *length, + FT_Angle *angle ); + + + /************************************************************************* + * + * @function: + * FT_Vector_From_Polar + * + * @description: + * Compute vector coordinates from a length and angle. + * + * @output: + * vec :: + * The address of source vector. + * + * @input: + * length :: + * The vector length. + * + * angle :: + * The vector angle. + * + */ + FT_EXPORT( void ) + FT_Vector_From_Polar( FT_Vector* vec, + FT_Fixed length, + FT_Angle angle ); + + /* */ + + +FT_END_HEADER + +#endif /* __FTTRIGON_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/fttypes.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/fttypes.h new file mode 100644 index 00000000..a57ffa69 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/fttypes.h @@ -0,0 +1,588 @@ +/***************************************************************************/ +/* */ +/* fttypes.h */ +/* */ +/* FreeType simple types definitions (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTTYPES_H__ +#define __FTTYPES_H__ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_SYSTEM_H +#include FT_IMAGE_H + +#include <stddef.h> + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* basic_types */ + /* */ + /* <Title> */ + /* Basic Data Types */ + /* */ + /* <Abstract> */ + /* The basic data types defined by the library. */ + /* */ + /* <Description> */ + /* This section contains the basic data types defined by FreeType~2, */ + /* ranging from simple scalar types to bitmap descriptors. More */ + /* font-specific structures are defined in a different section. */ + /* */ + /* <Order> */ + /* FT_Byte */ + /* FT_Bytes */ + /* FT_Char */ + /* FT_Int */ + /* FT_UInt */ + /* FT_Int16 */ + /* FT_UInt16 */ + /* FT_Int32 */ + /* FT_UInt32 */ + /* FT_Short */ + /* FT_UShort */ + /* FT_Long */ + /* FT_ULong */ + /* FT_Bool */ + /* FT_Offset */ + /* FT_PtrDist */ + /* FT_String */ + /* FT_Tag */ + /* FT_Error */ + /* FT_Fixed */ + /* FT_Pointer */ + /* FT_Pos */ + /* FT_Vector */ + /* FT_BBox */ + /* FT_Matrix */ + /* FT_FWord */ + /* FT_UFWord */ + /* FT_F2Dot14 */ + /* FT_UnitVector */ + /* FT_F26Dot6 */ + /* */ + /* */ + /* FT_Generic */ + /* FT_Generic_Finalizer */ + /* */ + /* FT_Bitmap */ + /* FT_Pixel_Mode */ + /* FT_Palette_Mode */ + /* FT_Glyph_Format */ + /* FT_IMAGE_TAG */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Bool */ + /* */ + /* <Description> */ + /* A typedef of unsigned char, used for simple booleans. As usual, */ + /* values 1 and~0 represent true and false, respectively. */ + /* */ + typedef unsigned char FT_Bool; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_FWord */ + /* */ + /* <Description> */ + /* A signed 16-bit integer used to store a distance in original font */ + /* units. */ + /* */ + typedef signed short FT_FWord; /* distance in FUnits */ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_UFWord */ + /* */ + /* <Description> */ + /* An unsigned 16-bit integer used to store a distance in original */ + /* font units. */ + /* */ + typedef unsigned short FT_UFWord; /* unsigned distance */ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Char */ + /* */ + /* <Description> */ + /* A simple typedef for the _signed_ char type. */ + /* */ + typedef signed char FT_Char; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Byte */ + /* */ + /* <Description> */ + /* A simple typedef for the _unsigned_ char type. */ + /* */ + typedef unsigned char FT_Byte; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Bytes */ + /* */ + /* <Description> */ + /* A typedef for constant memory areas. */ + /* */ + typedef const FT_Byte* FT_Bytes; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Tag */ + /* */ + /* <Description> */ + /* A typedef for 32-bit tags (as used in the SFNT format). */ + /* */ + typedef FT_UInt32 FT_Tag; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_String */ + /* */ + /* <Description> */ + /* A simple typedef for the char type, usually used for strings. */ + /* */ + typedef char FT_String; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Short */ + /* */ + /* <Description> */ + /* A typedef for signed short. */ + /* */ + typedef signed short FT_Short; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_UShort */ + /* */ + /* <Description> */ + /* A typedef for unsigned short. */ + /* */ + typedef unsigned short FT_UShort; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Int */ + /* */ + /* <Description> */ + /* A typedef for the int type. */ + /* */ + typedef signed int FT_Int; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_UInt */ + /* */ + /* <Description> */ + /* A typedef for the unsigned int type. */ + /* */ + typedef unsigned int FT_UInt; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Long */ + /* */ + /* <Description> */ + /* A typedef for signed long. */ + /* */ + typedef signed long FT_Long; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_ULong */ + /* */ + /* <Description> */ + /* A typedef for unsigned long. */ + /* */ + typedef unsigned long FT_ULong; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_F2Dot14 */ + /* */ + /* <Description> */ + /* A signed 2.14 fixed float type used for unit vectors. */ + /* */ + typedef signed short FT_F2Dot14; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_F26Dot6 */ + /* */ + /* <Description> */ + /* A signed 26.6 fixed float type used for vectorial pixel */ + /* coordinates. */ + /* */ + typedef signed long FT_F26Dot6; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Fixed */ + /* */ + /* <Description> */ + /* This type is used to store 16.16 fixed float values, like scaling */ + /* values or matrix coefficients. */ + /* */ + typedef signed long FT_Fixed; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Error */ + /* */ + /* <Description> */ + /* The FreeType error code type. A value of~0 is always interpreted */ + /* as a successful operation. */ + /* */ + typedef int FT_Error; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Pointer */ + /* */ + /* <Description> */ + /* A simple typedef for a typeless pointer. */ + /* */ + typedef void* FT_Pointer; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Offset */ + /* */ + /* <Description> */ + /* This is equivalent to the ANSI~C `size_t' type, i.e., the largest */ + /* _unsigned_ integer type used to express a file size or position, */ + /* or a memory block size. */ + /* */ + typedef size_t FT_Offset; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_PtrDist */ + /* */ + /* <Description> */ + /* This is equivalent to the ANSI~C `ptrdiff_t' type, i.e., the */ + /* largest _signed_ integer type used to express the distance */ + /* between two pointers. */ + /* */ + typedef ft_ptrdiff_t FT_PtrDist; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_UnitVector */ + /* */ + /* <Description> */ + /* A simple structure used to store a 2D vector unit vector. Uses */ + /* FT_F2Dot14 types. */ + /* */ + /* <Fields> */ + /* x :: Horizontal coordinate. */ + /* */ + /* y :: Vertical coordinate. */ + /* */ + typedef struct FT_UnitVector_ + { + FT_F2Dot14 x; + FT_F2Dot14 y; + + } FT_UnitVector; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Matrix */ + /* */ + /* <Description> */ + /* A simple structure used to store a 2x2 matrix. Coefficients are */ + /* in 16.16 fixed float format. The computation performed is: */ + /* */ + /* { */ + /* x' = x*xx + y*xy */ + /* y' = x*yx + y*yy */ + /* } */ + /* */ + /* <Fields> */ + /* xx :: Matrix coefficient. */ + /* */ + /* xy :: Matrix coefficient. */ + /* */ + /* yx :: Matrix coefficient. */ + /* */ + /* yy :: Matrix coefficient. */ + /* */ + typedef struct FT_Matrix_ + { + FT_Fixed xx, xy; + FT_Fixed yx, yy; + + } FT_Matrix; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Data */ + /* */ + /* <Description> */ + /* Read-only binary data represented as a pointer and a length. */ + /* */ + /* <Fields> */ + /* pointer :: The data. */ + /* */ + /* length :: The length of the data in bytes. */ + /* */ + typedef struct FT_Data_ + { + const FT_Byte* pointer; + FT_Int length; + + } FT_Data; + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Generic_Finalizer */ + /* */ + /* <Description> */ + /* Describe a function used to destroy the `client' data of any */ + /* FreeType object. See the description of the @FT_Generic type for */ + /* details of usage. */ + /* */ + /* <Input> */ + /* The address of the FreeType object which is under finalization. */ + /* Its client data is accessed through its `generic' field. */ + /* */ + typedef void (*FT_Generic_Finalizer)(void* object); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Generic */ + /* */ + /* <Description> */ + /* Client applications often need to associate their own data to a */ + /* variety of FreeType core objects. For example, a text layout API */ + /* might want to associate a glyph cache to a given size object. */ + /* */ + /* Most FreeType object contains a `generic' field, of type */ + /* FT_Generic, which usage is left to client applications and font */ + /* servers. */ + /* */ + /* It can be used to store a pointer to client-specific data, as well */ + /* as the address of a `finalizer' function, which will be called by */ + /* FreeType when the object is destroyed (for example, the previous */ + /* client example would put the address of the glyph cache destructor */ + /* in the `finalizer' field). */ + /* */ + /* <Fields> */ + /* data :: A typeless pointer to any client-specified data. This */ + /* field is completely ignored by the FreeType library. */ + /* */ + /* finalizer :: A pointer to a `generic finalizer' function, which */ + /* will be called when the object is destroyed. If this */ + /* field is set to NULL, no code will be called. */ + /* */ + typedef struct FT_Generic_ + { + void* data; + FT_Generic_Finalizer finalizer; + + } FT_Generic; + + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_MAKE_TAG */ + /* */ + /* <Description> */ + /* This macro converts four-letter tags which are used to label */ + /* TrueType tables into an unsigned long to be used within FreeType. */ + /* */ + /* <Note> */ + /* The produced values *must* be 32-bit integers. Don't redefine */ + /* this macro. */ + /* */ +#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \ + (FT_Tag) \ + ( ( (FT_ULong)_x1 << 24 ) | \ + ( (FT_ULong)_x2 << 16 ) | \ + ( (FT_ULong)_x3 << 8 ) | \ + (FT_ULong)_x4 ) + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* L I S T M A N A G E M E N T */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* list_processing */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_ListNode */ + /* */ + /* <Description> */ + /* Many elements and objects in FreeType are listed through an */ + /* @FT_List record (see @FT_ListRec). As its name suggests, an */ + /* FT_ListNode is a handle to a single list element. */ + /* */ + typedef struct FT_ListNodeRec_* FT_ListNode; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_List */ + /* */ + /* <Description> */ + /* A handle to a list record (see @FT_ListRec). */ + /* */ + typedef struct FT_ListRec_* FT_List; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_ListNodeRec */ + /* */ + /* <Description> */ + /* A structure used to hold a single list element. */ + /* */ + /* <Fields> */ + /* prev :: The previous element in the list. NULL if first. */ + /* */ + /* next :: The next element in the list. NULL if last. */ + /* */ + /* data :: A typeless pointer to the listed object. */ + /* */ + typedef struct FT_ListNodeRec_ + { + FT_ListNode prev; + FT_ListNode next; + void* data; + + } FT_ListNodeRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_ListRec */ + /* */ + /* <Description> */ + /* A structure used to hold a simple doubly-linked list. These are */ + /* used in many parts of FreeType. */ + /* */ + /* <Fields> */ + /* head :: The head (first element) of doubly-linked list. */ + /* */ + /* tail :: The tail (last element) of doubly-linked list. */ + /* */ + typedef struct FT_ListRec_ + { + FT_ListNode head; + FT_ListNode tail; + + } FT_ListRec; + + + /* */ + +#define FT_IS_EMPTY( list ) ( (list).head == 0 ) + + /* return base error code (without module-specific prefix) */ +#define FT_ERROR_BASE( x ) ( (x) & 0xFF ) + + /* return module error code */ +#define FT_ERROR_MODULE( x ) ( (x) & 0xFF00U ) + +#define FT_BOOL( x ) ( (FT_Bool)( x ) ) + +FT_END_HEADER + +#endif /* __FTTYPES_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftwinfnt.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftwinfnt.h new file mode 100644 index 00000000..ea333535 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftwinfnt.h @@ -0,0 +1,274 @@ +/***************************************************************************/ +/* */ +/* ftwinfnt.h */ +/* */ +/* FreeType API for accessing Windows fnt-specific data. */ +/* */ +/* Copyright 2003, 2004, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTWINFNT_H__ +#define __FTWINFNT_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* winfnt_fonts */ + /* */ + /* <Title> */ + /* Window FNT Files */ + /* */ + /* <Abstract> */ + /* Windows FNT specific API. */ + /* */ + /* <Description> */ + /* This section contains the declaration of Windows FNT specific */ + /* functions. */ + /* */ + /*************************************************************************/ + + + /************************************************************************* + * + * @enum: + * FT_WinFNT_ID_XXX + * + * @description: + * A list of valid values for the `charset' byte in + * @FT_WinFNT_HeaderRec. Exact mapping tables for the various cpXXXX + * encodings (except for cp1361) can be found at ftp://ftp.unicode.org + * in the MAPPINGS/VENDORS/MICSFT/WINDOWS subdirectory. cp1361 is + * roughly a superset of MAPPINGS/OBSOLETE/EASTASIA/KSC/JOHAB.TXT. + * + * @values: + * FT_WinFNT_ID_DEFAULT :: + * This is used for font enumeration and font creation as a + * `don't care' value. Valid font files don't contain this value. + * When querying for information about the character set of the font + * that is currently selected into a specified device context, this + * return value (of the related Windows API) simply denotes failure. + * + * FT_WinFNT_ID_SYMBOL :: + * There is no known mapping table available. + * + * FT_WinFNT_ID_MAC :: + * Mac Roman encoding. + * + * FT_WinFNT_ID_OEM :: + * From Michael Pöttgen <michael@poettgen.de>: + * + * The `Windows Font Mapping' article says that FT_WinFNT_ID_OEM + * is used for the charset of vector fonts, like `modern.fon', + * `roman.fon', and `script.fon' on Windows. + * + * The `CreateFont' documentation says: The FT_WinFNT_ID_OEM value + * specifies a character set that is operating-system dependent. + * + * The `IFIMETRICS' documentation from the `Windows Driver + * Development Kit' says: This font supports an OEM-specific + * character set. The OEM character set is system dependent. + * + * In general OEM, as opposed to ANSI (i.e., cp1252), denotes the + * second default codepage that most international versions of + * Windows have. It is one of the OEM codepages from + * + * http://www.microsoft.com/globaldev/reference/cphome.mspx, + * + * and is used for the `DOS boxes', to support legacy applications. + * A German Windows version for example usually uses ANSI codepage + * 1252 and OEM codepage 850. + * + * FT_WinFNT_ID_CP874 :: + * A superset of Thai TIS 620 and ISO 8859-11. + * + * FT_WinFNT_ID_CP932 :: + * A superset of Japanese Shift-JIS (with minor deviations). + * + * FT_WinFNT_ID_CP936 :: + * A superset of simplified Chinese GB 2312-1980 (with different + * ordering and minor deviations). + * + * FT_WinFNT_ID_CP949 :: + * A superset of Korean Hangul KS~C 5601-1987 (with different + * ordering and minor deviations). + * + * FT_WinFNT_ID_CP950 :: + * A superset of traditional Chinese Big~5 ETen (with different + * ordering and minor deviations). + * + * FT_WinFNT_ID_CP1250 :: + * A superset of East European ISO 8859-2 (with slightly different + * ordering). + * + * FT_WinFNT_ID_CP1251 :: + * A superset of Russian ISO 8859-5 (with different ordering). + * + * FT_WinFNT_ID_CP1252 :: + * ANSI encoding. A superset of ISO 8859-1. + * + * FT_WinFNT_ID_CP1253 :: + * A superset of Greek ISO 8859-7 (with minor modifications). + * + * FT_WinFNT_ID_CP1254 :: + * A superset of Turkish ISO 8859-9. + * + * FT_WinFNT_ID_CP1255 :: + * A superset of Hebrew ISO 8859-8 (with some modifications). + * + * FT_WinFNT_ID_CP1256 :: + * A superset of Arabic ISO 8859-6 (with different ordering). + * + * FT_WinFNT_ID_CP1257 :: + * A superset of Baltic ISO 8859-13 (with some deviations). + * + * FT_WinFNT_ID_CP1258 :: + * For Vietnamese. This encoding doesn't cover all necessary + * characters. + * + * FT_WinFNT_ID_CP1361 :: + * Korean (Johab). + */ + +#define FT_WinFNT_ID_CP1252 0 +#define FT_WinFNT_ID_DEFAULT 1 +#define FT_WinFNT_ID_SYMBOL 2 +#define FT_WinFNT_ID_MAC 77 +#define FT_WinFNT_ID_CP932 128 +#define FT_WinFNT_ID_CP949 129 +#define FT_WinFNT_ID_CP1361 130 +#define FT_WinFNT_ID_CP936 134 +#define FT_WinFNT_ID_CP950 136 +#define FT_WinFNT_ID_CP1253 161 +#define FT_WinFNT_ID_CP1254 162 +#define FT_WinFNT_ID_CP1258 163 +#define FT_WinFNT_ID_CP1255 177 +#define FT_WinFNT_ID_CP1256 178 +#define FT_WinFNT_ID_CP1257 186 +#define FT_WinFNT_ID_CP1251 204 +#define FT_WinFNT_ID_CP874 222 +#define FT_WinFNT_ID_CP1250 238 +#define FT_WinFNT_ID_OEM 255 + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_WinFNT_HeaderRec */ + /* */ + /* <Description> */ + /* Windows FNT Header info. */ + /* */ + typedef struct FT_WinFNT_HeaderRec_ + { + FT_UShort version; + FT_ULong file_size; + FT_Byte copyright[60]; + FT_UShort file_type; + FT_UShort nominal_point_size; + FT_UShort vertical_resolution; + FT_UShort horizontal_resolution; + FT_UShort ascent; + FT_UShort internal_leading; + FT_UShort external_leading; + FT_Byte italic; + FT_Byte underline; + FT_Byte strike_out; + FT_UShort weight; + FT_Byte charset; + FT_UShort pixel_width; + FT_UShort pixel_height; + FT_Byte pitch_and_family; + FT_UShort avg_width; + FT_UShort max_width; + FT_Byte first_char; + FT_Byte last_char; + FT_Byte default_char; + FT_Byte break_char; + FT_UShort bytes_per_row; + FT_ULong device_offset; + FT_ULong face_name_offset; + FT_ULong bits_pointer; + FT_ULong bits_offset; + FT_Byte reserved; + FT_ULong flags; + FT_UShort A_space; + FT_UShort B_space; + FT_UShort C_space; + FT_UShort color_table_offset; + FT_ULong reserved1[4]; + + } FT_WinFNT_HeaderRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_WinFNT_Header */ + /* */ + /* <Description> */ + /* A handle to an @FT_WinFNT_HeaderRec structure. */ + /* */ + typedef struct FT_WinFNT_HeaderRec_* FT_WinFNT_Header; + + + /********************************************************************** + * + * @function: + * FT_Get_WinFNT_Header + * + * @description: + * Retrieve a Windows FNT font info header. + * + * @input: + * face :: A handle to the input face. + * + * @output: + * aheader :: The WinFNT header. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with Windows FNT faces, returning an error + * otherwise. + */ + FT_EXPORT( FT_Error ) + FT_Get_WinFNT_Header( FT_Face face, + FT_WinFNT_HeaderRec *aheader ); + + + /* */ + +FT_END_HEADER + +#endif /* __FTWINFNT_H__ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftxf86.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftxf86.h new file mode 100644 index 00000000..8c68afdc --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ftxf86.h @@ -0,0 +1,83 @@ +/***************************************************************************/ +/* */ +/* ftxf86.h */ +/* */ +/* Support functions for X11. */ +/* */ +/* Copyright 2002, 2003, 2004, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTXF86_H__ +#define __FTXF86_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* font_formats */ + /* */ + /* <Title> */ + /* Font Formats */ + /* */ + /* <Abstract> */ + /* Getting the font format. */ + /* */ + /* <Description> */ + /* The single function in this section can be used to get the font */ + /* format. Note that this information is not needed normally; */ + /* however, there are special cases (like in PDF devices) where it is */ + /* important to differentiate, in spite of FreeType's uniform API. */ + /* */ + /* This function is in the X11/xf86 namespace for historical reasons */ + /* and in no way depends on that windowing system. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_X11_Font_Format */ + /* */ + /* <Description> */ + /* Return a string describing the format of a given face, using values */ + /* which can be used as an X11 FONT_PROPERTY. Possible values are */ + /* `TrueType', `Type~1', `BDF', `PCF', `Type~42', `CID~Type~1', `CFF', */ + /* `PFR', and `Windows~FNT'. */ + /* */ + /* <Input> */ + /* face :: */ + /* Input face handle. */ + /* */ + /* <Return> */ + /* Font format string. NULL in case of error. */ + /* */ + FT_EXPORT( const char* ) + FT_Get_X11_Font_Format( FT_Face face ); + + /* */ + +FT_END_HEADER + +#endif /* __FTXF86_H__ */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/t1tables.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/t1tables.h new file mode 100644 index 00000000..5e2a3934 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/t1tables.h @@ -0,0 +1,504 @@ +/***************************************************************************/ +/* */ +/* t1tables.h */ +/* */ +/* Basic Type 1/Type 2 tables definitions and interface (specification */ +/* only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T1TABLES_H__ +#define __T1TABLES_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* type1_tables */ + /* */ + /* <Title> */ + /* Type 1 Tables */ + /* */ + /* <Abstract> */ + /* Type~1 (PostScript) specific font tables. */ + /* */ + /* <Description> */ + /* This section contains the definition of Type 1-specific tables, */ + /* including structures related to other PostScript font formats. */ + /* */ + /*************************************************************************/ + + + /* Note that we separate font data in PS_FontInfoRec and PS_PrivateRec */ + /* structures in order to support Multiple Master fonts. */ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* PS_FontInfoRec */ + /* */ + /* <Description> */ + /* A structure used to model a Type~1 or Type~2 FontInfo dictionary. */ + /* Note that for Multiple Master fonts, each instance has its own */ + /* FontInfo dictionary. */ + /* */ + typedef struct PS_FontInfoRec_ + { + FT_String* version; + FT_String* notice; + FT_String* full_name; + FT_String* family_name; + FT_String* weight; + FT_Long italic_angle; + FT_Bool is_fixed_pitch; + FT_Short underline_position; + FT_UShort underline_thickness; + + } PS_FontInfoRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* PS_FontInfo */ + /* */ + /* <Description> */ + /* A handle to a @PS_FontInfoRec structure. */ + /* */ + typedef struct PS_FontInfoRec_* PS_FontInfo; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* T1_FontInfo */ + /* */ + /* <Description> */ + /* This type is equivalent to @PS_FontInfoRec. It is deprecated but */ + /* kept to maintain source compatibility between various versions of */ + /* FreeType. */ + /* */ + typedef PS_FontInfoRec T1_FontInfo; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* PS_PrivateRec */ + /* */ + /* <Description> */ + /* A structure used to model a Type~1 or Type~2 private dictionary. */ + /* Note that for Multiple Master fonts, each instance has its own */ + /* Private dictionary. */ + /* */ + typedef struct PS_PrivateRec_ + { + FT_Int unique_id; + FT_Int lenIV; + + FT_Byte num_blue_values; + FT_Byte num_other_blues; + FT_Byte num_family_blues; + FT_Byte num_family_other_blues; + + FT_Short blue_values[14]; + FT_Short other_blues[10]; + + FT_Short family_blues [14]; + FT_Short family_other_blues[10]; + + FT_Fixed blue_scale; + FT_Int blue_shift; + FT_Int blue_fuzz; + + FT_UShort standard_width[1]; + FT_UShort standard_height[1]; + + FT_Byte num_snap_widths; + FT_Byte num_snap_heights; + FT_Bool force_bold; + FT_Bool round_stem_up; + + FT_Short snap_widths [13]; /* including std width */ + FT_Short snap_heights[13]; /* including std height */ + + FT_Fixed expansion_factor; + + FT_Long language_group; + FT_Long password; + + FT_Short min_feature[2]; + + } PS_PrivateRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* PS_Private */ + /* */ + /* <Description> */ + /* A handle to a @PS_PrivateRec structure. */ + /* */ + typedef struct PS_PrivateRec_* PS_Private; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* T1_Private */ + /* */ + /* <Description> */ + /* This type is equivalent to @PS_PrivateRec. It is deprecated but */ + /* kept to maintain source compatibility between various versions of */ + /* FreeType. */ + /* */ + typedef PS_PrivateRec T1_Private; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* T1_Blend_Flags */ + /* */ + /* <Description> */ + /* A set of flags used to indicate which fields are present in a */ + /* given blend dictionary (font info or private). Used to support */ + /* Multiple Masters fonts. */ + /* */ + typedef enum T1_Blend_Flags_ + { + /*# required fields in a FontInfo blend dictionary */ + T1_BLEND_UNDERLINE_POSITION = 0, + T1_BLEND_UNDERLINE_THICKNESS, + T1_BLEND_ITALIC_ANGLE, + + /*# required fields in a Private blend dictionary */ + T1_BLEND_BLUE_VALUES, + T1_BLEND_OTHER_BLUES, + T1_BLEND_STANDARD_WIDTH, + T1_BLEND_STANDARD_HEIGHT, + T1_BLEND_STEM_SNAP_WIDTHS, + T1_BLEND_STEM_SNAP_HEIGHTS, + T1_BLEND_BLUE_SCALE, + T1_BLEND_BLUE_SHIFT, + T1_BLEND_FAMILY_BLUES, + T1_BLEND_FAMILY_OTHER_BLUES, + T1_BLEND_FORCE_BOLD, + + /*# never remove */ + T1_BLEND_MAX + + } T1_Blend_Flags; + + /* */ + + + /*# backwards compatible definitions */ +#define t1_blend_underline_position T1_BLEND_UNDERLINE_POSITION +#define t1_blend_underline_thickness T1_BLEND_UNDERLINE_THICKNESS +#define t1_blend_italic_angle T1_BLEND_ITALIC_ANGLE +#define t1_blend_blue_values T1_BLEND_BLUE_VALUES +#define t1_blend_other_blues T1_BLEND_OTHER_BLUES +#define t1_blend_standard_widths T1_BLEND_STANDARD_WIDTH +#define t1_blend_standard_height T1_BLEND_STANDARD_HEIGHT +#define t1_blend_stem_snap_widths T1_BLEND_STEM_SNAP_WIDTHS +#define t1_blend_stem_snap_heights T1_BLEND_STEM_SNAP_HEIGHTS +#define t1_blend_blue_scale T1_BLEND_BLUE_SCALE +#define t1_blend_blue_shift T1_BLEND_BLUE_SHIFT +#define t1_blend_family_blues T1_BLEND_FAMILY_BLUES +#define t1_blend_family_other_blues T1_BLEND_FAMILY_OTHER_BLUES +#define t1_blend_force_bold T1_BLEND_FORCE_BOLD +#define t1_blend_max T1_BLEND_MAX + + + /* maximum number of Multiple Masters designs, as defined in the spec */ +#define T1_MAX_MM_DESIGNS 16 + + /* maximum number of Multiple Masters axes, as defined in the spec */ +#define T1_MAX_MM_AXIS 4 + + /* maximum number of elements in a design map */ +#define T1_MAX_MM_MAP_POINTS 20 + + + /* this structure is used to store the BlendDesignMap entry for an axis */ + typedef struct PS_DesignMap_ + { + FT_Byte num_points; + FT_Long* design_points; + FT_Fixed* blend_points; + + } PS_DesignMapRec, *PS_DesignMap; + + /* backwards-compatible definition */ + typedef PS_DesignMapRec T1_DesignMap; + + + typedef struct PS_BlendRec_ + { + FT_UInt num_designs; + FT_UInt num_axis; + + FT_String* axis_names[T1_MAX_MM_AXIS]; + FT_Fixed* design_pos[T1_MAX_MM_DESIGNS]; + PS_DesignMapRec design_map[T1_MAX_MM_AXIS]; + + FT_Fixed* weight_vector; + FT_Fixed* default_weight_vector; + + PS_FontInfo font_infos[T1_MAX_MM_DESIGNS + 1]; + PS_Private privates [T1_MAX_MM_DESIGNS + 1]; + + FT_ULong blend_bitflags; + + FT_BBox* bboxes [T1_MAX_MM_DESIGNS + 1]; + + /* since 2.3.0 */ + + /* undocumented, optional: the default design instance; */ + /* corresponds to default_weight_vector -- */ + /* num_default_design_vector == 0 means it is not present */ + /* in the font and associated metrics files */ + FT_UInt default_design_vector[T1_MAX_MM_DESIGNS]; + FT_UInt num_default_design_vector; + + } PS_BlendRec, *PS_Blend; + + + /* backwards-compatible definition */ + typedef PS_BlendRec T1_Blend; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* CID_FaceDictRec */ + /* */ + /* <Description> */ + /* A structure used to represent data in a CID top-level dictionary. */ + /* */ + typedef struct CID_FaceDictRec_ + { + PS_PrivateRec private_dict; + + FT_UInt len_buildchar; + FT_Fixed forcebold_threshold; + FT_Pos stroke_width; + FT_Fixed expansion_factor; + + FT_Byte paint_type; + FT_Byte font_type; + FT_Matrix font_matrix; + FT_Vector font_offset; + + FT_UInt num_subrs; + FT_ULong subrmap_offset; + FT_Int sd_bytes; + + } CID_FaceDictRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* CID_FaceDict */ + /* */ + /* <Description> */ + /* A handle to a @CID_FaceDictRec structure. */ + /* */ + typedef struct CID_FaceDictRec_* CID_FaceDict; + + /* */ + + + /* backwards-compatible definition */ + typedef CID_FaceDictRec CID_FontDict; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* CID_FaceInfoRec */ + /* */ + /* <Description> */ + /* A structure used to represent CID Face information. */ + /* */ + typedef struct CID_FaceInfoRec_ + { + FT_String* cid_font_name; + FT_Fixed cid_version; + FT_Int cid_font_type; + + FT_String* registry; + FT_String* ordering; + FT_Int supplement; + + PS_FontInfoRec font_info; + FT_BBox font_bbox; + FT_ULong uid_base; + + FT_Int num_xuid; + FT_ULong xuid[16]; + + FT_ULong cidmap_offset; + FT_Int fd_bytes; + FT_Int gd_bytes; + FT_ULong cid_count; + + FT_Int num_dicts; + CID_FaceDict font_dicts; + + FT_ULong data_offset; + + } CID_FaceInfoRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* CID_FaceInfo */ + /* */ + /* <Description> */ + /* A handle to a @CID_FaceInfoRec structure. */ + /* */ + typedef struct CID_FaceInfoRec_* CID_FaceInfo; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* CID_Info */ + /* */ + /* <Description> */ + /* This type is equivalent to @CID_FaceInfoRec. It is deprecated but */ + /* kept to maintain source compatibility between various versions of */ + /* FreeType. */ + /* */ + typedef CID_FaceInfoRec CID_Info; + + + /************************************************************************ + * + * @function: + * FT_Has_PS_Glyph_Names + * + * @description: + * Return true if a given face provides reliable PostScript glyph + * names. This is similar to using the @FT_HAS_GLYPH_NAMES macro, + * except that certain fonts (mostly TrueType) contain incorrect + * glyph name tables. + * + * When this function returns true, the caller is sure that the glyph + * names returned by @FT_Get_Glyph_Name are reliable. + * + * @input: + * face :: + * face handle + * + * @return: + * Boolean. True if glyph names are reliable. + * + */ + FT_EXPORT( FT_Int ) + FT_Has_PS_Glyph_Names( FT_Face face ); + + + /************************************************************************ + * + * @function: + * FT_Get_PS_Font_Info + * + * @description: + * Retrieve the @PS_FontInfoRec structure corresponding to a given + * PostScript font. + * + * @input: + * face :: + * PostScript face handle. + * + * @output: + * afont_info :: + * Output font info structure pointer. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The string pointers within the font info structure are owned by + * the face and don't need to be freed by the caller. + * + * If the font's format is not PostScript-based, this function will + * return the `FT_Err_Invalid_Argument' error code. + * + */ + FT_EXPORT( FT_Error ) + FT_Get_PS_Font_Info( FT_Face face, + PS_FontInfo afont_info ); + + + /************************************************************************ + * + * @function: + * FT_Get_PS_Font_Private + * + * @description: + * Retrieve the @PS_PrivateRec structure corresponding to a given + * PostScript font. + * + * @input: + * face :: + * PostScript face handle. + * + * @output: + * afont_private :: + * Output private dictionary structure pointer. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The string pointers within the @PS_PrivateRec structure are owned by + * the face and don't need to be freed by the caller. + * + * If the font's format is not PostScript-based, this function returns + * the `FT_Err_Invalid_Argument' error code. + * + */ + FT_EXPORT( FT_Error ) + FT_Get_PS_Font_Private( FT_Face face, + PS_Private afont_private ); + + /* */ + + +FT_END_HEADER + +#endif /* __T1TABLES_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ttnameid.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ttnameid.h new file mode 100644 index 00000000..66aef043 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ttnameid.h @@ -0,0 +1,1247 @@ +/***************************************************************************/ +/* */ +/* ttnameid.h */ +/* */ +/* TrueType name ID definitions (specification only). */ +/* */ +/* Copyright 1996-2002, 2003, 2004, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTNAMEID_H__ +#define __TTNAMEID_H__ + + +#include <ft2build.h> + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* truetype_tables */ + /* */ + + + /*************************************************************************/ + /* */ + /* Possible values for the `platform' identifier code in the name */ + /* records of the TTF `name' table. */ + /* */ + /*************************************************************************/ + + + /*********************************************************************** + * + * @enum: + * TT_PLATFORM_XXX + * + * @description: + * A list of valid values for the `platform_id' identifier code in + * @FT_CharMapRec and @FT_SfntName structures. + * + * @values: + * TT_PLATFORM_APPLE_UNICODE :: + * Used by Apple to indicate a Unicode character map and/or name entry. + * See @TT_APPLE_ID_XXX for corresponding `encoding_id' values. Note + * that name entries in this format are coded as big-endian UCS-2 + * character codes _only_. + * + * TT_PLATFORM_MACINTOSH :: + * Used by Apple to indicate a MacOS-specific charmap and/or name entry. + * See @TT_MAC_ID_XXX for corresponding `encoding_id' values. Note that + * most TrueType fonts contain an Apple roman charmap to be usable on + * MacOS systems (even if they contain a Microsoft charmap as well). + * + * TT_PLATFORM_ISO :: + * This value was used to specify ISO/IEC 10646 charmaps. It is however + * now deprecated. See @TT_ISO_ID_XXX for a list of corresponding + * `encoding_id' values. + * + * TT_PLATFORM_MICROSOFT :: + * Used by Microsoft to indicate Windows-specific charmaps. See + * @TT_MS_ID_XXX for a list of corresponding `encoding_id' values. + * Note that most fonts contain a Unicode charmap using + * (TT_PLATFORM_MICROSOFT, @TT_MS_ID_UNICODE_CS). + * + * TT_PLATFORM_CUSTOM :: + * Used to indicate application-specific charmaps. + * + * TT_PLATFORM_ADOBE :: + * This value isn't part of any font format specification, but is used + * by FreeType to report Adobe-specific charmaps in an @FT_CharMapRec + * structure. See @TT_ADOBE_ID_XXX. + */ + +#define TT_PLATFORM_APPLE_UNICODE 0 +#define TT_PLATFORM_MACINTOSH 1 +#define TT_PLATFORM_ISO 2 /* deprecated */ +#define TT_PLATFORM_MICROSOFT 3 +#define TT_PLATFORM_CUSTOM 4 +#define TT_PLATFORM_ADOBE 7 /* artificial */ + + + /*********************************************************************** + * + * @enum: + * TT_APPLE_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id' for + * @TT_PLATFORM_APPLE_UNICODE charmaps and name entries. + * + * @values: + * TT_APPLE_ID_DEFAULT :: + * Unicode version 1.0. + * + * TT_APPLE_ID_UNICODE_1_1 :: + * Unicode 1.1; specifies Hangul characters starting at U+34xx. + * + * TT_APPLE_ID_ISO_10646 :: + * Deprecated (identical to preceding). + * + * TT_APPLE_ID_UNICODE_2_0 :: + * Unicode 2.0 and beyond (UTF-16 BMP only). + * + * TT_APPLE_ID_UNICODE_32 :: + * Unicode 3.1 and beyond, using UTF-32. + * + * TT_APPLE_ID_VARIANT_SELECTOR :: + * From Adobe, not Apple. Not a normal cmap. Specifies variations + * on a real cmap. + */ + +#define TT_APPLE_ID_DEFAULT 0 /* Unicode 1.0 */ +#define TT_APPLE_ID_UNICODE_1_1 1 /* specify Hangul at U+34xx */ +#define TT_APPLE_ID_ISO_10646 2 /* deprecated */ +#define TT_APPLE_ID_UNICODE_2_0 3 /* or later */ +#define TT_APPLE_ID_UNICODE_32 4 /* 2.0 or later, full repertoire */ +#define TT_APPLE_ID_VARIANT_SELECTOR 5 /* variation selector data */ + + + /*********************************************************************** + * + * @enum: + * TT_MAC_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id' for + * @TT_PLATFORM_MACINTOSH charmaps and name entries. + * + * @values: + * TT_MAC_ID_ROMAN :: + * TT_MAC_ID_JAPANESE :: + * TT_MAC_ID_TRADITIONAL_CHINESE :: + * TT_MAC_ID_KOREAN :: + * TT_MAC_ID_ARABIC :: + * TT_MAC_ID_HEBREW :: + * TT_MAC_ID_GREEK :: + * TT_MAC_ID_RUSSIAN :: + * TT_MAC_ID_RSYMBOL :: + * TT_MAC_ID_DEVANAGARI :: + * TT_MAC_ID_GURMUKHI :: + * TT_MAC_ID_GUJARATI :: + * TT_MAC_ID_ORIYA :: + * TT_MAC_ID_BENGALI :: + * TT_MAC_ID_TAMIL :: + * TT_MAC_ID_TELUGU :: + * TT_MAC_ID_KANNADA :: + * TT_MAC_ID_MALAYALAM :: + * TT_MAC_ID_SINHALESE :: + * TT_MAC_ID_BURMESE :: + * TT_MAC_ID_KHMER :: + * TT_MAC_ID_THAI :: + * TT_MAC_ID_LAOTIAN :: + * TT_MAC_ID_GEORGIAN :: + * TT_MAC_ID_ARMENIAN :: + * TT_MAC_ID_MALDIVIAN :: + * TT_MAC_ID_SIMPLIFIED_CHINESE :: + * TT_MAC_ID_TIBETAN :: + * TT_MAC_ID_MONGOLIAN :: + * TT_MAC_ID_GEEZ :: + * TT_MAC_ID_SLAVIC :: + * TT_MAC_ID_VIETNAMESE :: + * TT_MAC_ID_SINDHI :: + * TT_MAC_ID_UNINTERP :: + */ + +#define TT_MAC_ID_ROMAN 0 +#define TT_MAC_ID_JAPANESE 1 +#define TT_MAC_ID_TRADITIONAL_CHINESE 2 +#define TT_MAC_ID_KOREAN 3 +#define TT_MAC_ID_ARABIC 4 +#define TT_MAC_ID_HEBREW 5 +#define TT_MAC_ID_GREEK 6 +#define TT_MAC_ID_RUSSIAN 7 +#define TT_MAC_ID_RSYMBOL 8 +#define TT_MAC_ID_DEVANAGARI 9 +#define TT_MAC_ID_GURMUKHI 10 +#define TT_MAC_ID_GUJARATI 11 +#define TT_MAC_ID_ORIYA 12 +#define TT_MAC_ID_BENGALI 13 +#define TT_MAC_ID_TAMIL 14 +#define TT_MAC_ID_TELUGU 15 +#define TT_MAC_ID_KANNADA 16 +#define TT_MAC_ID_MALAYALAM 17 +#define TT_MAC_ID_SINHALESE 18 +#define TT_MAC_ID_BURMESE 19 +#define TT_MAC_ID_KHMER 20 +#define TT_MAC_ID_THAI 21 +#define TT_MAC_ID_LAOTIAN 22 +#define TT_MAC_ID_GEORGIAN 23 +#define TT_MAC_ID_ARMENIAN 24 +#define TT_MAC_ID_MALDIVIAN 25 +#define TT_MAC_ID_SIMPLIFIED_CHINESE 25 +#define TT_MAC_ID_TIBETAN 26 +#define TT_MAC_ID_MONGOLIAN 27 +#define TT_MAC_ID_GEEZ 28 +#define TT_MAC_ID_SLAVIC 29 +#define TT_MAC_ID_VIETNAMESE 30 +#define TT_MAC_ID_SINDHI 31 +#define TT_MAC_ID_UNINTERP 32 + + + /*********************************************************************** + * + * @enum: + * TT_ISO_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id' for + * @TT_PLATFORM_ISO charmaps and name entries. + * + * Their use is now deprecated. + * + * @values: + * TT_ISO_ID_7BIT_ASCII :: + * ASCII. + * TT_ISO_ID_10646 :: + * ISO/10646. + * TT_ISO_ID_8859_1 :: + * Also known as Latin-1. + */ + +#define TT_ISO_ID_7BIT_ASCII 0 +#define TT_ISO_ID_10646 1 +#define TT_ISO_ID_8859_1 2 + + + /*********************************************************************** + * + * @enum: + * TT_MS_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id' for + * @TT_PLATFORM_MICROSOFT charmaps and name entries. + * + * @values: + * TT_MS_ID_SYMBOL_CS :: + * Corresponds to Microsoft symbol encoding. See + * @FT_ENCODING_MS_SYMBOL. + * + * TT_MS_ID_UNICODE_CS :: + * Corresponds to a Microsoft WGL4 charmap, matching Unicode. See + * @FT_ENCODING_UNICODE. + * + * TT_MS_ID_SJIS :: + * Corresponds to SJIS Japanese encoding. See @FT_ENCODING_SJIS. + * + * TT_MS_ID_GB2312 :: + * Corresponds to Simplified Chinese as used in Mainland China. See + * @FT_ENCODING_GB2312. + * + * TT_MS_ID_BIG_5 :: + * Corresponds to Traditional Chinese as used in Taiwan and Hong Kong. + * See @FT_ENCODING_BIG5. + * + * TT_MS_ID_WANSUNG :: + * Corresponds to Korean Wansung encoding. See @FT_ENCODING_WANSUNG. + * + * TT_MS_ID_JOHAB :: + * Corresponds to Johab encoding. See @FT_ENCODING_JOHAB. + * + * TT_MS_ID_UCS_4 :: + * Corresponds to UCS-4 or UTF-32 charmaps. This has been added to + * the OpenType specification version 1.4 (mid-2001.) + */ + +#define TT_MS_ID_SYMBOL_CS 0 +#define TT_MS_ID_UNICODE_CS 1 +#define TT_MS_ID_SJIS 2 +#define TT_MS_ID_GB2312 3 +#define TT_MS_ID_BIG_5 4 +#define TT_MS_ID_WANSUNG 5 +#define TT_MS_ID_JOHAB 6 +#define TT_MS_ID_UCS_4 10 + + + /*********************************************************************** + * + * @enum: + * TT_ADOBE_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id' for + * @TT_PLATFORM_ADOBE charmaps. This is a FreeType-specific extension! + * + * @values: + * TT_ADOBE_ID_STANDARD :: + * Adobe standard encoding. + * TT_ADOBE_ID_EXPERT :: + * Adobe expert encoding. + * TT_ADOBE_ID_CUSTOM :: + * Adobe custom encoding. + * TT_ADOBE_ID_LATIN_1 :: + * Adobe Latin~1 encoding. + */ + +#define TT_ADOBE_ID_STANDARD 0 +#define TT_ADOBE_ID_EXPERT 1 +#define TT_ADOBE_ID_CUSTOM 2 +#define TT_ADOBE_ID_LATIN_1 3 + + + /*************************************************************************/ + /* */ + /* Possible values of the language identifier field in the name records */ + /* of the TTF `name' table if the `platform' identifier code is */ + /* TT_PLATFORM_MACINTOSH. */ + /* */ + /* The canonical source for the Apple assigned Language ID's is at */ + /* */ + /* http://fonts.apple.com/TTRefMan/RM06/Chap6name.html */ + /* */ +#define TT_MAC_LANGID_ENGLISH 0 +#define TT_MAC_LANGID_FRENCH 1 +#define TT_MAC_LANGID_GERMAN 2 +#define TT_MAC_LANGID_ITALIAN 3 +#define TT_MAC_LANGID_DUTCH 4 +#define TT_MAC_LANGID_SWEDISH 5 +#define TT_MAC_LANGID_SPANISH 6 +#define TT_MAC_LANGID_DANISH 7 +#define TT_MAC_LANGID_PORTUGUESE 8 +#define TT_MAC_LANGID_NORWEGIAN 9 +#define TT_MAC_LANGID_HEBREW 10 +#define TT_MAC_LANGID_JAPANESE 11 +#define TT_MAC_LANGID_ARABIC 12 +#define TT_MAC_LANGID_FINNISH 13 +#define TT_MAC_LANGID_GREEK 14 +#define TT_MAC_LANGID_ICELANDIC 15 +#define TT_MAC_LANGID_MALTESE 16 +#define TT_MAC_LANGID_TURKISH 17 +#define TT_MAC_LANGID_CROATIAN 18 +#define TT_MAC_LANGID_CHINESE_TRADITIONAL 19 +#define TT_MAC_LANGID_URDU 20 +#define TT_MAC_LANGID_HINDI 21 +#define TT_MAC_LANGID_THAI 22 +#define TT_MAC_LANGID_KOREAN 23 +#define TT_MAC_LANGID_LITHUANIAN 24 +#define TT_MAC_LANGID_POLISH 25 +#define TT_MAC_LANGID_HUNGARIAN 26 +#define TT_MAC_LANGID_ESTONIAN 27 +#define TT_MAC_LANGID_LETTISH 28 +#define TT_MAC_LANGID_SAAMISK 29 +#define TT_MAC_LANGID_FAEROESE 30 +#define TT_MAC_LANGID_FARSI 31 +#define TT_MAC_LANGID_RUSSIAN 32 +#define TT_MAC_LANGID_CHINESE_SIMPLIFIED 33 +#define TT_MAC_LANGID_FLEMISH 34 +#define TT_MAC_LANGID_IRISH 35 +#define TT_MAC_LANGID_ALBANIAN 36 +#define TT_MAC_LANGID_ROMANIAN 37 +#define TT_MAC_LANGID_CZECH 38 +#define TT_MAC_LANGID_SLOVAK 39 +#define TT_MAC_LANGID_SLOVENIAN 40 +#define TT_MAC_LANGID_YIDDISH 41 +#define TT_MAC_LANGID_SERBIAN 42 +#define TT_MAC_LANGID_MACEDONIAN 43 +#define TT_MAC_LANGID_BULGARIAN 44 +#define TT_MAC_LANGID_UKRAINIAN 45 +#define TT_MAC_LANGID_BYELORUSSIAN 46 +#define TT_MAC_LANGID_UZBEK 47 +#define TT_MAC_LANGID_KAZAKH 48 +#define TT_MAC_LANGID_AZERBAIJANI 49 +#define TT_MAC_LANGID_AZERBAIJANI_CYRILLIC_SCRIPT 49 +#define TT_MAC_LANGID_AZERBAIJANI_ARABIC_SCRIPT 50 +#define TT_MAC_LANGID_ARMENIAN 51 +#define TT_MAC_LANGID_GEORGIAN 52 +#define TT_MAC_LANGID_MOLDAVIAN 53 +#define TT_MAC_LANGID_KIRGHIZ 54 +#define TT_MAC_LANGID_TAJIKI 55 +#define TT_MAC_LANGID_TURKMEN 56 +#define TT_MAC_LANGID_MONGOLIAN 57 +#define TT_MAC_LANGID_MONGOLIAN_MONGOLIAN_SCRIPT 57 +#define TT_MAC_LANGID_MONGOLIAN_CYRILLIC_SCRIPT 58 +#define TT_MAC_LANGID_PASHTO 59 +#define TT_MAC_LANGID_KURDISH 60 +#define TT_MAC_LANGID_KASHMIRI 61 +#define TT_MAC_LANGID_SINDHI 62 +#define TT_MAC_LANGID_TIBETAN 63 +#define TT_MAC_LANGID_NEPALI 64 +#define TT_MAC_LANGID_SANSKRIT 65 +#define TT_MAC_LANGID_MARATHI 66 +#define TT_MAC_LANGID_BENGALI 67 +#define TT_MAC_LANGID_ASSAMESE 68 +#define TT_MAC_LANGID_GUJARATI 69 +#define TT_MAC_LANGID_PUNJABI 70 +#define TT_MAC_LANGID_ORIYA 71 +#define TT_MAC_LANGID_MALAYALAM 72 +#define TT_MAC_LANGID_KANNADA 73 +#define TT_MAC_LANGID_TAMIL 74 +#define TT_MAC_LANGID_TELUGU 75 +#define TT_MAC_LANGID_SINHALESE 76 +#define TT_MAC_LANGID_BURMESE 77 +#define TT_MAC_LANGID_KHMER 78 +#define TT_MAC_LANGID_LAO 79 +#define TT_MAC_LANGID_VIETNAMESE 80 +#define TT_MAC_LANGID_INDONESIAN 81 +#define TT_MAC_LANGID_TAGALOG 82 +#define TT_MAC_LANGID_MALAY_ROMAN_SCRIPT 83 +#define TT_MAC_LANGID_MALAY_ARABIC_SCRIPT 84 +#define TT_MAC_LANGID_AMHARIC 85 +#define TT_MAC_LANGID_TIGRINYA 86 +#define TT_MAC_LANGID_GALLA 87 +#define TT_MAC_LANGID_SOMALI 88 +#define TT_MAC_LANGID_SWAHILI 89 +#define TT_MAC_LANGID_RUANDA 90 +#define TT_MAC_LANGID_RUNDI 91 +#define TT_MAC_LANGID_CHEWA 92 +#define TT_MAC_LANGID_MALAGASY 93 +#define TT_MAC_LANGID_ESPERANTO 94 +#define TT_MAC_LANGID_WELSH 128 +#define TT_MAC_LANGID_BASQUE 129 +#define TT_MAC_LANGID_CATALAN 130 +#define TT_MAC_LANGID_LATIN 131 +#define TT_MAC_LANGID_QUECHUA 132 +#define TT_MAC_LANGID_GUARANI 133 +#define TT_MAC_LANGID_AYMARA 134 +#define TT_MAC_LANGID_TATAR 135 +#define TT_MAC_LANGID_UIGHUR 136 +#define TT_MAC_LANGID_DZONGKHA 137 +#define TT_MAC_LANGID_JAVANESE 138 +#define TT_MAC_LANGID_SUNDANESE 139 + + +#if 0 /* these seem to be errors that have been dropped */ + +#define TT_MAC_LANGID_SCOTTISH_GAELIC 140 +#define TT_MAC_LANGID_IRISH_GAELIC 141 + +#endif + + + /* The following codes are new as of 2000-03-10 */ +#define TT_MAC_LANGID_GALICIAN 140 +#define TT_MAC_LANGID_AFRIKAANS 141 +#define TT_MAC_LANGID_BRETON 142 +#define TT_MAC_LANGID_INUKTITUT 143 +#define TT_MAC_LANGID_SCOTTISH_GAELIC 144 +#define TT_MAC_LANGID_MANX_GAELIC 145 +#define TT_MAC_LANGID_IRISH_GAELIC 146 +#define TT_MAC_LANGID_TONGAN 147 +#define TT_MAC_LANGID_GREEK_POLYTONIC 148 +#define TT_MAC_LANGID_GREELANDIC 149 +#define TT_MAC_LANGID_AZERBAIJANI_ROMAN_SCRIPT 150 + + + /*************************************************************************/ + /* */ + /* Possible values of the language identifier field in the name records */ + /* of the TTF `name' table if the `platform' identifier code is */ + /* TT_PLATFORM_MICROSOFT. */ + /* */ + /* The canonical source for the MS assigned LCID's (seems to) be at */ + /* */ + /* http://www.microsoft.com/globaldev/reference/lcid-all.mspx */ + /* */ + /* It used to be at various places, among them */ + /* */ + /* http://www.microsoft.com/typography/OTSPEC/lcid-cp.txt */ + /* http://www.microsoft.com/globaldev/reference/loclanghome.asp */ + /* http://support.microsoft.com/support/kb/articles/Q224/8/04.ASP */ + /* http://msdn.microsoft.com/library/en-us/passport25/ */ + /* NET_Passport_VBScript_Documentation/Single_Sign_In/ */ + /* Advanced_Single_Sign_In/Localization_and_LCIDs.asp */ + /* */ + /* Hopefully, it seems now that the Globaldev site prevails... */ + /* (updated by Antoine, 2004-02-17) */ + +#define TT_MS_LANGID_ARABIC_GENERAL 0x0001 +#define TT_MS_LANGID_ARABIC_SAUDI_ARABIA 0x0401 +#define TT_MS_LANGID_ARABIC_IRAQ 0x0801 +#define TT_MS_LANGID_ARABIC_EGYPT 0x0c01 +#define TT_MS_LANGID_ARABIC_LIBYA 0x1001 +#define TT_MS_LANGID_ARABIC_ALGERIA 0x1401 +#define TT_MS_LANGID_ARABIC_MOROCCO 0x1801 +#define TT_MS_LANGID_ARABIC_TUNISIA 0x1c01 +#define TT_MS_LANGID_ARABIC_OMAN 0x2001 +#define TT_MS_LANGID_ARABIC_YEMEN 0x2401 +#define TT_MS_LANGID_ARABIC_SYRIA 0x2801 +#define TT_MS_LANGID_ARABIC_JORDAN 0x2c01 +#define TT_MS_LANGID_ARABIC_LEBANON 0x3001 +#define TT_MS_LANGID_ARABIC_KUWAIT 0x3401 +#define TT_MS_LANGID_ARABIC_UAE 0x3801 +#define TT_MS_LANGID_ARABIC_BAHRAIN 0x3c01 +#define TT_MS_LANGID_ARABIC_QATAR 0x4001 +#define TT_MS_LANGID_BULGARIAN_BULGARIA 0x0402 +#define TT_MS_LANGID_CATALAN_SPAIN 0x0403 +#define TT_MS_LANGID_CHINESE_GENERAL 0x0004 +#define TT_MS_LANGID_CHINESE_TAIWAN 0x0404 +#define TT_MS_LANGID_CHINESE_PRC 0x0804 +#define TT_MS_LANGID_CHINESE_HONG_KONG 0x0c04 +#define TT_MS_LANGID_CHINESE_SINGAPORE 0x1004 + +#if 1 /* this looks like the correct value */ +#define TT_MS_LANGID_CHINESE_MACAU 0x1404 +#else /* but beware, Microsoft may change its mind... + the most recent Word reference has the following: */ +#define TT_MS_LANGID_CHINESE_MACAU TT_MS_LANGID_CHINESE_HONG_KONG +#endif + +#if 0 /* used only with .NET `cultures'; commented out */ +#define TT_MS_LANGID_CHINESE_TRADITIONAL 0x7C04 +#endif + +#define TT_MS_LANGID_CZECH_CZECH_REPUBLIC 0x0405 +#define TT_MS_LANGID_DANISH_DENMARK 0x0406 +#define TT_MS_LANGID_GERMAN_GERMANY 0x0407 +#define TT_MS_LANGID_GERMAN_SWITZERLAND 0x0807 +#define TT_MS_LANGID_GERMAN_AUSTRIA 0x0c07 +#define TT_MS_LANGID_GERMAN_LUXEMBOURG 0x1007 +#define TT_MS_LANGID_GERMAN_LIECHTENSTEI 0x1407 +#define TT_MS_LANGID_GREEK_GREECE 0x0408 + + /* don't ask what this one means... It is commented out currently. */ +#if 0 +#define TT_MS_LANGID_GREEK_GREECE2 0x2008 +#endif + +#define TT_MS_LANGID_ENGLISH_GENERAL 0x0009 +#define TT_MS_LANGID_ENGLISH_UNITED_STATES 0x0409 +#define TT_MS_LANGID_ENGLISH_UNITED_KINGDOM 0x0809 +#define TT_MS_LANGID_ENGLISH_AUSTRALIA 0x0c09 +#define TT_MS_LANGID_ENGLISH_CANADA 0x1009 +#define TT_MS_LANGID_ENGLISH_NEW_ZEALAND 0x1409 +#define TT_MS_LANGID_ENGLISH_IRELAND 0x1809 +#define TT_MS_LANGID_ENGLISH_SOUTH_AFRICA 0x1c09 +#define TT_MS_LANGID_ENGLISH_JAMAICA 0x2009 +#define TT_MS_LANGID_ENGLISH_CARIBBEAN 0x2409 +#define TT_MS_LANGID_ENGLISH_BELIZE 0x2809 +#define TT_MS_LANGID_ENGLISH_TRINIDAD 0x2c09 +#define TT_MS_LANGID_ENGLISH_ZIMBABWE 0x3009 +#define TT_MS_LANGID_ENGLISH_PHILIPPINES 0x3409 +#define TT_MS_LANGID_ENGLISH_INDONESIA 0x3809 +#define TT_MS_LANGID_ENGLISH_HONG_KONG 0x3c09 +#define TT_MS_LANGID_ENGLISH_INDIA 0x4009 +#define TT_MS_LANGID_ENGLISH_MALAYSIA 0x4409 +#define TT_MS_LANGID_ENGLISH_SINGAPORE 0x4809 +#define TT_MS_LANGID_SPANISH_SPAIN_TRADITIONAL_SORT 0x040a +#define TT_MS_LANGID_SPANISH_MEXICO 0x080a +#define TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT 0x0c0a +#define TT_MS_LANGID_SPANISH_GUATEMALA 0x100a +#define TT_MS_LANGID_SPANISH_COSTA_RICA 0x140a +#define TT_MS_LANGID_SPANISH_PANAMA 0x180a +#define TT_MS_LANGID_SPANISH_DOMINICAN_REPUBLIC 0x1c0a +#define TT_MS_LANGID_SPANISH_VENEZUELA 0x200a +#define TT_MS_LANGID_SPANISH_COLOMBIA 0x240a +#define TT_MS_LANGID_SPANISH_PERU 0x280a +#define TT_MS_LANGID_SPANISH_ARGENTINA 0x2c0a +#define TT_MS_LANGID_SPANISH_ECUADOR 0x300a +#define TT_MS_LANGID_SPANISH_CHILE 0x340a +#define TT_MS_LANGID_SPANISH_URUGUAY 0x380a +#define TT_MS_LANGID_SPANISH_PARAGUAY 0x3c0a +#define TT_MS_LANGID_SPANISH_BOLIVIA 0x400a +#define TT_MS_LANGID_SPANISH_EL_SALVADOR 0x440a +#define TT_MS_LANGID_SPANISH_HONDURAS 0x480a +#define TT_MS_LANGID_SPANISH_NICARAGUA 0x4c0a +#define TT_MS_LANGID_SPANISH_PUERTO_RICO 0x500a +#define TT_MS_LANGID_SPANISH_UNITED_STATES 0x540a + /* The following ID blatantly violate MS specs by using a */ + /* sublanguage > 0x1F. */ +#define TT_MS_LANGID_SPANISH_LATIN_AMERICA 0xE40aU +#define TT_MS_LANGID_FINNISH_FINLAND 0x040b +#define TT_MS_LANGID_FRENCH_FRANCE 0x040c +#define TT_MS_LANGID_FRENCH_BELGIUM 0x080c +#define TT_MS_LANGID_FRENCH_CANADA 0x0c0c +#define TT_MS_LANGID_FRENCH_SWITZERLAND 0x100c +#define TT_MS_LANGID_FRENCH_LUXEMBOURG 0x140c +#define TT_MS_LANGID_FRENCH_MONACO 0x180c +#define TT_MS_LANGID_FRENCH_WEST_INDIES 0x1c0c +#define TT_MS_LANGID_FRENCH_REUNION 0x200c +#define TT_MS_LANGID_FRENCH_CONGO 0x240c + /* which was formerly: */ +#define TT_MS_LANGID_FRENCH_ZAIRE TT_MS_LANGID_FRENCH_CONGO +#define TT_MS_LANGID_FRENCH_SENEGAL 0x280c +#define TT_MS_LANGID_FRENCH_CAMEROON 0x2c0c +#define TT_MS_LANGID_FRENCH_COTE_D_IVOIRE 0x300c +#define TT_MS_LANGID_FRENCH_MALI 0x340c +#define TT_MS_LANGID_FRENCH_MOROCCO 0x380c +#define TT_MS_LANGID_FRENCH_HAITI 0x3c0c + /* and another violation of the spec (see 0xE40aU) */ +#define TT_MS_LANGID_FRENCH_NORTH_AFRICA 0xE40cU +#define TT_MS_LANGID_HEBREW_ISRAEL 0x040d +#define TT_MS_LANGID_HUNGARIAN_HUNGARY 0x040e +#define TT_MS_LANGID_ICELANDIC_ICELAND 0x040f +#define TT_MS_LANGID_ITALIAN_ITALY 0x0410 +#define TT_MS_LANGID_ITALIAN_SWITZERLAND 0x0810 +#define TT_MS_LANGID_JAPANESE_JAPAN 0x0411 +#define TT_MS_LANGID_KOREAN_EXTENDED_WANSUNG_KOREA 0x0412 +#define TT_MS_LANGID_KOREAN_JOHAB_KOREA 0x0812 +#define TT_MS_LANGID_DUTCH_NETHERLANDS 0x0413 +#define TT_MS_LANGID_DUTCH_BELGIUM 0x0813 +#define TT_MS_LANGID_NORWEGIAN_NORWAY_BOKMAL 0x0414 +#define TT_MS_LANGID_NORWEGIAN_NORWAY_NYNORSK 0x0814 +#define TT_MS_LANGID_POLISH_POLAND 0x0415 +#define TT_MS_LANGID_PORTUGUESE_BRAZIL 0x0416 +#define TT_MS_LANGID_PORTUGUESE_PORTUGAL 0x0816 +#define TT_MS_LANGID_RHAETO_ROMANIC_SWITZERLAND 0x0417 +#define TT_MS_LANGID_ROMANIAN_ROMANIA 0x0418 +#define TT_MS_LANGID_MOLDAVIAN_MOLDAVIA 0x0818 +#define TT_MS_LANGID_RUSSIAN_RUSSIA 0x0419 +#define TT_MS_LANGID_RUSSIAN_MOLDAVIA 0x0819 +#define TT_MS_LANGID_CROATIAN_CROATIA 0x041a +#define TT_MS_LANGID_SERBIAN_SERBIA_LATIN 0x081a +#define TT_MS_LANGID_SERBIAN_SERBIA_CYRILLIC 0x0c1a + +#if 0 /* this used to be this value, but it looks like we were wrong */ +#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA 0x101a +#else /* current sources say */ +#define TT_MS_LANGID_CROATIAN_BOSNIA_HERZEGOVINA 0x101a +#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA 0x141a + /* and XPsp2 Platform SDK added (2004-07-26) */ + /* Names are shortened to be significant within 40 chars. */ +#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_LATIN 0x181a +#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_CYRILLIC 0x181a +#endif + +#define TT_MS_LANGID_SLOVAK_SLOVAKIA 0x041b +#define TT_MS_LANGID_ALBANIAN_ALBANIA 0x041c +#define TT_MS_LANGID_SWEDISH_SWEDEN 0x041d +#define TT_MS_LANGID_SWEDISH_FINLAND 0x081d +#define TT_MS_LANGID_THAI_THAILAND 0x041e +#define TT_MS_LANGID_TURKISH_TURKEY 0x041f +#define TT_MS_LANGID_URDU_PAKISTAN 0x0420 +#define TT_MS_LANGID_URDU_INDIA 0x0820 +#define TT_MS_LANGID_INDONESIAN_INDONESIA 0x0421 +#define TT_MS_LANGID_UKRAINIAN_UKRAINE 0x0422 +#define TT_MS_LANGID_BELARUSIAN_BELARUS 0x0423 +#define TT_MS_LANGID_SLOVENE_SLOVENIA 0x0424 +#define TT_MS_LANGID_ESTONIAN_ESTONIA 0x0425 +#define TT_MS_LANGID_LATVIAN_LATVIA 0x0426 +#define TT_MS_LANGID_LITHUANIAN_LITHUANIA 0x0427 +#define TT_MS_LANGID_CLASSIC_LITHUANIAN_LITHUANIA 0x0827 +#define TT_MS_LANGID_TAJIK_TAJIKISTAN 0x0428 +#define TT_MS_LANGID_FARSI_IRAN 0x0429 +#define TT_MS_LANGID_VIETNAMESE_VIET_NAM 0x042a +#define TT_MS_LANGID_ARMENIAN_ARMENIA 0x042b +#define TT_MS_LANGID_AZERI_AZERBAIJAN_LATIN 0x042c +#define TT_MS_LANGID_AZERI_AZERBAIJAN_CYRILLIC 0x082c +#define TT_MS_LANGID_BASQUE_SPAIN 0x042d +#define TT_MS_LANGID_SORBIAN_GERMANY 0x042e +#define TT_MS_LANGID_MACEDONIAN_MACEDONIA 0x042f +#define TT_MS_LANGID_SUTU_SOUTH_AFRICA 0x0430 +#define TT_MS_LANGID_TSONGA_SOUTH_AFRICA 0x0431 +#define TT_MS_LANGID_TSWANA_SOUTH_AFRICA 0x0432 +#define TT_MS_LANGID_VENDA_SOUTH_AFRICA 0x0433 +#define TT_MS_LANGID_XHOSA_SOUTH_AFRICA 0x0434 +#define TT_MS_LANGID_ZULU_SOUTH_AFRICA 0x0435 +#define TT_MS_LANGID_AFRIKAANS_SOUTH_AFRICA 0x0436 +#define TT_MS_LANGID_GEORGIAN_GEORGIA 0x0437 +#define TT_MS_LANGID_FAEROESE_FAEROE_ISLANDS 0x0438 +#define TT_MS_LANGID_HINDI_INDIA 0x0439 +#define TT_MS_LANGID_MALTESE_MALTA 0x043a + /* Added by XPsp2 Platform SDK (2004-07-26) */ +#define TT_MS_LANGID_SAMI_NORTHERN_NORWAY 0x043b +#define TT_MS_LANGID_SAMI_NORTHERN_SWEDEN 0x083b +#define TT_MS_LANGID_SAMI_NORTHERN_FINLAND 0x0C3b +#define TT_MS_LANGID_SAMI_LULE_NORWAY 0x103b +#define TT_MS_LANGID_SAMI_LULE_SWEDEN 0x143b +#define TT_MS_LANGID_SAMI_SOUTHERN_NORWAY 0x183b +#define TT_MS_LANGID_SAMI_SOUTHERN_SWEDEN 0x1C3b +#define TT_MS_LANGID_SAMI_SKOLT_FINLAND 0x203b +#define TT_MS_LANGID_SAMI_INARI_FINLAND 0x243b + /* ... and we also keep our old identifier... */ +#define TT_MS_LANGID_SAAMI_LAPONIA 0x043b + +#if 0 /* this seems to be a previous inversion */ +#define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043c +#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083c +#else +#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083c +#define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043c +#endif + +#define TT_MS_LANGID_YIDDISH_GERMANY 0x043d +#define TT_MS_LANGID_MALAY_MALAYSIA 0x043e +#define TT_MS_LANGID_MALAY_BRUNEI_DARUSSALAM 0x083e +#define TT_MS_LANGID_KAZAK_KAZAKSTAN 0x043f +#define TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN /* Cyrillic*/ 0x0440 + /* alias declared in Windows 2000 */ +#define TT_MS_LANGID_KIRGHIZ_KIRGHIZ_REPUBLIC \ + TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN + +#define TT_MS_LANGID_SWAHILI_KENYA 0x0441 +#define TT_MS_LANGID_TURKMEN_TURKMENISTAN 0x0442 +#define TT_MS_LANGID_UZBEK_UZBEKISTAN_LATIN 0x0443 +#define TT_MS_LANGID_UZBEK_UZBEKISTAN_CYRILLIC 0x0843 +#define TT_MS_LANGID_TATAR_TATARSTAN 0x0444 +#define TT_MS_LANGID_BENGALI_INDIA 0x0445 +#define TT_MS_LANGID_BENGALI_BANGLADESH 0x0845 +#define TT_MS_LANGID_PUNJABI_INDIA 0x0446 +#define TT_MS_LANGID_PUNJABI_ARABIC_PAKISTAN 0x0846 +#define TT_MS_LANGID_GUJARATI_INDIA 0x0447 +#define TT_MS_LANGID_ORIYA_INDIA 0x0448 +#define TT_MS_LANGID_TAMIL_INDIA 0x0449 +#define TT_MS_LANGID_TELUGU_INDIA 0x044a +#define TT_MS_LANGID_KANNADA_INDIA 0x044b +#define TT_MS_LANGID_MALAYALAM_INDIA 0x044c +#define TT_MS_LANGID_ASSAMESE_INDIA 0x044d +#define TT_MS_LANGID_MARATHI_INDIA 0x044e +#define TT_MS_LANGID_SANSKRIT_INDIA 0x044f +#define TT_MS_LANGID_MONGOLIAN_MONGOLIA /* Cyrillic */ 0x0450 +#define TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIAN 0x0850 +#define TT_MS_LANGID_TIBETAN_CHINA 0x0451 + /* Don't use the next constant! It has */ + /* (1) the wrong spelling (Dzonghka) */ + /* (2) Microsoft doesn't officially define it -- */ + /* at least it is not in the List of Local */ + /* ID Values. */ + /* (3) Dzongkha is not the same language as */ + /* Tibetan, so merging it is wrong anyway. */ + /* */ + /* TT_MS_LANGID_TIBETAN_BHUTAN is correct, BTW. */ +#define TT_MS_LANGID_DZONGHKA_BHUTAN 0x0851 + +#if 0 + /* the following used to be defined */ +#define TT_MS_LANGID_TIBETAN_BHUTAN 0x0451 + /* ... but it was changed; */ +#else + /* So we will continue to #define it, but with the correct value */ +#define TT_MS_LANGID_TIBETAN_BHUTAN TT_MS_LANGID_DZONGHKA_BHUTAN +#endif + +#define TT_MS_LANGID_WELSH_WALES 0x0452 +#define TT_MS_LANGID_KHMER_CAMBODIA 0x0453 +#define TT_MS_LANGID_LAO_LAOS 0x0454 +#define TT_MS_LANGID_BURMESE_MYANMAR 0x0455 +#define TT_MS_LANGID_GALICIAN_SPAIN 0x0456 +#define TT_MS_LANGID_KONKANI_INDIA 0x0457 +#define TT_MS_LANGID_MANIPURI_INDIA /* Bengali */ 0x0458 +#define TT_MS_LANGID_SINDHI_INDIA /* Arabic */ 0x0459 +#define TT_MS_LANGID_SINDHI_PAKISTAN 0x0859 + /* Missing a LCID for Sindhi in Devanagari script */ +#define TT_MS_LANGID_SYRIAC_SYRIA 0x045a +#define TT_MS_LANGID_SINHALESE_SRI_LANKA 0x045b +#define TT_MS_LANGID_CHEROKEE_UNITED_STATES 0x045c +#define TT_MS_LANGID_INUKTITUT_CANADA 0x045d +#define TT_MS_LANGID_AMHARIC_ETHIOPIA 0x045e +#define TT_MS_LANGID_TAMAZIGHT_MOROCCO /* Arabic */ 0x045f +#define TT_MS_LANGID_TAMAZIGHT_MOROCCO_LATIN 0x085f + /* Missing a LCID for Tifinagh script */ +#define TT_MS_LANGID_KASHMIRI_PAKISTAN /* Arabic */ 0x0460 + /* Spelled this way by XPsp2 Platform SDK (2004-07-26) */ + /* script is yet unclear... might be Arabic, Nagari or Sharada */ +#define TT_MS_LANGID_KASHMIRI_SASIA 0x0860 + /* ... and aliased (by MS) for compatibility reasons. */ +#define TT_MS_LANGID_KASHMIRI_INDIA TT_MS_LANGID_KASHMIRI_SASIA +#define TT_MS_LANGID_NEPALI_NEPAL 0x0461 +#define TT_MS_LANGID_NEPALI_INDIA 0x0861 +#define TT_MS_LANGID_FRISIAN_NETHERLANDS 0x0462 +#define TT_MS_LANGID_PASHTO_AFGHANISTAN 0x0463 +#define TT_MS_LANGID_FILIPINO_PHILIPPINES 0x0464 +#define TT_MS_LANGID_DHIVEHI_MALDIVES 0x0465 + /* alias declared in Windows 2000 */ +#define TT_MS_LANGID_DIVEHI_MALDIVES TT_MS_LANGID_DHIVEHI_MALDIVES +#define TT_MS_LANGID_EDO_NIGERIA 0x0466 +#define TT_MS_LANGID_FULFULDE_NIGERIA 0x0467 +#define TT_MS_LANGID_HAUSA_NIGERIA 0x0468 +#define TT_MS_LANGID_IBIBIO_NIGERIA 0x0469 +#define TT_MS_LANGID_YORUBA_NIGERIA 0x046a +#define TT_MS_LANGID_QUECHUA_BOLIVIA 0x046b +#define TT_MS_LANGID_QUECHUA_ECUADOR 0x086b +#define TT_MS_LANGID_QUECHUA_PERU 0x0c6b +#define TT_MS_LANGID_SEPEDI_SOUTH_AFRICA 0x046c + /* Also spelled by XPsp2 Platform SDK (2004-07-26) */ +#define TT_MS_LANGID_SOTHO_SOUTHERN_SOUTH_AFRICA \ + TT_MS_LANGID_SEPEDI_SOUTH_AFRICA + /* language codes 0x046d, 0x046e and 0x046f are (still) unknown. */ +#define TT_MS_LANGID_IGBO_NIGERIA 0x0470 +#define TT_MS_LANGID_KANURI_NIGERIA 0x0471 +#define TT_MS_LANGID_OROMO_ETHIOPIA 0x0472 +#define TT_MS_LANGID_TIGRIGNA_ETHIOPIA 0x0473 +#define TT_MS_LANGID_TIGRIGNA_ERYTHREA 0x0873 + /* also spelled in the `Passport SDK' list as: */ +#define TT_MS_LANGID_TIGRIGNA_ERYTREA TT_MS_LANGID_TIGRIGNA_ERYTHREA +#define TT_MS_LANGID_GUARANI_PARAGUAY 0x0474 +#define TT_MS_LANGID_HAWAIIAN_UNITED_STATES 0x0475 +#define TT_MS_LANGID_LATIN 0x0476 +#define TT_MS_LANGID_SOMALI_SOMALIA 0x0477 + /* Note: Yi does not have a (proper) ISO 639-2 code, since it is mostly */ + /* not written (but OTOH the peculiar writing system is worth */ + /* studying). */ +#define TT_MS_LANGID_YI_CHINA 0x0478 +#define TT_MS_LANGID_PAPIAMENTU_NETHERLANDS_ANTILLES 0x0479 + /* language codes from 0x047a to 0x047f are (still) unknown. */ +#define TT_MS_LANGID_UIGHUR_CHINA 0x0480 +#define TT_MS_LANGID_MAORI_NEW_ZEALAND 0x0481 + +#if 0 /* not deemed useful for fonts */ +#define TT_MS_LANGID_HUMAN_INTERFACE_DEVICE 0x04ff +#endif + + + /*************************************************************************/ + /* */ + /* Possible values of the `name' identifier field in the name records of */ + /* the TTF `name' table. These values are platform independent. */ + /* */ +#define TT_NAME_ID_COPYRIGHT 0 +#define TT_NAME_ID_FONT_FAMILY 1 +#define TT_NAME_ID_FONT_SUBFAMILY 2 +#define TT_NAME_ID_UNIQUE_ID 3 +#define TT_NAME_ID_FULL_NAME 4 +#define TT_NAME_ID_VERSION_STRING 5 +#define TT_NAME_ID_PS_NAME 6 +#define TT_NAME_ID_TRADEMARK 7 + + /* the following values are from the OpenType spec */ +#define TT_NAME_ID_MANUFACTURER 8 +#define TT_NAME_ID_DESIGNER 9 +#define TT_NAME_ID_DESCRIPTION 10 +#define TT_NAME_ID_VENDOR_URL 11 +#define TT_NAME_ID_DESIGNER_URL 12 +#define TT_NAME_ID_LICENSE 13 +#define TT_NAME_ID_LICENSE_URL 14 + /* number 15 is reserved */ +#define TT_NAME_ID_PREFERRED_FAMILY 16 +#define TT_NAME_ID_PREFERRED_SUBFAMILY 17 +#define TT_NAME_ID_MAC_FULL_NAME 18 + + /* The following code is new as of 2000-01-21 */ +#define TT_NAME_ID_SAMPLE_TEXT 19 + + /* This is new in OpenType 1.3 */ +#define TT_NAME_ID_CID_FINDFONT_NAME 20 + + /* This is new in OpenType 1.5 */ +#define TT_NAME_ID_WWS_FAMILY 21 +#define TT_NAME_ID_WWS_SUBFAMILY 22 + + + /*************************************************************************/ + /* */ + /* Bit mask values for the Unicode Ranges from the TTF `OS2 ' table. */ + /* */ + /* Updated 08-Nov-2008. */ + /* */ + + /* Bit 0 Basic Latin */ +#define TT_UCR_BASIC_LATIN (1L << 0) /* U+0020-U+007E */ + /* Bit 1 C1 Controls and Latin-1 Supplement */ +#define TT_UCR_LATIN1_SUPPLEMENT (1L << 1) /* U+0080-U+00FF */ + /* Bit 2 Latin Extended-A */ +#define TT_UCR_LATIN_EXTENDED_A (1L << 2) /* U+0100-U+017F */ + /* Bit 3 Latin Extended-B */ +#define TT_UCR_LATIN_EXTENDED_B (1L << 3) /* U+0180-U+024F */ + /* Bit 4 IPA Extensions */ + /* Phonetic Extensions */ + /* Phonetic Extensions Supplement */ +#define TT_UCR_IPA_EXTENSIONS (1L << 4) /* U+0250-U+02AF */ + /* U+1D00-U+1D7F */ + /* U+1D80-U+1DBF */ + /* Bit 5 Spacing Modifier Letters */ + /* Modifier Tone Letters */ +#define TT_UCR_SPACING_MODIFIER (1L << 5) /* U+02B0-U+02FF */ + /* U+A700-U+A71F */ + /* Bit 6 Combining Diacritical Marks */ + /* Combining Diacritical Marks Supplement */ +#define TT_UCR_COMBINING_DIACRITICS (1L << 6) /* U+0300-U+036F */ + /* U+1DC0-U+1DFF */ + /* Bit 7 Greek and Coptic */ +#define TT_UCR_GREEK (1L << 7) /* U+0370-U+03FF */ + /* Bit 8 Coptic */ +#define TT_UCR_COPTIC (1L << 8) /* U+2C80-U+2CFF */ + /* Bit 9 Cyrillic */ + /* Cyrillic Supplement */ + /* Cyrillic Extended-A */ + /* Cyrillic Extended-B */ +#define TT_UCR_CYRILLIC (1L << 9) /* U+0400-U+04FF */ + /* U+0500-U+052F */ + /* U+2DE0-U+2DFF */ + /* U+A640-U+A69F */ + /* Bit 10 Armenian */ +#define TT_UCR_ARMENIAN (1L << 10) /* U+0530-U+058F */ + /* Bit 11 Hebrew */ +#define TT_UCR_HEBREW (1L << 11) /* U+0590-U+05FF */ + /* Bit 12 Vai */ +#define TT_UCR_VAI (1L << 12) /* U+A500-U+A63F */ + /* Bit 13 Arabic */ + /* Arabic Supplement */ +#define TT_UCR_ARABIC (1L << 13) /* U+0600-U+06FF */ + /* U+0750-U+077F */ + /* Bit 14 NKo */ +#define TT_UCR_NKO (1L << 14) /* U+07C0-U+07FF */ + /* Bit 15 Devanagari */ +#define TT_UCR_DEVANAGARI (1L << 15) /* U+0900-U+097F */ + /* Bit 16 Bengali */ +#define TT_UCR_BENGALI (1L << 16) /* U+0980-U+09FF */ + /* Bit 17 Gurmukhi */ +#define TT_UCR_GURMUKHI (1L << 17) /* U+0A00-U+0A7F */ + /* Bit 18 Gujarati */ +#define TT_UCR_GUJARATI (1L << 18) /* U+0A80-U+0AFF */ + /* Bit 19 Oriya */ +#define TT_UCR_ORIYA (1L << 19) /* U+0B00-U+0B7F */ + /* Bit 20 Tamil */ +#define TT_UCR_TAMIL (1L << 20) /* U+0B80-U+0BFF */ + /* Bit 21 Telugu */ +#define TT_UCR_TELUGU (1L << 21) /* U+0C00-U+0C7F */ + /* Bit 22 Kannada */ +#define TT_UCR_KANNADA (1L << 22) /* U+0C80-U+0CFF */ + /* Bit 23 Malayalam */ +#define TT_UCR_MALAYALAM (1L << 23) /* U+0D00-U+0D7F */ + /* Bit 24 Thai */ +#define TT_UCR_THAI (1L << 24) /* U+0E00-U+0E7F */ + /* Bit 25 Lao */ +#define TT_UCR_LAO (1L << 25) /* U+0E80-U+0EFF */ + /* Bit 26 Georgian */ + /* Georgian Supplement */ +#define TT_UCR_GEORGIAN (1L << 26) /* U+10A0-U+10FF */ + /* U+2D00-U+2D2F */ + /* Bit 27 Balinese */ +#define TT_UCR_BALINESE (1L << 27) /* U+1B00-U+1B7F */ + /* Bit 28 Hangul Jamo */ +#define TT_UCR_HANGUL_JAMO (1L << 28) /* U+1100-U+11FF */ + /* Bit 29 Latin Extended Additional */ + /* Latin Extended-C */ + /* Latin Extended-D */ +#define TT_UCR_LATIN_EXTENDED_ADDITIONAL (1L << 29) /* U+1E00-U+1EFF */ + /* U+2C60-U+2C7F */ + /* U+A720-U+A7FF */ + /* Bit 30 Greek Extended */ +#define TT_UCR_GREEK_EXTENDED (1L << 30) /* U+1F00-U+1FFF */ + /* Bit 31 General Punctuation */ + /* Supplemental Punctuation */ +#define TT_UCR_GENERAL_PUNCTUATION (1L << 31) /* U+2000-U+206F */ + /* U+2E00-U+2E7F */ + /* Bit 32 Superscripts And Subscripts */ +#define TT_UCR_SUPERSCRIPTS_SUBSCRIPTS (1L << 0) /* U+2070-U+209F */ + /* Bit 33 Currency Symbols */ +#define TT_UCR_CURRENCY_SYMBOLS (1L << 1) /* U+20A0-U+20CF */ + /* Bit 34 Combining Diacritical Marks For Symbols */ +#define TT_UCR_COMBINING_DIACRITICS_SYMB (1L << 2) /* U+20D0-U+20FF */ + /* Bit 35 Letterlike Symbols */ +#define TT_UCR_LETTERLIKE_SYMBOLS (1L << 3) /* U+2100-U+214F */ + /* Bit 36 Number Forms */ +#define TT_UCR_NUMBER_FORMS (1L << 4) /* U+2150-U+218F */ + /* Bit 37 Arrows */ + /* Supplemental Arrows-A */ + /* Supplemental Arrows-B */ + /* Miscellaneous Symbols and Arrows */ +#define TT_UCR_ARROWS (1L << 5) /* U+2190-U+21FF */ + /* U+27F0-U+27FF */ + /* U+2900-U+297F */ + /* U+2B00-U+2BFF */ + /* Bit 38 Mathematical Operators */ + /* Supplemental Mathematical Operators */ + /* Miscellaneous Mathematical Symbols-A */ + /* Miscellaneous Mathematical Symbols-B */ +#define TT_UCR_MATHEMATICAL_OPERATORS (1L << 6) /* U+2200-U+22FF */ + /* U+2A00-U+2AFF */ + /* U+27C0-U+27EF */ + /* U+2980-U+29FF */ + /* Bit 39 Miscellaneous Technical */ +#define TT_UCR_MISCELLANEOUS_TECHNICAL (1L << 7) /* U+2300-U+23FF */ + /* Bit 40 Control Pictures */ +#define TT_UCR_CONTROL_PICTURES (1L << 8) /* U+2400-U+243F */ + /* Bit 41 Optical Character Recognition */ +#define TT_UCR_OCR (1L << 9) /* U+2440-U+245F */ + /* Bit 42 Enclosed Alphanumerics */ +#define TT_UCR_ENCLOSED_ALPHANUMERICS (1L << 10) /* U+2460-U+24FF */ + /* Bit 43 Box Drawing */ +#define TT_UCR_BOX_DRAWING (1L << 11) /* U+2500-U+257F */ + /* Bit 44 Block Elements */ +#define TT_UCR_BLOCK_ELEMENTS (1L << 12) /* U+2580-U+259F */ + /* Bit 45 Geometric Shapes */ +#define TT_UCR_GEOMETRIC_SHAPES (1L << 13) /* U+25A0-U+25FF */ + /* Bit 46 Miscellaneous Symbols */ +#define TT_UCR_MISCELLANEOUS_SYMBOLS (1L << 14) /* U+2600-U+26FF */ + /* Bit 47 Dingbats */ +#define TT_UCR_DINGBATS (1L << 15) /* U+2700-U+27BF */ + /* Bit 48 CJK Symbols and Punctuation */ +#define TT_UCR_CJK_SYMBOLS (1L << 16) /* U+3000-U+303F */ + /* Bit 49 Hiragana */ +#define TT_UCR_HIRAGANA (1L << 17) /* U+3040-U+309F */ + /* Bit 50 Katakana */ + /* Katakana Phonetic Extensions */ +#define TT_UCR_KATAKANA (1L << 18) /* U+30A0-U+30FF */ + /* U+31F0-U+31FF */ + /* Bit 51 Bopomofo */ + /* Bopomofo Extended */ +#define TT_UCR_BOPOMOFO (1L << 19) /* U+3100-U+312F */ + /* U+31A0-U+31BF */ + /* Bit 52 Hangul Compatibility Jamo */ +#define TT_UCR_HANGUL_COMPATIBILITY_JAMO (1L << 20) /* U+3130-U+318F */ + /* Bit 53 Phags-Pa */ +#define TT_UCR_CJK_MISC (1L << 21) /* U+A840-U+A87F */ +#define TT_UCR_KANBUN TT_UCR_CJK_MISC /* deprecated */ +#define TT_UCR_PHAGSPA + /* Bit 54 Enclosed CJK Letters and Months */ +#define TT_UCR_ENCLOSED_CJK_LETTERS_MONTHS (1L << 22) /* U+3200-U+32FF */ + /* Bit 55 CJK Compatibility */ +#define TT_UCR_CJK_COMPATIBILITY (1L << 23) /* U+3300-U+33FF */ + /* Bit 56 Hangul Syllables */ +#define TT_UCR_HANGUL (1L << 24) /* U+AC00-U+D7A3 */ + /* Bit 57 High Surrogates */ + /* High Private Use Surrogates */ + /* Low Surrogates */ + /* */ + /* According to OpenType specs v.1.3+, */ + /* setting bit 57 implies that there is */ + /* at least one codepoint beyond the */ + /* Basic Multilingual Plane that is */ + /* supported by this font. So it really */ + /* means >= U+10000 */ +#define TT_UCR_SURROGATES (1L << 25) /* U+D800-U+DB7F */ + /* U+DB80-U+DBFF */ + /* U+DC00-U+DFFF */ +#define TT_UCR_NON_PLANE_0 TT_UCR_SURROGATES + /* Bit 58 Phoenician */ +#define TT_UCR_PHOENICIAN (1L << 26) /*U+10900-U+1091F*/ + /* Bit 59 CJK Unified Ideographs */ + /* CJK Radicals Supplement */ + /* Kangxi Radicals */ + /* Ideographic Description Characters */ + /* CJK Unified Ideographs Extension A */ + /* CJK Unified Ideographs Extension B */ + /* Kanbun */ +#define TT_UCR_CJK_UNIFIED_IDEOGRAPHS (1L << 27) /* U+4E00-U+9FFF */ + /* U+2E80-U+2EFF */ + /* U+2F00-U+2FDF */ + /* U+2FF0-U+2FFF */ + /* U+3400-U+4DB5 */ + /*U+20000-U+2A6DF*/ + /* U+3190-U+319F */ + /* Bit 60 Private Use */ +#define TT_UCR_PRIVATE_USE (1L << 28) /* U+E000-U+F8FF */ + /* Bit 61 CJK Strokes */ + /* CJK Compatibility Ideographs */ + /* CJK Compatibility Ideographs Supplement */ +#define TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS (1L << 29) /* U+31C0-U+31EF */ + /* U+F900-U+FAFF */ + /*U+2F800-U+2FA1F*/ + /* Bit 62 Alphabetic Presentation Forms */ +#define TT_UCR_ALPHABETIC_PRESENTATION_FORMS (1L << 30) /* U+FB00-U+FB4F */ + /* Bit 63 Arabic Presentation Forms-A */ +#define TT_UCR_ARABIC_PRESENTATIONS_A (1L << 31) /* U+FB50-U+FDFF */ + /* Bit 64 Combining Half Marks */ +#define TT_UCR_COMBINING_HALF_MARKS (1L << 0) /* U+FE20-U+FE2F */ + /* Bit 65 Vertical forms */ + /* CJK Compatibility Forms */ +#define TT_UCR_CJK_COMPATIBILITY_FORMS (1L << 1) /* U+FE10-U+FE1F */ + /* U+FE30-U+FE4F */ + /* Bit 66 Small Form Variants */ +#define TT_UCR_SMALL_FORM_VARIANTS (1L << 2) /* U+FE50-U+FE6F */ + /* Bit 67 Arabic Presentation Forms-B */ +#define TT_UCR_ARABIC_PRESENTATIONS_B (1L << 3) /* U+FE70-U+FEFE */ + /* Bit 68 Halfwidth and Fullwidth Forms */ +#define TT_UCR_HALFWIDTH_FULLWIDTH_FORMS (1L << 4) /* U+FF00-U+FFEF */ + /* Bit 69 Specials */ +#define TT_UCR_SPECIALS (1L << 5) /* U+FFF0-U+FFFD */ + /* Bit 70 Tibetan */ +#define TT_UCR_TIBETAN (1L << 6) /* U+0F00-U+0FFF */ + /* Bit 71 Syriac */ +#define TT_UCR_SYRIAC (1L << 7) /* U+0700-U+074F */ + /* Bit 72 Thaana */ +#define TT_UCR_THAANA (1L << 8) /* U+0780-U+07BF */ + /* Bit 73 Sinhala */ +#define TT_UCR_SINHALA (1L << 9) /* U+0D80-U+0DFF */ + /* Bit 74 Myanmar */ +#define TT_UCR_MYANMAR (1L << 10) /* U+1000-U+109F */ + /* Bit 75 Ethiopic */ + /* Ethiopic Supplement */ + /* Ethiopic Extended */ +#define TT_UCR_ETHIOPIC (1L << 11) /* U+1200-U+137F */ + /* U+1380-U+139F */ + /* U+2D80-U+2DDF */ + /* Bit 76 Cherokee */ +#define TT_UCR_CHEROKEE (1L << 12) /* U+13A0-U+13FF */ + /* Bit 77 Unified Canadian Aboriginal Syllabics */ +#define TT_UCR_CANADIAN_ABORIGINAL_SYLLABICS (1L << 13) /* U+1400-U+167F */ + /* Bit 78 Ogham */ +#define TT_UCR_OGHAM (1L << 14) /* U+1680-U+169F */ + /* Bit 79 Runic */ +#define TT_UCR_RUNIC (1L << 15) /* U+16A0-U+16FF */ + /* Bit 80 Khmer */ + /* Khmer Symbols */ +#define TT_UCR_KHMER (1L << 16) /* U+1780-U+17FF */ + /* U+19E0-U+19FF */ + /* Bit 81 Mongolian */ +#define TT_UCR_MONGOLIAN (1L << 17) /* U+1800-U+18AF */ + /* Bit 82 Braille Patterns */ +#define TT_UCR_BRAILLE (1L << 18) /* U+2800-U+28FF */ + /* Bit 83 Yi Syllables */ + /* Yi Radicals */ +#define TT_UCR_YI (1L << 19) /* U+A000-U+A48F */ + /* U+A490-U+A4CF */ + /* Bit 84 Tagalog */ + /* Hanunoo */ + /* Buhid */ + /* Tagbanwa */ +#define TT_UCR_PHILIPPINE (1L << 20) /* U+1700-U+171F */ + /* U+1720-U+173F */ + /* U+1740-U+175F */ + /* U+1760-U+177F */ + /* Bit 85 Old Italic */ +#define TT_UCR_OLD_ITALIC (1L << 21) /*U+10300-U+1032F*/ + /* Bit 86 Gothic */ +#define TT_UCR_GOTHIC (1L << 22) /*U+10330-U+1034F*/ + /* Bit 87 Deseret */ +#define TT_UCR_DESERET (1L << 23) /*U+10400-U+1044F*/ + /* Bit 88 Byzantine Musical Symbols */ + /* Musical Symbols */ + /* Ancient Greek Musical Notation */ +#define TT_UCR_MUSICAL_SYMBOLS (1L << 24) /*U+1D000-U+1D0FF*/ + /*U+1D100-U+1D1FF*/ + /*U+1D200-U+1D24F*/ + /* Bit 89 Mathematical Alphanumeric Symbols */ +#define TT_UCR_MATH_ALPHANUMERIC_SYMBOLS (1L << 25) /*U+1D400-U+1D7FF*/ + /* Bit 90 Private Use (plane 15) */ + /* Private Use (plane 16) */ +#define TT_UCR_PRIVATE_USE_SUPPLEMENTARY (1L << 26) /*U+F0000-U+FFFFD*/ + /*U+100000-U+10FFFD*/ + /* Bit 91 Variation Selectors */ + /* Variation Selectors Supplement */ +#define TT_UCR_VARIATION_SELECTORS (1L << 27) /* U+FE00-U+FE0F */ + /*U+E0100-U+E01EF*/ + /* Bit 92 Tags */ +#define TT_UCR_TAGS (1L << 28) /*U+E0000-U+E007F*/ + /* Bit 93 Limbu */ +#define TT_UCR_LIMBU (1L << 29) /* U+1900-U+194F */ + /* Bit 94 Tai Le */ +#define TT_UCR_TAI_LE (1L << 30) /* U+1950-U+197F */ + /* Bit 95 New Tai Lue */ +#define TT_UCR_NEW_TAI_LUE (1L << 31) /* U+1980-U+19DF */ + /* Bit 96 Buginese */ +#define TT_UCR_BUGINESE (1L << 0) /* U+1A00-U+1A1F */ + /* Bit 97 Glagolitic */ +#define TT_UCR_GLAGOLITIC (1L << 1) /* U+2C00-U+2C5F */ + /* Bit 98 Tifinagh */ +#define TT_UCR_TIFINAGH (1L << 2) /* U+2D30-U+2D7F */ + /* Bit 99 Yijing Hexagram Symbols */ +#define TT_UCR_YIJING (1L << 3) /* U+4DC0-U+4DFF */ + /* Bit 100 Syloti Nagri */ +#define TT_UCR_SYLOTI_NAGRI (1L << 4) /* U+A800-U+A82F */ + /* Bit 101 Linear B Syllabary */ + /* Linear B Ideograms */ + /* Aegean Numbers */ +#define TT_UCR_LINEAR_B (1L << 5) /*U+10000-U+1007F*/ + /*U+10080-U+100FF*/ + /*U+10100-U+1013F*/ + /* Bit 102 Ancient Greek Numbers */ +#define TT_UCR_ANCIENT_GREEK_NUMBERS (1L << 6) /*U+10140-U+1018F*/ + /* Bit 103 Ugaritic */ +#define TT_UCR_UGARITIC (1L << 7) /*U+10380-U+1039F*/ + /* Bit 104 Old Persian */ +#define TT_UCR_OLD_PERSIAN (1L << 8) /*U+103A0-U+103DF*/ + /* Bit 105 Shavian */ +#define TT_UCR_SHAVIAN (1L << 9) /*U+10450-U+1047F*/ + /* Bit 106 Osmanya */ +#define TT_UCR_OSMANYA (1L << 10) /*U+10480-U+104AF*/ + /* Bit 107 Cypriot Syllabary */ +#define TT_UCR_CYPRIOT_SYLLABARY (1L << 11) /*U+10800-U+1083F*/ + /* Bit 108 Kharoshthi */ +#define TT_UCR_KHAROSHTHI (1L << 12) /*U+10A00-U+10A5F*/ + /* Bit 109 Tai Xuan Jing Symbols */ +#define TT_UCR_TAI_XUAN_JING (1L << 13) /*U+1D300-U+1D35F*/ + /* Bit 110 Cuneiform */ + /* Cuneiform Numbers and Punctuation */ +#define TT_UCR_CUNEIFORM (1L << 14) /*U+12000-U+123FF*/ + /*U+12400-U+1247F*/ + /* Bit 111 Counting Rod Numerals */ +#define TT_UCR_COUNTING_ROD_NUMERALS (1L << 15) /*U+1D360-U+1D37F*/ + /* Bit 112 Sundanese */ +#define TT_UCR_SUNDANESE (1L << 16) /* U+1B80-U+1BBF */ + /* Bit 113 Lepcha */ +#define TT_UCR_LEPCHA (1L << 17) /* U+1C00-U+1C4F */ + /* Bit 114 Ol Chiki */ +#define TT_UCR_OL_CHIKI (1L << 18) /* U+1C50-U+1C7F */ + /* Bit 115 Saurashtra */ +#define TT_UCR_SAURASHTRA (1L << 19) /* U+A880-U+A8DF */ + /* Bit 116 Kayah Li */ +#define TT_UCR_KAYAH_LI (1L << 20) /* U+A900-U+A92F */ + /* Bit 117 Rejang */ +#define TT_UCR_REJANG (1L << 21) /* U+A930-U+A95F */ + /* Bit 118 Cham */ +#define TT_UCR_CHAM (1L << 22) /* U+AA00-U+AA5F */ + /* Bit 119 Ancient Symbols */ +#define TT_UCR_ANCIENT_SYMBOLS (1L << 23) /*U+10190-U+101CF*/ + /* Bit 120 Phaistos Disc */ +#define TT_UCR_PHAISTOS_DISC (1L << 24) /*U+101D0-U+101FF*/ + /* Bit 121 Carian */ + /* Lycian */ + /* Lydian */ +#define TT_UCR_OLD_ANATOLIAN (1L << 25) /*U+102A0-U+102DF*/ + /*U+10280-U+1029F*/ + /*U+10920-U+1093F*/ + /* Bit 122 Domino Tiles */ + /* Mahjong Tiles */ +#define TT_UCR_GAME_TILES (1L << 26) /*U+1F030-U+1F09F*/ + /*U+1F000-U+1F02F*/ + /* Bit 123-127 Reserved for process-internal usage */ + + + /*************************************************************************/ + /* */ + /* Some compilers have a very limited length of identifiers. */ + /* */ +#if defined( __TURBOC__ ) && __TURBOC__ < 0x0410 || defined( __PACIFIC__ ) +#define HAVE_LIMIT_ON_IDENTS +#endif + + +#ifndef HAVE_LIMIT_ON_IDENTS + + + /*************************************************************************/ + /* */ + /* Here some alias #defines in order to be clearer. */ + /* */ + /* These are not always #defined to stay within the 31~character limit */ + /* which some compilers have. */ + /* */ + /* Credits go to Dave Hoo <dhoo@flash.net> for pointing out that modern */ + /* Borland compilers (read: from BC++ 3.1 on) can increase this limit. */ + /* If you get a warning with such a compiler, use the -i40 switch. */ + /* */ +#define TT_UCR_ARABIC_PRESENTATION_FORMS_A \ + TT_UCR_ARABIC_PRESENTATIONS_A +#define TT_UCR_ARABIC_PRESENTATION_FORMS_B \ + TT_UCR_ARABIC_PRESENTATIONS_B + +#define TT_UCR_COMBINING_DIACRITICAL_MARKS \ + TT_UCR_COMBINING_DIACRITICS +#define TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB \ + TT_UCR_COMBINING_DIACRITICS_SYMB + + +#endif /* !HAVE_LIMIT_ON_IDENTS */ + + +FT_END_HEADER + +#endif /* __TTNAMEID_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/tttables.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/tttables.h new file mode 100644 index 00000000..4610e501 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/tttables.h @@ -0,0 +1,759 @@ +/***************************************************************************/ +/* */ +/* tttables.h */ +/* */ +/* Basic SFNT/TrueType tables definitions and interface */ +/* (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2008, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTTABLES_H__ +#define __TTTABLES_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* <Section> */ + /* truetype_tables */ + /* */ + /* <Title> */ + /* TrueType Tables */ + /* */ + /* <Abstract> */ + /* TrueType specific table types and functions. */ + /* */ + /* <Description> */ + /* This section contains the definition of TrueType-specific tables */ + /* as well as some routines used to access and process them. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_Header */ + /* */ + /* <Description> */ + /* A structure used to model a TrueType font header table. All */ + /* fields follow the TrueType specification. */ + /* */ + typedef struct TT_Header_ + { + FT_Fixed Table_Version; + FT_Fixed Font_Revision; + + FT_Long CheckSum_Adjust; + FT_Long Magic_Number; + + FT_UShort Flags; + FT_UShort Units_Per_EM; + + FT_Long Created [2]; + FT_Long Modified[2]; + + FT_Short xMin; + FT_Short yMin; + FT_Short xMax; + FT_Short yMax; + + FT_UShort Mac_Style; + FT_UShort Lowest_Rec_PPEM; + + FT_Short Font_Direction; + FT_Short Index_To_Loc_Format; + FT_Short Glyph_Data_Format; + + } TT_Header; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_HoriHeader */ + /* */ + /* <Description> */ + /* A structure used to model a TrueType horizontal header, the `hhea' */ + /* table, as well as the corresponding horizontal metrics table, */ + /* i.e., the `hmtx' table. */ + /* */ + /* <Fields> */ + /* Version :: The table version. */ + /* */ + /* Ascender :: The font's ascender, i.e., the distance */ + /* from the baseline to the top-most of all */ + /* glyph points found in the font. */ + /* */ + /* This value is invalid in many fonts, as */ + /* it is usually set by the font designer, */ + /* and often reflects only a portion of the */ + /* glyphs found in the font (maybe ASCII). */ + /* */ + /* You should use the `sTypoAscender' field */ + /* of the OS/2 table instead if you want */ + /* the correct one. */ + /* */ + /* Descender :: The font's descender, i.e., the distance */ + /* from the baseline to the bottom-most of */ + /* all glyph points found in the font. It */ + /* is negative. */ + /* */ + /* This value is invalid in many fonts, as */ + /* it is usually set by the font designer, */ + /* and often reflects only a portion of the */ + /* glyphs found in the font (maybe ASCII). */ + /* */ + /* You should use the `sTypoDescender' */ + /* field of the OS/2 table instead if you */ + /* want the correct one. */ + /* */ + /* Line_Gap :: The font's line gap, i.e., the distance */ + /* to add to the ascender and descender to */ + /* get the BTB, i.e., the */ + /* baseline-to-baseline distance for the */ + /* font. */ + /* */ + /* advance_Width_Max :: This field is the maximum of all advance */ + /* widths found in the font. It can be */ + /* used to compute the maximum width of an */ + /* arbitrary string of text. */ + /* */ + /* min_Left_Side_Bearing :: The minimum left side bearing of all */ + /* glyphs within the font. */ + /* */ + /* min_Right_Side_Bearing :: The minimum right side bearing of all */ + /* glyphs within the font. */ + /* */ + /* xMax_Extent :: The maximum horizontal extent (i.e., the */ + /* `width' of a glyph's bounding box) for */ + /* all glyphs in the font. */ + /* */ + /* caret_Slope_Rise :: The rise coefficient of the cursor's */ + /* slope of the cursor (slope=rise/run). */ + /* */ + /* caret_Slope_Run :: The run coefficient of the cursor's */ + /* slope. */ + /* */ + /* Reserved :: 8~reserved bytes. */ + /* */ + /* metric_Data_Format :: Always~0. */ + /* */ + /* number_Of_HMetrics :: Number of HMetrics entries in the `hmtx' */ + /* table -- this value can be smaller than */ + /* the total number of glyphs in the font. */ + /* */ + /* long_metrics :: A pointer into the `hmtx' table. */ + /* */ + /* short_metrics :: A pointer into the `hmtx' table. */ + /* */ + /* <Note> */ + /* IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should */ + /* be identical except for the names of their fields which */ + /* are different. */ + /* */ + /* This ensures that a single function in the `ttload' */ + /* module is able to read both the horizontal and vertical */ + /* headers. */ + /* */ + typedef struct TT_HoriHeader_ + { + FT_Fixed Version; + FT_Short Ascender; + FT_Short Descender; + FT_Short Line_Gap; + + FT_UShort advance_Width_Max; /* advance width maximum */ + + FT_Short min_Left_Side_Bearing; /* minimum left-sb */ + FT_Short min_Right_Side_Bearing; /* minimum right-sb */ + FT_Short xMax_Extent; /* xmax extents */ + FT_Short caret_Slope_Rise; + FT_Short caret_Slope_Run; + FT_Short caret_Offset; + + FT_Short Reserved[4]; + + FT_Short metric_Data_Format; + FT_UShort number_Of_HMetrics; + + /* The following fields are not defined by the TrueType specification */ + /* but they are used to connect the metrics header to the relevant */ + /* `HMTX' table. */ + + void* long_metrics; + void* short_metrics; + + } TT_HoriHeader; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_VertHeader */ + /* */ + /* <Description> */ + /* A structure used to model a TrueType vertical header, the `vhea' */ + /* table, as well as the corresponding vertical metrics table, i.e., */ + /* the `vmtx' table. */ + /* */ + /* <Fields> */ + /* Version :: The table version. */ + /* */ + /* Ascender :: The font's ascender, i.e., the distance */ + /* from the baseline to the top-most of */ + /* all glyph points found in the font. */ + /* */ + /* This value is invalid in many fonts, as */ + /* it is usually set by the font designer, */ + /* and often reflects only a portion of */ + /* the glyphs found in the font (maybe */ + /* ASCII). */ + /* */ + /* You should use the `sTypoAscender' */ + /* field of the OS/2 table instead if you */ + /* want the correct one. */ + /* */ + /* Descender :: The font's descender, i.e., the */ + /* distance from the baseline to the */ + /* bottom-most of all glyph points found */ + /* in the font. It is negative. */ + /* */ + /* This value is invalid in many fonts, as */ + /* it is usually set by the font designer, */ + /* and often reflects only a portion of */ + /* the glyphs found in the font (maybe */ + /* ASCII). */ + /* */ + /* You should use the `sTypoDescender' */ + /* field of the OS/2 table instead if you */ + /* want the correct one. */ + /* */ + /* Line_Gap :: The font's line gap, i.e., the distance */ + /* to add to the ascender and descender to */ + /* get the BTB, i.e., the */ + /* baseline-to-baseline distance for the */ + /* font. */ + /* */ + /* advance_Height_Max :: This field is the maximum of all */ + /* advance heights found in the font. It */ + /* can be used to compute the maximum */ + /* height of an arbitrary string of text. */ + /* */ + /* min_Top_Side_Bearing :: The minimum top side bearing of all */ + /* glyphs within the font. */ + /* */ + /* min_Bottom_Side_Bearing :: The minimum bottom side bearing of all */ + /* glyphs within the font. */ + /* */ + /* yMax_Extent :: The maximum vertical extent (i.e., the */ + /* `height' of a glyph's bounding box) for */ + /* all glyphs in the font. */ + /* */ + /* caret_Slope_Rise :: The rise coefficient of the cursor's */ + /* slope of the cursor (slope=rise/run). */ + /* */ + /* caret_Slope_Run :: The run coefficient of the cursor's */ + /* slope. */ + /* */ + /* caret_Offset :: The cursor's offset for slanted fonts. */ + /* This value is `reserved' in vmtx */ + /* version 1.0. */ + /* */ + /* Reserved :: 8~reserved bytes. */ + /* */ + /* metric_Data_Format :: Always~0. */ + /* */ + /* number_Of_HMetrics :: Number of VMetrics entries in the */ + /* `vmtx' table -- this value can be */ + /* smaller than the total number of glyphs */ + /* in the font. */ + /* */ + /* long_metrics :: A pointer into the `vmtx' table. */ + /* */ + /* short_metrics :: A pointer into the `vmtx' table. */ + /* */ + /* <Note> */ + /* IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should */ + /* be identical except for the names of their fields which */ + /* are different. */ + /* */ + /* This ensures that a single function in the `ttload' */ + /* module is able to read both the horizontal and vertical */ + /* headers. */ + /* */ + typedef struct TT_VertHeader_ + { + FT_Fixed Version; + FT_Short Ascender; + FT_Short Descender; + FT_Short Line_Gap; + + FT_UShort advance_Height_Max; /* advance height maximum */ + + FT_Short min_Top_Side_Bearing; /* minimum left-sb or top-sb */ + FT_Short min_Bottom_Side_Bearing; /* minimum right-sb or bottom-sb */ + FT_Short yMax_Extent; /* xmax or ymax extents */ + FT_Short caret_Slope_Rise; + FT_Short caret_Slope_Run; + FT_Short caret_Offset; + + FT_Short Reserved[4]; + + FT_Short metric_Data_Format; + FT_UShort number_Of_VMetrics; + + /* The following fields are not defined by the TrueType specification */ + /* but they're used to connect the metrics header to the relevant */ + /* `HMTX' or `VMTX' table. */ + + void* long_metrics; + void* short_metrics; + + } TT_VertHeader; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_OS2 */ + /* */ + /* <Description> */ + /* A structure used to model a TrueType OS/2 table. This is the long */ + /* table version. All fields comply to the TrueType specification. */ + /* */ + /* Note that we now support old Mac fonts which do not include an */ + /* OS/2 table. In this case, the `version' field is always set to */ + /* 0xFFFF. */ + /* */ + typedef struct TT_OS2_ + { + FT_UShort version; /* 0x0001 - more or 0xFFFF */ + FT_Short xAvgCharWidth; + FT_UShort usWeightClass; + FT_UShort usWidthClass; + FT_Short fsType; + FT_Short ySubscriptXSize; + FT_Short ySubscriptYSize; + FT_Short ySubscriptXOffset; + FT_Short ySubscriptYOffset; + FT_Short ySuperscriptXSize; + FT_Short ySuperscriptYSize; + FT_Short ySuperscriptXOffset; + FT_Short ySuperscriptYOffset; + FT_Short yStrikeoutSize; + FT_Short yStrikeoutPosition; + FT_Short sFamilyClass; + + FT_Byte panose[10]; + + FT_ULong ulUnicodeRange1; /* Bits 0-31 */ + FT_ULong ulUnicodeRange2; /* Bits 32-63 */ + FT_ULong ulUnicodeRange3; /* Bits 64-95 */ + FT_ULong ulUnicodeRange4; /* Bits 96-127 */ + + FT_Char achVendID[4]; + + FT_UShort fsSelection; + FT_UShort usFirstCharIndex; + FT_UShort usLastCharIndex; + FT_Short sTypoAscender; + FT_Short sTypoDescender; + FT_Short sTypoLineGap; + FT_UShort usWinAscent; + FT_UShort usWinDescent; + + /* only version 1 tables: */ + + FT_ULong ulCodePageRange1; /* Bits 0-31 */ + FT_ULong ulCodePageRange2; /* Bits 32-63 */ + + /* only version 2 tables: */ + + FT_Short sxHeight; + FT_Short sCapHeight; + FT_UShort usDefaultChar; + FT_UShort usBreakChar; + FT_UShort usMaxContext; + + } TT_OS2; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_Postscript */ + /* */ + /* <Description> */ + /* A structure used to model a TrueType PostScript table. All fields */ + /* comply to the TrueType specification. This structure does not */ + /* reference the PostScript glyph names, which can be nevertheless */ + /* accessed with the `ttpost' module. */ + /* */ + typedef struct TT_Postscript_ + { + FT_Fixed FormatType; + FT_Fixed italicAngle; + FT_Short underlinePosition; + FT_Short underlineThickness; + FT_ULong isFixedPitch; + FT_ULong minMemType42; + FT_ULong maxMemType42; + FT_ULong minMemType1; + FT_ULong maxMemType1; + + /* Glyph names follow in the file, but we don't */ + /* load them by default. See the ttpost.c file. */ + + } TT_Postscript; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_PCLT */ + /* */ + /* <Description> */ + /* A structure used to model a TrueType PCLT table. All fields */ + /* comply to the TrueType specification. */ + /* */ + typedef struct TT_PCLT_ + { + FT_Fixed Version; + FT_ULong FontNumber; + FT_UShort Pitch; + FT_UShort xHeight; + FT_UShort Style; + FT_UShort TypeFamily; + FT_UShort CapHeight; + FT_UShort SymbolSet; + FT_Char TypeFace[16]; + FT_Char CharacterComplement[8]; + FT_Char FileName[6]; + FT_Char StrokeWeight; + FT_Char WidthType; + FT_Byte SerifStyle; + FT_Byte Reserved; + + } TT_PCLT; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_MaxProfile */ + /* */ + /* <Description> */ + /* The maximum profile is a table containing many max values which */ + /* can be used to pre-allocate arrays. This ensures that no memory */ + /* allocation occurs during a glyph load. */ + /* */ + /* <Fields> */ + /* version :: The version number. */ + /* */ + /* numGlyphs :: The number of glyphs in this TrueType */ + /* font. */ + /* */ + /* maxPoints :: The maximum number of points in a */ + /* non-composite TrueType glyph. See also */ + /* the structure element */ + /* `maxCompositePoints'. */ + /* */ + /* maxContours :: The maximum number of contours in a */ + /* non-composite TrueType glyph. See also */ + /* the structure element */ + /* `maxCompositeContours'. */ + /* */ + /* maxCompositePoints :: The maximum number of points in a */ + /* composite TrueType glyph. See also the */ + /* structure element `maxPoints'. */ + /* */ + /* maxCompositeContours :: The maximum number of contours in a */ + /* composite TrueType glyph. See also the */ + /* structure element `maxContours'. */ + /* */ + /* maxZones :: The maximum number of zones used for */ + /* glyph hinting. */ + /* */ + /* maxTwilightPoints :: The maximum number of points in the */ + /* twilight zone used for glyph hinting. */ + /* */ + /* maxStorage :: The maximum number of elements in the */ + /* storage area used for glyph hinting. */ + /* */ + /* maxFunctionDefs :: The maximum number of function */ + /* definitions in the TrueType bytecode for */ + /* this font. */ + /* */ + /* maxInstructionDefs :: The maximum number of instruction */ + /* definitions in the TrueType bytecode for */ + /* this font. */ + /* */ + /* maxStackElements :: The maximum number of stack elements used */ + /* during bytecode interpretation. */ + /* */ + /* maxSizeOfInstructions :: The maximum number of TrueType opcodes */ + /* used for glyph hinting. */ + /* */ + /* maxComponentElements :: The maximum number of simple (i.e., non- */ + /* composite) glyphs in a composite glyph. */ + /* */ + /* maxComponentDepth :: The maximum nesting depth of composite */ + /* glyphs. */ + /* */ + /* <Note> */ + /* This structure is only used during font loading. */ + /* */ + typedef struct TT_MaxProfile_ + { + FT_Fixed version; + FT_UShort numGlyphs; + FT_UShort maxPoints; + FT_UShort maxContours; + FT_UShort maxCompositePoints; + FT_UShort maxCompositeContours; + FT_UShort maxZones; + FT_UShort maxTwilightPoints; + FT_UShort maxStorage; + FT_UShort maxFunctionDefs; + FT_UShort maxInstructionDefs; + FT_UShort maxStackElements; + FT_UShort maxSizeOfInstructions; + FT_UShort maxComponentElements; + FT_UShort maxComponentDepth; + + } TT_MaxProfile; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Sfnt_Tag */ + /* */ + /* <Description> */ + /* An enumeration used to specify the index of an SFNT table. */ + /* Used in the @FT_Get_Sfnt_Table API function. */ + /* */ + typedef enum FT_Sfnt_Tag_ + { + ft_sfnt_head = 0, /* TT_Header */ + ft_sfnt_maxp = 1, /* TT_MaxProfile */ + ft_sfnt_os2 = 2, /* TT_OS2 */ + ft_sfnt_hhea = 3, /* TT_HoriHeader */ + ft_sfnt_vhea = 4, /* TT_VertHeader */ + ft_sfnt_post = 5, /* TT_Postscript */ + ft_sfnt_pclt = 6, /* TT_PCLT */ + + sfnt_max /* internal end mark */ + + } FT_Sfnt_Tag; + + /* */ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Sfnt_Table */ + /* */ + /* <Description> */ + /* Return a pointer to a given SFNT table within a face. */ + /* */ + /* <Input> */ + /* face :: A handle to the source. */ + /* */ + /* tag :: The index of the SFNT table. */ + /* */ + /* <Return> */ + /* A type-less pointer to the table. This will be~0 in case of */ + /* error, or if the corresponding table was not found *OR* loaded */ + /* from the file. */ + /* */ + /* Use a typecast according to `tag' to access the structure */ + /* elements. */ + /* */ + /* <Note> */ + /* The table is owned by the face object and disappears with it. */ + /* */ + /* This function is only useful to access SFNT tables that are loaded */ + /* by the sfnt, truetype, and opentype drivers. See @FT_Sfnt_Tag for */ + /* a list. */ + /* */ + FT_EXPORT( void* ) + FT_Get_Sfnt_Table( FT_Face face, + FT_Sfnt_Tag tag ); + + + /************************************************************************** + * + * @function: + * FT_Load_Sfnt_Table + * + * @description: + * Load any font table into client memory. + * + * @input: + * face :: + * A handle to the source face. + * + * tag :: + * The four-byte tag of the table to load. Use the value~0 if you want + * to access the whole font file. Otherwise, you can use one of the + * definitions found in the @FT_TRUETYPE_TAGS_H file, or forge a new + * one with @FT_MAKE_TAG. + * + * offset :: + * The starting offset in the table (or file if tag == 0). + * + * @output: + * buffer :: + * The target buffer address. The client must ensure that the memory + * array is big enough to hold the data. + * + * @inout: + * length :: + * If the `length' parameter is NULL, then try to load the whole table. + * Return an error code if it fails. + * + * Else, if `*length' is~0, exit immediately while returning the + * table's (or file) full size in it. + * + * Else the number of bytes to read from the table or file, from the + * starting offset. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If you need to determine the table's length you should first call this + * function with `*length' set to~0, as in the following example: + * + * { + * FT_ULong length = 0; + * + * + * error = FT_Load_Sfnt_Table( face, tag, 0, NULL, &length ); + * if ( error ) { ... table does not exist ... } + * + * buffer = malloc( length ); + * if ( buffer == NULL ) { ... not enough memory ... } + * + * error = FT_Load_Sfnt_Table( face, tag, 0, buffer, &length ); + * if ( error ) { ... could not load table ... } + * } + */ + FT_EXPORT( FT_Error ) + FT_Load_Sfnt_Table( FT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ); + + + /************************************************************************** + * + * @function: + * FT_Sfnt_Table_Info + * + * @description: + * Return information on an SFNT table. + * + * @input: + * face :: + * A handle to the source face. + * + * table_index :: + * The index of an SFNT table. The function returns + * FT_Err_Table_Missing for an invalid value. + * + * @output: + * tag :: + * The name tag of the SFNT table. + * + * length :: + * The length of the SFNT table. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * SFNT tables with length zero are treated as missing. + * + */ + FT_EXPORT( FT_Error ) + FT_Sfnt_Table_Info( FT_Face face, + FT_UInt table_index, + FT_ULong *tag, + FT_ULong *length ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_CMap_Language_ID */ + /* */ + /* <Description> */ + /* Return TrueType/sfnt specific cmap language ID. Definitions of */ + /* language ID values are in `freetype/ttnameid.h'. */ + /* */ + /* <Input> */ + /* charmap :: */ + /* The target charmap. */ + /* */ + /* <Return> */ + /* The language ID of `charmap'. If `charmap' doesn't belong to a */ + /* TrueType/sfnt face, just return~0 as the default value. */ + /* */ + FT_EXPORT( FT_ULong ) + FT_Get_CMap_Language_ID( FT_CharMap charmap ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_CMap_Format */ + /* */ + /* <Description> */ + /* Return TrueType/sfnt specific cmap format. */ + /* */ + /* <Input> */ + /* charmap :: */ + /* The target charmap. */ + /* */ + /* <Return> */ + /* The format of `charmap'. If `charmap' doesn't belong to a */ + /* TrueType/sfnt face, return -1. */ + /* */ + FT_EXPORT( FT_Long ) + FT_Get_CMap_Format( FT_CharMap charmap ); + + /* */ + + +FT_END_HEADER + +#endif /* __TTTABLES_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/tttags.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/tttags.h new file mode 100644 index 00000000..307ce4b6 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/tttags.h @@ -0,0 +1,107 @@ +/***************************************************************************/ +/* */ +/* tttags.h */ +/* */ +/* Tags for TrueType and OpenType tables (specification only). */ +/* */ +/* Copyright 1996-2001, 2004, 2005, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTAGS_H__ +#define __TTAGS_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + +#define TTAG_avar FT_MAKE_TAG( 'a', 'v', 'a', 'r' ) +#define TTAG_BASE FT_MAKE_TAG( 'B', 'A', 'S', 'E' ) +#define TTAG_bdat FT_MAKE_TAG( 'b', 'd', 'a', 't' ) +#define TTAG_BDF FT_MAKE_TAG( 'B', 'D', 'F', ' ' ) +#define TTAG_bhed FT_MAKE_TAG( 'b', 'h', 'e', 'd' ) +#define TTAG_bloc FT_MAKE_TAG( 'b', 'l', 'o', 'c' ) +#define TTAG_bsln FT_MAKE_TAG( 'b', 's', 'l', 'n' ) +#define TTAG_CFF FT_MAKE_TAG( 'C', 'F', 'F', ' ' ) +#define TTAG_CID FT_MAKE_TAG( 'C', 'I', 'D', ' ' ) +#define TTAG_cmap FT_MAKE_TAG( 'c', 'm', 'a', 'p' ) +#define TTAG_cvar FT_MAKE_TAG( 'c', 'v', 'a', 'r' ) +#define TTAG_cvt FT_MAKE_TAG( 'c', 'v', 't', ' ' ) +#define TTAG_DSIG FT_MAKE_TAG( 'D', 'S', 'I', 'G' ) +#define TTAG_EBDT FT_MAKE_TAG( 'E', 'B', 'D', 'T' ) +#define TTAG_EBLC FT_MAKE_TAG( 'E', 'B', 'L', 'C' ) +#define TTAG_EBSC FT_MAKE_TAG( 'E', 'B', 'S', 'C' ) +#define TTAG_feat FT_MAKE_TAG( 'f', 'e', 'a', 't' ) +#define TTAG_FOND FT_MAKE_TAG( 'F', 'O', 'N', 'D' ) +#define TTAG_fpgm FT_MAKE_TAG( 'f', 'p', 'g', 'm' ) +#define TTAG_fvar FT_MAKE_TAG( 'f', 'v', 'a', 'r' ) +#define TTAG_gasp FT_MAKE_TAG( 'g', 'a', 's', 'p' ) +#define TTAG_GDEF FT_MAKE_TAG( 'G', 'D', 'E', 'F' ) +#define TTAG_glyf FT_MAKE_TAG( 'g', 'l', 'y', 'f' ) +#define TTAG_GPOS FT_MAKE_TAG( 'G', 'P', 'O', 'S' ) +#define TTAG_GSUB FT_MAKE_TAG( 'G', 'S', 'U', 'B' ) +#define TTAG_gvar FT_MAKE_TAG( 'g', 'v', 'a', 'r' ) +#define TTAG_hdmx FT_MAKE_TAG( 'h', 'd', 'm', 'x' ) +#define TTAG_head FT_MAKE_TAG( 'h', 'e', 'a', 'd' ) +#define TTAG_hhea FT_MAKE_TAG( 'h', 'h', 'e', 'a' ) +#define TTAG_hmtx FT_MAKE_TAG( 'h', 'm', 't', 'x' ) +#define TTAG_JSTF FT_MAKE_TAG( 'J', 'S', 'T', 'F' ) +#define TTAG_just FT_MAKE_TAG( 'j', 'u', 's', 't' ) +#define TTAG_kern FT_MAKE_TAG( 'k', 'e', 'r', 'n' ) +#define TTAG_lcar FT_MAKE_TAG( 'l', 'c', 'a', 'r' ) +#define TTAG_loca FT_MAKE_TAG( 'l', 'o', 'c', 'a' ) +#define TTAG_LTSH FT_MAKE_TAG( 'L', 'T', 'S', 'H' ) +#define TTAG_LWFN FT_MAKE_TAG( 'L', 'W', 'F', 'N' ) +#define TTAG_MATH FT_MAKE_TAG( 'M', 'A', 'T', 'H' ) +#define TTAG_maxp FT_MAKE_TAG( 'm', 'a', 'x', 'p' ) +#define TTAG_META FT_MAKE_TAG( 'M', 'E', 'T', 'A' ) +#define TTAG_MMFX FT_MAKE_TAG( 'M', 'M', 'F', 'X' ) +#define TTAG_MMSD FT_MAKE_TAG( 'M', 'M', 'S', 'D' ) +#define TTAG_mort FT_MAKE_TAG( 'm', 'o', 'r', 't' ) +#define TTAG_morx FT_MAKE_TAG( 'm', 'o', 'r', 'x' ) +#define TTAG_name FT_MAKE_TAG( 'n', 'a', 'm', 'e' ) +#define TTAG_opbd FT_MAKE_TAG( 'o', 'p', 'b', 'd' ) +#define TTAG_OS2 FT_MAKE_TAG( 'O', 'S', '/', '2' ) +#define TTAG_OTTO FT_MAKE_TAG( 'O', 'T', 'T', 'O' ) +#define TTAG_PCLT FT_MAKE_TAG( 'P', 'C', 'L', 'T' ) +#define TTAG_POST FT_MAKE_TAG( 'P', 'O', 'S', 'T' ) +#define TTAG_post FT_MAKE_TAG( 'p', 'o', 's', 't' ) +#define TTAG_prep FT_MAKE_TAG( 'p', 'r', 'e', 'p' ) +#define TTAG_prop FT_MAKE_TAG( 'p', 'r', 'o', 'p' ) +#define TTAG_sfnt FT_MAKE_TAG( 's', 'f', 'n', 't' ) +#define TTAG_SING FT_MAKE_TAG( 'S', 'I', 'N', 'G' ) +#define TTAG_trak FT_MAKE_TAG( 't', 'r', 'a', 'k' ) +#define TTAG_true FT_MAKE_TAG( 't', 'r', 'u', 'e' ) +#define TTAG_ttc FT_MAKE_TAG( 't', 't', 'c', ' ' ) +#define TTAG_ttcf FT_MAKE_TAG( 't', 't', 'c', 'f' ) +#define TTAG_TYP1 FT_MAKE_TAG( 'T', 'Y', 'P', '1' ) +#define TTAG_typ1 FT_MAKE_TAG( 't', 'y', 'p', '1' ) +#define TTAG_VDMX FT_MAKE_TAG( 'V', 'D', 'M', 'X' ) +#define TTAG_vhea FT_MAKE_TAG( 'v', 'h', 'e', 'a' ) +#define TTAG_vmtx FT_MAKE_TAG( 'v', 'm', 't', 'x' ) + + +FT_END_HEADER + +#endif /* __TTAGS_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ttunpat.h b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ttunpat.h new file mode 100644 index 00000000..a0162759 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/freetype2/freetype/ttunpat.h @@ -0,0 +1,59 @@ +/***************************************************************************/ +/* */ +/* ttunpat.h */ +/* */ +/* Definitions for the unpatented TrueType hinting system */ +/* */ +/* Copyright 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* Written by Graham Asher <graham.asher@btinternet.com> */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTUNPAT_H__ +#define __TTUNPAT_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************** + * + * @constant: + * FT_PARAM_TAG_UNPATENTED_HINTING + * + * @description: + * A constant used as the tag of an @FT_Parameter structure to indicate + * that unpatented methods only should be used by the TrueType bytecode + * interpreter for a typeface opened by @FT_Open_Face. + * + */ +#define FT_PARAM_TAG_UNPATENTED_HINTING FT_MAKE_TAG( 'u', 'n', 'p', 'a' ) + + /* */ + +FT_END_HEADER + + +#endif /* __TTUNPAT_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/ft2build.h b/plugins/snes9x_gx/portlibs/include/ft2build.h new file mode 100644 index 00000000..6a3b8d90 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/ft2build.h @@ -0,0 +1,61 @@ +/***************************************************************************/ +/* */ +/* ft2build.h */ +/* */ +/* Build macros of the FreeType 2 library. */ +/* */ +/* Copyright 1996-2001, 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This is a Unix-specific version of <ft2build.h> that should be used */ + /* exclusively *after* installation of the library. */ + /* */ + /* It assumes that `/usr/local/include/freetype2' (or whatever is */ + /* returned by the `freetype-config --cflags' or `pkg-config --cflags' */ + /* command) is in your compilation include path. */ + /* */ + /* We don't need to do anything special in this release. However, for */ + /* a future FreeType 2 release, the following installation changes will */ + /* be performed: */ + /* */ + /* - The contents of `freetype-2.x/include/freetype' will be installed */ + /* to `/usr/local/include/freetype2' instead of */ + /* `/usr/local/include/freetype2/freetype'. */ + /* */ + /* - This file will #include <freetype2/config/ftheader.h>, instead */ + /* of <freetype/config/ftheader.h>. */ + /* */ + /* - The contents of `ftheader.h' will be processed with `sed' to */ + /* replace all `<freetype/xxx>' with `<freetype2/xxx>'. */ + /* */ + /* - Adding `/usr/local/include/freetype2' to your compilation include */ + /* path will not be necessary anymore. */ + /* */ + /* These changes will be transparent to client applications which use */ + /* freetype-config (or pkg-config). No modifications will be necessary */ + /* to compile with the new scheme. */ + /* */ + /*************************************************************************/ + + +#ifndef __FT2_BUILD_UNIX_H__ +#define __FT2_BUILD_UNIX_H__ + + /* `<prefix>/include/freetype2' must be in your current inclusion path */ +#include <freetype/config/ftheader.h> + +#endif /* __FT2_BUILD_UNIX_H__ */ + + +/* END */ diff --git a/plugins/snes9x_gx/portlibs/include/gd.h b/plugins/snes9x_gx/portlibs/include/gd.h new file mode 100644 index 00000000..18d8f544 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/gd.h @@ -0,0 +1,889 @@ +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef GD_H +#define GD_H 1 + +#define GD_MAJOR_VERSION 2 +#define GD_MINOR_VERSION 1 +#define GD_RELEASE_VERSION 0 +#define GD_EXTRA_VERSION "alpha" +#define GD_VERSION_STRING "2.1.0-alpha" + +/* Do the DLL dance: dllexport when building the DLL, + dllimport when importing from it, nothing when + not on Silly Silly Windows (tm Aardman Productions). */ + +/* 2.0.20: for headers */ + +/* 2.0.24: __stdcall also needed for Visual BASIC + and other languages. This breaks ABI compatibility + with previous DLL revs, but it's necessary. */ + +/* 2.0.29: WIN32 programmers can declare the NONDLL macro if they + wish to build gd as a static library or by directly including + the gd sources in a project. */ + +#if !defined(WIN32) && !defined(_WIN32_WCE) +#define NONDLL 1 +#endif /* WIN32 */ + +#ifdef NONDLL +#define BGD_DECLARE(rt) extern rt +#else +#ifdef BGDWIN32 + +#define BGD_DECLARE(rt) __declspec(dllexport) rt __stdcall +#else +#define BGD_DECLARE(rt) __declspec(dllimport) rt _stdcall +#endif /* BGDWIN32 */ +#endif /* NONDLL */ + +/* 2.0.20: for actual storage of exported data, functions don't need this, + currently needed only for font pointers */ +#ifdef NONDLL +/* 2.0.25: bring back extern */ +#define BGD_EXPORT_DATA_PROT extern +#define BGD_EXPORT_DATA_IMPL +#else +#ifdef BGDWIN32 +#define BGD_EXPORT_DATA_PROT __declspec(dllexport) extern +#define BGD_EXPORT_DATA_IMPL __declspec(dllexport) +#else +#define BGD_EXPORT_DATA_PROT __declspec(dllimport) extern +#define BGD_EXPORT_DATA_IMPL __declspec(dllimport) +#endif /* BGDWIN32 */ +#endif /* NONDLL */ + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* some might want to set DEFAULT_FONTPATH from configure in config.h */ +#ifdef NETWARE +/* default fontpath for netware systems, could probably be handled in configure for 2.1 */ +#define DEFAULT_FONTPATH "sys:/java/nwgfx/lib/x11/fonts/ttf;." +#define PATHSEPARATOR ";" +#endif + +/* 2.0.23: more Type 1 fonts */ +#ifndef DEFAULT_FONTPATH +/* default fontpath for unix systems - whatever happened to standards ! */ +#define DEFAULT_FONTPATH "/usr/X11R6/lib/X11/fonts/TrueType:/usr/X11R6/lib/X11/fonts/truetype:/usr/X11R6/lib/X11/fonts/TTF:/usr/share/fonts/TrueType:/usr/share/fonts/truetype:/usr/openwin/lib/X11/fonts/TrueType:/usr/X11R6/lib/X11/fonts/Type1:/usr/lib/X11/fonts/Type1:/usr/openwin/lib/X11/fonts/Type1" +#endif +#ifndef PATHSEPARATOR +#define PATHSEPARATOR ":" +#endif + +/* gd.h: declarations file for the graphic-draw module. + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. This software is provided "AS IS." Thomas Boutell and + * Boutell.Com, Inc. disclaim all warranties, either express or implied, + * including but not limited to implied warranties of merchantability and + * fitness for a particular purpose, with respect to this code and accompanying + * documentation. */ + +/* stdio is needed for file I/O. */ +#include <stdio.h> +#include "gd_io.h" + +/* The maximum number of palette entries in palette-based images. + In the wonderful new world of gd 2.0, you can of course have + many more colors when using truecolor mode. */ + +#define gdMaxColors 256 + +/* Image type. See functions below; you will not need to change + the elements directly. Use the provided macros to + access sx, sy, the color table, and colorsTotal for + read-only purposes. */ + +/* If 'truecolor' is set true, the image is truecolor; + pixels are represented by integers, which + must be 32 bits wide or more. + + True colors are repsented as follows: + + ARGB + + Where 'A' (alpha channel) occupies only the + LOWER 7 BITS of the MSB. This very small + loss of alpha channel resolution allows gd 2.x + to keep backwards compatibility by allowing + signed integers to be used to represent colors, + and negative numbers to represent special cases, + just as in gd 1.x. */ + +#define gdAlphaMax 127 +#define gdAlphaOpaque 0 +#define gdAlphaTransparent 127 +#define gdRedMax 255 +#define gdGreenMax 255 +#define gdBlueMax 255 +#define gdTrueColorGetAlpha(c) (((c) & 0x7F000000) >> 24) +#define gdTrueColorGetRed(c) (((c) & 0xFF0000) >> 16) +#define gdTrueColorGetGreen(c) (((c) & 0x00FF00) >> 8) +#define gdTrueColorGetBlue(c) ((c) & 0x0000FF) + +enum gdCropMode { + GD_CROP_DEFAULT = 0, + GD_CROP_TRANSPARENT, + GD_CROP_BLACK, + GD_CROP_WHITE, + GD_CROP_SIDES +}; + + +/* This function accepts truecolor pixel values only. The + source color is composited with the destination color + based on the alpha channel value of the source color. + The resulting color is opaque. */ + +BGD_DECLARE(int) gdAlphaBlend (int dest, int src); + + typedef struct gdImageStruct + { + /* Palette-based image pixels */ + unsigned char **pixels; + int sx; + int sy; + /* These are valid in palette images only. See also + 'alpha', which appears later in the structure to + preserve binary backwards compatibility */ + int colorsTotal; + int red[gdMaxColors]; + int green[gdMaxColors]; + int blue[gdMaxColors]; + int open[gdMaxColors]; + /* For backwards compatibility, this is set to the + first palette entry with 100% transparency, + and is also set and reset by the + gdImageColorTransparent function. Newer + applications can allocate palette entries + with any desired level of transparency; however, + bear in mind that many viewers, notably + many web browsers, fail to implement + full alpha channel for PNG and provide + support for full opacity or transparency only. */ + int transparent; + int *polyInts; + int polyAllocated; + struct gdImageStruct *brush; + struct gdImageStruct *tile; + int brushColorMap[gdMaxColors]; + int tileColorMap[gdMaxColors]; + int styleLength; + int stylePos; + int *style; + int interlace; + /* New in 2.0: thickness of line. Initialized to 1. */ + int thick; + /* New in 2.0: alpha channel for palettes. Note that only + Macintosh Internet Explorer and (possibly) Netscape 6 + really support multiple levels of transparency in + palettes, to my knowledge, as of 2/15/01. Most + common browsers will display 100% opaque and + 100% transparent correctly, and do something + unpredictable and/or undesirable for levels + in between. TBB */ + int alpha[gdMaxColors]; + /* Truecolor flag and pixels. New 2.0 fields appear here at the + end to minimize breakage of existing object code. */ + int trueColor; + int **tpixels; + /* Should alpha channel be copied, or applied, each time a + pixel is drawn? This applies to truecolor images only. + No attempt is made to alpha-blend in palette images, + even if semitransparent palette entries exist. + To do that, build your image as a truecolor image, + then quantize down to 8 bits. */ + int alphaBlendingFlag; + /* Should the alpha channel of the image be saved? This affects + PNG at the moment; other future formats may also + have that capability. JPEG doesn't. */ + int saveAlphaFlag; + + /* There should NEVER BE ACCESSOR MACROS FOR ITEMS BELOW HERE, so this + part of the structure can be safely changed in new releases. */ + + /* 2.0.12: anti-aliased globals. 2.0.26: just a few vestiges after + switching to the fast, memory-cheap implementation from PHP-gd. */ + int AA; + int AA_color; + int AA_dont_blend; + + /* 2.0.12: simple clipping rectangle. These values + must be checked for safety when set; please use + gdImageSetClip */ + int cx1; + int cy1; + int cx2; + int cy2; + + /* 2.1.0: allows to specify resolution in dpi */ + unsigned int res_x; + unsigned int res_y; + } + gdImage; + + typedef gdImage *gdImagePtr; + + typedef struct + { + /* # of characters in font */ + int nchars; + /* First character is numbered... (usually 32 = space) */ + int offset; + /* Character width and height */ + int w; + int h; + /* Font data; array of characters, one row after another. + Easily included in code, also easily loaded from + data files. */ + char *data; + } + gdFont; + +/* Text functions take these. */ + typedef gdFont *gdFontPtr; + +/* For backwards compatibility only. Use gdImageSetStyle() + for MUCH more flexible line drawing. Also see + gdImageSetBrush(). */ +#define gdDashSize 4 + +/* Special colors. */ + +#define gdStyled (-2) +#define gdBrushed (-3) +#define gdStyledBrushed (-4) +#define gdTiled (-5) + +/* NOT the same as the transparent color index. + This is used in line styles only. */ +#define gdTransparent (-6) + +#define gdAntiAliased (-7) + +/* Functions to manipulate images. */ + +/* Creates a palette-based image (up to 256 colors). */ +BGD_DECLARE(gdImagePtr) gdImageCreate (int sx, int sy); + +/* An alternate name for the above (2.0). */ +#define gdImageCreatePalette gdImageCreate + +/* Creates a truecolor image (millions of colors). */ +BGD_DECLARE(gdImagePtr) gdImageCreateTrueColor (int sx, int sy); + +/* Creates an image from various file types. These functions + return a palette or truecolor image based on the + nature of the file being loaded. Truecolor PNG + stays truecolor; palette PNG stays palette-based; + JPEG is always truecolor. */ +BGD_DECLARE(gdImagePtr) gdImageCreateFromPng (FILE * fd); +BGD_DECLARE(gdImagePtr) gdImageCreateFromPngCtx (gdIOCtxPtr in); +BGD_DECLARE(gdImagePtr) gdImageCreateFromPngPtr (int size, void *data); + +/* These read the first frame only */ +BGD_DECLARE(gdImagePtr) gdImageCreateFromGif (FILE * fd); +BGD_DECLARE(gdImagePtr) gdImageCreateFromGifCtx (gdIOCtxPtr in); +BGD_DECLARE(gdImagePtr) gdImageCreateFromGifPtr (int size, void *data); +BGD_DECLARE(gdImagePtr) gdImageCreateFromWBMP (FILE * inFile); +BGD_DECLARE(gdImagePtr) gdImageCreateFromWBMPCtx (gdIOCtx * infile); +BGD_DECLARE(gdImagePtr) gdImageCreateFromWBMPPtr (int size, void *data); +BGD_DECLARE(gdImagePtr) gdImageCreateFromJpeg (FILE * infile); +BGD_DECLARE(gdImagePtr) gdImageCreateFromJpegCtx (gdIOCtx * infile); +BGD_DECLARE(gdImagePtr) gdImageCreateFromJpegPtr (int size, void *data); + +BGD_DECLARE(gdImagePtr) gdImageCreateFromTiff(FILE *inFile); +BGD_DECLARE(gdImagePtr) gdImageCreateFromTiffCtx(gdIOCtx *infile); +BGD_DECLARE(gdImagePtr) gdImageCreateFromTiffPtr(int size, void *data); + +BGD_DECLARE(gdImagePtr) gdImageCreateFromTga( FILE * fp ); +BGD_DECLARE(gdImagePtr) gdImageCreateFromTgaCtx(gdIOCtx* ctx); +BGD_DECLARE(gdImagePtr) gdImageCreateFromTgaPtr(int size, void *data); + +BGD_DECLARE(gdImagePtr) gdImageCreateFromBmp (FILE * inFile); +BGD_DECLARE(gdImagePtr) gdImageCreateFromBmpPtr (int size, void *data); +BGD_DECLARE(gdImagePtr) gdImageCreateFromBmpCtx (gdIOCtxPtr infile); + +/* A custom data source. */ +/* The source function must return -1 on error, otherwise the number + of bytes fetched. 0 is EOF, not an error! */ +/* context will be passed to your source function. */ + + typedef struct + { + int (*source) (void *context, char *buffer, int len); + void *context; + } + gdSource, *gdSourcePtr; + + /* Deprecated in favor of gdImageCreateFromPngCtx */ +BGD_DECLARE(gdImagePtr) gdImageCreateFromPngSource (gdSourcePtr in); + +BGD_DECLARE(gdImagePtr) gdImageCreateFromGd (FILE * in); +BGD_DECLARE(gdImagePtr) gdImageCreateFromGdCtx (gdIOCtxPtr in); +BGD_DECLARE(gdImagePtr) gdImageCreateFromGdPtr (int size, void *data); + +BGD_DECLARE(gdImagePtr) gdImageCreateFromGd2 (FILE * in); +BGD_DECLARE(gdImagePtr) gdImageCreateFromGd2Ctx (gdIOCtxPtr in); +BGD_DECLARE(gdImagePtr) gdImageCreateFromGd2Ptr (int size, void *data); + +BGD_DECLARE(gdImagePtr) gdImageCreateFromGd2Part (FILE * in, int srcx, int srcy, int w, + int h); +BGD_DECLARE(gdImagePtr) gdImageCreateFromGd2PartCtx (gdIOCtxPtr in, int srcx, int srcy, + int w, int h); +BGD_DECLARE(gdImagePtr) gdImageCreateFromGd2PartPtr (int size, void *data, int srcx, int srcy, + int w, int h); + /* 2.0.10: prototype was missing */ +BGD_DECLARE(gdImagePtr) gdImageCreateFromXbm (FILE * in); + + /* NOTE: filename, not FILE */ +BGD_DECLARE(gdImagePtr) gdImageCreateFromXpm (char *filename); + +BGD_DECLARE(void) gdImageDestroy (gdImagePtr im); + +/* Replaces or blends with the background depending on the + most recent call to gdImageAlphaBlending and the + alpha channel value of 'color'; default is to overwrite. + Tiling and line styling are also implemented + here. All other gd drawing functions pass through this call, + allowing for many useful effects. */ + +BGD_DECLARE(void) gdImageSetPixel (gdImagePtr im, int x, int y, int color); +/* FreeType 2 text output with hook to extra flags */ + +BGD_DECLARE(int) gdImageGetPixel (gdImagePtr im, int x, int y); +BGD_DECLARE(int) gdImageGetTrueColorPixel (gdImagePtr im, int x, int y); + +BGD_DECLARE(void) gdImageAABlend (gdImagePtr im); + +BGD_DECLARE(void) gdImageLine (gdImagePtr im, int x1, int y1, int x2, int y2, int color); + +/* For backwards compatibility only. Use gdImageSetStyle() + for much more flexible line drawing. */ +BGD_DECLARE(void) gdImageDashedLine (gdImagePtr im, int x1, int y1, int x2, int y2, + int color); +/* Corners specified (not width and height). Upper left first, lower right + second. */ +BGD_DECLARE(void) gdImageRectangle (gdImagePtr im, int x1, int y1, int x2, int y2, + int color); +/* Solid bar. Upper left corner first, lower right corner second. */ +BGD_DECLARE(void) gdImageFilledRectangle (gdImagePtr im, int x1, int y1, int x2, int y2, + int color); +BGD_DECLARE(void) gdImageSetClip(gdImagePtr im, int x1, int y1, int x2, int y2); +BGD_DECLARE(void) gdImageGetClip(gdImagePtr im, int *x1P, int *y1P, int *x2P, int *y2P); +BGD_DECLARE(void) gdImageSetResolution(gdImagePtr im, const unsigned int res_x, const unsigned int res_y); +BGD_DECLARE(int) gdImageBoundsSafe (gdImagePtr im, int x, int y); +BGD_DECLARE(void) gdImageChar (gdImagePtr im, gdFontPtr f, int x, int y, int c, + int color); +BGD_DECLARE(void) gdImageCharUp (gdImagePtr im, gdFontPtr f, int x, int y, int c, + int color); +BGD_DECLARE(void) gdImageString (gdImagePtr im, gdFontPtr f, int x, int y, + unsigned char *s, int color); +BGD_DECLARE(void) gdImageStringUp (gdImagePtr im, gdFontPtr f, int x, int y, + unsigned char *s, int color); +BGD_DECLARE(void) gdImageString16 (gdImagePtr im, gdFontPtr f, int x, int y, + unsigned short *s, int color); +BGD_DECLARE(void) gdImageStringUp16 (gdImagePtr im, gdFontPtr f, int x, int y, + unsigned short *s, int color); + +/* 2.0.16: for thread-safe use of gdImageStringFT and friends, + call this before allowing any thread to call gdImageStringFT. + Otherwise it is invoked by the first thread to invoke + gdImageStringFT, with a very small but real risk of a race condition. + Return 0 on success, nonzero on failure to initialize freetype. */ +BGD_DECLARE(int) gdFontCacheSetup (void); + +/* Optional: clean up after application is done using fonts in +BGD_DECLARE( ) + gdImageStringFT(). */ +BGD_DECLARE(void) gdFontCacheShutdown (void); +/* 2.0.20: for backwards compatibility. A few applications did start calling + this function when it first appeared although it was never documented. + Simply invokes gdFontCacheShutdown. */ +BGD_DECLARE(void) gdFreeFontCache (void); + +/* Calls gdImageStringFT. Provided for backwards compatibility only. */ +BGD_DECLARE(char *) gdImageStringTTF (gdImage * im, int *brect, int fg, char *fontlist, + double ptsize, double angle, int x, int y, + char *string); + +/* FreeType 2 text output */ +BGD_DECLARE(char *) gdImageStringFT (gdImage * im, int *brect, int fg, char *fontlist, + double ptsize, double angle, int x, int y, + char *string); + +/* 2.0.5: provides an extensible way to pass additional parameters. + Thanks to Wez Furlong, sorry for the delay. */ + + typedef struct + { + int flags; /* Logical OR of gdFTEX_ values */ + double linespacing; /* fine tune line spacing for '\n' */ + int charmap; /* TBB: 2.0.12: may be gdFTEX_Unicode, + gdFTEX_Shift_JIS, gdFTEX_Big5, + or gdFTEX_Adobe_Custom; + when not specified, maps are searched + for in the above order. */ + int hdpi; /* if (flags & gdFTEX_RESOLUTION) */ + int vdpi; /* if (flags & gdFTEX_RESOLUTION) */ + char *xshow; /* if (flags & gdFTEX_XSHOW) + then, on return, xshow is a malloc'ed + string containing xshow position data for + the last string. + + NB. The caller is responsible for gdFree'ing + the xshow string. + */ + char *fontpath; /* if (flags & gdFTEX_RETURNFONTPATHNAME) + then, on return, fontpath is a malloc'ed + string containing the actual font file path name + used, which can be interesting when fontconfig + is in use. + + The caller is responsible for gdFree'ing the + fontpath string. + */ + + } + gdFTStringExtra, *gdFTStringExtraPtr; + +#define gdFTEX_LINESPACE 1 +#define gdFTEX_CHARMAP 2 +#define gdFTEX_RESOLUTION 4 +#define gdFTEX_DISABLE_KERNING 8 +#define gdFTEX_XSHOW 16 +/* The default unless gdFTUseFontConfig(1); has been called: + fontlist is a full or partial font file pathname or list thereof + (i.e. just like before 2.0.29) */ +#define gdFTEX_FONTPATHNAME 32 +/* Necessary to use fontconfig patterns instead of font pathnames + as the fontlist argument, unless gdFTUseFontConfig(1); has + been called. New in 2.0.29 */ +#define gdFTEX_FONTCONFIG 64 +/* Sometimes interesting when fontconfig is used: the fontpath + element of the structure above will contain a gdMalloc'd string + copy of the actual font file pathname used, if this flag is set + when the call is made */ +#define gdFTEX_RETURNFONTPATHNAME 128 + +/* If flag is nonzero, the fontlist parameter to gdImageStringFT + and gdImageStringFTEx shall be assumed to be a fontconfig font pattern + if fontconfig was compiled into gd. This function returns zero + if fontconfig is not available, nonzero otherwise. */ +BGD_DECLARE(int) gdFTUseFontConfig(int flag); + +/* These are NOT flags; set one in 'charmap' if you set the + gdFTEX_CHARMAP bit in 'flags'. */ +#define gdFTEX_Unicode 0 +#define gdFTEX_Shift_JIS 1 +#define gdFTEX_Big5 2 +#define gdFTEX_Adobe_Custom 3 + +BGD_DECLARE(char *) gdImageStringFTEx (gdImage * im, int *brect, int fg, char *fontlist, + double ptsize, double angle, int x, int y, + char *string, gdFTStringExtraPtr strex); + +/* Point type for use in polygon drawing. */ +typedef struct +{ + int x, y; +} +gdPoint, *gdPointPtr; + +typedef struct +{ + int x, y; + int width, height; +} +gdRect, *gdRectPtr; + + +BGD_DECLARE(void) gdImagePolygon (gdImagePtr im, gdPointPtr p, int n, int c); +BGD_DECLARE(void) gdImageOpenPolygon (gdImagePtr im, gdPointPtr p, int n, int c); +BGD_DECLARE(void) gdImageFilledPolygon (gdImagePtr im, gdPointPtr p, int n, int c); + +/* These functions still work with truecolor images, + for which they never return error. */ +BGD_DECLARE(int) gdImageColorAllocate (gdImagePtr im, int r, int g, int b); +/* gd 2.0: palette entries with non-opaque transparency are permitted. */ +BGD_DECLARE(int) gdImageColorAllocateAlpha (gdImagePtr im, int r, int g, int b, int a); +/* Assumes opaque is the preferred alpha channel value */ +BGD_DECLARE(int) gdImageColorClosest (gdImagePtr im, int r, int g, int b); +/* Closest match taking all four parameters into account. + A slightly different color with the same transparency + beats the exact same color with radically different + transparency */ +BGD_DECLARE(int) gdImageColorClosestAlpha (gdImagePtr im, int r, int g, int b, int a); +/* An alternate method */ +BGD_DECLARE(int) gdImageColorClosestHWB (gdImagePtr im, int r, int g, int b); +/* Returns exact, 100% opaque matches only */ +BGD_DECLARE(int) gdImageColorExact (gdImagePtr im, int r, int g, int b); +/* Returns an exact match only, including alpha */ +BGD_DECLARE(int) gdImageColorExactAlpha (gdImagePtr im, int r, int g, int b, int a); +/* Opaque only */ +BGD_DECLARE(int) gdImageColorResolve (gdImagePtr im, int r, int g, int b); +/* Based on gdImageColorExactAlpha and gdImageColorClosestAlpha */ +BGD_DECLARE(int) gdImageColorResolveAlpha (gdImagePtr im, int r, int g, int b, int a); + +/* A simpler way to obtain an opaque truecolor value for drawing on a + truecolor image. Not for use with palette images! */ + +#define gdTrueColor(r, g, b) (((r) << 16) + \ + ((g) << 8) + \ + (b)) + +/* Returns a truecolor value with an alpha channel component. + gdAlphaMax (127, **NOT 255**) is transparent, 0 is completely + opaque. */ + +#define gdTrueColorAlpha(r, g, b, a) (((a) << 24) + \ + ((r) << 16) + \ + ((g) << 8) + \ + (b)) + +BGD_DECLARE(void) gdImageColorDeallocate (gdImagePtr im, int color); + +/* Converts a truecolor image to a palette-based image, + using a high-quality two-pass quantization routine + which attempts to preserve alpha channel information + as well as R/G/B color information when creating + a palette. If ditherFlag is set, the image will be + dithered to approximate colors better, at the expense + of some obvious "speckling." colorsWanted can be + anything up to 256. If the original source image + includes photographic information or anything that + came out of a JPEG, 256 is strongly recommended. + + Better yet, don't use these function -- write real + truecolor PNGs and JPEGs. The disk space gain of + conversion to palette is not great (for small images + it can be negative) and the quality loss is ugly. + + DIFFERENCES: gdImageCreatePaletteFromTrueColor creates and + returns a new image. gdImageTrueColorToPalette modifies + an existing image, and the truecolor pixels are discarded. */ + +BGD_DECLARE(gdImagePtr) gdImageCreatePaletteFromTrueColor (gdImagePtr im, int ditherFlag, + int colorsWanted); + +BGD_DECLARE(void) gdImageTrueColorToPalette (gdImagePtr im, int ditherFlag, + int colorsWanted); + +/* Specifies a color index (if a palette image) or an + RGB color (if a truecolor image) which should be + considered 100% transparent. FOR TRUECOLOR IMAGES, + THIS IS IGNORED IF AN ALPHA CHANNEL IS BEING + SAVED. Use gdImageSaveAlpha(im, 0); to + turn off the saving of a full alpha channel in + a truecolor image. Note that gdImageColorTransparent + is usually compatible with older browsers that + do not understand full alpha channels well. TBB */ +BGD_DECLARE(void) gdImageColorTransparent (gdImagePtr im, int color); + +BGD_DECLARE(void) gdImagePaletteCopy (gdImagePtr dst, gdImagePtr src); + +typedef int (*gdCallbackImageColor)(gdImagePtr im, int src); + +BGD_DECLARE(int) gdImageColorReplace(gdImagePtr im, int src, int dst); +BGD_DECLARE(int) gdImageColorReplaceThreshold(gdImagePtr im, int src, int dst, float threshold); +BGD_DECLARE(int) gdImageColorReplaceArray(gdImagePtr im, int len, int *src, int *dst); +BGD_DECLARE(int) gdImageColorReplaceCallback(gdImagePtr im, gdCallbackImageColor callback); + +BGD_DECLARE(void) gdImageGif (gdImagePtr im, FILE * out); +BGD_DECLARE(void) gdImagePng (gdImagePtr im, FILE * out); +BGD_DECLARE(void) gdImagePngCtx (gdImagePtr im, gdIOCtx * out); +BGD_DECLARE(void) gdImageGifCtx (gdImagePtr im, gdIOCtx * out); +BGD_DECLARE(void) gdImageTiff(gdImagePtr im, FILE *outFile); +BGD_DECLARE(void *) gdImageTiffPtr(gdImagePtr im, int *size); +BGD_DECLARE(void) gdImageTiffCtx(gdImagePtr image, gdIOCtx *out); + +BGD_DECLARE(void *) gdImageBmpPtr(gdImagePtr im, int *size, int compression); +BGD_DECLARE(void) gdImageBmp(gdImagePtr im, FILE *outFile, int compression); +BGD_DECLARE(void) gdImageBmpCtx(gdImagePtr im, gdIOCtxPtr out, int compression); + +/* 2.0.12: Compression level: 0-9 or -1, where 0 is NO COMPRESSION at all, + 1 is FASTEST but produces larger files, 9 provides the best + compression (smallest files) but takes a long time to compress, and + -1 selects the default compiled into the zlib library. */ +BGD_DECLARE(void) gdImagePngEx (gdImagePtr im, FILE * out, int level); +BGD_DECLARE(void) gdImagePngCtxEx (gdImagePtr im, gdIOCtx * out, int level); + +BGD_DECLARE(void) gdImageWBMP (gdImagePtr image, int fg, FILE * out); +BGD_DECLARE(void) gdImageWBMPCtx (gdImagePtr image, int fg, gdIOCtx * out); + +/* Guaranteed to correctly free memory returned + by the gdImage*Ptr functions */ +BGD_DECLARE(void) gdFree (void *m); + +/* Best to free this memory with gdFree(), not free() */ +BGD_DECLARE(void *) gdImageWBMPPtr (gdImagePtr im, int *size, int fg); + +/* 100 is highest quality (there is always a little loss with JPEG). + 0 is lowest. 10 is about the lowest useful setting. */ +BGD_DECLARE(void) gdImageJpeg (gdImagePtr im, FILE * out, int quality); +BGD_DECLARE(void) gdImageJpegCtx (gdImagePtr im, gdIOCtx * out, int quality); + +/* Best to free this memory with gdFree(), not free() */ +BGD_DECLARE(void *) gdImageJpegPtr (gdImagePtr im, int *size, int quality); + +/* Legal values for Disposal. gdDisposalNone is always used by + the built-in optimizer if previm is passed. */ + +enum { + gdDisposalUnknown, + gdDisposalNone, + gdDisposalRestoreBackground, + gdDisposalRestorePrevious +}; + +BGD_DECLARE(void) gdImageGifAnimBegin(gdImagePtr im, FILE *outFile, int GlobalCM, int Loops); +BGD_DECLARE(void) gdImageGifAnimAdd(gdImagePtr im, FILE *outFile, int LocalCM, int LeftOfs, int TopOfs, int Delay, int Disposal, gdImagePtr previm); +BGD_DECLARE(void) gdImageGifAnimEnd(FILE *outFile); +BGD_DECLARE(void) gdImageGifAnimBeginCtx(gdImagePtr im, gdIOCtx *out, int GlobalCM, int Loops); +BGD_DECLARE(void) gdImageGifAnimAddCtx(gdImagePtr im, gdIOCtx *out, int LocalCM, int LeftOfs, int TopOfs, int Delay, int Disposal, gdImagePtr previm); +BGD_DECLARE(void) gdImageGifAnimEndCtx(gdIOCtx *out); +BGD_DECLARE(void *) gdImageGifAnimBeginPtr(gdImagePtr im, int *size, int GlobalCM, int Loops); +BGD_DECLARE(void *) gdImageGifAnimAddPtr(gdImagePtr im, int *size, int LocalCM, int LeftOfs, int TopOfs, int Delay, int Disposal, gdImagePtr previm); +BGD_DECLARE(void *) gdImageGifAnimEndPtr(int *size); + +/* A custom data sink. For backwards compatibility. Use + gdIOCtx instead. */ +/* The sink function must return -1 on error, otherwise the number + of bytes written, which must be equal to len. */ +/* context will be passed to your sink function. */ + typedef struct + { + int (*sink) (void *context, const char *buffer, int len); + void *context; + } + gdSink, *gdSinkPtr; + +BGD_DECLARE(void) gdImagePngToSink (gdImagePtr im, gdSinkPtr out); + +BGD_DECLARE(void) gdImageGd (gdImagePtr im, FILE * out); +BGD_DECLARE(void) gdImageGd2 (gdImagePtr im, FILE * out, int cs, int fmt); + +/* Best to free this memory with gdFree(), not free() */ +BGD_DECLARE(void *) gdImageGifPtr (gdImagePtr im, int *size); + +/* Best to free this memory with gdFree(), not free() */ +BGD_DECLARE(void *) gdImagePngPtr (gdImagePtr im, int *size); +BGD_DECLARE(void *) gdImagePngPtrEx (gdImagePtr im, int *size, int level); + +/* Best to free this memory with gdFree(), not free() */ +BGD_DECLARE(void *) gdImageGdPtr (gdImagePtr im, int *size); + +/* Best to free this memory with gdFree(), not free() */ +BGD_DECLARE(void *) gdImageGd2Ptr (gdImagePtr im, int cs, int fmt, int *size); + +/* Style is a bitwise OR ( | operator ) of these. + gdArc and gdChord are mutually exclusive; + gdChord just connects the starting and ending + angles with a straight line, while gdArc produces + a rounded edge. gdPie is a synonym for gdArc. + gdNoFill indicates that the arc or chord should be + outlined, not filled. gdEdged, used together with + gdNoFill, indicates that the beginning and ending + angles should be connected to the center; this is + a good way to outline (rather than fill) a + 'pie slice'. */ +#define gdArc 0 +#define gdPie gdArc +#define gdChord 1 +#define gdNoFill 2 +#define gdEdged 4 + +BGD_DECLARE(void) gdImageFilledArc (gdImagePtr im, int cx, int cy, int w, int h, int s, + int e, int color, int style); +BGD_DECLARE(void) gdImageArc (gdImagePtr im, int cx, int cy, int w, int h, int s, int e, + int color); +BGD_DECLARE(void) gdImageEllipse(gdImagePtr im, int cx, int cy, int w, int h, int color); +BGD_DECLARE(void) gdImageFilledEllipse (gdImagePtr im, int cx, int cy, int w, int h, + int color); +BGD_DECLARE(void) gdImageFillToBorder (gdImagePtr im, int x, int y, int border, + int color); +BGD_DECLARE(void) gdImageFill (gdImagePtr im, int x, int y, int color); +BGD_DECLARE(void) gdImageCopy (gdImagePtr dst, gdImagePtr src, int dstX, int dstY, + int srcX, int srcY, int w, int h); +BGD_DECLARE(void) gdImageCopyMerge (gdImagePtr dst, gdImagePtr src, int dstX, int dstY, + int srcX, int srcY, int w, int h, int pct); +BGD_DECLARE(void) gdImageCopyMergeGray (gdImagePtr dst, gdImagePtr src, int dstX, + int dstY, int srcX, int srcY, int w, int h, + int pct); + +/* Stretches or shrinks to fit, as needed. Does NOT attempt + to average the entire set of source pixels that scale down onto the + destination pixel. */ +BGD_DECLARE(void) gdImageCopyResized (gdImagePtr dst, gdImagePtr src, int dstX, int dstY, + int srcX, int srcY, int dstW, int dstH, int srcW, + int srcH); + +/* gd 2.0: stretches or shrinks to fit, as needed. When called with a + truecolor destination image, this function averages the + entire set of source pixels that scale down onto the + destination pixel, taking into account what portion of the + destination pixel each source pixel represents. This is a + floating point operation, but this is not a performance issue + on modern hardware, except for some embedded devices. If the + destination is a palette image, gdImageCopyResized is + substituted automatically. */ +BGD_DECLARE(void) gdImageCopyResampled (gdImagePtr dst, gdImagePtr src, int dstX, + int dstY, int srcX, int srcY, int dstW, int dstH, + int srcW, int srcH); + +/* gd 2.0.8: gdImageCopyRotated is added. Source + is a rectangle, with its upper left corner at + srcX and srcY. Destination is the *center* of + the rotated copy. Angle is in degrees, same as + gdImageArc. Floating point destination center + coordinates allow accurate rotation of + objects of odd-numbered width or height. */ +BGD_DECLARE(void) gdImageCopyRotated (gdImagePtr dst, + gdImagePtr src, + double dstX, double dstY, + int srcX, int srcY, + int srcWidth, int srcHeight, int angle); + +BGD_DECLARE(void) gdImageSetBrush (gdImagePtr im, gdImagePtr brush); +BGD_DECLARE(void) gdImageSetTile (gdImagePtr im, gdImagePtr tile); +BGD_DECLARE(void) gdImageSetAntiAliased (gdImagePtr im, int c); +BGD_DECLARE(void) gdImageSetAntiAliasedDontBlend (gdImagePtr im, int c, int dont_blend); +BGD_DECLARE(void) gdImageSetStyle (gdImagePtr im, int *style, int noOfPixels); +/* Line thickness (defaults to 1). Affects lines, ellipses, + rectangles, polygons and so forth. */ +BGD_DECLARE(void) gdImageSetThickness (gdImagePtr im, int thickness); +/* On or off (1 or 0) for all three of these. */ +BGD_DECLARE(void) gdImageInterlace (gdImagePtr im, int interlaceArg); +BGD_DECLARE(void) gdImageAlphaBlending (gdImagePtr im, int alphaBlendingArg); +BGD_DECLARE(void) gdImageSaveAlpha (gdImagePtr im, int saveAlphaArg); + + +BGD_DECLARE(gdImagePtr) gdImageCrop(gdImagePtr src, const gdRect *crop); +BGD_DECLARE(gdImagePtr) gdImageAutoCrop(gdImagePtr im, const unsigned int mode); +BGD_DECLARE(gdImagePtr) gdImageThresholdCrop(gdImagePtr im, const unsigned int color, const float threshold); + +BGD_DECLARE(void) gdImageFlipHorizontal(gdImagePtr im); +BGD_DECLARE(void) gdImageFlipVertical(gdImagePtr im); +BGD_DECLARE(void) gdImageFlipBoth(gdImagePtr im); + +BGD_DECLARE(gdImagePtr) gdImageNeuQuant(gdImagePtr im, const int max_color, int sample_factor); + +enum gdPixelateMode { + GD_PIXELATE_UPPERLEFT, + GD_PIXELATE_AVERAGE +}; + +BGD_DECLARE(int) gdImagePixelate(gdImagePtr im, int block_size, const unsigned int mode); + +typedef struct { + int sub; + int plus; + unsigned int num_colors; + int *colors; + unsigned int seed; +} gdScatter, *gdScatterPtr; + +BGD_DECLARE(int) gdImageScatter(gdImagePtr im, int sub, int plus); +BGD_DECLARE(int) gdImageScatterColor(gdImagePtr im, int sub, int plus, int colors[], unsigned int num_colors); +BGD_DECLARE(int) gdImageScatterEx(gdImagePtr im, gdScatterPtr s); + +/* Macros to access information about images. */ + +/* Returns nonzero if the image is a truecolor image, + zero for a palette image. */ + +#define gdImageTrueColor(im) ((im)->trueColor) + +#define gdImageSX(im) ((im)->sx) +#define gdImageSY(im) ((im)->sy) +#define gdImageColorsTotal(im) ((im)->colorsTotal) +#define gdImageRed(im, c) ((im)->trueColor ? (int) gdTrueColorGetRed(c) : \ + (im)->red[(c)]) +#define gdImageGreen(im, c) ((im)->trueColor ? (int) gdTrueColorGetGreen(c) : \ + (im)->green[(c)]) +#define gdImageBlue(im, c) ((im)->trueColor ? (int) gdTrueColorGetBlue(c) : \ + (im)->blue[(c)]) +#define gdImageAlpha(im, c) ((im)->trueColor ? (int) gdTrueColorGetAlpha(c) : \ + (im)->alpha[(c)]) +#define gdImageGetTransparent(im) ((im)->transparent) +#define gdImageGetInterlaced(im) ((im)->interlace) + +/* These macros provide direct access to pixels in + palette-based and truecolor images, respectively. + If you use these macros, you must perform your own + bounds checking. Use of the macro for the correct type + of image is also your responsibility. */ +#define gdImagePalettePixel(im, x, y) (im)->pixels[(y)][(x)] +#define gdImageTrueColorPixel(im, x, y) (im)->tpixels[(y)][(x)] + +#define gdImageResolutionX(im) (im)->res_x +#define gdImageResolutionY(im) (im)->res_y + +/* I/O Support routines. */ + +BGD_DECLARE(gdIOCtx *) gdNewFileCtx (FILE *); + /* If data is null, size is ignored and an initial data buffer is + allocated automatically. NOTE: this function assumes gd has the right + to free or reallocate "data" at will! Also note that gd will free + "data" when the IO context is freed. If data is not null, it must point + to memory allocated with gdMalloc, or by a call to gdImage[something]Ptr. + If not, see gdNewDynamicCtxEx for an alternative. */ +BGD_DECLARE(gdIOCtx *) gdNewDynamicCtx (int size, void *data); + /* 2.0.21: if freeFlag is nonzero, gd will free and/or reallocate "data" as + needed as described above. If freeFlag is zero, gd will never free + or reallocate "data", which means that the context should only be used + for *reading* an image from a memory buffer, or writing an image to a + memory buffer which is already large enough. If the memory buffer is + not large enough and an image write is attempted, the write operation + will fail. Those wishing to write an image to a buffer in memory have + a much simpler alternative in the gdImage[something]Ptr functions. */ +BGD_DECLARE(gdIOCtx *) gdNewDynamicCtxEx (int size, void *data, int freeFlag); +BGD_DECLARE(gdIOCtx *) gdNewSSCtx (gdSourcePtr in, gdSinkPtr out); +BGD_DECLARE(void *) gdDPExtractData (struct gdIOCtx *ctx, int *size); + +#define GD2_CHUNKSIZE 128 +#define GD2_CHUNKSIZE_MIN 64 +#define GD2_CHUNKSIZE_MAX 4096 + +#define GD2_VERS 2 +#define GD2_ID "gd2" + +#define GD2_FMT_RAW 1 +#define GD2_FMT_COMPRESSED 2 + +/* Image comparison definitions */ +BGD_DECLARE(int) gdImageCompare (gdImagePtr im1, gdImagePtr im2); + +#define GD_CMP_IMAGE 1 /* Actual image IS different */ +#define GD_CMP_NUM_COLORS 2 /* Number of Colours in pallette differ */ +#define GD_CMP_COLOR 4 /* Image colours differ */ +#define GD_CMP_SIZE_X 8 /* Image width differs */ +#define GD_CMP_SIZE_Y 16 /* Image heights differ */ +#define GD_CMP_TRANSPARENT 32 /* Transparent colour */ +#define GD_CMP_BACKGROUND 64 /* Background colour */ +#define GD_CMP_INTERLACE 128 /* Interlaced setting */ +#define GD_CMP_TRUECOLOR 256 /* Truecolor vs palette differs */ + +#define GD_RESOLUTION 96 /* dots per inch */ + +#ifdef __cplusplus +} +#endif + +/* newfangled special effects */ +#include "gdfx.h" + +#endif /* GD_H */ + +#ifdef __cplusplus +} +#endif diff --git a/plugins/snes9x_gx/portlibs/include/gd_io.h b/plugins/snes9x_gx/portlibs/include/gd_io.h new file mode 100644 index 00000000..0f4aefac --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/gd_io.h @@ -0,0 +1,52 @@ +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef GD_IO_H +#define GD_IO_H 1 + +#include <stdio.h> + +#ifdef VMS +# define Putchar gdPutchar +#endif + +typedef struct gdIOCtx +{ + int (*getC)(struct gdIOCtx *); + int (*getBuf)(struct gdIOCtx *, void *, int); + void (*putC)(struct gdIOCtx *, int); + int (*putBuf)(struct gdIOCtx *, const void *, int); + /* seek must return 1 on SUCCESS, 0 on FAILURE. Unlike fseek! */ + int (*seek)(struct gdIOCtx *, const int); + long (*tell)(struct gdIOCtx *); + void (*gd_free)(struct gdIOCtx *); +} +gdIOCtx; + +typedef struct gdIOCtx *gdIOCtxPtr; + +void Putword(int w, gdIOCtx *ctx); +void Putchar(int c, gdIOCtx *ctx); + +void gdPutC(const unsigned char c, gdIOCtx *ctx); +int gdPutBuf(const void *, int, gdIOCtx *); +void gdPutWord(int w, gdIOCtx *ctx); +void gdPutInt(int w, gdIOCtx *ctx); + +int gdGetC(gdIOCtx *ctx); +int gdGetBuf(void *, int, gdIOCtx *); +int gdGetByte(int *result, gdIOCtx *ctx); +int gdGetWord(int *result, gdIOCtx *ctx); +int gdGetWordLSB(signed short int *result, gdIOCtx *ctx); +int gdGetInt(int *result, gdIOCtx *ctx); +int gdGetIntLSB(signed int *result, gdIOCtx *ctx); + +int gdSeek(gdIOCtx *ctx, const int offset); +long gdTell(gdIOCtx *ctx); + +#endif + +#ifdef __cplusplus +} +#endif diff --git a/plugins/snes9x_gx/portlibs/include/gdfx.h b/plugins/snes9x_gx/portlibs/include/gdfx.h new file mode 100644 index 00000000..8b5aa273 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/gdfx.h @@ -0,0 +1,73 @@ +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef GDFX_H +#define GDFX_H 1 + +#include "gd.h" + +/* im MUST be square, but can have any size. Returns a new image + of width and height radius * 2, in which the X axis of + the original has been remapped to theta (angle) and the Y axis + of the original has been remapped to rho (distance from center). + This is known as a "polar coordinate transform." */ + + BGD_DECLARE(gdImagePtr) gdImageSquareToCircle(gdImagePtr im, int radius); + +/* Draws the text 'top' and 'bottom' on 'im', curved along the + edge of a circle of radius 'radius', with its + center at 'cx' and 'cy'. 'top' is written clockwise + along the top; 'bottom' is written counterclockwise + along the bottom. 'textRadius' determines the 'height' + of each character; if 'textRadius' is 1/2 of 'radius', + characters extend halfway from the edge to the center. + 'fillPortion' varies from 0 to 1.0, with useful values + from about 0.4 to 0.9, and determines how much of the + 180 degrees of arc assigned to each section of text + is actually occupied by text; 0.9 looks better than + 1.0 which is rather crowded. 'font' is a freetype + font; see gdImageStringFT. 'points' is passed to the + freetype engine and has an effect on hinting; although + the size of the text is determined by radius, textRadius, + and fillPortion, you should pass a point size that + 'hints' appropriately -- if you know the text will be + large, pass a large point size such as 24.0 to get the + best results. 'fgcolor' can be any color, and may have + an alpha component, do blending, etc. + + Returns 0 on success, or an error string. */ + +BGD_DECLARE(char *) gdImageStringFTCircle( + gdImagePtr im, + int cx, + int cy, + double radius, + double textRadius, + double fillPortion, + char *font, + double points, + char *top, + char *bottom, + int fgcolor); + + /* 2.0.16: + * Sharpen function added on 2003-11-19 + * by Paul Troughton (paul<dot>troughton<at>ieee<dot>org) + * Simple 3x3 convolution kernel + * Makes use of seperability + * Faster, but less flexible, than full-blown unsharp masking + * pct is sharpening percentage, and can be greater than 100 + * Silently does nothing to non-truecolor images + * Silently does nothing for pct<0, as not a useful blurring function + * Leaves transparency/alpha-channel untouched + */ + + BGD_DECLARE(void) gdImageSharpen (gdImagePtr im, int pct); + +#endif /* GDFX_H */ + + +#ifdef __cplusplus +} +#endif diff --git a/plugins/snes9x_gx/portlibs/include/jconfig.h b/plugins/snes9x_gx/portlibs/include/jconfig.h new file mode 100644 index 00000000..ebb280c6 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/jconfig.h @@ -0,0 +1,44 @@ +/* jconfig.h. Generated automatically by configure. */ +/* jconfig.cfg --- source file edited by configure script */ +/* see jconfig.doc for explanations */ + +#define HAVE_PROTOTYPES +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT +#undef void +#undef const +#undef CHAR_IS_UNSIGNED +#define HAVE_STDDEF_H +#define HAVE_STDLIB_H +#undef NEED_BSD_STRINGS +#define NEED_SYS_TYPES_H +#undef NEED_FAR_POINTERS /* DJGPP uses flat 32-bit addressing */ +#undef NEED_SHORT_EXTERNAL_NAMES +/* Define this if you get warnings about undefined structures. */ +#undef INCOMPLETE_TYPES_BROKEN + +#ifdef JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED +#define INLINE __inline__ +/* These are for configuring the JPEG memory manager. */ +#undef DEFAULT_MAX_MEM +#undef NO_MKTEMP + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +#undef TWO_FILE_COMMANDLINE /* optional */ +#undef USE_SETMODE /* Needed to make one-file style work in DJGPP */ +#undef NEED_SIGNAL_CATCHER /* Define this if you use jmemname.c */ +#undef DONT_USE_B_MODE +#undef PROGRESS_REPORT /* optional */ + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/plugins/snes9x_gx/portlibs/include/jerror.h b/plugins/snes9x_gx/portlibs/include/jerror.h new file mode 100644 index 00000000..1cfb2b19 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/jerror.h @@ -0,0 +1,304 @@ +/* + * jerror.h + * + * Copyright (C) 1994-1997, Thomas G. Lane. + * Modified 1997-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file defines the error and message codes for the JPEG library. + * Edit this file to add new codes, or to translate the message strings to + * some other language. + * A set of error-reporting macros are defined too. Some applications using + * the JPEG library may wish to include this file to get the error codes + * and/or the macros. + */ + +/* + * To define the enum list of message codes, include this file without + * defining macro JMESSAGE. To create a message string table, include it + * again with a suitable JMESSAGE definition (see jerror.c for an example). + */ +#ifndef JMESSAGE +#ifndef JERROR_H +/* First time through, define the enum list */ +#define JMAKE_ENUM_LIST +#else +/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */ +#define JMESSAGE(code,string) +#endif /* JERROR_H */ +#endif /* JMESSAGE */ + +#ifdef JMAKE_ENUM_LIST + +typedef enum { + +#define JMESSAGE(code,string) code , + +#endif /* JMAKE_ENUM_LIST */ + +JMESSAGE(JMSG_NOMESSAGE, "Bogus message code %d") /* Must be first entry! */ + +/* For maintenance convenience, list is alphabetical by message code name */ +JMESSAGE(JERR_BAD_ALIGN_TYPE, "ALIGN_TYPE is wrong, please fix") +JMESSAGE(JERR_BAD_ALLOC_CHUNK, "MAX_ALLOC_CHUNK is wrong, please fix") +JMESSAGE(JERR_BAD_BUFFER_MODE, "Bogus buffer control mode") +JMESSAGE(JERR_BAD_COMPONENT_ID, "Invalid component ID %d in SOS") +JMESSAGE(JERR_BAD_CROP_SPEC, "Invalid crop request") +JMESSAGE(JERR_BAD_DCT_COEF, "DCT coefficient out of range") +JMESSAGE(JERR_BAD_DCTSIZE, "DCT scaled block size %dx%d not supported") +JMESSAGE(JERR_BAD_DROP_SAMPLING, + "Component index %d: mismatching sampling ratio %d:%d, %d:%d, %c") +JMESSAGE(JERR_BAD_HUFF_TABLE, "Bogus Huffman table definition") +JMESSAGE(JERR_BAD_IN_COLORSPACE, "Bogus input colorspace") +JMESSAGE(JERR_BAD_J_COLORSPACE, "Bogus JPEG colorspace") +JMESSAGE(JERR_BAD_LENGTH, "Bogus marker length") +JMESSAGE(JERR_BAD_LIB_VERSION, + "Wrong JPEG library version: library is %d, caller expects %d") +JMESSAGE(JERR_BAD_MCU_SIZE, "Sampling factors too large for interleaved scan") +JMESSAGE(JERR_BAD_POOL_ID, "Invalid memory pool code %d") +JMESSAGE(JERR_BAD_PRECISION, "Unsupported JPEG data precision %d") +JMESSAGE(JERR_BAD_PROGRESSION, + "Invalid progressive parameters Ss=%d Se=%d Ah=%d Al=%d") +JMESSAGE(JERR_BAD_PROG_SCRIPT, + "Invalid progressive parameters at scan script entry %d") +JMESSAGE(JERR_BAD_SAMPLING, "Bogus sampling factors") +JMESSAGE(JERR_BAD_SCAN_SCRIPT, "Invalid scan script at entry %d") +JMESSAGE(JERR_BAD_STATE, "Improper call to JPEG library in state %d") +JMESSAGE(JERR_BAD_STRUCT_SIZE, + "JPEG parameter struct mismatch: library thinks size is %u, caller expects %u") +JMESSAGE(JERR_BAD_VIRTUAL_ACCESS, "Bogus virtual array access") +JMESSAGE(JERR_BUFFER_SIZE, "Buffer passed to JPEG library is too small") +JMESSAGE(JERR_CANT_SUSPEND, "Suspension not allowed here") +JMESSAGE(JERR_CCIR601_NOTIMPL, "CCIR601 sampling not implemented yet") +JMESSAGE(JERR_COMPONENT_COUNT, "Too many color components: %d, max %d") +JMESSAGE(JERR_CONVERSION_NOTIMPL, "Unsupported color conversion request") +JMESSAGE(JERR_DAC_INDEX, "Bogus DAC index %d") +JMESSAGE(JERR_DAC_VALUE, "Bogus DAC value 0x%x") +JMESSAGE(JERR_DHT_INDEX, "Bogus DHT index %d") +JMESSAGE(JERR_DQT_INDEX, "Bogus DQT index %d") +JMESSAGE(JERR_EMPTY_IMAGE, "Empty JPEG image (DNL not supported)") +JMESSAGE(JERR_EMS_READ, "Read from EMS failed") +JMESSAGE(JERR_EMS_WRITE, "Write to EMS failed") +JMESSAGE(JERR_EOI_EXPECTED, "Didn't expect more than one scan") +JMESSAGE(JERR_FILE_READ, "Input file read error") +JMESSAGE(JERR_FILE_WRITE, "Output file write error --- out of disk space?") +JMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, "Fractional sampling not implemented yet") +JMESSAGE(JERR_HUFF_CLEN_OVERFLOW, "Huffman code size table overflow") +JMESSAGE(JERR_HUFF_MISSING_CODE, "Missing Huffman code table entry") +JMESSAGE(JERR_IMAGE_TOO_BIG, "Maximum supported image dimension is %u pixels") +JMESSAGE(JERR_INPUT_EMPTY, "Empty input file") +JMESSAGE(JERR_INPUT_EOF, "Premature end of input file") +JMESSAGE(JERR_MISMATCHED_QUANT_TABLE, + "Cannot transcode due to multiple use of quantization table %d") +JMESSAGE(JERR_MISSING_DATA, "Scan script does not transmit all data") +JMESSAGE(JERR_MODE_CHANGE, "Invalid color quantization mode change") +JMESSAGE(JERR_NOTIMPL, "Not implemented yet") +JMESSAGE(JERR_NOT_COMPILED, "Requested feature was omitted at compile time") +JMESSAGE(JERR_NO_ARITH_TABLE, "Arithmetic table 0x%02x was not defined") +JMESSAGE(JERR_NO_BACKING_STORE, "Backing store not supported") +JMESSAGE(JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined") +JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image") +JMESSAGE(JERR_NO_QUANT_TABLE, "Quantization table 0x%02x was not defined") +JMESSAGE(JERR_NO_SOI, "Not a JPEG file: starts with 0x%02x 0x%02x") +JMESSAGE(JERR_OUT_OF_MEMORY, "Insufficient memory (case %d)") +JMESSAGE(JERR_QUANT_COMPONENTS, + "Cannot quantize more than %d color components") +JMESSAGE(JERR_QUANT_FEW_COLORS, "Cannot quantize to fewer than %d colors") +JMESSAGE(JERR_QUANT_MANY_COLORS, "Cannot quantize to more than %d colors") +JMESSAGE(JERR_SOF_DUPLICATE, "Invalid JPEG file structure: two SOF markers") +JMESSAGE(JERR_SOF_NO_SOS, "Invalid JPEG file structure: missing SOS marker") +JMESSAGE(JERR_SOF_UNSUPPORTED, "Unsupported JPEG process: SOF type 0x%02x") +JMESSAGE(JERR_SOI_DUPLICATE, "Invalid JPEG file structure: two SOI markers") +JMESSAGE(JERR_SOS_NO_SOF, "Invalid JPEG file structure: SOS before SOF") +JMESSAGE(JERR_TFILE_CREATE, "Failed to create temporary file %s") +JMESSAGE(JERR_TFILE_READ, "Read failed on temporary file") +JMESSAGE(JERR_TFILE_SEEK, "Seek failed on temporary file") +JMESSAGE(JERR_TFILE_WRITE, + "Write failed on temporary file --- out of disk space?") +JMESSAGE(JERR_TOO_LITTLE_DATA, "Application transferred too few scanlines") +JMESSAGE(JERR_UNKNOWN_MARKER, "Unsupported marker type 0x%02x") +JMESSAGE(JERR_VIRTUAL_BUG, "Virtual array controller messed up") +JMESSAGE(JERR_WIDTH_OVERFLOW, "Image too wide for this implementation") +JMESSAGE(JERR_XMS_READ, "Read from XMS failed") +JMESSAGE(JERR_XMS_WRITE, "Write to XMS failed") +JMESSAGE(JMSG_COPYRIGHT, JCOPYRIGHT) +JMESSAGE(JMSG_VERSION, JVERSION) +JMESSAGE(JTRC_16BIT_TABLES, + "Caution: quantization tables are too coarse for baseline JPEG") +JMESSAGE(JTRC_ADOBE, + "Adobe APP14 marker: version %d, flags 0x%04x 0x%04x, transform %d") +JMESSAGE(JTRC_APP0, "Unknown APP0 marker (not JFIF), length %u") +JMESSAGE(JTRC_APP14, "Unknown APP14 marker (not Adobe), length %u") +JMESSAGE(JTRC_DAC, "Define Arithmetic Table 0x%02x: 0x%02x") +JMESSAGE(JTRC_DHT, "Define Huffman Table 0x%02x") +JMESSAGE(JTRC_DQT, "Define Quantization Table %d precision %d") +JMESSAGE(JTRC_DRI, "Define Restart Interval %u") +JMESSAGE(JTRC_EMS_CLOSE, "Freed EMS handle %u") +JMESSAGE(JTRC_EMS_OPEN, "Obtained EMS handle %u") +JMESSAGE(JTRC_EOI, "End Of Image") +JMESSAGE(JTRC_HUFFBITS, " %3d %3d %3d %3d %3d %3d %3d %3d") +JMESSAGE(JTRC_JFIF, "JFIF APP0 marker: version %d.%02d, density %dx%d %d") +JMESSAGE(JTRC_JFIF_BADTHUMBNAILSIZE, + "Warning: thumbnail image size does not match data length %u") +JMESSAGE(JTRC_JFIF_EXTENSION, + "JFIF extension marker: type 0x%02x, length %u") +JMESSAGE(JTRC_JFIF_THUMBNAIL, " with %d x %d thumbnail image") +JMESSAGE(JTRC_MISC_MARKER, "Miscellaneous marker 0x%02x, length %u") +JMESSAGE(JTRC_PARMLESS_MARKER, "Unexpected marker 0x%02x") +JMESSAGE(JTRC_QUANTVALS, " %4u %4u %4u %4u %4u %4u %4u %4u") +JMESSAGE(JTRC_QUANT_3_NCOLORS, "Quantizing to %d = %d*%d*%d colors") +JMESSAGE(JTRC_QUANT_NCOLORS, "Quantizing to %d colors") +JMESSAGE(JTRC_QUANT_SELECTED, "Selected %d colors for quantization") +JMESSAGE(JTRC_RECOVERY_ACTION, "At marker 0x%02x, recovery action %d") +JMESSAGE(JTRC_RST, "RST%d") +JMESSAGE(JTRC_SMOOTH_NOTIMPL, + "Smoothing not supported with nonstandard sampling ratios") +JMESSAGE(JTRC_SOF, "Start Of Frame 0x%02x: width=%u, height=%u, components=%d") +JMESSAGE(JTRC_SOF_COMPONENT, " Component %d: %dhx%dv q=%d") +JMESSAGE(JTRC_SOI, "Start of Image") +JMESSAGE(JTRC_SOS, "Start Of Scan: %d components") +JMESSAGE(JTRC_SOS_COMPONENT, " Component %d: dc=%d ac=%d") +JMESSAGE(JTRC_SOS_PARAMS, " Ss=%d, Se=%d, Ah=%d, Al=%d") +JMESSAGE(JTRC_TFILE_CLOSE, "Closed temporary file %s") +JMESSAGE(JTRC_TFILE_OPEN, "Opened temporary file %s") +JMESSAGE(JTRC_THUMB_JPEG, + "JFIF extension marker: JPEG-compressed thumbnail image, length %u") +JMESSAGE(JTRC_THUMB_PALETTE, + "JFIF extension marker: palette thumbnail image, length %u") +JMESSAGE(JTRC_THUMB_RGB, + "JFIF extension marker: RGB thumbnail image, length %u") +JMESSAGE(JTRC_UNKNOWN_IDS, + "Unrecognized component IDs %d %d %d, assuming YCbCr") +JMESSAGE(JTRC_XMS_CLOSE, "Freed XMS handle %u") +JMESSAGE(JTRC_XMS_OPEN, "Obtained XMS handle %u") +JMESSAGE(JWRN_ADOBE_XFORM, "Unknown Adobe color transform code %d") +JMESSAGE(JWRN_ARITH_BAD_CODE, "Corrupt JPEG data: bad arithmetic code") +JMESSAGE(JWRN_BOGUS_PROGRESSION, + "Inconsistent progression sequence for component %d coefficient %d") +JMESSAGE(JWRN_EXTRANEOUS_DATA, + "Corrupt JPEG data: %u extraneous bytes before marker 0x%02x") +JMESSAGE(JWRN_HIT_MARKER, "Corrupt JPEG data: premature end of data segment") +JMESSAGE(JWRN_HUFF_BAD_CODE, "Corrupt JPEG data: bad Huffman code") +JMESSAGE(JWRN_JFIF_MAJOR, "Warning: unknown JFIF revision number %d.%02d") +JMESSAGE(JWRN_JPEG_EOF, "Premature end of JPEG file") +JMESSAGE(JWRN_MUST_RESYNC, + "Corrupt JPEG data: found marker 0x%02x instead of RST%d") +JMESSAGE(JWRN_NOT_SEQUENTIAL, "Invalid SOS parameters for sequential JPEG") +JMESSAGE(JWRN_TOO_MUCH_DATA, "Application transferred too many scanlines") + +#ifdef JMAKE_ENUM_LIST + + JMSG_LASTMSGCODE +} J_MESSAGE_CODE; + +#undef JMAKE_ENUM_LIST +#endif /* JMAKE_ENUM_LIST */ + +/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */ +#undef JMESSAGE + + +#ifndef JERROR_H +#define JERROR_H + +/* Macros to simplify using the error and trace message stuff */ +/* The first parameter is either type of cinfo pointer */ + +/* Fatal errors (print message and exit) */ +#define ERREXIT(cinfo,code) \ + ((cinfo)->err->msg_code = (code), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT1(cinfo,code,p1) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT2(cinfo,code,p1,p2) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT3(cinfo,code,p1,p2,p3) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (cinfo)->err->msg_parm.i[2] = (p3), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT4(cinfo,code,p1,p2,p3,p4) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (cinfo)->err->msg_parm.i[2] = (p3), \ + (cinfo)->err->msg_parm.i[3] = (p4), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT6(cinfo,code,p1,p2,p3,p4,p5,p6) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (cinfo)->err->msg_parm.i[2] = (p3), \ + (cinfo)->err->msg_parm.i[3] = (p4), \ + (cinfo)->err->msg_parm.i[4] = (p5), \ + (cinfo)->err->msg_parm.i[5] = (p6), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXITS(cinfo,code,str) \ + ((cinfo)->err->msg_code = (code), \ + strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) + +#define MAKESTMT(stuff) do { stuff } while (0) + +/* Nonfatal errors (we can keep going, but the data is probably corrupt) */ +#define WARNMS(cinfo,code) \ + ((cinfo)->err->msg_code = (code), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) +#define WARNMS1(cinfo,code,p1) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) +#define WARNMS2(cinfo,code,p1,p2) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) + +/* Informational/debugging messages */ +#define TRACEMS(cinfo,lvl,code) \ + ((cinfo)->err->msg_code = (code), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) +#define TRACEMS1(cinfo,lvl,code,p1) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) +#define TRACEMS2(cinfo,lvl,code,p1,p2) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) +#define TRACEMS3(cinfo,lvl,code,p1,p2,p3) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMS4(cinfo,lvl,code,p1,p2,p3,p4) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMS5(cinfo,lvl,code,p1,p2,p3,p4,p5) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ + _mp[4] = (p5); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMS8(cinfo,lvl,code,p1,p2,p3,p4,p5,p6,p7,p8) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ + _mp[4] = (p5); _mp[5] = (p6); _mp[6] = (p7); _mp[7] = (p8); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMSS(cinfo,lvl,code,str) \ + ((cinfo)->err->msg_code = (code), \ + strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) + +#endif /* JERROR_H */ diff --git a/plugins/snes9x_gx/portlibs/include/jmorecfg.h b/plugins/snes9x_gx/portlibs/include/jmorecfg.h new file mode 100644 index 00000000..6c085c36 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/jmorecfg.h @@ -0,0 +1,369 @@ +/* + * jmorecfg.h + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 1997-2011 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains additional configuration options that customize the + * JPEG software for special applications or support machine-dependent + * optimizations. Most users will not need to touch this file. + */ + + +/* + * Define BITS_IN_JSAMPLE as either + * 8 for 8-bit sample values (the usual setting) + * 12 for 12-bit sample values + * Only 8 and 12 are legal data precisions for lossy JPEG according to the + * JPEG standard, and the IJG code does not support anything else! + * We do not support run-time selection of data precision, sorry. + */ + +#define BITS_IN_JSAMPLE 8 /* use 8 or 12 */ + + +/* + * Maximum number of components (color channels) allowed in JPEG image. + * To meet the letter of the JPEG spec, set this to 255. However, darn + * few applications need more than 4 channels (maybe 5 for CMYK + alpha + * mask). We recommend 10 as a reasonable compromise; use 4 if you are + * really short on memory. (Each allowed component costs a hundred or so + * bytes of storage, whether actually used in an image or not.) + */ + +#define MAX_COMPONENTS 10 /* maximum number of image components */ + + +/* + * Basic data types. + * You may need to change these if you have a machine with unusual data + * type sizes; for example, "char" not 8 bits, "short" not 16 bits, + * or "long" not 32 bits. We don't care whether "int" is 16 or 32 bits, + * but it had better be at least 16. + */ + +/* Representation of a single sample (pixel element value). + * We frequently allocate large arrays of these, so it's important to keep + * them small. But if you have memory to burn and access to char or short + * arrays is very slow on your hardware, you might want to change these. + */ + +#if BITS_IN_JSAMPLE == 8 +/* JSAMPLE should be the smallest type that will hold the values 0..255. + * You can use a signed char by having GETJSAMPLE mask it with 0xFF. + */ + +#ifdef HAVE_UNSIGNED_CHAR + +typedef unsigned char JSAMPLE; +#define GETJSAMPLE(value) ((int) (value)) + +#else /* not HAVE_UNSIGNED_CHAR */ + +typedef char JSAMPLE; +#ifdef CHAR_IS_UNSIGNED +#define GETJSAMPLE(value) ((int) (value)) +#else +#define GETJSAMPLE(value) ((int) (value) & 0xFF) +#endif /* CHAR_IS_UNSIGNED */ + +#endif /* HAVE_UNSIGNED_CHAR */ + +#define MAXJSAMPLE 255 +#define CENTERJSAMPLE 128 + +#endif /* BITS_IN_JSAMPLE == 8 */ + + +#if BITS_IN_JSAMPLE == 12 +/* JSAMPLE should be the smallest type that will hold the values 0..4095. + * On nearly all machines "short" will do nicely. + */ + +typedef short JSAMPLE; +#define GETJSAMPLE(value) ((int) (value)) + +#define MAXJSAMPLE 4095 +#define CENTERJSAMPLE 2048 + +#endif /* BITS_IN_JSAMPLE == 12 */ + + +/* Representation of a DCT frequency coefficient. + * This should be a signed value of at least 16 bits; "short" is usually OK. + * Again, we allocate large arrays of these, but you can change to int + * if you have memory to burn and "short" is really slow. + */ + +typedef short JCOEF; + + +/* Compressed datastreams are represented as arrays of JOCTET. + * These must be EXACTLY 8 bits wide, at least once they are written to + * external storage. Note that when using the stdio data source/destination + * managers, this is also the data type passed to fread/fwrite. + */ + +#ifdef HAVE_UNSIGNED_CHAR + +typedef unsigned char JOCTET; +#define GETJOCTET(value) (value) + +#else /* not HAVE_UNSIGNED_CHAR */ + +typedef char JOCTET; +#ifdef CHAR_IS_UNSIGNED +#define GETJOCTET(value) (value) +#else +#define GETJOCTET(value) ((value) & 0xFF) +#endif /* CHAR_IS_UNSIGNED */ + +#endif /* HAVE_UNSIGNED_CHAR */ + + +/* These typedefs are used for various table entries and so forth. + * They must be at least as wide as specified; but making them too big + * won't cost a huge amount of memory, so we don't provide special + * extraction code like we did for JSAMPLE. (In other words, these + * typedefs live at a different point on the speed/space tradeoff curve.) + */ + +/* UINT8 must hold at least the values 0..255. */ + +#ifdef HAVE_UNSIGNED_CHAR +typedef unsigned char UINT8; +#else /* not HAVE_UNSIGNED_CHAR */ +#ifdef CHAR_IS_UNSIGNED +typedef char UINT8; +#else /* not CHAR_IS_UNSIGNED */ +typedef short UINT8; +#endif /* CHAR_IS_UNSIGNED */ +#endif /* HAVE_UNSIGNED_CHAR */ + +/* UINT16 must hold at least the values 0..65535. */ + +#ifdef HAVE_UNSIGNED_SHORT +typedef unsigned short UINT16; +#else /* not HAVE_UNSIGNED_SHORT */ +typedef unsigned int UINT16; +#endif /* HAVE_UNSIGNED_SHORT */ + +/* INT16 must hold at least the values -32768..32767. */ + +#ifndef XMD_H /* X11/xmd.h correctly defines INT16 */ +typedef short INT16; +#endif + +/* INT32 must hold at least signed 32-bit values. */ + +#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */ +#ifndef _BASETSD_H_ /* Microsoft defines it in basetsd.h */ +#ifndef _BASETSD_H /* MinGW is slightly different */ +#ifndef QGLOBAL_H /* Qt defines it in qglobal.h */ +typedef long INT32; +#endif +#endif +#endif +#endif + +/* Datatype used for image dimensions. The JPEG standard only supports + * images up to 64K*64K due to 16-bit fields in SOF markers. Therefore + * "unsigned int" is sufficient on all machines. However, if you need to + * handle larger images and you don't mind deviating from the spec, you + * can change this datatype. + */ + +typedef unsigned int JDIMENSION; + +#define JPEG_MAX_DIMENSION 65500L /* a tad under 64K to prevent overflows */ + + +/* These macros are used in all function definitions and extern declarations. + * You could modify them if you need to change function linkage conventions; + * in particular, you'll need to do that to make the library a Windows DLL. + * Another application is to make all functions global for use with debuggers + * or code profilers that require it. + */ + +/* a function called through method pointers: */ +#define METHODDEF(type) static type +/* a function used only in its module: */ +#define LOCAL(type) static type +/* a function referenced thru EXTERNs: */ +#define GLOBAL(type) type +/* a reference to a GLOBAL function: */ +#define EXTERN(type) extern type + + +/* This macro is used to declare a "method", that is, a function pointer. + * We want to supply prototype parameters if the compiler can cope. + * Note that the arglist parameter must be parenthesized! + * Again, you can customize this if you need special linkage keywords. + */ + +#ifdef HAVE_PROTOTYPES +#define JMETHOD(type,methodname,arglist) type (*methodname) arglist +#else +#define JMETHOD(type,methodname,arglist) type (*methodname) () +#endif + + +/* Here is the pseudo-keyword for declaring pointers that must be "far" + * on 80x86 machines. Most of the specialized coding for 80x86 is handled + * by just saying "FAR *" where such a pointer is needed. In a few places + * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol. + */ + +#ifndef FAR +#ifdef NEED_FAR_POINTERS +#define FAR far +#else +#define FAR +#endif +#endif + + +/* + * On a few systems, type boolean and/or its values FALSE, TRUE may appear + * in standard header files. Or you may have conflicts with application- + * specific header files that you want to include together with these files. + * Defining HAVE_BOOLEAN before including jpeglib.h should make it work. + */ + +#ifndef HAVE_BOOLEAN +typedef int boolean; +#endif +#ifndef FALSE /* in case these macros already exist */ +#define FALSE 0 /* values of boolean */ +#endif +#ifndef TRUE +#define TRUE 1 +#endif + + +/* + * The remaining options affect code selection within the JPEG library, + * but they don't need to be visible to most applications using the library. + * To minimize application namespace pollution, the symbols won't be + * defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined. + */ + +#ifdef JPEG_INTERNALS +#define JPEG_INTERNAL_OPTIONS +#endif + +#ifdef JPEG_INTERNAL_OPTIONS + + +/* + * These defines indicate whether to include various optional functions. + * Undefining some of these symbols will produce a smaller but less capable + * library. Note that you can leave certain source files out of the + * compilation/linking process if you've #undef'd the corresponding symbols. + * (You may HAVE to do that if your compiler doesn't like null source files.) + */ + +/* Capability options common to encoder and decoder: */ + +#define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */ +#define DCT_IFAST_SUPPORTED /* faster, less accurate integer method */ +#define DCT_FLOAT_SUPPORTED /* floating-point: accurate, fast on fast HW */ + +/* Encoder capability options: */ + +#define C_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ +#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ +#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ +#define DCT_SCALING_SUPPORTED /* Input rescaling via DCT? (Requires DCT_ISLOW)*/ +#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */ +/* Note: if you selected 12-bit data precision, it is dangerous to turn off + * ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only good for 8-bit + * precision, so jchuff.c normally uses entropy optimization to compute + * usable tables for higher precision. If you don't want to do optimization, + * you'll have to supply different default Huffman tables. + * The exact same statements apply for progressive JPEG: the default tables + * don't work for progressive mode. (This may get fixed, however.) + */ +#define INPUT_SMOOTHING_SUPPORTED /* Input image smoothing option? */ + +/* Decoder capability options: */ + +#define D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ +#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ +#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ +#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */ +#define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */ +#define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */ +#undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */ +#define UPSAMPLE_MERGING_SUPPORTED /* Fast path for sloppy upsampling? */ +#define QUANT_1PASS_SUPPORTED /* 1-pass color quantization? */ +#define QUANT_2PASS_SUPPORTED /* 2-pass color quantization? */ + +/* more capability options later, no doubt */ + + +/* + * Ordering of RGB data in scanlines passed to or from the application. + * If your application wants to deal with data in the order B,G,R, just + * change these macros. You can also deal with formats such as R,G,B,X + * (one extra byte per pixel) by changing RGB_PIXELSIZE. Note that changing + * the offsets will also change the order in which colormap data is organized. + * RESTRICTIONS: + * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats. + * 2. The color quantizer modules will not behave desirably if RGB_PIXELSIZE + * is not 3 (they don't understand about dummy color components!). So you + * can't use color quantization if you change that value. + */ + +#define RGB_RED 0 /* Offset of Red in an RGB scanline element */ +#define RGB_GREEN 1 /* Offset of Green */ +#define RGB_BLUE 2 /* Offset of Blue */ +#define RGB_PIXELSIZE 3 /* JSAMPLEs per RGB scanline element */ + + +/* Definitions for speed-related optimizations. */ + + +/* If your compiler supports inline functions, define INLINE + * as the inline keyword; otherwise define it as empty. + */ + +#ifndef INLINE +#ifdef __GNUC__ /* for instance, GNU C knows about inline */ +#define INLINE __inline__ +#endif +#ifndef INLINE +#define INLINE /* default is to define it as empty */ +#endif +#endif + + +/* On some machines (notably 68000 series) "int" is 32 bits, but multiplying + * two 16-bit shorts is faster than multiplying two ints. Define MULTIPLIER + * as short on such a machine. MULTIPLIER must be at least 16 bits wide. + */ + +#ifndef MULTIPLIER +#define MULTIPLIER int /* type for fastest integer multiply */ +#endif + + +/* FAST_FLOAT should be either float or double, whichever is done faster + * by your compiler. (Note that this type is only used in the floating point + * DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.) + * Typically, float is faster in ANSI C compilers, while double is faster in + * pre-ANSI compilers (because they insist on converting to double anyway). + * The code below therefore chooses float if we have ANSI-style prototypes. + */ + +#ifndef FAST_FLOAT +#ifdef HAVE_PROTOTYPES +#define FAST_FLOAT float +#else +#define FAST_FLOAT double +#endif +#endif + +#endif /* JPEG_INTERNAL_OPTIONS */ diff --git a/plugins/snes9x_gx/portlibs/include/jpeglib.h b/plugins/snes9x_gx/portlibs/include/jpeglib.h new file mode 100644 index 00000000..1327cffa --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/jpeglib.h @@ -0,0 +1,1160 @@ +/* + * jpeglib.h + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * Modified 2002-2011 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file defines the application interface for the JPEG library. + * Most applications using the library need only include this file, + * and perhaps jerror.h if they want to know the exact error codes. + */ + +#ifndef JPEGLIB_H +#define JPEGLIB_H + +/* + * First we include the configuration files that record how this + * installation of the JPEG library is set up. jconfig.h can be + * generated automatically for many systems. jmorecfg.h contains + * manual configuration options that most people need not worry about. + */ + +#ifndef JCONFIG_INCLUDED /* in case jinclude.h already did */ +#include "jconfig.h" /* widely used configuration options */ +#endif +#include "jmorecfg.h" /* seldom changed options */ + + +#ifdef __cplusplus +#ifndef DONT_USE_EXTERN_C +extern "C" { +#endif +#endif + +/* Version IDs for the JPEG library. + * Might be useful for tests like "#if JPEG_LIB_VERSION >= 80". + */ + +#define JPEG_LIB_VERSION 80 /* Compatibility version 8.0 */ +#define JPEG_LIB_VERSION_MAJOR 8 +#define JPEG_LIB_VERSION_MINOR 4 + + +/* Various constants determining the sizes of things. + * All of these are specified by the JPEG standard, so don't change them + * if you want to be compatible. + */ + +#define DCTSIZE 8 /* The basic DCT block is 8x8 coefficients */ +#define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */ +#define NUM_QUANT_TBLS 4 /* Quantization tables are numbered 0..3 */ +#define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */ +#define NUM_ARITH_TBLS 16 /* Arith-coding tables are numbered 0..15 */ +#define MAX_COMPS_IN_SCAN 4 /* JPEG limit on # of components in one scan */ +#define MAX_SAMP_FACTOR 4 /* JPEG limit on sampling factors */ +/* Unfortunately, some bozo at Adobe saw no reason to be bound by the standard; + * the PostScript DCT filter can emit files with many more than 10 blocks/MCU. + * If you happen to run across such a file, you can up D_MAX_BLOCKS_IN_MCU + * to handle it. We even let you do this from the jconfig.h file. However, + * we strongly discourage changing C_MAX_BLOCKS_IN_MCU; just because Adobe + * sometimes emits noncompliant files doesn't mean you should too. + */ +#define C_MAX_BLOCKS_IN_MCU 10 /* compressor's limit on blocks per MCU */ +#ifndef D_MAX_BLOCKS_IN_MCU +#define D_MAX_BLOCKS_IN_MCU 10 /* decompressor's limit on blocks per MCU */ +#endif + + +/* Data structures for images (arrays of samples and of DCT coefficients). + * On 80x86 machines, the image arrays are too big for near pointers, + * but the pointer arrays can fit in near memory. + */ + +typedef JSAMPLE FAR *JSAMPROW; /* ptr to one image row of pixel samples. */ +typedef JSAMPROW *JSAMPARRAY; /* ptr to some rows (a 2-D sample array) */ +typedef JSAMPARRAY *JSAMPIMAGE; /* a 3-D sample array: top index is color */ + +typedef JCOEF JBLOCK[DCTSIZE2]; /* one block of coefficients */ +typedef JBLOCK FAR *JBLOCKROW; /* pointer to one row of coefficient blocks */ +typedef JBLOCKROW *JBLOCKARRAY; /* a 2-D array of coefficient blocks */ +typedef JBLOCKARRAY *JBLOCKIMAGE; /* a 3-D array of coefficient blocks */ + +typedef JCOEF FAR *JCOEFPTR; /* useful in a couple of places */ + + +/* Types for JPEG compression parameters and working tables. */ + + +/* DCT coefficient quantization tables. */ + +typedef struct { + /* This array gives the coefficient quantizers in natural array order + * (not the zigzag order in which they are stored in a JPEG DQT marker). + * CAUTION: IJG versions prior to v6a kept this array in zigzag order. + */ + UINT16 quantval[DCTSIZE2]; /* quantization step for each coefficient */ + /* This field is used only during compression. It's initialized FALSE when + * the table is created, and set TRUE when it's been output to the file. + * You could suppress output of a table by setting this to TRUE. + * (See jpeg_suppress_tables for an example.) + */ + boolean sent_table; /* TRUE when table has been output */ +} JQUANT_TBL; + + +/* Huffman coding tables. */ + +typedef struct { + /* These two fields directly represent the contents of a JPEG DHT marker */ + UINT8 bits[17]; /* bits[k] = # of symbols with codes of */ + /* length k bits; bits[0] is unused */ + UINT8 huffval[256]; /* The symbols, in order of incr code length */ + /* This field is used only during compression. It's initialized FALSE when + * the table is created, and set TRUE when it's been output to the file. + * You could suppress output of a table by setting this to TRUE. + * (See jpeg_suppress_tables for an example.) + */ + boolean sent_table; /* TRUE when table has been output */ +} JHUFF_TBL; + + +/* Basic info about one component (color channel). */ + +typedef struct { + /* These values are fixed over the whole image. */ + /* For compression, they must be supplied by parameter setup; */ + /* for decompression, they are read from the SOF marker. */ + int component_id; /* identifier for this component (0..255) */ + int component_index; /* its index in SOF or cinfo->comp_info[] */ + int h_samp_factor; /* horizontal sampling factor (1..4) */ + int v_samp_factor; /* vertical sampling factor (1..4) */ + int quant_tbl_no; /* quantization table selector (0..3) */ + /* These values may vary between scans. */ + /* For compression, they must be supplied by parameter setup; */ + /* for decompression, they are read from the SOS marker. */ + /* The decompressor output side may not use these variables. */ + int dc_tbl_no; /* DC entropy table selector (0..3) */ + int ac_tbl_no; /* AC entropy table selector (0..3) */ + + /* Remaining fields should be treated as private by applications. */ + + /* These values are computed during compression or decompression startup: */ + /* Component's size in DCT blocks. + * Any dummy blocks added to complete an MCU are not counted; therefore + * these values do not depend on whether a scan is interleaved or not. + */ + JDIMENSION width_in_blocks; + JDIMENSION height_in_blocks; + /* Size of a DCT block in samples, + * reflecting any scaling we choose to apply during the DCT step. + * Values from 1 to 16 are supported. + * Note that different components may receive different DCT scalings. + */ + int DCT_h_scaled_size; + int DCT_v_scaled_size; + /* The downsampled dimensions are the component's actual, unpadded number + * of samples at the main buffer (preprocessing/compression interface); + * DCT scaling is included, so + * downsampled_width = ceil(image_width * Hi/Hmax * DCT_h_scaled_size/DCTSIZE) + * and similarly for height. + */ + JDIMENSION downsampled_width; /* actual width in samples */ + JDIMENSION downsampled_height; /* actual height in samples */ + /* This flag is used only for decompression. In cases where some of the + * components will be ignored (eg grayscale output from YCbCr image), + * we can skip most computations for the unused components. + */ + boolean component_needed; /* do we need the value of this component? */ + + /* These values are computed before starting a scan of the component. */ + /* The decompressor output side may not use these variables. */ + int MCU_width; /* number of blocks per MCU, horizontally */ + int MCU_height; /* number of blocks per MCU, vertically */ + int MCU_blocks; /* MCU_width * MCU_height */ + int MCU_sample_width; /* MCU width in samples: MCU_width * DCT_h_scaled_size */ + int last_col_width; /* # of non-dummy blocks across in last MCU */ + int last_row_height; /* # of non-dummy blocks down in last MCU */ + + /* Saved quantization table for component; NULL if none yet saved. + * See jdinput.c comments about the need for this information. + * This field is currently used only for decompression. + */ + JQUANT_TBL * quant_table; + + /* Private per-component storage for DCT or IDCT subsystem. */ + void * dct_table; +} jpeg_component_info; + + +/* The script for encoding a multiple-scan file is an array of these: */ + +typedef struct { + int comps_in_scan; /* number of components encoded in this scan */ + int component_index[MAX_COMPS_IN_SCAN]; /* their SOF/comp_info[] indexes */ + int Ss, Se; /* progressive JPEG spectral selection parms */ + int Ah, Al; /* progressive JPEG successive approx. parms */ +} jpeg_scan_info; + +/* The decompressor can save APPn and COM markers in a list of these: */ + +typedef struct jpeg_marker_struct FAR * jpeg_saved_marker_ptr; + +struct jpeg_marker_struct { + jpeg_saved_marker_ptr next; /* next in list, or NULL */ + UINT8 marker; /* marker code: JPEG_COM, or JPEG_APP0+n */ + unsigned int original_length; /* # bytes of data in the file */ + unsigned int data_length; /* # bytes of data saved at data[] */ + JOCTET FAR * data; /* the data contained in the marker */ + /* the marker length word is not counted in data_length or original_length */ +}; + +/* Known color spaces. */ + +typedef enum { + JCS_UNKNOWN, /* error/unspecified */ + JCS_GRAYSCALE, /* monochrome */ + JCS_RGB, /* red/green/blue */ + JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */ + JCS_CMYK, /* C/M/Y/K */ + JCS_YCCK /* Y/Cb/Cr/K */ +} J_COLOR_SPACE; + +/* DCT/IDCT algorithm options. */ + +typedef enum { + JDCT_ISLOW, /* slow but accurate integer algorithm */ + JDCT_IFAST, /* faster, less accurate integer method */ + JDCT_FLOAT /* floating-point: accurate, fast on fast HW */ +} J_DCT_METHOD; + +#ifndef JDCT_DEFAULT /* may be overridden in jconfig.h */ +#define JDCT_DEFAULT JDCT_ISLOW +#endif +#ifndef JDCT_FASTEST /* may be overridden in jconfig.h */ +#define JDCT_FASTEST JDCT_IFAST +#endif + +/* Dithering options for decompression. */ + +typedef enum { + JDITHER_NONE, /* no dithering */ + JDITHER_ORDERED, /* simple ordered dither */ + JDITHER_FS /* Floyd-Steinberg error diffusion dither */ +} J_DITHER_MODE; + + +/* Common fields between JPEG compression and decompression master structs. */ + +#define jpeg_common_fields \ + struct jpeg_error_mgr * err; /* Error handler module */\ + struct jpeg_memory_mgr * mem; /* Memory manager module */\ + struct jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\ + void * client_data; /* Available for use by application */\ + boolean is_decompressor; /* So common code can tell which is which */\ + int global_state /* For checking call sequence validity */ + +/* Routines that are to be used by both halves of the library are declared + * to receive a pointer to this structure. There are no actual instances of + * jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct. + */ +struct jpeg_common_struct { + jpeg_common_fields; /* Fields common to both master struct types */ + /* Additional fields follow in an actual jpeg_compress_struct or + * jpeg_decompress_struct. All three structs must agree on these + * initial fields! (This would be a lot cleaner in C++.) + */ +}; + +typedef struct jpeg_common_struct * j_common_ptr; +typedef struct jpeg_compress_struct * j_compress_ptr; +typedef struct jpeg_decompress_struct * j_decompress_ptr; + + +/* Master record for a compression instance */ + +struct jpeg_compress_struct { + jpeg_common_fields; /* Fields shared with jpeg_decompress_struct */ + + /* Destination for compressed data */ + struct jpeg_destination_mgr * dest; + + /* Description of source image --- these fields must be filled in by + * outer application before starting compression. in_color_space must + * be correct before you can even call jpeg_set_defaults(). + */ + + JDIMENSION image_width; /* input image width */ + JDIMENSION image_height; /* input image height */ + int input_components; /* # of color components in input image */ + J_COLOR_SPACE in_color_space; /* colorspace of input image */ + + double input_gamma; /* image gamma of input image */ + + /* Compression parameters --- these fields must be set before calling + * jpeg_start_compress(). We recommend calling jpeg_set_defaults() to + * initialize everything to reasonable defaults, then changing anything + * the application specifically wants to change. That way you won't get + * burnt when new parameters are added. Also note that there are several + * helper routines to simplify changing parameters. + */ + + unsigned int scale_num, scale_denom; /* fraction by which to scale image */ + + JDIMENSION jpeg_width; /* scaled JPEG image width */ + JDIMENSION jpeg_height; /* scaled JPEG image height */ + /* Dimensions of actual JPEG image that will be written to file, + * derived from input dimensions by scaling factors above. + * These fields are computed by jpeg_start_compress(). + * You can also use jpeg_calc_jpeg_dimensions() to determine these values + * in advance of calling jpeg_start_compress(). + */ + + int data_precision; /* bits of precision in image data */ + + int num_components; /* # of color components in JPEG image */ + J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ + + jpeg_component_info * comp_info; + /* comp_info[i] describes component that appears i'th in SOF */ + + JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; + int q_scale_factor[NUM_QUANT_TBLS]; + /* ptrs to coefficient quantization tables, or NULL if not defined, + * and corresponding scale factors (percentage, initialized 100). + */ + + JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; + JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; + /* ptrs to Huffman coding tables, or NULL if not defined */ + + UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ + UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ + UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ + + int num_scans; /* # of entries in scan_info array */ + const jpeg_scan_info * scan_info; /* script for multi-scan file, or NULL */ + /* The default value of scan_info is NULL, which causes a single-scan + * sequential JPEG file to be emitted. To create a multi-scan file, + * set num_scans and scan_info to point to an array of scan definitions. + */ + + boolean raw_data_in; /* TRUE=caller supplies downsampled data */ + boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ + boolean optimize_coding; /* TRUE=optimize entropy encoding parms */ + boolean CCIR601_sampling; /* TRUE=first samples are cosited */ + boolean do_fancy_downsampling; /* TRUE=apply fancy downsampling */ + int smoothing_factor; /* 1..100, or 0 for no input smoothing */ + J_DCT_METHOD dct_method; /* DCT algorithm selector */ + + /* The restart interval can be specified in absolute MCUs by setting + * restart_interval, or in MCU rows by setting restart_in_rows + * (in which case the correct restart_interval will be figured + * for each scan). + */ + unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */ + int restart_in_rows; /* if > 0, MCU rows per restart interval */ + + /* Parameters controlling emission of special markers. */ + + boolean write_JFIF_header; /* should a JFIF marker be written? */ + UINT8 JFIF_major_version; /* What to write for the JFIF version number */ + UINT8 JFIF_minor_version; + /* These three values are not used by the JPEG code, merely copied */ + /* into the JFIF APP0 marker. density_unit can be 0 for unknown, */ + /* 1 for dots/inch, or 2 for dots/cm. Note that the pixel aspect */ + /* ratio is defined by X_density/Y_density even when density_unit=0. */ + UINT8 density_unit; /* JFIF code for pixel size units */ + UINT16 X_density; /* Horizontal pixel density */ + UINT16 Y_density; /* Vertical pixel density */ + boolean write_Adobe_marker; /* should an Adobe marker be written? */ + + /* State variable: index of next scanline to be written to + * jpeg_write_scanlines(). Application may use this to control its + * processing loop, e.g., "while (next_scanline < image_height)". + */ + + JDIMENSION next_scanline; /* 0 .. image_height-1 */ + + /* Remaining fields are known throughout compressor, but generally + * should not be touched by a surrounding application. + */ + + /* + * These fields are computed during compression startup + */ + boolean progressive_mode; /* TRUE if scan script uses progressive mode */ + int max_h_samp_factor; /* largest h_samp_factor */ + int max_v_samp_factor; /* largest v_samp_factor */ + + int min_DCT_h_scaled_size; /* smallest DCT_h_scaled_size of any component */ + int min_DCT_v_scaled_size; /* smallest DCT_v_scaled_size of any component */ + + JDIMENSION total_iMCU_rows; /* # of iMCU rows to be input to coef ctlr */ + /* The coefficient controller receives data in units of MCU rows as defined + * for fully interleaved scans (whether the JPEG file is interleaved or not). + * There are v_samp_factor * DCTSIZE sample rows of each component in an + * "iMCU" (interleaved MCU) row. + */ + + /* + * These fields are valid during any one scan. + * They describe the components and MCUs actually appearing in the scan. + */ + int comps_in_scan; /* # of JPEG components in this scan */ + jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; + /* *cur_comp_info[i] describes component that appears i'th in SOS */ + + JDIMENSION MCUs_per_row; /* # of MCUs across the image */ + JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ + + int blocks_in_MCU; /* # of DCT blocks per MCU */ + int MCU_membership[C_MAX_BLOCKS_IN_MCU]; + /* MCU_membership[i] is index in cur_comp_info of component owning */ + /* i'th block in an MCU */ + + int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ + + int block_size; /* the basic DCT block size: 1..16 */ + const int * natural_order; /* natural-order position array */ + int lim_Se; /* min( Se, DCTSIZE2-1 ) */ + + /* + * Links to compression subobjects (methods and private variables of modules) + */ + struct jpeg_comp_master * master; + struct jpeg_c_main_controller * main; + struct jpeg_c_prep_controller * prep; + struct jpeg_c_coef_controller * coef; + struct jpeg_marker_writer * marker; + struct jpeg_color_converter * cconvert; + struct jpeg_downsampler * downsample; + struct jpeg_forward_dct * fdct; + struct jpeg_entropy_encoder * entropy; + jpeg_scan_info * script_space; /* workspace for jpeg_simple_progression */ + int script_space_size; +}; + + +/* Master record for a decompression instance */ + +struct jpeg_decompress_struct { + jpeg_common_fields; /* Fields shared with jpeg_compress_struct */ + + /* Source of compressed data */ + struct jpeg_source_mgr * src; + + /* Basic description of image --- filled in by jpeg_read_header(). */ + /* Application may inspect these values to decide how to process image. */ + + JDIMENSION image_width; /* nominal image width (from SOF marker) */ + JDIMENSION image_height; /* nominal image height */ + int num_components; /* # of color components in JPEG image */ + J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ + + /* Decompression processing parameters --- these fields must be set before + * calling jpeg_start_decompress(). Note that jpeg_read_header() initializes + * them to default values. + */ + + J_COLOR_SPACE out_color_space; /* colorspace for output */ + + unsigned int scale_num, scale_denom; /* fraction by which to scale image */ + + double output_gamma; /* image gamma wanted in output */ + + boolean buffered_image; /* TRUE=multiple output passes */ + boolean raw_data_out; /* TRUE=downsampled data wanted */ + + J_DCT_METHOD dct_method; /* IDCT algorithm selector */ + boolean do_fancy_upsampling; /* TRUE=apply fancy upsampling */ + boolean do_block_smoothing; /* TRUE=apply interblock smoothing */ + + boolean quantize_colors; /* TRUE=colormapped output wanted */ + /* the following are ignored if not quantize_colors: */ + J_DITHER_MODE dither_mode; /* type of color dithering to use */ + boolean two_pass_quantize; /* TRUE=use two-pass color quantization */ + int desired_number_of_colors; /* max # colors to use in created colormap */ + /* these are significant only in buffered-image mode: */ + boolean enable_1pass_quant; /* enable future use of 1-pass quantizer */ + boolean enable_external_quant;/* enable future use of external colormap */ + boolean enable_2pass_quant; /* enable future use of 2-pass quantizer */ + + /* Description of actual output image that will be returned to application. + * These fields are computed by jpeg_start_decompress(). + * You can also use jpeg_calc_output_dimensions() to determine these values + * in advance of calling jpeg_start_decompress(). + */ + + JDIMENSION output_width; /* scaled image width */ + JDIMENSION output_height; /* scaled image height */ + int out_color_components; /* # of color components in out_color_space */ + int output_components; /* # of color components returned */ + /* output_components is 1 (a colormap index) when quantizing colors; + * otherwise it equals out_color_components. + */ + int rec_outbuf_height; /* min recommended height of scanline buffer */ + /* If the buffer passed to jpeg_read_scanlines() is less than this many rows + * high, space and time will be wasted due to unnecessary data copying. + * Usually rec_outbuf_height will be 1 or 2, at most 4. + */ + + /* When quantizing colors, the output colormap is described by these fields. + * The application can supply a colormap by setting colormap non-NULL before + * calling jpeg_start_decompress; otherwise a colormap is created during + * jpeg_start_decompress or jpeg_start_output. + * The map has out_color_components rows and actual_number_of_colors columns. + */ + int actual_number_of_colors; /* number of entries in use */ + JSAMPARRAY colormap; /* The color map as a 2-D pixel array */ + + /* State variables: these variables indicate the progress of decompression. + * The application may examine these but must not modify them. + */ + + /* Row index of next scanline to be read from jpeg_read_scanlines(). + * Application may use this to control its processing loop, e.g., + * "while (output_scanline < output_height)". + */ + JDIMENSION output_scanline; /* 0 .. output_height-1 */ + + /* Current input scan number and number of iMCU rows completed in scan. + * These indicate the progress of the decompressor input side. + */ + int input_scan_number; /* Number of SOS markers seen so far */ + JDIMENSION input_iMCU_row; /* Number of iMCU rows completed */ + + /* The "output scan number" is the notional scan being displayed by the + * output side. The decompressor will not allow output scan/row number + * to get ahead of input scan/row, but it can fall arbitrarily far behind. + */ + int output_scan_number; /* Nominal scan number being displayed */ + JDIMENSION output_iMCU_row; /* Number of iMCU rows read */ + + /* Current progression status. coef_bits[c][i] indicates the precision + * with which component c's DCT coefficient i (in zigzag order) is known. + * It is -1 when no data has yet been received, otherwise it is the point + * transform (shift) value for the most recent scan of the coefficient + * (thus, 0 at completion of the progression). + * This pointer is NULL when reading a non-progressive file. + */ + int (*coef_bits)[DCTSIZE2]; /* -1 or current Al value for each coef */ + + /* Internal JPEG parameters --- the application usually need not look at + * these fields. Note that the decompressor output side may not use + * any parameters that can change between scans. + */ + + /* Quantization and Huffman tables are carried forward across input + * datastreams when processing abbreviated JPEG datastreams. + */ + + JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; + /* ptrs to coefficient quantization tables, or NULL if not defined */ + + JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; + JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; + /* ptrs to Huffman coding tables, or NULL if not defined */ + + /* These parameters are never carried across datastreams, since they + * are given in SOF/SOS markers or defined to be reset by SOI. + */ + + int data_precision; /* bits of precision in image data */ + + jpeg_component_info * comp_info; + /* comp_info[i] describes component that appears i'th in SOF */ + + boolean is_baseline; /* TRUE if Baseline SOF0 encountered */ + boolean progressive_mode; /* TRUE if SOFn specifies progressive mode */ + boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ + + UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ + UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ + UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ + + unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */ + + /* These fields record data obtained from optional markers recognized by + * the JPEG library. + */ + boolean saw_JFIF_marker; /* TRUE iff a JFIF APP0 marker was found */ + /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */ + UINT8 JFIF_major_version; /* JFIF version number */ + UINT8 JFIF_minor_version; + UINT8 density_unit; /* JFIF code for pixel size units */ + UINT16 X_density; /* Horizontal pixel density */ + UINT16 Y_density; /* Vertical pixel density */ + boolean saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */ + UINT8 Adobe_transform; /* Color transform code from Adobe marker */ + + boolean CCIR601_sampling; /* TRUE=first samples are cosited */ + + /* Aside from the specific data retained from APPn markers known to the + * library, the uninterpreted contents of any or all APPn and COM markers + * can be saved in a list for examination by the application. + */ + jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */ + + /* Remaining fields are known throughout decompressor, but generally + * should not be touched by a surrounding application. + */ + + /* + * These fields are computed during decompression startup + */ + int max_h_samp_factor; /* largest h_samp_factor */ + int max_v_samp_factor; /* largest v_samp_factor */ + + int min_DCT_h_scaled_size; /* smallest DCT_h_scaled_size of any component */ + int min_DCT_v_scaled_size; /* smallest DCT_v_scaled_size of any component */ + + JDIMENSION total_iMCU_rows; /* # of iMCU rows in image */ + /* The coefficient controller's input and output progress is measured in + * units of "iMCU" (interleaved MCU) rows. These are the same as MCU rows + * in fully interleaved JPEG scans, but are used whether the scan is + * interleaved or not. We define an iMCU row as v_samp_factor DCT block + * rows of each component. Therefore, the IDCT output contains + * v_samp_factor*DCT_v_scaled_size sample rows of a component per iMCU row. + */ + + JSAMPLE * sample_range_limit; /* table for fast range-limiting */ + + /* + * These fields are valid during any one scan. + * They describe the components and MCUs actually appearing in the scan. + * Note that the decompressor output side must not use these fields. + */ + int comps_in_scan; /* # of JPEG components in this scan */ + jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; + /* *cur_comp_info[i] describes component that appears i'th in SOS */ + + JDIMENSION MCUs_per_row; /* # of MCUs across the image */ + JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ + + int blocks_in_MCU; /* # of DCT blocks per MCU */ + int MCU_membership[D_MAX_BLOCKS_IN_MCU]; + /* MCU_membership[i] is index in cur_comp_info of component owning */ + /* i'th block in an MCU */ + + int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ + + /* These fields are derived from Se of first SOS marker. + */ + int block_size; /* the basic DCT block size: 1..16 */ + const int * natural_order; /* natural-order position array for entropy decode */ + int lim_Se; /* min( Se, DCTSIZE2-1 ) for entropy decode */ + + /* This field is shared between entropy decoder and marker parser. + * It is either zero or the code of a JPEG marker that has been + * read from the data source, but has not yet been processed. + */ + int unread_marker; + + /* + * Links to decompression subobjects (methods, private variables of modules) + */ + struct jpeg_decomp_master * master; + struct jpeg_d_main_controller * main; + struct jpeg_d_coef_controller * coef; + struct jpeg_d_post_controller * post; + struct jpeg_input_controller * inputctl; + struct jpeg_marker_reader * marker; + struct jpeg_entropy_decoder * entropy; + struct jpeg_inverse_dct * idct; + struct jpeg_upsampler * upsample; + struct jpeg_color_deconverter * cconvert; + struct jpeg_color_quantizer * cquantize; +}; + + +/* "Object" declarations for JPEG modules that may be supplied or called + * directly by the surrounding application. + * As with all objects in the JPEG library, these structs only define the + * publicly visible methods and state variables of a module. Additional + * private fields may exist after the public ones. + */ + + +/* Error handler object */ + +struct jpeg_error_mgr { + /* Error exit handler: does not return to caller */ + JMETHOD(void, error_exit, (j_common_ptr cinfo)); + /* Conditionally emit a trace or warning message */ + JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level)); + /* Routine that actually outputs a trace or error message */ + JMETHOD(void, output_message, (j_common_ptr cinfo)); + /* Format a message string for the most recent JPEG error or message */ + JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer)); +#define JMSG_LENGTH_MAX 200 /* recommended size of format_message buffer */ + /* Reset error state variables at start of a new image */ + JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo)); + + /* The message ID code and any parameters are saved here. + * A message can have one string parameter or up to 8 int parameters. + */ + int msg_code; +#define JMSG_STR_PARM_MAX 80 + union { + int i[8]; + char s[JMSG_STR_PARM_MAX]; + } msg_parm; + + /* Standard state variables for error facility */ + + int trace_level; /* max msg_level that will be displayed */ + + /* For recoverable corrupt-data errors, we emit a warning message, + * but keep going unless emit_message chooses to abort. emit_message + * should count warnings in num_warnings. The surrounding application + * can check for bad data by seeing if num_warnings is nonzero at the + * end of processing. + */ + long num_warnings; /* number of corrupt-data warnings */ + + /* These fields point to the table(s) of error message strings. + * An application can change the table pointer to switch to a different + * message list (typically, to change the language in which errors are + * reported). Some applications may wish to add additional error codes + * that will be handled by the JPEG library error mechanism; the second + * table pointer is used for this purpose. + * + * First table includes all errors generated by JPEG library itself. + * Error code 0 is reserved for a "no such error string" message. + */ + const char * const * jpeg_message_table; /* Library errors */ + int last_jpeg_message; /* Table contains strings 0..last_jpeg_message */ + /* Second table can be added by application (see cjpeg/djpeg for example). + * It contains strings numbered first_addon_message..last_addon_message. + */ + const char * const * addon_message_table; /* Non-library errors */ + int first_addon_message; /* code for first string in addon table */ + int last_addon_message; /* code for last string in addon table */ +}; + + +/* Progress monitor object */ + +struct jpeg_progress_mgr { + JMETHOD(void, progress_monitor, (j_common_ptr cinfo)); + + long pass_counter; /* work units completed in this pass */ + long pass_limit; /* total number of work units in this pass */ + int completed_passes; /* passes completed so far */ + int total_passes; /* total number of passes expected */ +}; + + +/* Data destination object for compression */ + +struct jpeg_destination_mgr { + JOCTET * next_output_byte; /* => next byte to write in buffer */ + size_t free_in_buffer; /* # of byte spaces remaining in buffer */ + + JMETHOD(void, init_destination, (j_compress_ptr cinfo)); + JMETHOD(boolean, empty_output_buffer, (j_compress_ptr cinfo)); + JMETHOD(void, term_destination, (j_compress_ptr cinfo)); +}; + + +/* Data source object for decompression */ + +struct jpeg_source_mgr { + const JOCTET * next_input_byte; /* => next byte to read from buffer */ + size_t bytes_in_buffer; /* # of bytes remaining in buffer */ + + JMETHOD(void, init_source, (j_decompress_ptr cinfo)); + JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo)); + JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes)); + JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired)); + JMETHOD(void, term_source, (j_decompress_ptr cinfo)); +}; + + +/* Memory manager object. + * Allocates "small" objects (a few K total), "large" objects (tens of K), + * and "really big" objects (virtual arrays with backing store if needed). + * The memory manager does not allow individual objects to be freed; rather, + * each created object is assigned to a pool, and whole pools can be freed + * at once. This is faster and more convenient than remembering exactly what + * to free, especially where malloc()/free() are not too speedy. + * NB: alloc routines never return NULL. They exit to error_exit if not + * successful. + */ + +#define JPOOL_PERMANENT 0 /* lasts until master record is destroyed */ +#define JPOOL_IMAGE 1 /* lasts until done with image/datastream */ +#define JPOOL_NUMPOOLS 2 + +typedef struct jvirt_sarray_control * jvirt_sarray_ptr; +typedef struct jvirt_barray_control * jvirt_barray_ptr; + + +struct jpeg_memory_mgr { + /* Method pointers */ + JMETHOD(void *, alloc_small, (j_common_ptr cinfo, int pool_id, + size_t sizeofobject)); + JMETHOD(void FAR *, alloc_large, (j_common_ptr cinfo, int pool_id, + size_t sizeofobject)); + JMETHOD(JSAMPARRAY, alloc_sarray, (j_common_ptr cinfo, int pool_id, + JDIMENSION samplesperrow, + JDIMENSION numrows)); + JMETHOD(JBLOCKARRAY, alloc_barray, (j_common_ptr cinfo, int pool_id, + JDIMENSION blocksperrow, + JDIMENSION numrows)); + JMETHOD(jvirt_sarray_ptr, request_virt_sarray, (j_common_ptr cinfo, + int pool_id, + boolean pre_zero, + JDIMENSION samplesperrow, + JDIMENSION numrows, + JDIMENSION maxaccess)); + JMETHOD(jvirt_barray_ptr, request_virt_barray, (j_common_ptr cinfo, + int pool_id, + boolean pre_zero, + JDIMENSION blocksperrow, + JDIMENSION numrows, + JDIMENSION maxaccess)); + JMETHOD(void, realize_virt_arrays, (j_common_ptr cinfo)); + JMETHOD(JSAMPARRAY, access_virt_sarray, (j_common_ptr cinfo, + jvirt_sarray_ptr ptr, + JDIMENSION start_row, + JDIMENSION num_rows, + boolean writable)); + JMETHOD(JBLOCKARRAY, access_virt_barray, (j_common_ptr cinfo, + jvirt_barray_ptr ptr, + JDIMENSION start_row, + JDIMENSION num_rows, + boolean writable)); + JMETHOD(void, free_pool, (j_common_ptr cinfo, int pool_id)); + JMETHOD(void, self_destruct, (j_common_ptr cinfo)); + + /* Limit on memory allocation for this JPEG object. (Note that this is + * merely advisory, not a guaranteed maximum; it only affects the space + * used for virtual-array buffers.) May be changed by outer application + * after creating the JPEG object. + */ + long max_memory_to_use; + + /* Maximum allocation request accepted by alloc_large. */ + long max_alloc_chunk; +}; + + +/* Routine signature for application-supplied marker processing methods. + * Need not pass marker code since it is stored in cinfo->unread_marker. + */ +typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo)); + + +/* Declarations for routines called by application. + * The JPP macro hides prototype parameters from compilers that can't cope. + * Note JPP requires double parentheses. + */ + +#ifdef HAVE_PROTOTYPES +#define JPP(arglist) arglist +#else +#define JPP(arglist) () +#endif + + +/* Short forms of external names for systems with brain-damaged linkers. + * We shorten external names to be unique in the first six letters, which + * is good enough for all known systems. + * (If your compiler itself needs names to be unique in less than 15 + * characters, you are out of luck. Get a better compiler.) + */ + +#ifdef NEED_SHORT_EXTERNAL_NAMES +#define jpeg_std_error jStdError +#define jpeg_CreateCompress jCreaCompress +#define jpeg_CreateDecompress jCreaDecompress +#define jpeg_destroy_compress jDestCompress +#define jpeg_destroy_decompress jDestDecompress +#define jpeg_stdio_dest jStdDest +#define jpeg_stdio_src jStdSrc +#define jpeg_mem_dest jMemDest +#define jpeg_mem_src jMemSrc +#define jpeg_set_defaults jSetDefaults +#define jpeg_set_colorspace jSetColorspace +#define jpeg_default_colorspace jDefColorspace +#define jpeg_set_quality jSetQuality +#define jpeg_set_linear_quality jSetLQuality +#define jpeg_default_qtables jDefQTables +#define jpeg_add_quant_table jAddQuantTable +#define jpeg_quality_scaling jQualityScaling +#define jpeg_simple_progression jSimProgress +#define jpeg_suppress_tables jSuppressTables +#define jpeg_alloc_quant_table jAlcQTable +#define jpeg_alloc_huff_table jAlcHTable +#define jpeg_start_compress jStrtCompress +#define jpeg_write_scanlines jWrtScanlines +#define jpeg_finish_compress jFinCompress +#define jpeg_calc_jpeg_dimensions jCjpegDimensions +#define jpeg_write_raw_data jWrtRawData +#define jpeg_write_marker jWrtMarker +#define jpeg_write_m_header jWrtMHeader +#define jpeg_write_m_byte jWrtMByte +#define jpeg_write_tables jWrtTables +#define jpeg_read_header jReadHeader +#define jpeg_start_decompress jStrtDecompress +#define jpeg_read_scanlines jReadScanlines +#define jpeg_finish_decompress jFinDecompress +#define jpeg_read_raw_data jReadRawData +#define jpeg_has_multiple_scans jHasMultScn +#define jpeg_start_output jStrtOutput +#define jpeg_finish_output jFinOutput +#define jpeg_input_complete jInComplete +#define jpeg_new_colormap jNewCMap +#define jpeg_consume_input jConsumeInput +#define jpeg_core_output_dimensions jCoreDimensions +#define jpeg_calc_output_dimensions jCalcDimensions +#define jpeg_save_markers jSaveMarkers +#define jpeg_set_marker_processor jSetMarker +#define jpeg_read_coefficients jReadCoefs +#define jpeg_write_coefficients jWrtCoefs +#define jpeg_copy_critical_parameters jCopyCrit +#define jpeg_abort_compress jAbrtCompress +#define jpeg_abort_decompress jAbrtDecompress +#define jpeg_abort jAbort +#define jpeg_destroy jDestroy +#define jpeg_resync_to_restart jResyncRestart +#endif /* NEED_SHORT_EXTERNAL_NAMES */ + + +/* Default error-management setup */ +EXTERN(struct jpeg_error_mgr *) jpeg_std_error + JPP((struct jpeg_error_mgr * err)); + +/* Initialization of JPEG compression objects. + * jpeg_create_compress() and jpeg_create_decompress() are the exported + * names that applications should call. These expand to calls on + * jpeg_CreateCompress and jpeg_CreateDecompress with additional information + * passed for version mismatch checking. + * NB: you must set up the error-manager BEFORE calling jpeg_create_xxx. + */ +#define jpeg_create_compress(cinfo) \ + jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \ + (size_t) sizeof(struct jpeg_compress_struct)) +#define jpeg_create_decompress(cinfo) \ + jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \ + (size_t) sizeof(struct jpeg_decompress_struct)) +EXTERN(void) jpeg_CreateCompress JPP((j_compress_ptr cinfo, + int version, size_t structsize)); +EXTERN(void) jpeg_CreateDecompress JPP((j_decompress_ptr cinfo, + int version, size_t structsize)); +/* Destruction of JPEG compression objects */ +EXTERN(void) jpeg_destroy_compress JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo)); + +/* Standard data source and destination managers: stdio streams. */ +/* Caller is responsible for opening the file before and closing after. */ +EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile)); +EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile)); + +/* Data source and destination managers: memory buffers. */ +EXTERN(void) jpeg_mem_dest JPP((j_compress_ptr cinfo, + unsigned char ** outbuffer, + unsigned long * outsize)); +EXTERN(void) jpeg_mem_src JPP((j_decompress_ptr cinfo, + unsigned char * inbuffer, + unsigned long insize)); + +/* Default parameter setup for compression */ +EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo)); +/* Compression parameter setup aids */ +EXTERN(void) jpeg_set_colorspace JPP((j_compress_ptr cinfo, + J_COLOR_SPACE colorspace)); +EXTERN(void) jpeg_default_colorspace JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality, + boolean force_baseline)); +EXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo, + int scale_factor, + boolean force_baseline)); +EXTERN(void) jpeg_default_qtables JPP((j_compress_ptr cinfo, + boolean force_baseline)); +EXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl, + const unsigned int *basic_table, + int scale_factor, + boolean force_baseline)); +EXTERN(int) jpeg_quality_scaling JPP((int quality)); +EXTERN(void) jpeg_simple_progression JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo, + boolean suppress)); +EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo)); +EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo)); + +/* Main entry points for compression */ +EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo, + boolean write_all_tables)); +EXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo, + JSAMPARRAY scanlines, + JDIMENSION num_lines)); +EXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo)); + +/* Precalculate JPEG dimensions for current compression parameters. */ +EXTERN(void) jpeg_calc_jpeg_dimensions JPP((j_compress_ptr cinfo)); + +/* Replaces jpeg_write_scanlines when writing raw downsampled data. */ +EXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo, + JSAMPIMAGE data, + JDIMENSION num_lines)); + +/* Write a special marker. See libjpeg.txt concerning safe usage. */ +EXTERN(void) jpeg_write_marker + JPP((j_compress_ptr cinfo, int marker, + const JOCTET * dataptr, unsigned int datalen)); +/* Same, but piecemeal. */ +EXTERN(void) jpeg_write_m_header + JPP((j_compress_ptr cinfo, int marker, unsigned int datalen)); +EXTERN(void) jpeg_write_m_byte + JPP((j_compress_ptr cinfo, int val)); + +/* Alternate compression function: just write an abbreviated table file */ +EXTERN(void) jpeg_write_tables JPP((j_compress_ptr cinfo)); + +/* Decompression startup: read start of JPEG datastream to see what's there */ +EXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo, + boolean require_image)); +/* Return value is one of: */ +#define JPEG_SUSPENDED 0 /* Suspended due to lack of input data */ +#define JPEG_HEADER_OK 1 /* Found valid image datastream */ +#define JPEG_HEADER_TABLES_ONLY 2 /* Found valid table-specs-only datastream */ +/* If you pass require_image = TRUE (normal case), you need not check for + * a TABLES_ONLY return code; an abbreviated file will cause an error exit. + * JPEG_SUSPENDED is only possible if you use a data source module that can + * give a suspension return (the stdio source module doesn't). + */ + +/* Main entry points for decompression */ +EXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo)); +EXTERN(JDIMENSION) jpeg_read_scanlines JPP((j_decompress_ptr cinfo, + JSAMPARRAY scanlines, + JDIMENSION max_lines)); +EXTERN(boolean) jpeg_finish_decompress JPP((j_decompress_ptr cinfo)); + +/* Replaces jpeg_read_scanlines when reading raw downsampled data. */ +EXTERN(JDIMENSION) jpeg_read_raw_data JPP((j_decompress_ptr cinfo, + JSAMPIMAGE data, + JDIMENSION max_lines)); + +/* Additional entry points for buffered-image mode. */ +EXTERN(boolean) jpeg_has_multiple_scans JPP((j_decompress_ptr cinfo)); +EXTERN(boolean) jpeg_start_output JPP((j_decompress_ptr cinfo, + int scan_number)); +EXTERN(boolean) jpeg_finish_output JPP((j_decompress_ptr cinfo)); +EXTERN(boolean) jpeg_input_complete JPP((j_decompress_ptr cinfo)); +EXTERN(void) jpeg_new_colormap JPP((j_decompress_ptr cinfo)); +EXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo)); +/* Return value is one of: */ +/* #define JPEG_SUSPENDED 0 Suspended due to lack of input data */ +#define JPEG_REACHED_SOS 1 /* Reached start of new scan */ +#define JPEG_REACHED_EOI 2 /* Reached end of image */ +#define JPEG_ROW_COMPLETED 3 /* Completed one iMCU row */ +#define JPEG_SCAN_COMPLETED 4 /* Completed last iMCU row of a scan */ + +/* Precalculate output dimensions for current decompression parameters. */ +EXTERN(void) jpeg_core_output_dimensions JPP((j_decompress_ptr cinfo)); +EXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo)); + +/* Control saving of COM and APPn markers into marker_list. */ +EXTERN(void) jpeg_save_markers + JPP((j_decompress_ptr cinfo, int marker_code, + unsigned int length_limit)); + +/* Install a special processing method for COM or APPn markers. */ +EXTERN(void) jpeg_set_marker_processor + JPP((j_decompress_ptr cinfo, int marker_code, + jpeg_marker_parser_method routine)); + +/* Read or write raw DCT coefficients --- useful for lossless transcoding. */ +EXTERN(jvirt_barray_ptr *) jpeg_read_coefficients JPP((j_decompress_ptr cinfo)); +EXTERN(void) jpeg_write_coefficients JPP((j_compress_ptr cinfo, + jvirt_barray_ptr * coef_arrays)); +EXTERN(void) jpeg_copy_critical_parameters JPP((j_decompress_ptr srcinfo, + j_compress_ptr dstinfo)); + +/* If you choose to abort compression or decompression before completing + * jpeg_finish_(de)compress, then you need to clean up to release memory, + * temporary files, etc. You can just call jpeg_destroy_(de)compress + * if you're done with the JPEG object, but if you want to clean it up and + * reuse it, call this: + */ +EXTERN(void) jpeg_abort_compress JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_abort_decompress JPP((j_decompress_ptr cinfo)); + +/* Generic versions of jpeg_abort and jpeg_destroy that work on either + * flavor of JPEG object. These may be more convenient in some places. + */ +EXTERN(void) jpeg_abort JPP((j_common_ptr cinfo)); +EXTERN(void) jpeg_destroy JPP((j_common_ptr cinfo)); + +/* Default restart-marker-resync procedure for use by data source modules */ +EXTERN(boolean) jpeg_resync_to_restart JPP((j_decompress_ptr cinfo, + int desired)); + + +/* These marker codes are exported since applications and data source modules + * are likely to want to use them. + */ + +#define JPEG_RST0 0xD0 /* RST0 marker code */ +#define JPEG_EOI 0xD9 /* EOI marker code */ +#define JPEG_APP0 0xE0 /* APP0 marker code */ +#define JPEG_COM 0xFE /* COM marker code */ + + +/* If we have a brain-damaged compiler that emits warnings (or worse, errors) + * for structure definitions that are never filled in, keep it quiet by + * supplying dummy definitions for the various substructures. + */ + +#ifdef INCOMPLETE_TYPES_BROKEN +#ifndef JPEG_INTERNALS /* will be defined in jpegint.h */ +struct jvirt_sarray_control { long dummy; }; +struct jvirt_barray_control { long dummy; }; +struct jpeg_comp_master { long dummy; }; +struct jpeg_c_main_controller { long dummy; }; +struct jpeg_c_prep_controller { long dummy; }; +struct jpeg_c_coef_controller { long dummy; }; +struct jpeg_marker_writer { long dummy; }; +struct jpeg_color_converter { long dummy; }; +struct jpeg_downsampler { long dummy; }; +struct jpeg_forward_dct { long dummy; }; +struct jpeg_entropy_encoder { long dummy; }; +struct jpeg_decomp_master { long dummy; }; +struct jpeg_d_main_controller { long dummy; }; +struct jpeg_d_coef_controller { long dummy; }; +struct jpeg_d_post_controller { long dummy; }; +struct jpeg_input_controller { long dummy; }; +struct jpeg_marker_reader { long dummy; }; +struct jpeg_entropy_decoder { long dummy; }; +struct jpeg_inverse_dct { long dummy; }; +struct jpeg_upsampler { long dummy; }; +struct jpeg_color_deconverter { long dummy; }; +struct jpeg_color_quantizer { long dummy; }; +#endif /* JPEG_INTERNALS */ +#endif /* INCOMPLETE_TYPES_BROKEN */ + + +/* + * The JPEG library modules define JPEG_INTERNALS before including this file. + * The internal structure declarations are read only when that is true. + * Applications using the library should not include jpegint.h, but may wish + * to include jerror.h. + */ + +#ifdef JPEG_INTERNALS +#include "jpegint.h" /* fetch private declarations */ +#include "jerror.h" /* fetch error codes too */ +#endif + +#ifdef __cplusplus +#ifndef DONT_USE_EXTERN_C +} +#endif +#endif + +#endif /* JPEGLIB_H */ diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/archive.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/archive.hpp new file mode 100644 index 00000000..fa1bf359 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/archive.hpp @@ -0,0 +1,126 @@ +#ifndef _RAR_ARCHIVE_ +#define _RAR_ARCHIVE_ + +class Pack; + +enum {EN_LOCK=1,EN_VOL=2,EN_FIRSTVOL=4}; + +class Archive:public File +{ + private: + bool IsSignature(byte *D); + void UpdateLatestTime(FileHeader *CurBlock); + void ConvertNameCase(char *Name); + void ConvertNameCase(wchar *Name); + void ConvertUnknownHeader(); + size_t ReadOldHeader(); + void UnexpEndArcMsg(); + +#if !defined(SHELL_EXT) && !defined(NOCRYPT) + CryptData HeadersCrypt; + byte HeadersSalt[SALT_SIZE]; +#endif +#ifndef SHELL_EXT + ComprDataIO SubDataIO; + byte SubDataSalt[SALT_SIZE]; +#endif + RAROptions *Cmd,DummyCmd; + + MarkHeader MarkHead; + OldMainHeader OldMhd; + + int RecoverySectors; + int64 RecoveryPos; + + RarTime LatestTime; + int LastReadBlock; + int CurHeaderType; + + bool SilentOpen; + public: + Archive(RAROptions *InitCmd=NULL); + bool IsArchive(bool EnableBroken); + size_t SearchBlock(int BlockType); + size_t SearchSubBlock(const char *Type); + int ReadBlock(int BlockType); + void WriteBlock(int BlockType,BaseBlock *wb=NULL); + int PrepareNamesToWrite(char *Name,wchar *NameW,char *DestName,byte *DestNameW); + void SetLhdSize(); + size_t ReadHeader(); + void CheckArc(bool EnableBroken); + void CheckOpen(char *Name,wchar *NameW=NULL); + bool WCheckOpen(char *Name,wchar *NameW=NULL); + bool TestLock(int Mode); + void MakeTemp(); + void CopyMainHeader(Archive &Src,bool CopySFX=true,char *NameToDisplay=NULL); + bool ProcessToFileHead(Archive &Src,bool LastBlockAdded, + Pack *Pack=NULL,const char *SkipName=NULL); + void TmpToArc(Archive &Src); + void CloseNew(int AdjustRecovery,bool CloseVolume); + void WriteEndBlock(bool CloseVolume); + void CopyFileRecord(Archive &Src); + void CopyArchiveData(Archive &Src); + bool GetComment(Array<byte> *CmtData,Array<wchar> *CmtDataW); + void ViewComment(); + void ViewFileComment(); + void SetLatestTime(RarTime *NewTime); + void SeekToNext(); + bool CheckAccess(); + bool IsArcDir(); + bool IsArcLabel(); + void ConvertAttributes(); + int GetRecoverySize(bool Required); + void VolSubtractHeaderSize(size_t SubSize); + void AddSubData(byte *SrcData,size_t DataSize,File *SrcFile,const char *Name,bool AllowSplit); + bool ReadSubData(Array<byte> *UnpData,File *DestFile); + int GetHeaderType() {return(CurHeaderType);}; + size_t ReadCommentData(Array<byte> *CmtData,Array<wchar> *CmtDataW); + void WriteCommentData(byte *Data,size_t DataSize,bool FileComment); + RAROptions* GetRAROptions() {return(Cmd);} + void SetSilentOpen(bool Mode) {SilentOpen=Mode;} + + BaseBlock ShortBlock; + MainHeader NewMhd; + FileHeader NewLhd; + EndArcHeader EndArcHead; + SubBlockHeader SubBlockHead; + FileHeader SubHead; + CommentHeader CommHead; + ProtectHeader ProtectHead; + AVHeader AVHead; + SignHeader SignHead; + UnixOwnersHeader UOHead; + MacFInfoHeader MACHead; + EAHeader EAHead; + StreamHeader StreamHead; + + int64 CurBlockPos; + int64 NextBlockPos; + + bool OldFormat; + bool Solid; + bool Volume; + bool MainComment; + bool Locked; + bool Signed; + bool NotFirstVolume; + bool Protected; + bool Encrypted; + size_t SFXSize; + bool BrokenFileHeader; + + bool Splitting; + + ushort HeaderCRC; + + int64 VolWrite; + int64 AddingFilesSize; + size_t AddingHeadersSize; + + bool NewArchive; + + char FirstVolumeName[NM]; + wchar FirstVolumeNameW[NM]; +}; + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/array.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/array.hpp new file mode 100644 index 00000000..c67817a3 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/array.hpp @@ -0,0 +1,122 @@ +#ifndef _RAR_ARRAY_ +#define _RAR_ARRAY_ + +extern ErrorHandler ErrHandler; + +template <class T> class Array +{ + private: + T *Buffer; + size_t BufSize; + size_t AllocSize; + public: + Array(); + Array(size_t Size); + ~Array(); + inline void CleanData(); + inline T& operator [](size_t Item); + inline size_t Size(); + void Add(size_t Items); + void Alloc(size_t Items); + void Reset(); + void operator = (Array<T> &Src); + void Push(T Item); + T* Addr() {return(Buffer);} +}; + +template <class T> void Array<T>::CleanData() +{ + Buffer=NULL; + BufSize=0; + AllocSize=0; +} + + +template <class T> Array<T>::Array() +{ + CleanData(); +} + + +template <class T> Array<T>::Array(size_t Size) +{ + Buffer=(T *)rarmalloc(sizeof(T)*Size); + if (Buffer==NULL && Size!=0) + ErrHandler.MemoryError(); + + AllocSize=BufSize=Size; +} + + +template <class T> Array<T>::~Array() +{ + if (Buffer!=NULL) + rarfree(Buffer); +} + + +template <class T> inline T& Array<T>::operator [](size_t Item) +{ + return(Buffer[Item]); +} + + +template <class T> inline size_t Array<T>::Size() +{ + return(BufSize); +} + + +template <class T> void Array<T>::Add(size_t Items) +{ + BufSize+=Items; + if (BufSize>AllocSize) + { + size_t Suggested=AllocSize+AllocSize/4+32; + size_t NewSize=Max(BufSize,Suggested); + + Buffer=(T *)rarrealloc(Buffer,NewSize*sizeof(T)); + if (Buffer==NULL) + ErrHandler.MemoryError(); + AllocSize=NewSize; + } +} + + +template <class T> void Array<T>::Alloc(size_t Items) +{ + if (Items>AllocSize) + Add(Items-BufSize); + else + BufSize=Items; +} + + +template <class T> void Array<T>::Reset() +{ + if (Buffer!=NULL) + { + rarfree(Buffer); + Buffer=NULL; + } + BufSize=0; + AllocSize=0; +} + + +template <class T> void Array<T>::operator =(Array<T> &Src) +{ + Reset(); + Alloc(Src.BufSize); + if (Src.BufSize!=0) + memcpy((void *)Buffer,(void *)Src.Buffer,Src.BufSize*sizeof(T)); +} + + +template <class T> void Array<T>::Push(T Item) +{ + Add(1); + (*this)[Size()-1]=Item; +} + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/cmddata.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/cmddata.hpp new file mode 100644 index 00000000..8219c52f --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/cmddata.hpp @@ -0,0 +1,57 @@ +#ifndef _RAR_CMDDATA_ +#define _RAR_CMDDATA_ + +#define DefaultStoreList "7z;ace;arj;bz2;cab;gz;jpeg;jpg;lha;lzh;mp3;rar;taz;tgz;z;zip" + +class CommandData:public RAROptions +{ + private: + void ProcessSwitchesString(char *Str); + void ProcessSwitch(char *Switch,wchar *SwitchW=NULL); + void BadSwitch(char *Switch); + bool ExclCheckArgs(StringList *Args,char *CheckName,bool CheckFullPath,int MatchMode); + uint GetExclAttr(char *Str); + + bool FileLists; + bool NoMoreSwitches; + bool BareOutput; + public: + CommandData(); + ~CommandData(); + void Init(); + void Close(); + void ParseArg(char *Arg,wchar *ArgW); + void ParseDone(); + void ParseEnvVar(); + void ReadConfig(int argc,char *argv[]); + bool IsConfigEnabled(int argc,char *argv[]); + void OutTitle(); + void OutHelp(); + bool IsSwitch(int Ch); + bool ExclCheck(char *CheckName,bool CheckFullPath,bool CheckInclList); + bool StoreCheck(char *CheckName); + bool TimeCheck(RarTime &ft); + bool SizeCheck(int64 Size); + bool AnyFiltersActive(); + int IsProcessFile(FileHeader &NewLhd,bool *ExactMatch=NULL,int MatchType=MATCH_WILDSUBPATH); + void ProcessCommand(); + void AddArcName(char *Name,wchar *NameW); + bool GetArcName(char *Name,wchar *NameW,int MaxSize); + bool CheckWinSize(); + + int GetRecoverySize(char *Str,int DefSize); + + char Command[NM+16]; + wchar CommandW[NM+16]; + + char ArcName[NM]; + wchar ArcNameW[NM]; + + StringList *FileArgs; + StringList *ExclArgs; + StringList *InclArgs; + StringList *ArcNames; + StringList *StoreArgs; +}; + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/coder.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/coder.hpp new file mode 100644 index 00000000..f09f911c --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/coder.hpp @@ -0,0 +1,24 @@ +/**************************************************************************** + * Contents: 'Carryless rangecoder' by Dmitry Subbotin * + ****************************************************************************/ + +const uint TOP=1 << 24, BOT=1 << 15; + +class RangeCoder +{ + public: + void InitDecoder(Unpack *UnpackRead); + inline int GetCurrentCount(); + inline uint GetCurrentShiftCount(uint SHIFT); + inline void Decode(); + inline void PutChar(unsigned int c); + inline unsigned int GetChar(); + + uint low, code, range; + struct SUBRANGE + { + uint LowCount, HighCount, scale; + } SubRange; + + Unpack *UnpackRead; +}; diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/compress.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/compress.hpp new file mode 100644 index 00000000..3181e45d --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/compress.hpp @@ -0,0 +1,36 @@ +#ifndef _RAR_COMPRESS_ +#define _RAR_COMPRESS_ + +class ComprDataIO; +class PackingFileTable; + +#define CODEBUFSIZE 0x4000 +#define MAXWINSIZE 0x400000 +#define MAXWINMASK (MAXWINSIZE-1) + +#define LOW_DIST_REP_COUNT 16 + +#define NC 299 /* alphabet = {0, 1, 2, ..., NC - 1} */ +#define DC 60 +#define LDC 17 +#define RC 28 +#define HUFF_TABLE_SIZE (NC+DC+RC+LDC) +#define BC 20 + +#define NC20 298 /* alphabet = {0, 1, 2, ..., NC - 1} */ +#define DC20 48 +#define RC20 28 +#define BC20 19 +#define MC20 257 + +enum {CODE_HUFFMAN,CODE_LZ,CODE_LZ2,CODE_REPEATLZ,CODE_CACHELZ, + CODE_STARTFILE,CODE_ENDFILE,CODE_VM,CODE_VMDATA}; + + +enum FilterType { + FILTER_NONE, FILTER_PPM /*dummy*/, FILTER_E8, FILTER_E8E9, + FILTER_UPCASETOLOW, FILTER_AUDIO, FILTER_RGB, FILTER_DELTA, + FILTER_ITANIUM, FILTER_E8E9V2 +}; + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/consio.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/consio.hpp new file mode 100644 index 00000000..74433d0c --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/consio.hpp @@ -0,0 +1,46 @@ +#ifndef _RAR_CONSIO_ +#define _RAR_CONSIO_ + +#if !defined(SILENT) && !defined(SFX_MODULE) +enum {SOUND_OK,SOUND_ALARM,SOUND_ERROR,SOUND_QUESTION}; +#endif + +enum PASSWORD_TYPE {PASSWORD_GLOBAL,PASSWORD_FILE,PASSWORD_ARCHIVE}; + +void InitConsoleOptions(MESSAGE_TYPE MsgStream,bool Sound); + +#ifndef SILENT +void mprintf(const char *fmt,...); +void eprintf(const char *fmt,...); +void Alarm(); +void GetPasswordText(char *Str,int MaxLength); +bool GetPassword(PASSWORD_TYPE Type,const char *FileName,char *Password,int MaxLength); +int Ask(const char *AskStr); +#endif + +void OutComment(char *Comment,size_t Size); + +#ifdef SILENT +#ifdef __GNUC__ + #define mprintf(args...) + #define eprintf(args...) +#else + #ifdef _MSC_VER + inline void mprintf(const char *fmt,...) {} + #else + inline void mprintf(const char *fmt,const char *a=NULL,const char *b=NULL) {} + #endif + inline void eprintf(const char *fmt,const char *a=NULL,const char *b=NULL) {} + inline void mprintf(const char *fmt,int b) {} + inline void eprintf(const char *fmt,int b) {} + inline void mprintf(const char *fmt,const char *a,int b) {} + inline void eprintf(const char *fmt,const char *a,int b) {} +#endif +inline void Alarm() {} +inline void GetPasswordText(char *Str,int MaxLength) {} +inline unsigned int GetKey() {return(0);} +inline bool GetPassword(PASSWORD_TYPE Type,const char *FileName,char *Password,int MaxLength) {return(false);} +inline int Ask(const char *AskStr) {return(0);} +#endif + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/crc.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/crc.hpp new file mode 100644 index 00000000..a632a541 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/crc.hpp @@ -0,0 +1,10 @@ +#ifndef _RAR_CRC_ +#define _RAR_CRC_ + +extern uint CRCTab[256]; + +void InitCRC(); +uint CRC(uint StartCRC,const void *Addr,size_t Size); +ushort OldCRC(ushort StartCRC,const void *Addr,size_t Size); + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/crypt.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/crypt.hpp new file mode 100644 index 00000000..b16e650c --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/crypt.hpp @@ -0,0 +1,62 @@ +#ifndef _RAR_CRYPT_ +#define _RAR_CRYPT_ + +enum { OLD_DECODE=0,OLD_ENCODE=1,NEW_CRYPT=2 }; + + +struct CryptKeyCacheItem +{ +#ifndef _SFX_RTL_ + CryptKeyCacheItem() + { + *Password=0; + } + + ~CryptKeyCacheItem() + { + memset(AESKey,0,sizeof(AESKey)); + memset(AESInit,0,sizeof(AESInit)); + memset(Password,0,sizeof(Password)); + } +#endif + byte AESKey[16],AESInit[16]; + char Password[MAXPASSWORD]; + bool SaltPresent; + byte Salt[SALT_SIZE]; + bool HandsOffHash; +}; + +class CryptData +{ + private: + void Encode13(byte *Data,uint Count); + void Decode13(byte *Data,uint Count); + void Crypt15(byte *Data,uint Count); + void UpdKeys(byte *Buf); + void Swap(byte *Ch1,byte *Ch2); + void SetOldKeys(const char *Password); + + Rijndael rin; + + byte SubstTable[256]; + uint Key[4]; + ushort OldKey[4]; + byte PN1,PN2,PN3; + + byte AESKey[16],AESInit[16]; + + static CryptKeyCacheItem Cache[4]; + static int CachePos; + public: + void SetCryptKeys(const char *Password,const byte *Salt,bool Encrypt,bool OldOnly,bool HandsOffHash); + void SetAV15Encryption(); + void SetCmt13Encryption(); + void EncryptBlock20(byte *Buf); + void DecryptBlock20(byte *Buf); + void EncryptBlock(byte *Buf,size_t Size); + void DecryptBlock(byte *Buf,size_t Size); + void Crypt(byte *Data,uint Count,int Method); + static void SetSalt(byte *Salt,int SaltSize); +}; + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/dll.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/dll.hpp new file mode 100644 index 00000000..4582f2c6 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/dll.hpp @@ -0,0 +1,140 @@ +#ifndef _UNRAR_DLL_ +#define _UNRAR_DLL_ + +#define ERAR_END_ARCHIVE 10 +#define ERAR_NO_MEMORY 11 +#define ERAR_BAD_DATA 12 +#define ERAR_BAD_ARCHIVE 13 +#define ERAR_UNKNOWN_FORMAT 14 +#define ERAR_EOPEN 15 +#define ERAR_ECREATE 16 +#define ERAR_ECLOSE 17 +#define ERAR_EREAD 18 +#define ERAR_EWRITE 19 +#define ERAR_SMALL_BUF 20 +#define ERAR_UNKNOWN 21 +#define ERAR_MISSING_PASSWORD 22 + +#define RAR_OM_LIST 0 +#define RAR_OM_EXTRACT 1 +#define RAR_OM_LIST_INCSPLIT 2 + +#define RAR_SKIP 0 +#define RAR_TEST 1 +#define RAR_EXTRACT 2 + +#define RAR_VOL_ASK 0 +#define RAR_VOL_NOTIFY 1 + +#define RAR_DLL_VERSION 4 + +#ifdef _UNIX +#define CALLBACK +#define PASCAL +#define LONG long +#define HANDLE void * +#define LPARAM long +#define UINT unsigned int +#endif + +struct RARHeaderData +{ + char ArcName[260]; + char FileName[260]; + unsigned int Flags; + unsigned int PackSize; + unsigned int UnpSize; + unsigned int HostOS; + unsigned int FileCRC; + unsigned int FileTime; + unsigned int UnpVer; + unsigned int Method; + unsigned int FileAttr; + char *CmtBuf; + unsigned int CmtBufSize; + unsigned int CmtSize; + unsigned int CmtState; +}; + + +struct RARHeaderDataEx +{ + char ArcName[1024]; + wchar_t ArcNameW[1024]; + char FileName[1024]; + wchar_t FileNameW[1024]; + unsigned int Flags; + unsigned int PackSize; + unsigned int PackSizeHigh; + unsigned int UnpSize; + unsigned int UnpSizeHigh; + unsigned int HostOS; + unsigned int FileCRC; + unsigned int FileTime; + unsigned int UnpVer; + unsigned int Method; + unsigned int FileAttr; + char *CmtBuf; + unsigned int CmtBufSize; + unsigned int CmtSize; + unsigned int CmtState; + unsigned int Reserved[1024]; +}; + + +struct RAROpenArchiveData +{ + char *ArcName; + unsigned int OpenMode; + unsigned int OpenResult; + char *CmtBuf; + unsigned int CmtBufSize; + unsigned int CmtSize; + unsigned int CmtState; +}; + +struct RAROpenArchiveDataEx +{ + char *ArcName; + wchar_t *ArcNameW; + unsigned int OpenMode; + unsigned int OpenResult; + char *CmtBuf; + unsigned int CmtBufSize; + unsigned int CmtSize; + unsigned int CmtState; + unsigned int Flags; + unsigned int Reserved[32]; +}; + +enum UNRARCALLBACK_MESSAGES { + UCM_CHANGEVOLUME,UCM_PROCESSDATA,UCM_NEEDPASSWORD +}; + +typedef int (CALLBACK *UNRARCALLBACK)(UINT msg,LPARAM UserData,LPARAM P1,LPARAM P2); + +typedef int (PASCAL *CHANGEVOLPROC)(char *ArcName,int Mode); +typedef int (PASCAL *PROCESSDATAPROC)(unsigned char *Addr,int Size); + +#ifdef __cplusplus +extern "C" { +#endif + +HANDLE PASCAL RAROpenArchive(struct RAROpenArchiveData *ArchiveData); +HANDLE PASCAL RAROpenArchiveEx(struct RAROpenArchiveDataEx *ArchiveData); +int PASCAL RARCloseArchive(HANDLE hArcData); +int PASCAL RARReadHeader(HANDLE hArcData,struct RARHeaderData *HeaderData); +int PASCAL RARReadHeaderEx(HANDLE hArcData,struct RARHeaderDataEx *HeaderData); +int PASCAL RARProcessFile(HANDLE hArcData,int Operation,char *DestPath,char *DestName); +int PASCAL RARProcessFileW(HANDLE hArcData,int Operation,wchar_t *DestPath,wchar_t *DestName); +void PASCAL RARSetCallback(HANDLE hArcData,UNRARCALLBACK Callback,LPARAM UserData); +void PASCAL RARSetChangeVolProc(HANDLE hArcData,CHANGEVOLPROC ChangeVolProc); +void PASCAL RARSetProcessDataProc(HANDLE hArcData,PROCESSDATAPROC ProcessDataProc); +void PASCAL RARSetPassword(HANDLE hArcData,char *Password); +int PASCAL RARGetDllVersion(); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/encname.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/encname.hpp new file mode 100644 index 00000000..3e7786f5 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/encname.hpp @@ -0,0 +1,20 @@ +#ifndef _RAR_ENCNAME_ +#define _RAR_ENCNAME_ + +class EncodeFileName +{ + private: + void AddFlags(int Value); + + byte *EncName; + byte Flags; + uint FlagBits; + size_t FlagsPos; + size_t DestSize; + public: + EncodeFileName(); + size_t Encode(char *Name,wchar *NameW,byte *EncName); + void Decode(char *Name,byte *EncName,size_t EncSize,wchar *NameW,size_t MaxDecSize); +}; + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/errhnd.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/errhnd.hpp new file mode 100644 index 00000000..28e9843f --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/errhnd.hpp @@ -0,0 +1,63 @@ +#ifndef _RAR_ERRHANDLER_ +#define _RAR_ERRHANDLER_ + +#if (defined(GUI) || !defined(_WIN_32)) && !defined(SFX_MODULE) && !defined(_WIN_CE) || defined(RARDLL) +#define ALLOW_EXCEPTIONS +#endif + + + +#define rarmalloc malloc +#define rarcalloc calloc +#define rarrealloc realloc +#define rarfree free +#define rarstrdup strdup +#define rarstrdupw strdupw + + + +enum { SUCCESS,WARNING,FATAL_ERROR,CRC_ERROR,LOCK_ERROR,WRITE_ERROR, + OPEN_ERROR,USER_ERROR,MEMORY_ERROR,CREATE_ERROR,USER_BREAK=255}; + +class ErrorHandler +{ + private: + void ErrMsg(const char *ArcName,const char *fmt,...); + + int ExitCode; + int ErrCount; + bool EnableBreak; + bool Silent; + bool DoShutdown; + public: + ErrorHandler(); + void Clean(); + void MemoryError(); + void OpenError(const char *FileName); + void CloseError(const char *FileName); + void ReadError(const char *FileName); + bool AskRepeatRead(const char *FileName); + void WriteError(const char *ArcName,const char *FileName); + void WriteErrorFAT(const char *FileName); + bool AskRepeatWrite(const char *FileName,bool DiskFull); + void SeekError(const char *FileName); + void GeneralErrMsg(const char *Msg); + void MemoryErrorMsg(); + void OpenErrorMsg(const char *FileName); + void OpenErrorMsg(const char *ArcName,const char *FileName); + void CreateErrorMsg(const char *FileName); + void CreateErrorMsg(const char *ArcName,const char *FileName); + void ReadErrorMsg(const char *ArcName,const char *FileName); + void WriteErrorMsg(const char *ArcName,const char *FileName); + void Exit(int ExitCode); + void SetErrorCode(int Code); + int GetErrorCode() {return(ExitCode);} + int GetErrorCount() {return(ErrCount);} + void SetSignalHandlers(bool Enable); + void Throw(int Code); + void SetSilent(bool Mode) {Silent=Mode;}; + void SetShutdown(bool Mode) {DoShutdown=Mode;}; + void SysErrMsg(); +}; + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/extinfo.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/extinfo.hpp new file mode 100644 index 00000000..db7cea53 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/extinfo.hpp @@ -0,0 +1,8 @@ +#ifndef _RAR_EXTINFO_ +#define _RAR_EXTINFO_ + + +void SetExtraInfo(CommandData *Cmd,Archive &Arc,char *Name,wchar *NameW); +void SetExtraInfoNew(CommandData *Cmd,Archive &Arc,char *Name,wchar *NameW); + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/extract.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/extract.hpp new file mode 100644 index 00000000..40f9cc0a --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/extract.hpp @@ -0,0 +1,43 @@ +#ifndef _RAR_EXTRACT_ +#define _RAR_EXTRACT_ + +enum EXTRACT_ARC_CODE {EXTRACT_ARC_NEXT,EXTRACT_ARC_REPEAT}; + +class CmdExtract +{ + private: + EXTRACT_ARC_CODE ExtractArchive(CommandData *Cmd); + RarTime StartTime; // time when extraction started + + ComprDataIO DataIO; + Unpack *Unp; + unsigned long TotalFileCount; + + unsigned long FileCount; + unsigned long MatchedArgs; + bool FirstFile; + bool AllMatchesExact; + bool ReconstructDone; + + char ArcName[NM]; + wchar ArcNameW[NM]; + + char Password[MAXPASSWORD]; + bool PasswordAll; + bool PrevExtracted; + char DestFileName[NM]; + wchar DestFileNameW[NM]; + bool PasswordCancelled; + public: + CmdExtract(); + ~CmdExtract(); + void DoExtract(CommandData *Cmd); + void ExtractArchiveInit(CommandData *Cmd,Archive &Arc); + bool ExtractCurrentFile(CommandData *Cmd,Archive &Arc,size_t HeaderSize, + bool &Repeat); + static void UnstoreFile(ComprDataIO &DataIO,int64 DestUnpSize); + + bool SignatureFound; +}; + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/filcreat.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/filcreat.hpp new file mode 100644 index 00000000..5c8e8f54 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/filcreat.hpp @@ -0,0 +1,13 @@ +#ifndef _RAR_FILECREATE_ +#define _RAR_FILECREATE_ + +bool FileCreate(RAROptions *Cmd,File *NewFile,char *Name,wchar *NameW, + OVERWRITE_MODE Mode,bool *UserReject,int64 FileSize=INT64NDF, + uint FileTime=0); +bool GetAutoRenamedName(char *Name); + +#if defined(_WIN_32) && !defined(_WIN_CE) +bool UpdateExistingShortName(char *Name,wchar *NameW); +#endif + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/file.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/file.hpp new file mode 100644 index 00000000..3e17ae99 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/file.hpp @@ -0,0 +1,98 @@ +#ifndef _RAR_FILE_ +#define _RAR_FILE_ + +#ifdef _WIN_32 +typedef HANDLE FileHandle; +#define BAD_HANDLE INVALID_HANDLE_VALUE +#else +typedef FILE* FileHandle; +#define BAD_HANDLE NULL +#endif + +class RAROptions; + +enum FILE_HANDLETYPE {FILE_HANDLENORMAL,FILE_HANDLESTD,FILE_HANDLEERR}; + +enum FILE_ERRORTYPE {FILE_SUCCESS,FILE_NOTFOUND,FILE_READERROR}; + +struct FileStat +{ + uint FileAttr; + uint FileTime; + int64 FileSize; + bool IsDir; +}; + + +class File +{ + private: + void AddFileToList(FileHandle hFile); + + FileHandle hFile; + bool LastWrite; + FILE_HANDLETYPE HandleType; + bool SkipClose; + bool IgnoreReadErrors; + bool NewFile; + bool AllowDelete; + bool AllowExceptions; +#ifdef _WIN_32 + bool NoSequentialRead; +#endif + protected: + bool OpenShared; + public: + char FileName[NM]; + wchar FileNameW[NM]; + + FILE_ERRORTYPE ErrorType; + + uint CloseCount; + public: + File(); + virtual ~File(); + void operator = (File &SrcFile); + bool Open(const char *Name,const wchar *NameW=NULL,bool OpenShared=false,bool Update=false); + void TOpen(const char *Name,const wchar *NameW=NULL); + bool WOpen(const char *Name,const wchar *NameW=NULL); + bool Create(const char *Name,const wchar *NameW=NULL,bool ShareRead=true); + void TCreate(const char *Name,const wchar *NameW=NULL,bool ShareRead=true); + bool WCreate(const char *Name,const wchar *NameW=NULL,bool ShareRead=true); + bool Close(); + void Flush(); + bool Delete(); + bool Rename(const char *NewName,const wchar *NewNameW=NULL); + void Write(const void *Data,size_t Size); + int Read(void *Data,size_t Size); + int DirectRead(void *Data,size_t Size); + void Seek(int64 Offset,int Method); + bool RawSeek(int64 Offset,int Method); + int64 Tell(); + void Prealloc(int64 Size); + byte GetByte(); + void PutByte(byte Byte); + bool Truncate(); + void SetOpenFileTime(RarTime *ftm,RarTime *ftc=NULL,RarTime *fta=NULL); + void SetCloseFileTime(RarTime *ftm,RarTime *fta=NULL); + static void SetCloseFileTimeByName(const char *Name,RarTime *ftm,RarTime *fta); + void GetOpenFileTime(RarTime *ft); + bool IsOpened() {return(hFile!=BAD_HANDLE);}; + int64 FileLength(); + void SetHandleType(FILE_HANDLETYPE Type); + FILE_HANDLETYPE GetHandleType() {return(HandleType);}; + bool IsDevice(); + void fprintf(const char *fmt,...); + static bool RemoveCreated(); + FileHandle GetHandle() {return(hFile);}; + void SetIgnoreReadErrors(bool Mode) {IgnoreReadErrors=Mode;}; + char *GetName() {return(FileName);} + int64 Copy(File &Dest,int64 Length=INT64NDF); + void SetAllowDelete(bool Allow) {AllowDelete=Allow;} + void SetExceptions(bool Allow) {AllowExceptions=Allow;} +#ifdef _WIN_32 + void RemoveSequentialFlag() {NoSequentialRead=true;} +#endif +}; + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/filefn.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/filefn.hpp new file mode 100644 index 00000000..77df8479 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/filefn.hpp @@ -0,0 +1,44 @@ +#ifndef _RAR_FILEFN_ +#define _RAR_FILEFN_ + +enum MKDIR_CODE {MKDIR_SUCCESS,MKDIR_ERROR,MKDIR_BADPATH}; + +MKDIR_CODE MakeDir(const char *Name,const wchar *NameW,bool SetAttr,uint Attr); +bool CreatePath(const char *Path,const wchar *PathW,bool SkipLastName); +void SetDirTime(const char *Name,const wchar *NameW,RarTime *ftm,RarTime *ftc,RarTime *fta); +bool IsRemovable(const char *Name); +int64 GetFreeDisk(const char *Name); +bool FileExist(const char *Name,const wchar *NameW=NULL); +bool WildFileExist(const char *Name,const wchar *NameW=NULL); +bool IsDir(uint Attr); +bool IsUnreadable(uint Attr); +bool IsLabel(uint Attr); +bool IsLink(uint Attr); +void SetSFXMode(const char *FileName); +void EraseDiskContents(const char *FileName); +bool IsDeleteAllowed(uint FileAttr); +void PrepareToDelete(const char *Name,const wchar *NameW=NULL); +uint GetFileAttr(const char *Name,const wchar *NameW=NULL); +bool SetFileAttr(const char *Name,const wchar *NameW,uint Attr); +void ConvertNameToFull(const char *Src,char *Dest); +void ConvertNameToFull(const wchar *Src,wchar *Dest); +char* MkTemp(char *Name); + + +enum CALCCRC_SHOWMODE {CALCCRC_SHOWNONE,CALCCRC_SHOWTEXT,CALCCRC_SHOWALL}; +uint CalcFileCRC(File *SrcFile,int64 Size=INT64NDF,CALCCRC_SHOWMODE ShowMode=CALCCRC_SHOWNONE); + +bool RenameFile(const char *SrcName,const wchar *SrcNameW,const char *DestName,const wchar *DestNameW); +bool DelFile(const char *Name); +bool DelFile(const char *Name,const wchar *NameW); +bool DelDir(const char *Name); +bool DelDir(const char *Name,const wchar *NameW); + +#if defined(_WIN_32) && !defined(_WIN_CE) +bool SetFileCompression(char *Name,wchar *NameW,bool State); +#endif + + + + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/filestr.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/filestr.hpp new file mode 100644 index 00000000..5b2b15db --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/filestr.hpp @@ -0,0 +1,9 @@ +#ifndef _RAR_FILESTR_ +#define _RAR_FILESTR_ + +bool ReadTextFile(const char *Name,StringList *List,bool Config, + bool AbortOnError=false,RAR_CHARSET SrcCharset=RCH_DEFAULT, + bool Unquote=false,bool SkipComments=false, + bool ExpandEnvStr=false); + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/find.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/find.hpp new file mode 100644 index 00000000..99e804a7 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/find.hpp @@ -0,0 +1,53 @@ +#ifndef _RAR_FINDDATA_ +#define _RAR_FINDDATA_ + +enum FINDDATA_FLAGS { + FDDF_SECONDDIR=1 // Second encounter of same directory in SCAN_GETDIRSTWICE ScanTree mode +}; + +struct FindData +{ + char Name[NM]; + wchar NameW[NM]; + int64 Size; + uint FileAttr; + uint FileTime; + bool IsDir; + RarTime mtime; + RarTime ctime; + RarTime atime; +#ifdef _WIN_32 + char ShortName[NM]; + FILETIME ftCreationTime; + FILETIME ftLastAccessTime; + FILETIME ftLastWriteTime; +#endif + uint Flags; + bool Error; +}; + +class FindFile +{ + private: +#ifdef _WIN_32 + static HANDLE Win32Find(HANDLE hFind,const char *Mask,const wchar *MaskW,struct FindData *fd); +#endif + + char FindMask[NM]; + wchar FindMaskW[NM]; + bool FirstCall; +#ifdef _WIN_32 + HANDLE hFind; +#else + DIR *dirp; +#endif + public: + FindFile(); + ~FindFile(); + void SetMask(const char *FindMask); + void SetMaskW(const wchar *FindMaskW); + bool Next(struct FindData *fd,bool GetSymLink=false); + static bool FastFind(const char *FindMask,const wchar *FindMaskW,struct FindData *fd,bool GetSymLink=false); +}; + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/getbits.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/getbits.hpp new file mode 100644 index 00000000..d44fb9f0 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/getbits.hpp @@ -0,0 +1,51 @@ +#ifndef _RAR_GETBITS_ +#define _RAR_GETBITS_ + +class BitInput +{ + public: + enum BufferSize {MAX_SIZE=0x8000}; // Size of input buffer. + protected: + int InAddr; // Curent byte position in the buffer. + int InBit; // Current bit position in the current byte. + public: + BitInput(); + ~BitInput(); + + byte *InBuf; // Dynamically allocated input buffer. + + void InitBitInput() + { + InAddr=InBit=0; + } + + // Move forward by 'Bits' bits. + void addbits(uint Bits) + { + Bits+=InBit; + InAddr+=Bits>>3; + InBit=Bits&7; + } + + // Return 16 bits from current position in the buffer. + // Bit at (InAddr,InBit) has the highest position in returning data. + uint getbits() + { + uint BitField=(uint)InBuf[InAddr] << 16; + BitField|=(uint)InBuf[InAddr+1] << 8; + BitField|=(uint)InBuf[InAddr+2]; + BitField >>= (8-InBit); + return(BitField & 0xffff); + } + + void faddbits(uint Bits); + uint fgetbits(); + + // Check if buffer has enough space for IncPtr bytes. Returns 'true' + // if buffer will be overflown. + bool Overflow(uint IncPtr) + { + return(InAddr+IncPtr>=MAX_SIZE); + } +}; +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/global.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/global.hpp new file mode 100644 index 00000000..35c6cf91 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/global.hpp @@ -0,0 +1,14 @@ +#ifndef _RAR_GLOBAL_ +#define _RAR_GLOBAL_ + +#ifdef INCLUDEGLOBAL + #define EXTVAR +#else + #define EXTVAR extern +#endif + +EXTVAR ErrorHandler ErrHandler; + + + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/headers.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/headers.hpp new file mode 100644 index 00000000..9e632f4f --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/headers.hpp @@ -0,0 +1,308 @@ +#ifndef _RAR_HEADERS_ +#define _RAR_HEADERS_ + +#define SIZEOF_MARKHEAD 7 +#define SIZEOF_OLDMHD 7 +#define SIZEOF_NEWMHD 13 +#define SIZEOF_OLDLHD 21 +#define SIZEOF_NEWLHD 32 +#define SIZEOF_SHORTBLOCKHEAD 7 +#define SIZEOF_LONGBLOCKHEAD 11 +#define SIZEOF_SUBBLOCKHEAD 14 +#define SIZEOF_COMMHEAD 13 +#define SIZEOF_PROTECTHEAD 26 +#define SIZEOF_AVHEAD 14 +#define SIZEOF_SIGNHEAD 15 +#define SIZEOF_UOHEAD 18 +#define SIZEOF_MACHEAD 22 +#define SIZEOF_EAHEAD 24 +#define SIZEOF_BEEAHEAD 24 +#define SIZEOF_STREAMHEAD 26 + +#define PACK_VER 29 +#define PACK_CRYPT_VER 29 +#define UNP_VER 36 +#define CRYPT_VER 29 +#define AV_VER 20 +#define PROTECT_VER 20 + +#define MHD_VOLUME 0x0001U +#define MHD_COMMENT 0x0002U +#define MHD_LOCK 0x0004U +#define MHD_SOLID 0x0008U +#define MHD_PACK_COMMENT 0x0010U +#define MHD_NEWNUMBERING 0x0010U +#define MHD_AV 0x0020U +#define MHD_PROTECT 0x0040U +#define MHD_PASSWORD 0x0080U +#define MHD_FIRSTVOLUME 0x0100U +#define MHD_ENCRYPTVER 0x0200U + +#define LHD_SPLIT_BEFORE 0x0001U +#define LHD_SPLIT_AFTER 0x0002U +#define LHD_PASSWORD 0x0004U +#define LHD_COMMENT 0x0008U +#define LHD_SOLID 0x0010U + +#define LHD_WINDOWMASK 0x00e0U +#define LHD_WINDOW64 0x0000U +#define LHD_WINDOW128 0x0020U +#define LHD_WINDOW256 0x0040U +#define LHD_WINDOW512 0x0060U +#define LHD_WINDOW1024 0x0080U +#define LHD_WINDOW2048 0x00a0U +#define LHD_WINDOW4096 0x00c0U +#define LHD_DIRECTORY 0x00e0U + +#define LHD_LARGE 0x0100U +#define LHD_UNICODE 0x0200U +#define LHD_SALT 0x0400U +#define LHD_VERSION 0x0800U +#define LHD_EXTTIME 0x1000U +#define LHD_EXTFLAGS 0x2000U + +#define SKIP_IF_UNKNOWN 0x4000U +#define LONG_BLOCK 0x8000U + +#define EARC_NEXT_VOLUME 0x0001U // not last volume +#define EARC_DATACRC 0x0002U // store CRC32 of RAR archive (now used only in volumes) +#define EARC_REVSPACE 0x0004U // reserve space for end of REV file 7 byte record +#define EARC_VOLNUMBER 0x0008U // store a number of current volume + +enum HEADER_TYPE { + MARK_HEAD=0x72,MAIN_HEAD=0x73,FILE_HEAD=0x74,COMM_HEAD=0x75,AV_HEAD=0x76, + SUB_HEAD=0x77,PROTECT_HEAD=0x78,SIGN_HEAD=0x79,NEWSUB_HEAD=0x7a, + ENDARC_HEAD=0x7b +}; + +enum { EA_HEAD=0x100,UO_HEAD=0x101,MAC_HEAD=0x102,BEEA_HEAD=0x103, + NTACL_HEAD=0x104,STREAM_HEAD=0x105 }; + +enum HOST_SYSTEM { + HOST_MSDOS=0,HOST_OS2=1,HOST_WIN32=2,HOST_UNIX=3,HOST_MACOS=4, + HOST_BEOS=5,HOST_MAX +}; + +#define SUBHEAD_TYPE_CMT "CMT" +#define SUBHEAD_TYPE_ACL "ACL" +#define SUBHEAD_TYPE_STREAM "STM" +#define SUBHEAD_TYPE_UOWNER "UOW" +#define SUBHEAD_TYPE_AV "AV" +#define SUBHEAD_TYPE_RR "RR" +#define SUBHEAD_TYPE_OS2EA "EA2" +#define SUBHEAD_TYPE_BEOSEA "EABE" + +/* new file inherits a subblock when updating a host file */ +#define SUBHEAD_FLAGS_INHERITED 0x80000000 + +#define SUBHEAD_FLAGS_CMT_UNICODE 0x00000001 + +struct OldMainHeader +{ + byte Mark[4]; + ushort HeadSize; + byte Flags; +}; + + +struct OldFileHeader +{ + uint PackSize; + uint UnpSize; + ushort FileCRC; + ushort HeadSize; + uint FileTime; + byte FileAttr; + byte Flags; + byte UnpVer; + byte NameSize; + byte Method; +}; + + +struct MarkHeader +{ + byte Mark[7]; +}; + + +struct BaseBlock +{ + ushort HeadCRC; + HEADER_TYPE HeadType;//byte + ushort Flags; + ushort HeadSize; + + bool IsSubBlock() + { + if (HeadType==SUB_HEAD) + return(true); + if (HeadType==NEWSUB_HEAD && (Flags & LHD_SOLID)!=0) + return(true); + return(false); + } +}; + +struct BlockHeader:BaseBlock +{ + union { + uint DataSize; + uint PackSize; + }; +}; + + +struct MainHeader:BaseBlock +{ + ushort HighPosAV; + uint PosAV; + byte EncryptVer; +}; + + +#define SALT_SIZE 8 + +struct FileHeader:BlockHeader +{ + uint UnpSize; + byte HostOS; + uint FileCRC; + uint FileTime; + byte UnpVer; + byte Method; + ushort NameSize; + union { + uint FileAttr; + uint SubFlags; + }; +/* optional */ + uint HighPackSize; + uint HighUnpSize; +/* names */ + char FileName[NM]; + wchar FileNameW[NM]; +/* optional */ + Array<byte> SubData; + byte Salt[SALT_SIZE]; + + RarTime mtime; + RarTime ctime; + RarTime atime; + RarTime arctime; +/* dummy */ + int64 FullPackSize; + int64 FullUnpSize; + + void Clear(size_t SubDataSize) + { + SubData.Alloc(SubDataSize); + Flags=LONG_BLOCK; + SubFlags=0; + } + + bool CmpName(const char *Name) + { + return(strcmp(FileName,Name)==0); + } + + FileHeader& operator = (FileHeader &hd) + { + SubData.Reset(); + memcpy(this,&hd,sizeof(*this)); + SubData.CleanData(); + SubData=hd.SubData; + return(*this); + } +}; + + +struct EndArcHeader:BaseBlock +{ + uint ArcDataCRC; // optional archive CRC32 + ushort VolNumber; // optional current volume number +}; + + +// SubBlockHeader and its successors were used in RAR 2.x format. +// RAR 3.x uses FileHeader with NEWSUB_HEAD HeadType for subblocks. +struct SubBlockHeader:BlockHeader +{ + ushort SubType; + byte Level; +}; + + +struct CommentHeader:BaseBlock +{ + ushort UnpSize; + byte UnpVer; + byte Method; + ushort CommCRC; +}; + + +struct ProtectHeader:BlockHeader +{ + byte Version; + ushort RecSectors; + uint TotalBlocks; + byte Mark[8]; +}; + + +struct AVHeader:BaseBlock +{ + byte UnpVer; + byte Method; + byte AVVer; + uint AVInfoCRC; +}; + + +struct SignHeader:BaseBlock +{ + uint CreationTime; + ushort ArcNameSize; + ushort UserNameSize; +}; + + +struct UnixOwnersHeader:SubBlockHeader +{ + ushort OwnerNameSize; + ushort GroupNameSize; +/* dummy */ + char OwnerName[NM]; + char GroupName[NM]; +}; + + +struct EAHeader:SubBlockHeader +{ + uint UnpSize; + byte UnpVer; + byte Method; + uint EACRC; +}; + + +struct StreamHeader:SubBlockHeader +{ + uint UnpSize; + byte UnpVer; + byte Method; + uint StreamCRC; + ushort StreamNameSize; +/* dummy */ + byte StreamName[NM]; +}; + + +struct MacFInfoHeader:SubBlockHeader +{ + uint fileType; + uint fileCreator; +}; + + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/isnt.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/isnt.hpp new file mode 100644 index 00000000..02652361 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/isnt.hpp @@ -0,0 +1,6 @@ +#ifndef _RAR_ISNT_ +#define _RAR_ISNT_ + +int WinNT(); + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/list.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/list.hpp new file mode 100644 index 00000000..7721ae52 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/list.hpp @@ -0,0 +1,6 @@ +#ifndef _RAR_LIST_ +#define _RAR_LIST_ + +void ListArchive(CommandData *Cmd); + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/loclang.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/loclang.hpp new file mode 100644 index 00000000..86352049 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/loclang.hpp @@ -0,0 +1,354 @@ +#define MYesNo "_Yes_No" +#define MYesNoAll "_Yes_No_All" +#define MYesNoAllQ "_Yes_No_All_nEver_Quit" +#define MYesNoAllRenQ "_Yes_No_All_nEver_Rename_Quit" +#define MContinueQuit "_Continue_Quit" +#define MRetryAbort "_Retry_Abort" +#define MCopyright "\nRAR %s Copyright (c) 1993-%d Alexander Roshal %d %s %d" +#define MRegTo "\nRegistered to %s\n" +#define MShare "\nShareware version Type RAR -? for help\n" +#define MUCopyright "\nUNRAR %s freeware Copyright (c) 1993-%d Alexander Roshal\n" +#define MBeta "beta" +#define MMonthJan "Jan" +#define MMonthFeb "Feb" +#define MMonthMar "Mar" +#define MMonthApr "Apr" +#define MMonthMay "May" +#define MMonthJun "Jun" +#define MMonthJul "Jul" +#define MMonthAug "Aug" +#define MMonthSep "Sep" +#define MMonthOct "Oct" +#define MMonthNov "Nov" +#define MMonthDec "Dec" +#define MRARTitle1 "\nUsage: rar <command> -<switch 1> -<switch N> <archive> <files...>" +#define MUNRARTitle1 "\nUsage: unrar <command> -<switch 1> -<switch N> <archive> <files...>" +#define MRARTitle2 "\n <@listfiles...> <path_to_extract\\>" +#define MCHelpCmd "\n\n<Commands>" +#define MCHelpCmdA "\n a Add files to archive" +#define MCHelpCmdC "\n c Add archive comment" +#define MCHelpCmdCF "\n cf Add files comment" +#define MCHelpCmdCH "\n ch Change archive parameters" +#define MCHelpCmdCW "\n cw Write archive comment to file" +#define MCHelpCmdD "\n d Delete files from archive" +#define MCHelpCmdE "\n e Extract files to current directory" +#define MCHelpCmdF "\n f Freshen files in archive" +#define MCHelpCmdI "\n i[par]=<str> Find string in archives" +#define MCHelpCmdK "\n k Lock archive" +#define MCHelpCmdL "\n l[t,b] List archive [technical, bare]" +#define MCHelpCmdM "\n m[f] Move to archive [files only]" +#define MCHelpCmdP "\n p Print file to stdout" +#define MCHelpCmdR "\n r Repair archive" +#define MCHelpCmdRC "\n rc Reconstruct missing volumes" +#define MCHelpCmdRN "\n rn Rename archived files" +#define MCHelpCmdRR "\n rr[N] Add data recovery record" +#define MCHelpCmdRV "\n rv[N] Create recovery volumes" +#define MCHelpCmdS "\n s[name|-] Convert archive to or from SFX" +#define MCHelpCmdT "\n t Test archive files" +#define MCHelpCmdU "\n u Update files in archive" +#define MCHelpCmdV "\n v[t,b] Verbosely list archive [technical,bare]" +#define MCHelpCmdX "\n x Extract files with full path" +#define MCHelpSw "\n\n<Switches>" +#define MCHelpSwm "\n - Stop switches scanning" +#define MCHelpSwAC "\n ac Clear Archive attribute after compression or extraction" +#define MCHelpSwAD "\n ad Append archive name to destination path" +#define MCHelpSwAG "\n ag[format] Generate archive name using the current date" +#define MCHelpSwAI "\n ai Ignore file attributes" +#define MCHelpSwAO "\n ao Add files with Archive attribute set" +#define MCHelpSwAP "\n ap<path> Set path inside archive" +#define MCHelpSwAS "\n as Synchronize archive contents" +#define MCHelpSwAV "\n av Put authenticity verification (registered versions only)" +#define MCHelpSwAVm "\n av- Disable authenticity verification check" +#define MCHelpSwCm "\n c- Disable comments show" +#define MCHelpSwCFGm "\n cfg- Disable read configuration" +#define MCHelpSwCL "\n cl Convert names to lower case" +#define MCHelpSwCU "\n cu Convert names to upper case" +#define MCHelpSwDF "\n df Delete files after archiving" +#define MCHelpSwDH "\n dh Open shared files" +#define MCHelpSwDR "\n dr Delete files to Recycle Bin" +#define MCHelpSwDS "\n ds Disable name sort for solid archive" +#define MCHelpSwDW "\n dw Wipe files after archiving" +#define MCHelpSwEa "\n e[+]<attr> Set file exclude and include attributes" +#define MCHelpSwED "\n ed Do not add empty directories" +#define MCHelpSwEE "\n ee Do not save and extract extended attributes" +#define MCHelpSwEN "\n en Do not put 'end of archive' block" +#define MCHelpSwEP "\n ep Exclude paths from names" +#define MCHelpSwEP1 "\n ep1 Exclude base directory from names" +#define MCHelpSwEP2 "\n ep2 Expand paths to full" +#define MCHelpSwEP3 "\n ep3 Expand paths to full including the drive letter" +#define MCHelpSwF "\n f Freshen files" +#define MCHelpSwHP "\n hp[password] Encrypt both file data and headers" +#define MCHelpSwIDP "\n id[c,d,p,q] Disable messages" +#define MCHelpSwIEML "\n ieml[addr] Send archive by email" +#define MCHelpSwIERR "\n ierr Send all messages to stderr" +#define MCHelpSwILOG "\n ilog[name] Log errors to file (registered versions only)" +#define MCHelpSwINUL "\n inul Disable all messages" +#define MCHelpSwIOFF "\n ioff Turn PC off after completing an operation" +#define MCHelpSwISND "\n isnd Enable sound" +#define MCHelpSwK "\n k Lock archive" +#define MCHelpSwKB "\n kb Keep broken extracted files" +#define MCHelpSwMn "\n m<0..5> Set compression level (0-store...3-default...5-maximal)" +#define MCHelpSwMC "\n mc<par> Set advanced compression parameters" +#define MCHelpSwMD "\n md<size> Dictionary size in KB (64,128,256,512,1024,2048,4096 or A-G)" +#define MCHelpSwMS "\n ms[ext;ext] Specify file types to store" +#define MCHelpSwMT "\n mt<threads> Set the number of threads" +#define MCHelpSwN "\n n<file> Include only specified file" +#define MCHelpSwNa "\n n@ Read file names to include from stdin" +#define MCHelpSwNal "\n n@<list> Include files listed in specified list file" +#define MCHelpSwO "\n o[+|-] Set the overwrite mode" +#define MCHelpSwOC "\n oc Set NTFS Compressed attribute" +#define MCHelpSwOL "\n ol Save symbolic links as the link instead of the file" +#define MCHelpSwOR "\n or Rename files automatically" +#define MCHelpSwOS "\n os Save NTFS streams" +#define MCHelpSwOW "\n ow Save or restore file owner and group" +#define MCHelpSwP "\n p[password] Set password" +#define MCHelpSwPm "\n p- Do not query password" +#define MCHelpSwR "\n r Recurse subdirectories" +#define MCHelpSwRm "\n r- Disable recursion" +#define MCHelpSwR0 "\n r0 Recurse subdirectories for wildcard names only" +#define MCHelpSwRI "\n ri<P>[:<S>] Set priority (0-default,1-min..15-max) and sleep time in ms" +#define MCHelpSwRR "\n rr[N] Add data recovery record" +#define MCHelpSwRV "\n rv[N] Create recovery volumes" +#define MCHelpSwS "\n s[<N>,v[-],e] Create solid archive" +#define MCHelpSwSm "\n s- Disable solid archiving" +#define MCHelpSwSC "\n sc<chr>[obj] Specify the character set" +#define MCHelpSwSFX "\n sfx[name] Create SFX archive" +#define MCHelpSwSI "\n si[name] Read data from standard input (stdin)" +#define MCHelpSwSL "\n sl<size> Process files with size less than specified" +#define MCHelpSwSM "\n sm<size> Process files with size more than specified" +#define MCHelpSwT "\n t Test files after archiving" +#define MCHelpSwTK "\n tk Keep original archive time" +#define MCHelpSwTL "\n tl Set archive time to latest file" +#define MCHelpSwTN "\n tn<time> Process files newer than <time>" +#define MCHelpSwTO "\n to<time> Process files older than <time>" +#define MCHelpSwTA "\n ta<date> Process files modified after <date> in YYYYMMDDHHMMSS format" +#define MCHelpSwTB "\n tb<date> Process files modified before <date> in YYYYMMDDHHMMSS format" +#define MCHelpSwTS "\n ts<m,c,a>[N] Save or restore file time (modification, creation, access)" +#define MCHelpSwU "\n u Update files" +#define MCHelpSwV "\n v Create volumes with size autodetection or list all volumes" +#define MCHelpSwVUnr "\n v List all volumes" +#define MCHelpSwVn "\n v<size>[k,b] Create volumes with size=<size>*1000 [*1024, *1]" +#define MCHelpSwVD "\n vd Erase disk contents before creating volume" +#define MCHelpSwVER "\n ver[n] File version control" +#define MCHelpSwVN "\n vn Use the old style volume naming scheme" +#define MCHelpSwVP "\n vp Pause before each volume" +#define MCHelpSwW "\n w<path> Assign work directory" +#define MCHelpSwX "\n x<file> Exclude specified file" +#define MCHelpSwXa "\n x@ Read file names to exclude from stdin" +#define MCHelpSwXal "\n x@<list> Exclude files listed in specified list file" +#define MCHelpSwY "\n y Assume Yes on all queries" +#define MCHelpSwZ "\n z[file] Read archive comment from file" +#define MBadArc "\nERROR: Bad archive %s\n" +#define MAskPsw "Enter password (will not be echoed)" +#define MAskPswEcho "Enter password" +#define MReAskPsw "\nReenter password: " +#define MFor " for " +#define MNotMatchPsw "\nERROR: Passwords do not match\n" +#define MErrWrite "Write error in the file %s" +#define MErrRead "Read error in the file %s" +#define MErrSeek "Seek error in the file %s" +#define MErrFClose "Cannot close the file %s" +#define MErrOutMem "Not enough memory" +#define MErrBrokenArc "Corrupt archive - use 'Repair' command" +#define MProgAborted "Program aborted" +#define MErrRename "\nCannot rename %s to %s" +#define MAbsNextVol "\nCannot find volume %s" +#define MBreak "\nUser break\n" +#define MAskCreatVol "\nCreate next volume ?" +#define MAskNextDisk "\nDisk full. Insert next" +#define MCreatVol "\n\nCreating %sarchive %s\n" +#define MAskNextVol "\nInsert disk with %s" +#define MTestVol "\n\nTesting archive %s\n" +#define MExtrVol "\n\nExtracting from %s\n" +#define MConverting "\nConverting %s" +#define MCvtToSFX "\nConvert archives to SFX" +#define MCvtFromSFX "\nRemoving SFX module" +#define MNotSFX "\n%s is not SFX archive" +#define MNotRAR "\n%s is not RAR archive" +#define MNotFirstVol "\n%s is not the first volume" +#define MCvtOldFormat "\n%s - cannot convert to SFX archive with old format" +#define MCannotCreate "\nCannot create %s" +#define MCannotOpen "\nCannot open %s" +#define MUnknownMeth "\nUnknown method in %s" +#define MVerRequired "\nYou need RAR %d.%d to unpack it" +#define MOk " OK" +#define MDone "\nDone" +#define MLockingArc "\nLocking archive" +#define MNotMdfOld "\n\nERROR: Cannot modify old format archive" +#define MNotMdfLock "\n\nERROR: Locked archive" +#define MNotMdfVol "\n\nERROR: Cannot modify volume" +#define MVerifyAV "\nVerifying authenticity information ... " +#define MFailedAV " Failed\n" +#define MStrAV1 "\n\nArchive %s" +#define MStrAV2 "\ncreated at %s" +#define MStrAV3 "\nby %s\n" +#define MLogFailedAV "Invalid authenticity information" +#define MAddingAV "\nAdding authenticity verification " +#define MAVOldStyle "\n\nOld style authenticity information" +#define MPackAskReg "\nEvaluation copy. Please register.\n" +#define MCreateArchive "\nCreating %sarchive %s\n" +#define MUpdateArchive "\nUpdating %sarchive %s\n" +#define MAddSolid "solid " +#define MAddFile "\nAdding %-58s " +#define MUpdFile "\nUpdating %-58s " +#define MAddPoints "\n... %-58s " +#define MCannotUpdPswSolid "\nERROR: Cannot update solid archives with password\n" +#define MMoveDelFiles "\n\nDeleting files %s..." +#define MMoveDelDirs "and directories" +#define MMoveDelFile "\nDeleting %-30s" +#define MMoveDeleted " deleted" +#define MMoveNotDeleted " NOT DELETED" +#define MClearAttrib "\n\nClearing attributes..." +#define MMoveDelDir "\nDeleting directory %-30s" +#define MWarErrFOpen "\nWARNING: Cannot open %d %s" +#define MErrOpenFiles "files" +#define MErrOpenFile "file" +#define MAddNoFiles "\nWARNING: No files" +#define MMdfEncrSol "\n%s: encrypted" +#define MCannotMdfEncrSol "\nCannot modify solid archive containing encrypted files" +#define MAddAnalyze "\nAnalyzing archived files: " +#define MRepacking "\nRepacking archived files: " +#define MCRCFailed "\n%-20s - CRC failed" +#define MExtrTest "\n\nTesting archive %s\n" +#define MExtracting "\n\nExtracting from %s\n" +#define MUseCurPsw "\n%s - use current password ?" +#define MCreatDir "\nCreating %-56s" +#define MExtrSkipFile "\nSkipping %-56s" +#define MExtrTestFile "\nTesting %-56s" +#define MExtrFile "\nExtracting %-56s" +#define MExtrPoints "\n... %-56s" +#define MExtrErrMkDir "\nCannot create directory %s" +#define MExtrPrinting "\n------ Printing %s\n\n" +#define MEncrBadCRC "\nEncrypted file: CRC failed in %s (password incorrect ?)" +#define MExtrNoFiles "\nNo files to extract" +#define MExtrAllOk "\nAll OK" +#define MExtrTotalErr "\nTotal errors: %ld" +#define MFileExists "\n\n%s already exists. Overwrite it ?" +#define MAskOverwrite "\nOverwrite %s ?" +#define MAskNewName "\nEnter new name: " +#define MLogMainHead "\nThe archive header is corrupt" +#define MLogFileHead "\n%s - the file header is corrupt" +#define MLogCommHead "\nThe comment header is corrupt\n" +#define MLogProtectHead "The data recovery header is corrupt" +#define MReadStdinCmt "\nReading comment from stdin\n" +#define MReadCommFrom "\nReading comment from %s" +#define MDelComment "\nDeleting comment from %s" +#define MAddComment "\nAdding comment to %s" +#define MFCommAdd "\nAdding file comments" +#define MAskFComm "\n\nReading comment for %s : %s from stdin\n" +#define MLogCommBrk "\nThe archive comment is corrupt" +#define MCommAskCont "\nPress 'Enter' to continue or 'Q' to quit:" +#define MLogBrokFCmt "\nThe file comment is corrupt" +#define MWriteCommTo "\nWrite comment to %s" +#define MCommNotPres "\nComment is not present" +#define MDelFrom "\nDeleting from %s" +#define MDeleting "\nDeleting %s" +#define MEraseArc "\nErasing empty archive %s" +#define MNoDelFiles "\nNo files to delete" +#define MLogTitle "\n\n-------- %2d %s %d, archive %s\n" +#define MPathTooLong "\nERROR: Path too long\n" +#define MListSolid "Solid " +#define MListSFX "SFX " +#define MListVol1 "volume" +#define MListVol2 "Volume" +#define MListArc1 "archive" +#define MListArc2 "Archive" +#define MListRecRec "\nRecovery record is present\n" +#define MListLock "\nLock is present\n" +#define MListPathComm "\nPathname/Comment\n " +#define MListName "\n Name " +#define MListTitle " Size Packed Ratio Date Time Attr CRC Meth Ver\n" +#define MListTechTitle " Host OS Solid Old\n" +#define MListEAHead "\n OS/2 extended attributes" +#define MListUOHead "\n Unix Owner/Group data: %-14s %-14s" +#define MListBeEAHead "\n BeOS extended attributes" +#define MListNTACLHead "\n NTFS security data" +#define MListStrmHead "\n NTFS stream: %s" +#define MListUnkHead "\n Unknown subheader type: 0x%04x" +#define MFileComment "\nComment: " +#define MYes "Yes" +#define MNo "No" +#define MListNoFiles " 0 files\n" +#define MRprReconstr "\nReconstructing %s" +#define MRprBuild "\nBuilding %s" +#define MRprOldFormat "\nCannot repair archive with old format" +#define MRprFind "\nFound %s" +#define MRprAskIsSol "\nThe archive header is corrupt. Mark archive as solid ?" +#define MRprNoFiles "\nNo files found" +#define MRprSuspEntry "\n\nSuspicious entry %s" +#define MRprDir "\nDirectory" +#define MRprSuspSize "\nSize %ld Packed %ld" +#define MRprSuspAdd "\nAdd it to archive ?" +#define MLogUnexpEOF "\nUnexpected end of archive" +#define MRepAskReconst "\nReconstruct archive structure ?" +#define MRecScanning "\nScanning..." +#define MRecRNotFound "\nData recovery record not found" +#define MRecRFound "\nData recovery record found" +#define MRecSecDamage "\nSector %ld (offsets %lX...%lX) damaged" +#define MRecCorrected " - data recovered" +#define MRecFailed " - cannot recover data" +#define MAddRecRec "\nAdding data recovery record" +#define MEraseForVolume "\n\nErasing contents of drive %c:\n" +#define MGetOwnersError "\nWARNING: Cannot get %s owner and group\n" +#define MErrGetOwnerID "\nWARNING: Cannot get owner %s ID\n" +#define MErrGetGroupID "\nWARNING: Cannot get group %s ID\n" +#define MOwnersBroken "\nERROR: %s group and owner data are corrupt\n" +#define MSetOwnersError "\nWARNING: Cannot set %s owner and group\n" +#define MErrLnkRead "\nWARNING: Cannot read symbolic link %s" +#define MErrCreateLnk "\nWARNING: Cannot create link %s" +#define MSymLinkExists "\nWARNING: Symbolic link %s already exists" +#define MAskRetryCreate "\nCannot create %s. Retry ?" +#define MListMACHead1 "\n MacOS file type: %c%c%c%c ; " +#define MListMACHead2 "file creator: %c%c%c%c\n" +#define MDataBadCRC "\n%-20s : packed data CRC failed in volume %s" +#define MFileRO "\n%s is read-only" +#define MACLGetError "\nWARNING: Cannot get %s security data\n" +#define MACLSetError "\nWARNING: Cannot set %s security data\n" +#define MACLBroken "\nERROR: %s security data are corrupt\n" +#define MACLUnknown "\nWARNING: Unknown format of %s security data\n" +#define MStreamBroken "\nERROR: %s stream data are corrupt\n" +#define MStreamUnknown "\nWARNING: Unknown format of %s stream data\n" +#define MInvalidName "\nERROR: Invalid file name %s" +#define MEABroken "\nERROR: %s extended attributes are corrupt\n" +#define MEAUnknHeader "\nWARNING: %s - unknown format of extended attributes\n" +#define MCannotSetEA "\nWARNING: cannot set extended attributes to %s\n" +#define MCannotGetEA "\nERROR: Cannot get extended attributes of %s\n" +#define MShowEA " (+EA)" +#define MSkipEA "\n...skipping extended attributes" +#define MProcessArc "\n\nProcessing archive %s" +#define MSyncScanError "\nFile search errors, cannot synchronize archive" +#define MCorrectingName "\nWARNING: Attempting to correct the invalid file name" +#define MUnpCannotMerge "\nWARNING: You need to start extraction from a previous volume to unpack %s" +#define MUnknownOption "\nERROR: Unknown option: %s" +#define MSubHeadCorrupt "\nERROR: Corrupt data header found, ignored" +#define MSubHeadUnknown "\nWARNING: Unknown data header format, ignored" +#define MSubHeadDataCRC "\nERROR: Corrupt %s data block" +#define MSubHeadType "\nData header type: %s" +#define MScanError "\nCannot read contents of %s" +#define MNotVolume "\n%s is not volume" +#define MRecVolDiffSets "\nERROR: %s and %s belong to different sets" +#define MRecVolMissing "\n%d volumes missing" +#define MRecVolFound "\n%d recovery volumes found" +#define MRecVolAllExist "\nNothing to reconstruct" +#define MRecVolCannotFix "\nReconstruction impossible" +#define MReconstructing "\nReconstructing..." +#define MCreating "\nCreating %s" +#define MRenaming "\nRenaming %s to %s" +#define MNTFSRequired "\nWrite error: only NTFS file system supports files larger than 4 GB" +#define MErrChangeAttr "\nWARNING: Cannot change attributes of %s" +#define MWrongSFXVer "\nERROR: default SFX module does not support RAR %d.%d archives" +#define MCannotEncName "\nCannot encrypt archive already contained encrypted files" +#define MCannotEmail "\nCannot email the file %s" +#define MCopyrightS "\nRAR SFX archive" +#define MSHelpCmd "\n\n<Commands>" +#define MSHelpCmdE "\n -x Extract from archive (default)" +#define MSHelpCmdT "\n -t Test archive files" +#define MSHelpCmdV "\n -v Verbosely list contents of archive" +#define MMaxPathLimit "\nTotal path and file name length must not exceed %d characters" +#define MRecVolLimit "\nTotal number of usual and recovery volumes must not exceed 255" +#define MVolumeNumber "volume %d" +#define MCannotDelete "\nCannot delete %s" +#define MCalcCRC "\nCalculating the control sum" +#define MTooLargeSFXArc "\nWARNING: Too large SFX archive. Windows cannot run the executable file exceeding 4 GB." +#define MCalcCRCAllVol "\nCalculating control sums of all volumes." +#define MNotEnoughDisk "\nERROR: Not enough disk space for %s." diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/log.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/log.hpp new file mode 100644 index 00000000..52d6b8d5 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/log.hpp @@ -0,0 +1,18 @@ +#ifndef _RAR_LOG_ +#define _RAR_LOG_ + +void InitLogOptions(char *LogName); + +#ifndef SILENT +void Log(const char *ArcName,const char *Format,...); +#endif + +#ifdef SILENT +#ifdef __GNUC__ +#define Log(args...) +#else +inline void Log(const char *a,const char *b,const char *c=NULL,const char *d=NULL) {} +#endif +#endif + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/match.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/match.hpp new file mode 100644 index 00000000..0e43514f --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/match.hpp @@ -0,0 +1,27 @@ +#ifndef _RAR_MATCH_ +#define _RAR_MATCH_ + +enum { + MATCH_NAMES, // Compare names only. + + MATCH_PATH, // Compares names and paths. Both must match exactly. + // Unlike MATCH_EXACTPATH, also matches names if + // mask contains path only and this path is a part + // of name path. + + MATCH_EXACTPATH, // Compares names and paths. Both must match exactly. + + MATCH_SUBPATH, // Names must be the same, but path in mask is allowed + // to be only a part of name path. + + MATCH_WILDSUBPATH // Works as MATCH_SUBPATH if mask contains wildcards + // and as MATCH_PATH otherwise. +}; + +#define MATCH_MODEMASK 0x0000ffff +#define MATCH_FORCECASESENSITIVE 0x80000000 + +bool CmpName(char *Wildcard,char *Name,int CmpPath); +bool CmpName(wchar *Wildcard,wchar *Name,int CmpPath); + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/model.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/model.hpp new file mode 100644 index 00000000..5b4fa4f4 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/model.hpp @@ -0,0 +1,132 @@ +#ifndef _RAR_PPMMODEL_ +#define _RAR_PPMMODEL_ + +#include "coder.hpp" +#include "suballoc.hpp" + +const int MAX_O=64; /* maximum allowed model order */ + +const int INT_BITS=7, PERIOD_BITS=7, TOT_BITS=INT_BITS+PERIOD_BITS, + INTERVAL=1 << INT_BITS, BIN_SCALE=1 << TOT_BITS, MAX_FREQ=124; + +#ifndef STRICT_ALIGNMENT_REQUIRED +#pragma pack(1) +#endif + +struct SEE2_CONTEXT +{ // SEE-contexts for PPM-contexts with masked symbols + ushort Summ; + byte Shift, Count; + void init(int InitVal) + { + Summ=InitVal << (Shift=PERIOD_BITS-4); + Count=4; + } + uint getMean() + { + uint RetVal=SHORT16(Summ) >> Shift; + Summ -= RetVal; + return RetVal+(RetVal == 0); + } + void update() + { + if (Shift < PERIOD_BITS && --Count == 0) + { + Summ += Summ; + Count=3 << Shift++; + } + } +}; + + +class ModelPPM; +struct PPM_CONTEXT; + +struct STATE +{ + byte Symbol; + byte Freq; + PPM_CONTEXT* Successor; +}; + +struct FreqData +{ + ushort SummFreq; + STATE _PACK_ATTR * Stats; +}; + +struct PPM_CONTEXT +{ + ushort NumStats; + union + { + FreqData U; + STATE OneState; + }; + + PPM_CONTEXT* Suffix; + inline void encodeBinSymbol(ModelPPM *Model,int symbol); // MaxOrder: + inline void encodeSymbol1(ModelPPM *Model,int symbol); // ABCD context + inline void encodeSymbol2(ModelPPM *Model,int symbol); // BCD suffix + inline void decodeBinSymbol(ModelPPM *Model); // BCDE successor + inline bool decodeSymbol1(ModelPPM *Model); // other orders: + inline bool decodeSymbol2(ModelPPM *Model); // BCD context + inline void update1(ModelPPM *Model,STATE* p); // CD suffix + inline void update2(ModelPPM *Model,STATE* p); // BCDE successor + void rescale(ModelPPM *Model); + inline PPM_CONTEXT* createChild(ModelPPM *Model,STATE* pStats,STATE& FirstState); + inline SEE2_CONTEXT* makeEscFreq2(ModelPPM *Model,int Diff); +}; + +#ifndef STRICT_ALIGNMENT_REQUIRED +#ifdef _AIX +#pragma pack(pop) +#else +#pragma pack() +#endif +#endif + +const uint UNIT_SIZE=Max(sizeof(PPM_CONTEXT),sizeof(RAR_MEM_BLK)); +const uint FIXED_UNIT_SIZE=12; + +/* +inline PPM_CONTEXT::PPM_CONTEXT(STATE* pStats,PPM_CONTEXT* ShorterContext): + NumStats(1), Suffix(ShorterContext) { pStats->Successor=this; } +inline PPM_CONTEXT::PPM_CONTEXT(): NumStats(0) {} +*/ + +template <class T> +inline void _PPMD_SWAP(T& t1,T& t2) { T tmp=t1; t1=t2; t2=tmp; } + + +class ModelPPM +{ + private: + friend struct PPM_CONTEXT; + + SEE2_CONTEXT SEE2Cont[25][16], DummySEE2Cont; + + struct PPM_CONTEXT *MinContext, *MedContext, *MaxContext; + STATE* FoundState; // found next state transition + int NumMasked, InitEsc, OrderFall, MaxOrder, RunLength, InitRL; + byte CharMask[256], NS2Indx[256], NS2BSIndx[256], HB2Flag[256]; + byte EscCount, PrevSuccess, HiBitsFlag; + ushort BinSumm[128][64]; // binary SEE-contexts + + RangeCoder Coder; + SubAllocator SubAlloc; + + void RestartModelRare(); + void StartModelRare(int MaxOrder); + inline PPM_CONTEXT* CreateSuccessors(bool Skip,STATE* p1); + + inline void UpdateModel(); + inline void ClearMask(); + public: + ModelPPM(); + void CleanUp(); // reset PPM variables after data error + bool DecodeInit(Unpack *UnpackRead,int &EscChar); + int DecodeChar(); +}; + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/options.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/options.hpp new file mode 100644 index 00000000..804dc9d5 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/options.hpp @@ -0,0 +1,162 @@ +#ifndef _RAR_OPTIONS_ +#define _RAR_OPTIONS_ + +#define DEFAULT_RECOVERY -1 + +#define DEFAULT_RECVOLUMES -10 + +enum PATH_EXCL_MODE { + EXCL_NONE,EXCL_BASEPATH,EXCL_SKIPWHOLEPATH,EXCL_SAVEFULLPATH, + EXCL_SKIPABSPATH,EXCL_ABSPATH +}; + +enum {SOLID_NONE=0,SOLID_NORMAL=1,SOLID_COUNT=2,SOLID_FILEEXT=4, + SOLID_VOLUME_DEPENDENT=8,SOLID_VOLUME_INDEPENDENT=16}; + +enum {ARCTIME_NONE,ARCTIME_KEEP,ARCTIME_LATEST}; + +enum EXTTIME_MODE { + EXTTIME_NONE,EXTTIME_1S,EXTTIME_HIGH1,EXTTIME_HIGH2,EXTTIME_HIGH3 +}; + +enum {NAMES_ORIGINALCASE,NAMES_UPPERCASE,NAMES_LOWERCASE}; + +enum MESSAGE_TYPE {MSG_STDOUT,MSG_STDERR,MSG_ERRONLY,MSG_NULL}; + +enum RECURSE_MODE +{ + RECURSE_NONE=0, // no recurse switches + RECURSE_DISABLE, // switch -r- + RECURSE_ALWAYS, // switch -r + RECURSE_WILDCARDS, // switch -r0 +}; + +enum OVERWRITE_MODE +{ + OVERWRITE_DEFAULT=0, // ask for extraction, silently overwrite for archiving + OVERWRITE_ALL, + OVERWRITE_NONE, + OVERWRITE_AUTORENAME, + OVERWRITE_FORCE_ASK +}; + +enum RAR_CHARSET { RCH_DEFAULT=0,RCH_ANSI,RCH_OEM,RCH_UNICODE }; + +#define MAX_FILTERS 16 +enum FilterState {FILTER_DEFAULT=0,FILTER_AUTO,FILTER_FORCE,FILTER_DISABLE}; + + +struct FilterMode +{ + FilterState State; + int Param1; + int Param2; +}; + + +class RAROptions +{ + public: + RAROptions(); + ~RAROptions(); + void Init(); + + uint ExclFileAttr; + uint InclFileAttr; + bool InclAttrSet; + uint WinSize; + char TempPath[NM]; + char SFXModule[NM]; + char ExtrPath[NM]; + wchar ExtrPathW[NM]; + char CommentFile[NM]; + RAR_CHARSET CommentCharset; + RAR_CHARSET FilelistCharset; + char ArcPath[NM]; + wchar ArcPathW[NM]; + char Password[MAXPASSWORD]; + bool EncryptHeaders; + char LogName[NM]; + MESSAGE_TYPE MsgStream; + bool Sound; + OVERWRITE_MODE Overwrite; + int Method; + int Recovery; + int RecVolNumber; + bool DisablePercentage; + bool DisableCopyright; + bool DisableDone; + int Solid; + int SolidCount; + bool ClearArc; + bool AddArcOnly; + bool AV; + bool DisableComment; + bool FreshFiles; + bool UpdateFiles; + PATH_EXCL_MODE ExclPath; + RECURSE_MODE Recurse; + int64 VolSize; + Array<int64> NextVolSizes; + uint CurVolNum; + bool AllYes; + bool DisableViewAV; + bool DisableSortSolid; + int ArcTime; + int ConvertNames; + bool ProcessOwners; + bool SaveLinks; + int Priority; + int SleepTime; + bool KeepBroken; + bool EraseDisk; + bool OpenShared; + bool DeleteFiles; + bool SyncFiles; + bool GenerateArcName; + char GenerateMask[80]; + bool ProcessEA; + bool SaveStreams; + bool SetCompressedAttr; + bool IgnoreGeneralAttr; + RarTime FileTimeBefore; + RarTime FileTimeAfter; + int64 FileSizeLess; + int64 FileSizeMore; + bool OldNumbering; + bool Lock; + bool Test; + bool VolumePause; + FilterMode FilterModes[MAX_FILTERS]; + char EmailTo[NM]; + uint VersionControl; + bool NoEndBlock; + bool AppendArcNameToPath; + bool Shutdown; + EXTTIME_MODE xmtime; + EXTTIME_MODE xctime; + EXTTIME_MODE xatime; + EXTTIME_MODE xarctime; + char CompressStdin[NM]; + +#ifdef PACK_SMP + uint Threads; +#endif + + + + + + +#ifdef RARDLL + char DllDestName[NM]; + wchar DllDestNameW[NM]; + int DllOpMode; + int DllError; + LPARAM UserData; + UNRARCALLBACK Callback; + CHANGEVOLPROC ChangeVolProc; + PROCESSDATAPROC ProcessDataProc; +#endif +}; +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/os.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/os.hpp new file mode 100644 index 00000000..4e15d11e --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/os.hpp @@ -0,0 +1,259 @@ +#ifndef _RAR_OS_ +#define _RAR_OS_ + +#define FALSE 0 +#define TRUE 1 + +#ifdef __EMX__ + #define INCL_BASE +#endif + +#if defined(RARDLL) && !defined(SILENT) +#define SILENT +#endif + +#if defined(_WIN_32) || defined(_EMX) +#define ENABLE_BAD_ALLOC +#endif + + +#if defined(_WIN_32) || defined(_EMX) + +#define LITTLE_ENDIAN +#define NM 1024 + +#ifdef _WIN_32 + + #define STRICT + #undef WINVER + #undef _WIN32_WINNT + #define WINVER 0x0400 + #define _WIN32_WINNT 0x0300 + + +#define WIN32_LEAN_AND_MEAN + +#include <windows.h> +#include <prsht.h> + +#ifndef _WIN_CE + #include <shellapi.h> + #include <shlobj.h> + #include <winioctl.h> + + +#endif // _WIN_CE + + +#endif // _WIN_32 + +#ifndef _WIN_CE + #include <sys/types.h> + #include <sys/stat.h> + #include <dos.h> +#endif // _WIN_CE + +#if !defined(_EMX) && !defined(_MSC_VER) && !defined(_WIN_CE) + #include <dir.h> +#endif +#ifdef _MSC_VER + #if _MSC_VER<1500 + #define for if (0) ; else for + #endif + #ifndef _WIN_CE + #include <direct.h> + #endif +#else + #include <dirent.h> +#endif // _MSC_VER + +#ifndef _WIN_CE + #include <share.h> +#endif // _WIN_CE + +#if defined(ENABLE_BAD_ALLOC) && !defined(_WIN_CE) + #include <new.h> +#endif + +#ifdef _EMX + #include <unistd.h> + #include <pwd.h> + #include <grp.h> + #include <errno.h> + #ifdef _DJGPP + #include <utime.h> + #else + #include <os2.h> + #include <sys/utime.h> + #include <emx/syscalls.h> + #endif +#else + #if defined(_MSC_VER) || defined(__MINGW32__) + #include <exception> + #else + #include <except.h> + #endif +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <stdarg.h> +#include <string.h> +#include <ctype.h> +#ifndef _WIN_CE + #include <fcntl.h> + #include <dos.h> + #include <io.h> + #include <time.h> + #include <signal.h> +#endif + +/* +#ifdef _WIN_32 +#pragma hdrstop +#endif // _WIN_32 +*/ + +#define ENABLE_ACCESS + +#define DefConfigName "rar.ini" +#define DefLogName "rar.log" + + +#define PATHDIVIDER "\\" +#define PATHDIVIDERW L"\\" +#define CPATHDIVIDER '\\' +#define MASKALL "*" +#define MASKALLW L"*" + +#define READBINARY "rb" +#define READTEXT "rt" +#define UPDATEBINARY "r+b" +#define CREATEBINARY "w+b" +#define APPENDTEXT "at" + +#if defined(_WIN_32) + #ifdef _MSC_VER + #define _stdfunction __cdecl + #else + #define _stdfunction _USERENTRY + #endif +#else + #define _stdfunction +#endif + +#endif + +#ifdef _UNIX + +#define NM 1024 + +#ifdef _BEOS +#include <be/kernel/fs_info.h> +#include <be/kernel/fs_attr.h> +#endif + +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/file.h> +#if defined(__QNXNTO__) + #include <sys/param.h> +#endif +#if defined(__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__) || defined(__APPLE__) + #include <sys/param.h> + #include <sys/mount.h> +#else +#endif +#include <pwd.h> +#include <grp.h> +#include <stdio.h> +#include <stdlib.h> +#include <stdarg.h> +#include <string.h> +#include <ctype.h> +#include <fcntl.h> +#include <errno.h> +#include <dirent.h> +#include <time.h> +#include <signal.h> +#include <utime.h> +#include <locale.h> + +#define ENABLE_ACCESS + +#define DefConfigName ".rarrc" +#define DefLogName ".rarlog" + + +#define PATHDIVIDER "/" +#define PATHDIVIDERW L"/" +#define CPATHDIVIDER '/' +#define MASKALL "*" +#define MASKALLW L"*" + +#define READBINARY "r" +#define READTEXT "r" +#define UPDATEBINARY "r+" +#define CREATEBINARY "w+" +#define APPENDTEXT "a" + +#define _stdfunction + +#ifdef _APPLE + #if defined(__BIG_ENDIAN__) && !defined(BIG_ENDIAN) + #define BIG_ENDIAN + #undef LITTLE_ENDIAN + #endif + #if defined(__i386__) && !defined(LITTLE_ENDIAN) + #define LITTLE_ENDIAN + #undef BIG_ENDIAN + #endif +#endif + +#if defined(__sparc) || defined(sparc) || defined(__hpux) + #ifndef BIG_ENDIAN + #define BIG_ENDIAN + #endif +#endif + +#endif + + typedef const char* MSGID; + +#define safebuf static + +#if !defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN) + #if defined(__i386) || defined(i386) || defined(__i386__) + #define LITTLE_ENDIAN + #elif defined(BYTE_ORDER) && BYTE_ORDER == LITTLE_ENDIAN + #define LITTLE_ENDIAN + #elif defined(BYTE_ORDER) && BYTE_ORDER == BIG_ENDIAN + #define BIG_ENDIAN + #else + #error "Neither LITTLE_ENDIAN nor BIG_ENDIAN are defined. Define one of them." + #endif +#endif + +#if defined(LITTLE_ENDIAN) && defined(BIG_ENDIAN) + #if defined(BYTE_ORDER) && BYTE_ORDER == BIG_ENDIAN + #undef LITTLE_ENDIAN + #elif defined(BYTE_ORDER) && BYTE_ORDER == LITTLE_ENDIAN + #undef BIG_ENDIAN + #else + #error "Both LITTLE_ENDIAN and BIG_ENDIAN are defined. Undef one of them." + #endif +#endif + +#if !defined(BIG_ENDIAN) && !defined(_WIN_CE) && defined(_WIN_32) +/* allow not aligned integer access, increases speed in some operations */ +#define ALLOW_NOT_ALIGNED_INT +#endif + +#if defined(__sparc) || defined(sparc) || defined(__sparcv9) +/* prohibit not aligned access to data structures in text comression + algorithm, increases memory requirements */ +#define STRICT_ALIGNMENT_REQUIRED +#endif + +#endif // _RAR_OS_ diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/pathfn.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/pathfn.hpp new file mode 100644 index 00000000..6b0ac31d --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/pathfn.hpp @@ -0,0 +1,49 @@ +#ifndef _RAR_PATHFN_ +#define _RAR_PATHFN_ + +char* PointToName(const char *Path); +wchar* PointToName(const wchar *Path); +char* PointToLastChar(const char *Path); +char* ConvertPath(const char *SrcPath,char *DestPath); +wchar* ConvertPath(const wchar *SrcPath,wchar *DestPath); +void SetExt(char *Name,const char *NewExt); +void SetExt(wchar *Name,const wchar *NewExt); +void SetSFXExt(char *SFXName); +void SetSFXExt(wchar *SFXName); +char *GetExt(const char *Name); +wchar *GetExt(const wchar *Name); +bool CmpExt(const char *Name,const char *Ext); +bool IsWildcard(const char *Str,const wchar *StrW=NULL); +bool IsPathDiv(int Ch); +bool IsDriveDiv(int Ch); +int GetPathDisk(const char *Path); +void AddEndSlash(char *Path); +void AddEndSlash(wchar *Path); +void GetFilePath(const char *FullName,char *Path,int MaxLength); +void GetFilePath(const wchar *FullName,wchar *Path,int MaxLength); +void RemoveNameFromPath(char *Path); +void RemoveNameFromPath(wchar *Path); +void GetAppDataPath(char *Path); +void GetRarDataPath(char *Path); +bool EnumConfigPaths(char *Path,int Number); +void GetConfigName(const char *Name,char *FullName,bool CheckExist); +char* GetVolNumPart(char *ArcName); +void NextVolumeName(char *ArcName,wchar *ArcNameW,uint MaxLength,bool OldNumbering); +bool IsNameUsable(const char *Name); +void MakeNameUsable(char *Name,bool Extended); +char* UnixSlashToDos(char *SrcName,char *DestName=NULL,uint MaxLength=NM); +char* DosSlashToUnix(char *SrcName,char *DestName=NULL,uint MaxLength=NM); +wchar* UnixSlashToDos(wchar *SrcName,wchar *DestName=NULL,uint MaxLength=NM); +bool IsFullPath(const char *Path); +bool IsFullPath(const wchar *Path); +bool IsDiskLetter(const char *Path); +bool IsDiskLetter(const wchar *Path); +void GetPathRoot(const char *Path,char *Root); +int ParseVersionFileName(char *Name,wchar *NameW,bool Truncate); +char* VolNameToFirstName(const char *VolName,char *FirstName,bool NewNumbering); +wchar* GetWideName(const char *Name,const wchar *NameW,wchar *DestW); + + +inline char* GetOutputName(const char *Name) {return((char *)Name);}; + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/rar.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/rar.hpp new file mode 100644 index 00000000..218830c2 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/rar.hpp @@ -0,0 +1,77 @@ +#ifndef _RAR_RARCOMMON_ +#define _RAR_RARCOMMON_ + +#include "raros.hpp" +#include "os.hpp" + +#ifdef RARDLL +#include "dll.hpp" +#endif + + +#ifndef _WIN_CE +#include "version.hpp" +#endif +#include "rartypes.hpp" +#include "rardefs.hpp" +#include "rarlang.hpp" +#include "unicode.hpp" +#include "errhnd.hpp" +#include "array.hpp" +#include "timefn.hpp" +#include "options.hpp" +#include "headers.hpp" +#include "pathfn.hpp" +#include "strfn.hpp" +#include "strlist.hpp" +#include "file.hpp" +#include "sha1.hpp" +#include "crc.hpp" +#include "rijndael.hpp" +#include "crypt.hpp" +#include "filefn.hpp" +#include "filestr.hpp" +#include "find.hpp" +#include "scantree.hpp" +#include "savepos.hpp" +#include "getbits.hpp" +#include "rdwrfn.hpp" +#include "archive.hpp" +#include "match.hpp" +#include "cmddata.hpp" +#include "filcreat.hpp" +#include "consio.hpp" +#include "system.hpp" +#include "isnt.hpp" +#include "log.hpp" +#include "rawread.hpp" +#include "encname.hpp" +#include "resource.hpp" +#include "compress.hpp" + + +#include "rarvm.hpp" +#include "model.hpp" + + +#include "unpack.hpp" + + +#include "extinfo.hpp" +#include "extract.hpp" + + + +#include "list.hpp" + + +#include "rs.hpp" +#include "recvol.hpp" +#include "volume.hpp" +#include "smallfn.hpp" +#include "ulinks.hpp" + +#include "global.hpp" + + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/rardefs.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/rardefs.hpp new file mode 100644 index 00000000..24f97b50 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/rardefs.hpp @@ -0,0 +1,24 @@ +#ifndef _RAR_DEFS_ +#define _RAR_DEFS_ + +#define Min(x,y) (((x)<(y)) ? (x):(y)) +#define Max(x,y) (((x)>(y)) ? (x):(y)) + +#define ASIZE(x) (sizeof(x)/sizeof(x[0])) + +#define MAXPASSWORD 128 +#define MAXSFXSIZE 0x80000 + +#define DefSFXName "default.sfx" +#define DefSortListName "rarfiles.lst" + +#ifndef FA_RDONLY + #define FA_RDONLY 0x01 + #define FA_HIDDEN 0x02 + #define FA_SYSTEM 0x04 + #define FA_LABEL 0x08 + #define FA_DIREC 0x10 + #define FA_ARCH 0x20 +#endif + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/rarlang.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/rarlang.hpp new file mode 100644 index 00000000..6151d15a --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/rarlang.hpp @@ -0,0 +1,10 @@ +#ifndef _RAR_LANG_ +#define _RAR_LANG_ + + #ifdef USE_RC + #include "rarres.hpp" + #else + #include "loclang.hpp" + #endif + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/raros.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/raros.hpp new file mode 100644 index 00000000..e6867981 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/raros.hpp @@ -0,0 +1,41 @@ +#ifndef _RAR_RAROS_ +#define _RAR_RAROS_ + +#ifdef __EMX__ + #define _EMX +#endif + +#ifdef __DJGPP__ + #define _DJGPP + #define _EMX +#endif + +#if defined(__WIN32__) || defined(_WIN32) + #define _WIN_32 +#endif + +#ifdef _WIN32_WCE + #define _WIN_32 + #define _WIN_CE + #ifdef WM_FILECHANGEINFO + #define PC2002 + #else + #undef PC2002 + #endif +#endif + +#ifdef __BEOS__ + #define _UNIX + #define _BEOS +#endif + +#ifdef __APPLE__ + #define _UNIX + #define _APPLE +#endif + +#if !defined(_EMX) && !defined(_WIN_32) && !defined(_BEOS) && !defined(_APPLE) + #define _UNIX +#endif + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/rartypes.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/rartypes.hpp new file mode 100644 index 00000000..595592e7 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/rartypes.hpp @@ -0,0 +1,47 @@ +#ifndef _RAR_TYPES_ +#define _RAR_TYPES_ + +typedef unsigned char byte; // unsigned 8 bits +typedef unsigned short ushort; // preferably 16 bits, but can be more +typedef unsigned int uint; // 32 bits or more + +#define PRESENT_INT32 // undefine if signed 32 bits is not available + +typedef unsigned int uint32; // 32 bits exactly +typedef signed int int32; // signed 32 bits exactly + +// If compiler does not support 64 bit variables, we can define +// uint64 and int64 as 32 bit, but it will limit the maximum processed +// file size to 2 GB. +#if defined(__BORLANDC__) || defined(_MSC_VER) +typedef unsigned __int64 uint64; // unsigned 64 bits +typedef signed __int64 int64; // signed 64 bits +#else +typedef unsigned long long uint64; // unsigned 64 bits +typedef signed long long int64; // signed 64 bits +#endif + + +#if defined(_WIN_32) || defined(__GNUC__) || defined(__sgi) || defined(_AIX) || defined(__sun) || defined(__hpux) || defined(_OSF_SOURCE) +typedef wchar_t wchar; +#else +typedef ushort wchar; +#endif + +// Get lowest 16 bits. +#define SHORT16(x) (sizeof(ushort)==2 ? (ushort)(x):((x)&0xffff)) + +// Get lowest 32 bits. +#define UINT32(x) (sizeof(uint32)==4 ? (uint32)(x):((x)&0xffffffff)) + +// Make 64 bit integer from two 32 bit. +#define INT32TO64(high,low) ((((uint64)(high))<<32)+((uint64)low)) + +// Special int64 value, large enough to be never found in real life. +// We use it in situations, when we need to indicate that parameter +// is not defined and probably should be calculated inside of function. +// Lower part is intentionally 0x7fffffff, not 0xffffffff, to make it +// compatible with 32 bit int64. +#define INT64NDF INT32TO64(0x7fffffff,0x7fffffff) + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/rarvm.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/rarvm.hpp new file mode 100644 index 00000000..96d42c23 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/rarvm.hpp @@ -0,0 +1,113 @@ +#ifndef _RAR_VM_ +#define _RAR_VM_ + +#define VM_STANDARDFILTERS + +#ifndef SFX_MODULE +#define VM_OPTIMIZE +#endif + + +#define VM_MEMSIZE 0x40000 +#define VM_MEMMASK (VM_MEMSIZE-1) +#define VM_GLOBALMEMADDR 0x3C000 +#define VM_GLOBALMEMSIZE 0x2000 +#define VM_FIXEDGLOBALSIZE 64 + +enum VM_Commands +{ + VM_MOV, VM_CMP, VM_ADD, VM_SUB, VM_JZ, VM_JNZ, VM_INC, VM_DEC, + VM_JMP, VM_XOR, VM_AND, VM_OR, VM_TEST, VM_JS, VM_JNS, VM_JB, + VM_JBE, VM_JA, VM_JAE, VM_PUSH, VM_POP, VM_CALL, VM_RET, VM_NOT, + VM_SHL, VM_SHR, VM_SAR, VM_NEG, VM_PUSHA,VM_POPA, VM_PUSHF,VM_POPF, + VM_MOVZX,VM_MOVSX,VM_XCHG, VM_MUL, VM_DIV, VM_ADC, VM_SBB, VM_PRINT, + +#ifdef VM_OPTIMIZE + VM_MOVB, VM_MOVD, VM_CMPB, VM_CMPD, + + VM_ADDB, VM_ADDD, VM_SUBB, VM_SUBD, VM_INCB, VM_INCD, VM_DECB, VM_DECD, + VM_NEGB, VM_NEGD, +#endif + + VM_STANDARD +}; + +enum VM_StandardFilters { + VMSF_NONE, VMSF_E8, VMSF_E8E9, VMSF_ITANIUM, VMSF_RGB, VMSF_AUDIO, + VMSF_DELTA, VMSF_UPCASE +}; + +enum VM_Flags {VM_FC=1,VM_FZ=2,VM_FS=0x80000000}; + +enum VM_OpType {VM_OPREG,VM_OPINT,VM_OPREGMEM,VM_OPNONE}; + +struct VM_PreparedOperand +{ + VM_OpType Type; + uint Data; + uint Base; + uint *Addr; +}; + +struct VM_PreparedCommand +{ + VM_Commands OpCode; + bool ByteMode; + VM_PreparedOperand Op1,Op2; +}; + + +struct VM_PreparedProgram +{ + VM_PreparedProgram() + { + AltCmd=NULL; + FilteredDataSize=0; + CmdCount=0; + } + + Array<VM_PreparedCommand> Cmd; + VM_PreparedCommand *AltCmd; + int CmdCount; + + Array<byte> GlobalData; + Array<byte> StaticData; // static data contained in DB operators + uint InitR[7]; + + byte *FilteredData; + uint FilteredDataSize; +}; + +class RarVM:private BitInput +{ + private: + inline uint GetValue(bool ByteMode,uint *Addr); + inline void SetValue(bool ByteMode,uint *Addr,uint Value); + inline uint* GetOperand(VM_PreparedOperand *CmdOp); + void DecodeArg(VM_PreparedOperand &Op,bool ByteMode); +#ifdef VM_OPTIMIZE + void Optimize(VM_PreparedProgram *Prg); +#endif + bool ExecuteCode(VM_PreparedCommand *PreparedCode,uint CodeSize); +#ifdef VM_STANDARDFILTERS + VM_StandardFilters IsStandardFilter(byte *Code,uint CodeSize); + void ExecuteStandardFilter(VM_StandardFilters FilterType); + uint FilterItanium_GetBits(byte *Data,int BitPos,int BitCount); + void FilterItanium_SetBits(byte *Data,uint BitField,int BitPos,int BitCount); +#endif + + byte *Mem; + uint R[8]; + uint Flags; + public: + RarVM(); + ~RarVM(); + void Init(); + void Prepare(byte *Code,uint CodeSize,VM_PreparedProgram *Prg); + void Execute(VM_PreparedProgram *Prg); + void SetLowEndianValue(uint *Addr,uint Value); + void SetMemory(uint Pos,byte *Data,uint DataSize); + static uint ReadData(BitInput &Inp); +}; + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/rawread.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/rawread.hpp new file mode 100644 index 00000000..39fefe6f --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/rawread.hpp @@ -0,0 +1,32 @@ +#ifndef _RAR_RAWREAD_ +#define _RAR_RAWREAD_ + +class RawRead +{ + private: + Array<byte> Data; + File *SrcFile; + size_t DataSize; + size_t ReadPos; +#ifndef SHELL_EXT + CryptData *Crypt; +#endif + public: + RawRead(File *SrcFile); + void Read(size_t Size); + void Read(byte *SrcData,size_t Size); + void Get(byte &Field); + void Get(ushort &Field); + void Get(uint &Field); + void Get8(int64 &Field); + void Get(byte *Field,size_t Size); + void Get(wchar *Field,size_t Size); + uint GetCRC(bool ProcessedOnly); + size_t Size() {return DataSize;} + size_t PaddedSize() {return Data.Size()-DataSize;} +#ifndef SHELL_EXT + void SetCrypt(CryptData *Crypt) {RawRead::Crypt=Crypt;} +#endif +}; + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/rdwrfn.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/rdwrfn.hpp new file mode 100644 index 00000000..10e026f3 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/rdwrfn.hpp @@ -0,0 +1,89 @@ +#ifndef _RAR_DATAIO_ +#define _RAR_DATAIO_ + +class CmdAdd; +class Unpack; + + +class ComprDataIO +{ + private: + void ShowUnpRead(int64 ArcPos,int64 ArcSize); + void ShowUnpWrite(); + + + bool UnpackFromMemory; + size_t UnpackFromMemorySize; + byte *UnpackFromMemoryAddr; + + bool UnpackToMemory; + size_t UnpackToMemorySize; + byte *UnpackToMemoryAddr; + + size_t UnpWrSize; + byte *UnpWrAddr; + + int64 UnpPackedSize; + + bool Progress; + bool TestMode; + bool SkipUnpCRC; + + File *SrcFile; + File *DestFile; + + CmdAdd *Command; + + FileHeader *SubHead; + int64 *SubHeadPos; + +#ifndef NOCRYPT + CryptData Crypt; + CryptData Decrypt; +#endif + + + int LastPercent; + + char CurrentCommand; + + public: + ComprDataIO(); + virtual ~ComprDataIO() {} + void Init(); + virtual int UnpRead(byte *Addr,size_t Count); + virtual void UnpWrite(byte *Addr,size_t Count); + void EnableShowProgress(bool Show) {Progress=Show;} + void GetUnpackedData(byte **Data,size_t *Size); + void SetPackedSizeToRead(int64 Size) {UnpPackedSize=Size;} + void SetTestMode(bool Mode) {TestMode=Mode;} + void SetSkipUnpCRC(bool Skip) {SkipUnpCRC=Skip;} + void SetFiles(File *SrcFile,File *DestFile); + void SetCommand(CmdAdd *Cmd) {Command=Cmd;} + void SetSubHeader(FileHeader *hd,int64 *Pos) {SubHead=hd;SubHeadPos=Pos;} + void SetEncryption(int Method,const char *Password,const byte *Salt,bool Encrypt,bool HandsOffHash); + void SetAV15Encryption(); + void SetCmt13Encryption(); + void SetUnpackToMemory(byte *Addr,uint Size); + void SetCurrentCommand(char Cmd) {CurrentCommand=Cmd;} + + bool PackVolume; + bool UnpVolume; + bool NextVolumeMissing; + int64 TotalPackRead; + int64 UnpArcSize; + int64 CurPackRead,CurPackWrite,CurUnpRead,CurUnpWrite; + + // Size of already processed archives. + // Used to calculate the total operation progress. + int64 ProcessedArcSize; + + int64 TotalArcSize; + + uint PackFileCRC,UnpFileCRC,PackedCRC; + + int Encryption; + int Decryption; +}; + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/recvol.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/recvol.hpp new file mode 100644 index 00000000..5a0abe58 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/recvol.hpp @@ -0,0 +1,16 @@ +#ifndef _RAR_RECVOL_ +#define _RAR_RECVOL_ + +class RecVolumes +{ + private: + File *SrcFile[256]; + Array<byte> Buf; + public: + RecVolumes(); + ~RecVolumes(); + void Make(RAROptions *Cmd,char *ArcName,wchar *ArcNameW); + bool Restore(RAROptions *Cmd,const char *Name,const wchar *NameW,bool Silent); +}; + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/resource.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/resource.hpp new file mode 100644 index 00000000..581b34b4 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/resource.hpp @@ -0,0 +1,14 @@ +#ifndef _RAR_RESOURCE_ +#define _RAR_RESOURCE_ + +#if defined(SILENT) && defined(RARDLL) +#define St(x) ("") +#else +const char *St(MSGID StringId); +#endif + + +inline const char *StT(MSGID StringId) {return(St(StringId));} + + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/rijndael.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/rijndael.hpp new file mode 100644 index 00000000..bb5bd881 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/rijndael.hpp @@ -0,0 +1,37 @@ +#ifndef _RIJNDAEL_H_ +#define _RIJNDAEL_H_ + +/************************************************************************** + * This code is based on Szymon Stefanek AES implementation: * + * http://www.esat.kuleuven.ac.be/~rijmen/rijndael/rijndael-cpplib.tar.gz * + * * + * Dynamic tables generation is based on the Brian Gladman's work: * + * http://fp.gladman.plus.com/cryptography_technology/rijndael * + **************************************************************************/ + +#define _MAX_KEY_COLUMNS (256/32) +#define _MAX_ROUNDS 14 +#define MAX_IV_SIZE 16 + +class Rijndael +{ + public: + enum Direction { Encrypt , Decrypt }; + private: + void keySched(byte key[_MAX_KEY_COLUMNS][4]); + void keyEncToDec(); + void encrypt(const byte a[16], byte b[16]); + void decrypt(const byte a[16], byte b[16]); + void GenerateTables(); + + Direction m_direction; + byte m_initVector[MAX_IV_SIZE]; + byte m_expandedKey[_MAX_ROUNDS+1][4][4]; + public: + Rijndael(); + void init(Direction dir,const byte *key,byte *initVector); + size_t blockEncrypt(const byte *input, size_t inputLen, byte *outBuffer); + size_t blockDecrypt(const byte *input, size_t inputLen, byte *outBuffer); +}; + +#endif // _RIJNDAEL_H_ diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/rs.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/rs.hpp new file mode 100644 index 00000000..2f099f00 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/rs.hpp @@ -0,0 +1,32 @@ +#ifndef _RAR_RS_ +#define _RAR_RS_ + +#define MAXPAR 255 +#define MAXPOL 512 + +class RSCoder +{ + private: + void gfInit(); + int gfMult(int a,int b); + void pnInit(); + void pnMult(int *p1,int *p2,int *r); + + int gfExp[MAXPOL]; + int gfLog[MAXPAR+1]; + + int GXPol[MAXPOL*2]; + + int ErrorLocs[MAXPAR+1],ErrCount; + int Dn[MAXPAR+1]; + + int ParSize; + int PolB[MAXPOL]; + bool FirstBlockDone; + public: + RSCoder(int ParSize); + void Encode(byte *Data,int DataSize,byte *DestData); + bool Decode(byte *Data,int DataSize,int *EraLoc,int EraSize); +}; + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/savepos.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/savepos.hpp new file mode 100644 index 00000000..b3b23733 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/savepos.hpp @@ -0,0 +1,15 @@ +#ifndef _RAR_SAVEPOS_ +#define _RAR_SAVEPOS_ + +class SaveFilePos +{ + private: + File *SaveFile; + int64 SavePos; + uint CloseCount; + public: + SaveFilePos(File &SaveFile); + ~SaveFilePos(); +}; + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/scantree.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/scantree.hpp new file mode 100644 index 00000000..cf960bf2 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/scantree.hpp @@ -0,0 +1,60 @@ +#ifndef _RAR_SCANTREE_ +#define _RAR_SCANTREE_ + +enum SCAN_DIRS +{ + SCAN_SKIPDIRS, // Skip directories, but recurse for files if recursion mode is enabled. + SCAN_GETDIRS, // Get subdirectories in recurse mode. + SCAN_GETDIRSTWICE, // Get the directory name both before and after the list of files it contains. + SCAN_GETCURDIRS // Get subdirectories in current directory even in RECURSE_NONE mode. +}; + +enum SCAN_CODE { SCAN_SUCCESS,SCAN_DONE,SCAN_ERROR,SCAN_NEXT }; + +#define MAXSCANDEPTH (NM/2) + +class CommandData; + +class ScanTree +{ + private: + bool GetNextMask(); + SCAN_CODE FindProc(FindData *FindData); + + FindFile *FindStack[MAXSCANDEPTH]; + int Depth; + + int SetAllMaskDepth; + + StringList *FileMasks; + RECURSE_MODE Recurse; + bool GetLinks; + SCAN_DIRS GetDirs; + int Errors; + + // set when processing paths like c:\ (root directory without wildcards) + bool ScanEntireDisk; + + char CurMask[NM]; + wchar CurMaskW[NM]; + char OrigCurMask[NM]; + wchar OrigCurMaskW[NM]; + bool SearchAllInRoot; + size_t SpecPathLength; + size_t SpecPathLengthW; + + char ErrArcName[NM]; + + CommandData *Cmd; + public: + ScanTree(StringList *FileMasks,RECURSE_MODE Recurse,bool GetLinks,SCAN_DIRS GetDirs); + ~ScanTree(); + SCAN_CODE GetNext(FindData *FindData); + size_t GetSpecPathLength() {return(SpecPathLength);}; + size_t GetSpecPathLengthW() {return(SpecPathLengthW);}; + int GetErrors() {return(Errors);}; + void SetErrArcName(const char *Name) {strcpy(ErrArcName,Name);} + void SetCommandData(CommandData *Cmd) {ScanTree::Cmd=Cmd;} +}; + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/sha1.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/sha1.hpp new file mode 100644 index 00000000..27e15e7b --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/sha1.hpp @@ -0,0 +1,17 @@ +#ifndef _RAR_SHA1_ +#define _RAR_SHA1_ + +#define HW 5 + +typedef struct { + uint32 state[5]; + uint32 count[2]; + unsigned char buffer[64]; +} hash_context; + +void hash_initial( hash_context * c ); +void hash_process( hash_context * c, unsigned char * data, size_t len, + bool handsoff); +void hash_final( hash_context * c, uint32[HW], bool handsoff); + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/smallfn.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/smallfn.hpp new file mode 100644 index 00000000..f53daa8b --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/smallfn.hpp @@ -0,0 +1,8 @@ +#ifndef _RAR_SMALLFN_ +#define _RAR_SMALLFN_ + +int ToPercent(int64 N1,int64 N2); +int ToPercentUnlim(int64 N1,int64 N2); +void RARInitData(); + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/strfn.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/strfn.hpp new file mode 100644 index 00000000..0940bb29 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/strfn.hpp @@ -0,0 +1,41 @@ +#ifndef _RAR_STRFN_ +#define _RAR_STRFN_ + +const char *NullToEmpty(const char *Str); +const wchar *NullToEmpty(const wchar *Str); +char *IntNameToExt(const char *Name); +void ExtToInt(const char *Src,char *Dest); +void IntToExt(const char *Src,char *Dest); +char* strlower(char *Str); +char* strupper(char *Str); +int stricomp(const char *Str1,const char *Str2); +int strnicomp(const char *Str1,const char *Str2,size_t N); +char* RemoveEOL(char *Str); +char* RemoveLF(char *Str); +unsigned char loctolower(unsigned char ch); +unsigned char loctoupper(unsigned char ch); + +char* strncpyz(char *dest, const char *src, size_t maxlen); +wchar* strncpyzw(wchar *dest, const wchar *src, size_t maxlen); + +unsigned char etoupper(unsigned char ch); +wchar etoupperw(wchar ch); + +bool IsDigit(int ch); +bool IsSpace(int ch); + + + +bool LowAscii(const char *Str); +bool LowAscii(const wchar *Str); + + +int stricompc(const char *Str1,const char *Str2); +#ifndef SFX_MODULE +int stricompcw(const wchar *Str1,const wchar *Str2); +#endif + +void itoa(int64 n,char *Str); +int64 atoil(char *Str); + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/strlist.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/strlist.hpp new file mode 100644 index 00000000..1e4e7ca7 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/strlist.hpp @@ -0,0 +1,39 @@ +#ifndef _RAR_STRLIST_ +#define _RAR_STRLIST_ + +class StringList +{ + private: + Array<char> StringData; + size_t CurPos; + + Array<wchar> StringDataW; + size_t CurPosW; + + Array<size_t> PosDataW; + size_t PosDataItem; + + uint StringsCount; + + size_t SaveCurPos[16],SaveCurPosW[16],SavePosDataItem[16],SavePosNumber; + public: + StringList(); + ~StringList(); + void Reset(); + size_t AddString(const char *Str); + size_t AddString(const char *Str,const wchar *StrW); + bool GetString(char *Str,size_t MaxLength); + bool GetString(char *Str,wchar *StrW,size_t MaxLength); + bool GetString(char *Str,wchar *StrW,size_t MaxLength,int StringNum); + char* GetString(); + bool GetString(char **Str,wchar **StrW); + char* GetString(uint StringPos); + void Rewind(); + uint ItemsCount() {return(StringsCount);}; + size_t GetBufferSize(); + bool Search(char *Str,wchar *StrW,bool CaseSensitive); + void SavePosition(); + void RestorePosition(); +}; + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/suballoc.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/suballoc.hpp new file mode 100644 index 00000000..474ee592 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/suballoc.hpp @@ -0,0 +1,87 @@ +/**************************************************************************** + * This file is part of PPMd project * + * Written and distributed to public domain by Dmitry Shkarin 1997, * + * 1999-2000 * + * Contents: interface to memory allocation routines * + ****************************************************************************/ +#if !defined(_SUBALLOC_H_) +#define _SUBALLOC_H_ + +const int N1=4, N2=4, N3=4, N4=(128+3-1*N1-2*N2-3*N3)/4; +const int N_INDEXES=N1+N2+N3+N4; + +#if defined(__GNUC__) && !defined(STRICT_ALIGNMENT_REQUIRED) +#define _PACK_ATTR __attribute__ ((packed)) +#else +#define _PACK_ATTR +#endif /* defined(__GNUC__) */ + +#ifndef STRICT_ALIGNMENT_REQUIRED +#pragma pack(1) +#endif + +struct RAR_MEM_BLK +{ + ushort Stamp, NU; + RAR_MEM_BLK* next, * prev; + void insertAt(RAR_MEM_BLK* p) + { + next=(prev=p)->next; + p->next=next->prev=this; + } + void remove() + { + prev->next=next; + next->prev=prev; + } +} _PACK_ATTR; + +#ifndef STRICT_ALIGNMENT_REQUIRED +#ifdef _AIX +#pragma pack(pop) +#else +#pragma pack() +#endif +#endif + + +struct RAR_NODE +{ + RAR_NODE* next; +}; + +class SubAllocator +{ + private: + inline void InsertNode(void* p,int indx); + inline void* RemoveNode(int indx); + inline uint U2B(int NU); + inline void SplitBlock(void* pv,int OldIndx,int NewIndx); + uint GetUsedMemory(); + inline void GlueFreeBlocks(); + void* AllocUnitsRare(int indx); + inline RAR_MEM_BLK* MBPtr(RAR_MEM_BLK *BasePtr,int Items); + + long SubAllocatorSize; + byte Indx2Units[N_INDEXES], Units2Indx[128], GlueCount; + byte *HeapStart,*LoUnit, *HiUnit; + struct RAR_NODE FreeList[N_INDEXES]; + public: + SubAllocator(); + ~SubAllocator() {StopSubAllocator();} + void Clean(); + bool StartSubAllocator(int SASize); + void StopSubAllocator(); + void InitSubAllocator(); + inline void* AllocContext(); + inline void* AllocUnits(int NU); + inline void* ExpandUnits(void* ptr,int OldNU); + inline void* ShrinkUnits(void* ptr,int OldNU,int NewNU); + inline void FreeUnits(void* ptr,int OldNU); + long GetAllocatedMemory() {return(SubAllocatorSize);}; + + byte *pText, *UnitsStart,*HeapEnd,*FakeUnitsStart; +}; + + +#endif /* !defined(_SUBALLOC_H_) */ diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/system.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/system.hpp new file mode 100644 index 00000000..d98e5a22 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/system.hpp @@ -0,0 +1,26 @@ +#ifndef _RAR_SYSTEM_ +#define _RAR_SYSTEM_ + +#ifdef _WIN_32 +#ifndef BELOW_NORMAL_PRIORITY_CLASS +#define BELOW_NORMAL_PRIORITY_CLASS 0x00004000 +#define ABOVE_NORMAL_PRIORITY_CLASS 0x00008000 +#endif +#ifndef PROCESS_MODE_BACKGROUND_BEGIN +#define PROCESS_MODE_BACKGROUND_BEGIN 0x00100000 +#define PROCESS_MODE_BACKGROUND_END 0x00200000 +#endif +#ifndef SHTDN_REASON_MAJOR_APPLICATION +#define SHTDN_REASON_MAJOR_APPLICATION 0x00040000 +#define SHTDN_REASON_FLAG_PLANNED 0x80000000 +#define SHTDN_REASON_MINOR_MAINTENANCE 0x00000001 +#endif +#endif + +void InitSystemOptions(int SleepTime); +void SetPriority(int Priority); +void Wait(); +bool EmailFile(char *FileName,char *MailTo); +void Shutdown(); + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/timefn.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/timefn.hpp new file mode 100644 index 00000000..176b86b0 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/timefn.hpp @@ -0,0 +1,54 @@ +#ifndef _RAR_TIMEFN_ +#define _RAR_TIMEFN_ + +struct RarLocalTime +{ + uint Year; + uint Month; + uint Day; + uint Hour; + uint Minute; + uint Second; + uint Reminder; + uint wDay; + uint yDay; +}; + + +class RarTime +{ + private: + RarLocalTime rlt; + public: + RarTime(); +#ifdef _WIN_32 + RarTime& operator =(FILETIME &ft); + void GetWin32(FILETIME *ft); +#endif +#if defined(_UNIX) || defined(_EMX) + RarTime& operator =(time_t ut); + time_t GetUnix(); +#endif + bool operator == (RarTime &rt); + bool operator < (RarTime &rt); + bool operator <= (RarTime &rt); + bool operator > (RarTime &rt); + bool operator >= (RarTime &rt); + void GetLocal(RarLocalTime *lt) {*lt=rlt;} + void SetLocal(RarLocalTime *lt) {rlt=*lt;} + int64 GetRaw(); + void SetRaw(int64 RawTime); + uint GetDos(); + void SetDos(uint DosTime); + void GetText(char *DateStr,bool FullYear); + void SetIsoText(char *TimeText); + void SetAgeText(char *TimeText); + void SetCurrentTime(); + void Reset() {rlt.Year=0;} + bool IsSet() {return(rlt.Year!=0);} +}; + +const char *GetMonthName(int Month); +bool IsLeapYear(int Year); + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/ulinks.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/ulinks.hpp new file mode 100644 index 00000000..69b0e9f8 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/ulinks.hpp @@ -0,0 +1,9 @@ +#ifndef _RAR_ULINKS_ +#define _RAR_ULINKS_ + +void SaveLinkData(ComprDataIO &DataIO,Archive &TempArc,FileHeader &hd, + char *Name); +int ExtractLink(ComprDataIO &DataIO,Archive &Arc,char *DestName, + uint &LinkCRC,bool Create); + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/unicode.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/unicode.hpp new file mode 100644 index 00000000..9c087e8f --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/unicode.hpp @@ -0,0 +1,83 @@ +#ifndef _RAR_UNICODE_ +#define _RAR_UNICODE_ + +#ifndef _EMX +#define MBFUNCTIONS +#endif + +#if defined(MBFUNCTIONS) || defined(_WIN_32) || defined(_EMX) && !defined(_DJGPP) +#define UNICODE_SUPPORTED +#endif + +#ifdef _WIN_32 +#define DBCS_SUPPORTED +#endif + +#ifdef _EMX +int uni_init(int codepage); +int uni_done(); +#endif + +bool WideToChar(const wchar *Src,char *Dest,size_t DestSize=0x1000000); +bool CharToWide(const char *Src,wchar *Dest,size_t DestSize=0x1000000); +byte* WideToRaw(const wchar *Src,byte *Dest,size_t DestSize=0x1000000); +wchar* RawToWide(const byte *Src,wchar *Dest,size_t DestSize=0x1000000); +void WideToUtf(const wchar *Src,char *Dest,size_t DestSize); +void UtfToWide(const char *Src,wchar *Dest,size_t DestSize); +bool UnicodeEnabled(); + +size_t strlenw(const wchar *str); +wchar* strcpyw(wchar *dest,const wchar *src); +wchar* strncpyw(wchar *dest,const wchar *src,size_t n); +wchar* strcatw(wchar *dest,const wchar *src); +wchar* strncatw(wchar *dest,const wchar *src,size_t n); +int strcmpw(const wchar *s1,const wchar *s2); +int strncmpw(const wchar *s1,const wchar *s2,size_t n); +int stricmpw(const wchar *s1,const wchar *s2); +int strnicmpw(const wchar *s1,const wchar *s2,size_t n); +wchar *strchrw(const wchar *s,int c); +wchar* strrchrw(const wchar *s,int c); +wchar* strpbrkw(const wchar *s1,const wchar *s2); +wchar* strlowerw(wchar *Str); +wchar* strupperw(wchar *Str); +wchar* strdupw(const wchar *Str); +int toupperw(int ch); +int atoiw(const wchar *s); + +#ifdef DBCS_SUPPORTED +class SupportDBCS +{ + public: + SupportDBCS(); + void Init(); + + char* charnext(const char *s); + size_t strlend(const char *s); + char *strchrd(const char *s, int c); + char *strrchrd(const char *s, int c); + void copychrd(char *dest,const char *src); + + bool IsLeadByte[256]; + bool DBCSMode; +}; + +extern SupportDBCS gdbcs; + +inline char* charnext(const char *s) {return (char *)(gdbcs.DBCSMode ? gdbcs.charnext(s):s+1);} +inline size_t strlend(const char *s) {return (uint)(gdbcs.DBCSMode ? gdbcs.strlend(s):strlen(s));} +inline char* strchrd(const char *s, int c) {return (char *)(gdbcs.DBCSMode ? gdbcs.strchrd(s,c):strchr(s,c));} +inline char* strrchrd(const char *s, int c) {return (char *)(gdbcs.DBCSMode ? gdbcs.strrchrd(s,c):strrchr(s,c));} +inline void copychrd(char *dest,const char *src) {if (gdbcs.DBCSMode) gdbcs.copychrd(dest,src); else *dest=*src;} +inline bool IsDBCSMode() {return(gdbcs.DBCSMode);} +inline void InitDBCS() {gdbcs.Init();} + +#else +#define charnext(s) ((s)+1) +#define strlend strlen +#define strchrd strchr +#define strrchrd strrchr +#define IsDBCSMode() (true) +inline void copychrd(char *dest,const char *src) {*dest=*src;} +#endif + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/unpack.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/unpack.hpp new file mode 100644 index 00000000..329b5cff --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/unpack.hpp @@ -0,0 +1,221 @@ +#ifndef _RAR_UNPACK_ +#define _RAR_UNPACK_ + +enum BLOCK_TYPES {BLOCK_LZ,BLOCK_PPM}; + +struct Decode +{ + unsigned int MaxNum; + unsigned int DecodeLen[16]; + unsigned int DecodePos[16]; + unsigned int DecodeNum[2]; +}; + +struct LitDecode +{ + unsigned int MaxNum; + unsigned int DecodeLen[16]; + unsigned int DecodePos[16]; + unsigned int DecodeNum[NC]; +}; + +struct DistDecode +{ + unsigned int MaxNum; + unsigned int DecodeLen[16]; + unsigned int DecodePos[16]; + unsigned int DecodeNum[DC]; +}; + +struct LowDistDecode +{ + unsigned int MaxNum; + unsigned int DecodeLen[16]; + unsigned int DecodePos[16]; + unsigned int DecodeNum[LDC]; +}; + +struct RepDecode +{ + unsigned int MaxNum; + unsigned int DecodeLen[16]; + unsigned int DecodePos[16]; + unsigned int DecodeNum[RC]; +}; + +struct BitDecode +{ + unsigned int MaxNum; + unsigned int DecodeLen[16]; + unsigned int DecodePos[16]; + unsigned int DecodeNum[BC]; +}; + +struct UnpackFilter +{ + unsigned int BlockStart; + unsigned int BlockLength; + unsigned int ExecCount; + bool NextWindow; + + // position of parent filter in Filters array used as prototype for filter + // in PrgStack array. Not defined for filters in Filters array. + unsigned int ParentFilter; + + VM_PreparedProgram Prg; +}; + +/***************************** Unpack v 2.0 *********************************/ +struct MultDecode +{ + unsigned int MaxNum; + unsigned int DecodeLen[16]; + unsigned int DecodePos[16]; + unsigned int DecodeNum[MC20]; +}; + +struct AudioVariables +{ + int K1,K2,K3,K4,K5; + int D1,D2,D3,D4; + int LastDelta; + unsigned int Dif[11]; + unsigned int ByteCount; + int LastChar; +}; +/***************************** Unpack v 2.0 *********************************/ + + +class Unpack:private BitInput +{ + private: + friend class Pack; + + void Unpack29(bool Solid); + bool UnpReadBuf(); + void UnpWriteBuf(); + void ExecuteCode(VM_PreparedProgram *Prg); + void UnpWriteArea(unsigned int StartPtr,unsigned int EndPtr); + void UnpWriteData(byte *Data,size_t Size); + bool ReadTables(); + void MakeDecodeTables(unsigned char *LenTab,struct Decode *Dec,int Size); + int DecodeNumber(struct Decode *Dec); + void CopyString(); + inline void InsertOldDist(unsigned int Distance); + inline void InsertLastMatch(unsigned int Length,unsigned int Distance); + void UnpInitData(int Solid); + void CopyString(unsigned int Length,unsigned int Distance); + bool ReadEndOfBlock(); + bool ReadVMCode(); + bool ReadVMCodePPM(); + bool AddVMCode(unsigned int FirstByte,byte *Code,int CodeSize); + void InitFilters(); + + ComprDataIO *UnpIO; + ModelPPM PPM; + int PPMEscChar; + + RarVM VM; + + /* Filters code, one entry per filter */ + Array<UnpackFilter*> Filters; + + /* Filters stack, several entrances of same filter are possible */ + Array<UnpackFilter*> PrgStack; + + /* lengths of preceding blocks, one length per filter. Used to reduce + size required to write block length if lengths are repeating */ + Array<int> OldFilterLengths; + + int LastFilter; + + bool TablesRead; + struct LitDecode LD; + struct DistDecode DD; + struct LowDistDecode LDD; + struct RepDecode RD; + struct BitDecode BD; + + unsigned int OldDist[4],OldDistPtr; + unsigned int LastDist,LastLength; + + unsigned int UnpPtr,WrPtr; + + // Top border of read packed data. + int ReadTop; + + // Border to call UnpReadBuf. We use it instead of (ReadTop-C) + // for optimization reasons. Ensures that we have C bytes in buffer + // unless we are at the end of file. + int ReadBorder; + + unsigned char UnpOldTable[HUFF_TABLE_SIZE]; + + int UnpBlockType; + + byte *Window; + bool ExternalWindow; + + + int64 DestUnpSize; + + bool Suspended; + bool UnpAllBuf; + bool UnpSomeRead; + int64 WrittenFileSize; + bool FileExtracted; + + int PrevLowDist,LowDistRepCount; + +/***************************** Unpack v 1.5 *********************************/ + void Unpack15(bool Solid); + void ShortLZ(); + void LongLZ(); + void HuffDecode(); + void GetFlagsBuf(); + void OldUnpInitData(int Solid); + void InitHuff(); + void CorrHuff(unsigned int *CharSet,unsigned int *NumToPlace); + void OldCopyString(unsigned int Distance,unsigned int Length); + uint DecodeNum(uint Num,uint StartPos,uint *DecTab,uint *PosTab); + void OldUnpWriteBuf(); + + unsigned int ChSet[256],ChSetA[256],ChSetB[256],ChSetC[256]; + unsigned int Place[256],PlaceA[256],PlaceB[256],PlaceC[256]; + unsigned int NToPl[256],NToPlB[256],NToPlC[256]; + unsigned int FlagBuf,AvrPlc,AvrPlcB,AvrLn1,AvrLn2,AvrLn3; + int Buf60,NumHuf,StMode,LCount,FlagsCnt; + unsigned int Nhfb,Nlzb,MaxDist3; +/***************************** Unpack v 1.5 *********************************/ + +/***************************** Unpack v 2.0 *********************************/ + void Unpack20(bool Solid); + struct MultDecode MD[4]; + unsigned char UnpOldTable20[MC20*4]; + int UnpAudioBlock,UnpChannels,UnpCurChannel,UnpChannelDelta; + void CopyString20(unsigned int Length,unsigned int Distance); + bool ReadTables20(); + void UnpInitData20(int Solid); + void ReadLastTables(); + byte DecodeAudio(int Delta); + struct AudioVariables AudV[4]; +/***************************** Unpack v 2.0 *********************************/ + + public: + Unpack(ComprDataIO *DataIO); + ~Unpack(); + void Init(byte *Window=NULL); + void DoUnpack(int Method,bool Solid); + bool IsFileExtracted() {return(FileExtracted);} + void SetDestSize(int64 DestSize) {DestUnpSize=DestSize;FileExtracted=false;} + void SetSuspended(bool Suspended) {Unpack::Suspended=Suspended;} + + unsigned int GetChar() + { + if (InAddr>BitInput::MAX_SIZE-30) + UnpReadBuf(); + return(InBuf[InAddr++]); + } +}; + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/version.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/version.hpp new file mode 100644 index 00000000..bb96a923 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/version.hpp @@ -0,0 +1,6 @@ +#define RARVER_MAJOR 3 +#define RARVER_MINOR 91 +#define RARVER_BETA 0 +#define RARVER_DAY 12 +#define RARVER_MONTH 12 +#define RARVER_YEAR 2009 diff --git a/plugins/snes9x_gx/portlibs/include/libunrar/volume.hpp b/plugins/snes9x_gx/portlibs/include/libunrar/volume.hpp new file mode 100644 index 00000000..6bf4c9e7 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/libunrar/volume.hpp @@ -0,0 +1,11 @@ +#ifndef _RAR_VOLUME_ +#define _RAR_VOLUME_ + +void SplitArchive(Archive &Arc,FileHeader *fh,int64 *HeaderPos, + ComprDataIO *DataIO); +bool MergeArchive(Archive &Arc,ComprDataIO *DataIO,bool ShowFileName, + char Command); +void SetVolWrite(Archive &Dest,int64 VolSize); +bool AskNextVol(char *ArcName); + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/mupdf/fitz.h b/plugins/snes9x_gx/portlibs/include/mupdf/fitz.h new file mode 100644 index 00000000..caba61e4 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/mupdf/fitz.h @@ -0,0 +1,10 @@ +#ifndef _FITZ_H_ +#define _FITZ_H_ + +#include "fitz_base.h" +#include "fitz_stream.h" +#include "fitz_res.h" +#include "fitz_draw.h" + +#endif + diff --git a/plugins/snes9x_gx/portlibs/include/mupdf/fitz_base.h b/plugins/snes9x_gx/portlibs/include/mupdf/fitz_base.h new file mode 100644 index 00000000..9ef1cf46 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/mupdf/fitz_base.h @@ -0,0 +1,249 @@ +/* + * Include the basic standard libc headers. + */ + +#ifndef _FITZ_BASE_H_ +#define _FITZ_BASE_H_ + +#include <stdio.h> +#include <stdlib.h> +#include <stddef.h> +#include <string.h> +#include <assert.h> +#include <stdarg.h> + +#include <limits.h> /* INT_MIN, MAX ... */ +#include <float.h> /* DBL_EPSILON */ +#include <math.h> + +#include <errno.h> +#include <fcntl.h> /* O_RDONLY & co */ + +/* Stupid macros that don't exist everywhere */ + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +#ifndef M_SQRT2 +#define M_SQRT2 1.41421356237309504880 +#endif + +#ifdef _MSC_VER /* stupid stone-age compiler */ + +#include <io.h> + +extern int gettimeofday(struct timeval *tv, struct timezone *tz); + +#define restrict + +#define inline __inline + +#define __func__ __FUNCTION__ + +#define snprintf _snprintf + +#if _MSC_VER < 1500 +#define vsnprintf _vsnprintf +#endif + +#else /* C99 or close enough */ + +#include <unistd.h> + +#endif + +/* + * CPU detection and flags + */ + +#if defined(ARCH_X86) || defined(ARCH_X86_64) +# define HAVE_CPUDEP +# define HAVE_MMX (1<<0) +# define HAVE_MMXEXT (1<<1) +# define HAVE_SSE (1<<2) +# define HAVE_SSE2 (1<<3) +# define HAVE_SSE3 (1<<4) +# define HAVE_3DNOW (1<<5) +# define HAVE_AMD64 (1<<6) +#endif + +/* call this before using fitz */ +extern void fz_cpudetect(void); + +/* treat as constant! */ +extern unsigned fz_cpuflags; + +/* + * Base Fitz runtime. + */ + +#ifndef __printflike +#if __GNUC__ > 2 || __GNUC__ == 2 && __GNUC_MINOR__ >= 7 +#define __printflike(fmtarg, firstvararg) \ + __attribute__((__format__ (__printf__, fmtarg, firstvararg))) +#else +#define __printflike(fmtarg, firstvararg) +#endif +#endif + +#ifndef nil +#define nil ((void*)0) +#endif + +#ifndef offsetof +#define offsetof(s, m) (unsigned long)(&(((s*)0)->m)) +#endif + +#ifndef nelem +#define nelem(x) (sizeof(x)/sizeof((x)[0])) +#endif + +#ifndef ABS +#define ABS(x) ( (x) < 0 ? -(x) : (x) ) +#endif + +#ifndef MAX +#define MAX(a,b) ( (a) > (b) ? (a) : (b) ) +#endif + +#ifndef MIN +#define MIN(a,b) ( (a) < (b) ? (a) : (b) ) +#endif + +#ifndef CLAMP +#define CLAMP(x,a,b) ( (x) > (b) ? (b) : ( (x) < (a) ? (a) : (x) ) ) +#endif + +/* utf-8 encoding and decoding */ +int chartorune(int *rune, char *str); +int runetochar(char *str, int *rune); +int runelen(int c); + +/* useful string functions */ +extern char *fz_strsep(char **stringp, const char *delim); +extern int fz_strlcpy(char *dst, const char *src, int n); +extern int fz_strlcat(char *dst, const char *src, int n); + +/* getopt */ +extern int fz_getopt(int nargc, char * const * nargv, const char *ostr); +extern int fz_opterr, fz_optind, fz_optopt; +extern char *fz_optarg; + +/* memory allocation */ +void *fz_malloc(int n); +void *fz_realloc(void *p, int n); +void fz_free(void *p); +char *fz_strdup(char *s); + +/* + * Error handling. + */ + +typedef int fz_error; + +extern char fz_errorbuf[]; + +void fz_warn(char *fmt, ...) __printflike(1,2); +fz_error fz_throwimp(const char *file, int line, const char *func, char *fmt, ...) __printflike(4, 5); +fz_error fz_rethrowimp(fz_error cause, const char *file, int line, const char *func, char *fmt, ...) __printflike(5, 6); +fz_error fz_catchimp(fz_error cause, const char *file, int line, const char *func, char *fmt, ...) __printflike(5, 6); + +#define fz_throw(...) fz_throwimp(__FILE__, __LINE__, __func__, __VA_ARGS__) +#define fz_rethrow(cause, ...) fz_rethrowimp(cause, __FILE__, __LINE__, __func__, __VA_ARGS__) +#define fz_catch(cause, ...) fz_catchimp(cause, __FILE__, __LINE__, __func__, __VA_ARGS__) +#define fz_okay ((fz_error)0) + +/* + * Generic hash-table with fixed-length keys. + */ + +typedef struct fz_hashtable_s fz_hashtable; + +fz_hashtable * fz_newhash(int initialsize, int keylen); +void fz_debughash(fz_hashtable *table); +void fz_emptyhash(fz_hashtable *table); +void fz_drophash(fz_hashtable *table); + +void *fz_hashfind(fz_hashtable *table, void *key); +void fz_hashinsert(fz_hashtable *table, void *key, void *val); +void fz_hashremove(fz_hashtable *table, void *key); + +int fz_hashlen(fz_hashtable *table); +void *fz_hashgetkey(fz_hashtable *table, int idx); +void *fz_hashgetval(fz_hashtable *table, int idx); + +/* + * Math and geometry + */ + +/* multiply 8-bit fixpoint (0..1) so that 0*0==0 and 255*255==255 */ +#define fz_mul255(a,b) (((a) * ((b) + ((b) >> 7))) >> 8) + +typedef struct fz_matrix_s fz_matrix; +typedef struct fz_point_s fz_point; +typedef struct fz_rect_s fz_rect; +typedef struct fz_bbox_s fz_bbox; + +extern const fz_rect fz_unitrect; +extern const fz_rect fz_emptyrect; +extern const fz_rect fz_infiniterect; + +extern const fz_bbox fz_unitbbox; +extern const fz_bbox fz_emptybbox; +extern const fz_bbox fz_infinitebbox; + +#define fz_isemptyrect(r) ((r).x0 == (r).x1) +#define fz_isinfiniterect(r) ((r).x0 > (r).x1) + +/* + / a b 0 \ + | c d 0 | + \ e f 1 / +*/ +struct fz_matrix_s +{ + float a, b, c, d, e, f; +}; + +struct fz_point_s +{ + float x, y; +}; + +struct fz_rect_s +{ + float x0, y0; + float x1, y1; +}; + +struct fz_bbox_s +{ + int x0, y0; + int x1, y1; +}; + +void fz_invert3x3(float *dst, float *m); + +fz_matrix fz_concat(fz_matrix one, fz_matrix two); +fz_matrix fz_identity(void); +fz_matrix fz_scale(float sx, float sy); +fz_matrix fz_rotate(float theta); +fz_matrix fz_translate(float tx, float ty); +fz_matrix fz_invertmatrix(fz_matrix m); +int fz_isrectilinear(fz_matrix m); +float fz_matrixexpansion(fz_matrix m); + +fz_bbox fz_roundrect(fz_rect r); +fz_bbox fz_intersectbbox(fz_bbox a, fz_bbox b); +fz_bbox fz_unionbbox(fz_bbox a, fz_bbox b); + +fz_point fz_transformpoint(fz_matrix m, fz_point p); +fz_rect fz_transformrect(fz_matrix m, fz_rect r); + +#endif + diff --git a/plugins/snes9x_gx/portlibs/include/mupdf/fitz_draw.h b/plugins/snes9x_gx/portlibs/include/mupdf/fitz_draw.h new file mode 100644 index 00000000..673a9633 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/mupdf/fitz_draw.h @@ -0,0 +1,121 @@ +/* + * Draw device and the graphics library. + */ + +typedef struct fz_glyphcache_s fz_glyphcache; + +fz_glyphcache * fz_newglyphcache(void); +fz_pixmap * fz_renderftglyph(fz_font *font, int cid, fz_matrix trm); +fz_pixmap * fz_rendert3glyph(fz_font *font, int cid, fz_matrix trm); +fz_pixmap * fz_renderglyph(fz_glyphcache*, fz_font*, int, fz_matrix); +void fz_evictglyphcache(fz_glyphcache *); +void fz_freeglyphcache(fz_glyphcache *); + +fz_device *fz_newdrawdevice(fz_glyphcache *cache, fz_pixmap *dest); + +/* + * Scan converter + */ + +typedef struct fz_edge_s fz_edge; +typedef struct fz_gel_s fz_gel; +typedef struct fz_ael_s fz_ael; + +struct fz_edge_s +{ + int x, e, h, y; + int adjup, adjdown; + int xmove; + int xdir, ydir; /* -1 or +1 */ +}; + +struct fz_gel_s +{ + fz_bbox clip; + fz_bbox bbox; + int cap; + int len; + fz_edge *edges; +}; + +struct fz_ael_s +{ + int cap; + int len; + fz_edge **edges; +}; + +fz_gel * fz_newgel(void); +void fz_insertgel(fz_gel *gel, float x0, float y0, float x1, float y1); +fz_bbox fz_boundgel(fz_gel *gel); +void fz_resetgel(fz_gel *gel, fz_bbox clip); +void fz_sortgel(fz_gel *gel); +void fz_freegel(fz_gel *gel); + +fz_ael * fz_newael(void); +void fz_freeael(fz_ael *ael); + +fz_error fz_scanconvert(fz_gel *gel, fz_ael *ael, int eofill, + fz_bbox clip, fz_pixmap *pix, unsigned char *argb, int over); + +void fz_fillpath(fz_gel *gel, fz_path *path, fz_matrix ctm, float flatness); +void fz_strokepath(fz_gel *gel, fz_path *path, fz_strokestate *stroke, fz_matrix ctm, float flatness, float linewidth); +void fz_dashpath(fz_gel *gel, fz_path *path, fz_strokestate *stroke, fz_matrix ctm, float flatness, float linewidth); + +/* + * Function pointers -- they can be replaced by cpu-optimized versions + */ + +#define FZ_PSRC \ + unsigned char *src, int srcw, int srch +#define FZ_PDST \ + unsigned char *dst0, int dstw +#define FZ_PCTM \ + int u0, int v0, int fa, int fb, int fc, int fd, int w0, int h + +extern void fz_accelerate(void); + +extern void (*fz_duff_non)(unsigned char*,int,int,unsigned char*,int,int,int); +extern void (*fz_duff_nimcn)(unsigned char*,int,int,unsigned char*,int,int,unsigned char*,int,int,int); +extern void (*fz_duff_nimon)(unsigned char*,int,int,unsigned char*,int,int,unsigned char*,int,int,int); +extern void (*fz_duff_1o1)(unsigned char*,int,unsigned char*,int,int,int); +extern void (*fz_duff_4o4)(unsigned char*,int,unsigned char*,int,int,int); +extern void (*fz_duff_1i1c1)(unsigned char*,int,unsigned char*,int,unsigned char*,int,int,int); +extern void (*fz_duff_4i1c4)(unsigned char*,int,unsigned char*,int,unsigned char*,int,int,int); +extern void (*fz_duff_1i1o1)(unsigned char*,int,unsigned char*,int,unsigned char*,int,int,int); +extern void (*fz_duff_4i1o4)(unsigned char*,int,unsigned char*,int,unsigned char*,int,int,int); + +extern void (*fz_path_1c1)(unsigned char*,unsigned char,int,unsigned char*); +extern void (*fz_path_1o1)(unsigned char*,unsigned char,int,unsigned char*); +extern void (*fz_path_w4i1o4)(unsigned char*,unsigned char*,unsigned char,int,unsigned char*); + +extern void (*fz_text_1c1)(unsigned char*,int,unsigned char*,int,int,int); +extern void (*fz_text_1o1)(unsigned char*,int,unsigned char*,int,int,int); +extern void (*fz_text_w4i1o4)(unsigned char*,unsigned char*,int,unsigned char*,int,int,int); + +extern void (*fz_img_ncn)(FZ_PSRC, int sn, FZ_PDST, FZ_PCTM); +extern void (*fz_img_1c1)(FZ_PSRC, FZ_PDST, FZ_PCTM); +extern void (*fz_img_4c4)(FZ_PSRC, FZ_PDST, FZ_PCTM); +extern void (*fz_img_1o1)(FZ_PSRC, FZ_PDST, FZ_PCTM); +extern void (*fz_img_4o4)(FZ_PSRC, FZ_PDST, FZ_PCTM); +extern void (*fz_img_w4i1o4)(unsigned char*,FZ_PSRC,FZ_PDST,FZ_PCTM); + +extern void (*fz_decodetile)(fz_pixmap *pix, int skip, float *decode); +extern void (*fz_loadtile1)(unsigned char*, int sw, unsigned char*, int dw, int w, int h, int pad); +extern void (*fz_loadtile2)(unsigned char*, int sw, unsigned char*, int dw, int w, int h, int pad); +extern void (*fz_loadtile4)(unsigned char*, int sw, unsigned char*, int dw, int w, int h, int pad); +extern void (*fz_loadtile8)(unsigned char*, int sw, unsigned char*, int dw, int w, int h, int pad); +extern void (*fz_loadtile16)(unsigned char*, int sw, unsigned char*, int dw, int w, int h, int pad); + +extern void (*fz_srown)(unsigned char *src, unsigned char *dst, int w, int denom, int n); +extern void (*fz_srow1)(unsigned char *src, unsigned char *dst, int w, int denom); +extern void (*fz_srow2)(unsigned char *src, unsigned char *dst, int w, int denom); +extern void (*fz_srow4)(unsigned char *src, unsigned char *dst, int w, int denom); +extern void (*fz_srow5)(unsigned char *src, unsigned char *dst, int w, int denom); + +extern void (*fz_scoln)(unsigned char *src, unsigned char *dst, int w, int denom, int n); +extern void (*fz_scol1)(unsigned char *src, unsigned char *dst, int w, int denom); +extern void (*fz_scol2)(unsigned char *src, unsigned char *dst, int w, int denom); +extern void (*fz_scol4)(unsigned char *src, unsigned char *dst, int w, int denom); +extern void (*fz_scol5)(unsigned char *src, unsigned char *dst, int w, int denom); + diff --git a/plugins/snes9x_gx/portlibs/include/mupdf/fitz_res.h b/plugins/snes9x_gx/portlibs/include/mupdf/fitz_res.h new file mode 100644 index 00000000..6b16b8a4 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/mupdf/fitz_res.h @@ -0,0 +1,385 @@ +/* + * Resources and other graphics related objects. + */ + +typedef struct fz_pixmap_s fz_pixmap; +typedef struct fz_colorspace_s fz_colorspace; +typedef struct fz_path_s fz_path; +typedef struct fz_text_s fz_text; +typedef struct fz_font_s fz_font; +typedef struct fz_shade_s fz_shade; + +typedef struct fz_strokestate_s fz_strokestate; + +enum { FZ_MAXCOLORS = 32 }; + +typedef enum fz_blendkind_e +{ + /* PDF 1.4 -- standard separable */ + FZ_BNORMAL, + FZ_BMULTIPLY, + FZ_BSCREEN, + FZ_BOVERLAY, + FZ_BDARKEN, + FZ_BLIGHTEN, + FZ_BCOLORDODGE, + FZ_BCOLORBURN, + FZ_BHARDLIGHT, + FZ_BSOFTLIGHT, + FZ_BDIFFERENCE, + FZ_BEXCLUSION, + + /* PDF 1.4 -- standard non-separable */ + FZ_BHUE, + FZ_BSATURATION, + FZ_BCOLOR, + FZ_BLUMINOSITY +} fz_blendkind; + +/* +pixmaps have n components per pixel. the first is always alpha. +premultiplied alpha when rendering, but non-premultiplied for colorspace +conversions and rescaling. +*/ + +extern fz_colorspace *pdf_devicegray; +extern fz_colorspace *pdf_devicergb; +extern fz_colorspace *pdf_devicecmyk; +extern fz_colorspace *pdf_devicelab; +extern fz_colorspace *pdf_devicepattern; + +struct fz_pixmap_s +{ + int refs; + int x, y, w, h, n; + fz_colorspace *colorspace; + unsigned char *samples; +}; + +fz_pixmap * fz_newpixmapwithrect(fz_colorspace *, fz_bbox bbox); +fz_pixmap * fz_newpixmap(fz_colorspace *, int x, int y, int w, int h); +fz_pixmap *fz_keeppixmap(fz_pixmap *map); +void fz_droppixmap(fz_pixmap *map); + +void fz_debugpixmap(fz_pixmap *map, char *prefix); +void fz_clearpixmap(fz_pixmap *map, unsigned char value); + +fz_pixmap * fz_scalepixmap(fz_pixmap *src, int xdenom, int ydenom); + +/* + * The device interface. + */ + +typedef struct fz_device_s fz_device; + +struct fz_device_s +{ + void *user; + void (*freeuser)(void *); + + void (*fillpath)(void *, fz_path *, int evenodd, fz_matrix, fz_colorspace *, float *color, float alpha); + void (*strokepath)(void *, fz_path *, fz_strokestate *, fz_matrix, fz_colorspace *, float *color, float alpha); + void (*clippath)(void *, fz_path *, int evenodd, fz_matrix); + void (*clipstrokepath)(void *, fz_path *, fz_strokestate *, fz_matrix); + + void (*filltext)(void *, fz_text *, fz_matrix, fz_colorspace *, float *color, float alpha); + void (*stroketext)(void *, fz_text *, fz_strokestate *, fz_matrix, fz_colorspace *, float *color, float alpha); + void (*cliptext)(void *, fz_text *, fz_matrix, int accumulate); + void (*clipstroketext)(void *, fz_text *, fz_strokestate *, fz_matrix); + void (*ignoretext)(void *, fz_text *, fz_matrix); + + void (*fillshade)(void *, fz_shade *shd, fz_matrix ctm); + void (*fillimage)(void *, fz_pixmap *img, fz_matrix ctm); + void (*fillimagemask)(void *, fz_pixmap *img, fz_matrix ctm, fz_colorspace *, float *color, float alpha); + void (*clipimagemask)(void *, fz_pixmap *img, fz_matrix ctm); + + void (*popclip)(void *); +}; + +fz_device *fz_newdevice(void *user); +void fz_freedevice(fz_device *dev); + +fz_device *fz_newtracedevice(void); + +fz_device *fz_newbboxdevice(fz_bbox *bboxp); + +/* Text extraction device */ + +typedef struct fz_textspan_s fz_textspan; +typedef struct fz_textchar_s fz_textchar; + +struct fz_textchar_s +{ + int c; + fz_bbox bbox; +}; + +struct fz_textspan_s +{ + fz_font *font; + float size; + int len, cap; + fz_textchar *text; + fz_textspan *next; + int eol; +}; + +fz_textspan * fz_newtextspan(void); +void fz_freetextspan(fz_textspan *line); +void fz_debugtextspan(fz_textspan *line); +void fz_debugtextspanxml(fz_textspan *span); + +fz_device *fz_newtextdevice(fz_textspan *text); + +/* Display list device -- record and play back device commands. */ + +typedef struct fz_displaylist_s fz_displaylist; +typedef struct fz_displaynode_s fz_displaynode; + +typedef enum fz_displaycommand_e +{ + FZ_CMDFILLPATH, + FZ_CMDSTROKEPATH, + FZ_CMDCLIPPATH, + FZ_CMDCLIPSTROKEPATH, + FZ_CMDFILLTEXT, + FZ_CMDSTROKETEXT, + FZ_CMDCLIPTEXT, + FZ_CMDCLIPSTROKETEXT, + FZ_CMDIGNORETEXT, + FZ_CMDFILLSHADE, + FZ_CMDFILLIMAGE, + FZ_CMDFILLIMAGEMASK, + FZ_CMDCLIPIMAGEMASK, + FZ_CMDPOPCLIP, +} fz_displaycommand; + +struct fz_displaylist_s +{ + fz_displaynode *first; + fz_displaynode *last; +}; + +struct fz_displaynode_s +{ + fz_displaycommand cmd; + fz_displaynode *next; + union { + fz_path *path; + fz_text *text; + fz_shade *shade; + fz_pixmap *image; + } item; + fz_strokestate *stroke; + int flag; /* evenodd, accumulate, ... */ + fz_matrix ctm; + fz_colorspace *colorspace; + float alpha; + float color[FZ_MAXCOLORS]; +}; + +fz_displaylist *fz_newdisplaylist(void); +void fz_freedisplaylist(fz_displaylist *list); +fz_device *fz_newlistdevice(fz_displaylist *list); +void fz_executedisplaylist(fz_displaylist *list, fz_device *dev, fz_matrix ctm); + +/* + * Vector path buffer. + * It can be stroked and dashed, or be filled. + * It has a fill rule (nonzero or evenodd). + * + * When rendering, they are flattened, stroked and dashed straight + * into the Global Edge List. + */ + +typedef union fz_pathel_s fz_pathel; + +typedef enum fz_pathelkind_e +{ + FZ_MOVETO, + FZ_LINETO, + FZ_CURVETO, + FZ_CLOSEPATH +} fz_pathelkind; + +union fz_pathel_s +{ + fz_pathelkind k; + float v; +}; + +struct fz_strokestate_s +{ + int linecap; + int linejoin; + float linewidth; + float miterlimit; + float dashphase; + int dashlen; + float dashlist[32]; +}; + +struct fz_path_s +{ + int len, cap; + fz_pathel *els; +}; + +fz_path *fz_newpath(void); +void fz_moveto(fz_path*, float x, float y); +void fz_lineto(fz_path*, float x, float y); +void fz_curveto(fz_path*, float, float, float, float, float, float); +void fz_curvetov(fz_path*, float, float, float, float); +void fz_curvetoy(fz_path*, float, float, float, float); +void fz_closepath(fz_path*); +void fz_freepath(fz_path *path); + +fz_path *fz_clonepath(fz_path *old); + +fz_rect fz_boundpath(fz_path *path, fz_strokestate *stroke, fz_matrix ctm); +void fz_debugpath(fz_path *, int indent); + +/* + * Text buffer. + * + * The trm field contains the a, b, c and d coefficients. + * The e and f coefficients come from the individual elements, + * together they form the transform matrix for the glyph. + * + * Glyphs are referenced by glyph ID. + * The Unicode text equivalent is kept in a separate array + * with indexes into the glyph array. + */ + +typedef struct fz_textel_s fz_textel; + +struct fz_textel_s +{ + float x, y; + int gid; + int ucs; +}; + +struct fz_text_s +{ + fz_font *font; + fz_matrix trm; + int len, cap; + fz_textel *els; +}; + +fz_text * fz_newtext(fz_font *face); +void fz_addtext(fz_text *text, int gid, int ucs, float x, float y); +void fz_endtext(fz_text *text); +void fz_freetext(fz_text *text); +void fz_debugtext(fz_text*, int indent); +fz_rect fz_boundtext(fz_text *text, fz_matrix ctm); +fz_text *fz_clonetext(fz_text *old); + +/* + * Colorspace resources. + * + * TODO: use lcms + */ + +struct fz_colorspace_s +{ + int refs; + char name[16]; + int n; + void (*convpixmap)(fz_colorspace *ss, fz_pixmap *sp, fz_colorspace *ds, fz_pixmap *dp); + void (*convcolor)(fz_colorspace *ss, float *sv, fz_colorspace *ds, float *dv); + void (*toxyz)(fz_colorspace *, float *src, float *xyz); + void (*fromxyz)(fz_colorspace *, float *xyz, float *dst); + void (*freefunc)(fz_colorspace *); +}; + +fz_colorspace *fz_keepcolorspace(fz_colorspace *cs); +void fz_dropcolorspace(fz_colorspace *cs); + +void fz_convertcolor(fz_colorspace *srcs, float *srcv, fz_colorspace *dsts, float *dstv); +void fz_convertpixmap(fz_colorspace *srcs, fz_pixmap *srcv, fz_colorspace *dsts, fz_pixmap *dstv); + +void fz_stdconvcolor(fz_colorspace *srcs, float *srcv, fz_colorspace *dsts, float *dstv); +void fz_stdconvpixmap(fz_colorspace *srcs, fz_pixmap *srcv, fz_colorspace *dsts, fz_pixmap *dstv); + +/* + * Fonts. + * + * Fonts come in three variants: + * Regular fonts are handled by FreeType. + * Type 3 fonts have callbacks to the interpreter. + * Substitute fonts are a thin wrapper over a regular font that adjusts metrics. + */ + +char *ft_errorstring(int err); + +struct fz_font_s +{ + int refs; + char name[32]; + + void *ftface; /* has an FT_Face if used */ + int ftsubstitute; /* ... substitute metrics */ + int fthint; /* ... force hinting for DynaLab fonts */ + + fz_matrix t3matrix; + fz_obj *t3resources; + fz_buffer **t3procs; /* has 256 entries if used */ + float *t3widths; /* has 256 entries if used */ + void *t3xref; /* a pdf_xref for the callback */ + fz_error (*t3runcontentstream)(fz_device *dev, fz_matrix ctm, + struct pdf_xref_s *xref, fz_obj *resources, fz_buffer *contents); + + fz_rect bbox; + + /* substitute metrics */ + int widthcount; + int *widthtable; +}; + +fz_error fz_newfreetypefont(fz_font **fontp, char *name, int substitute); +fz_error fz_loadfreetypefontfile(fz_font *font, char *path, int index); +fz_error fz_loadfreetypefontbuffer(fz_font *font, unsigned char *data, int len, int index); +fz_font * fz_newtype3font(char *name, fz_matrix matrix); + +fz_error fz_newfontfrombuffer(fz_font **fontp, unsigned char *data, int len, int index); +fz_error fz_newfontfromfile(fz_font **fontp, char *path, int index); + +fz_font * fz_keepfont(fz_font *font); +void fz_dropfont(fz_font *font); + +void fz_debugfont(fz_font *font); +void fz_setfontbbox(fz_font *font, float xmin, float ymin, float xmax, float ymax); + +/* + * The shading code is in rough shape but the general architecture is sound. + */ + +struct fz_shade_s +{ + int refs; + + fz_rect bbox; /* can be fz_infiniterect */ + fz_colorspace *cs; + + fz_matrix matrix; /* matrix from pattern dict */ + int usebackground; /* background color for fills but not 'sh' */ + float background[FZ_MAXCOLORS]; + + int usefunction; + float function[256][FZ_MAXCOLORS]; + + int meshlen; + int meshcap; + float *mesh; /* [x y t] or [x y c1 ... cn] * 3 * meshlen */ +}; + + +fz_shade *fz_keepshade(fz_shade *shade); +void fz_dropshade(fz_shade *shade); +void fz_debugshade(fz_shade *shade); + +fz_rect fz_boundshade(fz_shade *shade, fz_matrix ctm); +void fz_rendershade(fz_shade *shade, fz_matrix ctm, fz_pixmap *dst); + diff --git a/plugins/snes9x_gx/portlibs/include/mupdf/fitz_stream.h b/plugins/snes9x_gx/portlibs/include/mupdf/fitz_stream.h new file mode 100644 index 00000000..8689677e --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/mupdf/fitz_stream.h @@ -0,0 +1,401 @@ +/* + * Dynamic objects. + * The same type of objects as found in PDF and PostScript. + * Used by the filter library and the mupdf parser. + */ + +#ifndef _FITZ_STREAM_H_ +#define _FITZ_STREAM_H_ + +typedef struct fz_obj_s fz_obj; +typedef struct fz_keyval_s fz_keyval; + +typedef enum fz_objkind_e +{ + FZ_NULL, + FZ_BOOL, + FZ_INT, + FZ_REAL, + FZ_STRING, + FZ_NAME, + FZ_ARRAY, + FZ_DICT, + FZ_INDIRECT +} fz_objkind; + +struct fz_keyval_s +{ + fz_obj *k; + fz_obj *v; +}; + +struct fz_obj_s +{ + int refs; + fz_objkind kind; + union + { + int b; + int i; + float f; + struct { + unsigned short len; + char buf[1]; + } s; + char n[1]; + struct { + int len; + int cap; + fz_obj **items; + } a; + struct { + char sorted; + int len; + int cap; + fz_keyval *items; + } d; + struct { + int num; + int gen; + struct pdf_xref_s *xref; + fz_obj *obj; + } r; + } u; +}; + +fz_obj * fz_newnull(void); +fz_obj * fz_newbool(int b); +fz_obj * fz_newint(int i); +fz_obj * fz_newreal(float f); +fz_obj * fz_newname(char *str); +fz_obj * fz_newstring(char *str, int len); +fz_obj * fz_newindirect(int num, int gen, struct pdf_xref_s *xref); + +fz_obj * fz_newarray(int initialcap); +fz_obj * fz_newdict(int initialcap); +fz_obj * fz_copyarray(fz_obj *array); +fz_obj * fz_copydict(fz_obj *dict); + +fz_obj *fz_keepobj(fz_obj *obj); +void fz_dropobj(fz_obj *obj); + +/* type queries */ +int fz_isnull(fz_obj *obj); +int fz_isbool(fz_obj *obj); +int fz_isint(fz_obj *obj); +int fz_isreal(fz_obj *obj); +int fz_isname(fz_obj *obj); +int fz_isstring(fz_obj *obj); +int fz_isarray(fz_obj *obj); +int fz_isdict(fz_obj *obj); +int fz_isindirect(fz_obj *obj); + +int fz_objcmp(fz_obj *a, fz_obj *b); + +fz_obj *fz_resolveindirect(fz_obj *obj); + +/* silent failure, no error reporting */ +int fz_tobool(fz_obj *obj); +int fz_toint(fz_obj *obj); +float fz_toreal(fz_obj *obj); +char *fz_toname(fz_obj *obj); +char *fz_tostrbuf(fz_obj *obj); +int fz_tostrlen(fz_obj *obj); +int fz_tonum(fz_obj *obj); +int fz_togen(fz_obj *obj); + +int fz_arraylen(fz_obj *array); +fz_obj *fz_arrayget(fz_obj *array, int i); +void fz_arrayput(fz_obj *array, int i, fz_obj *obj); +void fz_arraypush(fz_obj *array, fz_obj *obj); + +int fz_dictlen(fz_obj *dict); +fz_obj *fz_dictgetkey(fz_obj *dict, int idx); +fz_obj *fz_dictgetval(fz_obj *dict, int idx); +fz_obj *fz_dictget(fz_obj *dict, fz_obj *key); +fz_obj *fz_dictgets(fz_obj *dict, char *key); +fz_obj *fz_dictgetsa(fz_obj *dict, char *key, char *abbrev); +void fz_dictput(fz_obj *dict, fz_obj *key, fz_obj *val); +void fz_dictputs(fz_obj *dict, char *key, fz_obj *val); +void fz_dictdel(fz_obj *dict, fz_obj *key); +void fz_dictdels(fz_obj *dict, char *key); +void fz_sortdict(fz_obj *dict); + +int fz_sprintobj(char *s, int n, fz_obj *obj, int tight); +int fz_fprintobj(FILE *fp, fz_obj *obj, int tight); +void fz_debugobj(fz_obj *obj); + +char *fz_objkindstr(fz_obj *obj); + +/* + * Data buffers for streams and filters. + * + * bp is the pointer to the allocated memory + * rp is read-position (*in->rp++ to read data) + * wp is write-position (*out->wp++ to write data) + * ep is the sentinel + * + * Only the data between rp and wp is valid data. + * + * Writers set eof to true at the end. + * Readers look at eof. + * + * A buffer owns the memory it has allocated, unless ownsdata is false, + * in which case the creator of the buffer owns it. + */ + +typedef struct fz_buffer_s fz_buffer; + +#define FZ_BUFSIZE (8 * 1024) + +struct fz_buffer_s +{ + int refs; + int ownsdata; + unsigned char *bp; + unsigned char *rp; + unsigned char *wp; + unsigned char *ep; + int eof; +}; + +fz_buffer * fz_newbuffer(int size); +fz_buffer * fz_newbufferwithmemory(unsigned char *data, int size); + +void fz_rewindbuffer(fz_buffer *buf); +void fz_growbuffer(fz_buffer *buf); + +fz_buffer *fz_keepbuffer(fz_buffer *buf); +void fz_dropbuffer(fz_buffer *buf); + +/* + * Data filters for encryption, compression and decompression. + * + * A filter has one method, process, that takes an input and an output buffer. + * + * It returns one of three statuses: + * ioneedin -- input buffer exhausted, please give me more data (wp-rp) + * ioneedout -- output buffer exhausted, please provide more space (ep-wp) + * iodone -- finished, please never call me again. ever! + * or... + * any other error code -- oops, something blew up. + * + * To make using the filter easier, three variables are updated: + * produced -- if we actually produced any new data + * consumed -- like above + * count -- number of bytes produced in total since the beginning + * done -- remember if we've ever returned fz_iodone + * + * Most filters take fz_obj as a way to specify parameters. + * In most cases, this is a dictionary that contains the same keys + * that the corresponding PDF filter would expect. + * + * The pipeline filter is special, and needs some care when chaining + * and unchaining new filters. + */ + +typedef struct fz_filter_s fz_filter; + +#define fz_ioneedin ((fz_error)1) +#define fz_ioneedout ((fz_error)2) +#define fz_iodone ((fz_error)3) + +/* + * Evil looking macro to create an initialize a filter struct. + */ + +#define FZ_NEWFILTER(TYPE,VAR,NAME) \ + fz_error fz_process ## NAME (fz_filter*,fz_buffer*,fz_buffer*); \ + void fz_drop ## NAME (fz_filter*); \ + TYPE *VAR; \ + VAR = fz_malloc(sizeof(TYPE)); \ + ((fz_filter*)VAR)->refs = 1; \ + ((fz_filter*)VAR)->process = fz_process ## NAME ; \ + ((fz_filter*)VAR)->drop = fz_drop ## NAME ; \ + ((fz_filter*)VAR)->consumed = 0; \ + ((fz_filter*)VAR)->produced = 0; \ + ((fz_filter*)VAR)->count = 0; \ + ((fz_filter*)VAR)->done = 0; + +struct fz_filter_s +{ + int refs; + fz_error (*process)(fz_filter *filter, fz_buffer *in, fz_buffer *out); + void (*drop)(fz_filter *filter); + int consumed; + int produced; + int count; + int done; +}; + +fz_error fz_process(fz_filter *f, fz_buffer *in, fz_buffer *out); +fz_filter *fz_keepfilter(fz_filter *f); +void fz_dropfilter(fz_filter *f); + +fz_filter * fz_newpipeline(fz_filter *head, fz_filter *tail); +fz_filter * fz_chainpipeline(fz_filter *head, fz_filter *tail, fz_buffer *buf); +void fz_unchainpipeline(fz_filter *pipe, fz_filter **oldfp, fz_buffer **oldbp); + +/* stop and reverse! special case needed for postscript only */ +void fz_pushbackahxd(fz_filter *filter, fz_buffer *in, fz_buffer *out, int n); + +fz_filter * fz_newnullfilter(int len); +fz_filter * fz_newcopyfilter(); +fz_filter * fz_newarc4filter(unsigned char *key, unsigned keylen); +fz_filter * fz_newaesdfilter(unsigned char *key, unsigned keylen); +fz_filter * fz_newa85d(fz_obj *param); +fz_filter * fz_newahxd(fz_obj *param); +fz_filter * fz_newrld(fz_obj *param); +fz_filter * fz_newdctd(fz_obj *param); +fz_filter * fz_newfaxd(fz_obj *param); +fz_filter * fz_newflated(fz_obj *param); +fz_filter * fz_newlzwd(fz_obj *param); +fz_filter * fz_newpredictd(fz_obj *param); +fz_filter * fz_newjbig2d(fz_obj *param); +fz_filter * fz_newjpxd(fz_obj *param); + +fz_error fz_setjbig2dglobalstream(fz_filter *filter, unsigned char *buf, int len); + +/* + * Basic crypto functions. + * Independent of the rest of fitz. + * For further encapsulation in filters, or not. + */ + +/* md5 digests */ + +typedef struct fz_md5_s fz_md5; + +struct fz_md5_s +{ + unsigned int state[4]; + unsigned int count[2]; + unsigned char buffer[64]; +}; + +void fz_md5init(fz_md5 *state); +void fz_md5update(fz_md5 *state, const unsigned char *input, const unsigned inlen); +void fz_md5final(fz_md5 *state, unsigned char digest[16]); + +/* arc4 crypto */ + +typedef struct fz_arc4_s fz_arc4; + +struct fz_arc4_s +{ + unsigned x; + unsigned y; + unsigned char state[256]; +}; + +void fz_arc4init(fz_arc4 *state, const unsigned char *key, const unsigned len); +unsigned char fz_arc4next(fz_arc4 *state); +void fz_arc4encrypt(fz_arc4 *state, unsigned char *dest, const unsigned char *src, const unsigned len); + +/* AES block cipher implementation from XYSSL */ + +#define AES_DECRYPT 0 +#define AES_ENCRYPT 1 + +struct fz_aes_s +{ + int nr; /* number of rounds */ + unsigned long *rk; /* AES round keys */ + unsigned long buf[68]; /* unaligned data */ +}; + +typedef struct fz_aes_s fz_aes; + +void aes_setkey_enc( fz_aes *ctx, const unsigned char *key, int keysize ); +void aes_setkey_dec( fz_aes *ctx, const unsigned char *key, int keysize ); +void aes_crypt_cbc( fz_aes *ctx, int mode, int length, + unsigned char iv[16], + const unsigned char *input, + unsigned char *output ); + +/* + * Stream API for Fitz. + * Read and write data to and from files, memory buffers and filters. + */ + +typedef struct fz_stream_s fz_stream; + +enum { FZ_SFILE, FZ_SBUFFER, FZ_SFILTER }; + +struct fz_stream_s +{ + int refs; + int kind; + int dead; + fz_buffer *buffer; + fz_filter *filter; + fz_stream *chain; + fz_error error; /* delayed error from readbyte and peekbyte */ + int file; +}; + +/* + * Various stream creation functions. + */ + +fz_stream * fz_openfile(int file); +fz_stream * fz_openmemory(unsigned char *mem, int len); +fz_stream * fz_openbuffer(fz_buffer *buf); +fz_stream * fz_openfilter(fz_filter *flt, fz_stream *chain); + +/* + * Functions that are common to both input and output streams. + */ + +fz_stream *fz_keepstream(fz_stream *stm); +void fz_dropstream(fz_stream *stm); + +int fz_tell(fz_stream *stm); +fz_error fz_seek(fz_stream *stm, int offset, int whence); + +/* + * Input stream functions. + */ + +fz_error fz_readimp(fz_stream *stm); +fz_error fz_read(int *np, fz_stream *stm, unsigned char *buf, int len); +fz_error fz_readline(fz_stream *stm, char *buf, int max); +fz_buffer * fz_readall(fz_stream *stm, int sizehint); + +/* + * Error handling when reading with readbyte/peekbyte is non-standard. + * The cause of an error is stuck into the stream struct, + * and EOF is returned. Not good, but any other way is too painful. + * So we have to be careful to check the error status eventually. + */ + +fz_error fz_readerror(fz_stream *stm); +int fz_readbytex(fz_stream *stm); +int fz_peekbytex(fz_stream *stm); + +#ifdef DEBUG + +#define fz_readbyte fz_readbytex +#define fz_peekbyte fz_peekbytex + +#else + +static inline int fz_readbyte(fz_stream *stm) +{ + fz_buffer *buf = stm->buffer; + if (buf->rp < buf->wp) + return *buf->rp++; + return fz_readbytex(stm); +} + +static inline int fz_peekbyte(fz_stream *stm) +{ + fz_buffer *buf = stm->buffer; + if (buf->rp < buf->wp) + return *buf->rp; + return fz_peekbytex(stm); +} + +#endif + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/mupdf/mupdf.h b/plugins/snes9x_gx/portlibs/include/mupdf/mupdf.h new file mode 100644 index 00000000..30c329f2 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/mupdf/mupdf.h @@ -0,0 +1,680 @@ +#ifndef _MUPDF_H_ +#define _MUPDF_H_ + +#ifndef _FITZ_H_ +#error "fitz.h must be included before mupdf.h" +#endif + +typedef struct pdf_xref_s pdf_xref; + +void pdf_logxref(char *fmt, ...); +void pdf_logrsrc(char *fmt, ...); +void pdf_logfont(char *fmt, ...); +void pdf_logimage(char *fmt, ...); +void pdf_logshade(char *fmt, ...); +void pdf_logpage(char *fmt, ...); + +/* + * tokenizer and low-level object parser + */ + +typedef enum pdf_token_e +{ + PDF_TERROR, PDF_TEOF, + PDF_TOARRAY, PDF_TCARRAY, + PDF_TODICT, PDF_TCDICT, + PDF_TOBRACE, PDF_TCBRACE, + PDF_TNAME, PDF_TINT, PDF_TREAL, PDF_TSTRING, PDF_TKEYWORD, + PDF_TR, PDF_TTRUE, PDF_TFALSE, PDF_TNULL, + PDF_TOBJ, PDF_TENDOBJ, + PDF_TSTREAM, PDF_TENDSTREAM, + PDF_TXREF, PDF_TTRAILER, PDF_TSTARTXREF, + PDF_NTOKENS +} pdf_token_e; + +/* lex.c */ +fz_error pdf_lex(pdf_token_e *tok, fz_stream *f, char *buf, int n, int *len); + +/* parse.c */ +fz_error pdf_parsearray(fz_obj **op, pdf_xref *xref, fz_stream *f, char *buf, int cap); +fz_error pdf_parsedict(fz_obj **op, pdf_xref *xref, fz_stream *f, char *buf, int cap); +fz_error pdf_parsestmobj(fz_obj **op, pdf_xref *xref, fz_stream *f, char *buf, int cap); +fz_error pdf_parseindobj(fz_obj **op, pdf_xref *xref, fz_stream *f, char *buf, int cap, int *oid, int *gen, int *stmofs); + +fz_rect pdf_torect(fz_obj *array); +fz_matrix pdf_tomatrix(fz_obj *array); +char * pdf_toutf8(fz_obj *src); +unsigned short * pdf_toucs2(fz_obj *src); + +/* + * Encryption + */ + +/* Permission flag bits */ +#define PDF_PERM_PRINT (1<<2) +#define PDF_PERM_CHANGE (1<<3) +#define PDF_PERM_COPY (1<<4) +#define PDF_PERM_NOTES (1<<5) +#define PDF_PERM_FILL_FORM (1<<8) +#define PDF_PERM_ACCESSIBILITY (1<<9) +#define PDF_PERM_ASSEMBLE (1<<10) +#define PDF_PERM_HIGH_RES_PRINT (1<<11) +#define PDF_DEFAULT_PERM_FLAGS 0xfffc + +enum pdf_cryptmethod_e +{ + PDF_CRYPT_NONE, + PDF_CRYPT_RC4, + PDF_CRYPT_AESV2, + PDF_CRYPT_UNKNOWN, +}; +typedef enum pdf_cryptmethod_e pdf_cryptmethod; + +struct pdf_cryptfilter_s +{ + pdf_cryptmethod method; + int length; + unsigned char key[16]; +}; +typedef struct pdf_cryptfilter_s pdf_cryptfilter; + +struct pdf_crypt_s +{ + unsigned char idstring[32]; + int idlength; + + int v; + int length; + fz_obj *cf; + pdf_cryptfilter stmf; + pdf_cryptfilter strf; + + int r; + unsigned char o[32]; + unsigned char u[32]; + int p; + int encryptmetadata; + + unsigned char key[32]; /* decryption key generated from password */ +}; +typedef struct pdf_crypt_s pdf_crypt; + +/* crypt.c */ +fz_error pdf_newcrypt(pdf_crypt **cp, fz_obj *enc, fz_obj *id); +void pdf_freecrypt(pdf_crypt *crypt); + +fz_error pdf_parsecryptfilter(pdf_cryptfilter *cf, fz_obj *dict, int defaultlength); +fz_filter * pdf_cryptstream(pdf_crypt *crypt, pdf_cryptfilter *cf, int num, int gen); +void pdf_cryptobj(pdf_crypt *crypt, fz_obj *obj, int num, int gen); + +int pdf_needspassword(pdf_xref *xref); +int pdf_authenticatepassword(pdf_xref *xref, char *pw); + +/* + * xref and object / stream api + */ + +typedef struct pdf_xrefentry_s pdf_xrefentry; + +struct pdf_xref_s +{ + fz_stream *file; + int version; + int startxref; + pdf_crypt *crypt; + fz_obj *trailer; + + int len; + int cap; + pdf_xrefentry *table; + + struct pdf_store_s *store; + struct pdf_outline_s *outlines; + + char scratch[65536]; +}; + +struct pdf_xrefentry_s +{ + int ofs; /* file offset / objstm object number */ + int gen; /* generation / objstm index */ + int stmofs; /* on-disk stream */ + fz_obj *obj; /* stored/cached object */ + int type; /* 0=unset (f)ree i(n)use (o)bjstm */ +}; + +pdf_xref * pdf_openxref(fz_stream *file); +void pdf_closexref(pdf_xref *); +void pdf_debugxref(pdf_xref *); +void pdf_flushxref(pdf_xref *, int force); + +fz_error pdf_cacheobject(pdf_xref *, int oid, int gen); +fz_error pdf_loadobject(fz_obj **objp, pdf_xref *, int oid, int gen); + +int pdf_isstream(pdf_xref *xref, int oid, int gen); +fz_filter * pdf_buildinlinefilter(pdf_xref *xref, fz_obj *stmobj); +fz_error pdf_loadrawstream(fz_buffer **bufp, pdf_xref *xref, int oid, int gen); +fz_error pdf_loadstream(fz_buffer **bufp, pdf_xref *xref, int oid, int gen); +fz_error pdf_openrawstream(fz_stream **stmp, pdf_xref *, int oid, int gen); +fz_error pdf_openstream(fz_stream **stmp, pdf_xref *, int oid, int gen); + +/* private */ +extern fz_error pdf_repairxref(pdf_xref *xref, char *buf, int bufsize); + +/* + * Resource store + */ + +typedef struct pdf_store_s pdf_store; + +typedef enum pdf_itemkind_e +{ + PDF_KCOLORSPACE, + PDF_KFUNCTION, + PDF_KXOBJECT, + PDF_KIMAGE, + PDF_KPATTERN, + PDF_KSHADE, + PDF_KCMAP, + PDF_KFONT +} pdf_itemkind; + +pdf_store * pdf_newstore(void); +void pdf_emptystore(pdf_store *store); +void pdf_dropstore(pdf_store *store); +void pdf_debugstore(pdf_store *store); + +void pdf_agestoreditems(pdf_store *store); +void pdf_evictageditems(pdf_store *store); + +void pdf_storeitem(pdf_store *store, pdf_itemkind tag, fz_obj *key, void *val); +void *pdf_finditem(pdf_store *store, pdf_itemkind tag, fz_obj *key); +void pdf_removeitem(pdf_store *store, pdf_itemkind tag, fz_obj *key); + +/* + * Functions + */ + +typedef struct pdf_function_s pdf_function; + +fz_error pdf_loadfunction(pdf_function **func, pdf_xref *xref, fz_obj *ref); +fz_error pdf_evalfunction(pdf_function *func, float *in, int inlen, float *out, int outlen); +pdf_function *pdf_keepfunction(pdf_function *func); +void pdf_dropfunction(pdf_function *func); + +/* + * ColorSpace + */ + +typedef struct pdf_indexed_s pdf_indexed; + +struct pdf_indexed_s +{ + fz_colorspace super; /* hmmm... */ + fz_colorspace *base; + int high; + unsigned char *lookup; +}; + +void pdf_convcolor(fz_colorspace *ss, float *sv, fz_colorspace *ds, float *dv); +void pdf_convpixmap(fz_colorspace *ss, fz_pixmap *sp, fz_colorspace *ds, fz_pixmap *dp); + +fz_error pdf_loadcolorspace(fz_colorspace **csp, pdf_xref *xref, fz_obj *obj); + +/* + * Pattern + */ + +typedef struct pdf_pattern_s pdf_pattern; + +struct pdf_pattern_s +{ + int refs; + int ismask; + float xstep; + float ystep; + fz_matrix matrix; + fz_rect bbox; + fz_obj *resources; + fz_buffer *contents; +}; + +fz_error pdf_loadpattern(pdf_pattern **patp, pdf_xref *xref, fz_obj *obj); +pdf_pattern *pdf_keeppattern(pdf_pattern *pat); +void pdf_droppattern(pdf_pattern *pat); + +/* + * Shading + */ + +fz_error pdf_loadshade(fz_shade **shadep, pdf_xref *xref, fz_obj *obj); + +/* + * XObject + */ + +typedef struct pdf_xobject_s pdf_xobject; + +struct pdf_xobject_s +{ + int refs; + fz_matrix matrix; + fz_rect bbox; + int isolated; + int knockout; + int transparency; + fz_obj *resources; + fz_buffer *contents; +}; + +fz_error pdf_loadxobject(pdf_xobject **xobjp, pdf_xref *xref, fz_obj *obj); +pdf_xobject *pdf_keepxobject(pdf_xobject *xobj); +void pdf_dropxobject(pdf_xobject *xobj); + +/* + * Image + */ + +typedef struct pdf_image_s pdf_image; + +struct pdf_image_s +{ + int refs; + int w, h, n, a; + fz_colorspace *cs; + pdf_image *mask; /* explicit mask with subimage */ + int usecolorkey; /* explicit color-keyed masking */ + int colorkey[FZ_MAXCOLORS * 2]; + pdf_indexed *indexed; + float decode[32]; + int bpc; + int stride; + fz_buffer *samples; +}; + +fz_error pdf_loadinlineimage(pdf_image **imgp, pdf_xref *xref, fz_obj *rdb, fz_obj *dict, fz_stream *file); +fz_error pdf_loadimage(pdf_image **imgp, pdf_xref *xref, fz_obj *obj); +fz_error pdf_loadtile(pdf_image *image, fz_pixmap *tile); +pdf_image *pdf_keepimage(pdf_image *img); +void pdf_dropimage(pdf_image *img); + +/* + * CMap + */ + +typedef struct pdf_cmap_s pdf_cmap; +typedef struct pdf_range_s pdf_range; + +enum { PDF_CMAP_SINGLE, PDF_CMAP_RANGE, PDF_CMAP_TABLE, PDF_CMAP_MULTI }; + +struct pdf_range_s +{ + unsigned short low; + unsigned short high; + unsigned short flag; /* single, range, table, multi */ + unsigned short offset; /* range-delta or table-index */ +}; + +struct pdf_cmap_s +{ + int refs; + char cmapname[32]; + + char usecmapname[32]; + pdf_cmap *usecmap; + + int wmode; + + int ncspace; + struct + { + unsigned short n; + unsigned short low; + unsigned short high; + } cspace[40]; + + int rlen, rcap; + pdf_range *ranges; + + int tlen, tcap; + unsigned short *table; +}; + +extern pdf_cmap *pdf_cmaptable[]; /* list of builtin system cmaps */ + +pdf_cmap *pdf_newcmap(void); +pdf_cmap *pdf_keepcmap(pdf_cmap *cmap); +void pdf_dropcmap(pdf_cmap *cmap); + +void pdf_debugcmap(pdf_cmap *cmap); +int pdf_getwmode(pdf_cmap *cmap); +pdf_cmap *pdf_getusecmap(pdf_cmap *cmap); +void pdf_setwmode(pdf_cmap *cmap, int wmode); +void pdf_setusecmap(pdf_cmap *cmap, pdf_cmap *usecmap); + +void pdf_addcodespace(pdf_cmap *cmap, int low, int high, int n); +void pdf_maprangetotable(pdf_cmap *cmap, int low, int *map, int len); +void pdf_maprangetorange(pdf_cmap *cmap, int srclo, int srchi, int dstlo); +void pdf_maponetomany(pdf_cmap *cmap, int one, int *many, int len); +void pdf_sortcmap(pdf_cmap *cmap); + +int pdf_lookupcmap(pdf_cmap *cmap, int cpt); +unsigned char *pdf_decodecmap(pdf_cmap *cmap, unsigned char *s, int *cpt); + +pdf_cmap * pdf_newidentitycmap(int wmode, int bytes); +fz_error pdf_parsecmap(pdf_cmap **cmapp, fz_stream *file); +fz_error pdf_loadembeddedcmap(pdf_cmap **cmapp, pdf_xref *xref, fz_obj *ref); +fz_error pdf_loadsystemcmap(pdf_cmap **cmapp, char *name); + +/* + * Font + */ + +void pdf_loadencoding(char **estrings, char *encoding); +int pdf_lookupagl(char *name); +char **pdf_lookupaglnames(int ucs); + +extern const unsigned short pdf_docencoding[256]; +extern const char * const pdf_macroman[256]; +extern const char * const pdf_macexpert[256]; +extern const char * const pdf_winansi[256]; +extern const char * const pdf_standard[256]; +extern const char * const pdf_expert[256]; +extern const char * const pdf_symbol[256]; +extern const char * const pdf_zapfdingbats[256]; + +typedef struct pdf_hmtx_s pdf_hmtx; +typedef struct pdf_vmtx_s pdf_vmtx; +typedef struct pdf_fontdesc_s pdf_fontdesc; + +struct pdf_hmtx_s +{ + unsigned short lo; + unsigned short hi; + int w; /* type3 fonts can be big! */ +}; + +struct pdf_vmtx_s +{ + unsigned short lo; + unsigned short hi; + short x; + short y; + short w; +}; + +struct pdf_fontdesc_s +{ + int refs; + + fz_font *font; + unsigned char *buffer; /* contains allocated memory that should be freed */ + + /* FontDescriptor */ + int flags; + float italicangle; + float ascent; + float descent; + float capheight; + float xheight; + float missingwidth; + + /* Encoding (CMap) */ + pdf_cmap *encoding; + pdf_cmap *tottfcmap; + int ncidtogid; + unsigned short *cidtogid; + + /* ToUnicode */ + pdf_cmap *tounicode; + int ncidtoucs; + unsigned short *cidtoucs; + + /* Metrics (given in the PDF file) */ + int wmode; + + int nhmtx, hmtxcap; + pdf_hmtx dhmtx; + pdf_hmtx *hmtx; + + int nvmtx, vmtxcap; + pdf_vmtx dvmtx; + pdf_vmtx *vmtx; + + int isembedded; +}; + +/* fontmtx.c */ +void pdf_setfontwmode(pdf_fontdesc *font, int wmode); +void pdf_setdefaulthmtx(pdf_fontdesc *font, int w); +void pdf_setdefaultvmtx(pdf_fontdesc *font, int y, int w); +void pdf_addhmtx(pdf_fontdesc *font, int lo, int hi, int w); +void pdf_addvmtx(pdf_fontdesc *font, int lo, int hi, int x, int y, int w); +void pdf_endhmtx(pdf_fontdesc *font); +void pdf_endvmtx(pdf_fontdesc *font); +pdf_hmtx pdf_gethmtx(pdf_fontdesc *font, int cid); +pdf_vmtx pdf_getvmtx(pdf_fontdesc *font, int cid); + +/* unicode.c */ +fz_error pdf_loadtounicode(pdf_fontdesc *font, pdf_xref *xref, char **strings, char *collection, fz_obj *cmapstm); + +/* fontfile.c */ +fz_error pdf_loadbuiltinfont(pdf_fontdesc *font, char *basefont); +fz_error pdf_loadembeddedfont(pdf_fontdesc *font, pdf_xref *xref, fz_obj *stmref); +fz_error pdf_loadsystemfont(pdf_fontdesc *font, char *basefont, char *collection); + +/* type3.c */ +fz_error pdf_loadtype3font(pdf_fontdesc **fontp, pdf_xref *xref, fz_obj *rdb, fz_obj *obj); + +/* font.c */ +int pdf_fontcidtogid(pdf_fontdesc *fontdesc, int cid); +fz_error pdf_loadfontdescriptor(pdf_fontdesc *font, pdf_xref *xref, fz_obj *desc, char *collection); +fz_error pdf_loadfont(pdf_fontdesc **fontp, pdf_xref *xref, fz_obj *rdb, fz_obj *obj); +pdf_fontdesc * pdf_newfontdesc(void); +pdf_fontdesc * pdf_keepfont(pdf_fontdesc *fontdesc); +void pdf_dropfont(pdf_fontdesc *font); +void pdf_debugfont(pdf_fontdesc *fontdesc); + +/* + * Interactive features + */ + +typedef struct pdf_link_s pdf_link; +typedef struct pdf_comment_s pdf_comment; +typedef struct pdf_widget_s pdf_widget; +typedef struct pdf_outline_s pdf_outline; + +typedef enum pdf_linkkind_e +{ + PDF_LGOTO = 0, + PDF_LURI, +} pdf_linkkind; + +struct pdf_link_s +{ + pdf_linkkind kind; + fz_rect rect; + fz_obj *dest; + pdf_link *next; +}; + +typedef enum pdf_commentkind_e +{ + PDF_CTEXT, + PDF_CFREETEXT, + PDF_CLINE, + PDF_CSQUARE, + PDF_CCIRCLE, + PDF_CPOLYGON, + PDF_CPOLYLINE, + PDF_CMARKUP, + PDF_CCARET, + PDF_CSTAMP, + PDF_CINK +} pdf_commentkind; + +struct pdf_comment_s +{ + pdf_commentkind kind; + fz_rect rect; + fz_rect popup; + fz_obj *contents; + pdf_comment *next; +}; + +struct pdf_outline_s +{ + char *title; + pdf_link *link; + int count; + pdf_outline *child; + pdf_outline *next; +}; + +fz_obj *pdf_lookupdest(pdf_xref *xref, fz_obj *nameddest); + +pdf_link *pdf_newlink(pdf_linkkind kind, fz_rect rect, fz_obj *dest); +pdf_link *pdf_loadlink(pdf_xref *xref, fz_obj *dict); +void pdf_droplink(pdf_link *link); + +pdf_outline *pdf_loadoutline(pdf_xref *xref); +void pdf_debugoutline(pdf_outline *outline, int level); +void pdf_dropoutline(pdf_outline *outline); + +void pdf_loadannots(pdf_comment **, pdf_link **, pdf_xref *, fz_obj *annots); + +/* + * Page tree, pages and related objects + */ + +typedef struct pdf_page_s pdf_page; + +struct pdf_page_s +{ + fz_rect mediabox; + int rotate; + fz_obj *resources; + fz_buffer *contents; + pdf_comment *comments; + pdf_link *links; +}; + +/* pagetree.c */ +int pdf_getpagecount(pdf_xref *xref); +fz_obj * pdf_getpageobject(pdf_xref *xref, int p); +int pdf_findpageobject(pdf_xref *xref, fz_obj *pageobj); + +/* page.c */ +fz_error pdf_loadpage(pdf_page **pagep, pdf_xref *xref, fz_obj *ref); +void pdf_droppage(pdf_page *page); + +/* + * content stream parsing + */ + +typedef struct pdf_material_s pdf_material; +typedef struct pdf_gstate_s pdf_gstate; +typedef struct pdf_csi_s pdf_csi; + +enum +{ + PDF_MFILL, + PDF_MSTROKE +}; + +enum +{ + PDF_MNONE, + PDF_MCOLOR, + PDF_MLAB, + PDF_MINDEXED, + PDF_MPATTERN, + PDF_MSHADE +}; + +struct pdf_material_s +{ + int kind; + fz_colorspace *cs; + pdf_indexed *indexed; + pdf_pattern *pattern; + fz_shade *shade; + float parentalpha; + float alpha; + float v[32]; +}; + +struct pdf_gstate_s +{ + fz_matrix ctm; + int clipdepth; + + /* path stroking */ + fz_strokestate strokestate; + + /* materials */ + pdf_material stroke; + pdf_material fill; + fz_blendkind blendmode; + + /* text state */ + float charspace; + float wordspace; + float scale; + float leading; + pdf_fontdesc *font; + float size; + int render; + float rise; +}; + +struct pdf_csi_s +{ + fz_device *dev; + pdf_xref *xref; + + fz_obj *stack[32]; + int top; + int xbalance; + fz_obj *array; + + /* path object state */ + fz_path *path; + int clip; + int clipevenodd; + + /* text object state */ + fz_text *text; + fz_matrix tlm; + fz_matrix tm; + int textmode; + int accumulate; + + /* graphics state */ + fz_matrix topctm; + pdf_gstate gstate[32]; + int gtop; +}; + +/* build.c */ +void pdf_initgstate(pdf_gstate *gs, fz_matrix ctm); +void pdf_setcolorspace(pdf_csi *csi, int what, fz_colorspace *cs); +void pdf_setcolor(pdf_csi *csi, int what, float *v); +void pdf_setpattern(pdf_csi *csi, int what, pdf_pattern *pat, float *v); +void pdf_setshade(pdf_csi *csi, int what, fz_shade *shade); +void pdf_showpath(pdf_csi*, int close, int fill, int stroke, int evenodd); +void pdf_showtext(pdf_csi*, fz_obj *text); +void pdf_flushtext(pdf_csi*); +void pdf_showimage(pdf_csi*, pdf_image *img); +void pdf_showshade(pdf_csi*, fz_shade *shd); + +/* interpret.c */ +void pdf_gsave(pdf_csi *csi); +void pdf_grestore(pdf_csi *csi); +fz_error pdf_runcsibuffer(pdf_csi *csi, fz_obj *rdb, fz_buffer *contents); +fz_error pdf_runcontentstream(fz_device *dev, fz_matrix ctm, pdf_xref *xref, fz_obj *resources, fz_buffer *contents); + +pdf_material * pdf_keepmaterial(pdf_material *mat); +pdf_material * pdf_dropmaterial(pdf_material *mat); + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/mupdf/pdftool.h b/plugins/snes9x_gx/portlibs/include/mupdf/pdftool.h new file mode 100644 index 00000000..0c48aac7 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/mupdf/pdftool.h @@ -0,0 +1,27 @@ +#ifndef PDF_TOOL_H_ +#define PDF_TOOL_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "fitz.h" +#include "mupdf.h" + +extern char *basename; +extern pdf_xref *xref; +extern int pagecount; + +void die(fz_error error); +void setcleanup(void (*cleanup)(void)); + +void openxref(char *filename, char *password, int dieonbadpass); +void flushxref(void); +void closexref(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/mxml.h b/plugins/snes9x_gx/portlibs/include/mxml.h new file mode 100644 index 00000000..a5d7ee6e --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/mxml.h @@ -0,0 +1,308 @@ +/* + * "$Id: mxml.h 385 2009-03-19 05:38:52Z mike $" + * + * Header file for Mini-XML, a small XML-like file parsing library. + * + * Copyright 2003-2009 by Michael Sweet. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/* + * Prevent multiple inclusion... + */ + +#ifndef _mxml_h_ +# define _mxml_h_ + +/* + * Include necessary headers... + */ + +# include <stdio.h> +# include <stdlib.h> +# include <string.h> +# include <ctype.h> +# include <errno.h> + + +/* + * Constants... + */ + +# define MXML_TAB 8 /* Tabs every N columns */ + +# define MXML_NO_CALLBACK 0 /* Don't use a type callback */ +# define MXML_INTEGER_CALLBACK mxml_integer_cb + /* Treat all data as integers */ +# define MXML_OPAQUE_CALLBACK mxml_opaque_cb + /* Treat all data as opaque */ +# define MXML_REAL_CALLBACK mxml_real_cb + /* Treat all data as real numbers */ +# define MXML_TEXT_CALLBACK 0 /* Treat all data as text */ +# define MXML_IGNORE_CALLBACK mxml_ignore_cb + /* Ignore all non-element content */ + +# define MXML_NO_PARENT 0 /* No parent for the node */ + +# define MXML_DESCEND 1 /* Descend when finding/walking */ +# define MXML_NO_DESCEND 0 /* Don't descend when finding/walking */ +# define MXML_DESCEND_FIRST -1 /* Descend for first find */ + +# define MXML_WS_BEFORE_OPEN 0 /* Callback for before open tag */ +# define MXML_WS_AFTER_OPEN 1 /* Callback for after open tag */ +# define MXML_WS_BEFORE_CLOSE 2 /* Callback for before close tag */ +# define MXML_WS_AFTER_CLOSE 3 /* Callback for after close tag */ + +# define MXML_ADD_BEFORE 0 /* Add node before specified node */ +# define MXML_ADD_AFTER 1 /* Add node after specified node */ +# define MXML_ADD_TO_PARENT NULL /* Add node relative to parent */ + + +/* + * Data types... + */ + +typedef enum mxml_sax_event_e /**** SAX event type. ****/ +{ + MXML_SAX_CDATA, /* CDATA node */ + MXML_SAX_COMMENT, /* Comment node */ + MXML_SAX_DATA, /* Data node */ + MXML_SAX_DIRECTIVE, /* Processing directive node */ + MXML_SAX_ELEMENT_CLOSE, /* Element closed */ + MXML_SAX_ELEMENT_OPEN /* Element opened */ +} mxml_sax_event_t; + +typedef enum mxml_type_e /**** The XML node type. ****/ +{ + MXML_IGNORE = -1, /* Ignore/throw away node @since Mini-XML 2.3@ */ + MXML_ELEMENT, /* XML element with attributes */ + MXML_INTEGER, /* Integer value */ + MXML_OPAQUE, /* Opaque string */ + MXML_REAL, /* Real value */ + MXML_TEXT, /* Text fragment */ + MXML_CUSTOM /* Custom data @since Mini-XML 2.1@ */ +} mxml_type_t; + +typedef void (*mxml_custom_destroy_cb_t)(void *); + /**** Custom data destructor ****/ + +typedef void (*mxml_error_cb_t)(const char *); + /**** Error callback function ****/ + +typedef struct mxml_attr_s /**** An XML element attribute value. ****/ +{ + char *name; /* Attribute name */ + char *value; /* Attribute value */ +} mxml_attr_t; + +typedef struct mxml_element_s /**** An XML element value. ****/ +{ + char *name; /* Name of element */ + int num_attrs; /* Number of attributes */ + mxml_attr_t *attrs; /* Attributes */ +} mxml_element_t; + +typedef struct mxml_text_s /**** An XML text value. ****/ +{ + int whitespace; /* Leading whitespace? */ + char *string; /* Fragment string */ +} mxml_text_t; + +typedef struct mxml_custom_s /**** An XML custom value. @since Mini-XML 2.1@ ****/ +{ + void *data; /* Pointer to (allocated) custom data */ + mxml_custom_destroy_cb_t destroy; /* Pointer to destructor function */ +} mxml_custom_t; + +typedef union mxml_value_u /**** An XML node value. ****/ +{ + mxml_element_t element; /* Element */ + int integer; /* Integer number */ + char *opaque; /* Opaque string */ + double real; /* Real number */ + mxml_text_t text; /* Text fragment */ + mxml_custom_t custom; /* Custom data @since Mini-XML 2.1@ */ +} mxml_value_t; + +typedef struct mxml_node_s /**** An XML node. ****/ +{ + mxml_type_t type; /* Node type */ + struct mxml_node_s *next; /* Next node under same parent */ + struct mxml_node_s *prev; /* Previous node under same parent */ + struct mxml_node_s *parent; /* Parent node */ + struct mxml_node_s *child; /* First child node */ + struct mxml_node_s *last_child; /* Last child node */ + mxml_value_t value; /* Node value */ + int ref_count; /* Use count */ + void *user_data; /* User data */ +} mxml_node_t; + +typedef struct mxml_index_s /**** An XML node index. ****/ +{ + char *attr; /* Attribute used for indexing or NULL */ + int num_nodes; /* Number of nodes in index */ + int alloc_nodes; /* Allocated nodes in index */ + int cur_node; /* Current node */ + mxml_node_t **nodes; /* Node array */ +} mxml_index_t; + +typedef int (*mxml_custom_load_cb_t)(mxml_node_t *, const char *); + /**** Custom data load callback function ****/ + +typedef char *(*mxml_custom_save_cb_t)(mxml_node_t *); + /**** Custom data save callback function ****/ + +typedef int (*mxml_entity_cb_t)(const char *); + /**** Entity callback function */ + +typedef mxml_type_t (*mxml_load_cb_t)(mxml_node_t *); + /**** Load callback function ****/ + +typedef const char *(*mxml_save_cb_t)(mxml_node_t *, int); + /**** Save callback function ****/ + +typedef void (*mxml_sax_cb_t)(mxml_node_t *, mxml_sax_event_t, void *); + /**** SAX callback function ****/ + + +/* + * C++ support... + */ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + +/* + * Prototypes... + */ + +extern void mxmlAdd(mxml_node_t *parent, int where, + mxml_node_t *child, mxml_node_t *node); +extern void mxmlDelete(mxml_node_t *node); +extern void mxmlElementDeleteAttr(mxml_node_t *node, + const char *name); +extern const char *mxmlElementGetAttr(mxml_node_t *node, const char *name); +extern void mxmlElementSetAttr(mxml_node_t *node, const char *name, + const char *value); +extern void mxmlElementSetAttrf(mxml_node_t *node, const char *name, + const char *format, ...) +# ifdef __GNUC__ +__attribute__ ((__format__ (__printf__, 3, 4))) +# endif /* __GNUC__ */ +; +extern int mxmlEntityAddCallback(mxml_entity_cb_t cb); +extern const char *mxmlEntityGetName(int val); +extern int mxmlEntityGetValue(const char *name); +extern void mxmlEntityRemoveCallback(mxml_entity_cb_t cb); +extern mxml_node_t *mxmlFindElement(mxml_node_t *node, mxml_node_t *top, + const char *name, const char *attr, + const char *value, int descend); +extern void mxmlIndexDelete(mxml_index_t *ind); +extern mxml_node_t *mxmlIndexEnum(mxml_index_t *ind); +extern mxml_node_t *mxmlIndexFind(mxml_index_t *ind, + const char *element, + const char *value); +extern mxml_index_t *mxmlIndexNew(mxml_node_t *node, const char *element, + const char *attr); +extern mxml_node_t *mxmlIndexReset(mxml_index_t *ind); +extern mxml_node_t *mxmlLoadFd(mxml_node_t *top, int fd, + mxml_type_t (*cb)(mxml_node_t *)); +extern mxml_node_t *mxmlLoadFile(mxml_node_t *top, FILE *fp, + mxml_type_t (*cb)(mxml_node_t *)); +extern mxml_node_t *mxmlLoadString(mxml_node_t *top, const char *s, + mxml_type_t (*cb)(mxml_node_t *)); +extern mxml_node_t *mxmlNewCDATA(mxml_node_t *parent, const char *string); +extern mxml_node_t *mxmlNewCustom(mxml_node_t *parent, void *data, + mxml_custom_destroy_cb_t destroy); +extern mxml_node_t *mxmlNewElement(mxml_node_t *parent, const char *name); +extern mxml_node_t *mxmlNewInteger(mxml_node_t *parent, int integer); +extern mxml_node_t *mxmlNewOpaque(mxml_node_t *parent, const char *opaque); +extern mxml_node_t *mxmlNewReal(mxml_node_t *parent, double real); +extern mxml_node_t *mxmlNewText(mxml_node_t *parent, int whitespace, + const char *string); +extern mxml_node_t *mxmlNewTextf(mxml_node_t *parent, int whitespace, + const char *format, ...) +# ifdef __GNUC__ +__attribute__ ((__format__ (__printf__, 3, 4))) +# endif /* __GNUC__ */ +; +extern mxml_node_t *mxmlNewXML(const char *version); +extern int mxmlRelease(mxml_node_t *node); +extern void mxmlRemove(mxml_node_t *node); +extern int mxmlRetain(mxml_node_t *node); +extern char *mxmlSaveAllocString(mxml_node_t *node, + mxml_save_cb_t cb); +extern int mxmlSaveFd(mxml_node_t *node, int fd, + mxml_save_cb_t cb); +extern int mxmlSaveFile(mxml_node_t *node, FILE *fp, + mxml_save_cb_t cb); +extern int mxmlSaveString(mxml_node_t *node, char *buffer, + int bufsize, mxml_save_cb_t cb); +extern mxml_node_t *mxmlSAXLoadFd(mxml_node_t *top, int fd, + mxml_type_t (*cb)(mxml_node_t *), + mxml_sax_cb_t sax, void *sax_data); +extern mxml_node_t *mxmlSAXLoadFile(mxml_node_t *top, FILE *fp, + mxml_type_t (*cb)(mxml_node_t *), + mxml_sax_cb_t sax, void *sax_data); +extern mxml_node_t *mxmlSAXLoadString(mxml_node_t *top, const char *s, + mxml_type_t (*cb)(mxml_node_t *), + mxml_sax_cb_t sax, void *sax_data); +extern int mxmlSetCDATA(mxml_node_t *node, const char *data); +extern int mxmlSetCustom(mxml_node_t *node, void *data, + mxml_custom_destroy_cb_t destroy); +extern void mxmlSetCustomHandlers(mxml_custom_load_cb_t load, + mxml_custom_save_cb_t save); +extern int mxmlSetElement(mxml_node_t *node, const char *name); +extern void mxmlSetErrorCallback(mxml_error_cb_t cb); +extern int mxmlSetInteger(mxml_node_t *node, int integer); +extern int mxmlSetOpaque(mxml_node_t *node, const char *opaque); +extern int mxmlSetReal(mxml_node_t *node, double real); +extern int mxmlSetText(mxml_node_t *node, int whitespace, + const char *string); +extern int mxmlSetTextf(mxml_node_t *node, int whitespace, + const char *format, ...) +# ifdef __GNUC__ +__attribute__ ((__format__ (__printf__, 3, 4))) +# endif /* __GNUC__ */ +; +extern void mxmlSetWrapMargin(int column); +extern mxml_node_t *mxmlWalkNext(mxml_node_t *node, mxml_node_t *top, + int descend); +extern mxml_node_t *mxmlWalkPrev(mxml_node_t *node, mxml_node_t *top, + int descend); + + +/* + * Semi-private functions... + */ + +extern void mxml_error(const char *format, ...); +extern mxml_type_t mxml_ignore_cb(mxml_node_t *node); +extern mxml_type_t mxml_integer_cb(mxml_node_t *node); +extern mxml_type_t mxml_opaque_cb(mxml_node_t *node); +extern mxml_type_t mxml_real_cb(mxml_node_t *node); + + +/* + * C++ support... + */ + +# ifdef __cplusplus +} +# endif /* __cplusplus */ +#endif /* !_mxml_h_ */ + + +/* + * End of "$Id: mxml.h 385 2009-03-19 05:38:52Z mike $". + */ diff --git a/plugins/snes9x_gx/portlibs/include/nfs.h b/plugins/snes9x_gx/portlibs/include/nfs.h new file mode 100644 index 00000000..4ae0b37a --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/nfs.h @@ -0,0 +1,60 @@ +/* + nfs.h + Simple functionality for mounting and unmounting of NFS-based network storage. + + Copyright (c) 2012 r-win + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + 3. The name of the author may not be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#ifndef _LIBNFS_H +#define _LIBNFS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define NFS_READWRITE 0 +#define NFS_READONLY 1 + +/* +Mount the network storage specified by the ipAddress of the server, and the mountdirectory +for the mountpoint. +You can then access the filesystem using "name:/". +This will also call net_init in order to initialize the network. If you want the network to +initiliaze async, make sure you've done so before calling nfsMount. +*/ +extern bool nfsMount(const char *name, const char *ipAddress, const char *mountdir); + +extern bool nfsMountEx(const char *name, const char *ipAddress, const char *mountdir, uint32_t uid, uint32_t gid, uint32_t readonly); + +/* +Unmount the remote mountpoint specified by name. +*/ +extern void nfsUnmount (const char* name); + +#ifdef __cplusplus +} +#endif + +#endif // _LIBNFS_H diff --git a/plugins/snes9x_gx/portlibs/include/ntfs.h b/plugins/snes9x_gx/portlibs/include/ntfs.h new file mode 100644 index 00000000..62f2f719 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/ntfs.h @@ -0,0 +1,148 @@ +/** + * ntfs.h - Simple functionality for startup, mounting and unmounting of NTFS-based devices. + * + * Copyright (c) 2010 Dimok + * Copyright (c) 2009 Rhys "Shareese" Koedijk + * Copyright (c) 2006 Michael "Chishm" Chisholm + * + * This program/include file is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program/include file is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _LIBNTFS_H +#define _LIBNTFS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <gctypes.h> +#include <gccore.h> +#include <ogc/disc_io.h> + +/* NTFS errno values */ +#define ENOPART 3000 /* No partition was found */ +#define EINVALPART 3001 /* Specified partition is invalid or not supported */ +#define EDIRTY 3002 /* Volume is dirty and NTFS_RECOVER was not specified during mount */ +#define EHIBERNATED 3003 /* Volume is hibernated and NTFS_IGNORE_HIBERFILE was not specified during mount */ + +/* NTFS cache options */ +#define CACHE_DEFAULT_PAGE_COUNT 8 /* The default number of pages in the cache */ +#define CACHE_DEFAULT_PAGE_SIZE 128 /* The default number of sectors per cache page */ + +/* NTFS mount flags */ +#define NTFS_DEFAULT 0x00000000 /* Standard mount, expects a clean, non-hibernated volume */ +#define NTFS_SHOW_HIDDEN_FILES 0x00000001 /* Display hidden files when enumerating directories */ +#define NTFS_SHOW_SYSTEM_FILES 0x00000002 /* Display system files when enumerating directories */ +#define NTFS_UPDATE_ACCESS_TIMES 0x00000004 /* Update file and directory access times */ +#define NTFS_RECOVER 0x00000008 /* Reset $LogFile if dirty (i.e. from unclean disconnect) */ +#define NTFS_IGNORE_HIBERFILE 0x00000010 /* Mount even if volume is hibernated */ +#define NTFS_READ_ONLY 0x00000020 /* Mount in read only mode */ +#define NTFS_IGNORE_CASE 0x00000040 /* Ignore case sensitivity. Everything must be and will be provided in lowercase. */ +#define NTFS_SU NTFS_SHOW_HIDDEN_FILES | NTFS_SHOW_SYSTEM_FILES +#define NTFS_FORCE NTFS_RECOVER | NTFS_IGNORE_HIBERFILE + +/** + * ntfs_md - NTFS mount descriptor + */ +typedef struct _ntfs_md { + char name[32]; /* Mount name (can be accessed as "name:/") */ + const DISC_INTERFACE *interface; /* Block device containing the mounted partition */ + sec_t startSector; /* Local block address to first sector of partition */ +} ntfs_md; + +/** + * Find all NTFS partitions on a block device. + * + * @param INTERFACE The block device to search + * @param PARTITIONS (out) A pointer to receive the array of partition start sectors + * + * @return The number of entries in PARTITIONS or -1 if an error occurred (see errno) + * @note The caller is responsible for freeing PARTITIONS when finished with it + */ +extern int ntfsFindPartitions (const DISC_INTERFACE *interface, sec_t **partitions); + +/** + * Mount all NTFS partitions on all inserted block devices. + * + * @param MOUNTS (out) A pointer to receive the array of mount descriptors + * @param FLAGS Additional mounting flags. (see above) + * + * @return The number of entries in MOUNTS or -1 if an error occurred (see errno) + * @note The caller is responsible for freeing MOUNTS when finished with it + * @note All device caches are setup using default values (see above) + */ +extern int ntfsMountAll (ntfs_md **mounts, u32 flags); + +/** + * Mount all NTFS partitions on a block devices. + * + * @param INTERFACE The block device to mount. + * @param MOUNTS (out) A pointer to receive the array of mount descriptors + * @param FLAGS Additional mounting flags. (see above) + * + * @return The number of entries in MOUNTS or -1 if an error occurred (see errno) + * @note The caller is responsible for freeing MOUNTS when finished with it + * @note The device cache is setup using default values (see above) + */ +extern int ntfsMountDevice (const DISC_INTERFACE* interface, ntfs_md **mounts, u32 flags); + +/** + * Mount a NTFS partition from a specific sector on a block device. + * + * @param NAME The name to mount the device under (can then be accessed as "NAME:/") + * @param INTERFACE The block device to mount + * @param STARTSECTOR The sector the partition begins at (see @ntfsFindPartitions) + * @param CACHEPAGECOUNT The total number of pages in the device cache + * @param CACHEPAGESIZE The number of sectors per cache page + * @param FLAGS Additional mounting flags (see above) + * + * @return True if mount was successful, false if no partition was found or an error occurred (see errno) + * @note ntfsFindPartitions should be used first to locate the partitions start sector + */ +extern bool ntfsMount (const char *name, const DISC_INTERFACE *interface, sec_t startSector, u32 cachePageCount, u32 cachePageSize, u32 flags); + +/** + * Unmount a NTFS partition. + * + * @param NAME The name of mount used in ntfsMountSimple() and ntfsMount() + * @param FORCE If true unmount even if the device is busy (may lead to data lose) + */ +extern void ntfsUnmount (const char *name, bool force); + +/** + * Get the volume name of a mounted NTFS partition. + * + * @param NAME The name of mount (see @ntfsMountAll, @ntfsMountDevice, and @ntfsMount) + * + * @return The volumes name if successful or NULL if an error occurred (see errno) + */ +extern const char *ntfsGetVolumeName (const char *name); + +/** + * Set the volume name of a mounted NTFS partition. + * + * @param NAME The name of mount (see @ntfsMountAll, @ntfsMountDevice, and @ntfsMount) + * @param VOLUMENAME The new volume name + * + * @return True if mount was successful, false if an error occurred (see errno) + * @note The mount must be write-enabled else this will fail + */ +extern bool ntfsSetVolumeName (const char *name, const char *volumeName); + +#ifdef __cplusplus +} +#endif + +#endif /* _LIBNTFS_H */ diff --git a/plugins/snes9x_gx/portlibs/include/png.h b/plugins/snes9x_gx/portlibs/include/png.h new file mode 100644 index 00000000..5617c972 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/png.h @@ -0,0 +1,2658 @@ + +/* png.h - header file for PNG reference library + * + * libpng version 1.5.9 - February 18, 2012 + * Copyright (c) 1998-2012 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license (See LICENSE, below) + * + * Authors and maintainers: + * libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat + * libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger + * libpng versions 0.97, January 1998, through 1.5.9 - February 18, 2012: Glenn + * See also "Contributing Authors", below. + * + * Note about libpng version numbers: + * + * Due to various miscommunications, unforeseen code incompatibilities + * and occasional factors outside the authors' control, version numbering + * on the library has not always been consistent and straightforward. + * The following table summarizes matters since version 0.89c, which was + * the first widely used release: + * + * source png.h png.h shared-lib + * version string int version + * ------- ------ ----- ---------- + * 0.89c "1.0 beta 3" 0.89 89 1.0.89 + * 0.90 "1.0 beta 4" 0.90 90 0.90 [should have been 2.0.90] + * 0.95 "1.0 beta 5" 0.95 95 0.95 [should have been 2.0.95] + * 0.96 "1.0 beta 6" 0.96 96 0.96 [should have been 2.0.96] + * 0.97b "1.00.97 beta 7" 1.00.97 97 1.0.1 [should have been 2.0.97] + * 0.97c 0.97 97 2.0.97 + * 0.98 0.98 98 2.0.98 + * 0.99 0.99 98 2.0.99 + * 0.99a-m 0.99 99 2.0.99 + * 1.00 1.00 100 2.1.0 [100 should be 10000] + * 1.0.0 (from here on, the 100 2.1.0 [100 should be 10000] + * 1.0.1 png.h string is 10001 2.1.0 + * 1.0.1a-e identical to the 10002 from here on, the shared library + * 1.0.2 source version) 10002 is 2.V where V is the source code + * 1.0.2a-b 10003 version, except as noted. + * 1.0.3 10003 + * 1.0.3a-d 10004 + * 1.0.4 10004 + * 1.0.4a-f 10005 + * 1.0.5 (+ 2 patches) 10005 + * 1.0.5a-d 10006 + * 1.0.5e-r 10100 (not source compatible) + * 1.0.5s-v 10006 (not binary compatible) + * 1.0.6 (+ 3 patches) 10006 (still binary incompatible) + * 1.0.6d-f 10007 (still binary incompatible) + * 1.0.6g 10007 + * 1.0.6h 10007 10.6h (testing xy.z so-numbering) + * 1.0.6i 10007 10.6i + * 1.0.6j 10007 2.1.0.6j (incompatible with 1.0.0) + * 1.0.7beta11-14 DLLNUM 10007 2.1.0.7beta11-14 (binary compatible) + * 1.0.7beta15-18 1 10007 2.1.0.7beta15-18 (binary compatible) + * 1.0.7rc1-2 1 10007 2.1.0.7rc1-2 (binary compatible) + * 1.0.7 1 10007 (still compatible) + * 1.0.8beta1-4 1 10008 2.1.0.8beta1-4 + * 1.0.8rc1 1 10008 2.1.0.8rc1 + * 1.0.8 1 10008 2.1.0.8 + * 1.0.9beta1-6 1 10009 2.1.0.9beta1-6 + * 1.0.9rc1 1 10009 2.1.0.9rc1 + * 1.0.9beta7-10 1 10009 2.1.0.9beta7-10 + * 1.0.9rc2 1 10009 2.1.0.9rc2 + * 1.0.9 1 10009 2.1.0.9 + * 1.0.10beta1 1 10010 2.1.0.10beta1 + * 1.0.10rc1 1 10010 2.1.0.10rc1 + * 1.0.10 1 10010 2.1.0.10 + * 1.0.11beta1-3 1 10011 2.1.0.11beta1-3 + * 1.0.11rc1 1 10011 2.1.0.11rc1 + * 1.0.11 1 10011 2.1.0.11 + * 1.0.12beta1-2 2 10012 2.1.0.12beta1-2 + * 1.0.12rc1 2 10012 2.1.0.12rc1 + * 1.0.12 2 10012 2.1.0.12 + * 1.1.0a-f - 10100 2.1.1.0a-f (branch abandoned) + * 1.2.0beta1-2 2 10200 2.1.2.0beta1-2 + * 1.2.0beta3-5 3 10200 3.1.2.0beta3-5 + * 1.2.0rc1 3 10200 3.1.2.0rc1 + * 1.2.0 3 10200 3.1.2.0 + * 1.2.1beta1-4 3 10201 3.1.2.1beta1-4 + * 1.2.1rc1-2 3 10201 3.1.2.1rc1-2 + * 1.2.1 3 10201 3.1.2.1 + * 1.2.2beta1-6 12 10202 12.so.0.1.2.2beta1-6 + * 1.0.13beta1 10 10013 10.so.0.1.0.13beta1 + * 1.0.13rc1 10 10013 10.so.0.1.0.13rc1 + * 1.2.2rc1 12 10202 12.so.0.1.2.2rc1 + * 1.0.13 10 10013 10.so.0.1.0.13 + * 1.2.2 12 10202 12.so.0.1.2.2 + * 1.2.3rc1-6 12 10203 12.so.0.1.2.3rc1-6 + * 1.2.3 12 10203 12.so.0.1.2.3 + * 1.2.4beta1-3 13 10204 12.so.0.1.2.4beta1-3 + * 1.0.14rc1 13 10014 10.so.0.1.0.14rc1 + * 1.2.4rc1 13 10204 12.so.0.1.2.4rc1 + * 1.0.14 10 10014 10.so.0.1.0.14 + * 1.2.4 13 10204 12.so.0.1.2.4 + * 1.2.5beta1-2 13 10205 12.so.0.1.2.5beta1-2 + * 1.0.15rc1-3 10 10015 10.so.0.1.0.15rc1-3 + * 1.2.5rc1-3 13 10205 12.so.0.1.2.5rc1-3 + * 1.0.15 10 10015 10.so.0.1.0.15 + * 1.2.5 13 10205 12.so.0.1.2.5 + * 1.2.6beta1-4 13 10206 12.so.0.1.2.6beta1-4 + * 1.0.16 10 10016 10.so.0.1.0.16 + * 1.2.6 13 10206 12.so.0.1.2.6 + * 1.2.7beta1-2 13 10207 12.so.0.1.2.7beta1-2 + * 1.0.17rc1 10 10017 12.so.0.1.0.17rc1 + * 1.2.7rc1 13 10207 12.so.0.1.2.7rc1 + * 1.0.17 10 10017 12.so.0.1.0.17 + * 1.2.7 13 10207 12.so.0.1.2.7 + * 1.2.8beta1-5 13 10208 12.so.0.1.2.8beta1-5 + * 1.0.18rc1-5 10 10018 12.so.0.1.0.18rc1-5 + * 1.2.8rc1-5 13 10208 12.so.0.1.2.8rc1-5 + * 1.0.18 10 10018 12.so.0.1.0.18 + * 1.2.8 13 10208 12.so.0.1.2.8 + * 1.2.9beta1-3 13 10209 12.so.0.1.2.9beta1-3 + * 1.2.9beta4-11 13 10209 12.so.0.9[.0] + * 1.2.9rc1 13 10209 12.so.0.9[.0] + * 1.2.9 13 10209 12.so.0.9[.0] + * 1.2.10beta1-7 13 10210 12.so.0.10[.0] + * 1.2.10rc1-2 13 10210 12.so.0.10[.0] + * 1.2.10 13 10210 12.so.0.10[.0] + * 1.4.0beta1-5 14 10400 14.so.0.0[.0] + * 1.2.11beta1-4 13 10211 12.so.0.11[.0] + * 1.4.0beta7-8 14 10400 14.so.0.0[.0] + * 1.2.11 13 10211 12.so.0.11[.0] + * 1.2.12 13 10212 12.so.0.12[.0] + * 1.4.0beta9-14 14 10400 14.so.0.0[.0] + * 1.2.13 13 10213 12.so.0.13[.0] + * 1.4.0beta15-36 14 10400 14.so.0.0[.0] + * 1.4.0beta37-87 14 10400 14.so.14.0[.0] + * 1.4.0rc01 14 10400 14.so.14.0[.0] + * 1.4.0beta88-109 14 10400 14.so.14.0[.0] + * 1.4.0rc02-08 14 10400 14.so.14.0[.0] + * 1.4.0 14 10400 14.so.14.0[.0] + * 1.4.1beta01-03 14 10401 14.so.14.1[.0] + * 1.4.1rc01 14 10401 14.so.14.1[.0] + * 1.4.1beta04-12 14 10401 14.so.14.1[.0] + * 1.4.1 14 10401 14.so.14.1[.0] + * 1.4.2 14 10402 14.so.14.2[.0] + * 1.4.3 14 10403 14.so.14.3[.0] + * 1.4.4 14 10404 14.so.14.4[.0] + * 1.5.0beta01-58 15 10500 15.so.15.0[.0] + * 1.5.0rc01-07 15 10500 15.so.15.0[.0] + * 1.5.0 15 10500 15.so.15.0[.0] + * 1.5.1beta01-11 15 10501 15.so.15.1[.0] + * 1.5.1rc01-02 15 10501 15.so.15.1[.0] + * 1.5.1 15 10501 15.so.15.1[.0] + * 1.5.2beta01-03 15 10502 15.so.15.2[.0] + * 1.5.2rc01-03 15 10502 15.so.15.2[.0] + * 1.5.2 15 10502 15.so.15.2[.0] + * 1.5.3beta01-10 15 10503 15.so.15.3[.0] + * 1.5.3rc01-02 15 10503 15.so.15.3[.0] + * 1.5.3beta11 15 10503 15.so.15.3[.0] + * 1.5.3 [omitted] + * 1.5.4beta01-08 15 10504 15.so.15.4[.0] + * 1.5.4rc01 15 10504 15.so.15.4[.0] + * 1.5.4 15 10504 15.so.15.4[.0] + * 1.5.5beta01-08 15 10505 15.so.15.5[.0] + * 1.5.5rc01 15 10505 15.so.15.5[.0] + * 1.5.5 15 10505 15.so.15.5[.0] + * 1.5.6beta01-07 15 10506 15.so.15.6[.0] + * 1.5.6rc01-03 15 10506 15.so.15.6[.0] + * 1.5.6 15 10506 15.so.15.6[.0] + * 1.5.7beta01-05 15 10507 15.so.15.7[.0] + * 1.5.7rc01-03 15 10507 15.so.15.7[.0] + * 1.5.7 15 10507 15.so.15.7[.0] + * 1.5.8beta01 15 10508 15.so.15.8[.0] + * 1.5.8rc01 15 10508 15.so.15.8[.0] + * 1.5.8 15 10508 15.so.15.8[.0] + * 1.5.9beta01-02 15 10509 15.so.15.9[.0] + * 1.5.9rc01 15 10509 15.so.15.9[.0] + * 1.5.9 15 10509 15.so.15.9[.0] + * + * Henceforth the source version will match the shared-library major + * and minor numbers; the shared-library major version number will be + * used for changes in backward compatibility, as it is intended. The + * PNG_LIBPNG_VER macro, which is not used within libpng but is available + * for applications, is an unsigned integer of the form xyyzz corresponding + * to the source version x.y.z (leading zeros in y and z). Beta versions + * were given the previous public release number plus a letter, until + * version 1.0.6j; from then on they were given the upcoming public + * release number plus "betaNN" or "rcN". + * + * Binary incompatibility exists only when applications make direct access + * to the info_ptr or png_ptr members through png.h, and the compiled + * application is loaded with a different version of the library. + * + * DLLNUM will change each time there are forward or backward changes + * in binary compatibility (e.g., when a new feature is added). + * + * See libpng-manual.txt or libpng.3 for more information. The PNG + * specification is available as a W3C Recommendation and as an ISO + * Specification, <http://www.w3.org/TR/2003/REC-PNG-20031110/ + */ + +/* + * COPYRIGHT NOTICE, DISCLAIMER, and LICENSE: + * + * If you modify libpng you may insert additional notices immediately following + * this sentence. + * + * This code is released under the libpng license. + * + * libpng versions 1.2.6, August 15, 2004, through 1.5.9, February 18, 2012, are + * Copyright (c) 2004, 2006-2012 Glenn Randers-Pehrson, and are + * distributed according to the same disclaimer and license as libpng-1.2.5 + * with the following individual added to the list of Contributing Authors: + * + * Cosmin Truta + * + * libpng versions 1.0.7, July 1, 2000, through 1.2.5, October 3, 2002, are + * Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are + * distributed according to the same disclaimer and license as libpng-1.0.6 + * with the following individuals added to the list of Contributing Authors: + * + * Simon-Pierre Cadieux + * Eric S. Raymond + * Gilles Vollant + * + * and with the following additions to the disclaimer: + * + * There is no warranty against interference with your enjoyment of the + * library or against infringement. There is no warranty that our + * efforts or the library will fulfill any of your particular purposes + * or needs. This library is provided with all faults, and the entire + * risk of satisfactory quality, performance, accuracy, and effort is with + * the user. + * + * libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are + * Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson, and are + * distributed according to the same disclaimer and license as libpng-0.96, + * with the following individuals added to the list of Contributing Authors: + * + * Tom Lane + * Glenn Randers-Pehrson + * Willem van Schaik + * + * libpng versions 0.89, June 1996, through 0.96, May 1997, are + * Copyright (c) 1996, 1997 Andreas Dilger + * Distributed according to the same disclaimer and license as libpng-0.88, + * with the following individuals added to the list of Contributing Authors: + * + * John Bowler + * Kevin Bracey + * Sam Bushell + * Magnus Holmgren + * Greg Roelofs + * Tom Tanner + * + * libpng versions 0.5, May 1995, through 0.88, January 1996, are + * Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. + * + * For the purposes of this copyright and license, "Contributing Authors" + * is defined as the following set of individuals: + * + * Andreas Dilger + * Dave Martindale + * Guy Eric Schalnat + * Paul Schmidt + * Tim Wegner + * + * The PNG Reference Library is supplied "AS IS". The Contributing Authors + * and Group 42, Inc. disclaim all warranties, expressed or implied, + * including, without limitation, the warranties of merchantability and of + * fitness for any purpose. The Contributing Authors and Group 42, Inc. + * assume no liability for direct, indirect, incidental, special, exemplary, + * or consequential damages, which may result from the use of the PNG + * Reference Library, even if advised of the possibility of such damage. + * + * Permission is hereby granted to use, copy, modify, and distribute this + * source code, or portions hereof, for any purpose, without fee, subject + * to the following restrictions: + * + * 1. The origin of this source code must not be misrepresented. + * + * 2. Altered versions must be plainly marked as such and must not + * be misrepresented as being the original source. + * + * 3. This Copyright notice may not be removed or altered from + * any source or altered source distribution. + * + * The Contributing Authors and Group 42, Inc. specifically permit, without + * fee, and encourage the use of this source code as a component to + * supporting the PNG file format in commercial products. If you use this + * source code in a product, acknowledgment is not required but would be + * appreciated. + */ + +/* + * A "png_get_copyright" function is available, for convenient use in "about" + * boxes and the like: + * + * printf("%s", png_get_copyright(NULL)); + * + * Also, the PNG logo (in PNG format, of course) is supplied in the + * files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31). + */ + +/* + * Libpng is OSI Certified Open Source Software. OSI Certified is a + * certification mark of the Open Source Initiative. + */ + +/* + * The contributing authors would like to thank all those who helped + * with testing, bug fixes, and patience. This wouldn't have been + * possible without all of you. + * + * Thanks to Frank J. T. Wojcik for helping with the documentation. + */ + +/* + * Y2K compliance in libpng: + * ========================= + * + * February 18, 2012 + * + * Since the PNG Development group is an ad-hoc body, we can't make + * an official declaration. + * + * This is your unofficial assurance that libpng from version 0.71 and + * upward through 1.5.9 are Y2K compliant. It is my belief that + * earlier versions were also Y2K compliant. + * + * Libpng only has two year fields. One is a 2-byte unsigned integer + * that will hold years up to 65535. The other holds the date in text + * format, and will hold years up to 9999. + * + * The integer is + * "png_uint_16 year" in png_time_struct. + * + * The string is + * "png_char time_buffer" in png_struct + * + * There are seven time-related functions: + * png.c: png_convert_to_rfc_1123() in png.c + * (formerly png_convert_to_rfc_1152() in error) + * png_convert_from_struct_tm() in pngwrite.c, called in pngwrite.c + * png_convert_from_time_t() in pngwrite.c + * png_get_tIME() in pngget.c + * png_handle_tIME() in pngrutil.c, called in pngread.c + * png_set_tIME() in pngset.c + * png_write_tIME() in pngwutil.c, called in pngwrite.c + * + * All handle dates properly in a Y2K environment. The + * png_convert_from_time_t() function calls gmtime() to convert from system + * clock time, which returns (year - 1900), which we properly convert to + * the full 4-digit year. There is a possibility that applications using + * libpng are not passing 4-digit years into the png_convert_to_rfc_1123() + * function, or that they are incorrectly passing only a 2-digit year + * instead of "year - 1900" into the png_convert_from_struct_tm() function, + * but this is not under our control. The libpng documentation has always + * stated that it works with 4-digit years, and the APIs have been + * documented as such. + * + * The tIME chunk itself is also Y2K compliant. It uses a 2-byte unsigned + * integer to hold the year, and can hold years as large as 65535. + * + * zlib, upon which libpng depends, is also Y2K compliant. It contains + * no date-related code. + * + * Glenn Randers-Pehrson + * libpng maintainer + * PNG Development Group + */ + +#ifndef PNG_H +#define PNG_H + +/* This is not the place to learn how to use libpng. The file libpng-manual.txt + * describes how to use libpng, and the file example.c summarizes it + * with some code on which to build. This file is useful for looking + * at the actual function definitions and structure components. + * + * If you just need to read a PNG file and don't want to read the documentation + * skip to the end of this file and read the section entitled 'simplified API'. + */ + +/* Version information for png.h - this should match the version in png.c */ +#define PNG_LIBPNG_VER_STRING "1.5.9" +#define PNG_HEADER_VERSION_STRING \ + " libpng version 1.5.9 - February 18, 2012\n" + +#define PNG_LIBPNG_VER_SONUM 15 +#define PNG_LIBPNG_VER_DLLNUM 15 + +/* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */ +#define PNG_LIBPNG_VER_MAJOR 1 +#define PNG_LIBPNG_VER_MINOR 5 +#define PNG_LIBPNG_VER_RELEASE 9 + +/* This should match the numeric part of the final component of + * PNG_LIBPNG_VER_STRING, omitting any leading zero: + */ + +#define PNG_LIBPNG_VER_BUILD 0 + +/* Release Status */ +#define PNG_LIBPNG_BUILD_ALPHA 1 +#define PNG_LIBPNG_BUILD_BETA 2 +#define PNG_LIBPNG_BUILD_RC 3 +#define PNG_LIBPNG_BUILD_STABLE 4 +#define PNG_LIBPNG_BUILD_RELEASE_STATUS_MASK 7 + +/* Release-Specific Flags */ +#define PNG_LIBPNG_BUILD_PATCH 8 /* Can be OR'ed with + PNG_LIBPNG_BUILD_STABLE only */ +#define PNG_LIBPNG_BUILD_PRIVATE 16 /* Cannot be OR'ed with + PNG_LIBPNG_BUILD_SPECIAL */ +#define PNG_LIBPNG_BUILD_SPECIAL 32 /* Cannot be OR'ed with + PNG_LIBPNG_BUILD_PRIVATE */ + +#define PNG_LIBPNG_BUILD_BASE_TYPE PNG_LIBPNG_BUILD_BETA + +/* Careful here. At one time, Guy wanted to use 082, but that would be octal. + * We must not include leading zeros. + * Versions 0.7 through 1.0.0 were in the range 0 to 100 here (only + * version 1.0.0 was mis-numbered 100 instead of 10000). From + * version 1.0.1 it's xxyyzz, where x=major, y=minor, z=release + */ +#define PNG_LIBPNG_VER 10509 /* 1.5.9 */ + +/* Library configuration: these options cannot be changed after + * the library has been built. + */ +#ifndef PNGLCONF_H + /* If pnglibconf.h is missing, you can + * copy scripts/pnglibconf.h.prebuilt to pnglibconf.h + */ +# include "pnglibconf.h" +#endif + +#ifndef PNG_VERSION_INFO_ONLY +# ifndef PNG_BUILDING_SYMBOL_TABLE + /* + * Standard header files (not needed for the version info or while + * building symbol table -- see scripts/pnglibconf.dfa) + */ +# ifdef PNG_SETJMP_SUPPORTED +# include <setjmp.h> +# endif + + /* Need the time information for converting tIME chunks, it + * defines struct tm: + */ +# ifdef PNG_CONVERT_tIME_SUPPORTED + /* "time.h" functions are not supported on all operating systems */ +# include <time.h> +# endif +# endif + +/* Machine specific configuration. */ +# include "pngconf.h" +#endif + +/* + * Added at libpng-1.2.8 + * + * Ref MSDN: Private as priority over Special + * VS_FF_PRIVATEBUILD File *was not* built using standard release + * procedures. If this value is given, the StringFileInfo block must + * contain a PrivateBuild string. + * + * VS_FF_SPECIALBUILD File *was* built by the original company using + * standard release procedures but is a variation of the standard + * file of the same version number. If this value is given, the + * StringFileInfo block must contain a SpecialBuild string. + */ + +#ifdef PNG_USER_PRIVATEBUILD /* From pnglibconf.h */ +# define PNG_LIBPNG_BUILD_TYPE \ + (PNG_LIBPNG_BUILD_BASE_TYPE | PNG_LIBPNG_BUILD_PRIVATE) +#else +# ifdef PNG_LIBPNG_SPECIALBUILD +# define PNG_LIBPNG_BUILD_TYPE \ + (PNG_LIBPNG_BUILD_BASE_TYPE | PNG_LIBPNG_BUILD_SPECIAL) +# else +# define PNG_LIBPNG_BUILD_TYPE (PNG_LIBPNG_BUILD_BASE_TYPE) +# endif +#endif + +#ifndef PNG_VERSION_INFO_ONLY + +/* Inhibit C++ name-mangling for libpng functions but not for system calls. */ +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* Version information for C files, stored in png.c. This had better match + * the version above. + */ +#define png_libpng_ver png_get_header_ver(NULL) + +/* This file is arranged in several sections: + * + * 1. Any configuration options that can be specified by for the application + * code when it is built. (Build time configuration is in pnglibconf.h) + * 2. Type definitions (base types are defined in pngconf.h), structure + * definitions. + * 3. Exported library functions. + * + * The library source code has additional files (principally pngpriv.h) that + * allow configuration of the library. + */ +/* Section 1: run time configuration + * See pnglibconf.h for build time configuration + * + * Run time configuration allows the application to choose between + * implementations of certain arithmetic APIs. The default is set + * at build time and recorded in pnglibconf.h, but it is safe to + * override these (and only these) settings. Note that this won't + * change what the library does, only application code, and the + * settings can (and probably should) be made on a per-file basis + * by setting the #defines before including png.h + * + * Use macros to read integers from PNG data or use the exported + * functions? + * PNG_USE_READ_MACROS: use the macros (see below) Note that + * the macros evaluate their argument multiple times. + * PNG_NO_USE_READ_MACROS: call the relevant library function. + * + * Use the alternative algorithm for compositing alpha samples that + * does not use division? + * PNG_READ_COMPOSITE_NODIV_SUPPORTED: use the 'no division' + * algorithm. + * PNG_NO_READ_COMPOSITE_NODIV: use the 'division' algorithm. + * + * How to handle benign errors if PNG_ALLOW_BENIGN_ERRORS is + * false? + * PNG_ALLOW_BENIGN_ERRORS: map calls to the benign error + * APIs to png_warning. + * Otherwise the calls are mapped to png_error. + */ + +/* Section 2: type definitions, including structures and compile time + * constants. + * See pngconf.h for base types that vary by machine/system + */ + +/* This triggers a compiler error in png.c, if png.c and png.h + * do not agree upon the version number. + */ +typedef char* png_libpng_version_1_5_9; + +/* Three color definitions. The order of the red, green, and blue, (and the + * exact size) is not important, although the size of the fields need to + * be png_byte or png_uint_16 (as defined below). + */ +typedef struct png_color_struct +{ + png_byte red; + png_byte green; + png_byte blue; +} png_color; +typedef png_color FAR * png_colorp; +typedef PNG_CONST png_color FAR * png_const_colorp; +typedef png_color FAR * FAR * png_colorpp; + +typedef struct png_color_16_struct +{ + png_byte index; /* used for palette files */ + png_uint_16 red; /* for use in red green blue files */ + png_uint_16 green; + png_uint_16 blue; + png_uint_16 gray; /* for use in grayscale files */ +} png_color_16; +typedef png_color_16 FAR * png_color_16p; +typedef PNG_CONST png_color_16 FAR * png_const_color_16p; +typedef png_color_16 FAR * FAR * png_color_16pp; + +typedef struct png_color_8_struct +{ + png_byte red; /* for use in red green blue files */ + png_byte green; + png_byte blue; + png_byte gray; /* for use in grayscale files */ + png_byte alpha; /* for alpha channel files */ +} png_color_8; +typedef png_color_8 FAR * png_color_8p; +typedef PNG_CONST png_color_8 FAR * png_const_color_8p; +typedef png_color_8 FAR * FAR * png_color_8pp; + +/* + * The following two structures are used for the in-core representation + * of sPLT chunks. + */ +typedef struct png_sPLT_entry_struct +{ + png_uint_16 red; + png_uint_16 green; + png_uint_16 blue; + png_uint_16 alpha; + png_uint_16 frequency; +} png_sPLT_entry; +typedef png_sPLT_entry FAR * png_sPLT_entryp; +typedef PNG_CONST png_sPLT_entry FAR * png_const_sPLT_entryp; +typedef png_sPLT_entry FAR * FAR * png_sPLT_entrypp; + +/* When the depth of the sPLT palette is 8 bits, the color and alpha samples + * occupy the LSB of their respective members, and the MSB of each member + * is zero-filled. The frequency member always occupies the full 16 bits. + */ + +typedef struct png_sPLT_struct +{ + png_charp name; /* palette name */ + png_byte depth; /* depth of palette samples */ + png_sPLT_entryp entries; /* palette entries */ + png_int_32 nentries; /* number of palette entries */ +} png_sPLT_t; +typedef png_sPLT_t FAR * png_sPLT_tp; +typedef PNG_CONST png_sPLT_t FAR * png_const_sPLT_tp; +typedef png_sPLT_t FAR * FAR * png_sPLT_tpp; + +#ifdef PNG_TEXT_SUPPORTED +/* png_text holds the contents of a text/ztxt/itxt chunk in a PNG file, + * and whether that contents is compressed or not. The "key" field + * points to a regular zero-terminated C string. The "text" fields can be a + * regular C string, an empty string, or a NULL pointer. + * However, the structure returned by png_get_text() will always contain + * the "text" field as a regular zero-terminated C string (possibly + * empty), never a NULL pointer, so it can be safely used in printf() and + * other string-handling functions. Note that the "itxt_length", "lang", and + * "lang_key" members of the structure only exist when the library is built + * with iTXt chunk support. Prior to libpng-1.4.0 the library was built by + * default without iTXt support. Also note that when iTXt *is* supported, + * the "lang" and "lang_key" fields contain NULL pointers when the + * "compression" field contains * PNG_TEXT_COMPRESSION_NONE or + * PNG_TEXT_COMPRESSION_zTXt. Note that the "compression value" is not the + * same as what appears in the PNG tEXt/zTXt/iTXt chunk's "compression flag" + * which is always 0 or 1, or its "compression method" which is always 0. + */ +typedef struct png_text_struct +{ + int compression; /* compression value: + -1: tEXt, none + 0: zTXt, deflate + 1: iTXt, none + 2: iTXt, deflate */ + png_charp key; /* keyword, 1-79 character description of "text" */ + png_charp text; /* comment, may be an empty string (ie "") + or a NULL pointer */ + png_size_t text_length; /* length of the text string */ + png_size_t itxt_length; /* length of the itxt string */ + png_charp lang; /* language code, 0-79 characters + or a NULL pointer */ + png_charp lang_key; /* keyword translated UTF-8 string, 0 or more + chars or a NULL pointer */ +} png_text; +typedef png_text FAR * png_textp; +typedef PNG_CONST png_text FAR * png_const_textp; +typedef png_text FAR * FAR * png_textpp; +#endif + +/* Supported compression types for text in PNG files (tEXt, and zTXt). + * The values of the PNG_TEXT_COMPRESSION_ defines should NOT be changed. */ +#define PNG_TEXT_COMPRESSION_NONE_WR -3 +#define PNG_TEXT_COMPRESSION_zTXt_WR -2 +#define PNG_TEXT_COMPRESSION_NONE -1 +#define PNG_TEXT_COMPRESSION_zTXt 0 +#define PNG_ITXT_COMPRESSION_NONE 1 +#define PNG_ITXT_COMPRESSION_zTXt 2 +#define PNG_TEXT_COMPRESSION_LAST 3 /* Not a valid value */ + +/* png_time is a way to hold the time in an machine independent way. + * Two conversions are provided, both from time_t and struct tm. There + * is no portable way to convert to either of these structures, as far + * as I know. If you know of a portable way, send it to me. As a side + * note - PNG has always been Year 2000 compliant! + */ +typedef struct png_time_struct +{ + png_uint_16 year; /* full year, as in, 1995 */ + png_byte month; /* month of year, 1 - 12 */ + png_byte day; /* day of month, 1 - 31 */ + png_byte hour; /* hour of day, 0 - 23 */ + png_byte minute; /* minute of hour, 0 - 59 */ + png_byte second; /* second of minute, 0 - 60 (for leap seconds) */ +} png_time; +typedef png_time FAR * png_timep; +typedef PNG_CONST png_time FAR * png_const_timep; +typedef png_time FAR * FAR * png_timepp; + +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) || \ + defined(PNG_HANDLE_AS_UNKNOWN_SUPPORTED) +/* png_unknown_chunk is a structure to hold queued chunks for which there is + * no specific support. The idea is that we can use this to queue + * up private chunks for output even though the library doesn't actually + * know about their semantics. + */ +typedef struct png_unknown_chunk_t +{ + png_byte name[5]; + png_byte *data; + png_size_t size; + + /* libpng-using applications should NOT directly modify this byte. */ + png_byte location; /* mode of operation at read time */ +} + + +png_unknown_chunk; +typedef png_unknown_chunk FAR * png_unknown_chunkp; +typedef PNG_CONST png_unknown_chunk FAR * png_const_unknown_chunkp; +typedef png_unknown_chunk FAR * FAR * png_unknown_chunkpp; +#endif + +/* Values for the unknown chunk location byte */ + +#define PNG_HAVE_IHDR 0x01 +#define PNG_HAVE_PLTE 0x02 +#define PNG_AFTER_IDAT 0x08 + +/* The complete definition of png_info has, as of libpng-1.5.0, + * been moved into a separate header file that is not accessible to + * applications. Read libpng-manual.txt or libpng.3 for more info. + */ +typedef struct png_info_def png_info; +typedef png_info FAR * png_infop; +typedef PNG_CONST png_info FAR * png_const_infop; +typedef png_info FAR * FAR * png_infopp; + +/* Maximum positive integer used in PNG is (2^31)-1 */ +#define PNG_UINT_31_MAX ((png_uint_32)0x7fffffffL) +#define PNG_UINT_32_MAX ((png_uint_32)(-1)) +#define PNG_SIZE_MAX ((png_size_t)(-1)) + +/* These are constants for fixed point values encoded in the + * PNG specification manner (x100000) + */ +#define PNG_FP_1 100000 +#define PNG_FP_HALF 50000 +#define PNG_FP_MAX ((png_fixed_point)0x7fffffffL) +#define PNG_FP_MIN (-PNG_FP_MAX) + +/* These describe the color_type field in png_info. */ +/* color type masks */ +#define PNG_COLOR_MASK_PALETTE 1 +#define PNG_COLOR_MASK_COLOR 2 +#define PNG_COLOR_MASK_ALPHA 4 + +/* color types. Note that not all combinations are legal */ +#define PNG_COLOR_TYPE_GRAY 0 +#define PNG_COLOR_TYPE_PALETTE (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_PALETTE) +#define PNG_COLOR_TYPE_RGB (PNG_COLOR_MASK_COLOR) +#define PNG_COLOR_TYPE_RGB_ALPHA (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_ALPHA) +#define PNG_COLOR_TYPE_GRAY_ALPHA (PNG_COLOR_MASK_ALPHA) +/* aliases */ +#define PNG_COLOR_TYPE_RGBA PNG_COLOR_TYPE_RGB_ALPHA +#define PNG_COLOR_TYPE_GA PNG_COLOR_TYPE_GRAY_ALPHA + +/* This is for compression type. PNG 1.0-1.2 only define the single type. */ +#define PNG_COMPRESSION_TYPE_BASE 0 /* Deflate method 8, 32K window */ +#define PNG_COMPRESSION_TYPE_DEFAULT PNG_COMPRESSION_TYPE_BASE + +/* This is for filter type. PNG 1.0-1.2 only define the single type. */ +#define PNG_FILTER_TYPE_BASE 0 /* Single row per-byte filtering */ +#define PNG_INTRAPIXEL_DIFFERENCING 64 /* Used only in MNG datastreams */ +#define PNG_FILTER_TYPE_DEFAULT PNG_FILTER_TYPE_BASE + +/* These are for the interlacing type. These values should NOT be changed. */ +#define PNG_INTERLACE_NONE 0 /* Non-interlaced image */ +#define PNG_INTERLACE_ADAM7 1 /* Adam7 interlacing */ +#define PNG_INTERLACE_LAST 2 /* Not a valid value */ + +/* These are for the oFFs chunk. These values should NOT be changed. */ +#define PNG_OFFSET_PIXEL 0 /* Offset in pixels */ +#define PNG_OFFSET_MICROMETER 1 /* Offset in micrometers (1/10^6 meter) */ +#define PNG_OFFSET_LAST 2 /* Not a valid value */ + +/* These are for the pCAL chunk. These values should NOT be changed. */ +#define PNG_EQUATION_LINEAR 0 /* Linear transformation */ +#define PNG_EQUATION_BASE_E 1 /* Exponential base e transform */ +#define PNG_EQUATION_ARBITRARY 2 /* Arbitrary base exponential transform */ +#define PNG_EQUATION_HYPERBOLIC 3 /* Hyperbolic sine transformation */ +#define PNG_EQUATION_LAST 4 /* Not a valid value */ + +/* These are for the sCAL chunk. These values should NOT be changed. */ +#define PNG_SCALE_UNKNOWN 0 /* unknown unit (image scale) */ +#define PNG_SCALE_METER 1 /* meters per pixel */ +#define PNG_SCALE_RADIAN 2 /* radians per pixel */ +#define PNG_SCALE_LAST 3 /* Not a valid value */ + +/* These are for the pHYs chunk. These values should NOT be changed. */ +#define PNG_RESOLUTION_UNKNOWN 0 /* pixels/unknown unit (aspect ratio) */ +#define PNG_RESOLUTION_METER 1 /* pixels/meter */ +#define PNG_RESOLUTION_LAST 2 /* Not a valid value */ + +/* These are for the sRGB chunk. These values should NOT be changed. */ +#define PNG_sRGB_INTENT_PERCEPTUAL 0 +#define PNG_sRGB_INTENT_RELATIVE 1 +#define PNG_sRGB_INTENT_SATURATION 2 +#define PNG_sRGB_INTENT_ABSOLUTE 3 +#define PNG_sRGB_INTENT_LAST 4 /* Not a valid value */ + +/* This is for text chunks */ +#define PNG_KEYWORD_MAX_LENGTH 79 + +/* Maximum number of entries in PLTE/sPLT/tRNS arrays */ +#define PNG_MAX_PALETTE_LENGTH 256 + +/* These determine if an ancillary chunk's data has been successfully read + * from the PNG header, or if the application has filled in the corresponding + * data in the info_struct to be written into the output file. The values + * of the PNG_INFO_<chunk> defines should NOT be changed. + */ +#define PNG_INFO_gAMA 0x0001 +#define PNG_INFO_sBIT 0x0002 +#define PNG_INFO_cHRM 0x0004 +#define PNG_INFO_PLTE 0x0008 +#define PNG_INFO_tRNS 0x0010 +#define PNG_INFO_bKGD 0x0020 +#define PNG_INFO_hIST 0x0040 +#define PNG_INFO_pHYs 0x0080 +#define PNG_INFO_oFFs 0x0100 +#define PNG_INFO_tIME 0x0200 +#define PNG_INFO_pCAL 0x0400 +#define PNG_INFO_sRGB 0x0800 /* GR-P, 0.96a */ +#define PNG_INFO_iCCP 0x1000 /* ESR, 1.0.6 */ +#define PNG_INFO_sPLT 0x2000 /* ESR, 1.0.6 */ +#define PNG_INFO_sCAL 0x4000 /* ESR, 1.0.6 */ +#define PNG_INFO_IDAT 0x8000 /* ESR, 1.0.6 */ + +/* This is used for the transformation routines, as some of them + * change these values for the row. It also should enable using + * the routines for other purposes. + */ +typedef struct png_row_info_struct +{ + png_uint_32 width; /* width of row */ + png_size_t rowbytes; /* number of bytes in row */ + png_byte color_type; /* color type of row */ + png_byte bit_depth; /* bit depth of row */ + png_byte channels; /* number of channels (1, 2, 3, or 4) */ + png_byte pixel_depth; /* bits per pixel (depth * channels) */ +} png_row_info; + +typedef png_row_info FAR * png_row_infop; +typedef png_row_info FAR * FAR * png_row_infopp; + +/* The complete definition of png_struct has, as of libpng-1.5.0, + * been moved into a separate header file that is not accessible to + * applications. Read libpng-manual.txt or libpng.3 for more info. + */ +typedef struct png_struct_def png_struct; +typedef PNG_CONST png_struct FAR * png_const_structp; +typedef png_struct FAR * png_structp; + +/* These are the function types for the I/O functions and for the functions + * that allow the user to override the default I/O functions with his or her + * own. The png_error_ptr type should match that of user-supplied warning + * and error functions, while the png_rw_ptr type should match that of the + * user read/write data functions. Note that the 'write' function must not + * modify the buffer it is passed. The 'read' function, on the other hand, is + * expected to return the read data in the buffer. + */ +typedef PNG_CALLBACK(void, *png_error_ptr, (png_structp, png_const_charp)); +typedef PNG_CALLBACK(void, *png_rw_ptr, (png_structp, png_bytep, png_size_t)); +typedef PNG_CALLBACK(void, *png_flush_ptr, (png_structp)); +typedef PNG_CALLBACK(void, *png_read_status_ptr, (png_structp, png_uint_32, + int)); +typedef PNG_CALLBACK(void, *png_write_status_ptr, (png_structp, png_uint_32, + int)); + +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +typedef PNG_CALLBACK(void, *png_progressive_info_ptr, (png_structp, png_infop)); +typedef PNG_CALLBACK(void, *png_progressive_end_ptr, (png_structp, png_infop)); + +/* The following callback receives png_uint_32 row_number, int pass for the + * png_bytep data of the row. When transforming an interlaced image the + * row number is the row number within the sub-image of the interlace pass, so + * the value will increase to the height of the sub-image (not the full image) + * then reset to 0 for the next pass. + * + * Use PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to + * find the output pixel (x,y) given an interlaced sub-image pixel + * (row,col,pass). (See below for these macros.) + */ +typedef PNG_CALLBACK(void, *png_progressive_row_ptr, (png_structp, png_bytep, + png_uint_32, int)); +#endif + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) +typedef PNG_CALLBACK(void, *png_user_transform_ptr, (png_structp, png_row_infop, + png_bytep)); +#endif + +#ifdef PNG_USER_CHUNKS_SUPPORTED +typedef PNG_CALLBACK(int, *png_user_chunk_ptr, (png_structp, + png_unknown_chunkp)); +#endif +#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED +typedef PNG_CALLBACK(void, *png_unknown_chunk_ptr, (png_structp)); +#endif + +#ifdef PNG_SETJMP_SUPPORTED +/* This must match the function definition in <setjmp.h>, and the application + * must include this before png.h to obtain the definition of jmp_buf. The + * function is required to be PNG_NORETURN, but this is not checked. If the + * function does return the application will crash via an abort() or similar + * system level call. + * + * If you get a warning here while building the library you may need to make + * changes to ensure that pnglibconf.h records the calling convention used by + * your compiler. This may be very difficult - try using a different compiler + * to build the library! + */ +PNG_FUNCTION(void, (PNGCAPI *png_longjmp_ptr), PNGARG((jmp_buf, int)), typedef); +#endif + +/* Transform masks for the high-level interface */ +#define PNG_TRANSFORM_IDENTITY 0x0000 /* read and write */ +#define PNG_TRANSFORM_STRIP_16 0x0001 /* read only */ +#define PNG_TRANSFORM_STRIP_ALPHA 0x0002 /* read only */ +#define PNG_TRANSFORM_PACKING 0x0004 /* read and write */ +#define PNG_TRANSFORM_PACKSWAP 0x0008 /* read and write */ +#define PNG_TRANSFORM_EXPAND 0x0010 /* read only */ +#define PNG_TRANSFORM_INVERT_MONO 0x0020 /* read and write */ +#define PNG_TRANSFORM_SHIFT 0x0040 /* read and write */ +#define PNG_TRANSFORM_BGR 0x0080 /* read and write */ +#define PNG_TRANSFORM_SWAP_ALPHA 0x0100 /* read and write */ +#define PNG_TRANSFORM_SWAP_ENDIAN 0x0200 /* read and write */ +#define PNG_TRANSFORM_INVERT_ALPHA 0x0400 /* read and write */ +#define PNG_TRANSFORM_STRIP_FILLER 0x0800 /* write only */ +/* Added to libpng-1.2.34 */ +#define PNG_TRANSFORM_STRIP_FILLER_BEFORE PNG_TRANSFORM_STRIP_FILLER +#define PNG_TRANSFORM_STRIP_FILLER_AFTER 0x1000 /* write only */ +/* Added to libpng-1.4.0 */ +#define PNG_TRANSFORM_GRAY_TO_RGB 0x2000 /* read only */ +/* Added to libpng-1.5.4 */ +#define PNG_TRANSFORM_EXPAND_16 0x4000 /* read only */ +#define PNG_TRANSFORM_SCALE_16 0x8000 /* read only */ + +/* Flags for MNG supported features */ +#define PNG_FLAG_MNG_EMPTY_PLTE 0x01 +#define PNG_FLAG_MNG_FILTER_64 0x04 +#define PNG_ALL_MNG_FEATURES 0x05 + +/* NOTE: prior to 1.5 these functions had no 'API' style declaration, + * this allowed the zlib default functions to be used on Windows + * platforms. In 1.5 the zlib default malloc (which just calls malloc and + * ignores the first argument) should be completely compatible with the + * following. + */ +typedef PNG_CALLBACK(png_voidp, *png_malloc_ptr, (png_structp, + png_alloc_size_t)); +typedef PNG_CALLBACK(void, *png_free_ptr, (png_structp, png_voidp)); + +typedef png_struct FAR * FAR * png_structpp; + +/* Section 3: exported functions + * Here are the function definitions most commonly used. This is not + * the place to find out how to use libpng. See libpng-manual.txt for the + * full explanation, see example.c for the summary. This just provides + * a simple one line description of the use of each function. + * + * The PNG_EXPORT() and PNG_EXPORTA() macros used below are defined in + * pngconf.h and in the *.dfn files in the scripts directory. + * + * PNG_EXPORT(ordinal, type, name, (args)); + * + * ordinal: ordinal that is used while building + * *.def files. The ordinal value is only + * relevant when preprocessing png.h with + * the *.dfn files for building symbol table + * entries, and are removed by pngconf.h. + * type: return type of the function + * name: function name + * args: function arguments, with types + * + * When we wish to append attributes to a function prototype we use + * the PNG_EXPORTA() macro instead. + * + * PNG_EXPORTA(ordinal, type, name, (args), attributes); + * + * ordinal, type, name, and args: same as in PNG_EXPORT(). + * attributes: function attributes + */ + +/* Returns the version number of the library */ +PNG_EXPORT(1, png_uint_32, png_access_version_number, (void)); + +/* Tell lib we have already handled the first <num_bytes> magic bytes. + * Handling more than 8 bytes from the beginning of the file is an error. + */ +PNG_EXPORT(2, void, png_set_sig_bytes, (png_structp png_ptr, int num_bytes)); + +/* Check sig[start] through sig[start + num_to_check - 1] to see if it's a + * PNG file. Returns zero if the supplied bytes match the 8-byte PNG + * signature, and non-zero otherwise. Having num_to_check == 0 or + * start > 7 will always fail (ie return non-zero). + */ +PNG_EXPORT(3, int, png_sig_cmp, (png_const_bytep sig, png_size_t start, + png_size_t num_to_check)); + +/* Simple signature checking function. This is the same as calling + * png_check_sig(sig, n) := !png_sig_cmp(sig, 0, n). + */ +#define png_check_sig(sig, n) !png_sig_cmp((sig), 0, (n)) + +/* Allocate and initialize png_ptr struct for reading, and any other memory. */ +PNG_EXPORTA(4, png_structp, png_create_read_struct, + (png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn), + PNG_ALLOCATED); + +/* Allocate and initialize png_ptr struct for writing, and any other memory */ +PNG_EXPORTA(5, png_structp, png_create_write_struct, + (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, + png_error_ptr warn_fn), + PNG_ALLOCATED); + +PNG_EXPORT(6, png_size_t, png_get_compression_buffer_size, + (png_const_structp png_ptr)); + +PNG_EXPORT(7, void, png_set_compression_buffer_size, (png_structp png_ptr, + png_size_t size)); + +/* Moved from pngconf.h in 1.4.0 and modified to ensure setjmp/longjmp + * match up. + */ +#ifdef PNG_SETJMP_SUPPORTED +/* This function returns the jmp_buf built in to *png_ptr. It must be + * supplied with an appropriate 'longjmp' function to use on that jmp_buf + * unless the default error function is overridden in which case NULL is + * acceptable. The size of the jmp_buf is checked against the actual size + * allocated by the library - the call will return NULL on a mismatch + * indicating an ABI mismatch. + */ +PNG_EXPORT(8, jmp_buf*, png_set_longjmp_fn, (png_structp png_ptr, + png_longjmp_ptr longjmp_fn, size_t jmp_buf_size)); +# define png_jmpbuf(png_ptr) \ + (*png_set_longjmp_fn((png_ptr), longjmp, sizeof (jmp_buf))) +#else +# define png_jmpbuf(png_ptr) \ + (LIBPNG_WAS_COMPILED_WITH__PNG_NO_SETJMP) +#endif +/* This function should be used by libpng applications in place of + * longjmp(png_ptr->jmpbuf, val). If longjmp_fn() has been set, it + * will use it; otherwise it will call PNG_ABORT(). This function was + * added in libpng-1.5.0. + */ +PNG_EXPORTA(9, void, png_longjmp, (png_structp png_ptr, int val), + PNG_NORETURN); + +#ifdef PNG_READ_SUPPORTED +/* Reset the compression stream */ +PNG_EXPORT(10, int, png_reset_zstream, (png_structp png_ptr)); +#endif + +/* New functions added in libpng-1.0.2 (not enabled by default until 1.2.0) */ +#ifdef PNG_USER_MEM_SUPPORTED +PNG_EXPORTA(11, png_structp, png_create_read_struct_2, + (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, + png_error_ptr warn_fn, + png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn), + PNG_ALLOCATED); +PNG_EXPORTA(12, png_structp, png_create_write_struct_2, + (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, + png_error_ptr warn_fn, + png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn), + PNG_ALLOCATED); +#endif + +/* Write the PNG file signature. */ +PNG_EXPORT(13, void, png_write_sig, (png_structp png_ptr)); + +/* Write a PNG chunk - size, type, (optional) data, CRC. */ +PNG_EXPORT(14, void, png_write_chunk, (png_structp png_ptr, png_const_bytep + chunk_name, png_const_bytep data, png_size_t length)); + +/* Write the start of a PNG chunk - length and chunk name. */ +PNG_EXPORT(15, void, png_write_chunk_start, (png_structp png_ptr, + png_const_bytep chunk_name, png_uint_32 length)); + +/* Write the data of a PNG chunk started with png_write_chunk_start(). */ +PNG_EXPORT(16, void, png_write_chunk_data, (png_structp png_ptr, + png_const_bytep data, png_size_t length)); + +/* Finish a chunk started with png_write_chunk_start() (includes CRC). */ +PNG_EXPORT(17, void, png_write_chunk_end, (png_structp png_ptr)); + +/* Allocate and initialize the info structure */ +PNG_EXPORTA(18, png_infop, png_create_info_struct, (png_structp png_ptr), + PNG_ALLOCATED); + +PNG_EXPORT(19, void, png_info_init_3, (png_infopp info_ptr, + png_size_t png_info_struct_size)); + +/* Writes all the PNG information before the image. */ +PNG_EXPORT(20, void, png_write_info_before_PLTE, + (png_structp png_ptr, png_infop info_ptr)); +PNG_EXPORT(21, void, png_write_info, + (png_structp png_ptr, png_infop info_ptr)); + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +/* Read the information before the actual image data. */ +PNG_EXPORT(22, void, png_read_info, + (png_structp png_ptr, png_infop info_ptr)); +#endif + +#ifdef PNG_TIME_RFC1123_SUPPORTED +PNG_EXPORT(23, png_const_charp, png_convert_to_rfc1123, + (png_structp png_ptr, + png_const_timep ptime)); +#endif + +#ifdef PNG_CONVERT_tIME_SUPPORTED +/* Convert from a struct tm to png_time */ +PNG_EXPORT(24, void, png_convert_from_struct_tm, (png_timep ptime, + PNG_CONST struct tm FAR * ttime)); + +/* Convert from time_t to png_time. Uses gmtime() */ +PNG_EXPORT(25, void, png_convert_from_time_t, + (png_timep ptime, time_t ttime)); +#endif /* PNG_CONVERT_tIME_SUPPORTED */ + +#ifdef PNG_READ_EXPAND_SUPPORTED +/* Expand data to 24-bit RGB, or 8-bit grayscale, with alpha if available. */ +PNG_EXPORT(26, void, png_set_expand, (png_structp png_ptr)); +PNG_EXPORT(27, void, png_set_expand_gray_1_2_4_to_8, (png_structp png_ptr)); +PNG_EXPORT(28, void, png_set_palette_to_rgb, (png_structp png_ptr)); +PNG_EXPORT(29, void, png_set_tRNS_to_alpha, (png_structp png_ptr)); +#endif + +#ifdef PNG_READ_EXPAND_16_SUPPORTED +/* Expand to 16-bit channels, forces conversion of palette to RGB and expansion + * of a tRNS chunk if present. + */ +PNG_EXPORT(221, void, png_set_expand_16, (png_structp png_ptr)); +#endif + +#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) +/* Use blue, green, red order for pixels. */ +PNG_EXPORT(30, void, png_set_bgr, (png_structp png_ptr)); +#endif + +#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED +/* Expand the grayscale to 24-bit RGB if necessary. */ +PNG_EXPORT(31, void, png_set_gray_to_rgb, (png_structp png_ptr)); +#endif + +#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED +/* Reduce RGB to grayscale. */ +#define PNG_ERROR_ACTION_NONE 1 +#define PNG_ERROR_ACTION_WARN 2 +#define PNG_ERROR_ACTION_ERROR 3 +#define PNG_RGB_TO_GRAY_DEFAULT (-1)/*for red/green coefficients*/ + +PNG_FP_EXPORT(32, void, png_set_rgb_to_gray, (png_structp png_ptr, + int error_action, double red, double green)); +PNG_FIXED_EXPORT(33, void, png_set_rgb_to_gray_fixed, (png_structp png_ptr, + int error_action, png_fixed_point red, png_fixed_point green)); + +PNG_EXPORT(34, png_byte, png_get_rgb_to_gray_status, (png_const_structp + png_ptr)); +#endif + +#ifdef PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED +PNG_EXPORT(35, void, png_build_grayscale_palette, (int bit_depth, + png_colorp palette)); +#endif + +#ifdef PNG_READ_ALPHA_MODE_SUPPORTED +/* How the alpha channel is interpreted - this affects how the color channels of + * a PNG file are returned when an alpha channel, or tRNS chunk in a palette + * file, is present. + * + * This has no effect on the way pixels are written into a PNG output + * datastream. The color samples in a PNG datastream are never premultiplied + * with the alpha samples. + * + * The default is to return data according to the PNG specification: the alpha + * channel is a linear measure of the contribution of the pixel to the + * corresponding composited pixel. The gamma encoded color channels must be + * scaled according to the contribution and to do this it is necessary to undo + * the encoding, scale the color values, perform the composition and reencode + * the values. This is the 'PNG' mode. + * + * The alternative is to 'associate' the alpha with the color information by + * storing color channel values that have been scaled by the alpha. The + * advantage is that the color channels can be resampled (the image can be + * scaled) in this form. The disadvantage is that normal practice is to store + * linear, not (gamma) encoded, values and this requires 16-bit channels for + * still images rather than the 8-bit channels that are just about sufficient if + * gamma encoding is used. In addition all non-transparent pixel values, + * including completely opaque ones, must be gamma encoded to produce the final + * image. This is the 'STANDARD', 'ASSOCIATED' or 'PREMULTIPLIED' mode (the + * latter being the two common names for associated alpha color channels.) + * + * Since it is not necessary to perform arithmetic on opaque color values so + * long as they are not to be resampled and are in the final color space it is + * possible to optimize the handling of alpha by storing the opaque pixels in + * the PNG format (adjusted for the output color space) while storing partially + * opaque pixels in the standard, linear, format. The accuracy required for + * standard alpha composition is relatively low, because the pixels are + * isolated, therefore typically the accuracy loss in storing 8-bit linear + * values is acceptable. (This is not true if the alpha channel is used to + * simulate transparency over large areas - use 16 bits or the PNG mode in + * this case!) This is the 'OPTIMIZED' mode. For this mode a pixel is + * treated as opaque only if the alpha value is equal to the maximum value. + * + * The final choice is to gamma encode the alpha channel as well. This is + * broken because, in practice, no implementation that uses this choice + * correctly undoes the encoding before handling alpha composition. Use this + * choice only if other serious errors in the software or hardware you use + * mandate it; the typical serious error is for dark halos to appear around + * opaque areas of the composited PNG image because of arithmetic overflow. + * + * The API function png_set_alpha_mode specifies which of these choices to use + * with an enumerated 'mode' value and the gamma of the required output: + */ +#define PNG_ALPHA_PNG 0 /* according to the PNG standard */ +#define PNG_ALPHA_STANDARD 1 /* according to Porter/Duff */ +#define PNG_ALPHA_ASSOCIATED 1 /* as above; this is the normal practice */ +#define PNG_ALPHA_PREMULTIPLIED 1 /* as above */ +#define PNG_ALPHA_OPTIMIZED 2 /* 'PNG' for opaque pixels, else 'STANDARD' */ +#define PNG_ALPHA_BROKEN 3 /* the alpha channel is gamma encoded */ + +PNG_FP_EXPORT(227, void, png_set_alpha_mode, (png_structp png_ptr, int mode, + double output_gamma)); +PNG_FIXED_EXPORT(228, void, png_set_alpha_mode_fixed, (png_structp png_ptr, + int mode, png_fixed_point output_gamma)); +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_ALPHA_MODE_SUPPORTED) +/* The output_gamma value is a screen gamma in libpng terminology: it expresses + * how to decode the output values, not how they are encoded. The values used + * correspond to the normal numbers used to describe the overall gamma of a + * computer display system; for example 2.2 for an sRGB conformant system. The + * values are scaled by 100000 in the _fixed version of the API (so 220000 for + * sRGB.) + * + * The inverse of the value is always used to provide a default for the PNG file + * encoding if it has no gAMA chunk and if png_set_gamma() has not been called + * to override the PNG gamma information. + * + * When the ALPHA_OPTIMIZED mode is selected the output gamma is used to encode + * opaque pixels however pixels with lower alpha values are not encoded, + * regardless of the output gamma setting. + * + * When the standard Porter Duff handling is requested with mode 1 the output + * encoding is set to be linear and the output_gamma value is only relevant + * as a default for input data that has no gamma information. The linear output + * encoding will be overridden if png_set_gamma() is called - the results may be + * highly unexpected! + * + * The following numbers are derived from the sRGB standard and the research + * behind it. sRGB is defined to be approximated by a PNG gAMA chunk value of + * 0.45455 (1/2.2) for PNG. The value implicitly includes any viewing + * correction required to take account of any differences in the color + * environment of the original scene and the intended display environment; the + * value expresses how to *decode* the image for display, not how the original + * data was *encoded*. + * + * sRGB provides a peg for the PNG standard by defining a viewing environment. + * sRGB itself, and earlier TV standards, actually use a more complex transform + * (a linear portion then a gamma 2.4 power law) than PNG can express. (PNG is + * limited to simple power laws.) By saying that an image for direct display on + * an sRGB conformant system should be stored with a gAMA chunk value of 45455 + * (11.3.3.2 and 11.3.3.5 of the ISO PNG specification) the PNG specification + * makes it possible to derive values for other display systems and + * environments. + * + * The Mac value is deduced from the sRGB based on an assumption that the actual + * extra viewing correction used in early Mac display systems was implemented as + * a power 1.45 lookup table. + * + * Any system where a programmable lookup table is used or where the behavior of + * the final display device characteristics can be changed requires system + * specific code to obtain the current characteristic. However this can be + * difficult and most PNG gamma correction only requires an approximate value. + * + * By default, if png_set_alpha_mode() is not called, libpng assumes that all + * values are unencoded, linear, values and that the output device also has a + * linear characteristic. This is only very rarely correct - it is invariably + * better to call png_set_alpha_mode() with PNG_DEFAULT_sRGB than rely on the + * default if you don't know what the right answer is! + * + * The special value PNG_GAMMA_MAC_18 indicates an older Mac system (pre Mac OS + * 10.6) which used a correction table to implement a somewhat lower gamma on an + * otherwise sRGB system. + * + * Both these values are reserved (not simple gamma values) in order to allow + * more precise correction internally in the future. + * + * NOTE: the following values can be passed to either the fixed or floating + * point APIs, but the floating point API will also accept floating point + * values. + */ +#define PNG_DEFAULT_sRGB -1 /* sRGB gamma and color space */ +#define PNG_GAMMA_MAC_18 -2 /* Old Mac '1.8' gamma and color space */ +#define PNG_GAMMA_sRGB 220000 /* Television standards--matches sRGB gamma */ +#define PNG_GAMMA_LINEAR PNG_FP_1 /* Linear */ +#endif + +/* The following are examples of calls to png_set_alpha_mode to achieve the + * required overall gamma correction and, where necessary, alpha + * premultiplication. + * + * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_DEFAULT_sRGB); + * This is the default libpng handling of the alpha channel - it is not + * pre-multiplied into the color components. In addition the call states + * that the output is for a sRGB system and causes all PNG files without gAMA + * chunks to be assumed to be encoded using sRGB. + * + * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_GAMMA_MAC); + * In this case the output is assumed to be something like an sRGB conformant + * display preceeded by a power-law lookup table of power 1.45. This is how + * early Mac systems behaved. + * + * png_set_alpha_mode(pp, PNG_ALPHA_STANDARD, PNG_GAMMA_LINEAR); + * This is the classic Jim Blinn approach and will work in academic + * environments where everything is done by the book. It has the shortcoming + * of assuming that input PNG data with no gamma information is linear - this + * is unlikely to be correct unless the PNG files where generated locally. + * Most of the time the output precision will be so low as to show + * significant banding in dark areas of the image. + * + * png_set_expand_16(pp); + * png_set_alpha_mode(pp, PNG_ALPHA_STANDARD, PNG_DEFAULT_sRGB); + * This is a somewhat more realistic Jim Blinn inspired approach. PNG files + * are assumed to have the sRGB encoding if not marked with a gamma value and + * the output is always 16 bits per component. This permits accurate scaling + * and processing of the data. If you know that your input PNG files were + * generated locally you might need to replace PNG_DEFAULT_sRGB with the + * correct value for your system. + * + * png_set_alpha_mode(pp, PNG_ALPHA_OPTIMIZED, PNG_DEFAULT_sRGB); + * If you just need to composite the PNG image onto an existing background + * and if you control the code that does this you can use the optimization + * setting. In this case you just copy completely opaque pixels to the + * output. For pixels that are not completely transparent (you just skip + * those) you do the composition math using png_composite or png_composite_16 + * below then encode the resultant 8-bit or 16-bit values to match the output + * encoding. + * + * Other cases + * If neither the PNG nor the standard linear encoding work for you because + * of the software or hardware you use then you have a big problem. The PNG + * case will probably result in halos around the image. The linear encoding + * will probably result in a washed out, too bright, image (it's actually too + * contrasty.) Try the ALPHA_OPTIMIZED mode above - this will probably + * substantially reduce the halos. Alternatively try: + * + * png_set_alpha_mode(pp, PNG_ALPHA_BROKEN, PNG_DEFAULT_sRGB); + * This option will also reduce the halos, but there will be slight dark + * halos round the opaque parts of the image where the background is light. + * In the OPTIMIZED mode the halos will be light halos where the background + * is dark. Take your pick - the halos are unavoidable unless you can get + * your hardware/software fixed! (The OPTIMIZED approach is slightly + * faster.) + * + * When the default gamma of PNG files doesn't match the output gamma. + * If you have PNG files with no gamma information png_set_alpha_mode allows + * you to provide a default gamma, but it also sets the ouput gamma to the + * matching value. If you know your PNG files have a gamma that doesn't + * match the output you can take advantage of the fact that + * png_set_alpha_mode always sets the output gamma but only sets the PNG + * default if it is not already set: + * + * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_DEFAULT_sRGB); + * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_GAMMA_MAC); + * The first call sets both the default and the output gamma values, the + * second call overrides the output gamma without changing the default. This + * is easier than achieving the same effect with png_set_gamma. You must use + * PNG_ALPHA_PNG for the first call - internal checking in png_set_alpha will + * fire if more than one call to png_set_alpha_mode and png_set_background is + * made in the same read operation, however multiple calls with PNG_ALPHA_PNG + * are ignored. + */ + +#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED +PNG_EXPORT(36, void, png_set_strip_alpha, (png_structp png_ptr)); +#endif + +#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ + defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) +PNG_EXPORT(37, void, png_set_swap_alpha, (png_structp png_ptr)); +#endif + +#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \ + defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) +PNG_EXPORT(38, void, png_set_invert_alpha, (png_structp png_ptr)); +#endif + +#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) +/* Add a filler byte to 8-bit Gray or 24-bit RGB images. */ +PNG_EXPORT(39, void, png_set_filler, (png_structp png_ptr, png_uint_32 filler, + int flags)); +/* The values of the PNG_FILLER_ defines should NOT be changed */ +# define PNG_FILLER_BEFORE 0 +# define PNG_FILLER_AFTER 1 +/* Add an alpha byte to 8-bit Gray or 24-bit RGB images. */ +PNG_EXPORT(40, void, png_set_add_alpha, + (png_structp png_ptr, png_uint_32 filler, + int flags)); +#endif /* PNG_READ_FILLER_SUPPORTED || PNG_WRITE_FILLER_SUPPORTED */ + +#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) +/* Swap bytes in 16-bit depth files. */ +PNG_EXPORT(41, void, png_set_swap, (png_structp png_ptr)); +#endif + +#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) +/* Use 1 byte per pixel in 1, 2, or 4-bit depth files. */ +PNG_EXPORT(42, void, png_set_packing, (png_structp png_ptr)); +#endif + +#if defined(PNG_READ_PACKSWAP_SUPPORTED) || \ + defined(PNG_WRITE_PACKSWAP_SUPPORTED) +/* Swap packing order of pixels in bytes. */ +PNG_EXPORT(43, void, png_set_packswap, (png_structp png_ptr)); +#endif + +#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) +/* Converts files to legal bit depths. */ +PNG_EXPORT(44, void, png_set_shift, (png_structp png_ptr, png_const_color_8p + true_bits)); +#endif + +#if defined(PNG_READ_INTERLACING_SUPPORTED) || \ + defined(PNG_WRITE_INTERLACING_SUPPORTED) +/* Have the code handle the interlacing. Returns the number of passes. + * MUST be called before png_read_update_info or png_start_read_image, + * otherwise it will not have the desired effect. Note that it is still + * necessary to call png_read_row or png_read_rows png_get_image_height + * times for each pass. +*/ +PNG_EXPORT(45, int, png_set_interlace_handling, (png_structp png_ptr)); +#endif + +#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) +/* Invert monochrome files */ +PNG_EXPORT(46, void, png_set_invert_mono, (png_structp png_ptr)); +#endif + +#ifdef PNG_READ_BACKGROUND_SUPPORTED +/* Handle alpha and tRNS by replacing with a background color. Prior to + * libpng-1.5.4 this API must not be called before the PNG file header has been + * read. Doing so will result in unexpected behavior and possible warnings or + * errors if the PNG file contains a bKGD chunk. + */ +PNG_FP_EXPORT(47, void, png_set_background, (png_structp png_ptr, + png_const_color_16p background_color, int background_gamma_code, + int need_expand, double background_gamma)); +PNG_FIXED_EXPORT(215, void, png_set_background_fixed, (png_structp png_ptr, + png_const_color_16p background_color, int background_gamma_code, + int need_expand, png_fixed_point background_gamma)); +#endif +#ifdef PNG_READ_BACKGROUND_SUPPORTED +# define PNG_BACKGROUND_GAMMA_UNKNOWN 0 +# define PNG_BACKGROUND_GAMMA_SCREEN 1 +# define PNG_BACKGROUND_GAMMA_FILE 2 +# define PNG_BACKGROUND_GAMMA_UNIQUE 3 +#endif + +#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED +/* Scale a 16-bit depth file down to 8-bit, accurately. */ +PNG_EXPORT(229, void, png_set_scale_16, (png_structp png_ptr)); +#endif + +#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED +#define PNG_READ_16_TO_8 SUPPORTED /* Name prior to 1.5.4 */ +/* Strip the second byte of information from a 16-bit depth file. */ +PNG_EXPORT(48, void, png_set_strip_16, (png_structp png_ptr)); +#endif + +#ifdef PNG_READ_QUANTIZE_SUPPORTED +/* Turn on quantizing, and reduce the palette to the number of colors + * available. + */ +PNG_EXPORT(49, void, png_set_quantize, + (png_structp png_ptr, png_colorp palette, + int num_palette, int maximum_colors, png_const_uint_16p histogram, + int full_quantize)); +#endif + +#ifdef PNG_READ_GAMMA_SUPPORTED +/* The threshold on gamma processing is configurable but hard-wired into the + * library. The following is the floating point variant. + */ +#define PNG_GAMMA_THRESHOLD (PNG_GAMMA_THRESHOLD_FIXED*.00001) + +/* Handle gamma correction. Screen_gamma=(display_exponent). + * NOTE: this API simply sets the screen and file gamma values. It will + * therefore override the value for gamma in a PNG file if it is called after + * the file header has been read - use with care - call before reading the PNG + * file for best results! + * + * These routines accept the same gamma values as png_set_alpha_mode (described + * above). The PNG_GAMMA_ defines and PNG_DEFAULT_sRGB can be passed to either + * API (floating point or fixed.) Notice, however, that the 'file_gamma' value + * is the inverse of a 'screen gamma' value. + */ +PNG_FP_EXPORT(50, void, png_set_gamma, + (png_structp png_ptr, double screen_gamma, + double override_file_gamma)); +PNG_FIXED_EXPORT(208, void, png_set_gamma_fixed, (png_structp png_ptr, + png_fixed_point screen_gamma, png_fixed_point override_file_gamma)); +#endif + +#ifdef PNG_WRITE_FLUSH_SUPPORTED +/* Set how many lines between output flushes - 0 for no flushing */ +PNG_EXPORT(51, void, png_set_flush, (png_structp png_ptr, int nrows)); +/* Flush the current PNG output buffer */ +PNG_EXPORT(52, void, png_write_flush, (png_structp png_ptr)); +#endif + +/* Optional update palette with requested transformations */ +PNG_EXPORT(53, void, png_start_read_image, (png_structp png_ptr)); + +/* Optional call to update the users info structure */ +PNG_EXPORT(54, void, png_read_update_info, + (png_structp png_ptr, png_infop info_ptr)); + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +/* Read one or more rows of image data. */ +PNG_EXPORT(55, void, png_read_rows, (png_structp png_ptr, png_bytepp row, + png_bytepp display_row, png_uint_32 num_rows)); +#endif + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +/* Read a row of data. */ +PNG_EXPORT(56, void, png_read_row, (png_structp png_ptr, png_bytep row, + png_bytep display_row)); +#endif + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +/* Read the whole image into memory at once. */ +PNG_EXPORT(57, void, png_read_image, (png_structp png_ptr, png_bytepp image)); +#endif + +/* Write a row of image data */ +PNG_EXPORT(58, void, png_write_row, + (png_structp png_ptr, png_const_bytep row)); + +/* Write a few rows of image data: (*row) is not written; however, the type + * is declared as writeable to maintain compatibility with previous versions + * of libpng and to allow the 'display_row' array from read_rows to be passed + * unchanged to write_rows. + */ +PNG_EXPORT(59, void, png_write_rows, (png_structp png_ptr, png_bytepp row, + png_uint_32 num_rows)); + +/* Write the image data */ +PNG_EXPORT(60, void, png_write_image, + (png_structp png_ptr, png_bytepp image)); + +/* Write the end of the PNG file. */ +PNG_EXPORT(61, void, png_write_end, + (png_structp png_ptr, png_infop info_ptr)); + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +/* Read the end of the PNG file. */ +PNG_EXPORT(62, void, png_read_end, (png_structp png_ptr, png_infop info_ptr)); +#endif + +/* Free any memory associated with the png_info_struct */ +PNG_EXPORT(63, void, png_destroy_info_struct, (png_structp png_ptr, + png_infopp info_ptr_ptr)); + +/* Free any memory associated with the png_struct and the png_info_structs */ +PNG_EXPORT(64, void, png_destroy_read_struct, (png_structpp png_ptr_ptr, + png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr)); + +/* Free any memory associated with the png_struct and the png_info_structs */ +PNG_EXPORT(65, void, png_destroy_write_struct, (png_structpp png_ptr_ptr, + png_infopp info_ptr_ptr)); + +/* Set the libpng method of handling chunk CRC errors */ +PNG_EXPORT(66, void, png_set_crc_action, + (png_structp png_ptr, int crit_action, int ancil_action)); + +/* Values for png_set_crc_action() say how to handle CRC errors in + * ancillary and critical chunks, and whether to use the data contained + * therein. Note that it is impossible to "discard" data in a critical + * chunk. For versions prior to 0.90, the action was always error/quit, + * whereas in version 0.90 and later, the action for CRC errors in ancillary + * chunks is warn/discard. These values should NOT be changed. + * + * value action:critical action:ancillary + */ +#define PNG_CRC_DEFAULT 0 /* error/quit warn/discard data */ +#define PNG_CRC_ERROR_QUIT 1 /* error/quit error/quit */ +#define PNG_CRC_WARN_DISCARD 2 /* (INVALID) warn/discard data */ +#define PNG_CRC_WARN_USE 3 /* warn/use data warn/use data */ +#define PNG_CRC_QUIET_USE 4 /* quiet/use data quiet/use data */ +#define PNG_CRC_NO_CHANGE 5 /* use current value use current value */ + +/* These functions give the user control over the scan-line filtering in + * libpng and the compression methods used by zlib. These functions are + * mainly useful for testing, as the defaults should work with most users. + * Those users who are tight on memory or want faster performance at the + * expense of compression can modify them. See the compression library + * header file (zlib.h) for an explination of the compression functions. + */ + +/* Set the filtering method(s) used by libpng. Currently, the only valid + * value for "method" is 0. + */ +PNG_EXPORT(67, void, png_set_filter, + (png_structp png_ptr, int method, int filters)); + +/* Flags for png_set_filter() to say which filters to use. The flags + * are chosen so that they don't conflict with real filter types + * below, in case they are supplied instead of the #defined constants. + * These values should NOT be changed. + */ +#define PNG_NO_FILTERS 0x00 +#define PNG_FILTER_NONE 0x08 +#define PNG_FILTER_SUB 0x10 +#define PNG_FILTER_UP 0x20 +#define PNG_FILTER_AVG 0x40 +#define PNG_FILTER_PAETH 0x80 +#define PNG_ALL_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP | \ + PNG_FILTER_AVG | PNG_FILTER_PAETH) + +/* Filter values (not flags) - used in pngwrite.c, pngwutil.c for now. + * These defines should NOT be changed. + */ +#define PNG_FILTER_VALUE_NONE 0 +#define PNG_FILTER_VALUE_SUB 1 +#define PNG_FILTER_VALUE_UP 2 +#define PNG_FILTER_VALUE_AVG 3 +#define PNG_FILTER_VALUE_PAETH 4 +#define PNG_FILTER_VALUE_LAST 5 + +#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED /* EXPERIMENTAL */ +/* The "heuristic_method" is given by one of the PNG_FILTER_HEURISTIC_ + * defines, either the default (minimum-sum-of-absolute-differences), or + * the experimental method (weighted-minimum-sum-of-absolute-differences). + * + * Weights are factors >= 1.0, indicating how important it is to keep the + * filter type consistent between rows. Larger numbers mean the current + * filter is that many times as likely to be the same as the "num_weights" + * previous filters. This is cumulative for each previous row with a weight. + * There needs to be "num_weights" values in "filter_weights", or it can be + * NULL if the weights aren't being specified. Weights have no influence on + * the selection of the first row filter. Well chosen weights can (in theory) + * improve the compression for a given image. + * + * Costs are factors >= 1.0 indicating the relative decoding costs of a + * filter type. Higher costs indicate more decoding expense, and are + * therefore less likely to be selected over a filter with lower computational + * costs. There needs to be a value in "filter_costs" for each valid filter + * type (given by PNG_FILTER_VALUE_LAST), or it can be NULL if you aren't + * setting the costs. Costs try to improve the speed of decompression without + * unduly increasing the compressed image size. + * + * A negative weight or cost indicates the default value is to be used, and + * values in the range [0.0, 1.0) indicate the value is to remain unchanged. + * The default values for both weights and costs are currently 1.0, but may + * change if good general weighting/cost heuristics can be found. If both + * the weights and costs are set to 1.0, this degenerates the WEIGHTED method + * to the UNWEIGHTED method, but with added encoding time/computation. + */ +PNG_FP_EXPORT(68, void, png_set_filter_heuristics, (png_structp png_ptr, + int heuristic_method, int num_weights, png_const_doublep filter_weights, + png_const_doublep filter_costs)); +PNG_FIXED_EXPORT(209, void, png_set_filter_heuristics_fixed, + (png_structp png_ptr, + int heuristic_method, int num_weights, png_const_fixed_point_p + filter_weights, png_const_fixed_point_p filter_costs)); +#endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ + +/* Heuristic used for row filter selection. These defines should NOT be + * changed. + */ +#define PNG_FILTER_HEURISTIC_DEFAULT 0 /* Currently "UNWEIGHTED" */ +#define PNG_FILTER_HEURISTIC_UNWEIGHTED 1 /* Used by libpng < 0.95 */ +#define PNG_FILTER_HEURISTIC_WEIGHTED 2 /* Experimental feature */ +#define PNG_FILTER_HEURISTIC_LAST 3 /* Not a valid value */ + +#ifdef PNG_WRITE_SUPPORTED +/* Set the library compression level. Currently, valid values range from + * 0 - 9, corresponding directly to the zlib compression levels 0 - 9 + * (0 - no compression, 9 - "maximal" compression). Note that tests have + * shown that zlib compression levels 3-6 usually perform as well as level 9 + * for PNG images, and do considerably fewer caclulations. In the future, + * these values may not correspond directly to the zlib compression levels. + */ +PNG_EXPORT(69, void, png_set_compression_level, + (png_structp png_ptr, int level)); + +PNG_EXPORT(70, void, png_set_compression_mem_level, (png_structp png_ptr, + int mem_level)); + +PNG_EXPORT(71, void, png_set_compression_strategy, (png_structp png_ptr, + int strategy)); + +/* If PNG_WRITE_OPTIMIZE_CMF_SUPPORTED is defined, libpng will use a + * smaller value of window_bits if it can do so safely. + */ +PNG_EXPORT(72, void, png_set_compression_window_bits, (png_structp png_ptr, + int window_bits)); + +PNG_EXPORT(73, void, png_set_compression_method, (png_structp png_ptr, + int method)); +#endif + +#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED +/* Also set zlib parameters for compressing non-IDAT chunks */ +PNG_EXPORT(222, void, png_set_text_compression_level, + (png_structp png_ptr, int level)); + +PNG_EXPORT(223, void, png_set_text_compression_mem_level, (png_structp png_ptr, + int mem_level)); + +PNG_EXPORT(224, void, png_set_text_compression_strategy, (png_structp png_ptr, + int strategy)); + +/* If PNG_WRITE_OPTIMIZE_CMF_SUPPORTED is defined, libpng will use a + * smaller value of window_bits if it can do so safely. + */ +PNG_EXPORT(225, void, png_set_text_compression_window_bits, (png_structp + png_ptr, int window_bits)); + +PNG_EXPORT(226, void, png_set_text_compression_method, (png_structp png_ptr, + int method)); +#endif /* PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED */ + +/* These next functions are called for input/output, memory, and error + * handling. They are in the file pngrio.c, pngwio.c, and pngerror.c, + * and call standard C I/O routines such as fread(), fwrite(), and + * fprintf(). These functions can be made to use other I/O routines + * at run time for those applications that need to handle I/O in a + * different manner by calling png_set_???_fn(). See libpng-manual.txt for + * more information. + */ + +#ifdef PNG_STDIO_SUPPORTED +/* Initialize the input/output for the PNG file to the default functions. */ +PNG_EXPORT(74, void, png_init_io, (png_structp png_ptr, png_FILE_p fp)); +#endif + +/* Replace the (error and abort), and warning functions with user + * supplied functions. If no messages are to be printed you must still + * write and use replacement functions. The replacement error_fn should + * still do a longjmp to the last setjmp location if you are using this + * method of error handling. If error_fn or warning_fn is NULL, the + * default function will be used. + */ + +PNG_EXPORT(75, void, png_set_error_fn, + (png_structp png_ptr, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warning_fn)); + +/* Return the user pointer associated with the error functions */ +PNG_EXPORT(76, png_voidp, png_get_error_ptr, (png_const_structp png_ptr)); + +/* Replace the default data output functions with a user supplied one(s). + * If buffered output is not used, then output_flush_fn can be set to NULL. + * If PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile time + * output_flush_fn will be ignored (and thus can be NULL). + * It is probably a mistake to use NULL for output_flush_fn if + * write_data_fn is not also NULL unless you have built libpng with + * PNG_WRITE_FLUSH_SUPPORTED undefined, because in this case libpng's + * default flush function, which uses the standard *FILE structure, will + * be used. + */ +PNG_EXPORT(77, void, png_set_write_fn, (png_structp png_ptr, png_voidp io_ptr, + png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)); + +/* Replace the default data input function with a user supplied one. */ +PNG_EXPORT(78, void, png_set_read_fn, (png_structp png_ptr, png_voidp io_ptr, + png_rw_ptr read_data_fn)); + +/* Return the user pointer associated with the I/O functions */ +PNG_EXPORT(79, png_voidp, png_get_io_ptr, (png_structp png_ptr)); + +PNG_EXPORT(80, void, png_set_read_status_fn, (png_structp png_ptr, + png_read_status_ptr read_row_fn)); + +PNG_EXPORT(81, void, png_set_write_status_fn, (png_structp png_ptr, + png_write_status_ptr write_row_fn)); + +#ifdef PNG_USER_MEM_SUPPORTED +/* Replace the default memory allocation functions with user supplied one(s). */ +PNG_EXPORT(82, void, png_set_mem_fn, (png_structp png_ptr, png_voidp mem_ptr, + png_malloc_ptr malloc_fn, png_free_ptr free_fn)); +/* Return the user pointer associated with the memory functions */ +PNG_EXPORT(83, png_voidp, png_get_mem_ptr, (png_const_structp png_ptr)); +#endif + +#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED +PNG_EXPORT(84, void, png_set_read_user_transform_fn, (png_structp png_ptr, + png_user_transform_ptr read_user_transform_fn)); +#endif + +#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED +PNG_EXPORT(85, void, png_set_write_user_transform_fn, (png_structp png_ptr, + png_user_transform_ptr write_user_transform_fn)); +#endif + +#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED +PNG_EXPORT(86, void, png_set_user_transform_info, (png_structp png_ptr, + png_voidp user_transform_ptr, int user_transform_depth, + int user_transform_channels)); +/* Return the user pointer associated with the user transform functions */ +PNG_EXPORT(87, png_voidp, png_get_user_transform_ptr, + (png_const_structp png_ptr)); +#endif + +#ifdef PNG_USER_TRANSFORM_INFO_SUPPORTED +/* Return information about the row currently being processed. Note that these + * APIs do not fail but will return unexpected results if called outside a user + * transform callback. Also note that when transforming an interlaced image the + * row number is the row number within the sub-image of the interlace pass, so + * the value will increase to the height of the sub-image (not the full image) + * then reset to 0 for the next pass. + * + * Use PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to + * find the output pixel (x,y) given an interlaced sub-image pixel + * (row,col,pass). (See below for these macros.) + */ +PNG_EXPORT(217, png_uint_32, png_get_current_row_number, (png_const_structp)); +PNG_EXPORT(218, png_byte, png_get_current_pass_number, (png_const_structp)); +#endif + +#ifdef PNG_USER_CHUNKS_SUPPORTED +PNG_EXPORT(88, void, png_set_read_user_chunk_fn, (png_structp png_ptr, + png_voidp user_chunk_ptr, png_user_chunk_ptr read_user_chunk_fn)); +PNG_EXPORT(89, png_voidp, png_get_user_chunk_ptr, (png_const_structp png_ptr)); +#endif + +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +/* Sets the function callbacks for the push reader, and a pointer to a + * user-defined structure available to the callback functions. + */ +PNG_EXPORT(90, void, png_set_progressive_read_fn, (png_structp png_ptr, + png_voidp progressive_ptr, png_progressive_info_ptr info_fn, + png_progressive_row_ptr row_fn, png_progressive_end_ptr end_fn)); + +/* Returns the user pointer associated with the push read functions */ +PNG_EXPORT(91, png_voidp, png_get_progressive_ptr, (png_const_structp png_ptr)); + +/* Function to be called when data becomes available */ +PNG_EXPORT(92, void, png_process_data, + (png_structp png_ptr, png_infop info_ptr, + png_bytep buffer, png_size_t buffer_size)); + +/* A function which may be called *only* within png_process_data to stop the + * processing of any more data. The function returns the number of bytes + * remaining, excluding any that libpng has cached internally. A subsequent + * call to png_process_data must supply these bytes again. If the argument + * 'save' is set to true the routine will first save all the pending data and + * will always return 0. + */ +PNG_EXPORT(219, png_size_t, png_process_data_pause, (png_structp, int save)); + +/* A function which may be called *only* outside (after) a call to + * png_process_data. It returns the number of bytes of data to skip in the + * input. Normally it will return 0, but if it returns a non-zero value the + * application must skip than number of bytes of input data and pass the + * following data to the next call to png_process_data. + */ +PNG_EXPORT(220, png_uint_32, png_process_data_skip, (png_structp)); + +#ifdef PNG_READ_INTERLACING_SUPPORTED +/* Function that combines rows. 'new_row' is a flag that should come from + * the callback and be non-NULL if anything needs to be done; the library + * stores its own version of the new data internally and ignores the passed + * in value. + */ +PNG_EXPORT(93, void, png_progressive_combine_row, (png_structp png_ptr, + png_bytep old_row, png_const_bytep new_row)); +#endif /* PNG_READ_INTERLACING_SUPPORTED */ +#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ + +PNG_EXPORTA(94, png_voidp, png_malloc, + (png_structp png_ptr, png_alloc_size_t size), + PNG_ALLOCATED); +/* Added at libpng version 1.4.0 */ +PNG_EXPORTA(95, png_voidp, png_calloc, + (png_structp png_ptr, png_alloc_size_t size), + PNG_ALLOCATED); + +/* Added at libpng version 1.2.4 */ +PNG_EXPORTA(96, png_voidp, png_malloc_warn, (png_structp png_ptr, + png_alloc_size_t size), PNG_ALLOCATED); + +/* Frees a pointer allocated by png_malloc() */ +PNG_EXPORT(97, void, png_free, (png_structp png_ptr, png_voidp ptr)); + +/* Free data that was allocated internally */ +PNG_EXPORT(98, void, png_free_data, + (png_structp png_ptr, png_infop info_ptr, png_uint_32 free_me, int num)); + +/* Reassign responsibility for freeing existing data, whether allocated + * by libpng or by the application */ +PNG_EXPORT(99, void, png_data_freer, + (png_structp png_ptr, png_infop info_ptr, int freer, png_uint_32 mask)); + +/* Assignments for png_data_freer */ +#define PNG_DESTROY_WILL_FREE_DATA 1 +#define PNG_SET_WILL_FREE_DATA 1 +#define PNG_USER_WILL_FREE_DATA 2 +/* Flags for png_ptr->free_me and info_ptr->free_me */ +#define PNG_FREE_HIST 0x0008 +#define PNG_FREE_ICCP 0x0010 +#define PNG_FREE_SPLT 0x0020 +#define PNG_FREE_ROWS 0x0040 +#define PNG_FREE_PCAL 0x0080 +#define PNG_FREE_SCAL 0x0100 +#define PNG_FREE_UNKN 0x0200 +#define PNG_FREE_LIST 0x0400 +#define PNG_FREE_PLTE 0x1000 +#define PNG_FREE_TRNS 0x2000 +#define PNG_FREE_TEXT 0x4000 +#define PNG_FREE_ALL 0x7fff +#define PNG_FREE_MUL 0x4220 /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */ + +#ifdef PNG_USER_MEM_SUPPORTED +PNG_EXPORTA(100, png_voidp, png_malloc_default, (png_structp png_ptr, + png_alloc_size_t size), PNG_ALLOCATED); +PNG_EXPORT(101, void, png_free_default, (png_structp png_ptr, png_voidp ptr)); +#endif + +#ifdef PNG_ERROR_TEXT_SUPPORTED +/* Fatal error in PNG image of libpng - can't continue */ +PNG_EXPORTA(102, void, png_error, + (png_structp png_ptr, png_const_charp error_message), + PNG_NORETURN); + +/* The same, but the chunk name is prepended to the error string. */ +PNG_EXPORTA(103, void, png_chunk_error, (png_structp png_ptr, + png_const_charp error_message), PNG_NORETURN); + +#else +/* Fatal error in PNG image of libpng - can't continue */ +PNG_EXPORTA(104, void, png_err, (png_structp png_ptr), PNG_NORETURN); +#endif + +#ifdef PNG_WARNINGS_SUPPORTED +/* Non-fatal error in libpng. Can continue, but may have a problem. */ +PNG_EXPORT(105, void, png_warning, (png_structp png_ptr, + png_const_charp warning_message)); + +/* Non-fatal error in libpng, chunk name is prepended to message. */ +PNG_EXPORT(106, void, png_chunk_warning, (png_structp png_ptr, + png_const_charp warning_message)); +#endif + +#ifdef PNG_BENIGN_ERRORS_SUPPORTED +/* Benign error in libpng. Can continue, but may have a problem. + * User can choose whether to handle as a fatal error or as a warning. */ +# undef png_benign_error +PNG_EXPORT(107, void, png_benign_error, (png_structp png_ptr, + png_const_charp warning_message)); + +/* Same, chunk name is prepended to message. */ +# undef png_chunk_benign_error +PNG_EXPORT(108, void, png_chunk_benign_error, (png_structp png_ptr, + png_const_charp warning_message)); + +PNG_EXPORT(109, void, png_set_benign_errors, + (png_structp png_ptr, int allowed)); +#else +# ifdef PNG_ALLOW_BENIGN_ERRORS +# define png_benign_error png_warning +# define png_chunk_benign_error png_chunk_warning +# else +# define png_benign_error png_error +# define png_chunk_benign_error png_chunk_error +# endif +#endif + +/* The png_set_<chunk> functions are for storing values in the png_info_struct. + * Similarly, the png_get_<chunk> calls are used to read values from the + * png_info_struct, either storing the parameters in the passed variables, or + * setting pointers into the png_info_struct where the data is stored. The + * png_get_<chunk> functions return a non-zero value if the data was available + * in info_ptr, or return zero and do not change any of the parameters if the + * data was not available. + * + * These functions should be used instead of directly accessing png_info + * to avoid problems with future changes in the size and internal layout of + * png_info_struct. + */ +/* Returns "flag" if chunk data is valid in info_ptr. */ +PNG_EXPORT(110, png_uint_32, png_get_valid, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_uint_32 flag)); + +/* Returns number of bytes needed to hold a transformed row. */ +PNG_EXPORT(111, png_size_t, png_get_rowbytes, (png_const_structp png_ptr, + png_const_infop info_ptr)); + +#ifdef PNG_INFO_IMAGE_SUPPORTED +/* Returns row_pointers, which is an array of pointers to scanlines that was + * returned from png_read_png(). + */ +PNG_EXPORT(112, png_bytepp, png_get_rows, + (png_const_structp png_ptr, png_const_infop info_ptr)); +/* Set row_pointers, which is an array of pointers to scanlines for use + * by png_write_png(). + */ +PNG_EXPORT(113, void, png_set_rows, (png_structp png_ptr, + png_infop info_ptr, png_bytepp row_pointers)); +#endif + +/* Returns number of color channels in image. */ +PNG_EXPORT(114, png_byte, png_get_channels, + (png_const_structp png_ptr, png_const_infop info_ptr)); + +#ifdef PNG_EASY_ACCESS_SUPPORTED +/* Returns image width in pixels. */ +PNG_EXPORT(115, png_uint_32, png_get_image_width, (png_const_structp png_ptr, + png_const_infop info_ptr)); + +/* Returns image height in pixels. */ +PNG_EXPORT(116, png_uint_32, png_get_image_height, (png_const_structp png_ptr, + png_const_infop info_ptr)); + +/* Returns image bit_depth. */ +PNG_EXPORT(117, png_byte, png_get_bit_depth, + (png_const_structp png_ptr, png_const_infop info_ptr)); + +/* Returns image color_type. */ +PNG_EXPORT(118, png_byte, png_get_color_type, (png_const_structp png_ptr, + png_const_infop info_ptr)); + +/* Returns image filter_type. */ +PNG_EXPORT(119, png_byte, png_get_filter_type, (png_const_structp png_ptr, + png_const_infop info_ptr)); + +/* Returns image interlace_type. */ +PNG_EXPORT(120, png_byte, png_get_interlace_type, (png_const_structp png_ptr, + png_const_infop info_ptr)); + +/* Returns image compression_type. */ +PNG_EXPORT(121, png_byte, png_get_compression_type, (png_const_structp png_ptr, + png_const_infop info_ptr)); + +/* Returns image resolution in pixels per meter, from pHYs chunk data. */ +PNG_EXPORT(122, png_uint_32, png_get_pixels_per_meter, + (png_const_structp png_ptr, png_const_infop info_ptr)); +PNG_EXPORT(123, png_uint_32, png_get_x_pixels_per_meter, + (png_const_structp png_ptr, png_const_infop info_ptr)); +PNG_EXPORT(124, png_uint_32, png_get_y_pixels_per_meter, + (png_const_structp png_ptr, png_const_infop info_ptr)); + +/* Returns pixel aspect ratio, computed from pHYs chunk data. */ +PNG_FP_EXPORT(125, float, png_get_pixel_aspect_ratio, + (png_const_structp png_ptr, png_const_infop info_ptr)); +PNG_FIXED_EXPORT(210, png_fixed_point, png_get_pixel_aspect_ratio_fixed, + (png_const_structp png_ptr, png_const_infop info_ptr)); + +/* Returns image x, y offset in pixels or microns, from oFFs chunk data. */ +PNG_EXPORT(126, png_int_32, png_get_x_offset_pixels, + (png_const_structp png_ptr, png_const_infop info_ptr)); +PNG_EXPORT(127, png_int_32, png_get_y_offset_pixels, + (png_const_structp png_ptr, png_const_infop info_ptr)); +PNG_EXPORT(128, png_int_32, png_get_x_offset_microns, + (png_const_structp png_ptr, png_const_infop info_ptr)); +PNG_EXPORT(129, png_int_32, png_get_y_offset_microns, + (png_const_structp png_ptr, png_const_infop info_ptr)); + +#endif /* PNG_EASY_ACCESS_SUPPORTED */ + +/* Returns pointer to signature string read from PNG header */ +PNG_EXPORT(130, png_const_bytep, png_get_signature, + (png_const_structp png_ptr, png_infop info_ptr)); + +#ifdef PNG_bKGD_SUPPORTED +PNG_EXPORT(131, png_uint_32, png_get_bKGD, + (png_const_structp png_ptr, png_infop info_ptr, + png_color_16p *background)); +#endif + +#ifdef PNG_bKGD_SUPPORTED +PNG_EXPORT(132, void, png_set_bKGD, (png_structp png_ptr, png_infop info_ptr, + png_const_color_16p background)); +#endif + +#ifdef PNG_cHRM_SUPPORTED +PNG_FP_EXPORT(133, png_uint_32, png_get_cHRM, (png_const_structp png_ptr, + png_const_infop info_ptr, double *white_x, double *white_y, double *red_x, + double *red_y, double *green_x, double *green_y, double *blue_x, + double *blue_y)); +PNG_FP_EXPORT(230, png_uint_32, png_get_cHRM_XYZ, (png_structp png_ptr, + png_const_infop info_ptr, double *red_X, double *red_Y, double *red_Z, + double *green_X, double *green_Y, double *green_Z, double *blue_X, + double *blue_Y, double *blue_Z)); +#ifdef PNG_FIXED_POINT_SUPPORTED /* Otherwise not implemented */ +PNG_FIXED_EXPORT(134, png_uint_32, png_get_cHRM_fixed, + (png_const_structp png_ptr, + png_const_infop info_ptr, png_fixed_point *int_white_x, + png_fixed_point *int_white_y, png_fixed_point *int_red_x, + png_fixed_point *int_red_y, png_fixed_point *int_green_x, + png_fixed_point *int_green_y, png_fixed_point *int_blue_x, + png_fixed_point *int_blue_y)); +#endif +PNG_FIXED_EXPORT(231, png_uint_32, png_get_cHRM_XYZ_fixed, + (png_structp png_ptr, png_const_infop info_ptr, + png_fixed_point *int_red_X, png_fixed_point *int_red_Y, + png_fixed_point *int_red_Z, png_fixed_point *int_green_X, + png_fixed_point *int_green_Y, png_fixed_point *int_green_Z, + png_fixed_point *int_blue_X, png_fixed_point *int_blue_Y, + png_fixed_point *int_blue_Z)); +#endif + +#ifdef PNG_cHRM_SUPPORTED +PNG_FP_EXPORT(135, void, png_set_cHRM, + (png_structp png_ptr, png_infop info_ptr, + double white_x, double white_y, double red_x, double red_y, double green_x, + double green_y, double blue_x, double blue_y)); +PNG_FP_EXPORT(232, void, png_set_cHRM_XYZ, (png_structp png_ptr, + png_infop info_ptr, double red_X, double red_Y, double red_Z, + double green_X, double green_Y, double green_Z, double blue_X, + double blue_Y, double blue_Z)); +PNG_FIXED_EXPORT(136, void, png_set_cHRM_fixed, (png_structp png_ptr, + png_infop info_ptr, png_fixed_point int_white_x, + png_fixed_point int_white_y, png_fixed_point int_red_x, + png_fixed_point int_red_y, png_fixed_point int_green_x, + png_fixed_point int_green_y, png_fixed_point int_blue_x, + png_fixed_point int_blue_y)); +PNG_FIXED_EXPORT(233, void, png_set_cHRM_XYZ_fixed, (png_structp png_ptr, + png_infop info_ptr, png_fixed_point int_red_X, png_fixed_point int_red_Y, + png_fixed_point int_red_Z, png_fixed_point int_green_X, + png_fixed_point int_green_Y, png_fixed_point int_green_Z, + png_fixed_point int_blue_X, png_fixed_point int_blue_Y, + png_fixed_point int_blue_Z)); +#endif + +#ifdef PNG_gAMA_SUPPORTED +PNG_FP_EXPORT(137, png_uint_32, png_get_gAMA, + (png_const_structp png_ptr, png_const_infop info_ptr, + double *file_gamma)); +PNG_FIXED_EXPORT(138, png_uint_32, png_get_gAMA_fixed, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_fixed_point *int_file_gamma)); +#endif + +#ifdef PNG_gAMA_SUPPORTED +PNG_FP_EXPORT(139, void, png_set_gAMA, (png_structp png_ptr, + png_infop info_ptr, double file_gamma)); +PNG_FIXED_EXPORT(140, void, png_set_gAMA_fixed, (png_structp png_ptr, + png_infop info_ptr, png_fixed_point int_file_gamma)); +#endif + +#ifdef PNG_hIST_SUPPORTED +PNG_EXPORT(141, png_uint_32, png_get_hIST, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_uint_16p *hist)); +#endif + +#ifdef PNG_hIST_SUPPORTED +PNG_EXPORT(142, void, png_set_hIST, (png_structp png_ptr, + png_infop info_ptr, png_const_uint_16p hist)); +#endif + +PNG_EXPORT(143, png_uint_32, png_get_IHDR, + (png_structp png_ptr, png_infop info_ptr, + png_uint_32 *width, png_uint_32 *height, int *bit_depth, int *color_type, + int *interlace_method, int *compression_method, int *filter_method)); + +PNG_EXPORT(144, void, png_set_IHDR, + (png_structp png_ptr, png_infop info_ptr, + png_uint_32 width, png_uint_32 height, int bit_depth, int color_type, + int interlace_method, int compression_method, int filter_method)); + +#ifdef PNG_oFFs_SUPPORTED +PNG_EXPORT(145, png_uint_32, png_get_oFFs, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type)); +#endif + +#ifdef PNG_oFFs_SUPPORTED +PNG_EXPORT(146, void, png_set_oFFs, + (png_structp png_ptr, png_infop info_ptr, + png_int_32 offset_x, png_int_32 offset_y, int unit_type)); +#endif + +#ifdef PNG_pCAL_SUPPORTED +PNG_EXPORT(147, png_uint_32, png_get_pCAL, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, + int *nparams, + png_charp *units, png_charpp *params)); +#endif + +#ifdef PNG_pCAL_SUPPORTED +PNG_EXPORT(148, void, png_set_pCAL, (png_structp png_ptr, + png_infop info_ptr, + png_const_charp purpose, png_int_32 X0, png_int_32 X1, int type, + int nparams, png_const_charp units, png_charpp params)); +#endif + +#ifdef PNG_pHYs_SUPPORTED +PNG_EXPORT(149, png_uint_32, png_get_pHYs, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)); +#endif + +#ifdef PNG_pHYs_SUPPORTED +PNG_EXPORT(150, void, png_set_pHYs, + (png_structp png_ptr, png_infop info_ptr, + png_uint_32 res_x, png_uint_32 res_y, int unit_type)); +#endif + +PNG_EXPORT(151, png_uint_32, png_get_PLTE, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_colorp *palette, int *num_palette)); + +PNG_EXPORT(152, void, png_set_PLTE, + (png_structp png_ptr, png_infop info_ptr, + png_const_colorp palette, int num_palette)); + +#ifdef PNG_sBIT_SUPPORTED +PNG_EXPORT(153, png_uint_32, png_get_sBIT, + (png_const_structp png_ptr, png_infop info_ptr, + png_color_8p *sig_bit)); +#endif + +#ifdef PNG_sBIT_SUPPORTED +PNG_EXPORT(154, void, png_set_sBIT, + (png_structp png_ptr, png_infop info_ptr, png_const_color_8p sig_bit)); +#endif + +#ifdef PNG_sRGB_SUPPORTED +PNG_EXPORT(155, png_uint_32, png_get_sRGB, (png_const_structp png_ptr, + png_const_infop info_ptr, int *file_srgb_intent)); +#endif + +#ifdef PNG_sRGB_SUPPORTED +PNG_EXPORT(156, void, png_set_sRGB, + (png_structp png_ptr, png_infop info_ptr, int srgb_intent)); +PNG_EXPORT(157, void, png_set_sRGB_gAMA_and_cHRM, (png_structp png_ptr, + png_infop info_ptr, int srgb_intent)); +#endif + +#ifdef PNG_iCCP_SUPPORTED +PNG_EXPORT(158, png_uint_32, png_get_iCCP, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_charpp name, int *compression_type, png_bytepp profile, + png_uint_32 *proflen)); +#endif + +#ifdef PNG_iCCP_SUPPORTED +PNG_EXPORT(159, void, png_set_iCCP, + (png_structp png_ptr, png_infop info_ptr, + png_const_charp name, int compression_type, png_const_bytep profile, + png_uint_32 proflen)); +#endif + +#ifdef PNG_sPLT_SUPPORTED +PNG_EXPORT(160, png_uint_32, png_get_sPLT, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_sPLT_tpp entries)); +#endif + +#ifdef PNG_sPLT_SUPPORTED +PNG_EXPORT(161, void, png_set_sPLT, + (png_structp png_ptr, png_infop info_ptr, + png_const_sPLT_tp entries, int nentries)); +#endif + +#ifdef PNG_TEXT_SUPPORTED +/* png_get_text also returns the number of text chunks in *num_text */ +PNG_EXPORT(162, png_uint_32, png_get_text, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_textp *text_ptr, int *num_text)); +#endif + +/* Note while png_set_text() will accept a structure whose text, + * language, and translated keywords are NULL pointers, the structure + * returned by png_get_text will always contain regular + * zero-terminated C strings. They might be empty strings but + * they will never be NULL pointers. + */ + +#ifdef PNG_TEXT_SUPPORTED +PNG_EXPORT(163, void, png_set_text, + (png_structp png_ptr, png_infop info_ptr, + png_const_textp text_ptr, int num_text)); +#endif + +#ifdef PNG_tIME_SUPPORTED +PNG_EXPORT(164, png_uint_32, png_get_tIME, + (png_const_structp png_ptr, png_infop info_ptr, png_timep *mod_time)); +#endif + +#ifdef PNG_tIME_SUPPORTED +PNG_EXPORT(165, void, png_set_tIME, + (png_structp png_ptr, png_infop info_ptr, png_const_timep mod_time)); +#endif + +#ifdef PNG_tRNS_SUPPORTED +PNG_EXPORT(166, png_uint_32, png_get_tRNS, + (png_const_structp png_ptr, png_infop info_ptr, + png_bytep *trans_alpha, int *num_trans, png_color_16p *trans_color)); +#endif + +#ifdef PNG_tRNS_SUPPORTED +PNG_EXPORT(167, void, png_set_tRNS, + (png_structp png_ptr, png_infop info_ptr, + png_const_bytep trans_alpha, int num_trans, + png_const_color_16p trans_color)); +#endif + +#ifdef PNG_sCAL_SUPPORTED +PNG_FP_EXPORT(168, png_uint_32, png_get_sCAL, + (png_const_structp png_ptr, png_const_infop info_ptr, + int *unit, double *width, double *height)); +#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED +/* NOTE: this API is currently implemented using floating point arithmetic, + * consequently it can only be used on systems with floating point support. + * In any case the range of values supported by png_fixed_point is small and it + * is highly recommended that png_get_sCAL_s be used instead. + */ +PNG_FIXED_EXPORT(214, png_uint_32, png_get_sCAL_fixed, + (png_structp png_ptr, png_const_infop info_ptr, int *unit, + png_fixed_point *width, + png_fixed_point *height)); +#endif +PNG_EXPORT(169, png_uint_32, png_get_sCAL_s, + (png_const_structp png_ptr, png_const_infop info_ptr, + int *unit, png_charpp swidth, png_charpp sheight)); + +PNG_FP_EXPORT(170, void, png_set_sCAL, + (png_structp png_ptr, png_infop info_ptr, + int unit, double width, double height)); +PNG_FIXED_EXPORT(213, void, png_set_sCAL_fixed, (png_structp png_ptr, + png_infop info_ptr, int unit, png_fixed_point width, + png_fixed_point height)); +PNG_EXPORT(171, void, png_set_sCAL_s, + (png_structp png_ptr, png_infop info_ptr, + int unit, png_const_charp swidth, png_const_charp sheight)); +#endif /* PNG_sCAL_SUPPORTED */ + +#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED +/* Provide a list of chunks and how they are to be handled, if the built-in + handling or default unknown chunk handling is not desired. Any chunks not + listed will be handled in the default manner. The IHDR and IEND chunks + must not be listed. Because this turns off the default handling for chunks + that would otherwise be recognized the behavior of libpng transformations may + well become incorrect! + keep = 0: PNG_HANDLE_CHUNK_AS_DEFAULT: follow default behavior + = 1: PNG_HANDLE_CHUNK_NEVER: do not keep + = 2: PNG_HANDLE_CHUNK_IF_SAFE: keep only if safe-to-copy + = 3: PNG_HANDLE_CHUNK_ALWAYS: keep even if unsafe-to-copy +*/ +PNG_EXPORT(172, void, png_set_keep_unknown_chunks, + (png_structp png_ptr, int keep, + png_const_bytep chunk_list, int num_chunks)); + +/* The handling code is returned; the result is therefore true (non-zero) if + * special handling is required, false for the default handling. + */ +PNG_EXPORT(173, int, png_handle_as_unknown, (png_structp png_ptr, + png_const_bytep chunk_name)); +#endif +#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED +PNG_EXPORT(174, void, png_set_unknown_chunks, (png_structp png_ptr, + png_infop info_ptr, png_const_unknown_chunkp unknowns, + int num_unknowns)); +PNG_EXPORT(175, void, png_set_unknown_chunk_location, + (png_structp png_ptr, png_infop info_ptr, int chunk, int location)); +PNG_EXPORT(176, int, png_get_unknown_chunks, (png_const_structp png_ptr, + png_const_infop info_ptr, png_unknown_chunkpp entries)); +#endif + +/* Png_free_data() will turn off the "valid" flag for anything it frees. + * If you need to turn it off for a chunk that your application has freed, + * you can use png_set_invalid(png_ptr, info_ptr, PNG_INFO_CHNK); + */ +PNG_EXPORT(177, void, png_set_invalid, + (png_structp png_ptr, png_infop info_ptr, int mask)); + +#ifdef PNG_INFO_IMAGE_SUPPORTED +/* The "params" pointer is currently not used and is for future expansion. */ +PNG_EXPORT(178, void, png_read_png, (png_structp png_ptr, png_infop info_ptr, + int transforms, png_voidp params)); +PNG_EXPORT(179, void, png_write_png, (png_structp png_ptr, png_infop info_ptr, + int transforms, png_voidp params)); +#endif + +PNG_EXPORT(180, png_const_charp, png_get_copyright, + (png_const_structp png_ptr)); +PNG_EXPORT(181, png_const_charp, png_get_header_ver, + (png_const_structp png_ptr)); +PNG_EXPORT(182, png_const_charp, png_get_header_version, + (png_const_structp png_ptr)); +PNG_EXPORT(183, png_const_charp, png_get_libpng_ver, + (png_const_structp png_ptr)); + +#ifdef PNG_MNG_FEATURES_SUPPORTED +PNG_EXPORT(184, png_uint_32, png_permit_mng_features, (png_structp png_ptr, + png_uint_32 mng_features_permitted)); +#endif + +/* For use in png_set_keep_unknown, added to version 1.2.6 */ +#define PNG_HANDLE_CHUNK_AS_DEFAULT 0 +#define PNG_HANDLE_CHUNK_NEVER 1 +#define PNG_HANDLE_CHUNK_IF_SAFE 2 +#define PNG_HANDLE_CHUNK_ALWAYS 3 + +/* Strip the prepended error numbers ("#nnn ") from error and warning + * messages before passing them to the error or warning handler. + */ +#ifdef PNG_ERROR_NUMBERS_SUPPORTED +PNG_EXPORT(185, void, png_set_strip_error_numbers, + (png_structp png_ptr, + png_uint_32 strip_mode)); +#endif + +/* Added in libpng-1.2.6 */ +#ifdef PNG_SET_USER_LIMITS_SUPPORTED +PNG_EXPORT(186, void, png_set_user_limits, (png_structp png_ptr, + png_uint_32 user_width_max, png_uint_32 user_height_max)); +PNG_EXPORT(187, png_uint_32, png_get_user_width_max, + (png_const_structp png_ptr)); +PNG_EXPORT(188, png_uint_32, png_get_user_height_max, + (png_const_structp png_ptr)); +/* Added in libpng-1.4.0 */ +PNG_EXPORT(189, void, png_set_chunk_cache_max, (png_structp png_ptr, + png_uint_32 user_chunk_cache_max)); +PNG_EXPORT(190, png_uint_32, png_get_chunk_cache_max, + (png_const_structp png_ptr)); +/* Added in libpng-1.4.1 */ +PNG_EXPORT(191, void, png_set_chunk_malloc_max, (png_structp png_ptr, + png_alloc_size_t user_chunk_cache_max)); +PNG_EXPORT(192, png_alloc_size_t, png_get_chunk_malloc_max, + (png_const_structp png_ptr)); +#endif + +#if defined(PNG_INCH_CONVERSIONS_SUPPORTED) +PNG_EXPORT(193, png_uint_32, png_get_pixels_per_inch, + (png_const_structp png_ptr, png_const_infop info_ptr)); + +PNG_EXPORT(194, png_uint_32, png_get_x_pixels_per_inch, + (png_const_structp png_ptr, png_const_infop info_ptr)); + +PNG_EXPORT(195, png_uint_32, png_get_y_pixels_per_inch, + (png_const_structp png_ptr, png_const_infop info_ptr)); + +PNG_FP_EXPORT(196, float, png_get_x_offset_inches, + (png_const_structp png_ptr, png_const_infop info_ptr)); +#ifdef PNG_FIXED_POINT_SUPPORTED /* otherwise not implemented. */ +PNG_FIXED_EXPORT(211, png_fixed_point, png_get_x_offset_inches_fixed, + (png_structp png_ptr, png_const_infop info_ptr)); +#endif + +PNG_FP_EXPORT(197, float, png_get_y_offset_inches, (png_const_structp png_ptr, + png_const_infop info_ptr)); +#ifdef PNG_FIXED_POINT_SUPPORTED /* otherwise not implemented. */ +PNG_FIXED_EXPORT(212, png_fixed_point, png_get_y_offset_inches_fixed, + (png_structp png_ptr, png_const_infop info_ptr)); +#endif + +# ifdef PNG_pHYs_SUPPORTED +PNG_EXPORT(198, png_uint_32, png_get_pHYs_dpi, (png_const_structp png_ptr, + png_const_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, + int *unit_type)); +# endif /* PNG_pHYs_SUPPORTED */ +#endif /* PNG_INCH_CONVERSIONS_SUPPORTED */ + +/* Added in libpng-1.4.0 */ +#ifdef PNG_IO_STATE_SUPPORTED +PNG_EXPORT(199, png_uint_32, png_get_io_state, (png_structp png_ptr)); + +PNG_EXPORTA(200, png_const_bytep, png_get_io_chunk_name, + (png_structp png_ptr), PNG_DEPRECATED); +PNG_EXPORT(216, png_uint_32, png_get_io_chunk_type, + (png_const_structp png_ptr)); + +/* The flags returned by png_get_io_state() are the following: */ +# define PNG_IO_NONE 0x0000 /* no I/O at this moment */ +# define PNG_IO_READING 0x0001 /* currently reading */ +# define PNG_IO_WRITING 0x0002 /* currently writing */ +# define PNG_IO_SIGNATURE 0x0010 /* currently at the file signature */ +# define PNG_IO_CHUNK_HDR 0x0020 /* currently at the chunk header */ +# define PNG_IO_CHUNK_DATA 0x0040 /* currently at the chunk data */ +# define PNG_IO_CHUNK_CRC 0x0080 /* currently at the chunk crc */ +# define PNG_IO_MASK_OP 0x000f /* current operation: reading/writing */ +# define PNG_IO_MASK_LOC 0x00f0 /* current location: sig/hdr/data/crc */ +#endif /* ?PNG_IO_STATE_SUPPORTED */ + +/* Interlace support. The following macros are always defined so that if + * libpng interlace handling is turned off the macros may be used to handle + * interlaced images within the application. + */ +#define PNG_INTERLACE_ADAM7_PASSES 7 + +/* Two macros to return the first row and first column of the original, + * full, image which appears in a given pass. 'pass' is in the range 0 + * to 6 and the result is in the range 0 to 7. + */ +#define PNG_PASS_START_ROW(pass) (((1&~(pass))<<(3-((pass)>>1)))&7) +#define PNG_PASS_START_COL(pass) (((1& (pass))<<(3-(((pass)+1)>>1)))&7) + +/* A macro to return the offset between pixels in the output row for a pair of + * pixels in the input - effectively the inverse of the 'COL_SHIFT' macro that + * follows. Note that ROW_OFFSET is the offset from one row to the next whereas + * COL_OFFSET is from one column to the next, within a row. + */ +#define PNG_PASS_ROW_OFFSET(pass) ((pass)>2?(8>>(((pass)-1)>>1)):8) +#define PNG_PASS_COL_OFFSET(pass) (1<<((7-(pass))>>1)) + +/* Two macros to help evaluate the number of rows or columns in each + * pass. This is expressed as a shift - effectively log2 of the number or + * rows or columns in each 8x8 tile of the original image. + */ +#define PNG_PASS_ROW_SHIFT(pass) ((pass)>2?(8-(pass))>>1:3) +#define PNG_PASS_COL_SHIFT(pass) ((pass)>1?(7-(pass))>>1:3) + +/* Hence two macros to determine the number of rows or columns in a given + * pass of an image given its height or width. In fact these macros may + * return non-zero even though the sub-image is empty, because the other + * dimension may be empty for a small image. + */ +#define PNG_PASS_ROWS(height, pass) (((height)+(((1<<PNG_PASS_ROW_SHIFT(pass))\ + -1)-PNG_PASS_START_ROW(pass)))>>PNG_PASS_ROW_SHIFT(pass)) +#define PNG_PASS_COLS(width, pass) (((width)+(((1<<PNG_PASS_COL_SHIFT(pass))\ + -1)-PNG_PASS_START_COL(pass)))>>PNG_PASS_COL_SHIFT(pass)) + +/* For the reader row callbacks (both progressive and sequential) it is + * necessary to find the row in the output image given a row in an interlaced + * image, so two more macros: + */ +#define PNG_ROW_FROM_PASS_ROW(yIn, pass) \ + (((yIn)<<PNG_PASS_ROW_SHIFT(pass))+PNG_PASS_START_ROW(pass)) +#define PNG_COL_FROM_PASS_COL(xIn, pass) \ + (((xIn)<<PNG_PASS_COL_SHIFT(pass))+PNG_PASS_START_COL(pass)) + +/* Two macros which return a boolean (0 or 1) saying whether the given row + * or column is in a particular pass. These use a common utility macro that + * returns a mask for a given pass - the offset 'off' selects the row or + * column version. The mask has the appropriate bit set for each column in + * the tile. + */ +#define PNG_PASS_MASK(pass,off) ( \ + ((0x110145AF>>(((7-(off))-(pass))<<2)) & 0xF) | \ + ((0x01145AF0>>(((7-(off))-(pass))<<2)) & 0xF0)) + +#define PNG_ROW_IN_INTERLACE_PASS(y, pass) \ + ((PNG_PASS_MASK(pass,0) >> ((y)&7)) & 1) +#define PNG_COL_IN_INTERLACE_PASS(x, pass) \ + ((PNG_PASS_MASK(pass,1) >> ((x)&7)) & 1) + +#ifdef PNG_READ_COMPOSITE_NODIV_SUPPORTED +/* With these routines we avoid an integer divide, which will be slower on + * most machines. However, it does take more operations than the corresponding + * divide method, so it may be slower on a few RISC systems. There are two + * shifts (by 8 or 16 bits) and an addition, versus a single integer divide. + * + * Note that the rounding factors are NOT supposed to be the same! 128 and + * 32768 are correct for the NODIV code; 127 and 32767 are correct for the + * standard method. + * + * [Optimized code by Greg Roelofs and Mark Adler...blame us for bugs. :-) ] + */ + + /* fg and bg should be in `gamma 1.0' space; alpha is the opacity */ + +# define png_composite(composite, fg, alpha, bg) \ + { png_uint_16 temp = (png_uint_16)((png_uint_16)(fg) \ + * (png_uint_16)(alpha) \ + + (png_uint_16)(bg)*(png_uint_16)(255 \ + - (png_uint_16)(alpha)) + 128); \ + (composite) = (png_byte)((temp + (temp >> 8)) >> 8); } + +# define png_composite_16(composite, fg, alpha, bg) \ + { png_uint_32 temp = (png_uint_32)((png_uint_32)(fg) \ + * (png_uint_32)(alpha) \ + + (png_uint_32)(bg)*(65535 \ + - (png_uint_32)(alpha)) + 32768); \ + (composite) = (png_uint_16)((temp + (temp >> 16)) >> 16); } + +#else /* Standard method using integer division */ + +# define png_composite(composite, fg, alpha, bg) \ + (composite) = (png_byte)(((png_uint_16)(fg) * (png_uint_16)(alpha) + \ + (png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \ + 127) / 255) + +# define png_composite_16(composite, fg, alpha, bg) \ + (composite) = (png_uint_16)(((png_uint_32)(fg) * (png_uint_32)(alpha) + \ + (png_uint_32)(bg)*(png_uint_32)(65535 - (png_uint_32)(alpha)) + \ + 32767) / 65535) +#endif /* PNG_READ_COMPOSITE_NODIV_SUPPORTED */ + +#ifdef PNG_READ_INT_FUNCTIONS_SUPPORTED +PNG_EXPORT(201, png_uint_32, png_get_uint_32, (png_const_bytep buf)); +PNG_EXPORT(202, png_uint_16, png_get_uint_16, (png_const_bytep buf)); +PNG_EXPORT(203, png_int_32, png_get_int_32, (png_const_bytep buf)); +#endif + +PNG_EXPORT(204, png_uint_32, png_get_uint_31, (png_structp png_ptr, + png_const_bytep buf)); +/* No png_get_int_16 -- may be added if there's a real need for it. */ + +/* Place a 32-bit number into a buffer in PNG byte order (big-endian). */ +#ifdef PNG_WRITE_INT_FUNCTIONS_SUPPORTED +PNG_EXPORT(205, void, png_save_uint_32, (png_bytep buf, png_uint_32 i)); +#endif +#ifdef PNG_SAVE_INT_32_SUPPORTED +PNG_EXPORT(206, void, png_save_int_32, (png_bytep buf, png_int_32 i)); +#endif + +/* Place a 16-bit number into a buffer in PNG byte order. + * The parameter is declared unsigned int, not png_uint_16, + * just to avoid potential problems on pre-ANSI C compilers. + */ +#ifdef PNG_WRITE_INT_FUNCTIONS_SUPPORTED +PNG_EXPORT(207, void, png_save_uint_16, (png_bytep buf, unsigned int i)); +/* No png_save_int_16 -- may be added if there's a real need for it. */ +#endif + +#ifdef PNG_USE_READ_MACROS +/* Inline macros to do direct reads of bytes from the input buffer. + * The png_get_int_32() routine assumes we are using two's complement + * format for negative values, which is almost certainly true. + */ +# define png_get_uint_32(buf) \ + (((png_uint_32)(*(buf)) << 24) + \ + ((png_uint_32)(*((buf) + 1)) << 16) + \ + ((png_uint_32)(*((buf) + 2)) << 8) + \ + ((png_uint_32)(*((buf) + 3)))) + + /* From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the + * function) incorrectly returned a value of type png_uint_32. + */ +# define png_get_uint_16(buf) \ + ((png_uint_16) \ + (((unsigned int)(*(buf)) << 8) + \ + ((unsigned int)(*((buf) + 1))))) + +# define png_get_int_32(buf) \ + ((png_int_32)((*(buf) & 0x80) \ + ? -((png_int_32)((png_get_uint_32(buf) ^ 0xffffffffL) + 1)) \ + : (png_int_32)png_get_uint_32(buf))) +#endif + +/* Maintainer: Put new public prototypes here ^, in libpng.3, and project + * defs + */ + +/* The last ordinal number (this is the *last* one already used; the next + * one to use is one more than this.) Maintainer, remember to add an entry to + * scripts/symbols.def as well. + */ +#ifdef PNG_EXPORT_LAST_ORDINAL + PNG_EXPORT_LAST_ORDINAL(233); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* PNG_VERSION_INFO_ONLY */ +/* Do not put anything past this line */ +#endif /* PNG_H */ diff --git a/plugins/snes9x_gx/portlibs/include/pngconf.h b/plugins/snes9x_gx/portlibs/include/pngconf.h new file mode 100644 index 00000000..1aa268be --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/pngconf.h @@ -0,0 +1,596 @@ + +/* pngconf.h - machine configurable file for libpng + * + * libpng version 1.5.9 - February 18, 2012 + * + * Copyright (c) 1998-2012 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + * + */ + +/* Any machine specific code is near the front of this file, so if you + * are configuring libpng for a machine, you may want to read the section + * starting here down to where it starts to typedef png_color, png_text, + * and png_info. + */ + +#ifndef PNGCONF_H +#define PNGCONF_H + +#ifndef PNG_BUILDING_SYMBOL_TABLE +/* PNG_NO_LIMITS_H may be used to turn off the use of the standard C + * definition file for machine specific limits, this may impact the + * correctness of the definitons below (see uses of INT_MAX). + */ +# ifndef PNG_NO_LIMITS_H +# include <limits.h> +# endif + +/* For the memory copy APIs (i.e. the standard definitions of these), + * because this file defines png_memcpy and so on the base APIs must + * be defined here. + */ +# ifdef BSD +# include <strings.h> +# else +# include <string.h> +# endif + +/* For png_FILE_p - this provides the standard definition of a + * FILE + */ +# ifdef PNG_STDIO_SUPPORTED +# include <stdio.h> +# endif +#endif + +/* This controls optimization of the reading of 16 and 32 bit values + * from PNG files. It can be set on a per-app-file basis - it + * just changes whether a macro is used to the function is called. + * The library builder sets the default, if read functions are not + * built into the library the macro implementation is forced on. + */ +#ifndef PNG_READ_INT_FUNCTIONS_SUPPORTED +# define PNG_USE_READ_MACROS +#endif +#if !defined(PNG_NO_USE_READ_MACROS) && !defined(PNG_USE_READ_MACROS) +# if PNG_DEFAULT_READ_MACROS +# define PNG_USE_READ_MACROS +# endif +#endif + +/* COMPILER SPECIFIC OPTIONS. + * + * These options are provided so that a variety of difficult compilers + * can be used. Some are fixed at build time (e.g. PNG_API_RULE + * below) but still have compiler specific implementations, others + * may be changed on a per-file basis when compiling against libpng. + */ + +/* The PNGARG macro protects us against machines that don't have function + * prototypes (ie K&R style headers). If your compiler does not handle + * function prototypes, define this macro and use the included ansi2knr. + * I've always been able to use _NO_PROTO as the indicator, but you may + * need to drag the empty declaration out in front of here, or change the + * ifdef to suit your own needs. + */ +#ifndef PNGARG + +# ifdef OF /* zlib prototype munger */ +# define PNGARG(arglist) OF(arglist) +# else + +# ifdef _NO_PROTO +# define PNGARG(arglist) () +# else +# define PNGARG(arglist) arglist +# endif /* _NO_PROTO */ + +# endif /* OF */ + +#endif /* PNGARG */ + +/* Function calling conventions. + * ============================= + * Normally it is not necessary to specify to the compiler how to call + * a function - it just does it - however on x86 systems derived from + * Microsoft and Borland C compilers ('IBM PC', 'DOS', 'Windows' systems + * and some others) there are multiple ways to call a function and the + * default can be changed on the compiler command line. For this reason + * libpng specifies the calling convention of every exported function and + * every function called via a user supplied function pointer. This is + * done in this file by defining the following macros: + * + * PNGAPI Calling convention for exported functions. + * PNGCBAPI Calling convention for user provided (callback) functions. + * PNGCAPI Calling convention used by the ANSI-C library (required + * for longjmp callbacks and sometimes used internally to + * specify the calling convention for zlib). + * + * These macros should never be overridden. If it is necessary to + * change calling convention in a private build this can be done + * by setting PNG_API_RULE (which defaults to 0) to one of the values + * below to select the correct 'API' variants. + * + * PNG_API_RULE=0 Use PNGCAPI - the 'C' calling convention - throughout. + * This is correct in every known environment. + * PNG_API_RULE=1 Use the operating system convention for PNGAPI and + * the 'C' calling convention (from PNGCAPI) for + * callbacks (PNGCBAPI). This is no longer required + * in any known environment - if it has to be used + * please post an explanation of the problem to the + * libpng mailing list. + * + * These cases only differ if the operating system does not use the C + * calling convention, at present this just means the above cases + * (x86 DOS/Windows sytems) and, even then, this does not apply to + * Cygwin running on those systems. + * + * Note that the value must be defined in pnglibconf.h so that what + * the application uses to call the library matches the conventions + * set when building the library. + */ + +/* Symbol export + * ============= + * When building a shared library it is almost always necessary to tell + * the compiler which symbols to export. The png.h macro 'PNG_EXPORT' + * is used to mark the symbols. On some systems these symbols can be + * extracted at link time and need no special processing by the compiler, + * on other systems the symbols are flagged by the compiler and just + * the declaration requires a special tag applied (unfortunately) in a + * compiler dependent way. Some systems can do either. + * + * A small number of older systems also require a symbol from a DLL to + * be flagged to the program that calls it. This is a problem because + * we do not know in the header file included by application code that + * the symbol will come from a shared library, as opposed to a statically + * linked one. For this reason the application must tell us by setting + * the magic flag PNG_USE_DLL to turn on the special processing before + * it includes png.h. + * + * Four additional macros are used to make this happen: + * + * PNG_IMPEXP The magic (if any) to cause a symbol to be exported from + * the build or imported if PNG_USE_DLL is set - compiler + * and system specific. + * + * PNG_EXPORT_TYPE(type) A macro that pre or appends PNG_IMPEXP to + * 'type', compiler specific. + * + * PNG_DLL_EXPORT Set to the magic to use during a libpng build to + * make a symbol exported from the DLL. Not used in the + * public header files; see pngpriv.h for how it is used + * in the libpng build. + * + * PNG_DLL_IMPORT Set to the magic to force the libpng symbols to come + * from a DLL - used to define PNG_IMPEXP when + * PNG_USE_DLL is set. + */ + +/* System specific discovery. + * ========================== + * This code is used at build time to find PNG_IMPEXP, the API settings + * and PNG_EXPORT_TYPE(), it may also set a macro to indicate the DLL + * import processing is possible. On Windows/x86 systems it also sets + * compiler-specific macros to the values required to change the calling + * conventions of the various functions. + */ +#if ( defined(_Windows) || defined(_WINDOWS) || defined(WIN32) ||\ + defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) ) &&\ + ( defined(_X86_) || defined(_X64_) || defined(_M_IX86) ||\ + defined(_M_X64) || defined(_M_IA64) ) + /* Windows system (DOS doesn't support DLLs) running on x86/x64. Includes + * builds under Cygwin or MinGW. Also includes Watcom builds but these need + * special treatment because they are not compatible with GCC or Visual C + * because of different calling conventions. + */ +# if PNG_API_RULE == 2 + /* If this line results in an error, either because __watcall is not + * understood or because of a redefine just below you cannot use *this* + * build of the library with the compiler you are using. *This* build was + * build using Watcom and applications must also be built using Watcom! + */ +# define PNGCAPI __watcall +# endif + +# if defined(__GNUC__) || (defined (_MSC_VER) && (_MSC_VER >= 800)) +# define PNGCAPI __cdecl +# if PNG_API_RULE == 1 +# define PNGAPI __stdcall +# endif +# else + /* An older compiler, or one not detected (erroneously) above, + * if necessary override on the command line to get the correct + * variants for the compiler. + */ +# ifndef PNGCAPI +# define PNGCAPI _cdecl +# endif +# if PNG_API_RULE == 1 && !defined(PNGAPI) +# define PNGAPI _stdcall +# endif +# endif /* compiler/api */ + /* NOTE: PNGCBAPI always defaults to PNGCAPI. */ + +# if defined(PNGAPI) && !defined(PNG_USER_PRIVATEBUILD) + ERROR: PNG_USER_PRIVATEBUILD must be defined if PNGAPI is changed +# endif + +# if (defined(_MSC_VER) && _MSC_VER < 800) ||\ + (defined(__BORLANDC__) && __BORLANDC__ < 0x500) + /* older Borland and MSC + * compilers used '__export' and required this to be after + * the type. + */ +# ifndef PNG_EXPORT_TYPE +# define PNG_EXPORT_TYPE(type) type PNG_IMPEXP +# endif +# define PNG_DLL_EXPORT __export +# else /* newer compiler */ +# define PNG_DLL_EXPORT __declspec(dllexport) +# ifndef PNG_DLL_IMPORT +# define PNG_DLL_IMPORT __declspec(dllimport) +# endif +# endif /* compiler */ + +#else /* !Windows/x86 */ +# if (defined(__IBMC__) || defined(__IBMCPP__)) && defined(__OS2__) +# define PNGAPI _System +# else /* !Windows/x86 && !OS/2 */ + /* Use the defaults, or define PNG*API on the command line (but + * this will have to be done for every compile!) + */ +# endif /* other system, !OS/2 */ +#endif /* !Windows/x86 */ + +/* Now do all the defaulting . */ +#ifndef PNGCAPI +# define PNGCAPI +#endif +#ifndef PNGCBAPI +# define PNGCBAPI PNGCAPI +#endif +#ifndef PNGAPI +# define PNGAPI PNGCAPI +#endif + +/* PNG_IMPEXP may be set on the compilation system command line or (if not set) + * then in an internal header file when building the library, otherwise (when + * using the library) it is set here. + */ +#ifndef PNG_IMPEXP +# if defined(PNG_USE_DLL) && defined(PNG_DLL_IMPORT) + /* This forces use of a DLL, disallowing static linking */ +# define PNG_IMPEXP PNG_DLL_IMPORT +# endif + +# ifndef PNG_IMPEXP +# define PNG_IMPEXP +# endif +#endif + +/* In 1.5.2 the definition of PNG_FUNCTION has been changed to always treat + * 'attributes' as a storage class - the attributes go at the start of the + * function definition, and attributes are always appended regardless of the + * compiler. This considerably simplifies these macros but may cause problems + * if any compilers both need function attributes and fail to handle them as + * a storage class (this is unlikely.) + */ +#ifndef PNG_FUNCTION +# define PNG_FUNCTION(type, name, args, attributes) attributes type name args +#endif + +#ifndef PNG_EXPORT_TYPE +# define PNG_EXPORT_TYPE(type) PNG_IMPEXP type +#endif + + /* The ordinal value is only relevant when preprocessing png.h for symbol + * table entries, so we discard it here. See the .dfn files in the + * scripts directory. + */ +#ifndef PNG_EXPORTA + +# define PNG_EXPORTA(ordinal, type, name, args, attributes)\ + PNG_FUNCTION(PNG_EXPORT_TYPE(type),(PNGAPI name),PNGARG(args), \ + extern attributes) +#endif + +/* ANSI-C (C90) does not permit a macro to be invoked with an empty argument, + * so make something non-empty to satisfy the requirement: + */ +#define PNG_EMPTY /*empty list*/ + +#define PNG_EXPORT(ordinal, type, name, args)\ + PNG_EXPORTA(ordinal, type, name, args, PNG_EMPTY) + +/* Use PNG_REMOVED to comment out a removed interface. */ +#ifndef PNG_REMOVED +# define PNG_REMOVED(ordinal, type, name, args, attributes) +#endif + +#ifndef PNG_CALLBACK +# define PNG_CALLBACK(type, name, args) type (PNGCBAPI name) PNGARG(args) +#endif + +/* Support for compiler specific function attributes. These are used + * so that where compiler support is available incorrect use of API + * functions in png.h will generate compiler warnings. + * + * Added at libpng-1.2.41. + */ + +#ifndef PNG_NO_PEDANTIC_WARNINGS +# ifndef PNG_PEDANTIC_WARNINGS_SUPPORTED +# define PNG_PEDANTIC_WARNINGS_SUPPORTED +# endif +#endif + +#ifdef PNG_PEDANTIC_WARNINGS_SUPPORTED + /* Support for compiler specific function attributes. These are used + * so that where compiler support is available incorrect use of API + * functions in png.h will generate compiler warnings. Added at libpng + * version 1.2.41. + */ +# if defined(__GNUC__) +# ifndef PNG_USE_RESULT +# define PNG_USE_RESULT __attribute__((__warn_unused_result__)) +# endif +# ifndef PNG_NORETURN +# define PNG_NORETURN __attribute__((__noreturn__)) +# endif +# ifndef PNG_ALLOCATED +# define PNG_ALLOCATED __attribute__((__malloc__)) +# endif +# ifndef PNG_DEPRECATED +# define PNG_DEPRECATED __attribute__((__deprecated__)) +# endif +# ifndef PNG_PRIVATE +# if 0 /* Doesn't work so we use deprecated instead*/ +# define PNG_PRIVATE \ + __attribute__((warning("This function is not exported by libpng."))) +# else +# define PNG_PRIVATE \ + __attribute__((__deprecated__)) +# endif +# endif +# endif /* __GNUC__ */ + +# if defined(_MSC_VER) && (_MSC_VER >= 1300) +# ifndef PNG_USE_RESULT +# define PNG_USE_RESULT /* not supported */ +# endif +# ifndef PNG_NORETURN +# define PNG_NORETURN __declspec(noreturn) +# endif +# ifndef PNG_ALLOCATED +# if (_MSC_VER >= 1400) +# define PNG_ALLOCATED __declspec(restrict) +# endif +# endif +# ifndef PNG_DEPRECATED +# define PNG_DEPRECATED __declspec(deprecated) +# endif +# ifndef PNG_PRIVATE +# define PNG_PRIVATE __declspec(deprecated) +# endif +# endif /* _MSC_VER */ +#endif /* PNG_PEDANTIC_WARNINGS */ + +#ifndef PNG_DEPRECATED +# define PNG_DEPRECATED /* Use of this function is deprecated */ +#endif +#ifndef PNG_USE_RESULT +# define PNG_USE_RESULT /* The result of this function must be checked */ +#endif +#ifndef PNG_NORETURN +# define PNG_NORETURN /* This function does not return */ +#endif +#ifndef PNG_ALLOCATED +# define PNG_ALLOCATED /* The result of the function is new memory */ +#endif +#ifndef PNG_PRIVATE +# define PNG_PRIVATE /* This is a private libpng function */ +#endif +#ifndef PNG_FP_EXPORT /* A floating point API. */ +# ifdef PNG_FLOATING_POINT_SUPPORTED +# define PNG_FP_EXPORT(ordinal, type, name, args)\ + PNG_EXPORT(ordinal, type, name, args) +# else /* No floating point APIs */ +# define PNG_FP_EXPORT(ordinal, type, name, args) +# endif +#endif +#ifndef PNG_FIXED_EXPORT /* A fixed point API. */ +# ifdef PNG_FIXED_POINT_SUPPORTED +# define PNG_FIXED_EXPORT(ordinal, type, name, args)\ + PNG_EXPORT(ordinal, type, name, args) +# else /* No fixed point APIs */ +# define PNG_FIXED_EXPORT(ordinal, type, name, args) +# endif +#endif + +/* The following uses const char * instead of char * for error + * and warning message functions, so some compilers won't complain. + * If you do not want to use const, define PNG_NO_CONST here. + * + * This should not change how the APIs are called, so it can be done + * on a per-file basis in the application. + */ +#ifndef PNG_CONST +# ifndef PNG_NO_CONST +# define PNG_CONST const +# else +# define PNG_CONST +# endif +#endif + +/* Some typedefs to get us started. These should be safe on most of the + * common platforms. The typedefs should be at least as large as the + * numbers suggest (a png_uint_32 must be at least 32 bits long), but they + * don't have to be exactly that size. Some compilers dislike passing + * unsigned shorts as function parameters, so you may be better off using + * unsigned int for png_uint_16. + */ + +#if defined(INT_MAX) && (INT_MAX > 0x7ffffffeL) +typedef unsigned int png_uint_32; +typedef int png_int_32; +#else +typedef unsigned long png_uint_32; +typedef long png_int_32; +#endif +typedef unsigned short png_uint_16; +typedef short png_int_16; +typedef unsigned char png_byte; + +#ifdef PNG_NO_SIZE_T +typedef unsigned int png_size_t; +#else +typedef size_t png_size_t; +#endif +#define png_sizeof(x) (sizeof (x)) + +/* The following is needed for medium model support. It cannot be in the + * pngpriv.h header. Needs modification for other compilers besides + * MSC. Model independent support declares all arrays and pointers to be + * large using the far keyword. The zlib version used must also support + * model independent data. As of version zlib 1.0.4, the necessary changes + * have been made in zlib. The USE_FAR_KEYWORD define triggers other + * changes that are needed. (Tim Wegner) + */ + +/* Separate compiler dependencies (problem here is that zlib.h always + * defines FAR. (SJT) + */ +#ifdef __BORLANDC__ +# if defined(__LARGE__) || defined(__HUGE__) || defined(__COMPACT__) +# define LDATA 1 +# else +# define LDATA 0 +# endif + /* GRR: why is Cygwin in here? Cygwin is not Borland C... */ +# if !defined(__WIN32__) && !defined(__FLAT__) && !defined(__CYGWIN__) +# define PNG_MAX_MALLOC_64K /* only used in build */ +# if (LDATA != 1) +# ifndef FAR +# define FAR __far +# endif +# define USE_FAR_KEYWORD +# endif /* LDATA != 1 */ + /* Possibly useful for moving data out of default segment. + * Uncomment it if you want. Could also define FARDATA as + * const if your compiler supports it. (SJT) +# define FARDATA FAR + */ +# endif /* __WIN32__, __FLAT__, __CYGWIN__ */ +#endif /* __BORLANDC__ */ + + +/* Suggest testing for specific compiler first before testing for + * FAR. The Watcom compiler defines both __MEDIUM__ and M_I86MM, + * making reliance oncertain keywords suspect. (SJT) + */ + +/* MSC Medium model */ +#ifdef FAR +# ifdef M_I86MM +# define USE_FAR_KEYWORD +# define FARDATA FAR +# include <dos.h> +# endif +#endif + +/* SJT: default case */ +#ifndef FAR +# define FAR +#endif + +/* At this point FAR is always defined */ +#ifndef FARDATA +# define FARDATA +#endif + +/* Typedef for floating-point numbers that are converted + * to fixed-point with a multiple of 100,000, e.g., gamma + */ +typedef png_int_32 png_fixed_point; + +/* Add typedefs for pointers */ +typedef void FAR * png_voidp; +typedef PNG_CONST void FAR * png_const_voidp; +typedef png_byte FAR * png_bytep; +typedef PNG_CONST png_byte FAR * png_const_bytep; +typedef png_uint_32 FAR * png_uint_32p; +typedef PNG_CONST png_uint_32 FAR * png_const_uint_32p; +typedef png_int_32 FAR * png_int_32p; +typedef PNG_CONST png_int_32 FAR * png_const_int_32p; +typedef png_uint_16 FAR * png_uint_16p; +typedef PNG_CONST png_uint_16 FAR * png_const_uint_16p; +typedef png_int_16 FAR * png_int_16p; +typedef PNG_CONST png_int_16 FAR * png_const_int_16p; +typedef char FAR * png_charp; +typedef PNG_CONST char FAR * png_const_charp; +typedef png_fixed_point FAR * png_fixed_point_p; +typedef PNG_CONST png_fixed_point FAR * png_const_fixed_point_p; +typedef png_size_t FAR * png_size_tp; +typedef PNG_CONST png_size_t FAR * png_const_size_tp; + +#ifdef PNG_STDIO_SUPPORTED +typedef FILE * png_FILE_p; +#endif + +#ifdef PNG_FLOATING_POINT_SUPPORTED +typedef double FAR * png_doublep; +typedef PNG_CONST double FAR * png_const_doublep; +#endif + +/* Pointers to pointers; i.e. arrays */ +typedef png_byte FAR * FAR * png_bytepp; +typedef png_uint_32 FAR * FAR * png_uint_32pp; +typedef png_int_32 FAR * FAR * png_int_32pp; +typedef png_uint_16 FAR * FAR * png_uint_16pp; +typedef png_int_16 FAR * FAR * png_int_16pp; +typedef PNG_CONST char FAR * FAR * png_const_charpp; +typedef char FAR * FAR * png_charpp; +typedef png_fixed_point FAR * FAR * png_fixed_point_pp; +#ifdef PNG_FLOATING_POINT_SUPPORTED +typedef double FAR * FAR * png_doublepp; +#endif + +/* Pointers to pointers to pointers; i.e., pointer to array */ +typedef char FAR * FAR * FAR * png_charppp; + +/* png_alloc_size_t is guaranteed to be no smaller than png_size_t, + * and no smaller than png_uint_32. Casts from png_size_t or png_uint_32 + * to png_alloc_size_t are not necessary; in fact, it is recommended + * not to use them at all so that the compiler can complain when something + * turns out to be problematic. + * Casts in the other direction (from png_alloc_size_t to png_size_t or + * png_uint_32) should be explicitly applied; however, we do not expect + * to encounter practical situations that require such conversions. + */ +#if defined(__TURBOC__) && !defined(__FLAT__) + typedef unsigned long png_alloc_size_t; +#else +# if defined(_MSC_VER) && defined(MAXSEG_64K) + typedef unsigned long png_alloc_size_t; +# else + /* This is an attempt to detect an old Windows system where (int) is + * actually 16 bits, in that case png_malloc must have an argument with a + * bigger size to accomodate the requirements of the library. + */ +# if (defined(_Windows) || defined(_WINDOWS) || defined(_WINDOWS_)) && \ + (!defined(INT_MAX) || INT_MAX <= 0x7ffffffeL) + typedef DWORD png_alloc_size_t; +# else + typedef png_size_t png_alloc_size_t; +# endif +# endif +#endif + +#endif /* PNGCONF_H */ diff --git a/plugins/snes9x_gx/portlibs/include/pnglibconf.h b/plugins/snes9x_gx/portlibs/include/pnglibconf.h new file mode 100644 index 00000000..c76480e7 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/pnglibconf.h @@ -0,0 +1,180 @@ +/* pnglibconf.h - library build configuration */ + +/* libpng version 1.5.9 - February 18, 2012 */ + +/* Copyright (c) 1998-2011 Glenn Randers-Pehrson */ + +/* This code is released under the libpng license. */ +/* For conditions of distribution and use, see the disclaimer */ +/* and license in png.h */ + +/* pnglibconf.h */ +/* Machine generated file: DO NOT EDIT */ +/* Derived from: scripts/pnglibconf.dfa */ +#ifndef PNGLCONF_H +#define PNGLCONF_H +/* settings */ +#define PNG_MAX_GAMMA_8 11 +#define PNG_CALLOC_SUPPORTED +#define PNG_QUANTIZE_RED_BITS 5 +#define PNG_USER_WIDTH_MAX 1000000 +#define PNG_QUANTIZE_GREEN_BITS 5 +#define PNG_API_RULE 0 +#define PNG_QUANTIZE_BLUE_BITS 5 +#define PNG_USER_CHUNK_CACHE_MAX 0 +#define PNG_USER_HEIGHT_MAX 1000000 +#define PNG_sCAL_PRECISION 5 +#define PNG_COST_SHIFT 3 +#define PNG_WEIGHT_SHIFT 8 +#define PNG_USER_CHUNK_MALLOC_MAX 0 +#define PNG_DEFAULT_READ_MACROS 1 +#define PNG_ZBUF_SIZE 8192 +#define PNG_GAMMA_THRESHOLD_FIXED 5000 +/* end of settings */ +/* options */ +#define PNG_INFO_IMAGE_SUPPORTED +#define PNG_HANDLE_AS_UNKNOWN_SUPPORTED +#define PNG_POINTER_INDEXING_SUPPORTED +#define PNG_WARNINGS_SUPPORTED +#define PNG_FLOATING_ARITHMETIC_SUPPORTED +#define PNG_WRITE_SUPPORTED +#define PNG_WRITE_INTERLACING_SUPPORTED +#define PNG_WRITE_16BIT_SUPPORTED +#define PNG_EASY_ACCESS_SUPPORTED +#define PNG_ALIGN_MEMORY_SUPPORTED +#define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED +#define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED +#define PNG_USER_LIMITS_SUPPORTED +#define PNG_FIXED_POINT_SUPPORTED +/*#undef PNG_ERROR_NUMBERS_SUPPORTED*/ +#define PNG_ERROR_TEXT_SUPPORTED +#define PNG_READ_SUPPORTED +#define PNG_BENIGN_ERRORS_SUPPORTED +#define PNG_SETJMP_SUPPORTED +#define PNG_TIME_RFC1123_SUPPORTED +#define PNG_WRITE_FLUSH_SUPPORTED +#define PNG_MNG_FEATURES_SUPPORTED +#define PNG_FLOATING_POINT_SUPPORTED +#define PNG_WRITE_OPTIMIZE_CMF_SUPPORTED +#define PNG_INCH_CONVERSIONS_SUPPORTED +#define PNG_STDIO_SUPPORTED +#define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_USER_MEM_SUPPORTED +#define PNG_IO_STATE_SUPPORTED +#define PNG_SET_USER_LIMITS_SUPPORTED +#define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED +#define PNG_WRITE_INT_FUNCTIONS_SUPPORTED +#define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED +#define PNG_WRITE_FILTER_SUPPORTED +#define PNG_WRITE_zTXt_SUPPORTED +#define PNG_SET_CHUNK_CACHE_LIMIT_SUPPORTED +#define PNG_WRITE_iCCP_SUPPORTED +#define PNG_READ_TRANSFORMS_SUPPORTED +#define PNG_READ_bKGD_SUPPORTED +#define PNG_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_READ_sCAL_SUPPORTED +#define PNG_WRITE_hIST_SUPPORTED +#define PNG_READ_OPT_PLTE_SUPPORTED +#define PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED +#define PNG_WRITE_gAMA_SUPPORTED +#define PNG_READ_GRAY_TO_RGB_SUPPORTED +#define PNG_WRITE_pCAL_SUPPORTED +#define PNG_READ_INVERT_ALPHA_SUPPORTED +#define PNG_WRITE_TRANSFORMS_SUPPORTED +#define PNG_READ_ALPHA_MODE_SUPPORTED +#define PNG_READ_sBIT_SUPPORTED +#define PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED +#define PNG_READ_PACK_SUPPORTED +#define PNG_WRITE_iTXt_SUPPORTED +#define PNG_WRITE_SWAP_SUPPORTED +#define PNG_READ_cHRM_SUPPORTED +#define PNG_READ_STRIP_16_TO_8_SUPPORTED +#define PNG_WRITE_tIME_SUPPORTED +#define PNG_READ_INTERLACING_SUPPORTED +#define PNG_READ_tRNS_SUPPORTED +#define PNG_WRITE_pHYs_SUPPORTED +#define PNG_WRITE_INVERT_SUPPORTED +#define PNG_READ_RGB_TO_GRAY_SUPPORTED +#define PNG_WRITE_sRGB_SUPPORTED +#define PNG_READ_oFFs_SUPPORTED +#define PNG_WRITE_FILLER_SUPPORTED +#define PNG_WRITE_SHIFT_SUPPORTED +#define PNG_PROGRESSIVE_READ_SUPPORTED +#define PNG_READ_SHIFT_SUPPORTED +#define PNG_CONVERT_tIME_SUPPORTED +#define PNG_READ_USER_TRANSFORM_SUPPORTED +#define PNG_READ_INT_FUNCTIONS_SUPPORTED +#define PNG_READ_USER_CHUNKS_SUPPORTED +#define PNG_READ_hIST_SUPPORTED +#define PNG_READ_16BIT_SUPPORTED +#define PNG_READ_SWAP_ALPHA_SUPPORTED +#define PNG_READ_COMPOSITE_NODIV_SUPPORTED +#define PNG_SEQUENTIAL_READ_SUPPORTED +#define PNG_READ_BACKGROUND_SUPPORTED +#define PNG_READ_QUANTIZE_SUPPORTED +#define PNG_READ_zTXt_SUPPORTED +#define PNG_READ_iCCP_SUPPORTED +#define PNG_READ_STRIP_ALPHA_SUPPORTED +#define PNG_READ_PACKSWAP_SUPPORTED +#define PNG_READ_sRGB_SUPPORTED +#define PNG_READ_pCAL_SUPPORTED +#define PNG_WRITE_sPLT_SUPPORTED +#define PNG_READ_iTXt_SUPPORTED +#define PNG_READ_SWAP_SUPPORTED +#define PNG_READ_tIME_SUPPORTED +#define PNG_READ_pHYs_SUPPORTED +#define PNG_WRITE_SWAP_ALPHA_SUPPORTED +#define PNG_READ_SCALE_16_TO_8_SUPPORTED +#define PNG_WRITE_BGR_SUPPORTED +#define PNG_USER_CHUNKS_SUPPORTED +#define PNG_CONSOLE_IO_SUPPORTED +#define PNG_WRITE_COMPRESSED_TEXT_SUPPORTED +#define PNG_WRITE_PACK_SUPPORTED +#define PNG_READ_FILLER_SUPPORTED +#define PNG_WRITE_bKGD_SUPPORTED +#define PNG_WRITE_tRNS_SUPPORTED +#define PNG_READ_sPLT_SUPPORTED +#define PNG_WRITE_sCAL_SUPPORTED +#define PNG_WRITE_oFFs_SUPPORTED +#define PNG_WRITE_sBIT_SUPPORTED +#define PNG_READ_INVERT_SUPPORTED +#define PNG_WRITE_cHRM_SUPPORTED +#define PNG_16BIT_SUPPORTED +#define PNG_WRITE_USER_TRANSFORM_SUPPORTED +#define PNG_READ_BGR_SUPPORTED +#define PNG_WRITE_PACKSWAP_SUPPORTED +#define PNG_WRITE_INVERT_ALPHA_SUPPORTED +#define PNG_sCAL_SUPPORTED +#define PNG_READ_GAMMA_SUPPORTED +#define PNG_USER_TRANSFORM_INFO_SUPPORTED +#define PNG_sBIT_SUPPORTED +#define PNG_cHRM_SUPPORTED +#define PNG_bKGD_SUPPORTED +#define PNG_tRNS_SUPPORTED +#define PNG_oFFs_SUPPORTED +#define PNG_READ_EXPAND_16_SUPPORTED +#define PNG_USER_TRANSFORM_PTR_SUPPORTED +#define PNG_WRITE_TEXT_SUPPORTED +#define PNG_READ_COMPRESSED_TEXT_SUPPORTED +#define PNG_hIST_SUPPORTED +#define PNG_zTXt_SUPPORTED +#define PNG_iCCP_SUPPORTED +#define PNG_sRGB_SUPPORTED +#define PNG_pCAL_SUPPORTED +#define PNG_WRITE_tEXt_SUPPORTED +#define PNG_CHECK_cHRM_SUPPORTED +#define PNG_READ_gAMA_SUPPORTED +#define PNG_iTXt_SUPPORTED +#define PNG_tIME_SUPPORTED +#define PNG_READ_EXPAND_SUPPORTED +#define PNG_pHYs_SUPPORTED +#define PNG_READ_TEXT_SUPPORTED +#define PNG_SAVE_INT_32_SUPPORTED +#define PNG_sPLT_SUPPORTED +#define PNG_READ_tEXt_SUPPORTED +#define PNG_gAMA_SUPPORTED +#define PNG_TEXT_SUPPORTED +#define PNG_tEXt_SUPPORTED +/* end of options */ +#endif /* PNGLCONF_H */ diff --git a/plugins/snes9x_gx/portlibs/include/sevenzip/7zAlloc.h b/plugins/snes9x_gx/portlibs/include/sevenzip/7zAlloc.h new file mode 100644 index 00000000..91505d00 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/sevenzip/7zAlloc.h @@ -0,0 +1,15 @@ +/* 7zAlloc.h -- Allocation functions +2008-10-04 : Igor Pavlov : Public domain */ + +#ifndef __7Z_ALLOC_H +#define __7Z_ALLOC_H + +#include <stddef.h> + +void *SzAlloc(void *p, size_t size); +void SzFree(void *p, void *address); + +void *SzAllocTemp(void *p, size_t size); +void SzFreeTemp(void *p, void *address); + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/sevenzip/7zBuf.h b/plugins/snes9x_gx/portlibs/include/sevenzip/7zBuf.h new file mode 100644 index 00000000..49b2354b --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/sevenzip/7zBuf.h @@ -0,0 +1,31 @@ +/* 7zBuf.h -- Byte Buffer +2008-10-04 : Igor Pavlov : Public domain */ + +#ifndef __7Z_BUF_H +#define __7Z_BUF_H + +#include "Types.h" + +typedef struct +{ + Byte *data; + size_t size; +} CBuf; + +void Buf_Init(CBuf *p); +int Buf_Create(CBuf *p, size_t size, ISzAlloc *alloc); +void Buf_Free(CBuf *p, ISzAlloc *alloc); + +typedef struct +{ + Byte *data; + size_t size; + size_t pos; +} CDynBuf; + +void DynBuf_Construct(CDynBuf *p); +void DynBuf_SeekToBeg(CDynBuf *p); +int DynBuf_Write(CDynBuf *p, const Byte *buf, size_t size, ISzAlloc *alloc); +void DynBuf_Free(CDynBuf *p, ISzAlloc *alloc); + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/sevenzip/7zCrc.h b/plugins/snes9x_gx/portlibs/include/sevenzip/7zCrc.h new file mode 100644 index 00000000..ae230991 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/sevenzip/7zCrc.h @@ -0,0 +1,24 @@ +/* 7zCrc.h -- CRC32 calculation +2008-03-13 +Igor Pavlov +Public domain */ + +#ifndef __7Z_CRC_H +#define __7Z_CRC_H + +#include <stddef.h> + +#include "Types.h" + +extern UInt32 g_CrcTable[]; + +void MY_FAST_CALL CrcGenerateTable(void); + +#define CRC_INIT_VAL 0xFFFFFFFF +#define CRC_GET_DIGEST(crc) ((crc) ^ 0xFFFFFFFF) +#define CRC_UPDATE_BYTE(crc, b) (g_CrcTable[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) + +UInt32 MY_FAST_CALL CrcUpdate(UInt32 crc, const void *data, size_t size); +UInt32 MY_FAST_CALL CrcCalc(const void *data, size_t size); + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/sevenzip/7zDecode.h b/plugins/snes9x_gx/portlibs/include/sevenzip/7zDecode.h new file mode 100644 index 00000000..9607915b --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/sevenzip/7zDecode.h @@ -0,0 +1,13 @@ +/* 7zDecode.h -- Decoding from 7z folder +2008-11-23 : Igor Pavlov : Public domain */ + +#ifndef __7Z_DECODE_H +#define __7Z_DECODE_H + +#include "7zItem.h" + +SRes SzDecode(const UInt64 *packSizes, const CSzFolder *folder, + ILookInStream *stream, UInt64 startPos, + Byte *outBuffer, size_t outSize, ISzAlloc *allocMain); + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/sevenzip/7zExtract.h b/plugins/snes9x_gx/portlibs/include/sevenzip/7zExtract.h new file mode 100644 index 00000000..e171f4ab --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/sevenzip/7zExtract.h @@ -0,0 +1,41 @@ +/* 7zExtract.h -- Extracting from 7z archive +2008-11-23 : Igor Pavlov : Public domain */ + +#ifndef __7Z_EXTRACT_H +#define __7Z_EXTRACT_H + +#include "7zIn.h" + +/* + SzExtract extracts file from archive + + *outBuffer must be 0 before first call for each new archive. + + Extracting cache: + If you need to decompress more than one file, you can send + these values from previous call: + *blockIndex, + *outBuffer, + *outBufferSize + You can consider "*outBuffer" as cache of solid block. If your archive is solid, + it will increase decompression speed. + + If you use external function, you can declare these 3 cache variables + (blockIndex, outBuffer, outBufferSize) as static in that external function. + + Free *outBuffer and set *outBuffer to 0, if you want to flush cache. +*/ + +SRes SzAr_Extract( + const CSzArEx *db, + ILookInStream *inStream, + UInt32 fileIndex, /* index of file */ + UInt32 *blockIndex, /* index of solid block */ + Byte **outBuffer, /* pointer to pointer to output buffer (allocated with allocMain) */ + size_t *outBufferSize, /* buffer size for output buffer */ + size_t *offset, /* offset of stream for required file in *outBuffer */ + size_t *outSizeProcessed, /* size of file in *outBuffer */ + ISzAlloc *allocMain, + ISzAlloc *allocTemp); + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/sevenzip/7zFile.h b/plugins/snes9x_gx/portlibs/include/sevenzip/7zFile.h new file mode 100644 index 00000000..4fd2936c --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/sevenzip/7zFile.h @@ -0,0 +1,74 @@ +/* 7zFile.h -- File IO +2008-11-22 : Igor Pavlov : Public domain */ + +#ifndef __7Z_FILE_H +#define __7Z_FILE_H + +#ifdef _WIN32 +#define USE_WINDOWS_FILE +#endif + +#ifdef USE_WINDOWS_FILE +#include <windows.h> +#else +#include <stdio.h> +#endif + +#include "Types.h" + + +/* ---------- File ---------- */ + +typedef struct +{ + #ifdef USE_WINDOWS_FILE + HANDLE handle; + #else + FILE *file; + #endif +} CSzFile; + +void File_Construct(CSzFile *p); +WRes InFile_Open(CSzFile *p, const char *name); +WRes OutFile_Open(CSzFile *p, const char *name); +WRes File_Close(CSzFile *p); + +/* reads max(*size, remain file's size) bytes */ +WRes File_Read(CSzFile *p, void *data, size_t *size); + +/* writes *size bytes */ +WRes File_Write(CSzFile *p, const void *data, size_t *size); + +WRes File_Seek(CSzFile *p, Int64 *pos, ESzSeek origin); +WRes File_GetLength(CSzFile *p, UInt64 *length); + + +/* ---------- FileInStream ---------- */ + +typedef struct +{ + ISeqInStream s; + CSzFile file; +} CFileSeqInStream; + +void FileSeqInStream_CreateVTable(CFileSeqInStream *p); + + +typedef struct +{ + ISeekInStream s; + CSzFile file; +} CFileInStream; + +void FileInStream_CreateVTable(CFileInStream *p); + + +typedef struct +{ + ISeqOutStream s; + CSzFile file; +} CFileOutStream; + +void FileOutStream_CreateVTable(CFileOutStream *p); + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/sevenzip/7zHeader.h b/plugins/snes9x_gx/portlibs/include/sevenzip/7zHeader.h new file mode 100644 index 00000000..a8c85e8d --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/sevenzip/7zHeader.h @@ -0,0 +1,57 @@ +/* 7zHeader.h -- 7z Headers +2008-10-04 : Igor Pavlov : Public domain */ + +#ifndef __7Z_HEADER_H +#define __7Z_HEADER_H + +#include "Types.h" + +#define k7zSignatureSize 6 +extern Byte k7zSignature[k7zSignatureSize]; + +#define k7zMajorVersion 0 + +#define k7zStartHeaderSize 0x20 + +enum EIdEnum +{ + k7zIdEnd, + + k7zIdHeader, + + k7zIdArchiveProperties, + + k7zIdAdditionalStreamsInfo, + k7zIdMainStreamsInfo, + k7zIdFilesInfo, + + k7zIdPackInfo, + k7zIdUnpackInfo, + k7zIdSubStreamsInfo, + + k7zIdSize, + k7zIdCRC, + + k7zIdFolder, + + k7zIdCodersUnpackSize, + k7zIdNumUnpackStream, + + k7zIdEmptyStream, + k7zIdEmptyFile, + k7zIdAnti, + + k7zIdName, + k7zIdCTime, + k7zIdATime, + k7zIdMTime, + k7zIdWinAttributes, + k7zIdComment, + + k7zIdEncodedHeader, + + k7zIdStartPos, + k7zIdDummy +}; + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/sevenzip/7zIn.h b/plugins/snes9x_gx/portlibs/include/sevenzip/7zIn.h new file mode 100644 index 00000000..717fe52c --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/sevenzip/7zIn.h @@ -0,0 +1,41 @@ +/* 7zIn.h -- 7z Input functions +2008-11-23 : Igor Pavlov : Public domain */ + +#ifndef __7Z_IN_H +#define __7Z_IN_H + +#include "7zHeader.h" +#include "7zItem.h" + +typedef struct +{ + CSzAr db; + + UInt64 startPosAfterHeader; + UInt64 dataPos; + + UInt32 *FolderStartPackStreamIndex; + UInt64 *PackStreamStartPositions; + UInt32 *FolderStartFileIndex; + UInt32 *FileIndexToFolderIndexMap; +} CSzArEx; + +void SzArEx_Init(CSzArEx *p); +void SzArEx_Free(CSzArEx *p, ISzAlloc *alloc); +UInt64 SzArEx_GetFolderStreamPos(const CSzArEx *p, UInt32 folderIndex, UInt32 indexInFolder); +int SzArEx_GetFolderFullPackSize(const CSzArEx *p, UInt32 folderIndex, UInt64 *resSize); + +/* +Errors: +SZ_ERROR_NO_ARCHIVE +SZ_ERROR_ARCHIVE +SZ_ERROR_UNSUPPORTED +SZ_ERROR_MEM +SZ_ERROR_CRC +SZ_ERROR_INPUT_EOF +SZ_ERROR_FAIL +*/ + +SRes SzArEx_Open(CSzArEx *p, ILookInStream *inStream, ISzAlloc *allocMain, ISzAlloc *allocTemp); + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/sevenzip/7zItem.h b/plugins/snes9x_gx/portlibs/include/sevenzip/7zItem.h new file mode 100644 index 00000000..c7eb8f5f --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/sevenzip/7zItem.h @@ -0,0 +1,84 @@ +/* 7zItem.h -- 7z Items +2008-10-04 : Igor Pavlov : Public domain */ + +#ifndef __7Z_ITEM_H +#define __7Z_ITEM_H + +#include "7zBuf.h" + +typedef struct +{ + UInt32 NumInStreams; + UInt32 NumOutStreams; + UInt64 MethodID; + CBuf Props; +} CSzCoderInfo; + +void SzCoderInfo_Init(CSzCoderInfo *p); +void SzCoderInfo_Free(CSzCoderInfo *p, ISzAlloc *alloc); + +typedef struct +{ + UInt32 InIndex; + UInt32 OutIndex; +} CBindPair; + +typedef struct +{ + CSzCoderInfo *Coders; + CBindPair *BindPairs; + UInt32 *PackStreams; + UInt64 *UnpackSizes; + UInt32 NumCoders; + UInt32 NumBindPairs; + UInt32 NumPackStreams; + int UnpackCRCDefined; + UInt32 UnpackCRC; + + UInt32 NumUnpackStreams; +} CSzFolder; + +void SzFolder_Init(CSzFolder *p); +UInt64 SzFolder_GetUnpackSize(CSzFolder *p); +int SzFolder_FindBindPairForInStream(CSzFolder *p, UInt32 inStreamIndex); +UInt32 SzFolder_GetNumOutStreams(CSzFolder *p); +UInt64 SzFolder_GetUnpackSize(CSzFolder *p); + +typedef struct +{ + UInt32 Low; + UInt32 High; +} CNtfsFileTime; + +typedef struct +{ + CNtfsFileTime MTime; + UInt64 Size; + char *Name; + UInt32 FileCRC; + + Byte HasStream; + Byte IsDir; + Byte IsAnti; + Byte FileCRCDefined; + Byte MTimeDefined; +} CSzFileItem; + +void SzFile_Init(CSzFileItem *p); + +typedef struct +{ + UInt64 *PackSizes; + Byte *PackCRCsDefined; + UInt32 *PackCRCs; + CSzFolder *Folders; + CSzFileItem *Files; + UInt32 NumPackStreams; + UInt32 NumFolders; + UInt32 NumFiles; +} CSzAr; + +void SzAr_Init(CSzAr *p); +void SzAr_Free(CSzAr *p, ISzAlloc *alloc); + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/sevenzip/7zVersion.h b/plugins/snes9x_gx/portlibs/include/sevenzip/7zVersion.h new file mode 100644 index 00000000..5a6bcada --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/sevenzip/7zVersion.h @@ -0,0 +1,7 @@ +#define MY_VER_MAJOR 4 +#define MY_VER_MINOR 65 +#define MY_VER_BUILD 0 +#define MY_VERSION "4.65" +#define MY_DATE "2009-02-03" +#define MY_COPYRIGHT ": Igor Pavlov : Public domain" +#define MY_VERSION_COPYRIGHT_DATE MY_VERSION " " MY_COPYRIGHT " : " MY_DATE diff --git a/plugins/snes9x_gx/portlibs/include/sevenzip/Bcj2.h b/plugins/snes9x_gx/portlibs/include/sevenzip/Bcj2.h new file mode 100644 index 00000000..f58e3bcb --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/sevenzip/Bcj2.h @@ -0,0 +1,30 @@ +/* Bcj2.h -- Converter for x86 code (BCJ2) +2008-10-04 : Igor Pavlov : Public domain */ + +#ifndef __BCJ2_H +#define __BCJ2_H + +#include "Types.h" + +/* +Conditions: + outSize <= FullOutputSize, + where FullOutputSize is full size of output stream of x86_2 filter. + +If buf0 overlaps outBuf, there are two required conditions: + 1) (buf0 >= outBuf) + 2) (buf0 + size0 >= outBuf + FullOutputSize). + +Returns: + SZ_OK + SZ_ERROR_DATA - Data error +*/ + +int Bcj2_Decode( + const Byte *buf0, SizeT size0, + const Byte *buf1, SizeT size1, + const Byte *buf2, SizeT size2, + const Byte *buf3, SizeT size3, + Byte *outBuf, SizeT outSize); + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/sevenzip/Bra.h b/plugins/snes9x_gx/portlibs/include/sevenzip/Bra.h new file mode 100644 index 00000000..b9018eb9 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/sevenzip/Bra.h @@ -0,0 +1,60 @@ +/* Bra.h -- Branch converters for executables +2008-10-04 : Igor Pavlov : Public domain */ + +#ifndef __BRA_H +#define __BRA_H + +#include "Types.h" + +/* +These functions convert relative addresses to absolute addresses +in CALL instructions to increase the compression ratio. + + In: + data - data buffer + size - size of data + ip - current virtual Instruction Pinter (IP) value + state - state variable for x86 converter + encoding - 0 (for decoding), 1 (for encoding) + + Out: + state - state variable for x86 converter + + Returns: + The number of processed bytes. If you call these functions with multiple calls, + you must start next call with first byte after block of processed bytes. + + Type Endian Alignment LookAhead + + x86 little 1 4 + ARMT little 2 2 + ARM little 4 0 + PPC big 4 0 + SPARC big 4 0 + IA64 little 16 0 + + size must be >= Alignment + LookAhead, if it's not last block. + If (size < Alignment + LookAhead), converter returns 0. + + Example: + + UInt32 ip = 0; + for () + { + ; size must be >= Alignment + LookAhead, if it's not last block + SizeT processed = Convert(data, size, ip, 1); + data += processed; + size -= processed; + ip += processed; + } +*/ + +#define x86_Convert_Init(state) { state = 0; } +SizeT x86_Convert(Byte *data, SizeT size, UInt32 ip, UInt32 *state, int encoding); +SizeT ARM_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); +SizeT ARMT_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); +SizeT PPC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); +SizeT SPARC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); +SizeT IA64_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/sevenzip/CpuArch.h b/plugins/snes9x_gx/portlibs/include/sevenzip/CpuArch.h new file mode 100644 index 00000000..006361f2 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/sevenzip/CpuArch.h @@ -0,0 +1,69 @@ +/* CpuArch.h +2008-08-05 +Igor Pavlov +Public domain */ + +#ifndef __CPUARCH_H +#define __CPUARCH_H + +/* +LITTLE_ENDIAN_UNALIGN means: + 1) CPU is LITTLE_ENDIAN + 2) it's allowed to make unaligned memory accesses +if LITTLE_ENDIAN_UNALIGN is not defined, it means that we don't know +about these properties of platform. +*/ + +#if defined(_M_IX86) || defined(_M_X64) || defined(_M_AMD64) || defined(__i386__) || defined(__x86_64__) +#define LITTLE_ENDIAN_UNALIGN +#endif + +#ifdef LITTLE_ENDIAN_UNALIGN + +#define GetUi16(p) (*(const UInt16 *)(p)) +#define GetUi32(p) (*(const UInt32 *)(p)) +#define GetUi64(p) (*(const UInt64 *)(p)) +#define SetUi32(p, d) *(UInt32 *)(p) = (d); + +#else + +#define GetUi16(p) (((const Byte *)(p))[0] | ((UInt16)((const Byte *)(p))[1] << 8)) + +#define GetUi32(p) ( \ + ((const Byte *)(p))[0] | \ + ((UInt32)((const Byte *)(p))[1] << 8) | \ + ((UInt32)((const Byte *)(p))[2] << 16) | \ + ((UInt32)((const Byte *)(p))[3] << 24)) + +#define GetUi64(p) (GetUi32(p) | ((UInt64)GetUi32(((const Byte *)(p)) + 4) << 32)) + +#define SetUi32(p, d) { UInt32 _x_ = (d); \ + ((Byte *)(p))[0] = (Byte)_x_; \ + ((Byte *)(p))[1] = (Byte)(_x_ >> 8); \ + ((Byte *)(p))[2] = (Byte)(_x_ >> 16); \ + ((Byte *)(p))[3] = (Byte)(_x_ >> 24); } + +#endif + +#if defined(LITTLE_ENDIAN_UNALIGN) && defined(_WIN64) && (_MSC_VER >= 1300) + +#pragma intrinsic(_byteswap_ulong) +#pragma intrinsic(_byteswap_uint64) +#define GetBe32(p) _byteswap_ulong(*(const UInt32 *)(const Byte *)(p)) +#define GetBe64(p) _byteswap_uint64(*(const UInt64 *)(const Byte *)(p)) + +#else + +#define GetBe32(p) ( \ + ((UInt32)((const Byte *)(p))[0] << 24) | \ + ((UInt32)((const Byte *)(p))[1] << 16) | \ + ((UInt32)((const Byte *)(p))[2] << 8) | \ + ((const Byte *)(p))[3] ) + +#define GetBe64(p) (((UInt64)GetBe32(p) << 32) | GetBe32(((const Byte *)(p)) + 4)) + +#endif + +#define GetBe16(p) (((UInt16)((const Byte *)(p))[0] << 8) | ((const Byte *)(p))[1]) + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/sevenzip/LzmaDec.h b/plugins/snes9x_gx/portlibs/include/sevenzip/LzmaDec.h new file mode 100644 index 00000000..ad7d7057 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/sevenzip/LzmaDec.h @@ -0,0 +1,223 @@ +/* LzmaDec.h -- LZMA Decoder +2008-10-04 : Igor Pavlov : Public domain */ + +#ifndef __LZMADEC_H +#define __LZMADEC_H + +#include "Types.h" + +/* #define _LZMA_PROB32 */ +/* _LZMA_PROB32 can increase the speed on some CPUs, + but memory usage for CLzmaDec::probs will be doubled in that case */ + +#ifdef _LZMA_PROB32 +#define CLzmaProb UInt32 +#else +#define CLzmaProb UInt16 +#endif + + +/* ---------- LZMA Properties ---------- */ + +#define LZMA_PROPS_SIZE 5 + +typedef struct _CLzmaProps +{ + unsigned lc, lp, pb; + UInt32 dicSize; +} CLzmaProps; + +/* LzmaProps_Decode - decodes properties +Returns: + SZ_OK + SZ_ERROR_UNSUPPORTED - Unsupported properties +*/ + +SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size); + + +/* ---------- LZMA Decoder state ---------- */ + +/* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case. + Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */ + +#define LZMA_REQUIRED_INPUT_MAX 20 + +typedef struct +{ + CLzmaProps prop; + CLzmaProb *probs; + Byte *dic; + const Byte *buf; + UInt32 range, code; + SizeT dicPos; + SizeT dicBufSize; + UInt32 processedPos; + UInt32 checkDicSize; + unsigned state; + UInt32 reps[4]; + unsigned remainLen; + int needFlush; + int needInitState; + UInt32 numProbs; + unsigned tempBufSize; + Byte tempBuf[LZMA_REQUIRED_INPUT_MAX]; +} CLzmaDec; + +#define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; } + +void LzmaDec_Init(CLzmaDec *p); + +/* There are two types of LZMA streams: + 0) Stream with end mark. That end mark adds about 6 bytes to compressed size. + 1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */ + +typedef enum +{ + LZMA_FINISH_ANY, /* finish at any point */ + LZMA_FINISH_END /* block must be finished at the end */ +} ELzmaFinishMode; + +/* ELzmaFinishMode has meaning only if the decoding reaches output limit !!! + + You must use LZMA_FINISH_END, when you know that current output buffer + covers last bytes of block. In other cases you must use LZMA_FINISH_ANY. + + If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK, + and output value of destLen will be less than output buffer size limit. + You can check status result also. + + You can use multiple checks to test data integrity after full decompression: + 1) Check Result and "status" variable. + 2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize. + 3) Check that output(srcLen) = compressedSize, if you know real compressedSize. + You must use correct finish mode in that case. */ + +typedef enum +{ + LZMA_STATUS_NOT_SPECIFIED, /* use main error code instead */ + LZMA_STATUS_FINISHED_WITH_MARK, /* stream was finished with end mark. */ + LZMA_STATUS_NOT_FINISHED, /* stream was not finished */ + LZMA_STATUS_NEEDS_MORE_INPUT, /* you must provide more input bytes */ + LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK /* there is probability that stream was finished without end mark */ +} ELzmaStatus; + +/* ELzmaStatus is used only as output value for function call */ + + +/* ---------- Interfaces ---------- */ + +/* There are 3 levels of interfaces: + 1) Dictionary Interface + 2) Buffer Interface + 3) One Call Interface + You can select any of these interfaces, but don't mix functions from different + groups for same object. */ + + +/* There are two variants to allocate state for Dictionary Interface: + 1) LzmaDec_Allocate / LzmaDec_Free + 2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs + You can use variant 2, if you set dictionary buffer manually. + For Buffer Interface you must always use variant 1. + +LzmaDec_Allocate* can return: + SZ_OK + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_UNSUPPORTED - Unsupported properties +*/ + +SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc); +void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc); + +SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc); +void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc); + +/* ---------- Dictionary Interface ---------- */ + +/* You can use it, if you want to eliminate the overhead for data copying from + dictionary to some other external buffer. + You must work with CLzmaDec variables directly in this interface. + + STEPS: + LzmaDec_Constr() + LzmaDec_Allocate() + for (each new stream) + { + LzmaDec_Init() + while (it needs more decompression) + { + LzmaDec_DecodeToDic() + use data from CLzmaDec::dic and update CLzmaDec::dicPos + } + } + LzmaDec_Free() +*/ + +/* LzmaDec_DecodeToDic + + The decoding to internal dictionary buffer (CLzmaDec::dic). + You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!! + +finishMode: + It has meaning only if the decoding reaches output limit (dicLimit). + LZMA_FINISH_ANY - Decode just dicLimit bytes. + LZMA_FINISH_END - Stream must be finished after dicLimit. + +Returns: + SZ_OK + status: + LZMA_STATUS_FINISHED_WITH_MARK + LZMA_STATUS_NOT_FINISHED + LZMA_STATUS_NEEDS_MORE_INPUT + LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK + SZ_ERROR_DATA - Data error +*/ + +SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, + const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); + + +/* ---------- Buffer Interface ---------- */ + +/* It's zlib-like interface. + See LzmaDec_DecodeToDic description for information about STEPS and return results, + but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need + to work with CLzmaDec variables manually. + +finishMode: + It has meaning only if the decoding reaches output limit (*destLen). + LZMA_FINISH_ANY - Decode just destLen bytes. + LZMA_FINISH_END - Stream must be finished after (*destLen). +*/ + +SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, + const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); + + +/* ---------- One Call Interface ---------- */ + +/* LzmaDecode + +finishMode: + It has meaning only if the decoding reaches output limit (*destLen). + LZMA_FINISH_ANY - Decode just destLen bytes. + LZMA_FINISH_END - Stream must be finished after (*destLen). + +Returns: + SZ_OK + status: + LZMA_STATUS_FINISHED_WITH_MARK + LZMA_STATUS_NOT_FINISHED + LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK + SZ_ERROR_DATA - Data error + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_UNSUPPORTED - Unsupported properties + SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src). +*/ + +SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, + ELzmaStatus *status, ISzAlloc *alloc); + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/sevenzip/Types.h b/plugins/snes9x_gx/portlibs/include/sevenzip/Types.h new file mode 100644 index 00000000..2638196a --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/sevenzip/Types.h @@ -0,0 +1,208 @@ +/* Types.h -- Basic types +2008-11-23 : Igor Pavlov : Public domain */ + +#ifndef __7Z_TYPES_H +#define __7Z_TYPES_H + +#include <stddef.h> + +#ifdef _WIN32 +#include <windows.h> +#endif + +#define SZ_OK 0 + +#define SZ_ERROR_DATA 1 +#define SZ_ERROR_MEM 2 +#define SZ_ERROR_CRC 3 +#define SZ_ERROR_UNSUPPORTED 4 +#define SZ_ERROR_PARAM 5 +#define SZ_ERROR_INPUT_EOF 6 +#define SZ_ERROR_OUTPUT_EOF 7 +#define SZ_ERROR_READ 8 +#define SZ_ERROR_WRITE 9 +#define SZ_ERROR_PROGRESS 10 +#define SZ_ERROR_FAIL 11 +#define SZ_ERROR_THREAD 12 + +#define SZ_ERROR_ARCHIVE 16 +#define SZ_ERROR_NO_ARCHIVE 17 + +typedef int SRes; + +#ifdef _WIN32 +typedef DWORD WRes; +#else +typedef int WRes; +#endif + +#ifndef RINOK +#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; } +#endif + +typedef unsigned char Byte; +typedef short Int16; +typedef unsigned short UInt16; + +#ifdef _LZMA_UINT32_IS_ULONG +typedef long Int32; +typedef unsigned long UInt32; +#else +typedef int Int32; +typedef unsigned int UInt32; +#endif + +#ifdef _SZ_NO_INT_64 + +/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers. + NOTES: Some code will work incorrectly in that case! */ + +typedef long Int64; +typedef unsigned long UInt64; + +#else + +#if defined(_MSC_VER) || defined(__BORLANDC__) +typedef __int64 Int64; +typedef unsigned __int64 UInt64; +#else +typedef long long int Int64; +typedef unsigned long long int UInt64; +#endif + +#endif + +#ifdef _LZMA_NO_SYSTEM_SIZE_T +typedef UInt32 SizeT; +#else +typedef size_t SizeT; +#endif + +typedef int Bool; +#define True 1 +#define False 0 + + +#ifdef _MSC_VER + +#if _MSC_VER >= 1300 +#define MY_NO_INLINE __declspec(noinline) +#else +#define MY_NO_INLINE +#endif + +#define MY_CDECL __cdecl +#define MY_STD_CALL __stdcall +#define MY_FAST_CALL MY_NO_INLINE __fastcall + +#else + +#define MY_CDECL +#define MY_STD_CALL +#define MY_FAST_CALL + +#endif + + +/* The following interfaces use first parameter as pointer to structure */ + +typedef struct +{ + SRes (*Read)(void *p, void *buf, size_t *size); + /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. + (output(*size) < input(*size)) is allowed */ +} ISeqInStream; + +/* it can return SZ_ERROR_INPUT_EOF */ +SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size); +SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType); +SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf); + +typedef struct +{ + size_t (*Write)(void *p, const void *buf, size_t size); + /* Returns: result - the number of actually written bytes. + (result < size) means error */ +} ISeqOutStream; + +typedef enum +{ + SZ_SEEK_SET = 0, + SZ_SEEK_CUR = 1, + SZ_SEEK_END = 2 +} ESzSeek; + +typedef struct +{ + SRes (*Read)(void *p, void *buf, size_t *size); /* same as ISeqInStream::Read */ + SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); +} ISeekInStream; + +typedef struct +{ + SRes (*Look)(void *p, void **buf, size_t *size); + /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. + (output(*size) > input(*size)) is not allowed + (output(*size) < input(*size)) is allowed */ + SRes (*Skip)(void *p, size_t offset); + /* offset must be <= output(*size) of Look */ + + SRes (*Read)(void *p, void *buf, size_t *size); + /* reads directly (without buffer). It's same as ISeqInStream::Read */ + SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); +} ILookInStream; + +SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size); +SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset); + +/* reads via ILookInStream::Read */ +SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType); +SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size); + +#define LookToRead_BUF_SIZE (1 << 14) + +typedef struct +{ + ILookInStream s; + ISeekInStream *realStream; + size_t pos; + size_t size; + Byte buf[LookToRead_BUF_SIZE]; +} CLookToRead; + +void LookToRead_CreateVTable(CLookToRead *p, int lookahead); +void LookToRead_Init(CLookToRead *p); + +typedef struct +{ + ISeqInStream s; + ILookInStream *realStream; +} CSecToLook; + +void SecToLook_CreateVTable(CSecToLook *p); + +typedef struct +{ + ISeqInStream s; + ILookInStream *realStream; +} CSecToRead; + +void SecToRead_CreateVTable(CSecToRead *p); + +typedef struct +{ + SRes (*Progress)(void *p, UInt64 inSize, UInt64 outSize); + /* Returns: result. (result != SZ_OK) means break. + Value (UInt64)(Int64)-1 for size means unknown value. */ +} ICompressProgress; + +typedef struct +{ + void *(*Alloc)(void *p, size_t size); + void (*Free)(void *p, void *address); /* address can be 0 */ +} ISzAlloc; + +#define IAlloc_Alloc(p, size) (p)->Alloc((p), size) +#define IAlloc_Free(p, a) (p)->Free((p), a) + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/tif_config.h b/plugins/snes9x_gx/portlibs/include/tif_config.h new file mode 100644 index 00000000..2e208913 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/tif_config.h @@ -0,0 +1,260 @@ +/* libtiff/tif_config.h.in. Generated from configure.ac by autoheader. */ + +/* Use the Apple OpenGL framework. */ +///#define HAVE_APPLE_OPENGL_FRAMEWORK 1 + +/* Define to 1 if you have the <assert.h> header file. */ +#define HAVE_ASSERT_H 1 + +/* Define to 1 if you have the <dlfcn.h> header file. */ +///#define HAVE_DLFCN_H 1 + +/* Define to 1 if you have the <fcntl.h> header file. */ +#define HAVE_FCNTL_H 1 + +/* Define to 1 if you have the `floor' function. */ +#define HAVE_FLOOR 1 + +/* Define to 1 if you have the `getopt' function. */ +#define HAVE_GETOPT 1 + +/* Define as 0 or 1 according to the floating point format suported by the + machine */ +#define HAVE_IEEEFP 1 + +/* Define to 1 if the system has the type `int16'. */ +///#define HAVE_INT16 1 + +/* Define to 1 if the system has the type `int32'. */ +///#define HAVE_INT32 1 + +/* Define to 1 if the system has the type `int8'. */ +///#define HAVE_INT8 1 + +/* Define to 1 if you have the <inttypes.h> header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `isascii' function. */ +#define HAVE_ISASCII 1 + +/* Define to 1 if you have the `lfind' function. */ +#define HAVE_LFIND 1 + +/* Define to 1 if you have the `c' library (-lc). */ +///#define HAVE_LIBC 1 + +/* Define to 1 if you have the `m' library (-lm). */ +///#define HAVE_LIBM 1 + +/* Define to 1 if you have the <limits.h> header file. */ +#define HAVE_LIMITS_H 1 + +/* Define to 1 if you have the <malloc.h> header file. */ +#define HAVE_MALLOC_H 1 + +/* Define to 1 if you have the `memmove' function. */ +#define HAVE_MEMMOVE 1 + +/* Define to 1 if you have the <memory.h> header file. */ +///#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `memset' function. */ +#define HAVE_MEMSET 1 + +/* Define to 1 if you have the `mmap' function. */ +///#define HAVE_MMAP 1 + +/* Define to 1 if you have the `pow' function. */ +///#define HAVE_POW 1 + +/* Define if you have POSIX threads libraries and header files. */ +#define HAVE_PTHREAD 1 + +/* Define to 1 if you have the <search.h> header file. */ +#define HAVE_SEARCH_H 1 + +/* Define to 1 if you have the `sqrt' function. */ +///#define HAVE_SQRT 1 + +/* Define to 1 if you have the <stdint.h> header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the <stdlib.h> header file. */ +#define HAVE_STDLIB_H + +/* Define to 1 if you have the `strcasecmp' function. */ +#define HAVE_STRCASECMP 1 + +/* Define to 1 if you have the `strchr' function. */ +#define HAVE_STRCHR 1 + +/* Define to 1 if you have the <strings.h> header file. */ +///#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the <string.h> header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the `strrchr' function. */ +#define HAVE_STRRCHR 1 + +/* Define to 1 if you have the `strstr' function. */ +#define HAVE_STRSTR 1 + +/* Define to 1 if you have the `strtol' function. */ +#define HAVE_STRTOL 1 + +/* Define to 1 if you have the `strtoul' function. */ +#define HAVE_STRTOUL 1 + +/* Define to 1 if you have the <sys/stat.h> header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the <sys/time.h> header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the <sys/types.h> header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the <unistd.h> header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if you have the <windows.h> header file. */ +///#define HAVE_WINDOWS_H 1 + +/* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian + (Intel) */ +#define HOST_BIGENDIAN 1 + +/* Support JPEG compression (requires IJG JPEG library) */ +#define JPEG_SUPPORT 1 + +/* Support LogLuv high dynamic range encoding */ +#define LOGLUV_SUPPORT 1 + +/* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */ +#define HOST_FILLORDER FILLORDER_MSB2LSB + +/* Support LZW algorithm */ +#define LZW_SUPPORT 1 + +/* Support Microsoft Document Imaging format */ +#define MDI_SUPPORT 1 + +/* Support NeXT 2-bit RLE algorithm */ +#define NEXT_SUPPORT 1 + +/* Support Old JPEG compresson (read contrib/ojpeg/README first! Compilation + fails with unpatched IJG JPEG library) */ +///#define OJPEG_SUPPORT 1 + +/* Name of package */ +#define PACKAGE "libtiff" + +/* Define to the address where bug reports for this package should be sent. */ +///#define PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "libtiff 3.8.2, compiled for Wii" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "libtiff 3.8.2" + +/* Define to the one symbol short name of this package. */ +///#define PACKAGE_TARNAME + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "3.8.2" + +/* Support Macintosh PackBits algorithm */ +#define PACKBITS_SUPPORT 1 + +/* Support Pixar log-format algorithm (requires Zlib) */ +#define PIXARLOG_SUPPORT 1 + +/* Support CCITT Group 3 & 4 algorithms */ +//#define CCITT_SUPPORT 1 takes up to 200kb in the DOL + +/* Pick up YCbCr subsampling info from the JPEG data stream to support files + lacking the tag (default enabled). */ +#define CHECK_JPEG_YCBCR_SUBSAMPLING 1 + +/* Support C++ stream API (requires C++ compiler) */ +#define CXX_SUPPORT 1 + +/* Treat extra sample as alpha (default enabled). The RGBA interface will + treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many + packages produce RGBA files but don't mark the alpha properly. */ +#define DEFAULT_EXTRASAMPLE_AS_ALPHA 1 + +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +#define PTHREAD_CREATE_JOINABLE 1 + +/* The size of a `int', as computed by sizeof. */ +#define SIZEOF_INT 4 + +/* The size of a `long', as computed by sizeof. */ +#define SIZEOF_LONG 4 + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Support strip chopping (whether or not to convert single-strip uncompressed + images to mutiple strips of specified size to reduce memory usage) */ +#define STRIPCHOP_DEFAULT TIFF_STRIPCHOP + +/* Default size of the strip in bytes (when strip chopping enabled) */ +#define STRIP_SIZE_DEFAULT 1024*50 + +/* Enable SubIFD tag (330) support */ +#define SUBIFD_SUPPORT 1 + +/* Support ThunderScan 4-bit RLE algorithm */ +#define THUNDER_SUPPORT 1 + +/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */ +#define TIME_WITH_SYS_TIME 1 + +/* Define to 1 if your <sys/time.h> declares `struct tm'. */ +#define TM_IN_SYS_TIME 1 + +/* Version number of package */ +#define VERSION "3.8.2" + +/* Define to 1 if your processor stores words with the most significant byte + first (like Motorola and SPARC, unlike Intel and VAX). */ +#define WORDS_BIGENDIAN 1 + +/* Define to 1 if the X Window System is missing or not being used. */ +///#define X_DISPLAY_MISSING 1 + +/* Support Deflate compression */ +#define ZIP_SUPPORT 1 + +/* Number of bits in a file offset, on hosts where this is settable. */ +#define _FILE_OFFSET_BITS 64 + +/* Define for large files, on AIX-style hosts. */ +#define _LARGE_FILES 1 + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +///#define LT_OBJDIR 1 + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +///#define NO_MINUS_C_MINUS_O 1 + +/* Define to empty if `const' does not conform to ANSI C. */ +///#undef const + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +//#ifndef __cplusplus +///#define __inline__ +//#endif + +/* Define to `long' if <sys/types.h> does not define. */ +///#undef off_t + +/* Define to `unsigned' if <sys/types.h> does not define. */ +///#undef size_t diff --git a/plugins/snes9x_gx/portlibs/include/tiff.h b/plugins/snes9x_gx/portlibs/include/tiff.h new file mode 100644 index 00000000..6330795b --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/tiff.h @@ -0,0 +1,647 @@ +/* $Id: tiff.h,v 1.42 2005/12/23 15:10:45 dron Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#ifndef _TIFF_ +#define _TIFF_ + +#include "tiffconf.h" + +/* + * Tag Image File Format (TIFF) + * + * Based on Rev 6.0 from: + * Developer's Desk + * Aldus Corporation + * 411 First Ave. South + * Suite 200 + * Seattle, WA 98104 + * 206-622-5500 + * + * (http://partners.adobe.com/asn/developer/PDFS/TN/TIFF6.pdf) + * + * For Big TIFF design notes see the following link + * http://gdal.maptools.org/twiki/bin/view/libtiff/BigTIFFDesign + */ +#define TIFF_VERSION 42 +#define TIFF_BIGTIFF_VERSION 43 + +#define TIFF_BIGENDIAN 0x4d4d +#define TIFF_LITTLEENDIAN 0x4949 +#define MDI_LITTLEENDIAN 0x5045 +#define MDI_BIGENDIAN 0x4550 +/* + * Intrinsic data types required by the file format: + * + * 8-bit quantities int8/uint8 + * 16-bit quantities int16/uint16 + * 32-bit quantities int32/uint32 + * strings unsigned char* + */ + +#ifndef HAVE_INT8 +typedef signed char int8; /* NB: non-ANSI compilers may not grok */ +#endif +typedef unsigned char uint8; +#ifndef HAVE_INT16 +typedef short int16; +#endif +typedef unsigned short uint16; /* sizeof (uint16) must == 2 */ +#if SIZEOF_INT == 4 +#ifndef HAVE_INT32 +typedef int int32; +#endif +typedef unsigned int uint32; /* sizeof (uint32) must == 4 */ +#elif SIZEOF_LONG == 4 +#ifndef HAVE_INT32 +typedef long int32; +#endif +typedef unsigned long uint32; /* sizeof (uint32) must == 4 */ +#endif + +/* For TIFFReassignTagToIgnore */ +enum TIFFIgnoreSense /* IGNORE tag table */ +{ + TIS_STORE, + TIS_EXTRACT, + TIS_EMPTY +}; + +/* + * TIFF header. + */ +typedef struct { + uint16 tiff_magic; /* magic number (defines byte order) */ +#define TIFF_MAGIC_SIZE 2 + uint16 tiff_version; /* TIFF version number */ +#define TIFF_VERSION_SIZE 2 + uint32 tiff_diroff; /* byte offset to first directory */ +#define TIFF_DIROFFSET_SIZE 4 +} TIFFHeader; + + +/* + * TIFF Image File Directories are comprised of a table of field + * descriptors of the form shown below. The table is sorted in + * ascending order by tag. The values associated with each entry are + * disjoint and may appear anywhere in the file (so long as they are + * placed on a word boundary). + * + * If the value is 4 bytes or less, then it is placed in the offset + * field to save space. If the value is less than 4 bytes, it is + * left-justified in the offset field. + */ +typedef struct { + uint16 tdir_tag; /* see below */ + uint16 tdir_type; /* data type; see below */ + uint32 tdir_count; /* number of items; length in spec */ + uint32 tdir_offset; /* byte offset to field data */ +} TIFFDirEntry; + +/* + * NB: In the comments below, + * - items marked with a + are obsoleted by revision 5.0, + * - items marked with a ! are introduced in revision 6.0. + * - items marked with a % are introduced post revision 6.0. + * - items marked with a $ are obsoleted by revision 6.0. + * - items marked with a & are introduced by Adobe DNG specification. + */ + +/* + * Tag data type information. + * + * Note: RATIONALs are the ratio of two 32-bit integer values. + */ +typedef enum { + TIFF_NOTYPE = 0, /* placeholder */ + TIFF_BYTE = 1, /* 8-bit unsigned integer */ + TIFF_ASCII = 2, /* 8-bit bytes w/ last byte null */ + TIFF_SHORT = 3, /* 16-bit unsigned integer */ + TIFF_LONG = 4, /* 32-bit unsigned integer */ + TIFF_RATIONAL = 5, /* 64-bit unsigned fraction */ + TIFF_SBYTE = 6, /* !8-bit signed integer */ + TIFF_UNDEFINED = 7, /* !8-bit untyped data */ + TIFF_SSHORT = 8, /* !16-bit signed integer */ + TIFF_SLONG = 9, /* !32-bit signed integer */ + TIFF_SRATIONAL = 10, /* !64-bit signed fraction */ + TIFF_FLOAT = 11, /* !32-bit IEEE floating point */ + TIFF_DOUBLE = 12, /* !64-bit IEEE floating point */ + TIFF_IFD = 13 /* %32-bit unsigned integer (offset) */ +} TIFFDataType; + +/* + * TIFF Tag Definitions. + */ +#define TIFFTAG_SUBFILETYPE 254 /* subfile data descriptor */ +#define FILETYPE_REDUCEDIMAGE 0x1 /* reduced resolution version */ +#define FILETYPE_PAGE 0x2 /* one page of many */ +#define FILETYPE_MASK 0x4 /* transparency mask */ +#define TIFFTAG_OSUBFILETYPE 255 /* +kind of data in subfile */ +#define OFILETYPE_IMAGE 1 /* full resolution image data */ +#define OFILETYPE_REDUCEDIMAGE 2 /* reduced size image data */ +#define OFILETYPE_PAGE 3 /* one page of many */ +#define TIFFTAG_IMAGEWIDTH 256 /* image width in pixels */ +#define TIFFTAG_IMAGELENGTH 257 /* image height in pixels */ +#define TIFFTAG_BITSPERSAMPLE 258 /* bits per channel (sample) */ +#define TIFFTAG_COMPRESSION 259 /* data compression technique */ +#define COMPRESSION_NONE 1 /* dump mode */ +#define COMPRESSION_CCITTRLE 2 /* CCITT modified Huffman RLE */ +#define COMPRESSION_CCITTFAX3 3 /* CCITT Group 3 fax encoding */ +#define COMPRESSION_CCITT_T4 3 /* CCITT T.4 (TIFF 6 name) */ +#define COMPRESSION_CCITTFAX4 4 /* CCITT Group 4 fax encoding */ +#define COMPRESSION_CCITT_T6 4 /* CCITT T.6 (TIFF 6 name) */ +#define COMPRESSION_LZW 5 /* Lempel-Ziv & Welch */ +#define COMPRESSION_OJPEG 6 /* !6.0 JPEG */ +#define COMPRESSION_JPEG 7 /* %JPEG DCT compression */ +#define COMPRESSION_NEXT 32766 /* NeXT 2-bit RLE */ +#define COMPRESSION_CCITTRLEW 32771 /* #1 w/ word alignment */ +#define COMPRESSION_PACKBITS 32773 /* Macintosh RLE */ +#define COMPRESSION_THUNDERSCAN 32809 /* ThunderScan RLE */ +/* codes 32895-32898 are reserved for ANSI IT8 TIFF/IT <dkelly@apago.com) */ +#define COMPRESSION_IT8CTPAD 32895 /* IT8 CT w/padding */ +#define COMPRESSION_IT8LW 32896 /* IT8 Linework RLE */ +#define COMPRESSION_IT8MP 32897 /* IT8 Monochrome picture */ +#define COMPRESSION_IT8BL 32898 /* IT8 Binary line art */ +/* compression codes 32908-32911 are reserved for Pixar */ +#define COMPRESSION_PIXARFILM 32908 /* Pixar companded 10bit LZW */ +#define COMPRESSION_PIXARLOG 32909 /* Pixar companded 11bit ZIP */ +#define COMPRESSION_DEFLATE 32946 /* Deflate compression */ +#define COMPRESSION_ADOBE_DEFLATE 8 /* Deflate compression, + as recognized by Adobe */ +/* compression code 32947 is reserved for Oceana Matrix <dev@oceana.com> */ +#define COMPRESSION_DCS 32947 /* Kodak DCS encoding */ +#define COMPRESSION_JBIG 34661 /* ISO JBIG */ +#define COMPRESSION_SGILOG 34676 /* SGI Log Luminance RLE */ +#define COMPRESSION_SGILOG24 34677 /* SGI Log 24-bit packed */ +#define COMPRESSION_JP2000 34712 /* Leadtools JPEG2000 */ +#define TIFFTAG_PHOTOMETRIC 262 /* photometric interpretation */ +#define PHOTOMETRIC_MINISWHITE 0 /* min value is white */ +#define PHOTOMETRIC_MINISBLACK 1 /* min value is black */ +#define PHOTOMETRIC_RGB 2 /* RGB color model */ +#define PHOTOMETRIC_PALETTE 3 /* color map indexed */ +#define PHOTOMETRIC_MASK 4 /* $holdout mask */ +#define PHOTOMETRIC_SEPARATED 5 /* !color separations */ +#define PHOTOMETRIC_YCBCR 6 /* !CCIR 601 */ +#define PHOTOMETRIC_CIELAB 8 /* !1976 CIE L*a*b* */ +#define PHOTOMETRIC_ICCLAB 9 /* ICC L*a*b* [Adobe TIFF Technote 4] */ +#define PHOTOMETRIC_ITULAB 10 /* ITU L*a*b* */ +#define PHOTOMETRIC_LOGL 32844 /* CIE Log2(L) */ +#define PHOTOMETRIC_LOGLUV 32845 /* CIE Log2(L) (u',v') */ +#define TIFFTAG_THRESHHOLDING 263 /* +thresholding used on data */ +#define THRESHHOLD_BILEVEL 1 /* b&w art scan */ +#define THRESHHOLD_HALFTONE 2 /* or dithered scan */ +#define THRESHHOLD_ERRORDIFFUSE 3 /* usually floyd-steinberg */ +#define TIFFTAG_CELLWIDTH 264 /* +dithering matrix width */ +#define TIFFTAG_CELLLENGTH 265 /* +dithering matrix height */ +#define TIFFTAG_FILLORDER 266 /* data order within a byte */ +#define FILLORDER_MSB2LSB 1 /* most significant -> least */ +#define FILLORDER_LSB2MSB 2 /* least significant -> most */ +#define TIFFTAG_DOCUMENTNAME 269 /* name of doc. image is from */ +#define TIFFTAG_IMAGEDESCRIPTION 270 /* info about image */ +#define TIFFTAG_MAKE 271 /* scanner manufacturer name */ +#define TIFFTAG_MODEL 272 /* scanner model name/number */ +#define TIFFTAG_STRIPOFFSETS 273 /* offsets to data strips */ +#define TIFFTAG_ORIENTATION 274 /* +image orientation */ +#define ORIENTATION_TOPLEFT 1 /* row 0 top, col 0 lhs */ +#define ORIENTATION_TOPRIGHT 2 /* row 0 top, col 0 rhs */ +#define ORIENTATION_BOTRIGHT 3 /* row 0 bottom, col 0 rhs */ +#define ORIENTATION_BOTLEFT 4 /* row 0 bottom, col 0 lhs */ +#define ORIENTATION_LEFTTOP 5 /* row 0 lhs, col 0 top */ +#define ORIENTATION_RIGHTTOP 6 /* row 0 rhs, col 0 top */ +#define ORIENTATION_RIGHTBOT 7 /* row 0 rhs, col 0 bottom */ +#define ORIENTATION_LEFTBOT 8 /* row 0 lhs, col 0 bottom */ +#define TIFFTAG_SAMPLESPERPIXEL 277 /* samples per pixel */ +#define TIFFTAG_ROWSPERSTRIP 278 /* rows per strip of data */ +#define TIFFTAG_STRIPBYTECOUNTS 279 /* bytes counts for strips */ +#define TIFFTAG_MINSAMPLEVALUE 280 /* +minimum sample value */ +#define TIFFTAG_MAXSAMPLEVALUE 281 /* +maximum sample value */ +#define TIFFTAG_XRESOLUTION 282 /* pixels/resolution in x */ +#define TIFFTAG_YRESOLUTION 283 /* pixels/resolution in y */ +#define TIFFTAG_PLANARCONFIG 284 /* storage organization */ +#define PLANARCONFIG_CONTIG 1 /* single image plane */ +#define PLANARCONFIG_SEPARATE 2 /* separate planes of data */ +#define TIFFTAG_PAGENAME 285 /* page name image is from */ +#define TIFFTAG_XPOSITION 286 /* x page offset of image lhs */ +#define TIFFTAG_YPOSITION 287 /* y page offset of image lhs */ +#define TIFFTAG_FREEOFFSETS 288 /* +byte offset to free block */ +#define TIFFTAG_FREEBYTECOUNTS 289 /* +sizes of free blocks */ +#define TIFFTAG_GRAYRESPONSEUNIT 290 /* $gray scale curve accuracy */ +#define GRAYRESPONSEUNIT_10S 1 /* tenths of a unit */ +#define GRAYRESPONSEUNIT_100S 2 /* hundredths of a unit */ +#define GRAYRESPONSEUNIT_1000S 3 /* thousandths of a unit */ +#define GRAYRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */ +#define GRAYRESPONSEUNIT_100000S 5 /* hundred-thousandths */ +#define TIFFTAG_GRAYRESPONSECURVE 291 /* $gray scale response curve */ +#define TIFFTAG_GROUP3OPTIONS 292 /* 32 flag bits */ +#define TIFFTAG_T4OPTIONS 292 /* TIFF 6.0 proper name alias */ +#define GROUP3OPT_2DENCODING 0x1 /* 2-dimensional coding */ +#define GROUP3OPT_UNCOMPRESSED 0x2 /* data not compressed */ +#define GROUP3OPT_FILLBITS 0x4 /* fill to byte boundary */ +#define TIFFTAG_GROUP4OPTIONS 293 /* 32 flag bits */ +#define TIFFTAG_T6OPTIONS 293 /* TIFF 6.0 proper name */ +#define GROUP4OPT_UNCOMPRESSED 0x2 /* data not compressed */ +#define TIFFTAG_RESOLUTIONUNIT 296 /* units of resolutions */ +#define RESUNIT_NONE 1 /* no meaningful units */ +#define RESUNIT_INCH 2 /* english */ +#define RESUNIT_CENTIMETER 3 /* metric */ +#define TIFFTAG_PAGENUMBER 297 /* page numbers of multi-page */ +#define TIFFTAG_COLORRESPONSEUNIT 300 /* $color curve accuracy */ +#define COLORRESPONSEUNIT_10S 1 /* tenths of a unit */ +#define COLORRESPONSEUNIT_100S 2 /* hundredths of a unit */ +#define COLORRESPONSEUNIT_1000S 3 /* thousandths of a unit */ +#define COLORRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */ +#define COLORRESPONSEUNIT_100000S 5 /* hundred-thousandths */ +#define TIFFTAG_TRANSFERFUNCTION 301 /* !colorimetry info */ +#define TIFFTAG_SOFTWARE 305 /* name & release */ +#define TIFFTAG_DATETIME 306 /* creation date and time */ +#define TIFFTAG_ARTIST 315 /* creator of image */ +#define TIFFTAG_HOSTCOMPUTER 316 /* machine where created */ +#define TIFFTAG_PREDICTOR 317 /* prediction scheme w/ LZW */ +#define PREDICTOR_NONE 1 /* no prediction scheme used */ +#define PREDICTOR_HORIZONTAL 2 /* horizontal differencing */ +#define PREDICTOR_FLOATINGPOINT 3 /* floating point predictor */ +#define TIFFTAG_WHITEPOINT 318 /* image white point */ +#define TIFFTAG_PRIMARYCHROMATICITIES 319 /* !primary chromaticities */ +#define TIFFTAG_COLORMAP 320 /* RGB map for pallette image */ +#define TIFFTAG_HALFTONEHINTS 321 /* !highlight+shadow info */ +#define TIFFTAG_TILEWIDTH 322 /* !tile width in pixels */ +#define TIFFTAG_TILELENGTH 323 /* !tile height in pixels */ +#define TIFFTAG_TILEOFFSETS 324 /* !offsets to data tiles */ +#define TIFFTAG_TILEBYTECOUNTS 325 /* !byte counts for tiles */ +#define TIFFTAG_BADFAXLINES 326 /* lines w/ wrong pixel count */ +#define TIFFTAG_CLEANFAXDATA 327 /* regenerated line info */ +#define CLEANFAXDATA_CLEAN 0 /* no errors detected */ +#define CLEANFAXDATA_REGENERATED 1 /* receiver regenerated lines */ +#define CLEANFAXDATA_UNCLEAN 2 /* uncorrected errors exist */ +#define TIFFTAG_CONSECUTIVEBADFAXLINES 328 /* max consecutive bad lines */ +#define TIFFTAG_SUBIFD 330 /* subimage descriptors */ +#define TIFFTAG_INKSET 332 /* !inks in separated image */ +#define INKSET_CMYK 1 /* !cyan-magenta-yellow-black color */ +#define INKSET_MULTIINK 2 /* !multi-ink or hi-fi color */ +#define TIFFTAG_INKNAMES 333 /* !ascii names of inks */ +#define TIFFTAG_NUMBEROFINKS 334 /* !number of inks */ +#define TIFFTAG_DOTRANGE 336 /* !0% and 100% dot codes */ +#define TIFFTAG_TARGETPRINTER 337 /* !separation target */ +#define TIFFTAG_EXTRASAMPLES 338 /* !info about extra samples */ +#define EXTRASAMPLE_UNSPECIFIED 0 /* !unspecified data */ +#define EXTRASAMPLE_ASSOCALPHA 1 /* !associated alpha data */ +#define EXTRASAMPLE_UNASSALPHA 2 /* !unassociated alpha data */ +#define TIFFTAG_SAMPLEFORMAT 339 /* !data sample format */ +#define SAMPLEFORMAT_UINT 1 /* !unsigned integer data */ +#define SAMPLEFORMAT_INT 2 /* !signed integer data */ +#define SAMPLEFORMAT_IEEEFP 3 /* !IEEE floating point data */ +#define SAMPLEFORMAT_VOID 4 /* !untyped data */ +#define SAMPLEFORMAT_COMPLEXINT 5 /* !complex signed int */ +#define SAMPLEFORMAT_COMPLEXIEEEFP 6 /* !complex ieee floating */ +#define TIFFTAG_SMINSAMPLEVALUE 340 /* !variable MinSampleValue */ +#define TIFFTAG_SMAXSAMPLEVALUE 341 /* !variable MaxSampleValue */ +#define TIFFTAG_CLIPPATH 343 /* %ClipPath + [Adobe TIFF technote 2] */ +#define TIFFTAG_XCLIPPATHUNITS 344 /* %XClipPathUnits + [Adobe TIFF technote 2] */ +#define TIFFTAG_YCLIPPATHUNITS 345 /* %YClipPathUnits + [Adobe TIFF technote 2] */ +#define TIFFTAG_INDEXED 346 /* %Indexed + [Adobe TIFF Technote 3] */ +#define TIFFTAG_JPEGTABLES 347 /* %JPEG table stream */ +#define TIFFTAG_OPIPROXY 351 /* %OPI Proxy [Adobe TIFF technote] */ +/* + * Tags 512-521 are obsoleted by Technical Note #2 which specifies a + * revised JPEG-in-TIFF scheme. + */ +#define TIFFTAG_JPEGPROC 512 /* !JPEG processing algorithm */ +#define JPEGPROC_BASELINE 1 /* !baseline sequential */ +#define JPEGPROC_LOSSLESS 14 /* !Huffman coded lossless */ +#define TIFFTAG_JPEGIFOFFSET 513 /* !pointer to SOI marker */ +#define TIFFTAG_JPEGIFBYTECOUNT 514 /* !JFIF stream length */ +#define TIFFTAG_JPEGRESTARTINTERVAL 515 /* !restart interval length */ +#define TIFFTAG_JPEGLOSSLESSPREDICTORS 517 /* !lossless proc predictor */ +#define TIFFTAG_JPEGPOINTTRANSFORM 518 /* !lossless point transform */ +#define TIFFTAG_JPEGQTABLES 519 /* !Q matrice offsets */ +#define TIFFTAG_JPEGDCTABLES 520 /* !DCT table offsets */ +#define TIFFTAG_JPEGACTABLES 521 /* !AC coefficient offsets */ +#define TIFFTAG_YCBCRCOEFFICIENTS 529 /* !RGB -> YCbCr transform */ +#define TIFFTAG_YCBCRSUBSAMPLING 530 /* !YCbCr subsampling factors */ +#define TIFFTAG_YCBCRPOSITIONING 531 /* !subsample positioning */ +#define YCBCRPOSITION_CENTERED 1 /* !as in PostScript Level 2 */ +#define YCBCRPOSITION_COSITED 2 /* !as in CCIR 601-1 */ +#define TIFFTAG_REFERENCEBLACKWHITE 532 /* !colorimetry info */ +#define TIFFTAG_XMLPACKET 700 /* %XML packet + [Adobe XMP Specification, + January 2004 */ +#define TIFFTAG_OPIIMAGEID 32781 /* %OPI ImageID + [Adobe TIFF technote] */ +/* tags 32952-32956 are private tags registered to Island Graphics */ +#define TIFFTAG_REFPTS 32953 /* image reference points */ +#define TIFFTAG_REGIONTACKPOINT 32954 /* region-xform tack point */ +#define TIFFTAG_REGIONWARPCORNERS 32955 /* warp quadrilateral */ +#define TIFFTAG_REGIONAFFINE 32956 /* affine transformation mat */ +/* tags 32995-32999 are private tags registered to SGI */ +#define TIFFTAG_MATTEING 32995 /* $use ExtraSamples */ +#define TIFFTAG_DATATYPE 32996 /* $use SampleFormat */ +#define TIFFTAG_IMAGEDEPTH 32997 /* z depth of image */ +#define TIFFTAG_TILEDEPTH 32998 /* z depth/data tile */ +/* tags 33300-33309 are private tags registered to Pixar */ +/* + * TIFFTAG_PIXAR_IMAGEFULLWIDTH and TIFFTAG_PIXAR_IMAGEFULLLENGTH + * are set when an image has been cropped out of a larger image. + * They reflect the size of the original uncropped image. + * The TIFFTAG_XPOSITION and TIFFTAG_YPOSITION can be used + * to determine the position of the smaller image in the larger one. + */ +#define TIFFTAG_PIXAR_IMAGEFULLWIDTH 33300 /* full image size in x */ +#define TIFFTAG_PIXAR_IMAGEFULLLENGTH 33301 /* full image size in y */ + /* Tags 33302-33306 are used to identify special image modes and data + * used by Pixar's texture formats. + */ +#define TIFFTAG_PIXAR_TEXTUREFORMAT 33302 /* texture map format */ +#define TIFFTAG_PIXAR_WRAPMODES 33303 /* s & t wrap modes */ +#define TIFFTAG_PIXAR_FOVCOT 33304 /* cotan(fov) for env. maps */ +#define TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN 33305 +#define TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA 33306 +/* tag 33405 is a private tag registered to Eastman Kodak */ +#define TIFFTAG_WRITERSERIALNUMBER 33405 /* device serial number */ +/* tag 33432 is listed in the 6.0 spec w/ unknown ownership */ +#define TIFFTAG_COPYRIGHT 33432 /* copyright string */ +/* IPTC TAG from RichTIFF specifications */ +#define TIFFTAG_RICHTIFFIPTC 33723 +/* 34016-34029 are reserved for ANSI IT8 TIFF/IT <dkelly@apago.com) */ +#define TIFFTAG_IT8SITE 34016 /* site name */ +#define TIFFTAG_IT8COLORSEQUENCE 34017 /* color seq. [RGB,CMYK,etc] */ +#define TIFFTAG_IT8HEADER 34018 /* DDES Header */ +#define TIFFTAG_IT8RASTERPADDING 34019 /* raster scanline padding */ +#define TIFFTAG_IT8BITSPERRUNLENGTH 34020 /* # of bits in short run */ +#define TIFFTAG_IT8BITSPEREXTENDEDRUNLENGTH 34021/* # of bits in long run */ +#define TIFFTAG_IT8COLORTABLE 34022 /* LW colortable */ +#define TIFFTAG_IT8IMAGECOLORINDICATOR 34023 /* BP/BL image color switch */ +#define TIFFTAG_IT8BKGCOLORINDICATOR 34024 /* BP/BL bg color switch */ +#define TIFFTAG_IT8IMAGECOLORVALUE 34025 /* BP/BL image color value */ +#define TIFFTAG_IT8BKGCOLORVALUE 34026 /* BP/BL bg color value */ +#define TIFFTAG_IT8PIXELINTENSITYRANGE 34027 /* MP pixel intensity value */ +#define TIFFTAG_IT8TRANSPARENCYINDICATOR 34028 /* HC transparency switch */ +#define TIFFTAG_IT8COLORCHARACTERIZATION 34029 /* color character. table */ +#define TIFFTAG_IT8HCUSAGE 34030 /* HC usage indicator */ +#define TIFFTAG_IT8TRAPINDICATOR 34031 /* Trapping indicator + (untrapped=0, trapped=1) */ +#define TIFFTAG_IT8CMYKEQUIVALENT 34032 /* CMYK color equivalents */ +/* tags 34232-34236 are private tags registered to Texas Instruments */ +#define TIFFTAG_FRAMECOUNT 34232 /* Sequence Frame Count */ +/* tag 34377 is private tag registered to Adobe for PhotoShop */ +#define TIFFTAG_PHOTOSHOP 34377 +/* tags 34665, 34853 and 40965 are documented in EXIF specification */ +#define TIFFTAG_EXIFIFD 34665 /* Pointer to EXIF private directory */ +/* tag 34750 is a private tag registered to Adobe? */ +#define TIFFTAG_ICCPROFILE 34675 /* ICC profile data */ +/* tag 34750 is a private tag registered to Pixel Magic */ +#define TIFFTAG_JBIGOPTIONS 34750 /* JBIG options */ +#define TIFFTAG_GPSIFD 34853 /* Pointer to GPS private directory */ +/* tags 34908-34914 are private tags registered to SGI */ +#define TIFFTAG_FAXRECVPARAMS 34908 /* encoded Class 2 ses. parms */ +#define TIFFTAG_FAXSUBADDRESS 34909 /* received SubAddr string */ +#define TIFFTAG_FAXRECVTIME 34910 /* receive time (secs) */ +#define TIFFTAG_FAXDCS 34911 /* encoded fax ses. params, Table 2/T.30 */ +/* tags 37439-37443 are registered to SGI <gregl@sgi.com> */ +#define TIFFTAG_STONITS 37439 /* Sample value to Nits */ +/* tag 34929 is a private tag registered to FedEx */ +#define TIFFTAG_FEDEX_EDR 34929 /* unknown use */ +#define TIFFTAG_INTEROPERABILITYIFD 40965 /* Pointer to Interoperability private directory */ +/* Adobe Digital Negative (DNG) format tags */ +#define TIFFTAG_DNGVERSION 50706 /* &DNG version number */ +#define TIFFTAG_DNGBACKWARDVERSION 50707 /* &DNG compatibility version */ +#define TIFFTAG_UNIQUECAMERAMODEL 50708 /* &name for the camera model */ +#define TIFFTAG_LOCALIZEDCAMERAMODEL 50709 /* &localized camera model + name */ +#define TIFFTAG_CFAPLANECOLOR 50710 /* &CFAPattern->LinearRaw space + mapping */ +#define TIFFTAG_CFALAYOUT 50711 /* &spatial layout of the CFA */ +#define TIFFTAG_LINEARIZATIONTABLE 50712 /* &lookup table description */ +#define TIFFTAG_BLACKLEVELREPEATDIM 50713 /* &repeat pattern size for + the BlackLevel tag */ +#define TIFFTAG_BLACKLEVEL 50714 /* &zero light encoding level */ +#define TIFFTAG_BLACKLEVELDELTAH 50715 /* &zero light encoding level + differences (columns) */ +#define TIFFTAG_BLACKLEVELDELTAV 50716 /* &zero light encoding level + differences (rows) */ +#define TIFFTAG_WHITELEVEL 50717 /* &fully saturated encoding + level */ +#define TIFFTAG_DEFAULTSCALE 50718 /* &default scale factors */ +#define TIFFTAG_DEFAULTCROPORIGIN 50719 /* &origin of the final image + area */ +#define TIFFTAG_DEFAULTCROPSIZE 50720 /* &size of the final image + area */ +#define TIFFTAG_COLORMATRIX1 50721 /* &XYZ->reference color space + transformation matrix 1 */ +#define TIFFTAG_COLORMATRIX2 50722 /* &XYZ->reference color space + transformation matrix 2 */ +#define TIFFTAG_CAMERACALIBRATION1 50723 /* &calibration matrix 1 */ +#define TIFFTAG_CAMERACALIBRATION2 50724 /* &calibration matrix 2 */ +#define TIFFTAG_REDUCTIONMATRIX1 50725 /* &dimensionality reduction + matrix 1 */ +#define TIFFTAG_REDUCTIONMATRIX2 50726 /* &dimensionality reduction + matrix 2 */ +#define TIFFTAG_ANALOGBALANCE 50727 /* &gain applied the stored raw + values*/ +#define TIFFTAG_ASSHOTNEUTRAL 50728 /* &selected white balance in + linear reference space */ +#define TIFFTAG_ASSHOTWHITEXY 50729 /* &selected white balance in + x-y chromaticity + coordinates */ +#define TIFFTAG_BASELINEEXPOSURE 50730 /* &how much to move the zero + point */ +#define TIFFTAG_BASELINENOISE 50731 /* &relative noise level */ +#define TIFFTAG_BASELINESHARPNESS 50732 /* &relative amount of + sharpening */ +#define TIFFTAG_BAYERGREENSPLIT 50733 /* &how closely the values of + the green pixels in the + blue/green rows track the + values of the green pixels + in the red/green rows */ +#define TIFFTAG_LINEARRESPONSELIMIT 50734 /* &non-linear encoding range */ +#define TIFFTAG_CAMERASERIALNUMBER 50735 /* &camera's serial number */ +#define TIFFTAG_LENSINFO 50736 /* info about the lens */ +#define TIFFTAG_CHROMABLURRADIUS 50737 /* &chroma blur radius */ +#define TIFFTAG_ANTIALIASSTRENGTH 50738 /* &relative strength of the + camera's anti-alias filter */ +#define TIFFTAG_SHADOWSCALE 50739 /* &used by Adobe Camera Raw */ +#define TIFFTAG_DNGPRIVATEDATA 50740 /* &manufacturer's private data */ +#define TIFFTAG_MAKERNOTESAFETY 50741 /* &whether the EXIF MakerNote + tag is safe to preserve + along with the rest of the + EXIF data */ +#define TIFFTAG_CALIBRATIONILLUMINANT1 50778 /* &illuminant 1 */ +#define TIFFTAG_CALIBRATIONILLUMINANT2 50779 /* &illuminant 2 */ +#define TIFFTAG_BESTQUALITYSCALE 50780 /* &best quality multiplier */ +#define TIFFTAG_RAWDATAUNIQUEID 50781 /* &unique identifier for + the raw image data */ +#define TIFFTAG_ORIGINALRAWFILENAME 50827 /* &file name of the original + raw file */ +#define TIFFTAG_ORIGINALRAWFILEDATA 50828 /* &contents of the original + raw file */ +#define TIFFTAG_ACTIVEAREA 50829 /* &active (non-masked) pixels + of the sensor */ +#define TIFFTAG_MASKEDAREAS 50830 /* &list of coordinates + of fully masked pixels */ +#define TIFFTAG_ASSHOTICCPROFILE 50831 /* &these two tags used to */ +#define TIFFTAG_ASSHOTPREPROFILEMATRIX 50832 /* map cameras's color space + into ICC profile space */ +#define TIFFTAG_CURRENTICCPROFILE 50833 /* & */ +#define TIFFTAG_CURRENTPREPROFILEMATRIX 50834 /* & */ +/* tag 65535 is an undefined tag used by Eastman Kodak */ +#define TIFFTAG_DCSHUESHIFTVALUES 65535 /* hue shift correction data */ + +/* + * The following are ``pseudo tags'' that can be used to control + * codec-specific functionality. These tags are not written to file. + * Note that these values start at 0xffff+1 so that they'll never + * collide with Aldus-assigned tags. + * + * If you want your private pseudo tags ``registered'' (i.e. added to + * this file), please post a bug report via the tracking system at + * http://www.remotesensing.org/libtiff/bugs.html with the appropriate + * C definitions to add. + */ +#define TIFFTAG_FAXMODE 65536 /* Group 3/4 format control */ +#define FAXMODE_CLASSIC 0x0000 /* default, include RTC */ +#define FAXMODE_NORTC 0x0001 /* no RTC at end of data */ +#define FAXMODE_NOEOL 0x0002 /* no EOL code at end of row */ +#define FAXMODE_BYTEALIGN 0x0004 /* byte align row */ +#define FAXMODE_WORDALIGN 0x0008 /* word align row */ +#define FAXMODE_CLASSF FAXMODE_NORTC /* TIFF Class F */ +#define TIFFTAG_JPEGQUALITY 65537 /* Compression quality level */ +/* Note: quality level is on the IJG 0-100 scale. Default value is 75 */ +#define TIFFTAG_JPEGCOLORMODE 65538 /* Auto RGB<=>YCbCr convert? */ +#define JPEGCOLORMODE_RAW 0x0000 /* no conversion (default) */ +#define JPEGCOLORMODE_RGB 0x0001 /* do auto conversion */ +#define TIFFTAG_JPEGTABLESMODE 65539 /* What to put in JPEGTables */ +#define JPEGTABLESMODE_QUANT 0x0001 /* include quantization tbls */ +#define JPEGTABLESMODE_HUFF 0x0002 /* include Huffman tbls */ +/* Note: default is JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF */ +#define TIFFTAG_FAXFILLFUNC 65540 /* G3/G4 fill function */ +#define TIFFTAG_PIXARLOGDATAFMT 65549 /* PixarLogCodec I/O data sz */ +#define PIXARLOGDATAFMT_8BIT 0 /* regular u_char samples */ +#define PIXARLOGDATAFMT_8BITABGR 1 /* ABGR-order u_chars */ +#define PIXARLOGDATAFMT_11BITLOG 2 /* 11-bit log-encoded (raw) */ +#define PIXARLOGDATAFMT_12BITPICIO 3 /* as per PICIO (1.0==2048) */ +#define PIXARLOGDATAFMT_16BIT 4 /* signed short samples */ +#define PIXARLOGDATAFMT_FLOAT 5 /* IEEE float samples */ +/* 65550-65556 are allocated to Oceana Matrix <dev@oceana.com> */ +#define TIFFTAG_DCSIMAGERTYPE 65550 /* imager model & filter */ +#define DCSIMAGERMODEL_M3 0 /* M3 chip (1280 x 1024) */ +#define DCSIMAGERMODEL_M5 1 /* M5 chip (1536 x 1024) */ +#define DCSIMAGERMODEL_M6 2 /* M6 chip (3072 x 2048) */ +#define DCSIMAGERFILTER_IR 0 /* infrared filter */ +#define DCSIMAGERFILTER_MONO 1 /* monochrome filter */ +#define DCSIMAGERFILTER_CFA 2 /* color filter array */ +#define DCSIMAGERFILTER_OTHER 3 /* other filter */ +#define TIFFTAG_DCSINTERPMODE 65551 /* interpolation mode */ +#define DCSINTERPMODE_NORMAL 0x0 /* whole image, default */ +#define DCSINTERPMODE_PREVIEW 0x1 /* preview of image (384x256) */ +#define TIFFTAG_DCSBALANCEARRAY 65552 /* color balance values */ +#define TIFFTAG_DCSCORRECTMATRIX 65553 /* color correction values */ +#define TIFFTAG_DCSGAMMA 65554 /* gamma value */ +#define TIFFTAG_DCSTOESHOULDERPTS 65555 /* toe & shoulder points */ +#define TIFFTAG_DCSCALIBRATIONFD 65556 /* calibration file desc */ +/* Note: quality level is on the ZLIB 1-9 scale. Default value is -1 */ +#define TIFFTAG_ZIPQUALITY 65557 /* compression quality level */ +#define TIFFTAG_PIXARLOGQUALITY 65558 /* PixarLog uses same scale */ +/* 65559 is allocated to Oceana Matrix <dev@oceana.com> */ +#define TIFFTAG_DCSCLIPRECTANGLE 65559 /* area of image to acquire */ +#define TIFFTAG_SGILOGDATAFMT 65560 /* SGILog user data format */ +#define SGILOGDATAFMT_FLOAT 0 /* IEEE float samples */ +#define SGILOGDATAFMT_16BIT 1 /* 16-bit samples */ +#define SGILOGDATAFMT_RAW 2 /* uninterpreted data */ +#define SGILOGDATAFMT_8BIT 3 /* 8-bit RGB monitor values */ +#define TIFFTAG_SGILOGENCODE 65561 /* SGILog data encoding control*/ +#define SGILOGENCODE_NODITHER 0 /* do not dither encoded values*/ +#define SGILOGENCODE_RANDITHER 1 /* randomly dither encd values */ + +/* + * EXIF tags + */ +#define EXIFTAG_EXPOSURETIME 33434 /* Exposure time */ +#define EXIFTAG_FNUMBER 33437 /* F number */ +#define EXIFTAG_EXPOSUREPROGRAM 34850 /* Exposure program */ +#define EXIFTAG_SPECTRALSENSITIVITY 34852 /* Spectral sensitivity */ +#define EXIFTAG_ISOSPEEDRATINGS 34855 /* ISO speed rating */ +#define EXIFTAG_OECF 34856 /* Optoelectric conversion + factor */ +#define EXIFTAG_EXIFVERSION 36864 /* Exif version */ +#define EXIFTAG_DATETIMEORIGINAL 36867 /* Date and time of original + data generation */ +#define EXIFTAG_DATETIMEDIGITIZED 36868 /* Date and time of digital + data generation */ +#define EXIFTAG_COMPONENTSCONFIGURATION 37121 /* Meaning of each component */ +#define EXIFTAG_COMPRESSEDBITSPERPIXEL 37122 /* Image compression mode */ +#define EXIFTAG_SHUTTERSPEEDVALUE 37377 /* Shutter speed */ +#define EXIFTAG_APERTUREVALUE 37378 /* Aperture */ +#define EXIFTAG_BRIGHTNESSVALUE 37379 /* Brightness */ +#define EXIFTAG_EXPOSUREBIASVALUE 37380 /* Exposure bias */ +#define EXIFTAG_MAXAPERTUREVALUE 37381 /* Maximum lens aperture */ +#define EXIFTAG_SUBJECTDISTANCE 37382 /* Subject distance */ +#define EXIFTAG_METERINGMODE 37383 /* Metering mode */ +#define EXIFTAG_LIGHTSOURCE 37384 /* Light source */ +#define EXIFTAG_FLASH 37385 /* Flash */ +#define EXIFTAG_FOCALLENGTH 37386 /* Lens focal length */ +#define EXIFTAG_SUBJECTAREA 37396 /* Subject area */ +#define EXIFTAG_MAKERNOTE 37500 /* Manufacturer notes */ +#define EXIFTAG_USERCOMMENT 37510 /* User comments */ +#define EXIFTAG_SUBSECTIME 37520 /* DateTime subseconds */ +#define EXIFTAG_SUBSECTIMEORIGINAL 37521 /* DateTimeOriginal subseconds */ +#define EXIFTAG_SUBSECTIMEDIGITIZED 37522 /* DateTimeDigitized subseconds */ +#define EXIFTAG_FLASHPIXVERSION 40960 /* Supported Flashpix version */ +#define EXIFTAG_COLORSPACE 40961 /* Color space information */ +#define EXIFTAG_PIXELXDIMENSION 40962 /* Valid image width */ +#define EXIFTAG_PIXELYDIMENSION 40963 /* Valid image height */ +#define EXIFTAG_RELATEDSOUNDFILE 40964 /* Related audio file */ +#define EXIFTAG_FLASHENERGY 41483 /* Flash energy */ +#define EXIFTAG_SPATIALFREQUENCYRESPONSE 41484 /* Spatial frequency response */ +#define EXIFTAG_FOCALPLANEXRESOLUTION 41486 /* Focal plane X resolution */ +#define EXIFTAG_FOCALPLANEYRESOLUTION 41487 /* Focal plane Y resolution */ +#define EXIFTAG_FOCALPLANERESOLUTIONUNIT 41488 /* Focal plane resolution unit */ +#define EXIFTAG_SUBJECTLOCATION 41492 /* Subject location */ +#define EXIFTAG_EXPOSUREINDEX 41493 /* Exposure index */ +#define EXIFTAG_SENSINGMETHOD 41495 /* Sensing method */ +#define EXIFTAG_FILESOURCE 41728 /* File source */ +#define EXIFTAG_SCENETYPE 41729 /* Scene type */ +#define EXIFTAG_CFAPATTERN 41730 /* CFA pattern */ +#define EXIFTAG_CUSTOMRENDERED 41985 /* Custom image processing */ +#define EXIFTAG_EXPOSUREMODE 41986 /* Exposure mode */ +#define EXIFTAG_WHITEBALANCE 41987 /* White balance */ +#define EXIFTAG_DIGITALZOOMRATIO 41988 /* Digital zoom ratio */ +#define EXIFTAG_FOCALLENGTHIN35MMFILM 41989 /* Focal length in 35 mm film */ +#define EXIFTAG_SCENECAPTURETYPE 41990 /* Scene capture type */ +#define EXIFTAG_GAINCONTROL 41991 /* Gain control */ +#define EXIFTAG_CONTRAST 41992 /* Contrast */ +#define EXIFTAG_SATURATION 41993 /* Saturation */ +#define EXIFTAG_SHARPNESS 41994 /* Sharpness */ +#define EXIFTAG_DEVICESETTINGDESCRIPTION 41995 /* Device settings description */ +#define EXIFTAG_SUBJECTDISTANCERANGE 41996 /* Subject distance range */ +#define EXIFTAG_GAINCONTROL 41991 /* Gain control */ +#define EXIFTAG_GAINCONTROL 41991 /* Gain control */ +#define EXIFTAG_IMAGEUNIQUEID 42016 /* Unique image ID */ + +#endif /* _TIFF_ */ + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/plugins/snes9x_gx/portlibs/include/tiffconf.h b/plugins/snes9x_gx/portlibs/include/tiffconf.h new file mode 100644 index 00000000..3912781d --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/tiffconf.h @@ -0,0 +1,104 @@ +/* libtiff/tiffconf.h. Generated by configure. */ +/* + Configuration defines for installed libtiff. + This file maintained for backward compatibility. Do not use definitions + from this file in your programs. +*/ + +#ifndef _TIFFCONF_ +#define _TIFFCONF_ + +#include "tif_config.h" +// +///* Define to 1 if the system has the type `int16'. */ +///* #undef HAVE_INT16 */ +// +///* Define to 1 if the system has the type `int32'. */ +///* #undef HAVE_INT32 */ +// +///* Define to 1 if the system has the type `int8'. */ +///* #undef HAVE_INT8 */ +// +///* The size of a `int', as computed by sizeof. */ +//#define SIZEOF_INT 4 +// +///* The size of a `long', as computed by sizeof. */ +//#define SIZEOF_LONG 4 +// +///* Compatibility stuff. */ +// +///* Define as 0 or 1 according to the floating point format suported by the +// machine */ +//#define HAVE_IEEEFP 1 +// +///* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */ +//#define HOST_FILLORDER FILLORDER_LSB2MSB +// +///* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian +// (Intel) */ +//#define HOST_BIGENDIAN 1 +// +///* Support CCITT Group 3 & 4 algorithms */ +//#undef CCITT_SUPPORT +// +///* Support JPEG compression (requires IJG JPEG library) */ +//#define JPEG_SUPPORT 1 +// +///* Support LogLuv high dynamic range encoding */ +//#undef LOGLUV_SUPPORT +// +///* Support LZW algorithm */ +//#undef LZW_SUPPORT +// +///* Support NeXT 2-bit RLE algorithm */ +//#undef NEXT_SUPPORT +// +///* Support Old JPEG compresson (read contrib/ojpeg/README first! Compilation +// fails with unpatched IJG JPEG library) */ +///* #undef OJPEG_SUPPORT */ +// +///* Support Macintosh PackBits algorithm */ +//#undef PACKBITS_SUPPORT +// +///* Support Pixar log-format algorithm (requires Zlib) */ +//#undef PIXARLOG_SUPPORT +// +///* Support ThunderScan 4-bit RLE algorithm */ +//#undef THUNDER_SUPPORT +// +///* Support Deflate compression */ +//#undef ZIP_SUPPORT +// +///* Support strip chopping (whether or not to convert single-strip uncompressed +// images to mutiple strips of ~8Kb to reduce memory usage) */ +//#undef STRIPCHOP_DEFAULT //TIFF_STRIPCHOP +// +///* Enable SubIFD tag (330) support */ +//#undef SUBIFD_SUPPORT +// +///* Treat extra sample as alpha (default enabled). The RGBA interface will +// treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many +// packages produce RGBA files but don't mark the alpha properly. */ +//#undef DEFAULT_EXTRASAMPLE_AS_ALPHA +// +///* Pick up YCbCr subsampling info from the JPEG data stream to support files +// lacking the tag (default enabled). */ +//#undef CHECK_JPEG_YCBCR_SUBSAMPLING +// +///* Support MS MDI magic number files as TIFF */ +//#undef MDI_SUPPORT + +/* + * Feature support definitions. + * XXX: These macros are obsoleted. Don't use them in your apps! + * Macros stays here for backward compatibility and should be always defined. + */ + /* +#define COLORIMETRY_SUPPORT +#define YCBCR_SUPPORT +#define CMYK_SUPPORT +#define ICC_SUPPORT +#define PHOTOSHOP_SUPPORT +#define IPTC_SUPPORT +*/ +#endif /* _TIFFCONF_ */ diff --git a/plugins/snes9x_gx/portlibs/include/tiffio.h b/plugins/snes9x_gx/portlibs/include/tiffio.h new file mode 100644 index 00000000..7aaf5613 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/tiffio.h @@ -0,0 +1,515 @@ +/* $Id: tiffio.h,v 1.50 2006/03/21 16:37:51 dron Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#ifndef _TIFFIO_ +#define _TIFFIO_ + +/* + * TIFF I/O Library Definitions. + */ +#include "tiff.h" +#include "tiffvers.h" + +/* + * TIFF is defined as an incomplete type to hide the + * library's internal data structures from clients. + */ +typedef struct tiff TIFF; + +/* + * The following typedefs define the intrinsic size of + * data types used in the *exported* interfaces. These + * definitions depend on the proper definition of types + * in tiff.h. Note also that the varargs interface used + * to pass tag types and values uses the types defined in + * tiff.h directly. + * + * NB: ttag_t is unsigned int and not unsigned short because + * ANSI C requires that the type before the ellipsis be a + * promoted type (i.e. one of int, unsigned int, pointer, + * or double) and because we defined pseudo-tags that are + * outside the range of legal Aldus-assigned tags. + * NB: tsize_t is int32 and not uint32 because some functions + * return -1. + * NB: toff_t is not off_t for many reasons; TIFFs max out at + * 32-bit file offsets being the most important, and to ensure + * that it is unsigned, rather than signed. + */ +typedef uint32 ttag_t; /* directory tag */ +typedef uint16 tdir_t; /* directory index */ +typedef uint16 tsample_t; /* sample number */ +typedef uint32 tstrip_t; /* strip number */ +typedef uint32 ttile_t; /* tile number */ +typedef int32 tsize_t; /* i/o size in bytes */ +typedef void* tdata_t; /* image data ref */ +typedef uint32 toff_t; /* file offset */ + +#if !defined(__WIN32__) && (defined(_WIN32) || defined(WIN32)) +#define __WIN32__ +#endif + +/* + * On windows you should define USE_WIN32_FILEIO if you are using tif_win32.c + * or AVOID_WIN32_FILEIO if you are using something else (like tif_unix.c). + * + * By default tif_unix.c is assumed. + */ + +#if defined(_WINDOWS) || defined(__WIN32__) || defined(_Windows) +# if !defined(__CYGWIN) && !defined(AVOID_WIN32_FILEIO) && !defined(USE_WIN32_FILEIO) +# define AVOID_WIN32_FILEIO +# endif +#endif + +#if defined(USE_WIN32_FILEIO) +# define VC_EXTRALEAN +# include <windows.h> +# ifdef __WIN32__ +DECLARE_HANDLE(thandle_t); /* Win32 file handle */ +# else +typedef HFILE thandle_t; /* client data handle */ +# endif /* __WIN32__ */ +#else +typedef void* thandle_t; /* client data handle */ +#endif /* USE_WIN32_FILEIO */ + +#ifndef NULL +# define NULL (void *)0 +#endif + +/* + * Flags to pass to TIFFPrintDirectory to control + * printing of data structures that are potentially + * very large. Bit-or these flags to enable printing + * multiple items. + */ +#define TIFFPRINT_NONE 0x0 /* no extra info */ +#define TIFFPRINT_STRIPS 0x1 /* strips/tiles info */ +#define TIFFPRINT_CURVES 0x2 /* color/gray response curves */ +#define TIFFPRINT_COLORMAP 0x4 /* colormap */ +#define TIFFPRINT_JPEGQTABLES 0x100 /* JPEG Q matrices */ +#define TIFFPRINT_JPEGACTABLES 0x200 /* JPEG AC tables */ +#define TIFFPRINT_JPEGDCTABLES 0x200 /* JPEG DC tables */ + +/* + * Colour conversion stuff + */ + +/* reference white */ +#define D65_X0 (95.0470F) +#define D65_Y0 (100.0F) +#define D65_Z0 (108.8827F) + +#define D50_X0 (96.4250F) +#define D50_Y0 (100.0F) +#define D50_Z0 (82.4680F) + +/* Structure for holding information about a display device. */ + +typedef unsigned char TIFFRGBValue; /* 8-bit samples */ + +typedef struct { + float d_mat[3][3]; /* XYZ -> luminance matrix */ + float d_YCR; /* Light o/p for reference white */ + float d_YCG; + float d_YCB; + uint32 d_Vrwr; /* Pixel values for ref. white */ + uint32 d_Vrwg; + uint32 d_Vrwb; + float d_Y0R; /* Residual light for black pixel */ + float d_Y0G; + float d_Y0B; + float d_gammaR; /* Gamma values for the three guns */ + float d_gammaG; + float d_gammaB; +} TIFFDisplay; + +typedef struct { /* YCbCr->RGB support */ + TIFFRGBValue* clamptab; /* range clamping table */ + int* Cr_r_tab; + int* Cb_b_tab; + int32* Cr_g_tab; + int32* Cb_g_tab; + int32* Y_tab; +} TIFFYCbCrToRGB; + +typedef struct { /* CIE Lab 1976->RGB support */ + int range; /* Size of conversion table */ +#define CIELABTORGB_TABLE_RANGE 1500 + float rstep, gstep, bstep; + float X0, Y0, Z0; /* Reference white point */ + TIFFDisplay display; + float Yr2r[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yr to r */ + float Yg2g[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yg to g */ + float Yb2b[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yb to b */ +} TIFFCIELabToRGB; + +/* + * RGBA-style image support. + */ +typedef struct _TIFFRGBAImage TIFFRGBAImage; +/* + * The image reading and conversion routines invoke + * ``put routines'' to copy/image/whatever tiles of + * raw image data. A default set of routines are + * provided to convert/copy raw image data to 8-bit + * packed ABGR format rasters. Applications can supply + * alternate routines that unpack the data into a + * different format or, for example, unpack the data + * and draw the unpacked raster on the display. + */ +typedef void (*tileContigRoutine) + (TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32, + unsigned char*); +typedef void (*tileSeparateRoutine) + (TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32, + unsigned char*, unsigned char*, unsigned char*, unsigned char*); +/* + * RGBA-reader state. + */ +struct _TIFFRGBAImage { + TIFF* tif; /* image handle */ + int stoponerr; /* stop on read error */ + int isContig; /* data is packed/separate */ + int alpha; /* type of alpha data present */ + uint32 width; /* image width */ + uint32 height; /* image height */ + uint16 bitspersample; /* image bits/sample */ + uint16 samplesperpixel; /* image samples/pixel */ + uint16 orientation; /* image orientation */ + uint16 req_orientation; /* requested orientation */ + uint16 photometric; /* image photometric interp */ + uint16* redcmap; /* colormap pallete */ + uint16* greencmap; + uint16* bluecmap; + /* get image data routine */ + int (*get)(TIFFRGBAImage*, uint32*, uint32, uint32); + union { + void (*any)(TIFFRGBAImage*); + tileContigRoutine contig; + tileSeparateRoutine separate; + } put; /* put decoded strip/tile */ + TIFFRGBValue* Map; /* sample mapping array */ + uint32** BWmap; /* black&white map */ + uint32** PALmap; /* palette image map */ + TIFFYCbCrToRGB* ycbcr; /* YCbCr conversion state */ + TIFFCIELabToRGB* cielab; /* CIE L*a*b conversion state */ + + int row_offset; + int col_offset; +}; + +/* + * Macros for extracting components from the + * packed ABGR form returned by TIFFReadRGBAImage. + */ +#define TIFFGetR(abgr) ((abgr) & 0xff) +#define TIFFGetG(abgr) (((abgr) >> 8) & 0xff) +#define TIFFGetB(abgr) (((abgr) >> 16) & 0xff) +#define TIFFGetA(abgr) (((abgr) >> 24) & 0xff) + +/* + * A CODEC is a software package that implements decoding, + * encoding, or decoding+encoding of a compression algorithm. + * The library provides a collection of builtin codecs. + * More codecs may be registered through calls to the library + * and/or the builtin implementations may be overridden. + */ +typedef int (*TIFFInitMethod)(TIFF*, int); +typedef struct { + char* name; + uint16 scheme; + TIFFInitMethod init; +} TIFFCodec; + +#include <stdio.h> +#include <stdarg.h> + +/* share internal LogLuv conversion routines? */ +#ifndef LOGLUV_PUBLIC +#define LOGLUV_PUBLIC 1 +#endif + +#if defined(c_plusplus) || defined(__cplusplus) +extern "C" { +#endif +typedef void (*TIFFErrorHandler)(const char*, const char*, va_list); +typedef void (*TIFFErrorHandlerExt)(thandle_t, const char*, const char*, va_list); +typedef tsize_t (*TIFFReadWriteProc)(thandle_t, tdata_t, tsize_t); +typedef toff_t (*TIFFSeekProc)(thandle_t, toff_t, int); +typedef int (*TIFFCloseProc)(thandle_t); +typedef toff_t (*TIFFSizeProc)(thandle_t); +typedef int (*TIFFMapFileProc)(thandle_t, tdata_t*, toff_t*); +typedef void (*TIFFUnmapFileProc)(thandle_t, tdata_t, toff_t); +typedef void (*TIFFExtendProc)(TIFF*); + +extern const char* TIFFGetVersion(void); + +extern const TIFFCodec* TIFFFindCODEC(uint16); +extern TIFFCodec* TIFFRegisterCODEC(uint16, const char*, TIFFInitMethod); +extern void TIFFUnRegisterCODEC(TIFFCodec*); +extern int TIFFIsCODECConfigured(uint16); +extern TIFFCodec* TIFFGetConfiguredCODECs(void); + +/* + * Auxiliary functions. + */ + +extern tdata_t _TIFFmalloc(tsize_t); +extern tdata_t _TIFFrealloc(tdata_t, tsize_t); +extern void _TIFFmemset(tdata_t, int, tsize_t); +extern void _TIFFmemcpy(tdata_t, const tdata_t, tsize_t); +extern int _TIFFmemcmp(const tdata_t, const tdata_t, tsize_t); +extern void _TIFFfree(tdata_t); + +/* +** Stuff, related to tag handling and creating custom tags. +*/ +extern int TIFFGetTagListCount( TIFF * ); +extern ttag_t TIFFGetTagListEntry( TIFF *, int tag_index ); + +#define TIFF_ANY TIFF_NOTYPE /* for field descriptor searching */ +#define TIFF_VARIABLE -1 /* marker for variable length tags */ +#define TIFF_SPP -2 /* marker for SamplesPerPixel tags */ +#define TIFF_VARIABLE2 -3 /* marker for uint32 var-length tags */ + +#define FIELD_CUSTOM 65 + +typedef struct { + ttag_t field_tag; /* field's tag */ + short field_readcount; /* read count/TIFF_VARIABLE/TIFF_SPP */ + short field_writecount; /* write count/TIFF_VARIABLE */ + TIFFDataType field_type; /* type of associated data */ + unsigned short field_bit; /* bit in fieldsset bit vector */ + unsigned char field_oktochange; /* if true, can change while writing */ + unsigned char field_passcount; /* if true, pass dir count on set */ + char *field_name; /* ASCII name */ +} TIFFFieldInfo; + +typedef struct _TIFFTagValue { + const TIFFFieldInfo *info; + int count; + void *value; +} TIFFTagValue; + +extern void TIFFMergeFieldInfo(TIFF*, const TIFFFieldInfo[], int); +extern const TIFFFieldInfo* TIFFFindFieldInfo(TIFF*, ttag_t, TIFFDataType); +extern const TIFFFieldInfo* TIFFFindFieldInfoByName(TIFF* , const char *, + TIFFDataType); +extern const TIFFFieldInfo* TIFFFieldWithTag(TIFF*, ttag_t); +extern const TIFFFieldInfo* TIFFFieldWithName(TIFF*, const char *); + +typedef int (*TIFFVSetMethod)(TIFF*, ttag_t, va_list); +typedef int (*TIFFVGetMethod)(TIFF*, ttag_t, va_list); +typedef void (*TIFFPrintMethod)(TIFF*, FILE*, long); + +typedef struct { + TIFFVSetMethod vsetfield; /* tag set routine */ + TIFFVGetMethod vgetfield; /* tag get routine */ + TIFFPrintMethod printdir; /* directory print routine */ +} TIFFTagMethods; + +extern TIFFTagMethods *TIFFAccessTagMethods( TIFF * ); +extern void *TIFFGetClientInfo( TIFF *, const char * ); +extern void TIFFSetClientInfo( TIFF *, void *, const char * ); + +extern void TIFFCleanup(TIFF*); +extern void TIFFClose(TIFF*); +extern int TIFFFlush(TIFF*); +extern int TIFFFlushData(TIFF*); +extern int TIFFGetField(TIFF*, ttag_t, ...); +extern int TIFFVGetField(TIFF*, ttag_t, va_list); +extern int TIFFGetFieldDefaulted(TIFF*, ttag_t, ...); +extern int TIFFVGetFieldDefaulted(TIFF*, ttag_t, va_list); +extern int TIFFReadDirectory(TIFF*); +extern int TIFFReadCustomDirectory(TIFF*, toff_t, const TIFFFieldInfo[], + size_t); +extern int TIFFReadEXIFDirectory(TIFF*, toff_t); +extern tsize_t TIFFScanlineSize(TIFF*); +extern tsize_t TIFFRasterScanlineSize(TIFF*); +extern tsize_t TIFFStripSize(TIFF*); +extern tsize_t TIFFRawStripSize(TIFF*, tstrip_t); +extern tsize_t TIFFVStripSize(TIFF*, uint32); +extern tsize_t TIFFTileRowSize(TIFF*); +extern tsize_t TIFFTileSize(TIFF*); +extern tsize_t TIFFVTileSize(TIFF*, uint32); +extern uint32 TIFFDefaultStripSize(TIFF*, uint32); +extern void TIFFDefaultTileSize(TIFF*, uint32*, uint32*); +extern int TIFFFileno(TIFF*); +extern int TIFFSetFileno(TIFF*, int); +extern thandle_t TIFFClientdata(TIFF*); +extern thandle_t TIFFSetClientdata(TIFF*, thandle_t); +extern int TIFFGetMode(TIFF*); +extern int TIFFSetMode(TIFF*, int); +extern int TIFFIsTiled(TIFF*); +extern int TIFFIsByteSwapped(TIFF*); +extern int TIFFIsUpSampled(TIFF*); +extern int TIFFIsMSB2LSB(TIFF*); +extern int TIFFIsBigEndian(TIFF*); +extern TIFFReadWriteProc TIFFGetReadProc(TIFF*); +extern TIFFReadWriteProc TIFFGetWriteProc(TIFF*); +extern TIFFSeekProc TIFFGetSeekProc(TIFF*); +extern TIFFCloseProc TIFFGetCloseProc(TIFF*); +extern TIFFSizeProc TIFFGetSizeProc(TIFF*); +extern TIFFMapFileProc TIFFGetMapFileProc(TIFF*); +extern TIFFUnmapFileProc TIFFGetUnmapFileProc(TIFF*); +extern uint32 TIFFCurrentRow(TIFF*); +extern tdir_t TIFFCurrentDirectory(TIFF*); +extern tdir_t TIFFNumberOfDirectories(TIFF*); +extern uint32 TIFFCurrentDirOffset(TIFF*); +extern tstrip_t TIFFCurrentStrip(TIFF*); +extern ttile_t TIFFCurrentTile(TIFF*); +extern int TIFFReadBufferSetup(TIFF*, tdata_t, tsize_t); +extern int TIFFWriteBufferSetup(TIFF*, tdata_t, tsize_t); +extern int TIFFSetupStrips(TIFF *); +extern int TIFFWriteCheck(TIFF*, int, const char *); +extern void TIFFFreeDirectory(TIFF*); +extern int TIFFCreateDirectory(TIFF*); +extern int TIFFLastDirectory(TIFF*); +extern int TIFFSetDirectory(TIFF*, tdir_t); +extern int TIFFSetSubDirectory(TIFF*, uint32); +extern int TIFFUnlinkDirectory(TIFF*, tdir_t); +extern int TIFFSetField(TIFF*, ttag_t, ...); +extern int TIFFVSetField(TIFF*, ttag_t, va_list); +extern int TIFFWriteDirectory(TIFF *); +extern int TIFFCheckpointDirectory(TIFF *); +extern int TIFFRewriteDirectory(TIFF *); +extern int TIFFReassignTagToIgnore(enum TIFFIgnoreSense, int); + +#if defined(c_plusplus) || defined(__cplusplus) +extern void TIFFPrintDirectory(TIFF*, FILE*, long = 0); +extern int TIFFReadScanline(TIFF*, tdata_t, uint32, tsample_t = 0); +extern int TIFFWriteScanline(TIFF*, tdata_t, uint32, tsample_t = 0); +extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int = 0); +extern int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*, + int = ORIENTATION_BOTLEFT, int = 0); +#else +extern void TIFFPrintDirectory(TIFF*, FILE*, long); +extern int TIFFReadScanline(TIFF*, tdata_t, uint32, tsample_t); +extern int TIFFWriteScanline(TIFF*, tdata_t, uint32, tsample_t); +extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int); +extern int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*, int, int); +#endif + +extern int TIFFReadRGBAStrip(TIFF*, tstrip_t, uint32 * ); +extern int TIFFReadRGBATile(TIFF*, uint32, uint32, uint32 * ); +extern int TIFFRGBAImageOK(TIFF*, char [1024]); +extern int TIFFRGBAImageBegin(TIFFRGBAImage*, TIFF*, int, char [1024]); +extern int TIFFRGBAImageGet(TIFFRGBAImage*, uint32*, uint32, uint32); +extern void TIFFRGBAImageEnd(TIFFRGBAImage*); +extern TIFF* TIFFOpen(const char*, const char*); +# ifdef __WIN32__ +extern TIFF* TIFFOpenW(const wchar_t*, const char*); +# endif /* __WIN32__ */ +extern TIFF* TIFFFdOpen(int, const char*, const char*); +extern TIFF* TIFFClientOpen(const char*, const char*, + thandle_t, + TIFFReadWriteProc, TIFFReadWriteProc, + TIFFSeekProc, TIFFCloseProc, + TIFFSizeProc, + TIFFMapFileProc, TIFFUnmapFileProc); +extern const char* TIFFFileName(TIFF*); +extern const char* TIFFSetFileName(TIFF*, const char *); +extern void TIFFError(const char*, const char*, ...); +extern void TIFFErrorExt(thandle_t, const char*, const char*, ...); +extern void TIFFWarning(const char*, const char*, ...); +extern void TIFFWarningExt(thandle_t, const char*, const char*, ...); +extern TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler); +extern TIFFErrorHandlerExt TIFFSetErrorHandlerExt(TIFFErrorHandlerExt); +extern TIFFErrorHandler TIFFSetWarningHandler(TIFFErrorHandler); +extern TIFFErrorHandlerExt TIFFSetWarningHandlerExt(TIFFErrorHandlerExt); +extern TIFFExtendProc TIFFSetTagExtender(TIFFExtendProc); +extern ttile_t TIFFComputeTile(TIFF*, uint32, uint32, uint32, tsample_t); +extern int TIFFCheckTile(TIFF*, uint32, uint32, uint32, tsample_t); +extern ttile_t TIFFNumberOfTiles(TIFF*); +extern tsize_t TIFFReadTile(TIFF*, + tdata_t, uint32, uint32, uint32, tsample_t); +extern tsize_t TIFFWriteTile(TIFF*, + tdata_t, uint32, uint32, uint32, tsample_t); +extern tstrip_t TIFFComputeStrip(TIFF*, uint32, tsample_t); +extern tstrip_t TIFFNumberOfStrips(TIFF*); +extern tsize_t TIFFReadEncodedStrip(TIFF*, tstrip_t, tdata_t, tsize_t); +extern tsize_t TIFFReadRawStrip(TIFF*, tstrip_t, tdata_t, tsize_t); +extern tsize_t TIFFReadEncodedTile(TIFF*, ttile_t, tdata_t, tsize_t); +extern tsize_t TIFFReadRawTile(TIFF*, ttile_t, tdata_t, tsize_t); +extern tsize_t TIFFWriteEncodedStrip(TIFF*, tstrip_t, tdata_t, tsize_t); +extern tsize_t TIFFWriteRawStrip(TIFF*, tstrip_t, tdata_t, tsize_t); +extern tsize_t TIFFWriteEncodedTile(TIFF*, ttile_t, tdata_t, tsize_t); +extern tsize_t TIFFWriteRawTile(TIFF*, ttile_t, tdata_t, tsize_t); +extern int TIFFDataWidth(TIFFDataType); /* table of tag datatype widths */ +extern void TIFFSetWriteOffset(TIFF*, toff_t); +extern void TIFFSwabShort(uint16*); +extern void TIFFSwabLong(uint32*); +extern void TIFFSwabDouble(double*); +extern void TIFFSwabArrayOfShort(uint16*, unsigned long); +extern void TIFFSwabArrayOfTriples(uint8*, unsigned long); +extern void TIFFSwabArrayOfLong(uint32*, unsigned long); +extern void TIFFSwabArrayOfDouble(double*, unsigned long); +extern void TIFFReverseBits(unsigned char *, unsigned long); +extern const unsigned char* TIFFGetBitRevTable(int); + +#ifdef LOGLUV_PUBLIC +#define U_NEU 0.210526316 +#define V_NEU 0.473684211 +#define UVSCALE 410. +extern double LogL16toY(int); +extern double LogL10toY(int); +extern void XYZtoRGB24(float*, uint8*); +extern int uv_decode(double*, double*, int); +extern void LogLuv24toXYZ(uint32, float*); +extern void LogLuv32toXYZ(uint32, float*); +#if defined(c_plusplus) || defined(__cplusplus) +extern int LogL16fromY(double, int = SGILOGENCODE_NODITHER); +extern int LogL10fromY(double, int = SGILOGENCODE_NODITHER); +extern int uv_encode(double, double, int = SGILOGENCODE_NODITHER); +extern uint32 LogLuv24fromXYZ(float*, int = SGILOGENCODE_NODITHER); +extern uint32 LogLuv32fromXYZ(float*, int = SGILOGENCODE_NODITHER); +#else +extern int LogL16fromY(double, int); +extern int LogL10fromY(double, int); +extern int uv_encode(double, double, int); +extern uint32 LogLuv24fromXYZ(float*, int); +extern uint32 LogLuv32fromXYZ(float*, int); +#endif +#endif /* LOGLUV_PUBLIC */ + +extern int TIFFCIELabToRGBInit(TIFFCIELabToRGB*, TIFFDisplay *, float*); +extern void TIFFCIELabToXYZ(TIFFCIELabToRGB *, uint32, int32, int32, + float *, float *, float *); +extern void TIFFXYZToRGB(TIFFCIELabToRGB *, float, float, float, + uint32 *, uint32 *, uint32 *); + +extern int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB*, float*, float*); +extern void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *, uint32, int32, int32, + uint32 *, uint32 *, uint32 *); + +#if defined(c_plusplus) || defined(__cplusplus) +} +#endif + +#endif /* _TIFFIO_ */ + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/plugins/snes9x_gx/portlibs/include/tiffvers.h b/plugins/snes9x_gx/portlibs/include/tiffvers.h new file mode 100644 index 00000000..9744f8d3 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/tiffvers.h @@ -0,0 +1,9 @@ +#define TIFFLIB_VERSION_STR "LIBTIFF, Version 3.8.2\nCopyright (c) 1988-1996 Sam Leffler\nCopyright (c) 1991-1996 Silicon Graphics, Inc." +/* + * This define can be used in code that requires + * compilation-related definitions specific to a + * version or versions of the library. Runtime + * version checking should be done based on the + * string returned by TIFFGetVersion. + */ +#define TIFFLIB_VERSION 20060323 diff --git a/plugins/snes9x_gx/portlibs/include/tremor/config_types.h b/plugins/snes9x_gx/portlibs/include/tremor/config_types.h new file mode 100644 index 00000000..4f07a037 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/tremor/config_types.h @@ -0,0 +1,26 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: #ifdef jail to whip a few platforms into the UNIX ideal. + + ********************************************************************/ +#ifndef _OS_CVTYPES_H +#define _OS_CVTYPES_H + +typedef long long ogg_int64_t; +typedef int ogg_int32_t; +typedef unsigned int ogg_uint32_t; +typedef short ogg_int16_t; +typedef unsigned short ogg_uint16_t; + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/tremor/ivorbiscodec.h b/plugins/snes9x_gx/portlibs/include/tremor/ivorbiscodec.h new file mode 100644 index 00000000..0eea9eb8 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/tremor/ivorbiscodec.h @@ -0,0 +1,104 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: libvorbis codec headers + + ********************************************************************/ + +#ifndef _vorbis_codec_h_ +#define _vorbis_codec_h_ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +#include "ogg.h" + +struct vorbis_dsp_state; +typedef struct vorbis_dsp_state vorbis_dsp_state; + +typedef struct vorbis_info{ + int version; + int channels; + long rate; + + /* The below bitrate declarations are *hints*. + Combinations of the three values carry the following implications: + + all three set to the same value: + implies a fixed rate bitstream + only nominal set: + implies a VBR stream that averages the nominal bitrate. No hard + upper/lower limit + upper and or lower set: + implies a VBR bitstream that obeys the bitrate limits. nominal + may also be set to give a nominal rate. + none set: + the coder does not care to speculate. + */ + + long bitrate_upper; + long bitrate_nominal; + long bitrate_lower; + long bitrate_window; + + void *codec_setup; +} vorbis_info; + +typedef struct vorbis_comment{ + char **user_comments; + int *comment_lengths; + int comments; + char *vendor; + +} vorbis_comment; + + +/* Vorbis PRIMITIVES: general ***************************************/ + +extern void vorbis_info_init(vorbis_info *vi); +extern void vorbis_info_clear(vorbis_info *vi); +extern int vorbis_info_blocksize(vorbis_info *vi,int zo); +extern void vorbis_comment_init(vorbis_comment *vc); +extern void vorbis_comment_add(vorbis_comment *vc, char *comment); +extern void vorbis_comment_add_tag(vorbis_comment *vc, + char *tag, char *contents); +extern char *vorbis_comment_query(vorbis_comment *vc, char *tag, int count); +extern int vorbis_comment_query_count(vorbis_comment *vc, char *tag); +extern void vorbis_comment_clear(vorbis_comment *vc); + +/* Vorbis ERRORS and return codes ***********************************/ + +#define OV_FALSE -1 +#define OV_EOF -2 +#define OV_HOLE -3 + +#define OV_EREAD -128 +#define OV_EFAULT -129 +#define OV_EIMPL -130 +#define OV_EINVAL -131 +#define OV_ENOTVORBIS -132 +#define OV_EBADHEADER -133 +#define OV_EVERSION -134 +#define OV_ENOTAUDIO -135 +#define OV_EBADPACKET -136 +#define OV_EBADLINK -137 +#define OV_ENOSEEK -138 + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif + diff --git a/plugins/snes9x_gx/portlibs/include/tremor/ivorbisfile.h b/plugins/snes9x_gx/portlibs/include/tremor/ivorbisfile.h new file mode 100644 index 00000000..7ebc0427 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/tremor/ivorbisfile.h @@ -0,0 +1,122 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2003 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: stdio-based convenience library for opening/seeking/decoding + + ********************************************************************/ + +#ifndef _OV_FILE_H_ +#define _OV_FILE_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +#include <stdio.h> +#include "ivorbiscodec.h" + +/* The function prototypes for the callbacks are basically the same as for + * the stdio functions fread, fseek, fclose, ftell. + * The one difference is that the FILE * arguments have been replaced with + * a void * - this is to be used as a pointer to whatever internal data these + * functions might need. In the stdio case, it's just a FILE * cast to a void * + * + * If you use other functions, check the docs for these functions and return + * the right values. For seek_func(), you *MUST* return -1 if the stream is + * unseekable + */ +typedef struct { + size_t (*read_func) (void *ptr, size_t size, size_t nmemb, void *datasource); + int (*seek_func) (void *datasource, ogg_int64_t offset, int whence); + int (*close_func) (void *datasource); + long (*tell_func) (void *datasource); +} ov_callbacks; + +typedef struct OggVorbis_File { + void *datasource; /* Pointer to a FILE *, etc. */ + int seekable; + ogg_int64_t offset; + ogg_int64_t end; + ogg_sync_state *oy; + + /* If the FILE handle isn't seekable (eg, a pipe), only the current + stream appears */ + int links; + ogg_int64_t *offsets; + ogg_int64_t *dataoffsets; + ogg_uint32_t *serialnos; + ogg_int64_t *pcmlengths; + vorbis_info vi; + vorbis_comment vc; + + /* Decoding working state local storage */ + ogg_int64_t pcm_offset; + int ready_state; + ogg_uint32_t current_serialno; + int current_link; + + ogg_int64_t bittrack; + ogg_int64_t samptrack; + + ogg_stream_state *os; /* take physical pages, weld into a logical + stream of packets */ + vorbis_dsp_state *vd; /* central working state for the packet->PCM decoder */ + + ov_callbacks callbacks; + +} OggVorbis_File; + +extern int ov_clear(OggVorbis_File *vf); +extern int ov_open(FILE *f,OggVorbis_File *vf,char *initial,long ibytes); +extern int ov_open_callbacks(void *datasource, OggVorbis_File *vf, + char *initial, long ibytes, ov_callbacks callbacks); + +extern int ov_test(FILE *f,OggVorbis_File *vf,char *initial,long ibytes); +extern int ov_test_callbacks(void *datasource, OggVorbis_File *vf, + char *initial, long ibytes, ov_callbacks callbacks); +extern int ov_test_open(OggVorbis_File *vf); + +extern long ov_bitrate(OggVorbis_File *vf,int i); +extern long ov_bitrate_instant(OggVorbis_File *vf); +extern long ov_streams(OggVorbis_File *vf); +extern long ov_seekable(OggVorbis_File *vf); +extern long ov_serialnumber(OggVorbis_File *vf,int i); + +extern ogg_int64_t ov_raw_total(OggVorbis_File *vf,int i); +extern ogg_int64_t ov_pcm_total(OggVorbis_File *vf,int i); +extern ogg_int64_t ov_time_total(OggVorbis_File *vf,int i); + +extern int ov_raw_seek(OggVorbis_File *vf,ogg_int64_t pos); +extern int ov_pcm_seek(OggVorbis_File *vf,ogg_int64_t pos); +extern int ov_pcm_seek_page(OggVorbis_File *vf,ogg_int64_t pos); +extern int ov_time_seek(OggVorbis_File *vf,ogg_int64_t pos); +extern int ov_time_seek_page(OggVorbis_File *vf,ogg_int64_t pos); + +extern ogg_int64_t ov_raw_tell(OggVorbis_File *vf); +extern ogg_int64_t ov_pcm_tell(OggVorbis_File *vf); +extern ogg_int64_t ov_time_tell(OggVorbis_File *vf); + +extern vorbis_info *ov_info(OggVorbis_File *vf,int link); +extern vorbis_comment *ov_comment(OggVorbis_File *vf,int link); + +extern long ov_read(OggVorbis_File *vf,void *buffer,int length, + int *bitstream); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif + + diff --git a/plugins/snes9x_gx/portlibs/include/tremor/ogg.h b/plugins/snes9x_gx/portlibs/include/tremor/ogg.h new file mode 100644 index 00000000..85cb41b6 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/tremor/ogg.h @@ -0,0 +1,206 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2003 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: subsumed libogg includes + + ********************************************************************/ +#ifndef _OGG_H +#define _OGG_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "os_types.h" + +typedef struct ogg_buffer_state{ + struct ogg_buffer *unused_buffers; + struct ogg_reference *unused_references; + int outstanding; + int shutdown; +} ogg_buffer_state; + +typedef struct ogg_buffer { + unsigned char *data; + long size; + int refcount; + + union { + ogg_buffer_state *owner; + struct ogg_buffer *next; + } ptr; +} ogg_buffer; + +typedef struct ogg_reference { + ogg_buffer *buffer; + long begin; + long length; + + struct ogg_reference *next; +} ogg_reference; + +typedef struct oggpack_buffer { + int headbit; + unsigned char *headptr; + long headend; + + /* memory management */ + ogg_reference *head; + ogg_reference *tail; + + /* render the byte/bit counter API constant time */ + long count; /* doesn't count the tail */ +} oggpack_buffer; + +typedef struct oggbyte_buffer { + ogg_reference *baseref; + + ogg_reference *ref; + unsigned char *ptr; + long pos; + long end; +} oggbyte_buffer; + +typedef struct ogg_sync_state { + /* decode memory management pool */ + ogg_buffer_state *bufferpool; + + /* stream buffers */ + ogg_reference *fifo_head; + ogg_reference *fifo_tail; + long fifo_fill; + + /* stream sync management */ + int unsynced; + int headerbytes; + int bodybytes; + +} ogg_sync_state; + +typedef struct ogg_stream_state { + ogg_reference *header_head; + ogg_reference *header_tail; + ogg_reference *body_head; + ogg_reference *body_tail; + + int e_o_s; /* set when we have buffered the last + packet in the logical bitstream */ + int b_o_s; /* set after we've written the initial page + of a logical bitstream */ + long serialno; + long pageno; + ogg_int64_t packetno; /* sequence number for decode; the framing + knows where there's a hole in the data, + but we need coupling so that the codec + (which is in a seperate abstraction + layer) also knows about the gap */ + ogg_int64_t granulepos; + + int lacing_fill; + ogg_uint32_t body_fill; + + /* decode-side state data */ + int holeflag; + int spanflag; + int clearflag; + int laceptr; + ogg_uint32_t body_fill_next; + +} ogg_stream_state; + +typedef struct { + ogg_reference *packet; + long bytes; + long b_o_s; + long e_o_s; + ogg_int64_t granulepos; + ogg_int64_t packetno; /* sequence number for decode; the framing + knows where there's a hole in the data, + but we need coupling so that the codec + (which is in a seperate abstraction + layer) also knows about the gap */ +} ogg_packet; + +typedef struct { + ogg_reference *header; + int header_len; + ogg_reference *body; + long body_len; +} ogg_page; + +/* Ogg BITSTREAM PRIMITIVES: bitstream ************************/ + +extern void oggpack_readinit(oggpack_buffer *b,ogg_reference *r); +extern long oggpack_look(oggpack_buffer *b,int bits); +extern void oggpack_adv(oggpack_buffer *b,int bits); +extern long oggpack_read(oggpack_buffer *b,int bits); +extern long oggpack_bytes(oggpack_buffer *b); +extern long oggpack_bits(oggpack_buffer *b); +extern int oggpack_eop(oggpack_buffer *b); + +/* Ogg BITSTREAM PRIMITIVES: decoding **************************/ + +extern ogg_sync_state *ogg_sync_create(void); +extern int ogg_sync_destroy(ogg_sync_state *oy); +extern int ogg_sync_reset(ogg_sync_state *oy); + +extern unsigned char *ogg_sync_bufferin(ogg_sync_state *oy, long size); +extern int ogg_sync_wrote(ogg_sync_state *oy, long bytes); +extern long ogg_sync_pageseek(ogg_sync_state *oy,ogg_page *og); +extern int ogg_sync_pageout(ogg_sync_state *oy, ogg_page *og); +extern int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og); +extern int ogg_stream_packetout(ogg_stream_state *os,ogg_packet *op); +extern int ogg_stream_packetpeek(ogg_stream_state *os,ogg_packet *op); + +/* Ogg BITSTREAM PRIMITIVES: general ***************************/ + +extern ogg_stream_state *ogg_stream_create(int serialno); +extern int ogg_stream_destroy(ogg_stream_state *os); +extern int ogg_stream_reset(ogg_stream_state *os); +extern int ogg_stream_reset_serialno(ogg_stream_state *os,int serialno); +extern int ogg_stream_eos(ogg_stream_state *os); + +extern int ogg_page_checksum_set(ogg_page *og); + +extern int ogg_page_version(ogg_page *og); +extern int ogg_page_continued(ogg_page *og); +extern int ogg_page_bos(ogg_page *og); +extern int ogg_page_eos(ogg_page *og); +extern ogg_int64_t ogg_page_granulepos(ogg_page *og); +extern ogg_uint32_t ogg_page_serialno(ogg_page *og); +extern ogg_uint32_t ogg_page_pageno(ogg_page *og); +extern int ogg_page_packets(ogg_page *og); +extern int ogg_page_getbuffer(ogg_page *og, unsigned char **buffer); + +extern int ogg_packet_release(ogg_packet *op); +extern int ogg_page_release(ogg_page *og); + +extern void ogg_page_dup(ogg_page *d, ogg_page *s); + +/* Ogg BITSTREAM PRIMITIVES: return codes ***************************/ + +#define OGG_SUCCESS 0 + +#define OGG_HOLE -10 +#define OGG_SPAN -11 +#define OGG_EVERSION -12 +#define OGG_ESERIAL -13 +#define OGG_EINVAL -14 +#define OGG_EEOS -15 + + +#ifdef __cplusplus +} +#endif + +#endif /* _OGG_H */ diff --git a/plugins/snes9x_gx/portlibs/include/tremor/os_types.h b/plugins/snes9x_gx/portlibs/include/tremor/os_types.h new file mode 100644 index 00000000..2761aa42 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/tremor/os_types.h @@ -0,0 +1,94 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: #ifdef jail to whip a few platforms into the UNIX ideal. + + ********************************************************************/ +#ifndef _OS_TYPES_H +#define _OS_TYPES_H + +#ifdef _LOW_ACCURACY_ +# define X(n) (((((n)>>22)+1)>>1) - ((((n)>>22)+1)>>9)) +# define LOOKUP_T const unsigned char +#else +# define X(n) (n) +# define LOOKUP_T const ogg_int32_t +#endif + +/* make it easy on the folks that want to compile the libs with a + different malloc than stdlib */ +#define _ogg_malloc malloc +#define _ogg_calloc calloc +#define _ogg_realloc realloc +#define _ogg_free free + +#ifdef _WIN32 + +# ifndef __GNUC__ + /* MSVC/Borland */ + typedef __int64 ogg_int64_t; + typedef __int32 ogg_int32_t; + typedef unsigned __int32 ogg_uint32_t; + typedef __int16 ogg_int16_t; + typedef unsigned __int16 ogg_uint16_t; +# else + /* Cygwin */ + #include <_G_config.h> + typedef _G_int64_t ogg_int64_t; + typedef _G_int32_t ogg_int32_t; + typedef _G_uint32_t ogg_uint32_t; + typedef _G_int16_t ogg_int16_t; + typedef _G_uint16_t ogg_uint16_t; +# endif + +#elif defined(__MACOS__) + +# include <sys/types.h> + typedef SInt16 ogg_int16_t; + typedef UInt16 ogg_uint16_t; + typedef SInt32 ogg_int32_t; + typedef UInt32 ogg_uint32_t; + typedef SInt64 ogg_int64_t; + +#elif defined(__MACOSX__) /* MacOS X Framework build */ + +# include <sys/types.h> + typedef int16_t ogg_int16_t; + typedef u_int16_t ogg_uint16_t; + typedef int32_t ogg_int32_t; + typedef u_int32_t ogg_uint32_t; + typedef int64_t ogg_int64_t; + +#elif defined(__BEOS__) + + /* Be */ +# include <inttypes.h> + +#elif defined (__EMX__) + + /* OS/2 GCC */ + typedef short ogg_int16_t; + typedef unsigned short ogg_uint16_t; + typedef int ogg_int32_t; + typedef unsigned int ogg_uint32_t; + typedef long long ogg_int64_t; + +#else + +# include <sys/types.h> +# include <sys/param.h> +# include "config_types.h" + +#endif + +#endif /* _OS_TYPES_H */ diff --git a/plugins/snes9x_gx/portlibs/include/wupc/wupc.h b/plugins/snes9x_gx/portlibs/include/wupc/wupc.h new file mode 100644 index 00000000..02653964 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/wupc/wupc.h @@ -0,0 +1,49 @@ +/**************************************************************************** + * Copyright (C) 2014 FIX94 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + ****************************************************************************/ +#ifndef _WUPC_H_ +#define _WUPC_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +struct WUPCData { + s16 xAxisL; + s16 xAxisR; + s16 yAxisL; + s16 yAxisR; + u32 button; +}; + +void WUPC_Init(); +void WUPC_Shutdown(); +struct WUPCData *WUPC_Data(u8 chan); +void WUPC_Rumble(u8 chan, bool rumble); +u32 WUPC_UpdateButtonStats(); +u32 WUPC_ButtonsUp(u8 chan); +u32 WUPC_ButtonsDown(u8 chan); +u32 WUPC_ButtonsHeld(u8 chan); +s16 WUPC_lStickX(u8 chan); +s16 WUPC_lStickY(u8 chan); +s16 WUPC_rStickX(u8 chan); +s16 WUPC_rStickY(u8 chan); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/plugins/snes9x_gx/portlibs/include/zconf.h b/plugins/snes9x_gx/portlibs/include/zconf.h new file mode 100644 index 00000000..b2343874 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/zconf.h @@ -0,0 +1,428 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2010 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". + */ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ + +/* all linked symbols */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 +# define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzgetc z_gzgetc +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# define gzprintf z_gzprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzwrite z_gzwrite +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetHeader z_inflateGetHeader +# define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateUndermine z_inflateUndermine +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# define uncompress z_uncompress +# define zError z_zError +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion + +/* all zlib typedefs in zlib.h and zconf.h */ +# define Byte z_Byte +# define Bytef z_Bytef +# define alloc_func z_alloc_func +# define charf z_charf +# define free_func z_free_func +# define gzFile z_gzFile +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func +# define intf z_intf +# define out_func z_out_func +# define uInt z_uInt +# define uIntf z_uIntf +# define uLong z_uLong +# define uLongf z_uLongf +# define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +/* Some Mac compilers merge all .h files incorrectly: */ +#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) +# define NO_DUMMY_DECL +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include <windows.h> + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if 1 /* was set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#ifdef STDC +# include <sys/types.h> /* for off_t */ +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include <unistd.h> /* for SEEK_* and off_t */ +# ifdef VMS +# include <unixio.h> /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +#endif + +#ifndef SEEK_SET +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif + +#ifndef z_off_t +# define z_off_t long +#endif + +#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +# define z_off64_t off64_t +#else +# define z_off64_t z_off_t +#endif + +#if defined(__OS400__) +# define NO_vsnprintf +#endif + +#if defined(__MVS__) +# define NO_vsnprintf +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/plugins/snes9x_gx/portlibs/include/zip/ioapi.h b/plugins/snes9x_gx/portlibs/include/zip/ioapi.h new file mode 100644 index 00000000..7d457baa --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/zip/ioapi.h @@ -0,0 +1,75 @@ +/* ioapi.h -- IO base function header for compress/uncompress .zip + files using zlib + zip or unzip API + + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant +*/ + +#ifndef _ZLIBIOAPI_H +#define _ZLIBIOAPI_H + + +#define ZLIB_FILEFUNC_SEEK_CUR (1) +#define ZLIB_FILEFUNC_SEEK_END (2) +#define ZLIB_FILEFUNC_SEEK_SET (0) + +#define ZLIB_FILEFUNC_MODE_READ (1) +#define ZLIB_FILEFUNC_MODE_WRITE (2) +#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3) + +#define ZLIB_FILEFUNC_MODE_EXISTING (4) +#define ZLIB_FILEFUNC_MODE_CREATE (8) + + +#ifndef ZCALLBACK + +#if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) +#define ZCALLBACK CALLBACK +#else +#define ZCALLBACK +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode)); +typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size)); +typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); +typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream)); +typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); +typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream)); +typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); + +typedef struct zlib_filefunc_def_s +{ + open_file_func zopen_file; + read_file_func zread_file; + write_file_func zwrite_file; + tell_file_func ztell_file; + seek_file_func zseek_file; + close_file_func zclose_file; + testerror_file_func zerror_file; + voidpf opaque; +} zlib_filefunc_def; + + + +void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); + +#define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size)) +#define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size)) +#define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream)) +#define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode)) +#define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream)) +#define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream)) + + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/plugins/snes9x_gx/portlibs/include/zip/unzip.h b/plugins/snes9x_gx/portlibs/include/zip/unzip.h new file mode 100644 index 00000000..c3206a05 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/zip/unzip.h @@ -0,0 +1,354 @@ +/* unzip.h -- IO for uncompress .zip files using zlib + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant + + This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g + WinZip, InfoZip tools and compatible. + + Multi volume ZipFile (span) are not supported. + Encryption compatible with pkzip 2.04g only supported + Old compressions used by old PKZip 1.x are not supported + + + I WAIT FEEDBACK at mail info@winimage.com + Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution + + Condition of use and distribution are the same than zlib : + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + +*/ + +/* for more info about .ZIP format, see + http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip + http://www.info-zip.org/pub/infozip/doc/ + PkWare has also a specification at : + ftp://ftp.pkware.com/probdesc.zip +*/ + +#ifndef _unz_H +#define _unz_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _ZLIB_H +#include "zlib.h" +#endif + +#ifndef _ZLIBIOAPI_H +#include "ioapi.h" +#endif + +#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) +/* like the STRICT of WIN32, we define a pointer that cannot be converted + from (void*) without cast */ +typedef struct TagunzFile__ { int unused; } unzFile__; +typedef unzFile__ *unzFile; +#else +typedef voidp unzFile; +#endif + + +#define UNZ_OK (0) +#define UNZ_END_OF_LIST_OF_FILE (-100) +#define UNZ_ERRNO (Z_ERRNO) +#define UNZ_EOF (0) +#define UNZ_PARAMERROR (-102) +#define UNZ_BADZIPFILE (-103) +#define UNZ_INTERNALERROR (-104) +#define UNZ_CRCERROR (-105) + +/* tm_unz contain date/time info */ +typedef struct tm_unz_s +{ + uInt tm_sec; /* seconds after the minute - [0,59] */ + uInt tm_min; /* minutes after the hour - [0,59] */ + uInt tm_hour; /* hours since midnight - [0,23] */ + uInt tm_mday; /* day of the month - [1,31] */ + uInt tm_mon; /* months since January - [0,11] */ + uInt tm_year; /* years - [1980..2044] */ +} tm_unz; + +/* unz_global_info structure contain global data about the ZIPfile + These data comes from the end of central dir */ +typedef struct unz_global_info_s +{ + uLong number_entry; /* total number of entries in + the central dir on this disk */ + uLong size_comment; /* size of the global comment of the zipfile */ +} unz_global_info; + + +/* unz_file_info contain information about a file in the zipfile */ +typedef struct unz_file_info_s +{ + uLong version; /* version made by 2 bytes */ + uLong version_needed; /* version needed to extract 2 bytes */ + uLong flag; /* general purpose bit flag 2 bytes */ + uLong compression_method; /* compression method 2 bytes */ + uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ + uLong crc; /* crc-32 4 bytes */ + uLong compressed_size; /* compressed size 4 bytes */ + uLong uncompressed_size; /* uncompressed size 4 bytes */ + uLong size_filename; /* filename length 2 bytes */ + uLong size_file_extra; /* extra field length 2 bytes */ + uLong size_file_comment; /* file comment length 2 bytes */ + + uLong disk_num_start; /* disk number start 2 bytes */ + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ + + tm_unz tmu_date; +} unz_file_info; + +extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, + const char* fileName2, + int iCaseSensitivity)); +/* + Compare two filename (fileName1,fileName2). + If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + or strcasecmp) + If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + (like 1 on Unix, 2 on Windows) +*/ + + +extern unzFile ZEXPORT unzOpen OF((const char *path)); +/* + Open a Zip file. path contain the full pathname (by example, + on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer + "zlib/zlib113.zip". + If the zipfile cannot be opened (file don't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. +*/ + +extern unzFile ZEXPORT unzOpen2 OF((const char *path, + zlib_filefunc_def* pzlib_filefunc_def)); +/* + Open a Zip file, like unzOpen, but provide a set of file low level API + for read/write the zip file (see ioapi.h) +*/ + +extern int ZEXPORT unzClose OF((unzFile file)); +/* + Close a ZipFile opened with unzipOpen. + If there is files inside the .Zip opened with unzOpenCurrentFile (see later), + these files MUST be closed with unzipCloseCurrentFile before call unzipClose. + return UNZ_OK if there is no problem. */ + +extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, + unz_global_info *pglobal_info)); +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. */ + + +extern int ZEXPORT unzGetGlobalComment OF((unzFile file, + char *szComment, + uLong uSizeBuf)); +/* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 +*/ + + +/***************************************************************************/ +/* Unzip package allow you browse the directory of the zipfile */ + +extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); +/* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem +*/ + +extern int ZEXPORT unzGoToNextFile OF((unzFile file)); +/* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. +*/ + +extern int ZEXPORT unzLocateFile OF((unzFile file, + const char *szFileName, + int iCaseSensitivity)); +/* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found +*/ + + +/* ****************************************** */ +/* Ryan supplied functions */ +/* unz_file_info contain information about a file in the zipfile */ +typedef struct unz_file_pos_s +{ + uLong pos_in_zip_directory; /* offset in zip file directory */ + uLong num_of_file; /* # of file */ +} unz_file_pos; + +extern int ZEXPORT unzGetFilePos( + unzFile file, + unz_file_pos* file_pos); + +extern int ZEXPORT unzGoToFilePos( + unzFile file, + unz_file_pos* file_pos); + +/* ****************************************** */ + +extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, + unz_file_info *pfile_info, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); +/* + Get Info about the current file + if pfile_info!=NULL, the *pfile_info structure will contain somes info about + the current file + if szFileName!=NULL, the filemane string will be copied in szFileName + (fileNameBufferSize is the size of the buffer) + if extraField!=NULL, the extra field information will be copied in extraField + (extraFieldBufferSize is the size of the buffer). + This is the Central-header version of the extra field + if szComment!=NULL, the comment string of the file will be copied in szComment + (commentBufferSize is the size of the buffer) +*/ + +/***************************************************************************/ +/* for reading the content of the current zipfile, you can open it, read data + from it, and close it (you can close it before reading all the file) + */ + +extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); +/* + Open for reading data the current file in the zipfile. + If there is no error, the return value is UNZ_OK. +*/ + +extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, + const char* password)); +/* + Open for reading data the current file in the zipfile. + password is a crypting password + If there is no error, the return value is UNZ_OK. +*/ + +extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, + int* method, + int* level, + int raw)); +/* + Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) + if raw==1 + *method will receive method of compression, *level will receive level of + compression + note : you can set level parameter as NULL (if you did not want known level, + but you CANNOT set method parameter as NULL +*/ + +extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, + int* method, + int* level, + int raw, + const char* password)); +/* + Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) + if raw==1 + *method will receive method of compression, *level will receive level of + compression + note : you can set level parameter as NULL (if you did not want known level, + but you CANNOT set method parameter as NULL +*/ + + +extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); +/* + Close the file in zip opened with unzOpenCurrentFile + Return UNZ_CRCERROR if all the file was read but the CRC is not good +*/ + +extern int ZEXPORT unzReadCurrentFile OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read bytes from the current file (opened by unzOpenCurrentFile) + buf contain buffer where data must be copied + len the size of buf. + + return the number of byte copied if somes bytes are copied + return 0 if the end of file was reached + return <0 with error code if there is an error + (UNZ_ERRNO for IO error, or zLib error for uncompress error) +*/ + +extern z_off_t ZEXPORT unztell OF((unzFile file)); +/* + Give the current position in uncompressed data +*/ + +extern int ZEXPORT unzeof OF((unzFile file)); +/* + return 1 if the end of file was reached, 0 elsewhere +*/ + +extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read extra field from the current file (opened by unzOpenCurrentFile) + This is the local-header version of the extra field (sometimes, there is + more info in the local-header version than in the central-header) + + if buf==NULL, it return the size of the local extra field + + if buf!=NULL, len is the size of the buffer, the extra header is copied in + buf. + the return value is the number of bytes copied in buf, or (if <0) + the error code +*/ + +/***************************************************************************/ + +/* Get the current file offset */ +extern uLong ZEXPORT unzGetOffset (unzFile file); + +/* Set the current file offset */ +extern int ZEXPORT unzSetOffset (unzFile file, uLong pos); + + + +#ifdef __cplusplus +} +#endif + +#endif /* _unz_H */ diff --git a/plugins/snes9x_gx/portlibs/include/zip/zip.h b/plugins/snes9x_gx/portlibs/include/zip/zip.h new file mode 100644 index 00000000..acacce83 --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/zip/zip.h @@ -0,0 +1,235 @@ +/* zip.h -- IO for compress .zip files using zlib + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant + + This unzip package allow creates .ZIP file, compatible with PKZip 2.04g + WinZip, InfoZip tools and compatible. + Multi volume ZipFile (span) are not supported. + Encryption compatible with pkzip 2.04g only supported + Old compressions used by old PKZip 1.x are not supported + + For uncompress .zip file, look at unzip.h + + + I WAIT FEEDBACK at mail info@winimage.com + Visit also http://www.winimage.com/zLibDll/unzip.html for evolution + + Condition of use and distribution are the same than zlib : + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + +*/ + +/* for more info about .ZIP format, see + http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip + http://www.info-zip.org/pub/infozip/doc/ + PkWare has also a specification at : + ftp://ftp.pkware.com/probdesc.zip +*/ + +#ifndef _zip_H +#define _zip_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _ZLIB_H +#include "zlib.h" +#endif + +#ifndef _ZLIBIOAPI_H +#include "ioapi.h" +#endif + +#if defined(STRICTZIP) || defined(STRICTZIPUNZIP) +/* like the STRICT of WIN32, we define a pointer that cannot be converted + from (void*) without cast */ +typedef struct TagzipFile__ { int unused; } zipFile__; +typedef zipFile__ *zipFile; +#else +typedef voidp zipFile; +#endif + +#define ZIP_OK (0) +#define ZIP_EOF (0) +#define ZIP_ERRNO (Z_ERRNO) +#define ZIP_PARAMERROR (-102) +#define ZIP_BADZIPFILE (-103) +#define ZIP_INTERNALERROR (-104) + +#ifndef DEF_MEM_LEVEL +# if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +# else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +# endif +#endif +/* default memLevel */ + +/* tm_zip contain date/time info */ +typedef struct tm_zip_s +{ + uInt tm_sec; /* seconds after the minute - [0,59] */ + uInt tm_min; /* minutes after the hour - [0,59] */ + uInt tm_hour; /* hours since midnight - [0,23] */ + uInt tm_mday; /* day of the month - [1,31] */ + uInt tm_mon; /* months since January - [0,11] */ + uInt tm_year; /* years - [1980..2044] */ +} tm_zip; + +typedef struct +{ + tm_zip tmz_date; /* date in understandable format */ + uLong dosDate; /* if dos_date == 0, tmu_date is used */ +/* uLong flag; */ /* general purpose bit flag 2 bytes */ + + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ +} zip_fileinfo; + +typedef const char* zipcharpc; + + +#define APPEND_STATUS_CREATE (0) +#define APPEND_STATUS_CREATEAFTER (1) +#define APPEND_STATUS_ADDINZIP (2) + +extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append)); +/* + Create a zipfile. + pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on + an Unix computer "zlib/zlib113.zip". + if the file pathname exist and append==APPEND_STATUS_CREATEAFTER, the zip + will be created at the end of the file. + (useful if the file contain a self extractor code) + if the file pathname exist and append==APPEND_STATUS_ADDINZIP, we will + add files in existing zip (be sure you don't add file that doesn't exist) + If the zipfile cannot be opened, the return value is NULL. + Else, the return value is a zipFile Handle, usable with other function + of this zip package. +*/ + +/* Note : there is no delete function into a zipfile. + If you want delete file into a zipfile, you must open a zipfile, and create another + Of couse, you can use RAW reading and writing to copy the file you did not want delte +*/ + +extern zipFile ZEXPORT zipOpen2 OF((const char *pathname, + int append, + zipcharpc* globalcomment, + zlib_filefunc_def* pzlib_filefunc_def)); + +extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level)); +/* + Open a file in the ZIP for writing. + filename : the filename in zip (if NULL, '-' without quote will be used + *zipfi contain supplemental information + if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local + contains the extrafield data the the local header + if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global + contains the extrafield data the the local header + if comment != NULL, comment contain the comment string + method contain the compression method (0 for store, Z_DEFLATED for deflate) + level contain the level of compression (can be Z_DEFAULT_COMPRESSION) +*/ + + +extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw)); + +/* + Same than zipOpenNewFileInZip, except if raw=1, we write raw file + */ + +extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCtypting)); + +/* + Same than zipOpenNewFileInZip2, except + windowBits,memLevel,,strategy : see parameter strategy in deflateInit2 + password : crypting password (NULL for no crypting) + crcForCtypting : crc of file to compress (needed for crypting) + */ + + +extern int ZEXPORT zipWriteInFileInZip OF((zipFile file, + const void* buf, + unsigned len)); +/* + Write data in the zipfile +*/ + +extern int ZEXPORT zipCloseFileInZip OF((zipFile file)); +/* + Close the current file in the zipfile +*/ + +extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file, + uLong uncompressed_size, + uLong crc32)); +/* + Close the current file in the zipfile, for fiel opened with + parameter raw=1 in zipOpenNewFileInZip2 + uncompressed_size and crc32 are value for the uncompressed size +*/ + +extern int ZEXPORT zipClose OF((zipFile file, + const char* global_comment)); +/* + Close the zipfile +*/ + +#ifdef __cplusplus +} +#endif + +#endif /* _zip_H */ diff --git a/plugins/snes9x_gx/portlibs/include/zlib.h b/plugins/snes9x_gx/portlibs/include/zlib.h new file mode 100644 index 00000000..bfbba83e --- /dev/null +++ b/plugins/snes9x_gx/portlibs/include/zlib.h @@ -0,0 +1,1613 @@ +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.5, April 19th, 2010 + + Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt + (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). +*/ + +#ifndef ZLIB_H +#define ZLIB_H + +#include "zconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.2.5" +#define ZLIB_VERNUM 0x1250 +#define ZLIB_VER_MAJOR 1 +#define ZLIB_VER_MINOR 2 +#define ZLIB_VER_REVISION 5 +#define ZLIB_VER_SUBREVISION 0 + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed data. + This version of the library supports only one compression method (deflation) + but other algorithms will be added later and will have the same stream + interface. + + Compression can be done in a single step if the buffers are large enough, + or can be done by repeated calls of the compression function. In the latter + case, the application must provide more input and/or consume the output + (providing more output space) before each call. + + The compressed data format used by default by the in-memory functions is + the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped + around a deflate stream, which is itself documented in RFC 1951. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio using the functions that start + with "gz". The gzip format is different from the zlib format. gzip is a + gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. + + This library can optionally read and write gzip streams in memory as well. + + The zlib format was designed to be compact and fast for use in memory + and on communications channels. The gzip format was designed for single- + file compression on file systems, has a larger header than zlib to maintain + directory information, and uses a different, slower check method than zlib. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never crash + even in case of corrupted input. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void (*free_func) OF((voidpf opaque, voidpf address)); + +struct internal_state; + +typedef struct z_stream_s { + Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total nb of input bytes read so far */ + + Bytef *next_out; /* next output byte should be put there */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total nb of bytes output so far */ + + char *msg; /* last error message, NULL if no error */ + struct internal_state FAR *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: binary or text */ + uLong adler; /* adler32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + gzip header information passed to and from zlib routines. See RFC 1952 + for more details on the meanings of these fields. +*/ +typedef struct gz_header_s { + int text; /* true if compressed data believed to be text */ + uLong time; /* modification time */ + int xflags; /* extra flags (not used when writing a gzip file) */ + int os; /* operating system */ + Bytef *extra; /* pointer to extra field or Z_NULL if none */ + uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ + uInt extra_max; /* space at extra (only when reading header) */ + Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ + uInt name_max; /* space at name (only when reading header) */ + Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ + uInt comm_max; /* space at comment (only when reading header) */ + int hcrc; /* true if there was or will be a header crc */ + int done; /* true when done reading gzip header (not used + when writing a gzip file) */ +} gz_header; + +typedef gz_header FAR *gz_headerp; + +/* + The application must update next_in and avail_in when avail_in has dropped + to zero. It must update next_out and avail_out when avail_out has dropped + to zero. The application must initialize zalloc, zfree and opaque before + calling the init function. All other fields are set by the compression + library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this if + the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers + returned by zalloc for objects of exactly 65536 bytes *must* have their + offset normalized to zero. The default allocation function provided by this + library ensures this (see zutil.c). To reduce memory requirements and avoid + any allocation of 64K objects, at the expense of compression ratio, compile + the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or progress + reports. After compression, total_in holds the total size of the + uncompressed data and may be saved for use in the decompressor (particularly + if the decompressor wants to decompress everything in a single step). +*/ + + /* constants */ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +#define Z_BLOCK 5 +#define Z_TREES 6 +/* Allowed flush values; see deflate() and inflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_RLE 3 +#define Z_FIXED 4 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_TEXT 1 +#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ +#define Z_UNKNOWN 2 +/* Possible values of the data_type field (though see inflate()) */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + +#define zlib_version zlibVersion() +/* for compatibility with versions < 1.0.2 */ + + + /* basic functions */ + +ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is not + compatible with the zlib.h header file used by the application. This check + is automatically made by deflateInit and inflateInit. + */ + +/* +ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. If + zalloc and zfree are set to Z_NULL, deflateInit updates them to use default + allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at all + (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION + requests a default compromise between speed and compression (currently + equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if level is not a valid compression level, or + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). msg is set to null + if there is no error message. deflateInit does not perform any compression: + this will be done by deflate(). +*/ + + +ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary (in interactive applications). Some + output may be provided even if flush is not set. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating avail_in or avail_out accordingly; avail_out should + never be zero before the call. The application can consume the compressed + output when it wants, for example when the output buffer is full (avail_out + == 0), or after each call of deflate(). If deflate returns Z_OK and with + zero avail_out, it must be called again after making room in the output + buffer because there might be more output pending. + + Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to + decide how much data to accumulate before producing output, in order to + maximize compression. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In + particular avail_in is zero after the call if enough output space has been + provided before the call.) Flushing may degrade compression for some + compression algorithms and so it should be used only when necessary. This + completes the current deflate block and follows it with an empty stored block + that is three bits plus filler bits to the next byte, followed by four bytes + (00 00 ff ff). + + If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the + output buffer, but the output is not aligned to a byte boundary. All of the + input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. + This completes the current deflate block and follows it with an empty fixed + codes block that is 10 bits long. This assures that enough bytes are output + in order for the decompressor to finish the block before the empty fixed code + block. + + If flush is set to Z_BLOCK, a deflate block is completed and emitted, as + for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to + seven bits of the current block are held to be written as the next byte after + the next deflate block is completed. In this case, the decompressor may not + be provided enough bits at this point in order to complete decompression of + the data provided so far to the compressor. It may need to wait for the next + block to be emitted. This is for advanced applications that need to control + the emission of deflate blocks. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out is greater than six to avoid repeated flush markers due to + avail_out == 0 on return. + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there was + enough output space; if deflate returns with Z_OK, this function must be + called again with Z_FINISH and more output space (updated avail_out) but no + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the stream + are deflateReset or deflateEnd. + + Z_FINISH can be used immediately after deflateInit if all the compression + is to be done in a single step. In this case, avail_out must be at least the + value returned by deflateBound (see below). If deflate does not return + Z_STREAM_END, then it must be called again as described above. + + deflate() sets strm->adler to the adler32 checksum of all input read + so far (that is, total_in bytes). + + deflate() may update strm->data_type if it can make a good guess about + the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered + binary. This field is only for information purposes and does not affect the + compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not + fatal, and deflate() can be called again with more input and more output + space to continue compressing. +*/ + + +ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, msg + may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. If next_in is not Z_NULL and avail_in is large enough (the + exact value depends on the compression method), inflateInit determines the + compression method from the zlib header and allocates all data structures + accordingly; otherwise the allocation will be deferred to the first call of + inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to + use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit() does not process any header information -- that is deferred + until inflate() is called. +*/ + + +ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing will + resume at this point for the next call of inflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there is + no more input data or no more space in the output buffer (see below about + the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating the next_* and avail_* values accordingly. The + application can consume the uncompressed output when it wants, for example + when the output buffer is full (avail_out == 0), or after each call of + inflate(). If inflate returns Z_OK and with zero avail_out, it must be + called again after making room in the output buffer because there might be + more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, + Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() + stop if and when it gets to the next deflate block boundary. When decoding + the zlib or gzip format, this will cause inflate() to return immediately + after the header and before the first block. When doing a raw inflate, + inflate() will go ahead and process the first block, and will return when it + gets to the end of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + Also to assist in this, on return inflate() will set strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 if + inflate() is currently decoding the last block in the deflate stream, plus + 128 if inflate() returned immediately after decoding an end-of-block code or + decoding the complete header up to just before the first byte of the deflate + stream. The end-of-block will not be indicated until all of the uncompressed + data from that block has been written to strm->next_out. The number of + unused bits may in general be greater than seven, except when bit 7 of + data_type is set, in which case the number of unused bits will be less than + eight. data_type is set as noted here every time inflate() returns for all + flush options, and so can be used to determine the amount of currently + consumed input in bits. + + The Z_TREES option behaves as Z_BLOCK does, but it also returns when the + end of each deflate block header is reached, before any actual data in that + block is decoded. This allows the caller to determine the length of the + deflate block header for later use in random access within a deflate block. + 256 is added to the value of strm->data_type when inflate() returns + immediately after reaching the end of the deflate block header. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step (a + single call of inflate), the parameter flush should be set to Z_FINISH. In + this case all pending input is processed and all pending output is flushed; + avail_out must be large enough to hold all the uncompressed data. (The size + of the uncompressed data may have been saved by the compressor for this + purpose.) The next operation on this stream must be inflateEnd to deallocate + the decompression state. The use of Z_FINISH is never required, but can be + used to inform inflate that a faster approach may be used for the single + inflate() call. + + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the only effect of the flush parameter in this implementation + is on the return value of inflate(), as noted below, or when it returns early + because Z_BLOCK or Z_TREES is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm->adler to the adler32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the adler32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed adler32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() can decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically, if requested when + initializing with inflateInit2(). Any information contained in the gzip + header is not retained, so applications that need that information should + instead use raw inflate, see inflateInit2() below, or inflateBack() and + perform their own processing of the gzip header and trailer. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect check + value), Z_STREAM_ERROR if the stream structure was inconsistent (for example + next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory, + Z_BUF_ERROR if no progress is possible or if there was not enough room in the + output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may + then call inflateSync() to look for a good compression block if a partial + recovery of the data is desired. +*/ + + +ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state + was inconsistent. In the error case, msg may be set but then points to a + static string (which must not be deallocated). +*/ + + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* +ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by the + caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data + with no zlib header or trailer, and will not compute an adler32 check value. + + windowBits can also be greater than 15 for optional gzip encoding. Add + 16 to windowBits to write a simple gzip header and trailer around the + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), no + header crc, and the operating system will be set to 255 (unknown). If a + gzip stream is being written, strm->adler is a crc32 instead of an adler32. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but is + slow and reduces compression ratio; memLevel=9 uses maximum memory for + optimal speed. The default value is 8. See zconf.h for total memory usage + as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match), or Z_RLE to limit match distances to one (run-length + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman + coding and less string matching; it is somewhat intermediate between + Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as + fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The + strategy parameter only affects the compression ratio but not the + correctness of the compressed output even if it is not set appropriately. + Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler + decoder for special applications. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid + method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is + incompatible with the version assumed by the caller (ZLIB_VERSION). msg is + set to null if there is no error message. deflateInit2 does not perform any + compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. This function must be called + immediately after deflateInit, deflateInit2 or deflateReset, before any call + of deflate. The compressor and decompressor must use exactly the same + dictionary (see inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size + provided in deflateInit or deflateInit2. Thus the strings most likely to be + useful should be put at the end of the dictionary, not at the front. In + addition, the current implementation of deflate will use at most the window + size minus 262 bytes of the provided dictionary. + + Upon return of this function, strm->adler is set to the adler32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The adler32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) If a raw deflate was requested, then the + adler32 value is not computed and strm->adler is not set. + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if the compression method is bsort). deflateSetDictionary does not + perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and can + consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +/* + This function is equivalent to deflateEnd followed by deflateInit, + but does not free and reallocate all the internal compression state. The + stream will keep the same compression level and any other attributes that + may have been set by deflateInit2. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, + int level, + int strategy)); +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2. This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different strategy. + If the compression level is changed, the input available so far is + compressed with the old level (and may be flushed); the new level will take + effect only at the next call of deflate(). + + Before the call of deflateParams, the stream state must be set as for + a call of deflate(), since the currently available input may have to be + compressed and flushed. In particular, strm->avail_out must be non-zero. + + deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if + strm->avail_out was zero. +*/ + +ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain)); +/* + Fine tune deflate's internal compression parameters. This should only be + used by someone who understands the algorithm used by zlib's deflate for + searching for the best matching string, and even then only by the most + fanatic optimizer trying to squeeze out the last compressed bit for their + specific input data. Read the deflate.c source code for the meaning of the + max_lazy, good_length, nice_length, and max_chain parameters. + + deflateTune() can be called after deflateInit() or deflateInit2(), and + returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. + */ + +ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, + uLong sourceLen)); +/* + deflateBound() returns an upper bound on the compressed size after + deflation of sourceLen bytes. It must be called after deflateInit() or + deflateInit2(), and after deflateSetHeader(), if used. This would be used + to allocate an output buffer for deflation in a single pass, and so would be + called before deflate(). +*/ + +ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + deflatePrime() inserts bits in the deflate output stream. The intent + is that this function is used to start off the deflate output with the bits + leftover from a previous deflate stream when appending to it. As such, this + function can only be used for raw deflate, and must be used before the first + deflate() call after a deflateInit2() or deflateReset(). bits must be less + than or equal to 16, and that many of the least significant bits of value + will be inserted in the output. + + deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, + gz_headerp head)); +/* + deflateSetHeader() provides gzip header information for when a gzip + stream is requested by deflateInit2(). deflateSetHeader() may be called + after deflateInit2() or deflateReset() and before the first call of + deflate(). The text, time, os, extra field, name, and comment information + in the provided gz_header structure are written to the gzip header (xflag is + ignored -- the extra flags are set according to the compression level). The + caller must assure that, if not Z_NULL, name and comment are terminated with + a zero byte, and that if extra is not Z_NULL, that extra_len bytes are + available there. If hcrc is true, a gzip header crc is included. Note that + the current versions of the command-line version of gzip (up through version + 1.3.x) do not support header crc's, and will report that it is a "multi-part + gzip file" and give up. + + If deflateSetHeader is not used, the default gzip header has text false, + the time set to zero, and os set to 255, with no extra, name, or comment + fields. The gzip header is returned to the default state by deflateReset(). + + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be zero to request that inflate use the window size in + the zlib header of the compressed stream. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an adler32 or a crc32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a + crc32 instead of an adler32. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit2 does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit2() does not process any header information -- that is + deferred until inflate() is called. +*/ + +ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the adler32 value returned by that call of inflate. + The compressor and decompressor must use exactly the same dictionary (see + deflateSetDictionary). For raw inflate, this function can be called + immediately after inflateInit2() or inflateReset() and before any call of + inflate() to set the dictionary. The application must insure that the + dictionary that was used for compression is provided. + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect adler32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +/* + Skips invalid compressed data until a full flush point (see above the + description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR + if no more input was provided, Z_DATA_ERROR if no flush point has been + found, or Z_STREAM_ERROR if the stream structure was inconsistent. In the + success case, the application may save the current current value of total_in + which indicates where valid compressed data was found. In the error case, + the application may repeatedly call inflateSync, providing more input each + time, until success or end of the input data. +*/ + +ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when randomly accessing a large stream. The + first pass through the stream can periodically record the inflate state, + allowing restarting inflate at those points when randomly accessing the + stream. + + inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate all the internal decompression state. The + stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, + int windowBits)); +/* + This function is the same as inflateReset, but it also permits changing + the wrap and window size requests. The windowBits parameter is interpreted + the same as it is for inflateInit2. + + inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL), or if + the windowBits parameter is invalid. +*/ + +ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + This function inserts bits in the inflate input stream. The intent is + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. + + If bits is negative, then the input stream bit buffer is emptied. Then + inflatePrime() can be called again to put bits in the buffer. This is used + to clear out bits leftover after feeding inflate a block description prior + to feeding inflate codes. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); +/* + This function returns two values, one in the lower 16 bits of the return + value, and the other in the remaining upper bits, obtained by shifting the + return value down 16 bits. If the upper value is -1 and the lower value is + zero, then inflate() is currently decoding information outside of a block. + If the upper value is -1 and the lower value is non-zero, then inflate is in + the middle of a stored block, with the lower value equaling the number of + bytes from the input remaining to copy. If the upper value is not -1, then + it is the number of bits back from the current bit position in the input of + the code (literal or length/distance pair) currently being processed. In + that case the lower value is the number of bytes already emitted for that + code. + + A code is being processed if inflate is waiting for more input to complete + decoding of the code, or if it has completed decoding but is waiting for + more output space to write the literal or match data. + + inflateMark() is used to mark locations in the input data for random + access, which may be at bit positions, and to note those cases where the + output of a code may span boundaries of random access blocks. The current + location in the input stream can be determined from avail_in and data_type + as noted in the description for the Z_BLOCK flush parameter for inflate. + + inflateMark returns the value noted above or -1 << 16 if the provided + source stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, + gz_headerp head)); +/* + inflateGetHeader() requests that gzip header information be stored in the + provided gz_header structure. inflateGetHeader() may be called after + inflateInit2() or inflateReset(), and before the first call of inflate(). + As inflate() processes the gzip stream, head->done is zero until the header + is completed, at which time head->done is set to one. If a zlib stream is + being decoded, then head->done is set to -1 to indicate that there will be + no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be + used to force inflate() to return immediately after header processing is + complete and before any actual data is decompressed. + + The text, time, xflags, and os fields are filled in with the gzip header + contents. hcrc is set to true if there is a header CRC. (The header CRC + was valid if done is set to one.) If extra is not Z_NULL, then extra_max + contains the maximum number of bytes to write to extra. Once done is true, + extra_len contains the actual extra field length, and extra contains the + extra field, or that field truncated if extra_max is less than extra_len. + If name is not Z_NULL, then up to name_max characters are written there, + terminated with a zero unless the length is greater than name_max. If + comment is not Z_NULL, then up to comm_max characters are written there, + terminated with a zero unless the length is greater than comm_max. When any + of extra, name, or comment are not Z_NULL and the respective field is not + present in the header, then that field is set to Z_NULL to signal its + absence. This allows the use of deflateSetHeader() with the returned + structure to duplicate the header. However if those fields are set to + allocated memory, then the application will need to save those pointers + elsewhere so that they can be eventually freed. + + If inflateGetHeader is not used, then the header information is simply + discarded. The header is always checked for validity, including the header + CRC if present. inflateReset() will reset the process to discard the header + information. The application would need to call inflateGetHeader() again to + retrieve the header from the next gzip stream. + + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, + unsigned char FAR *window)); + + Initialize the internal stream state for decompression using inflateBack() + calls. The fields zalloc, zfree and opaque in strm must be initialized + before the call. If zalloc and zfree are Z_NULL, then the default library- + derived memory allocation routines are used. windowBits is the base two + logarithm of the window size, in the range 8..15. window is a caller + supplied buffer of that size. Except for special applications where it is + assured that deflate was used with small window sizes, windowBits must be 15 + and a 32K byte window must be supplied to be able to decompress general + deflate streams. + + See inflateBack() for the usage of these routines. + + inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of + the paramaters are invalid, Z_MEM_ERROR if the internal state could not be + allocated, or Z_VERSION_ERROR if the version of the library does not match + the version of the header file. +*/ + +typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); +typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); + +ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +/* + inflateBack() does a raw inflate with a single call using a call-back + interface for input and output. This is more efficient than inflate() for + file i/o applications in that it avoids copying between the output and the + sliding window by simply making the window itself the output buffer. This + function trusts the application to not change the output buffer passed by + the output function, at least until inflateBack() returns. + + inflateBackInit() must be called first to allocate the internal state + and to initialize the state with the user-provided window buffer. + inflateBack() may then be used multiple times to inflate a complete, raw + deflate stream with each call. inflateBackEnd() is then called to free the + allocated state. + + A raw deflate stream is one with no zlib or gzip header or trailer. + This routine would normally be used in a utility that reads zip or gzip + files and writes out uncompressed files. The utility would decode the + header and process the trailer on its own, hence this routine expects only + the raw deflate stream to decompress. This is different from the normal + behavior of inflate(), which expects either a zlib or gzip header and + trailer around the deflate stream. + + inflateBack() uses two subroutines supplied by the caller that are then + called by inflateBack() for input and output. inflateBack() calls those + routines until it reads a complete deflate stream and writes out all of the + uncompressed data, or until it encounters an error. The function's + parameters and return types are defined above in the in_func and out_func + typedefs. inflateBack() will call in(in_desc, &buf) which should return the + number of bytes of provided input, and a pointer to that input in buf. If + there is no input available, in() must return zero--buf is ignored in that + case--and inflateBack() will return a buffer error. inflateBack() will call + out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() + should return zero on success, or non-zero on failure. If out() returns + non-zero, inflateBack() will return with an error. Neither in() nor out() + are permitted to change the contents of the window provided to + inflateBackInit(), which is also the buffer that out() uses to write from. + The length written by out() will be at most the window size. Any non-zero + amount of input may be provided by in(). + + For convenience, inflateBack() can be provided input on the first call by + setting strm->next_in and strm->avail_in. If that input is exhausted, then + in() will be called. Therefore strm->next_in must be initialized before + calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called + immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in + must also be initialized, and then if strm->avail_in is not zero, input will + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + + The in_desc and out_desc parameters of inflateBack() is passed as the + first parameter of in() and out() respectively when they are called. These + descriptors can be optionally used to pass any information that the caller- + supplied in() and out() functions need to do their job. + + On return, inflateBack() will set strm->next_in and strm->avail_in to + pass back any unused input that was provided by the last in() call. The + return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR + if in() or out() returned an error, Z_DATA_ERROR if there was a format error + in the deflate stream (in which case strm->msg is set to indicate the nature + of the error), or Z_STREAM_ERROR if the stream was not properly initialized. + In the case of Z_BUF_ERROR, an input or output error can be distinguished + using strm->next_in which will be Z_NULL only if in() returned an error. If + strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning + non-zero. (in() will always be called before out(), so strm->next_in is + assured to be defined if out() returns non-zero.) Note that inflateBack() + cannot return Z_OK. +*/ + +ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +/* + All memory allocated by inflateBackInit() is freed. + + inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream + state was inconsistent. +*/ + +ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +/* Return flags indicating compile-time options. + + Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: + 1.0: size of uInt + 3.2: size of uLong + 5.4: size of voidpf (pointer) + 7.6: size of z_off_t + + Compiler, assembler, and debug options: + 8: DEBUG + 9: ASMV or ASMINF -- use ASM code + 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention + 11: 0 (reserved) + + One-time table building (smaller code, but not thread-safe if true): + 12: BUILDFIXED -- build static block decoding tables when needed + 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed + 14,15: 0 (reserved) + + Library content (indicates missing functionality): + 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking + deflate code when not needed) + 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect + and decode gzip streams (to avoid linking crc code) + 18-19: 0 (reserved) + + Operation variations (changes in library functionality): + 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate + 21: FASTEST -- deflate algorithm with only one, lowest compression level + 22,23: 0 (reserved) + + The sprintf variant used by gzprintf (zero is best): + 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + + Remainder: + 27-31: 0 (reserved) + */ + + + /* utility functions */ + +/* + The following utility functions are implemented on top of the basic + stream-oriented functions. To simplify the interface, some default options + are assumed (compression level and memory usage, standard memory allocation + functions). The source code of these utility functions can be modified if + you need special options. +*/ + +ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level)); +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +/* + compressBound() returns an upper bound on the compressed size after + compress() or compress2() on sourceLen bytes. It would be used before a + compress() or compress2() call to allocate the destination buffer. +*/ + +ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be large enough to hold the entire + uncompressed data. (The size of the uncompressed data must have been saved + previously by the compressor and transmitted to the decompressor by some + mechanism outside the scope of this compression library.) Upon exit, destLen + is the actual size of the uncompressed buffer. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. +*/ + + + /* gzip file access functions */ + +/* + This library supports reading and writing files in gzip (.gz) format with + an interface similar to that of stdio, using the functions that start with + "gz". The gzip format is different from the zlib format. gzip is a gzip + wrapper, documented in RFC 1952, wrapped around a deflate stream. +*/ + +typedef voidp gzFile; /* opaque gzip file descriptor */ + +/* +ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); + + Opens a gzip (.gz) file for reading or writing. The mode parameter is as + in fopen ("rb" or "wb") but can also include a compression level ("wb9") or + a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only + compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' + for fixed code compression as in "wb9F". (See the description of + deflateInit2 for more information about the strategy parameter.) Also "a" + can be used instead of "w" to request that the gzip stream that will be + written be appended to the file. "+" will result in an error, since reading + and writing to the same gzip file is not supported. + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. + + gzopen returns NULL if the file could not be opened, if there was + insufficient memory to allocate the gzFile state, or if an invalid mode was + specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). + errno can be checked to determine if the reason gzopen failed was that the + file could not be opened. +*/ + +ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +/* + gzdopen associates a gzFile with the file descriptor fd. File descriptors + are obtained from calls like open, dup, creat, pipe or fileno (if the file + has been previously opened with fopen). The mode parameter is as in gzopen. + + The next call of gzclose on the returned gzFile will also close the file + descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor + fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, + mode);. The duplicated descriptor should be saved to avoid a leak, since + gzdopen does not close fd if it fails. + + gzdopen returns NULL if there was insufficient memory to allocate the + gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not + provided, or '+' was provided), or if fd is -1. The file descriptor is not + used until the next gz* read, write, seek, or close operation, so gzdopen + will not detect if fd is invalid (unless fd is -1). +*/ + +ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); +/* + Set the internal buffer size used by this library's functions. The + default buffer size is 8192 bytes. This function must be called after + gzopen() or gzdopen(), and before any other calls that read or write the + file. The buffer memory allocation is always deferred to the first read or + write. Two buffers are allocated, either both of the specified size when + writing, or one of the specified size and the other twice that size when + reading. A larger buffer size of, for example, 64K or 128K bytes will + noticeably increase the speed of decompression (reading). + + The new buffer size also affects the maximum length for gzprintf(). + + gzbuffer() returns 0 on success, or -1 on failure, such as being called + too late. +*/ + +ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. + + gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not + opened for writing. +*/ + +ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +/* + Reads the given number of uncompressed bytes from the compressed file. If + the input file was not in gzip format, gzread copies the given number of + bytes into the buffer. + + After reaching the end of a gzip stream in the input, gzread will continue + to read, looking for another gzip stream, or failing that, reading the rest + of the input file directly without decompression. The entire input file + will be read if gzread is called until it returns less than the requested + len. + + gzread returns the number of uncompressed bytes actually read, less than + len for end of file, or -1 for error. +*/ + +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, + voidpc buf, unsigned len)); +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes written or 0 in case of + error. +*/ + +ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); +/* + Converts, formats, and writes the arguments to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written, or 0 in case of error. The number of + uncompressed bytes written is limited to 8191, or one less than the buffer + size given to gzbuffer(). The caller should assure that this limit is not + exceeded. If it is exceeded, then gzprintf() will return an error (0) with + nothing written. In this case, there may also be a buffer overflow with + unpredictable consequences, which is possible only if zlib was compiled with + the insecure functions sprintf() or vsprintf() because the secure snprintf() + or vsnprintf() functions were not available. This can be determined using + zlibCompileFlags(). +*/ + +ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + + gzputs returns the number of characters written, or -1 in case of error. +*/ + +ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +/* + Reads bytes from the compressed file until len-1 characters are read, or a + newline character is read and transferred to buf, or an end-of-file + condition is encountered. If any characters are read or if len == 1, the + string is terminated with a null character. If no characters are read due + to an end-of-file or len < 1, then the buffer is left untouched. + + gzgets returns buf which is a null-terminated string, or it returns NULL + for end-of-file or in case of error. If there was an error, the contents at + buf are indeterminate. +*/ + +ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +/* + Writes c, converted to an unsigned char, into the compressed file. gzputc + returns the value that was written, or -1 in case of error. +*/ + +ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +/* + Reads one byte from the compressed file. gzgetc returns this byte or -1 + in case of end of file or error. +*/ + +ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +/* + Push one character back onto the stream to be read as the first character + on the next read. At least one character of push-back is allowed. + gzungetc() returns the character pushed, or -1 on failure. gzungetc() will + fail if c is -1, and may fail if a character has been pushed but not read + yet. If gzungetc is used immediately after gzopen or gzdopen, at least the + output buffer size of pushed characters is allowed. (See gzbuffer above.) + The pushed character will be discarded if the stream is repositioned with + gzseek() or gzrewind(). +*/ + +ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +/* + Flushes all pending output into the compressed file. The parameter flush + is as in the deflate() function. The return value is the zlib error number + (see function gzerror below). gzflush is only permitted when writing. + + If the flush parameter is Z_FINISH, the remaining data is written and the + gzip stream is completed in the output. If gzwrite() is called again, a new + gzip stream will be started in the output. gzread() is able to read such + concatented gzip streams. + + gzflush should be called only when strictly necessary because it will + degrade compression if called too often. +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, + z_off_t offset, int whence)); + + Sets the starting position for the next gzread or gzwrite on the given + compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); + + Returns the starting position for the next gzread or gzwrite on the given + compressed file. This position represents a number of bytes in the + uncompressed data stream, and is zero when starting, even if appending or + reading a gzip stream from the middle of a file using gzdopen(). + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); + + Returns the current offset in the file being read or written. This offset + includes the count of bytes that precede the gzip stream, for example when + appending or when using gzdopen() for reading. When reading, the offset + does not include as yet unused buffered input. This information can be used + for a progress indicator. On error, gzoffset() returns -1. +*/ + +ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +/* + Returns true (1) if the end-of-file indicator has been set while reading, + false (0) otherwise. Note that the end-of-file indicator is set only if the + read tried to go past the end of the input, but came up short. Therefore, + just like feof(), gzeof() may return false even if there is no more data to + read, in the event that the last read request was for the exact number of + bytes remaining in the input file. This will happen if the input file size + is an exact multiple of the buffer size. + + If gzeof() returns true, then the read functions will return no more data, + unless the end-of-file indicator is reset by gzclearerr() and the input file + has grown since the previous end of file was detected. +*/ + +ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +/* + Returns true (1) if file is being copied directly while reading, or false + (0) if file is a gzip stream being decompressed. This state can change from + false to true while reading the input file if the end of a gzip stream is + reached, but is followed by data that is not another gzip stream. + + If the input file is empty, gzdirect() will return true, since the input + does not contain a gzip stream. + + If gzdirect() is used immediately after gzopen() or gzdopen() it will + cause buffers to be allocated to allow reading the file to determine if it + is a gzip file. Therefore if gzbuffer() is used, it should be called before + gzdirect(). +*/ + +ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +/* + Flushes all pending output if necessary, closes the compressed file and + deallocates the (de)compression state. Note that once file is closed, you + cannot call gzerror with file, since its structures have been deallocated. + gzclose must not be called more than once on the same file, just as free + must not be called more than once on the same allocation. + + gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a + file operation error, or Z_OK on success. +*/ + +ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); +/* + Same as gzclose(), but gzclose_r() is only for use when reading, and + gzclose_w() is only for use when writing or appending. The advantage to + using these instead of gzclose() is that they avoid linking in zlib + compression or decompression code that is not used when only reading or only + writing respectively. If gzclose() is used, then both compression and + decompression code will be included the application when linking to a static + zlib library. +*/ + +ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +/* + Returns the error message for the last error which occurred on the given + compressed file. errnum is set to zlib error number. If an error occurred + in the file system and not in the compression library, errnum is set to + Z_ERRNO and the application may consult errno to get the exact error code. + + The application must not modify the returned string. Future calls to + this function may invalidate the previously returned string. If file is + closed, then the string previously returned by gzerror will no longer be + available. + + gzerror() should be used to distinguish errors from end-of-file for those + functions above that do not distinguish those cases in their return values. +*/ + +ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +/* + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip + file that is being written concurrently. +*/ + + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the compression + library. +*/ + +ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is Z_NULL, this function returns the + required initial value for the checksum. + + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. + + Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +/* +ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, + z_off_t len2)); + + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 + and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for + each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. +*/ + +ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +/* + Update a running CRC-32 with the bytes buf[0..len-1] and return the + updated CRC-32. If buf is Z_NULL, this function returns the required + initial value for the for the crc. Pre- and post-conditioning (one's + complement) is performed within this function so it shouldn't be done by the + application. + + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + +/* +ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); + + Combine two CRC-32 check values into one. For two sequences of bytes, + seq1 and seq2 with lengths len1 and len2, CRC-32 check values were + calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 + check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and + len2. +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size)); +ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size)); +#define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) +#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) +#define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, sizeof(z_stream)) + +/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or + * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if + * both are true, the application gets the *64 functions, and the regular + * functions are changed to 64 bits) -- in case these are set on systems + * without large file support, _LFS64_LARGEFILE must also be true + */ +#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); +#endif + +#if !defined(ZLIB_INTERNAL) && _FILE_OFFSET_BITS-0 == 64 && _LFS64_LARGEFILE-0 +# define gzopen gzopen64 +# define gzseek gzseek64 +# define gztell gztell64 +# define gzoffset gzoffset64 +# define adler32_combine adler32_combine64 +# define crc32_combine crc32_combine64 +# ifdef _LARGEFILE64_SOURCE + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +# endif +#else + ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); +#endif + +/* hack for buggy compilers */ +#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) + struct internal_state {int dummy;}; +#endif + +/* undocumented functions */ +ZEXTERN const char * ZEXPORT zError OF((int)); +ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); +ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); +ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); + +#ifdef __cplusplus +} +#endif + +#endif /* ZLIB_H */ diff --git a/plugins/snes9x_gx/readme.txt b/plugins/snes9x_gx/readme.txt new file mode 100644 index 00000000..8134cb85 --- /dev/null +++ b/plugins/snes9x_gx/readme.txt @@ -0,0 +1,880 @@ +_____________________________________________________________________________ +|0O×øo· Snes9x GX ·oø×O0| +| http://code.google.com/p/snes9x-gx | +| (Under GPL License) | +|___________________________________________________________________________| + +Snes9x GX is a Super Nintendo™ / Super Famicom emulator for the Nintendo Wii. +Snes9x GX is a port of Snes9x (http://www.snes9x.com). + +Snes9x GX is a "homebrew application" which means you will need a way to run +unsigned code on your Nintendo Wii. The best website for getting started with +Wii homebrew is WiiBrew (www.wiibrew.org). + +•˜———–—––-- - —————————––––– ———–—––-- - —————————––––– ———–—––-- - ————————• +| FEATURES | +•˜———–—––-- - —————————––––– ———–—––-- - —————————––––– ———–—––-- - ————————• + +* Based on Snes9x 1.52 +* Wiimote, Nunchuk, Classic, and Gamecube controller support +* SNES Superscope, Mouse, Justifier support +* Cheat support +* Auto Load/Save Game Snapshots and SRAM +* Custom controller configurations +* SD, USB, DVD, SMB, Zip, and 7z support +* Autodetect PAL/NTSC, 16:9 widescreen support +* Original/filtered/unfiltered video modes +* Turbo Mode - up to 2x the normal speed +* Zoom option to zoom in/out +* Open Source! + +•˜———–—––-- - —————————––––– ———–—––-- - —————————––––– ———–—––-- - ————————• +| UPDATE HISTORY | +•˜———–—––-- - —————————––––– ———–—––-- - —————————––––– ———–—––-- - ————————• + +[4.3.4 - February 2, 2016] + +* Fixed screenshot image dimensions +* Fixed screenshot option, it no longer creates an additional "dummy" file +* Fixed performance issues, reverted to previous vsync method +* Compiled with devkitPPC r26 + Note: If compiled with devkitPPC r27 some games, like Final Fantasy III + and Chrono Trigger would crash on a battle + +[4.3.3 - September 3, 2015July 7, 2015] + +* Added Cebolleto's preview image support +* Added WiiUPro controller support +* Added a Scanline filter option +* Increase preview image size and reduce game list width +* Added a background to the preview image +* Added a Screenshot button +* Added a "WiiuPro" button on the button mapping menu +* Fixed the inverted color button selection that was in some option windows + +[4.3.2 - November 9, 2012] + +* Fixed lag with GameCube controllers + +[4.3.1 - July 7, 2012] + +* Fixed PAL support + +[4.3.0 - July 6, 2012] + +* Support for newer Wiimotes +* Fixed screen flicker when going back to menu +* Improved L/R buttons for GameCube - trigger button press when 50%+ depressed +* Improved controller behavior - allow two directions to be pressed simultaneously +* Timing changes +* Compiled with devkitPPC r26 and libogc 1.8.11 + +[4.2.9 - January 14, 2012] + +* More accurate pixel scaling (thanks eke-eke!) +* Other minor changes + +[4.2.8 - May 15, 2011] + +* Ported a few upstream game fixes for: Mutant Chronicles - Doom Troopers, + Porky Pig's Haunted Holiday, Big Sky Trooper, and Mechwarrior 3050 / Battle + Tech 3050 +* Added Turkish translation + +[4.2.7 - March 23, 2011] + +* Fixed browser regressions with stability and speed +* Reverted zones' changes to IRQ and SA-1 - these caused a performance hit + +[4.2.6 - March 19, 2011] + +* Improved game compatibility (updated core to latest Snes9x) +* Fixed issue with cheats not persisting +* Improved USB and controller compatibility (recompiled with latest libogc) +* Enabled SMB on GameCube (thanks Extrems!) +* Added Catalan translation +* Translation updates + +[4.2.5 - October 7, 2010] + +* Sync with upstream SVN - fixes a few specific game issues +* Fixed "blank listing" issue for SMB +* Improved USB compatibility and speed +* Added Portuguese and Brazilian Portuguese translations +* Other minor changes + +[4.2.4 - August 14, 2010] + +* IOS 202 support removed +* USB 2.0 support via IOS 58 added - requires that IOS58 be pre-installed +* DVD support via AHBPROT - requires latest HBC + +[4.2.3 - July 22, 2010] + +* Fixed broken auto-update + +[4.2.2 - July 20, 2010] + +* Reverted USB2 changes +* Fixed return-to-menu crash with Filtered mode + +[4.2.1 - July 14, 2010] + +* Improved audio timing +* Fixed 16:9 correction in Original mode +* Ability to use both USB ports (requires updated IOS 202 - WARNING: older + versions of IOS 202 are NO LONGER supported) +* Fixed issue with IPS patch files +* Hide non-ROM files +* Other minor improvements + +[4.2.0 - June 20, 2010] + +* Fixed incorrect aspect ratio issue +* Fixed choppy framerate issue +* Fixed IPS/UPS patching +* USB improvements +* GameCube improvements - audio, SD Gecko, show thumbnails for saves +* Other minor changes + +[4.1.9 - May 19, 2010] + +* DVD support fixed +* Fixed some cheats issues +* Fixed some potential hangs when returning to menu +* Video/audio code changes +* Fixed scrolling text bug +* Other minor changes + +[4.1.8 - April 9, 2010] + +* Fix auto-save bug + +[4.1.7 - April 9, 2010] + +* Freezing issue fixed +* Core timing fixes, should solve some problems with some games +* Most 3rd party controllers should work now (you're welcome!) +* 7z crash fixed +* GameCube only - DVD/SD Gecko fixed (thanks emukidid!) +* Translation updates (German and Dutch) +* Other minor changes + +[4.1.6 - March 30, 2010] + +* New core! Updated to Snes9x 1.52. Old save states will not work! +* DVD / USB 2.0 support via IOS 202. DVDx support has been dropped. It is + highly recommended to install IOS 202 via the included installer +* Multi-language support (only French translation is fully complete) +* Thank you to everyone who submitted translations +* SMB improvements/bug fixes +* Minor video & input performance optimizations +* Now uses .srm files without "Auto" appended, if found +* Added option to disable crosshair + +[4.1.5 - December 23, 2009] + +* Changed default folders to snes9xgx/roms and snes9xgx/saves. Old folders + will be automatically moved to the new location +* File browser now scrolls down to the last game when returning to browser +* Auto update for those using USB now works +* Fixed scrollbar up/down buttons +* Minor optimizations + +[4.1.4 - December 2, 2009] + +* Fixed SMB (for real this time!) +* Fixed snapshot loading regression + +[4.1.3 - November 30, 2009] + +* Fixed SMB +* Added separate horizontal/vertical zoom options +* Improved scrolling timing - the more you scroll, the fast it goes +* Fixed reset button on Wii console - now you can reset multiple times +* Minor code optimizations +* Reduce memory fragmentation - fixes out of memory crashes + +[4.1.2 - October 7, 2009] + +* Revamped filebrowser and file I/O +* Many, many other bug fixes + +[4.1.1 - September 19, 2009] + +* Fixed black screen bug + +[4.1.0 - September 16, 2009] + +* Text rendering corrections +* SMB improvements +* Built with latest libraries +* Video mode switching now works properly +* Other minor bugfixes and cleanup + +[4.0.9 - July 22, 2009] + +* Fixed "No game saves found." message when there are actually saves. +* Fixed shift key on keyboard +* Text scrolling works again +* Change default prompt window selection to "Cancel" button + +[4.0.8 - July 9, 2009] + +* Faster SMB/USB browsing +* Last browsed folder is now remembered +* Fixed controller mapping reset button +* Fixed no sound on GameCube version +* Directory names are no longer altered +* Preferences now only saved on exit +* Fixed on-screen keyboard glitches +* SRAM auto-saved on power-off from within a game +* Prevent 7z lockups, better 7z error messages +* Increase cheats limit from 30 to 150 +* Cheats no longer effect next game loaded - they are cleared properly + +[4.0.7 - June 30, 2009] + +* Fixed auto-update +* Increased file browser listing to 10 entries, decreased font size +* Added text scrolling on file browser +* Added reset button for controller mappings +* Settings are now loaded from USB when loading the app from USB on HBC +* Fixed menu crashes caused by ogg player bugs +* Fixed memory card saving verification bug +* Fixed game savebrowser bugs +* Miscellaneous code cleanup/corrections + +[4.0.6 - May 30, 2009] + +* Fixed SD/USB corruption bug +* SMB works again +* GUI bugs fixed, GUI behavioral improvements + +[4.0.5 - May 26, 2009] + +* Improved stability +* Fixed broken SDHC from HBC 1.0.2 update +* Fixed issues with returning to menu from in-game +* Add option to disable rumble +* Auto-determines if HBC is present - returns to Wii menu otherwise +* Fixed Super Scope turbo button issue +* Miscellaneous bugfixes + +[4.0.4 - April 30, 2009] + +* Improved scrollbar +* Built with more stable libogc/libfat +* Fixed rumble bug in filebrowser +* Added confirmation prompts +* Fixed settings saving glitches + +[4.0.3 - April 23, 2009] + +* Settings resetting glitch fixed + +[4.0.2 - April 22, 2009] + +* GameCube controller home trigger fixed +* USB support fixed +* More stable SMB support +* Corrections/improvements to game saving/loading +* Video mode corrections +* hq2x filter no longer crashes hi-res games on unfiltered/filtered modes +* Corrections to cheat file parsing +* Super Scope turbo now activated when holding Down button +* Settings are now saved when exiting game menu settings area +* Super Scope pause button now works +* Invalid VRAM access is now allowed - should fix some homebrew games +* New video mode selection in menu (forcing a video mode is not recommended) + +[4.0.1 - April 13, 2009] + +* Fixed turning off autosave in menu +* Keyboard fixed, more keys added +* Fixed 7z loading from DVD +* Enable auto loading and renaming of SRAM save without "Auto" in the name +* PAL resolution fixed - no more letterboxing +* File browser scrollbar box now draggable, arrow buttons now scroll list +* Better handling of multiple on-screen wiimotes +* Menu restructured - new "Game Settings" menu + +[4.0.0 - April 4, 2009] + +* New GX-based menu, with a completely redesigned layout. Has Wiimote IR + support, sounds, graphics, animation effects, and more +* Thanks to the3seashells for designing some top-notch artwork, to + Peter de Man for composing the music, and a special thanks to shagkur for + fixing libogc bugs that would have otherwise prevented the release +* Onscreen keyboard for changing save/load folders and network settings +* Menu configuration options (configurable exit button, wiimote orientation, + volumes) +* Configurable button mapping for superscope, mouse and justifier +* New save manager, allowing multiple saves and save browsing. Shows + screenshots for Snapshot saves, and save dates/times +* Experimental hq2x filter, contributed by michniewski + +[009 - January 27, 2009] + +* Faster SD/USB - new read-ahead cache +* Removed trigger of back to menu for Classic Controller right joystick +* Fixed a bug with reading files < 2048 bytes +* Fixed some memory leaks, buffer overflows, etc +* Code cleanup, other general bugfixes + +[008 - December 24, 2008] + +* Fixed unstable SD card access +* Proper SD/USB hotswap (Wii only) +* Auto-update feature (Wii only) +* Rewritten SMB access - speed boost, NTLM now supported (Wii only) +* Improved file access code +* Resetting preferences now resets controls +* Fixed "invalid file size" error on smaller games (eg: Space Invaders) +* Fixed hangup in Super Mario RPG +* Minor bug fixes + +[007 - November 19, 2008] + +* added: SDHC support +* added: SD/USB hot-swapping +* added: zoom saving +* added: IPS/UPS/PPF patch support +* added: Qoob modchip support (thanks emukidid!) +* added: Added console/remote power button support (Wii only) +* added: Added reset button support - resets game (Wii only) +* changed: Settings file is now named settings.xml and is stored in the same + folder as the DOL - eg: apps/Snes9xGX/settings.xml (Wii only) +* fixed: swc, sfc file support +* fixed: inverted sound channels +* fixed: some game crashes +* fixed: snapshot saving for games with SPC7110, BS, DSP, or CX4 +* fixed: justifier support +* fixed: superscope turbo button +* fixed: widescreen support +* fixed: ActRaiser 2 issues +* fixed: Invalid memory accesses in C4 and OBC1. MMX3 Toxic Seahorse stage + now can be emulated with HDMA. (zones) +* fixed: Updated snapshot to prevent desync. Added some variables related to + APU and HDMA. (gocha) +* fixed: zoom issues (thanks eke-eke!) +* fixed: original modes (thanks eke-eke!) +* fixed: vertical scaling for filtered/unfiltered modes (thanks eke-eke!) + +[006 - October 15, 2008] + +Tantric +* added: 480p for GameCube +* added: Sound sync +* added: 7z support +* changed: Faster SD/USB access (readahead cache enabled) +* fixed: Video offset issues +* fixed: BS-X games work now +* fixed: Wii DVD works now +* fixed: DVD re-enabled for GameCube +* fixed: Nunchuk analog stick issues +* fixed: Many crashes, memory leaks, etc + +michniewski +* added: Video shift options +* changed: Turn DVD motor off option re-enabled for GameCube + +[005 - September 23, 2008] + +michniewski +* added: Superscope/mouse/justifier support, with Wii remote +* added: 3 render modes - Original, Filtered, Unfiltered +* added: widescreen compensation option +* added: DVD support on the Wii +* changed: zoom - limited range, added reset zoom option + +Tantric +* added: now uses SNES 1.51 core (thanks to eke-eke for help with this) +* added: cheats menu! Loads .CHT file from /snes9x/cheats folder, + .CHT file name must match file name of ROM +* added: load/save preference selector. ROM, SRAM, Freeze, and preferences + are saved/loaded according to these +* added: preliminary Windows file share loading/saving (SMB) support on Wii: + You can input your network settings into snes9xGX.xml, or edit + s9xconfig.cpp from the source code and compile. +* added: 'Auto' settings for save/load - attempts to automatically determine + your load/save device(s) - SD, USB, Memory Card, DVD, SMB +* added: ROM Information page +* added: Game Menu - all game-specific options are here now: + SRAM save/load, Snapshot save/load, game reload, etc +* added: Credits page +* fixed: sd gecko works now +* fixed: full USB support +* changed: menu structure +* changed: preferences are now loaded and saved in XML format. You can open + snes9xGX.xml edit all settings, including some not available within + the program +* changed: if Home button is pressed when a game is running, Game Menu pops up +* changed: if preferences can't be loaded at the start and/or are reset, + preferences menu pops up - remove to save your preferences! +* changed: SRAM load - game reloaded automatically after loading SRAM + +[004 - August 5, 2008] + +* added: option to disable AA filtering + (snes graphics 'crisper', AA now default OFF) +* added: mapped zooming and turbo mode to classic controller +* added: preliminary usb support (loading) +* changed: sram and freezes now saved by filename, not internal romname. + If you have multiple versions of the same game, you can now have + srams and freezes for each version. A prompt to convert to the + new naming is provided for sram only. +* changed: by default, autoload/save sram and freeze enabled + +[003 - July 25, 2008] +* added: alphabetical file sorting +* added: background logo/backdrop + nicer menus +* added: scrolling in ROM selector +* fixed: switching between pal/ntsc ROMS doesn't mess up timings +* fixed: GC controller config works now +* fixed: freeze autoloading on ROM load +* fixed: zipped ROMS should now load in a reasonable time +* fixed: precompiled dols for autosaving to various locations (see readme) +* changed: GC default quickload slot (to sd) (thanks kerframil) +* changed: default load/save dirs are now "/snes9x/roms" and + "/snes9x/saves/" (thanks kerframil) +* changed: Classic X and Y defaults aren't switched +* changed: if autosave is enabled, it doesn't ask to save SRAM + anymore. It is saved in the background. +* updated README + +[002 - July 21, 2008] +* added: classic and nunchuk support +* added: all controllers can now be configured +* added: GC version (untested) +* changed: mappings are no longer stored in SRAM, but in config file. + This means no per-game configurations, but one global + config per controller. +* one makefile to make all versions. (thanks to snes9x143 SVN) + + +[001 - July 12, 2008] +* compiles with latest devkitppc (r15) +* now uses libfat (can use front sd slot on wii) +* updated menu items a bit +* wiimote support +* fixed: autoload sram/freeze +* fixed: rom plays immediately after loading + +[older update history at the bottom] + +•˜———–—––-- - —————————––––– ———–—––-- - —————————––––– ———–—––-- - ————————• +| INSTALLATION | +•˜———–—––-- - —————————––––– ———–—––-- - —————————––––– ———–—––-- - ————————• + +To install Snes9x GX you will need to copy over the "apps" and "snes9xgx" +folders (directories) from this archive to your SD Card. It comes +pre-packaged in the Homebrew Channel format (which you will use to launch +the emulator). Once you've copied the directories to your SD Card you will +need to place your ROM image(s) into "\snes9xgx\roms" directory and place any +cheat code files (optional) in the "\snes9xgx\cheats" directory. Once this is +done you can proceed to run the emulator via the Homebrew Channel. + +•˜———–—––-- - —————————––––– ———–—––-- - —————————––––– ———–—––-- - ————————• +| INITIAL SETUP | +•˜———–—––-- - —————————––––– ———–—––-- - —————————––––– ———–—––-- - ————————• + +The first time you run Snes9x GX it will create a new "settings.xml" file on +the SD Card which stores the configuration of the emulator. So when you run +Snes9x GX it will automatically detect your storage medium and will bring you +to the ROM selection screen. If you want to run a game with the default +settings then just highlight the game and press "A" on it and it will load. +However, you can configure Snes9x GX to your liking. + +•˜———–—––-- - —————————––––– ———–—––-- - —————————––––– ———–—––-- - ————————• +| CONFIGURATION | +•˜———–—––-- - —————————––––– ———–—––-- - —————————––––– ———–—––-- - ————————• + +To configure Snes9x GX press "A" on the "Settings" box. This will brings up +the "Settings" screen where you can configure the Button Mappings, Video, +Saving, Menu and Network. You can also restore the settings to their initial +values by clicking on the "Reset Settings" and you can return to the ROM +selection screen by clicking on "Go Back". + +--•[ Button Mappings ]•-- + +Once in the Button Mappings settings menu you'll have the option to pick to +configure the SNES Controller, Super Scope, SNES Mouse and the Justifier. +Once you select a controller to configure you will be presented with which +input device you would like to configure. To set the button simply click on +the input device you wish to use and then pick the button you wish to map. +After you select a button to configure Snes9x GX will prompt you to press +the button you wish to assign to the button you've selected. Below is a list +of each controller followed by the input devices and the default values for +those devices. + + [ SNES Controller ] + + • GameCube Controller + + A = A + B = B + X = X + Y = Y + L = L + R = R + START = START + SELECT = Z + UP = UP + DOWN = DOWN + LEFT = LEFT + RIGHT = RIGHT + + • Wiimote + + A = B + B = 2 + X = 1 + Y = A + START = PLUS + SELECT = MINUS + UP = UP + DOWN = DOWN + LEFT = LEFT + RIGHT = RIGHT + + • Classic Controller + + A = A + B = B + X = X + Y = Y + L = L + R = R + UP = UP + DOWN = DOWN + LEFT = LEFT + RIGHT = RIGHT + + • Wiimote Nunchuck + Wiimote + + A = A + B = B + X = C + Y = Z + L = 2 + R = 1 + START = PLUS + SELECT = MINUS + UP = UP + DOWN = DOWN + LEFT = LEFT + RIGHT = RIGHT + + [ Super Scope ] + + • GameCube Controller + + FIRE = A + AIM OFFSCREEN = B + CURSOR = Z + TURBO ON = Y + TURBO OFF = X + PAUSE = START + + • Wiimote + + FIRE = B + AIM OFFSCREEN = A + CURSOR = MINUS + TURBO ON = UP + TURBO OFF = DOWN + PAUSE = PLUS + + [ SNES Mouse ] + + • GameCube Controller + + LEFT BUTTON = A + RIGHT BUTTON = B + + • Wiimote + + LEFT BUTTON = A + RIGHT BUTTON = B + + [ Justifier ] + + • GameCube Controller + + FIRE = B + AIM OFFSCREEN = A + START = START + + • Wiimote + + FIRE = B + AIM OFFSCREEN = A + START = PLUS + +--•[ VIDEO ]•-- + +The Video settings screen will allow you to configure various video settings +including the Rendering method, Scaling, Filtering, Screen Zoom and Screen +Position. You can toggle the options for the first three selections by +clicking on them. To make the Filtering option you select you must enable +Filtering under the Rendering setting. + +• Rendering - Unfiltered + - Original + - Filtered + +• Scaling - Default + - 16:9 Correction + +• Filtering - None + - hq2x + - hq2x Soft + - hq2x Bold + +Screen Zoom will bring up a menu where you can adjust the Zoom level by using +the left and right arrows that you can click on. The default setting is 100%. + +The Screen Position option will bring up a screen with four arrows that +allows you to move the position of the output. You'll only need to use this +option if the screen is not centered. Combining this with the Zoom and +Scaling you should be able to get a proper display on your television. + +--•[ SAVING & LOADING ]•-- + +From this setup option you can configure the way Snes9x GX loads and saves. +Your options are Load Method, Load Folder, Save Method, Save Folder, Auto +Load and Auto Save. Clicking on all of the options except the folders will +let you toggle through their settings. Clicking on the folder options will +bring up a text box where you can enter in the folder you wish to use for +your save data. Snes9x GX has two types of saves - one is the SRAM which is +the save game data (this is only applicable if the game you're playing +supports saving) and the other is Snapshots which are real time saves. Real +time saves allow you to save your game in it's current state and resume it +at a later time. + + • Load Method - SD, USB, DVD, Network and Auto + + • Save Method - SD, USB, Network and Auto + + • Auto Load - SRAM, Snapshot and Off + + • Auto Save - SRAM, Snapshot and Off + +--•[ MENU ]•-- + +This settings screen will allow you to customize a few aspects on how the +Menu works including the Exit Action, Wiimote Orientation, Music Volume and +the Sound Effects Volume. The Exit Action can be set to "Return to Loader", +"Return to Wii Menu" and "Power off Wii". The Wiimote Orientation can be set +to Vertical or Horizontal and then you can increase and decrease the Music +and Sound Effects Volume. + +--•[ NETWORK ]•-- + +If you're going to be using your Network (LAN) to load and/or save from you +will need to enter in the SMB share settings you've setup on your computer +via this settings menu. You will need to enter in the SMB Share IP, Share +Name, Share Username and Share Password. If you do not have a password on +your SMB share then set the SMB Share Password to "0". + +•˜———–—––-- - —————————––––– ———–—––-- - —————————––––– ———–—––-- - ————————• +| FILE BROWSER | +•˜———–—––-- - —————————––––– ———–—––-- - —————————––––– ———–—––-- - ————————• + +The File Browser will automatically load when you start the emulator and it +will automatically list the contents of the "\snes9xgx\roms\" directory on +your SD card. Like mentioned above in the Configuration -> Saving & Loading +you can specifically a different directory to load from. To launch a game +(the game can either be uncompressed or inside a ZIP archive) simply click +on it and it will load. You may also change the directory you're in by +clicking on "Up One Level". + +•˜———–—––-- - —————————––––– ———–—––-- - —————————––––– ———–—––-- - ————————• +| GAMEPLAY | +•˜———–—––-- - —————————––––– ———–—––-- - —————————––––– ———–—––-- - ————————• + +Once you load a game you can access another option menu by pressing the +"Home" button. This will bring up the Save, Load, Reset, Controller and +Cheats options. From this menu you can also return to the File Browser by +selecting "Main Menu". To leave the menu and resume game play select "Close". + +The Save option will allow you to save either your SRAM or a Snapshot. Once +you've selected Save two options will appear named "New SRAM" and "New +Snapshot". Clicking on these will create a new save. Once you have a save +you can save over it by selecting it instead of a "New" option. The Load +option will allow you to load your saved SRAM or Snapshot. Reset will reset +the game. If you pick Controller you can toggle between which controller you +wish to use to control your game with. The last option, Cheats, will allow you +to toggle your cheat codes (see below). + +•˜———–—––-- - —————————––––– ———–—––-- - —————————––––– ———–—––-- - ————————• +| CHEATS | +•˜———–—––-- - —————————––––– ———–—––-- - —————————––––– ———–—––-- - ————————• + +Cheats are loaded from the "\snes9xgx\cheats" directory and must be in the +SNES9X .CHT file format. They also must be named the same name as the game +you're playing with the .cht extentsion. An example would be if you have a +ROM called "Super Mario World.smc" you would need to name your .cht file to +"Super Mario World.cht". You can find a link to a massive collection of Super +NES cheat codes in the Links section (below). + +•˜———–—––-- - —————————––––– ———–—––-- - —————————––––– ———–—––-- - ————————• +| TURBO MODE | +•˜———–—––-- - —————————––––– ———–—––-- - —————————––––– ———–—––-- - ————————• + +TurboMode increases the playback speed of the game by about 2x. To use +TurboMode simply press the c-stick (yellow control stick) to the right and +hold it right as long as you want playback to be double-speed. Release the +c-stick when you want normal playback speed to resume. + +•˜———–—––-- - —————————––––– ———–—––-- - —————————––––– ———–—––-- - ————————• +| IMPORTING AND EXPORTING SRAM | +•˜———–—––-- - —————————––––– ———–—––-- - —————————––––– ———–—––-- - ————————• + +Snes9x GX now includes the ability to load SRAM from Snes9x on other +platforms (Mac/PC/Linux/etc) and to save back to those platforms. + +To load a SRAM file on the Wii or Gamecube from another platform, ensure the +name of the SRM file matches the filename of the ROM (except with an SRM +extension). + +To use a Wii/GameCube SRAM file on another platform just do the opposite: +copy the saved SRAM file to the other platform. You may have to rename the +file to be what that version of snes9x expects it to be. + +•˜———–—––-- - —————————––––– ———–—––-- - —————————––––– ———–—––-- - ————————• +| UPDATE HISTORY (OLD) | +•˜———–—––-- - —————————––––– ———–—––-- - —————————––––– ———–—––-- - ————————• + +[2.0.1b8] +* Added: SD slot B options for freezes, sram and loading of roms +* Changed: SMB options no longer displayed in menus when run on a Wii +* Changed: Game auto resumes running after resetting when choosing the "Reset + Game" menu option +* Fixed (maybe): Reading of DVDs past the 1.36 GB barrier (Wii only) please + test! - svpe + +[2.0.1b7] +* Fixed: Zip compressed freezes to memory card could become corrupted as the + file size changed - fixed this by deleting the existing file before writing + a new one if the file size increased. If the file got smaller or stayed the + same the original file is updated, using less of the existing file if the + actual file size is smaller. A check is made before deleting the existing + freeze file to ensure that there is enough space available for the new + file. Note that additional space equivalent to the new file size must be + available. If not enough space is available the original freeze is retained + and the user is informed of the lack of space. +* Fixed: If option to auto-load freeze was selected, joypad config would not + be restored since that is stored in SRAM. Resolved this for now by first + loading SRAM if any and then loading the freeze. Obviously having to have + both SRAM and freeze is not ideal, but this gets the job done if you have + enough space on your memory card, SD card, etc. +* Added prompt when returning to the menu with autosave enabled allowing the + user choose whether or not to perform the save. Press A to save or B if you + don't wish to save. +* Added optional verification of Gamecube memory card saves. After writing + the file it reads it back in and verifies that the written file matches + what was to be saved. If it doesn't or if there was a problem opening the + file it reports the problem to the user. Set this option in the preferences + if desired. +* Added Reset Gamecube/Wii menu item +* Experimental DVD support for reading beyond 1.36 GB barrier on Wii. I have + no way to test this, so please report on whether or not it works! Based on + svpe's code. + +NOTE: due to changes in the settings, this version will reset your emulator +options settings, so if you had saved preferences you will need to make your +changes to the emulator settings again and save them. + +[2.0.1b6a] +* Fixed: Going up a directory when selecting a rom on a DVD wasn't working + +[2.0.1b6] +* PAL Wii support - no separate version necessary! - eke-eke +* PAL roms now play at correct speed via internal timer, ntsc roms still use + more accurate VSYNC timing - eke-eke +* Zipped freezes to memory card - take 9-12 blocks or so - based on denman's + code +* Added option for auto save and load of freezes. For saving, can do both SRAM + and Freeze if desired +* Memory card saving and loading shows a progress bar +* More miscellaneous ease-of-use improvements and cleanup +* Fixed: pressing B to get out of a rom file selection screen no longer drops + you all the way back to the main menu. Now goes back to choice of where to + load ROM (the "Load from DVD", "Load from SMB"... screen) +* Fixed: loading of joypad configuration in SRAM works again - no longer gets + messed up + +[2.0.1b5] +* B button implemented in all menus (returns to previous menu) +* Fixed bug when freezing state to SD card - would crash if SD support was not + previously initialized +* Fixed double A button press needed after manual prefs/sram save to memory card +* Fixed delay after pressing A button after saving freeze to SD card +* Fixed problem of ".srm" SRAM file being created when SRAM was saved with no + ROM loaded +* Fixed version number in SRAM and preferences +* Minor other code revisions + +[2.0.1b1 through 2.0.1b4] +* SRAM saving and loading from snes9x on other platforms via SD card or SMB +* Games now autostart once loaded +* After manually loading SRAM the emulator is automatically reset +* Optional auto-loading of SRAM from memory card, SD or SMB after game loads +* Optional auto-saving of SRAM to memory card, SD or SMB when returning to menu +* TurboMode +* Global emulator preferences +* Menus redesigned (hopefully for the better!) +* Comes in 6 variants, each auto-loading/saving preferences/sram to a different + location: mcslota, mcslotb, sdslota, sdslotb, smb, and noload +* ROM injector works again +* A number of small improvements and bug fixes + +[2.0 WIP6] +* Port of SNES9X 1.50 +* SMB support +* SD support +* Greatly improved emulation and timing for NTSC roms +* Save states (freezes) to SD and SMB +* Screen zoom +* Improved font and display +* ROM injector +* ... and more ... + +•˜———–—––-- - —————————––––– ———–—––-- - —————————––––– ———–—––-- - ————————• +| CREDITS | +•˜———–—––-- - —————————––––– ———–—––-- - —————————––––– ———–—––-- - ————————• + + Coding & menu design Tantric + Additional coding michniewski + Menu artwork the3seashells + Menu sound Peter de Man + + ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ + Snes9x GX GameCube SoftDev, crunchy2, + eke-eke, others + + Snes9x Snes9x Team + libogc/devkitPPC shagkur & wintermute + FreeTypeGX Armin Tamzarian + +•˜———–—––-- - —————————––––– ———–—––-- - —————————––––– ———–—––-- - ————————• +| LINKS | +•˜———–—––-- - —————————––––– ———–—––-- - —————————––––– ———–—––-- - ————————• + + SNES9X GX Project Page + http://code.google.com/p/snes9x-gx + + Wii Homebrew Community + www.wiibrew.org + + Free (Public Domain) ROMs + www.pdroms.de + + Cheat Codes + www.cheatzilla.com + +×—–­—–­—–­—–­ –­—–­—–­—–­—–­—–­—–­—–­—–­—–­— ­—–­—–­—–­—–­—–­—–­—–­—-­—–­-–•¬ +|0O×øo· ·oø×O0| +`¨•¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨' \ No newline at end of file diff --git a/plugins/snes9x_gx/source/audio.cpp b/plugins/snes9x_gx/source/audio.cpp new file mode 100644 index 00000000..1667ed9e --- /dev/null +++ b/plugins/snes9x_gx/source/audio.cpp @@ -0,0 +1,166 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * softdev July 2006 + * Tantric 2008-2010 + * + * audio.cpp + * + * Audio driver + * Audio is fixed to 32Khz/16bit/Stereo + ***************************************************************************/ + +#include <gccore.h> +#include <ogcsys.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <asndlib.h> + +#include "video.h" + +#include "snes9x/snes9x.h" +#include "snes9x/memmap.h" +#include "snes9x/cpuexec.h" +#include "snes9x/ppu.h" +#include "snes9x/apu/apu.h" +#include "snes9x/display.h" +#include "snes9x/gfx.h" +#include "snes9x/spc7110.h" +#include "snes9x/controls.h" + +extern int ConfigRequested; + +/*** Double buffered audio ***/ +#define AUDIOBUFFER 2048 +static unsigned char soundbuffer[2][AUDIOBUFFER] __attribute__ ((__aligned__ (32))); +static int whichab = 0; /*** Audio buffer flip switch ***/ + +#define AUDIOSTACK 16384 +static lwpq_t audioqueue; +static lwp_t athread; +static uint8 astack[AUDIOSTACK]; +static mutex_t audiomutex = LWP_MUTEX_NULL; + +/**************************************************************************** + * Audio Threading + ***************************************************************************/ +static void * +AudioThread (void *arg) +{ + LWP_InitQueue (&audioqueue); + + while (1) + { + if (ConfigRequested) + memset (soundbuffer[whichab], 0, AUDIOBUFFER); + else + { + LWP_MutexLock(audiomutex); + S9xMixSamples (soundbuffer[whichab], AUDIOBUFFER >> 1); + LWP_MutexUnlock(audiomutex); + } + DCFlushRange (soundbuffer[whichab], AUDIOBUFFER); + LWP_ThreadSleep (audioqueue); + } + + return NULL; +} + +/**************************************************************************** + * MixSamples + * This continually calls S9xMixSamples On each DMA Completion + ***************************************************************************/ +static void +GCMixSamples () +{ + if (!ConfigRequested) + { + whichab ^= 1; + AUDIO_InitDMA ((u32) soundbuffer[whichab], AUDIOBUFFER); + LWP_ThreadSignal (audioqueue); + } +} + +static void FinalizeSamplesCallback (void *data) +{ + LWP_MutexLock(audiomutex); + S9xFinalizeSamples(); + LWP_MutexUnlock(audiomutex); +} + +/**************************************************************************** + * InitAudio + ***************************************************************************/ +void +InitAudio () +{ + #ifdef NO_SOUND + AUDIO_Init (NULL); + AUDIO_SetDSPSampleRate(AI_SAMPLERATE_32KHZ); + AUDIO_RegisterDMACallback(GCMixSamples); + #else + ASND_Init(); + #endif + LWP_MutexInit(&audiomutex, false); + LWP_CreateThread (&athread, AudioThread, NULL, astack, AUDIOSTACK, 70); +} + +/**************************************************************************** + * SwitchAudioMode + * + * Switches between menu sound and emulator sound + ***************************************************************************/ +void +SwitchAudioMode(int mode) +{ + if(mode == 0) // emulator + { + #ifndef NO_SOUND + ASND_Pause(1); + AUDIO_StopDMA(); + AUDIO_SetDSPSampleRate(AI_SAMPLERATE_32KHZ); + AUDIO_RegisterDMACallback(GCMixSamples); + #endif + memset(soundbuffer[0],0,AUDIOBUFFER); + memset(soundbuffer[1],0,AUDIOBUFFER); + DCFlushRange(soundbuffer[0],AUDIOBUFFER); + DCFlushRange(soundbuffer[1],AUDIOBUFFER); + AUDIO_InitDMA((u32)soundbuffer[whichab],AUDIOBUFFER); + AUDIO_StartDMA(); + + S9xSetSamplesAvailableCallback(FinalizeSamplesCallback, NULL); + } + else // menu + { + S9xSetSamplesAvailableCallback(NULL, NULL); + #ifndef NO_SOUND + ASND_Init(); + ASND_Pause(0); + #else + AUDIO_StopDMA(); + #endif + } +} + +/**************************************************************************** + * ShutdownAudio + * + * Shuts down audio subsystem. Useful to avoid unpleasant sounds if a + * crash occurs during shutdown. + ***************************************************************************/ +void ShutdownAudio() +{ + AUDIO_StopDMA(); +} + +/**************************************************************************** + * AudioStart + * + * Called to kick off the Audio Queue + ***************************************************************************/ +void +AudioStart () +{ + GCMixSamples (); +} diff --git a/plugins/snes9x_gx/source/audio.h b/plugins/snes9x_gx/source/audio.h new file mode 100644 index 00000000..4f09cfd3 --- /dev/null +++ b/plugins/snes9x_gx/source/audio.h @@ -0,0 +1,16 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * softdev July 2006 + * Tantric 2008-2010 + * + * audio.h + * + * Audio driver + * Audio is fixed to 32Khz/16bit/Stereo + ***************************************************************************/ + +void InitAudio (); +void AudioStart (); +void SwitchAudioMode(int mode); +void ShutdownAudio(); diff --git a/plugins/snes9x_gx/source/button_mapping.c b/plugins/snes9x_gx/source/button_mapping.c new file mode 100644 index 00000000..b3c5ff19 --- /dev/null +++ b/plugins/snes9x_gx/source/button_mapping.c @@ -0,0 +1,117 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * michniewski August 2008 + * Tantric 2008-2010 + * + * button_mapping.c + * + * Controller button mapping + ***************************************************************************/ + +#include <gccore.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ogcsys.h> +#include <unistd.h> +#include <wiiuse/wpad.h> + +#include "button_mapping.h" + +/**************************************************************************** + * Controller Button Descriptions: + * used for identifying which buttons have been pressed when configuring + * and for displaying the name of said button + ***************************************************************************/ + +CtrlrMap ctrlr_def[4] = { +// Gamecube controller btn def +{ + CTRLR_GCPAD, + 13, + { + {PAD_BUTTON_DOWN, "DOWN"}, + {PAD_BUTTON_UP, "UP"}, + {PAD_BUTTON_LEFT, "LEFT"}, + {PAD_BUTTON_RIGHT, "RIGHT"}, + {PAD_BUTTON_A, "A"}, + {PAD_BUTTON_B, "B"}, + {PAD_BUTTON_X, "X"}, + {PAD_BUTTON_Y, "Y"}, + {PAD_BUTTON_MENU, "START"}, + {PAD_BUTTON_START, "START"}, + {PAD_TRIGGER_L, "L"}, + {PAD_TRIGGER_R, "R"}, + {PAD_TRIGGER_Z, "Z"}, + {0, ""}, + {0, ""} + } +}, +// Wiimote btn def +{ + CTRLR_WIIMOTE, + 11, + { + {WPAD_BUTTON_DOWN, "DOWN"}, + {WPAD_BUTTON_UP, "UP"}, + {WPAD_BUTTON_LEFT, "LEFT"}, + {WPAD_BUTTON_RIGHT, "RIGHT"}, + {WPAD_BUTTON_A, "A"}, + {WPAD_BUTTON_B, "B"}, + {WPAD_BUTTON_1, "1"}, + {WPAD_BUTTON_2, "2"}, + {WPAD_BUTTON_PLUS, "PLUS"}, + {WPAD_BUTTON_MINUS, "MINUS"}, + {WPAD_BUTTON_HOME, "HOME"}, + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""} + } +}, +// Nunchuk btn def +{ + CTRLR_NUNCHUK, + 13, + { + {WPAD_BUTTON_DOWN, "DOWN"}, + {WPAD_BUTTON_UP, "UP"}, + {WPAD_BUTTON_LEFT, "LEFT"}, + {WPAD_BUTTON_RIGHT, "RIGHT"}, + {WPAD_BUTTON_A, "A"}, + {WPAD_BUTTON_B, "B"}, + {WPAD_BUTTON_1, "1"}, + {WPAD_BUTTON_2, "2"}, + {WPAD_BUTTON_PLUS, "PLUS"}, + {WPAD_BUTTON_MINUS, "MINUS"}, + {WPAD_BUTTON_HOME, "HOME"}, + {WPAD_NUNCHUK_BUTTON_Z, "Z"}, + {WPAD_NUNCHUK_BUTTON_C, "C"}, + {0, ""}, + {0, ""} + } +}, +// Classic btn def +{ + CTRLR_CLASSIC, + 15, + { + {WPAD_CLASSIC_BUTTON_DOWN, "DOWN"}, + {WPAD_CLASSIC_BUTTON_UP, "UP"}, + {WPAD_CLASSIC_BUTTON_LEFT, "LEFT"}, + {WPAD_CLASSIC_BUTTON_RIGHT, "RIGHT"}, + {WPAD_CLASSIC_BUTTON_A, "A"}, + {WPAD_CLASSIC_BUTTON_B, "B"}, + {WPAD_CLASSIC_BUTTON_X, "X"}, + {WPAD_CLASSIC_BUTTON_Y, "Y"}, + {WPAD_CLASSIC_BUTTON_PLUS, "PLUS"}, + {WPAD_CLASSIC_BUTTON_MINUS, "MINUS"}, + {WPAD_CLASSIC_BUTTON_HOME, "HOME"}, + {WPAD_CLASSIC_BUTTON_FULL_L, "L"}, + {WPAD_CLASSIC_BUTTON_FULL_R, "R"}, + {WPAD_CLASSIC_BUTTON_ZL, "ZL"}, + {WPAD_CLASSIC_BUTTON_ZR, "ZR"} + } +} +}; diff --git a/plugins/snes9x_gx/source/button_mapping.h b/plugins/snes9x_gx/source/button_mapping.h new file mode 100644 index 00000000..ed5ee1f0 --- /dev/null +++ b/plugins/snes9x_gx/source/button_mapping.h @@ -0,0 +1,39 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * michniewski August 2008 + * Tantric 2008-2010 + * + * button_mapping.h + * + * Controller button mapping + ***************************************************************************/ + +#ifndef BTN_MAP_H +#define BTN_MAP_H + +enum { + CTRLR_NONE = -1, + CTRLR_GCPAD, + CTRLR_WIIMOTE, + CTRLR_NUNCHUK, + CTRLR_CLASSIC +}; + +const char ctrlrName[4][20] = +{ "GameCube Controller", "Wiimote", "Nunchuk + Wiimote", "Classic Controller" }; + +typedef struct _btn_map { + u32 btn; // button 'id' + char* name; // button name +} BtnMap; + +typedef struct _ctrlr_map { + u16 type; // controller type + int num_btns; // number of buttons on the controller + BtnMap map[15]; // controller button map +} CtrlrMap; + +extern CtrlrMap ctrlr_def[4]; + +#endif diff --git a/plugins/snes9x_gx/source/cheatmgr.cpp b/plugins/snes9x_gx/source/cheatmgr.cpp new file mode 100644 index 00000000..738cb3c8 --- /dev/null +++ b/plugins/snes9x_gx/source/cheatmgr.cpp @@ -0,0 +1,80 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * Tantric 2008-2010 + * + * cheatmgr.cpp + * + * Cheat handling + ***************************************************************************/ + + +#include "port.h" +#include "cheats.h" + +#include "snes9xgx.h" +#include "fileop.h" +#include "filebrowser.h" + +extern SCheatData Cheat; + +/**************************************************************************** + * LoadCheatFile + * + * Loads cheat file from save buffer + * Custom version of S9xLoadCheatFile() + ***************************************************************************/ + +static bool LoadCheatFile (int length) +{ + uint8 data [28]; + int offset = 0; + + while (offset < length) + { + if(Cheat.num_cheats >= MAX_CHEATS || (length - offset) < 28) + break; + + memcpy (data, savebuffer+offset, 28); + offset += 28; + + Cheat.c [Cheat.num_cheats].enabled = 0; // cheats always off + Cheat.c [Cheat.num_cheats].byte = data [1]; + Cheat.c [Cheat.num_cheats].address = data [2] | (data [3] << 8) | (data [4] << 16); + Cheat.c [Cheat.num_cheats].saved_byte = data [5]; + Cheat.c [Cheat.num_cheats].saved = (data [0] & 8) != 0; + memcpy (Cheat.c [Cheat.num_cheats].name, &data[8], 20); + Cheat.c [Cheat.num_cheats].name[20] = 0; + Cheat.num_cheats++; + } + return true; +} + +/**************************************************************************** + * SetupCheats + * + * Erases any prexisting cheats, loads cheats from a cheat file + * Called when a ROM is first loaded + ***************************************************************************/ +void +WiiSetupCheats() +{ + memset(Cheat.c, 0, sizeof(Cheat.c)); + Cheat.num_cheats = 0; + + char filepath[1024]; + int offset = 0; + + if(!MakeFilePath(filepath, FILE_CHEAT)) + return; + + AllocSaveBuffer(); + + offset = LoadFile(filepath, SILENT); + + // load cheat file if present + if(offset > 0) + LoadCheatFile (offset); + + FreeSaveBuffer (); +} diff --git a/plugins/snes9x_gx/source/filebrowser.cpp b/plugins/snes9x_gx/source/filebrowser.cpp new file mode 100644 index 00000000..88b2a08b --- /dev/null +++ b/plugins/snes9x_gx/source/filebrowser.cpp @@ -0,0 +1,666 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * softdev July 2006 + * svpe June 2007 + * crunchy2 May-July 2007 + * Michniewski 2008 + * Tantric 2008-2010 + * + * filebrowser.cpp + * + * Generic file routines - reading, writing, browsing + ***************************************************************************/ + +#include <gccore.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <wiiuse/wpad.h> +#include <sys/dir.h> +#include <malloc.h> + +#ifdef HW_RVL +#include <di/di.h> +#endif + +#include "snes9xgx.h" +#include "filebrowser.h" +#include "menu.h" +#include "video.h" +#include "networkop.h" +#include "fileop.h" +#include "input.h" +#include "gcunzip.h" +#include "freeze.h" +#include "sram.h" + +#include "snes9x/snes9x.h" +#include "snes9x/memmap.h" +#include "snes9x/cheats.h" + +BROWSERINFO browser; +BROWSERENTRY * browserList = NULL; // list of files/folders in browser + +static char szpath[MAXPATHLEN]; +char szname[MAXPATHLEN]; +bool inSz = false; + +unsigned long SNESROMSize = 0; +bool loadingFile = false; + +/**************************************************************************** +* autoLoadMethod() +* Auto-determines and sets the load device +* Returns device set +****************************************************************************/ +int autoLoadMethod() +{ + ShowAction ("Attempting to determine load device..."); + + int device = DEVICE_AUTO; + + if(ChangeInterface(DEVICE_SD, SILENT)) + device = DEVICE_SD; + else if(ChangeInterface(DEVICE_USB, SILENT)) + device = DEVICE_USB; + else if(ChangeInterface(DEVICE_SD_SLOTA, SILENT)) + device = DEVICE_SD_SLOTA; + else if(ChangeInterface(DEVICE_SD_SLOTB, SILENT)) + device = DEVICE_SD_SLOTB; + else if(ChangeInterface(DEVICE_DVD, SILENT)) + device = DEVICE_DVD; + else if(ChangeInterface(DEVICE_SMB, SILENT)) + device = DEVICE_SMB; + else + ErrorPrompt("Unable to locate a load device!"); + + if(GCSettings.LoadMethod == DEVICE_AUTO) + GCSettings.LoadMethod = device; // save device found for later use + CancelAction(); + return device; +} + +/**************************************************************************** +* autoSaveMethod() +* Auto-determines and sets the save device +* Returns device set +****************************************************************************/ +int autoSaveMethod(bool silent) +{ + if(!silent) + ShowAction ("Attempting to determine save device..."); + + int device = DEVICE_AUTO; + + if(ChangeInterface(DEVICE_SD, SILENT)) + device = DEVICE_SD; + else if(ChangeInterface(DEVICE_USB, SILENT)) + device = DEVICE_USB; + else if(ChangeInterface(DEVICE_SD_SLOTA, SILENT)) + device = DEVICE_SD_SLOTA; + else if(ChangeInterface(DEVICE_SD_SLOTB, SILENT)) + device = DEVICE_SD_SLOTB; + else if(ChangeInterface(DEVICE_SMB, SILENT)) + device = DEVICE_SMB; + else if(!silent) + ErrorPrompt("Unable to locate a save device!"); + + if(GCSettings.SaveMethod == DEVICE_AUTO) + GCSettings.SaveMethod = device; // save device found for later use + + CancelAction(); + return device; +} + +/**************************************************************************** + * ResetBrowser() + * Clears the file browser memory, and allocates one initial entry + ***************************************************************************/ +void ResetBrowser() +{ + browser.numEntries = 0; + browser.selIndex = 0; + browser.pageIndex = 0; + browser.size = 0; +} + +bool AddBrowserEntry() +{ + if(browser.size >= MAX_BROWSER_SIZE) + { + ErrorPrompt("Out of memory: too many files!"); + return false; // out of space + } + + memset(&(browserList[browser.size]), 0, sizeof(BROWSERENTRY)); // clear the new entry + browser.size++; + return true; +} + +/**************************************************************************** + * CleanupPath() + * Cleans up the filepath, removing double // and replacing \ with / + ***************************************************************************/ +static void CleanupPath(char * path) +{ + if(!path || path[0] == 0) + return; + + int pathlen = strlen(path); + int j = 0; + for(int i=0; i < pathlen && i < MAXPATHLEN; i++) + { + if(path[i] == '\\') + path[i] = '/'; + + if(j == 0 || !(path[j-1] == '/' && path[i] == '/')) + path[j++] = path[i]; + } + path[j] = 0; +} + +bool IsDeviceRoot(char * path) +{ + if(path == NULL || path[0] == 0) + return false; + + if( strcmp(path, "sd:/") == 0 || + strcmp(path, "usb:/") == 0 || + strcmp(path, "dvd:/") == 0 || + strcmp(path, "smb:/") == 0 || + strcmp(path, "carda:/") == 0 || + strcmp(path, "cardb:/") == 0) + { + return true; + } + return false; +} + +/**************************************************************************** + * UpdateDirName() + * Update curent directory name for file browser + ***************************************************************************/ +int UpdateDirName() +{ + int size=0; + char * test; + char temp[1024]; + int device = 0; + + if(browser.numEntries == 0) + return 1; + + FindDevice(browser.dir, &device); + + /* current directory doesn't change */ + if (strcmp(browserList[browser.selIndex].filename,".") == 0) + { + return 0; + } + /* go up to parent directory */ + else if (strcmp(browserList[browser.selIndex].filename,"..") == 0) + { + // already at the top level + if(IsDeviceRoot(browser.dir)) + { + browser.dir[0] = 0; // remove device - we are going to the device listing screen + } + else + { + /* determine last subdirectory namelength */ + sprintf(temp,"%s",browser.dir); + test = strtok(temp,"/"); + while (test != NULL) + { + size = strlen(test); + test = strtok(NULL,"/"); + } + + /* remove last subdirectory name */ + size = strlen(browser.dir) - size - 1; + strncpy(GCSettings.LastFileLoaded, &browser.dir[size], strlen(browser.dir) - size - 1); //set as loaded file the previous dir + GCSettings.LastFileLoaded[strlen(browser.dir) - size - 1] = 0; + browser.dir[size] = 0; + } + + return 1; + } + /* Open a directory */ + else + { + /* test new directory namelength */ + if ((strlen(browser.dir)+1+strlen(browserList[browser.selIndex].filename)) < MAXPATHLEN) + { + /* update current directory name */ + sprintf(browser.dir, "%s%s/",browser.dir, browserList[browser.selIndex].filename); + return 1; + } + else + { + ErrorPrompt("Directory name is too long!"); + return -1; + } + } +} + +bool MakeFilePath(char filepath[], int type, char * filename, int filenum) +{ + char file[512]; + char folder[1024]; + char ext[4]; + char temppath[MAXPATHLEN]; + + if(type == FILE_ROM) + { + // Check path length + if ((strlen(browser.dir)+1+strlen(browserList[browser.selIndex].filename)) >= MAXPATHLEN) + { + ErrorPrompt("Maximum filepath length reached!"); + filepath[0] = 0; + return false; + } + else + { + sprintf(temppath, "%s%s",browser.dir,browserList[browser.selIndex].filename); + } + } + else + { + if(GCSettings.SaveMethod == DEVICE_AUTO) + GCSettings.SaveMethod = autoSaveMethod(SILENT); + + if(GCSettings.SaveMethod == DEVICE_AUTO) + return false; + + switch(type) + { + case FILE_SRAM: + case FILE_SNAPSHOT: + sprintf(folder, GCSettings.SaveFolder); + + if(type == FILE_SRAM) sprintf(ext, "srm"); + else sprintf(ext, "frz"); + + if(filenum >= -1) + { + if(filenum == -1) + sprintf(file, "%s.%s", filename, ext); + else if(filenum == 0) + sprintf(file, "%s Auto.%s", filename, ext); + else + sprintf(file, "%s %i.%s", filename, filenum, ext); + } + else + { + sprintf(file, "%s", filename); + } + break; + case FILE_CHEAT: + sprintf(folder, GCSettings.CheatFolder); + sprintf(file, "%s.cht", Memory.ROMFilename); + break; + } + sprintf (temppath, "%s%s/%s", pathPrefix[GCSettings.SaveMethod], folder, file); + } + CleanupPath(temppath); // cleanup path + snprintf(filepath, MAXPATHLEN, "%s", temppath); + return true; +} + +/**************************************************************************** + * FileSortCallback + * + * Quick sort callback to sort file entries with the following order: + * . + * .. + * <dirs> + * <files> + ***************************************************************************/ +int FileSortCallback(const void *f1, const void *f2) +{ + /* Special case for implicit directories */ + if(((BROWSERENTRY *)f1)->filename[0] == '.' || ((BROWSERENTRY *)f2)->filename[0] == '.') + { + if(strcmp(((BROWSERENTRY *)f1)->filename, ".") == 0) { return -1; } + if(strcmp(((BROWSERENTRY *)f2)->filename, ".") == 0) { return 1; } + if(strcmp(((BROWSERENTRY *)f1)->filename, "..") == 0) { return -1; } + if(strcmp(((BROWSERENTRY *)f2)->filename, "..") == 0) { return 1; } + } + + /* If one is a file and one is a directory the directory is first. */ + if(((BROWSERENTRY *)f1)->isdir && !(((BROWSERENTRY *)f2)->isdir)) return -1; + if(!(((BROWSERENTRY *)f1)->isdir) && ((BROWSERENTRY *)f2)->isdir) return 1; + + return stricmp(((BROWSERENTRY *)f1)->filename, ((BROWSERENTRY *)f2)->filename); +} + +/**************************************************************************** + * IsValidROM + * + * Checks if the specified file is a valid ROM + * For now we will just check the file extension and file size + * If the file is a zip, we will check the file extension / file size of the + * first file inside + ***************************************************************************/ +static bool IsValidROM() +{ + // file size should be between 96K and 8MB + if(browserList[browser.selIndex].length < (1024*96) || + browserList[browser.selIndex].length > Memory.MAX_ROM_SIZE) + { + ErrorPrompt("Invalid file size!"); + return false; + } + + if (strlen(browserList[browser.selIndex].filename) > 4) + { + char * p = strrchr(browserList[browser.selIndex].filename, '.'); + + if (p != NULL) + { + char * zippedFilename = NULL; + + if(stricmp(p, ".zip") == 0 && !inSz) + { + // we need to check the file extension of the first file in the archive + zippedFilename = GetFirstZipFilename (); + + if(zippedFilename && strlen(zippedFilename) > 4) + p = strrchr(zippedFilename, '.'); + else + p = NULL; + } + + if(p != NULL) + { + if (stricmp(p, ".smc") == 0 || + stricmp(p, ".fig") == 0 || + stricmp(p, ".sfc") == 0 || + stricmp(p, ".swc") == 0) + { + if(zippedFilename) free(zippedFilename); + return true; + } + } + if(zippedFilename) free(zippedFilename); + } + } + ErrorPrompt("Unknown file type!"); + return false; +} + +/**************************************************************************** + * IsSz + * + * Checks if the specified file is a 7z + ***************************************************************************/ +bool IsSz() +{ + if (strlen(browserList[browser.selIndex].filename) > 4) + { + char * p = strrchr(browserList[browser.selIndex].filename, '.'); + + if (p != NULL) + if(stricmp(p, ".7z") == 0) + return true; + } + return false; +} + +/**************************************************************************** + * StripExt + * + * Strips an extension from a filename + ***************************************************************************/ +void StripExt(char* returnstring, char * inputstring) +{ + char* loc_dot; + + snprintf (returnstring, MAXJOLIET, "%s", inputstring); + + if(inputstring == NULL || strlen(inputstring) < 4) + return; + + loc_dot = strrchr(returnstring,'.'); + if (loc_dot != NULL) + *loc_dot = 0; // strip file extension +} + +/**************************************************************************** + * BrowserLoadSz + * + * Opens the selected 7z file, and parses a listing of the files within + ***************************************************************************/ +int BrowserLoadSz() +{ + memset(szpath, 0, MAXPATHLEN); + strncpy(szpath, browser.dir, strlen(browser.dir) - 1); + + strncpy(szname, strrchr(szpath, '/') + 1, strrchr(szpath, '.') - strrchr(szpath, '/')); + *strrchr(szname, '.') = '\0'; + + int szfiles = SzParse(szpath); + if(szfiles) + { + browser.numEntries = szfiles; + inSz = true; + } + else + ErrorPrompt("Error opening archive!"); + + return szfiles; +} + +int WiiFileLoader() +{ + int size; + char filepath[1024]; + + memset(Memory.NSRTHeader, 0, sizeof(Memory.NSRTHeader)); + Memory.HeaderCount = 0; + loadingFile = true; + + if(!inSz) + { + if(!MakeFilePath(filepath, FILE_ROM)) + return 0; + + size = LoadFile ((char *)Memory.ROM, filepath, browserList[browser.selIndex].length, NOTSILENT); + } + else + { + size = LoadSzFile(szpath, (unsigned char *)Memory.ROM); + + if(size <= 0) + { + browser.selIndex = 0; + BrowserChangeFolder(); + } + } + loadingFile = false; + + if(size <= 0) + return 0; + + SNESROMSize = Memory.HeaderRemove(size, Memory.HeaderCount, Memory.ROM); + return SNESROMSize; +} + +/**************************************************************************** + * BrowserLoadFile + * + * Loads the selected ROM + ***************************************************************************/ +int BrowserLoadFile() +{ + int loaded = 0; + int device; + + if(!FindDevice(browser.dir, &device)) + return 0; + + GetFileSize(browser.selIndex); + + // check that this is a valid ROM + if(!IsValidROM()) + goto done; + + // store the filename (w/o ext) - used for sram/freeze naming + StripExt(Memory.ROMFilename, browserList[browser.selIndex].filename); + snprintf(GCSettings.LastFileLoaded, MAXPATHLEN, "%s", browserList[browser.selIndex].filename); + + SNESROMSize = 0; + S9xDeleteCheats(); + Memory.LoadROM("ROM"); + + if (SNESROMSize <= 0) + { + ErrorPrompt("Error loading game!"); + } + else + { + // load SRAM or snapshot + if (GCSettings.AutoLoad == 1) + LoadSRAMAuto(SILENT); + else if (GCSettings.AutoLoad == 2) + LoadSnapshotAuto(SILENT); + + ResetBrowser(); + loaded = 1; + } +done: + CancelAction(); + return loaded; +} + +/**************************************************************************** + * BrowserChangeFolder + * + * Update current directory and set new entry list if directory has changed + ***************************************************************************/ +int BrowserChangeFolder() +{ + int device = 0; + FindDevice(browser.dir, &device); + + if(inSz && browser.selIndex == 0) // inside a 7z, requesting to leave + { + inSz = false; + SzClose(); + } + + if(!UpdateDirName()) + return -1; + + HaltParseThread(); + CleanupPath(browser.dir); + ResetBrowser(); + + if(browser.dir[0] != 0) + { + if(strstr(browser.dir, ".7z")) + { + BrowserLoadSz(); + } + else + { + ParseDirectory(true, true); + } + FindAndSelectLastLoadedFile(); + } + + if(browser.numEntries == 0) + { + browser.dir[0] = 0; + int i=0; + +#ifdef HW_RVL + AddBrowserEntry(); + sprintf(browserList[i].filename, "sd:/"); + sprintf(browserList[i].displayname, "SD Card"); + browserList[i].length = 0; + browserList[i].isdir = 1; + browserList[i].icon = ICON_SD; + i++; + + AddBrowserEntry(); + sprintf(browserList[i].filename, "usb:/"); + sprintf(browserList[i].displayname, "USB Mass Storage"); + browserList[i].length = 0; + browserList[i].isdir = 1; + browserList[i].icon = ICON_USB; + i++; +#else + AddBrowserEntry(); + sprintf(browserList[i].filename, "carda:/"); + sprintf(browserList[i].displayname, "SD Gecko Slot A"); + browserList[i].length = 0; + browserList[i].isdir = 1; + browserList[i].icon = ICON_SD; + i++; + + AddBrowserEntry(); + sprintf(browserList[i].filename, "cardb:/"); + sprintf(browserList[i].displayname, "SD Gecko Slot B"); + browserList[i].length = 0; + browserList[i].isdir = 1; + browserList[i].icon = ICON_SD; + i++; +#endif + AddBrowserEntry(); + sprintf(browserList[i].filename, "smb:/"); + sprintf(browserList[i].displayname, "Network Share"); + browserList[i].length = 0; + browserList[i].isdir = 1; + browserList[i].icon = ICON_SMB; + i++; + + AddBrowserEntry(); + sprintf(browserList[i].filename, "dvd:/"); + sprintf(browserList[i].displayname, "Data DVD"); + browserList[i].length = 0; + browserList[i].isdir = 1; + browserList[i].icon = ICON_DVD; + i++; + + browser.numEntries += i; + } + + if(browser.dir[0] == 0) + { + GCSettings.LoadFolder[0] = 0; + GCSettings.LoadMethod = 0; + } + else + { + char * path = StripDevice(browser.dir); + if(path != NULL) + strcpy(GCSettings.LoadFolder, path); + FindDevice(browser.dir, &GCSettings.LoadMethod); + } + + return browser.numEntries; +} + +/**************************************************************************** + * OpenROM + * Displays a list of ROMS on load device + ***************************************************************************/ +int +OpenGameList () +{ + int device = GCSettings.LoadMethod; + + if(device == DEVICE_AUTO && strlen(GCSettings.LoadFolder) > 0) + device = autoLoadMethod(); + + // change current dir to roms directory + if(device > 0) + sprintf(browser.dir, "%s%s/", pathPrefix[device], GCSettings.LoadFolder); + else + browser.dir[0] = 0; + + BrowserChangeFolder(); + return browser.numEntries; +} diff --git a/plugins/snes9x_gx/source/filebrowser.h b/plugins/snes9x_gx/source/filebrowser.h new file mode 100644 index 00000000..5065a487 --- /dev/null +++ b/plugins/snes9x_gx/source/filebrowser.h @@ -0,0 +1,79 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * softdev July 2006 + * crunchy2 May 2007 + * Michniewski 2008 + * Tantric 2008-2010 + * + * filebrowser.h + * + * Generic file routines - reading, writing, browsing + ****************************************************************************/ + +#ifndef _FILEBROWSER_H_ +#define _FILEBROWSER_H_ + +#include <unistd.h> +#include <gccore.h> + +#define MAXJOLIET 255 +#ifdef HW_DOL +#define MAX_BROWSER_SIZE 1000 +#else +#define MAX_BROWSER_SIZE 5000 +#endif + +typedef struct +{ + char dir[MAXPATHLEN + 1]; // directory path of browserList + int numEntries; // # of entries in browserList + int selIndex; // currently selected index of browserList + int pageIndex; // starting index of browserList page display + int size; // # of entries browerList has space allocated to store +} BROWSERINFO; + +typedef struct +{ + size_t length; // file length + int isdir; // 0 - file, 1 - directory + char filename[MAXJOLIET + 1]; // full filename + char displayname[MAXJOLIET + 1]; // name for browser display + int filenum; // file # (for 7z support) + int icon; // icon to display +} BROWSERENTRY; + +extern BROWSERINFO browser; +extern BROWSERENTRY * browserList; + +enum +{ + ICON_NONE, + ICON_FOLDER, + ICON_SD, + ICON_USB, + ICON_DVD, + ICON_SMB +}; + +extern unsigned long SNESROMSize; +extern bool loadingFile; +extern char szname[MAXPATHLEN]; +extern bool inSz; + +bool MakeFilePath(char filepath[], int type, char * filename = NULL, int filenum = -2); +int UpdateDirName(); +int OpenGameList(); +int autoLoadMethod(); +int autoSaveMethod(bool silent); +int FileSortCallback(const void *f1, const void *f2); +void StripExt(char* returnstring, char * inputstring); +bool IsSz(); +void ResetBrowser(); +bool AddBrowserEntry(); +bool IsDeviceRoot(char * path); +int BrowserLoadSz(); +int BrowserChangeFolder(); +int BrowserLoadFile(); + +#endif diff --git a/plugins/snes9x_gx/source/filelist.h b/plugins/snes9x_gx/source/filelist.h new file mode 100644 index 00000000..e15a85f8 --- /dev/null +++ b/plugins/snes9x_gx/source/filelist.h @@ -0,0 +1,327 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * Tantric 2009-2010 + * + * filelist.h + * + * Contains a list of all of the files stored in the images/, fonts/, and + * sounds/ folders + ***************************************************************************/ + +#ifndef _FILELIST_H_ +#define _FILELIST_H_ + +#include <gccore.h> + +// Fonts +extern const u8 font_ttf[]; +extern const u32 font_ttf_size; + +// Languages +extern const u8 jp_lang[]; +extern const u32 jp_lang_size; +extern const u8 en_lang[]; +extern const u32 en_lang_size; +extern const u8 de_lang[]; +extern const u32 de_lang_size; +extern const u8 fr_lang[]; +extern const u32 fr_lang_size; +extern const u8 es_lang[]; +extern const u32 es_lang_size; +extern const u8 it_lang[]; +extern const u32 it_lang_size; +extern const u8 nl_lang[]; +extern const u32 nl_lang_size; +extern const u8 zh_lang[]; +extern const u32 zh_lang_size; +extern const u8 ko_lang[]; +extern const u32 ko_lang_size; +extern const u8 pt_lang[]; +extern const u32 pt_lang_size; +extern const u8 pt_br_lang[]; +extern const u32 pt_br_lang_size; +extern const u8 ca_lang[]; +extern const u32 ca_lang_size; +extern const u8 tr_lang[]; +extern const u32 tr_lang_size; + +// Sounds + +extern const u8 bg_music_ogg[]; +extern const u32 bg_music_ogg_size; + +extern const u8 enter_ogg[]; +extern const u32 enter_ogg_size; + +extern const u8 exit_ogg[]; +extern const u32 exit_ogg_size; + +extern const u8 button_over_pcm[]; +extern const u32 button_over_pcm_size; + +extern const u8 button_click_pcm[]; +extern const u32 button_click_pcm_size; + +// Graphics + +extern const u8 logo_png[]; +extern const u32 logo_png_size; + +extern const u8 logo_over_png[]; +extern const u32 logo_over_png_size; + +extern const u8 bg_top_png[]; +extern const u32 bg_top_png_size; + +extern const u8 bg_bottom_png[]; +extern const u32 bg_bottom_png_size; + +extern const u8 icon_settings_png[]; +extern const u32 icon_settings_png_size; + +extern const u8 icon_home_png[]; +extern const u32 icon_home_png_size; + +extern const u8 icon_game_settings_png[]; +extern const u32 icon_game_settings_png_size; +extern const u8 icon_game_cheats_png[]; +extern const u32 icon_game_cheats_png_size; +extern const u8 icon_game_controllers_png[]; +extern const u32 icon_game_controllers_png_size; +extern const u8 icon_game_load_png[]; +extern const u32 icon_game_load_png_size; +extern const u8 icon_game_save_png[]; +extern const u32 icon_game_save_png_size; +extern const u8 icon_game_reset_png[]; +extern const u32 icon_game_reset_png_size; + +extern const u8 icon_settings_wiimote_png[]; +extern const u32 icon_settings_wiimote_png_size; +extern const u8 icon_settings_classic_png[]; +extern const u32 icon_settings_classic_png_size; +extern const u8 icon_settings_gamecube_png[]; +extern const u32 icon_settings_gamecube_png_size; +extern const u8 icon_settings_nunchuk_png[]; +extern const u32 icon_settings_nunchuk_png_size; +extern const u8 icon_settings_wiiupro_png[]; +extern const u32 icon_settings_wiiupro_png_size; + +extern const u8 icon_settings_snescontroller_png[]; +extern const u32 icon_settings_snescontroller_png_size; +extern const u8 icon_settings_superscope_png[]; +extern const u32 icon_settings_superscope_png_size; +extern const u8 icon_settings_justifier_png[]; +extern const u32 icon_settings_justifier_png_size; +extern const u8 icon_settings_mouse_png[]; +extern const u32 icon_settings_mouse_png_size; + +extern const u8 icon_settings_file_png[]; +extern const u32 icon_settings_file_png_size; +extern const u8 icon_settings_mappings_png[]; +extern const u32 icon_settings_mappings_png_size; +extern const u8 icon_settings_menu_png[]; +extern const u32 icon_settings_menu_png_size; +extern const u8 icon_settings_network_png[]; +extern const u32 icon_settings_network_png_size; +extern const u8 icon_settings_video_png[]; +extern const u32 icon_settings_video_png_size; +extern const u8 icon_settings_screenshot_png[]; +extern const u32 icon_settings_screenshot_png_size; + +extern const u8 button_png[]; +extern const u32 button_png_size; + +extern const u8 button_over_png[]; +extern const u32 button_over_png_size; + +extern const u8 button_prompt_png[]; +extern const u32 button_prompt_png_size; + +extern const u8 button_prompt_over_png[]; +extern const u32 button_prompt_over_png_size; + +extern const u8 button_long_png[]; +extern const u32 button_long_png_size; + +extern const u8 button_long_over_png[]; +extern const u32 button_long_over_png_size; + +extern const u8 button_short_png[]; +extern const u32 button_short_png_size; + +extern const u8 button_short_over_png[]; +extern const u32 button_short_over_png_size; + +extern const u8 button_small_png[]; +extern const u32 button_small_png_size; + +extern const u8 button_small_over_png[]; +extern const u32 button_small_over_png_size; + +extern const u8 button_large_png[]; +extern const u32 button_large_png_size; + +extern const u8 button_large_over_png[]; +extern const u32 button_large_over_png_size; + +extern const u8 button_arrow_left_png[]; +extern const u32 button_arrow_left_png_size; + +extern const u8 button_arrow_right_png[]; +extern const u32 button_arrow_right_png_size; + +extern const u8 button_arrow_up_png[]; +extern const u32 button_arrow_up_png_size; + +extern const u8 button_arrow_down_png[]; +extern const u32 button_arrow_down_png_size; + +extern const u8 button_arrow_left_over_png[]; +extern const u32 button_arrow_left_over_png_size; + +extern const u8 button_arrow_right_over_png[]; +extern const u32 button_arrow_right_over_png_size; + +extern const u8 button_arrow_up_over_png[]; +extern const u32 button_arrow_up_over_png_size; + +extern const u8 button_arrow_down_over_png[]; +extern const u32 button_arrow_down_over_png_size; + +extern const u8 button_gamesave_png[]; +extern const u32 button_gamesave_png_size; + +extern const u8 button_gamesave_over_png[]; +extern const u32 button_gamesave_over_png_size; + +extern const u8 button_gamesave_blank_png[]; +extern const u32 button_gamesave_blank_png_size; + +extern const u8 screen_position_png[]; +extern const u32 screen_position_png_size; + +extern const u8 dialogue_box_png[]; +extern const u32 dialogue_box_png_size; + +extern const u8 credits_box_png[]; +extern const u32 credits_box_png_size; + +extern const u8 progressbar_png[]; +extern const u32 progressbar_png_size; + +extern const u8 progressbar_empty_png[]; +extern const u32 progressbar_empty_png_size; + +extern const u8 progressbar_outline_png[]; +extern const u32 progressbar_outline_png_size; + +extern const u8 throbber_png[]; +extern const u32 throbber_png_size; + +extern const u8 icon_folder_png[]; +extern const u32 icon_folder_png_size; + +extern const u8 icon_sd_png[]; +extern const u32 icon_sd_png_size; + +extern const u8 icon_usb_png[]; +extern const u32 icon_usb_png_size; + +extern const u8 icon_dvd_png[]; +extern const u32 icon_dvd_png_size; + +extern const u8 icon_smb_png[]; +extern const u32 icon_smb_png_size; + +extern const u8 battery_png[]; +extern const u32 battery_png_size; + +extern const u8 battery_red_png[]; +extern const u32 battery_red_png_size; + +extern const u8 battery_bar_png[]; +extern const u32 battery_bar_png_size; + +extern const u8 bg_options_png[]; +extern const u32 bg_options_png_size; + +extern const u8 bg_options_entry_png[]; +extern const u32 bg_options_entry_png_size; + +extern const u8 bg_game_selection_png[]; +extern const u32 bg_game_selection_png_size; + +extern const u8 bg_game_selection_entry_png[]; +extern const u32 bg_game_selection_entry_png_size; + +extern const u8 bg_preview_png[]; +extern const u32 bg_preview_png_size; + +extern const u8 scrollbar_png[]; +extern const u32 scrollbar_png_size; + +extern const u8 scrollbar_arrowup_png[]; +extern const u32 scrollbar_arrowup_png_size; + +extern const u8 scrollbar_arrowup_over_png[]; +extern const u32 scrollbar_arrowup_over_png_size; + +extern const u8 scrollbar_arrowdown_png[]; +extern const u32 scrollbar_arrowdown_png_size; + +extern const u8 scrollbar_arrowdown_over_png[]; +extern const u32 scrollbar_arrowdown_over_png_size; + +extern const u8 scrollbar_box_png[]; +extern const u32 scrollbar_box_png_size; + +extern const u8 scrollbar_box_over_png[]; +extern const u32 scrollbar_box_over_png_size; + +extern const u8 keyboard_textbox_png[]; +extern const u32 keyboard_textbox_png_size; + +extern const u8 keyboard_key_png[]; +extern const u32 keyboard_key_png_size; + +extern const u8 keyboard_key_over_png[]; +extern const u32 keyboard_key_over_png_size; + +extern const u8 keyboard_mediumkey_png[]; +extern const u32 keyboard_mediumkey_png_size; + +extern const u8 keyboard_mediumkey_over_png[]; +extern const u32 keyboard_mediumkey_over_png_size; + +extern const u8 keyboard_largekey_png[]; +extern const u32 keyboard_largekey_png_size; + +extern const u8 keyboard_largekey_over_png[]; +extern const u32 keyboard_largekey_over_png_size; + +extern const u8 player1_point_png[]; +extern const u32 player1_point_png_size; + +extern const u8 player2_point_png[]; +extern const u32 player2_point_png_size; + +extern const u8 player3_point_png[]; +extern const u32 player3_point_png_size; + +extern const u8 player4_point_png[]; +extern const u32 player4_point_png_size; + +extern const u8 player1_grab_png[]; +extern const u32 player1_grab_png_size; + +extern const u8 player2_grab_png[]; +extern const u32 player2_grab_png_size; + +extern const u8 player3_grab_png[]; +extern const u32 player3_grab_png_size; + +extern const u8 player4_grab_png[]; +extern const u32 player4_grab_png_size; + +#endif diff --git a/plugins/snes9x_gx/source/fileop.cpp b/plugins/snes9x_gx/source/fileop.cpp new file mode 100644 index 00000000..98c066e1 --- /dev/null +++ b/plugins/snes9x_gx/source/fileop.cpp @@ -0,0 +1,962 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * softdev July 2006 + * crunchy2 May 2007 + * Michniewski 2008 + * Tantric 2008-2010 + * + * fileop.cpp + * + * File operations + ***************************************************************************/ + +#include <gccore.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ogcsys.h> +#include <dirent.h> +#include <sys/stat.h> +#include <zlib.h> +#include <malloc.h> +#include <sdcard/wiisd_io.h> +#include <sdcard/gcsd.h> +#include <ogc/usbstorage.h> +#include <di/di.h> +#include <ogc/dvd.h> +#include <iso9660.h> + +#include "snes9xgx.h" +#include "fileop.h" +#include "networkop.h" +#include "gcunzip.h" +#include "menu.h" +#include "filebrowser.h" +#include "gui/gui.h" + +#define THREAD_SLEEP 100 + +unsigned char *savebuffer = NULL; +static mutex_t bufferLock = LWP_MUTEX_NULL; +FILE * file; // file pointer - the only one we should ever use! +bool unmountRequired[7] = { false, false, false, false, false, false, false }; +bool isMounted[7] = { false, false, false, false, false, false, false }; + +#ifdef HW_RVL + const DISC_INTERFACE* sd = &__io_wiisd; + const DISC_INTERFACE* usb = &__io_usbstorage; + const DISC_INTERFACE* dvd = &__io_wiidvd; +#else + const DISC_INTERFACE* carda = &__io_gcsda; + const DISC_INTERFACE* cardb = &__io_gcsdb; + const DISC_INTERFACE* dvd = &__io_gcdvd; +#endif + +// folder parsing thread +static lwp_t parsethread = LWP_THREAD_NULL; +static DIR *dir = NULL; +static bool parseHalt = true; +static bool parseFilter = true; +static bool ParseDirEntries(); +int selectLoadedFile = 0; + +// device thread +static lwp_t devicethread = LWP_THREAD_NULL; +static bool deviceHalt = true; + +/**************************************************************************** + * ResumeDeviceThread + * + * Signals the device thread to start, and resumes the thread. + ***************************************************************************/ +void +ResumeDeviceThread() +{ + deviceHalt = false; + LWP_ResumeThread(devicethread); +} + +/**************************************************************************** + * HaltGui + * + * Signals the device thread to stop. + ***************************************************************************/ +void +HaltDeviceThread() +{ +#ifdef HW_RVL + deviceHalt = true; + + // wait for thread to finish + while(!LWP_ThreadIsSuspended(devicethread)) + usleep(THREAD_SLEEP); +#endif +} + +/**************************************************************************** + * HaltParseThread + * + * Signals the parse thread to stop. + ***************************************************************************/ +void +HaltParseThread() +{ + parseHalt = true; + + while(!LWP_ThreadIsSuspended(parsethread)) + usleep(THREAD_SLEEP); +} + + +/**************************************************************************** + * devicecallback + * + * This checks our devices for changes (SD/USB/DVD removed) + ***************************************************************************/ +#ifdef HW_RVL +static int devsleep; + +static void * +devicecallback (void *arg) +{ + while (1) + { + if(isMounted[DEVICE_SD]) + { + if(!sd->isInserted()) // check if the device was removed + { + unmountRequired[DEVICE_SD] = true; + isMounted[DEVICE_SD] = false; + } + } + + if(isMounted[DEVICE_USB]) + { + if(!usb->isInserted()) // check if the device was removed + { + unmountRequired[DEVICE_USB] = true; + isMounted[DEVICE_USB] = false; + } + } + + if(isMounted[DEVICE_DVD]) + { + if(!dvd->isInserted()) // check if the device was removed + { + unmountRequired[DEVICE_DVD] = true; + isMounted[DEVICE_DVD] = false; + } + } + + devsleep = 1000*1000; // 1 sec + + while(devsleep > 0) + { + if(deviceHalt) + LWP_SuspendThread(devicethread); + usleep(THREAD_SLEEP); + devsleep -= THREAD_SLEEP; + } + UpdateCheck(); + } + return NULL; +} +#endif + +static void * +parsecallback (void *arg) +{ + while(1) + { + while(ParseDirEntries()) + usleep(THREAD_SLEEP); + LWP_SuspendThread(parsethread); + } + return NULL; +} + +/**************************************************************************** + * InitDeviceThread + * + * libOGC provides a nice wrapper for LWP access. + * This function sets up a new local queue and attaches the thread to it. + ***************************************************************************/ +void +InitDeviceThread() +{ +#ifdef HW_RVL + LWP_CreateThread (&devicethread, devicecallback, NULL, NULL, 0, 40); +#endif + LWP_CreateThread (&parsethread, parsecallback, NULL, NULL, 0, 80); +} + +/**************************************************************************** + * UnmountAllFAT + * Unmounts all FAT devices + ***************************************************************************/ +void UnmountAllFAT() +{ +#ifdef HW_RVL + fatUnmount("sd:"); + fatUnmount("usb:"); +#else + fatUnmount("carda:"); + fatUnmount("cardb:"); +#endif +} + +/**************************************************************************** + * MountFAT + * Checks if the device needs to be (re)mounted + * If so, unmounts the device + * Attempts to mount the device specified + * Sets libfat to use the device by default + ***************************************************************************/ + +static bool MountFAT(int device, int silent) +{ + bool mounted = false; + int retry = 1; + char name[10], name2[10]; + const DISC_INTERFACE* disc = NULL; + + switch(device) + { +#ifdef HW_RVL + case DEVICE_SD: + sprintf(name, "sd"); + sprintf(name2, "sd:"); + disc = sd; + break; + case DEVICE_USB: + sprintf(name, "usb"); + sprintf(name2, "usb:"); + disc = usb; + break; +#else + case DEVICE_SD_SLOTA: + sprintf(name, "carda"); + sprintf(name2, "carda:"); + disc = carda; + break; + + case DEVICE_SD_SLOTB: + sprintf(name, "cardb"); + sprintf(name2, "cardb:"); + disc = cardb; + break; +#endif + default: + return false; // unknown device + } + + if(unmountRequired[device]) + { + unmountRequired[device] = false; + fatUnmount(name2); + disc->shutdown(); + isMounted[device] = false; + } + + while(retry) + { + if(disc->startup() && fatMountSimple(name, disc)) + mounted = true; + + if(mounted || silent) + break; + +#ifdef HW_RVL + if(device == DEVICE_SD) + retry = ErrorPromptRetry("SD card not found!"); + else + retry = ErrorPromptRetry("USB drive not found!"); +#else + retry = ErrorPromptRetry("SD card not found!"); +#endif + } + + isMounted[device] = mounted; + return mounted; +} + +void MountAllFAT() +{ +#ifdef HW_RVL + MountFAT(DEVICE_SD, SILENT); + MountFAT(DEVICE_USB, SILENT); +#else + MountFAT(DEVICE_SD_SLOTA, SILENT); + MountFAT(DEVICE_SD_SLOTB, SILENT); +#endif +} + +/**************************************************************************** + * MountDVD() + * + * Tests if a ISO9660 DVD is inserted and available, and mounts it + ***************************************************************************/ +bool MountDVD(bool silent) +{ + bool mounted = false; + int retry = 1; + + if(unmountRequired[DEVICE_DVD]) + { + unmountRequired[DEVICE_DVD] = false; + ISO9660_Unmount("dvd:"); + } + + while(retry) + { + ShowAction("Loading DVD..."); + + if(!dvd->isInserted()) + { + if(silent) + break; + + retry = ErrorPromptRetry("No disc inserted!"); + } + else if(!ISO9660_Mount("dvd", dvd)) + { + if(silent) + break; + + retry = ErrorPromptRetry("Unrecognized DVD format."); + } + else + { + mounted = true; + break; + } + } + CancelAction(); + isMounted[DEVICE_DVD] = mounted; + return mounted; +} + +bool FindDevice(char * filepath, int * device) +{ + if(!filepath || filepath[0] == 0) + return false; + + if(strncmp(filepath, "sd:", 3) == 0) + { + *device = DEVICE_SD; + return true; + } + else if(strncmp(filepath, "usb:", 4) == 0) + { + *device = DEVICE_USB; + return true; + } + else if(strncmp(filepath, "smb:", 4) == 0) + { + *device = DEVICE_SMB; + return true; + } + else if(strncmp(filepath, "carda:", 6) == 0) + { + *device = DEVICE_SD_SLOTA; + return true; + } + else if(strncmp(filepath, "cardb:", 6) == 0) + { + *device = DEVICE_SD_SLOTB; + return true; + } + else if(strncmp(filepath, "dvd:", 4) == 0) + { + *device = DEVICE_DVD; + return true; + } + return false; +} + +char * StripDevice(char * path) +{ + if(path == NULL) + return NULL; + + char * newpath = strchr(path,'/'); + + if(newpath != NULL) + newpath++; + + return newpath; +} + +/**************************************************************************** + * ChangeInterface + * Attempts to mount/configure the device specified + ***************************************************************************/ +bool ChangeInterface(int device, bool silent) +{ + if(isMounted[device]) + return true; + + bool mounted = false; + + switch(device) + { +#ifdef HW_RVL + case DEVICE_SD: + case DEVICE_USB: +#else + case DEVICE_SD_SLOTA: + case DEVICE_SD_SLOTB: +#endif + mounted = MountFAT(device, silent); + break; + case DEVICE_DVD: + mounted = MountDVD(silent); + break; + case DEVICE_SMB: + mounted = ConnectShare(silent); + break; + } + + return mounted; +} + +bool ChangeInterface(char * filepath, bool silent) +{ + int device = -1; + + if(!FindDevice(filepath, &device)) + return false; + + return ChangeInterface(device, silent); +} + +void CreateAppPath(char * origpath) +{ + if(!origpath || origpath[0] == 0) + return; + + char * path = strdup(origpath); // make a copy so we don't mess up original + + if(!path) + return; + + char * loc = strrchr(path,'/'); + if (loc != NULL) + *loc = 0; // strip file name + + int pos = 0; + + // replace fat:/ with sd:/ + if(strncmp(path, "fat:/", 5) == 0) + { + pos++; + path[1] = 's'; + path[2] = 'd'; + } + if(ChangeInterface(&path[pos], SILENT)) + snprintf(appPath, MAXPATHLEN-1, "%s", &path[pos]); + + free(path); +} + +static char *GetExt(char *file) +{ + if(!file) + return NULL; + + char *ext = strrchr(file,'.'); + if(ext != NULL) + { + ext++; + int extlen = strlen(ext); + if(extlen > 5) + return NULL; + } + return ext; +} + +bool GetFileSize(int i) +{ + if(browserList[i].length > 0) + return true; + + struct stat filestat; + char path[MAXPATHLEN+1]; + snprintf(path, MAXPATHLEN, "%s%s", browser.dir, browserList[i].filename); + + if(stat(path, &filestat) < 0) + return false; + + browserList[i].length = filestat.st_size; + return true; +} + +void FindAndSelectLastLoadedFile () +{ + int indexFound = -1; + + for(int j=1; j < browser.numEntries; j++) + { + if(strcmp(browserList[j].filename, GCSettings.LastFileLoaded) == 0) + { + indexFound = j; + break; + } + } + + // move to this file + if(indexFound > 0) + { + if(indexFound >= FILE_PAGESIZE) + { + int newIndex = (floor(indexFound/(float)FILE_PAGESIZE)) * FILE_PAGESIZE; + + if(newIndex + FILE_PAGESIZE > browser.numEntries) + newIndex = browser.numEntries - FILE_PAGESIZE; + + if(newIndex < 0) + newIndex = 0; + + browser.pageIndex = newIndex; + } + browser.selIndex = indexFound; + } + + selectLoadedFile = 2; // selecting done +} + +static bool ParseDirEntries() +{ + if(!dir) + return false; + + char *ext; + struct dirent *entry = NULL; + int isdir; + + int i = 0; + + while(i < 20 && !parseHalt) + { + entry = readdir(dir); + + if(entry == NULL) + break; + + if(entry->d_name[0] == '.' && entry->d_name[1] != '.') + continue; + + if(strcmp(entry->d_name, "..") == 0) + { + isdir = 1; + } + else + { + if(entry->d_type==DT_DIR) + isdir = 1; + else + isdir = 0; + + // don't show the file if it's not a valid ROM + if(parseFilter && !isdir) + { + ext = GetExt(entry->d_name); + + if(ext == NULL) + continue; + + if( stricmp(ext, "smc") != 0 && stricmp(ext, "fig") != 0 && + stricmp(ext, "sfc") != 0 && stricmp(ext, "swc") != 0 && + stricmp(ext, "zip") != 0 && stricmp(ext, "7z") != 0) + continue; + } + } + + if(!AddBrowserEntry()) + { + parseHalt = true; + break; + } + + snprintf(browserList[browser.numEntries+i].filename, MAXJOLIET, "%s", entry->d_name); + browserList[browser.numEntries+i].isdir = isdir; // flag this as a dir + + if(isdir) + { + if(strcmp(entry->d_name, "..") == 0) + sprintf(browserList[browser.numEntries+i].displayname, "Up One Level"); + else + snprintf(browserList[browser.numEntries+i].displayname, MAXJOLIET, "%s", browserList[browser.numEntries+i].filename); + browserList[browser.numEntries+i].icon = ICON_FOLDER; + } + else + { + StripExt(browserList[browser.numEntries+i].displayname, browserList[browser.numEntries+i].filename); // hide file extension + } + i++; + } + + if(!parseHalt) + { + // Sort the file list + if(i >= 0) + qsort(browserList, browser.numEntries+i, sizeof(BROWSERENTRY), FileSortCallback); + + browser.numEntries += i; + } + + if(entry == NULL || parseHalt) + { + closedir(dir); // close directory + dir = NULL; + + // try to find and select the last loaded file + if(selectLoadedFile == 1 && !parseHalt && loadedFile[0] != 0 && browser.dir[0] != 0) + { + int indexFound = -1; + + for(int j=1; j < browser.numEntries; j++) + { + if(strcmp(browserList[j].filename, loadedFile) == 0) + { + indexFound = j; + break; + } + } + + // move to this file + if(indexFound > 0) + { + if(indexFound >= FILE_PAGESIZE) + { + int newIndex = (floor(indexFound/(float)FILE_PAGESIZE)) * FILE_PAGESIZE; + + if(newIndex + FILE_PAGESIZE > browser.numEntries) + newIndex = browser.numEntries - FILE_PAGESIZE; + + if(newIndex < 0) + newIndex = 0; + + browser.pageIndex = newIndex; + } + browser.selIndex = indexFound; + } + selectLoadedFile = 2; // selecting done + } + return false; // no more entries + } + return true; // more entries +} + +/*************************************************************************** + * Browse subdirectories + **************************************************************************/ +int +ParseDirectory(bool waitParse, bool filter) +{ + int retry = 1; + bool mounted = false; + parseFilter = filter; + + ResetBrowser(); // reset browser + + // add trailing slash + if(browser.dir[strlen(browser.dir)-1] != '/') + strcat(browser.dir, "/"); + + // open the directory + while(dir == NULL && retry == 1) + { + mounted = ChangeInterface(browser.dir, NOTSILENT); + + if(mounted) + dir = opendir(browser.dir); + else + return -1; + + if(dir == NULL) + { + retry = ErrorPromptRetry("Error opening directory!"); + } + } + + // if we can't open the dir, try higher levels + if (dir == NULL) + { + char * devEnd = strrchr(browser.dir, '/'); + + while(!IsDeviceRoot(browser.dir)) + { + devEnd[0] = 0; // strip slash + devEnd = strrchr(browser.dir, '/'); + + if(devEnd == NULL) + break; + + devEnd[1] = 0; // strip remaining file listing + dir = opendir(browser.dir); + if (dir) + break; + } + } + + if(dir == NULL) + return -1; + + if(IsDeviceRoot(browser.dir)) + { + AddBrowserEntry(); + sprintf(browserList[0].filename, ".."); + sprintf(browserList[0].displayname, "Up One Level"); + browserList[0].length = 0; + browserList[0].isdir = 1; // flag this as a dir + browserList[0].icon = ICON_FOLDER; + browser.numEntries++; + } + + parseHalt = false; + ParseDirEntries(); // index first 20 entries + + LWP_ResumeThread(parsethread); // index remaining entries + + if(waitParse) // wait for complete parsing + { + ShowAction("Loading..."); + + while(!LWP_ThreadIsSuspended(parsethread)) + usleep(THREAD_SLEEP); + + CancelAction(); + } + + return browser.numEntries; +} + +/**************************************************************************** + * AllocSaveBuffer () + * Clear and allocate the savebuffer + ***************************************************************************/ +void +AllocSaveBuffer () +{ + if(bufferLock == LWP_MUTEX_NULL) + LWP_MutexInit(&bufferLock, false); + + if(bufferLock != LWP_MUTEX_NULL) + LWP_MutexLock(bufferLock); + memset (savebuffer, 0, SAVEBUFFERSIZE); +} + +/**************************************************************************** + * FreeSaveBuffer () + * Free the savebuffer memory + ***************************************************************************/ +void +FreeSaveBuffer () +{ + if(bufferLock != LWP_MUTEX_NULL) + LWP_MutexUnlock(bufferLock); +} + +/**************************************************************************** + * LoadSzFile + * Loads the selected file # from the specified 7z into rbuffer + * Returns file size + ***************************************************************************/ +size_t +LoadSzFile(char * filepath, unsigned char * rbuffer) +{ + size_t size = 0; + + // stop checking if devices were removed/inserted + // since we're loading a file + HaltDeviceThread(); + + // halt parsing + HaltParseThread(); + + file = fopen (filepath, "rb"); + if (file > 0) + { + size = SzExtractFile(browserList[browser.selIndex].filenum, rbuffer); + fclose (file); + } + else + { + ErrorPrompt("Error opening file!"); + } + + // go back to checking if devices were inserted/removed + ResumeDeviceThread(); + + return size; +} + +/**************************************************************************** + * LoadFile + ***************************************************************************/ +size_t +LoadFile (char * rbuffer, char *filepath, size_t length, bool silent) +{ + char zipbuffer[2048]; + size_t size = 0, offset = 0, readsize = 0; + int retry = 1; + int device; + + if(!FindDevice(filepath, &device)) + return 0; + + // stop checking if devices were removed/inserted + // since we're loading a file + HaltDeviceThread(); + + // halt parsing + HaltParseThread(); + + // open the file + while(retry) + { + if(!ChangeInterface(device, silent)) + break; + + file = fopen (filepath, "rb"); + + if(!file) + { + if(silent) + break; + + retry = ErrorPromptRetry("Error opening file!"); + continue; + } + + if(length > 0 && length <= 2048) // do a partial read (eg: to check file header) + { + size = fread (rbuffer, 1, length, file); + } + else // load whole file + { + readsize = fread (zipbuffer, 1, 32, file); + + if(!readsize) + { + unmountRequired[device] = true; + retry = ErrorPromptRetry("Error reading file!"); + fclose (file); + continue; + } + + if (IsZipFile (zipbuffer)) + { + size = UnZipBuffer ((unsigned char *)rbuffer); // unzip + } + else + { + fseeko(file,0,SEEK_END); + size = ftello(file); + fseeko(file,0,SEEK_SET); + + while(!feof(file)) + { + ShowProgress ("Loading...", offset, size); + readsize = fread (rbuffer + offset, 1, 4096, file); // read in next chunk + + if(readsize <= 0) + break; // reading finished (or failed) + + offset += readsize; + } + size = offset; + CancelAction(); + } + } + retry = 0; + fclose (file); + } + + // go back to checking if devices were inserted/removed + ResumeDeviceThread(); + CancelAction(); + return size; +} + +size_t LoadFile(char * filepath, bool silent) +{ + return LoadFile((char *)savebuffer, filepath, 0, silent); +} + +/**************************************************************************** + * SaveFile + * Write buffer to file + ***************************************************************************/ +size_t +SaveFile (char * buffer, char *filepath, size_t datasize, bool silent) +{ + size_t written = 0; + size_t writesize, nextwrite; + int retry = 1; + int device; + + if(!FindDevice(filepath, &device)) + return 0; + + if(datasize == 0) + return 0; + + // stop checking if devices were removed/inserted + // since we're saving a file + HaltDeviceThread(); + + // halt parsing + HaltParseThread(); + + ShowAction("Saving..."); + + while(!written && retry == 1) + { + if(!ChangeInterface(device, silent)) + break; + + file = fopen (filepath, "wb"); + + if(!file) + { + if(silent) + break; + + retry = ErrorPromptRetry("Error creating file!"); + continue; + } + + while(written < datasize) + { + if(datasize - written > 4096) nextwrite=4096; + else nextwrite = datasize-written; + writesize = fwrite (buffer+written, 1, nextwrite, file); + if(writesize != nextwrite) break; // write failure + written += writesize; + } + fclose (file); + + if(written != datasize) written = 0; + + if(!written) + { + unmountRequired[device] = true; + if(silent) break; + retry = ErrorPromptRetry("Error saving file!"); + } + } + + // go back to checking if devices were inserted/removed + ResumeDeviceThread(); + + CancelAction(); + return written; +} + +size_t SaveFile(char * filepath, size_t datasize, bool silent) +{ + return SaveFile((char *)savebuffer, filepath, datasize, silent); +} diff --git a/plugins/snes9x_gx/source/fileop.h b/plugins/snes9x_gx/source/fileop.h new file mode 100644 index 00000000..8bd7454b --- /dev/null +++ b/plugins/snes9x_gx/source/fileop.h @@ -0,0 +1,54 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * softdev July 2006 + * crunchy2 May 2007 + * Michniewski 2008 + * Tantric 2008-2010 + * + * fileop.h + * + * File operations + ****************************************************************************/ + +#ifndef _FILEOP_H_ +#define _FILEOP_H_ + +#include <gccore.h> +#include <stdio.h> +#include <string.h> +#include <ogcsys.h> +#include <fat.h> +#include <unistd.h> + +#define SAVEBUFFERSIZE (1024 * 512) + +void InitDeviceThread(); +void ResumeDeviceThread(); +void HaltDeviceThread(); +void HaltParseThread(); +void MountAllFAT(); +void UnmountAllFAT(); +bool FindDevice(char * filepath, int * device); +char * StripDevice(char * path); +bool ChangeInterface(int device, bool silent); +bool ChangeInterface(char * filepath, bool silent); +void CreateAppPath(char * origpath); +bool GetFileSize(int i); +void FindAndSelectLastLoadedFile(); +int ParseDirectory(bool waitParse = false, bool filter = true); +void AllocSaveBuffer(); +void FreeSaveBuffer(); +size_t LoadFile(char * rbuffer, char *filepath, size_t length, bool silent); +size_t LoadFile(char * filepath, bool silent); +size_t LoadSzFile(char * filepath, unsigned char * rbuffer); +size_t SaveFile(char * buffer, char *filepath, size_t datasize, bool silent); +size_t SaveFile(char * filepath, size_t datasize, bool silent); + +extern unsigned char *savebuffer; +extern FILE * file; +extern bool unmountRequired[]; +extern bool isMounted[]; +extern int selectLoadedFile; + +#endif diff --git a/plugins/snes9x_gx/source/filter.cpp b/plugins/snes9x_gx/source/filter.cpp new file mode 100644 index 00000000..567af538 --- /dev/null +++ b/plugins/snes9x_gx/source/filter.cpp @@ -0,0 +1,561 @@ +/**************************************************************************** + * Snes9x 1.51 Nintendo Wii/Gamecube Port + * + * Michniewski 2008 + * + * HQ2x, HQ3x, HQ4x filters + * (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + * + * filter.cpp + * + * Adapted from Snes9x Win32/MacOSX ports + * Video Filter Code (hq2x) + ****************************************************************************/ +#include <gccore.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ogcsys.h> +#include <unistd.h> +#include <malloc.h> + +#include "filter.h" +#include "video.h" +#include "snes9xGX.h" +#include "memmap.h" + +#include "menu.h" + +#define NUMBITS (16) + +static int RGBtoYUV[1<<NUMBITS]; +static uint16 RGBtoBright[1<<NUMBITS]; + +TFilterMethod FilterMethod = RenderPlain; +//TFilterMethod FilterMethodHiRes = RenderPlain; + +// +// Functions: +// + +bool +GetFilterHiResSupport (RenderFilter filterID) +{ + switch(filterID) + { + case FILTER_NONE: + return true; + + default: + return false; + } +} + +const char* +GetFilterName (RenderFilter filterID) +{ + switch(filterID) + { + default: return "Unknown"; + case FILTER_NONE: return "None"; + case FILTER_HQ2X: return "hq2x"; + case FILTER_HQ2XS: return "hq2x Soft"; + case FILTER_HQ2XBOLD: return "hq2x Bold"; + case FILTER_SCANLINES: return "Scanlines"; + } +} + +// Return pointer to appropriate function +TFilterMethod +FilterToMethod (RenderFilter filterID) +{ + switch(filterID) + { + default: + case FILTER_NONE: return RenderPlain; + case FILTER_HQ2X: return RenderHQ2X<FILTER_HQ2X>; + case FILTER_HQ2XS: return RenderHQ2X<FILTER_HQ2XS>; + case FILTER_HQ2XBOLD: return RenderHQ2X<FILTER_HQ2XBOLD>; + case FILTER_SCANLINES: return Scanlines<FILTER_SCANLINES>; + } +} + +int GetFilterScale(RenderFilter filterID) +{ + switch(filterID) + { + case FILTER_NONE: + return 1; + + default: + case FILTER_HQ2X: + case FILTER_HQ2XS: + case FILTER_HQ2XBOLD: + case FILTER_SCANLINES: + return 2; + } +} + +void +SelectFilterMethod () +{ + //InfoPrompt((char*)"Select Filter Method."); // debug + + FilterMethod = FilterToMethod((RenderFilter)GCSettings.FilterMethod); + //FilterMethodHiRes = FilterToMethod((RenderFilter)GCSettings.FilterMethodHiRes); + + // check whether or not we need filter memory (alloc or free it) +} + +// +// Filter Codes: +// + +// No enlargement, just render to the screen +void +RenderPlain (uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) +{ + if (dstPtr == NULL) + { + ErrorPrompt((char*)"dstPtr is NULL. exiting!"); + exit(1); + } + //memcpy (dstPtr, srcPtr, width*height*srcPitch); + return; +} + +// +// HQ2X Filter Code: +// + +#define Mask_2 0x07E0 // 00000 111111 00000 +#define Mask13 0xF81F // 11111 000000 11111 + +#define Ymask 0xFF0000 +#define Umask 0x00FF00 +#define Vmask 0x0000FF +#define trY 0x300000 +#define trU 0x000700 +#define trV 0x000006 + +#define Interp01(c1, c2) \ + ((((c1) == (c2)) ? (c1) : \ + (((((((c1) & Mask_2) * 3) + ((c2) & Mask_2)) >> 2) & Mask_2) + \ + ((((((c1) & Mask13) * 3) + ((c2) & Mask13)) >> 2) & Mask13)))) + +#define Interp02(c1, c2, c3) \ + ((((((c1) & Mask_2) * 2 + ((c2) & Mask_2) + ((c3) & Mask_2) ) >> 2) & Mask_2) + \ + (((((c1) & Mask13) * 2 + ((c2) & Mask13) + ((c3) & Mask13) ) >> 2) & Mask13)) + +#define Interp06(c1, c2, c3) \ + ((((((c1) & Mask_2) * 5 + ((c2) & Mask_2) * 2 + ((c3) & Mask_2) ) >> 3) & Mask_2) + \ + (((((c1) & Mask13) * 5 + ((c2) & Mask13) * 2 + ((c3) & Mask13) ) >> 3) & Mask13)) + +#define Interp07(c1, c2, c3) \ + ((((((c1) & Mask_2) * 6 + ((c2) & Mask_2) + ((c3) & Mask_2) ) >> 3) & Mask_2) + \ + (((((c1) & Mask13) * 6 + ((c2) & Mask13) + ((c3) & Mask13) ) >> 3) & Mask13)) + +#define Interp09(c1, c2, c3) \ + ((((((c1) & Mask_2) * 2 + ((c2) & Mask_2) * 3 + ((c3) & Mask_2) * 3) >> 3) & Mask_2) + \ + (((((c1) & Mask13) * 2 + ((c2) & Mask13) * 3 + ((c3) & Mask13) * 3) >> 3) & Mask13)) + +#define Interp10(c1, c2, c3) \ + ((((((c1) & Mask_2) * 14 + ((c2) & Mask_2) + ((c3) & Mask_2) ) >> 4) & Mask_2) + \ + (((((c1) & Mask13) * 14 + ((c2) & Mask13) + ((c3) & Mask13) ) >> 4) & Mask13)) + +#define PIXEL00_0 *(dp) = w5 +#define PIXEL00_10 *(dp) = Interp01(w5, w1) +#define PIXEL00_11 *(dp) = Interp01(w5, w4) +#define PIXEL00_12 *(dp) = Interp01(w5, w2) +#define PIXEL00_20 *(dp) = Interp02(w5, w4, w2) +#define PIXEL00_21 *(dp) = Interp02(w5, w1, w2) +#define PIXEL00_22 *(dp) = Interp02(w5, w1, w4) +#define PIXEL00_60 *(dp) = Interp06(w5, w2, w4) +#define PIXEL00_61 *(dp) = Interp06(w5, w4, w2) +#define PIXEL00_70 *(dp) = Interp07(w5, w4, w2) +#define PIXEL00_90 *(dp) = Interp09(w5, w4, w2) +#define PIXEL00_100 *(dp) = Interp10(w5, w4, w2) + +#define PIXEL01_0 *(dp + 1) = w5 +#define PIXEL01_10 *(dp + 1) = Interp01(w5, w3) +#define PIXEL01_11 *(dp + 1) = Interp01(w5, w2) +#define PIXEL01_12 *(dp + 1) = Interp01(w5, w6) +#define PIXEL01_20 *(dp + 1) = Interp02(w5, w2, w6) +#define PIXEL01_21 *(dp + 1) = Interp02(w5, w3, w6) +#define PIXEL01_22 *(dp + 1) = Interp02(w5, w3, w2) +#define PIXEL01_60 *(dp + 1) = Interp06(w5, w6, w2) +#define PIXEL01_61 *(dp + 1) = Interp06(w5, w2, w6) +#define PIXEL01_70 *(dp + 1) = Interp07(w5, w2, w6) +#define PIXEL01_90 *(dp + 1) = Interp09(w5, w2, w6) +#define PIXEL01_100 *(dp + 1) = Interp10(w5, w2, w6) + +#define PIXEL10_0 *(dp + dst1line) = w5 +#define PIXEL10_10 *(dp + dst1line) = Interp01(w5, w7) +#define PIXEL10_11 *(dp + dst1line) = Interp01(w5, w8) +#define PIXEL10_12 *(dp + dst1line) = Interp01(w5, w4) +#define PIXEL10_20 *(dp + dst1line) = Interp02(w5, w8, w4) +#define PIXEL10_21 *(dp + dst1line) = Interp02(w5, w7, w4) +#define PIXEL10_22 *(dp + dst1line) = Interp02(w5, w7, w8) +#define PIXEL10_60 *(dp + dst1line) = Interp06(w5, w4, w8) +#define PIXEL10_61 *(dp + dst1line) = Interp06(w5, w8, w4) +#define PIXEL10_70 *(dp + dst1line) = Interp07(w5, w8, w4) +#define PIXEL10_90 *(dp + dst1line) = Interp09(w5, w8, w4) +#define PIXEL10_100 *(dp + dst1line) = Interp10(w5, w8, w4) + +#define PIXEL11_0 *(dp + dst1line + 1) = w5 +#define PIXEL11_10 *(dp + dst1line + 1) = Interp01(w5, w9) +#define PIXEL11_11 *(dp + dst1line + 1) = Interp01(w5, w6) +#define PIXEL11_12 *(dp + dst1line + 1) = Interp01(w5, w8) +#define PIXEL11_20 *(dp + dst1line + 1) = Interp02(w5, w6, w8) +#define PIXEL11_21 *(dp + dst1line + 1) = Interp02(w5, w9, w8) +#define PIXEL11_22 *(dp + dst1line + 1) = Interp02(w5, w9, w6) +#define PIXEL11_60 *(dp + dst1line + 1) = Interp06(w5, w8, w6) +#define PIXEL11_61 *(dp + dst1line + 1) = Interp06(w5, w6, w8) +#define PIXEL11_70 *(dp + dst1line + 1) = Interp07(w5, w6, w8) +#define PIXEL11_90 *(dp + dst1line + 1) = Interp09(w5, w6, w8) +#define PIXEL11_100 *(dp + dst1line + 1) = Interp10(w5, w6, w8) + +#define Absolute(c) \ +(!(c & (1 << 31)) ? c : (~c + 1)) + +static inline bool Diff(int c1, int c2) +{ + int c1y = (c1 & Ymask) - (c2 & Ymask); + if (Absolute(c1y) > trY) return true; + int c1u = (c1 & Umask) - (c2 & Umask); + if (Absolute(c1u) > trU) return true; + int c1v = (c1 & Vmask) - (c2 & Vmask); + if (Absolute(c1v) > trV) return true; + + return false; +} + +void InitLUTs(void) +{ + int c, r, g, b, y, u, v; + + for (c = 0 ; c < (1<<NUMBITS) ; c++) + { +//#ifdef R5G6B5 + b = (int)((c & 0x1F)) << 3; + g = (int)((c & 0x7E0)) >> 3; + r = (int)((c & 0xF800)) >> 8; + +//#else +// b = (int)((c & 0x1F)) << 3; +// g = (int)((c & 0x3E0)) >> 2; +// r = (int)((c & 0x7C00)) >> 7; +//#endif + + RGBtoBright[c] = r+r+r + g+g+g + b+b; + + y = (int)( 0.256788f*r + 0.504129f*g + 0.097906f*b + 0.5f) + 16; + u = (int)(-0.148223f*r - 0.290993f*g + 0.439216f*b + 0.5f) + 128; + v = (int)( 0.439216f*r - 0.367788f*g - 0.071427f*b + 0.5f) + 128; + + RGBtoYUV[c] = (y << 16) + (u << 8) + v; + + } +} + +#define HQ2XCASES \ + case 0: case 1: case 4: case 32: case 128: case 5: case 132: case 160: case 33: case 129: case 36: case 133: case 164: case 161: case 37: case 165: PIXEL00_20; PIXEL01_20; PIXEL10_20; PIXEL11_20; break; \ + case 2: case 34: case 130: case 162: PIXEL00_22; PIXEL01_21; PIXEL10_20; PIXEL11_20; break; \ + case 16: case 17: case 48: case 49: PIXEL00_20; PIXEL01_22; PIXEL10_20; PIXEL11_21; break; \ + case 64: case 65: case 68: case 69: PIXEL00_20; PIXEL01_20; PIXEL10_21; PIXEL11_22; break; \ + case 8: case 12: case 136: case 140: PIXEL00_21; PIXEL01_20; PIXEL10_22; PIXEL11_20; break; \ + case 3: case 35: case 131: case 163: PIXEL00_11; PIXEL01_21; PIXEL10_20; PIXEL11_20; break; \ + case 6: case 38: case 134: case 166: PIXEL00_22; PIXEL01_12; PIXEL10_20; PIXEL11_20; break; \ + case 20: case 21: case 52: case 53: PIXEL00_20; PIXEL01_11; PIXEL10_20; PIXEL11_21; break; \ + case 144: case 145: case 176: case 177: PIXEL00_20; PIXEL01_22; PIXEL10_20; PIXEL11_12; break; \ + case 192: case 193: case 196: case 197: PIXEL00_20; PIXEL01_20; PIXEL10_21; PIXEL11_11; break; \ + case 96: case 97: case 100: case 101: PIXEL00_20; PIXEL01_20; PIXEL10_12; PIXEL11_22; break; \ + case 40: case 44: case 168: case 172: PIXEL00_21; PIXEL01_20; PIXEL10_11; PIXEL11_20; break; \ + case 9: case 13: case 137: case 141: PIXEL00_12; PIXEL01_20; PIXEL10_22; PIXEL11_20; break; \ + case 18: case 50: PIXEL00_22; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_10; else PIXEL01_20; PIXEL10_20; PIXEL11_21; break; \ + case 80: case 81: PIXEL00_20; PIXEL01_22; PIXEL10_21; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_10; else PIXEL11_20; break; \ + case 72: case 76: PIXEL00_21; PIXEL01_20; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_10; else PIXEL10_20; PIXEL11_22; break; \ + case 10: case 138: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_10; else PIXEL00_20; PIXEL01_21; PIXEL10_22; PIXEL11_20; break; \ + case 66: PIXEL00_22; PIXEL01_21; PIXEL10_21; PIXEL11_22; break; \ + case 24: PIXEL00_21; PIXEL01_22; PIXEL10_22; PIXEL11_21; break; \ + case 7: case 39: case 135: PIXEL00_11; PIXEL01_12; PIXEL10_20; PIXEL11_20; break; \ + case 148: case 149: case 180: PIXEL00_20; PIXEL01_11; PIXEL10_20; PIXEL11_12; break; \ + case 224: case 228: case 225: PIXEL00_20; PIXEL01_20; PIXEL10_12; PIXEL11_11; break; \ + case 41: case 169: case 45: PIXEL00_12; PIXEL01_20; PIXEL10_11; PIXEL11_20; break; \ + case 22: case 54: PIXEL00_22; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_0; else PIXEL01_20; PIXEL10_20; PIXEL11_21; break; \ + case 208: case 209: PIXEL00_20; PIXEL01_22; PIXEL10_21; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_0; else PIXEL11_20; break; \ + case 104: case 108: PIXEL00_21; PIXEL01_20; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_0; else PIXEL10_20; PIXEL11_22; break; \ + case 11: case 139: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_0; else PIXEL00_20; PIXEL01_21; PIXEL10_22; PIXEL11_20; break; \ + case 19: case 51: if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL00_11, PIXEL01_10; else PIXEL00_60, PIXEL01_90; PIXEL10_20; PIXEL11_21; break; \ + case 146: case 178: PIXEL00_22; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_10, PIXEL11_12; else PIXEL01_90, PIXEL11_61; PIXEL10_20; break; \ + case 84: case 85: PIXEL00_20; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL01_11, PIXEL11_10; else PIXEL01_60, PIXEL11_90; PIXEL10_21; break; \ + case 112: case 113: PIXEL00_20; PIXEL01_22; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL10_12, PIXEL11_10; else PIXEL10_61, PIXEL11_90; break; \ + case 200: case 204: PIXEL00_21; PIXEL01_20; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_10, PIXEL11_11; else PIXEL10_90, PIXEL11_60; break; \ + case 73: case 77: if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL00_12, PIXEL10_10; else PIXEL00_61, PIXEL10_90; PIXEL01_20; PIXEL11_22; break; \ + case 42: case 170: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_10, PIXEL10_11; else PIXEL00_90, PIXEL10_60; PIXEL01_21; PIXEL11_20; break; \ + case 14: case 142: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_10, PIXEL01_12; else PIXEL00_90, PIXEL01_61; PIXEL10_22; PIXEL11_20; break; \ + case 67: PIXEL00_11; PIXEL01_21; PIXEL10_21; PIXEL11_22; break; \ + case 70: PIXEL00_22; PIXEL01_12; PIXEL10_21; PIXEL11_22; break; \ + case 28: PIXEL00_21; PIXEL01_11; PIXEL10_22; PIXEL11_21; break; \ + case 152: PIXEL00_21; PIXEL01_22; PIXEL10_22; PIXEL11_12; break; \ + case 194: PIXEL00_22; PIXEL01_21; PIXEL10_21; PIXEL11_11; break; \ + case 98: PIXEL00_22; PIXEL01_21; PIXEL10_12; PIXEL11_22; break; \ + case 56: PIXEL00_21; PIXEL01_22; PIXEL10_11; PIXEL11_21; break; \ + case 25: PIXEL00_12; PIXEL01_22; PIXEL10_22; PIXEL11_21; break; \ + case 26: case 31: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_0; else PIXEL00_20; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_0; else PIXEL01_20; PIXEL10_22; PIXEL11_21; break; \ + case 82: case 214: PIXEL00_22; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_0; else PIXEL01_20; PIXEL10_21; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_0; else PIXEL11_20; break; \ + case 88: case 248: PIXEL00_21; PIXEL01_22; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_0; else PIXEL10_20; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_0; else PIXEL11_20; break; \ + case 74: case 107: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_0; else PIXEL00_20; PIXEL01_21; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_0; else PIXEL10_20; PIXEL11_22; break; \ + case 27: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_0; else PIXEL00_20; PIXEL01_10; PIXEL10_22; PIXEL11_21; break; \ + case 86: PIXEL00_22; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_0; else PIXEL01_20; PIXEL10_21; PIXEL11_10; break; \ + case 216: PIXEL00_21; PIXEL01_22; PIXEL10_10; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_0; else PIXEL11_20; break; \ + case 106: PIXEL00_10; PIXEL01_21; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_0; else PIXEL10_20; PIXEL11_22; break; \ + case 30: PIXEL00_10; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_0; else PIXEL01_20; PIXEL10_22; PIXEL11_21; break; \ + case 210: PIXEL00_22; PIXEL01_10; PIXEL10_21; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_0; else PIXEL11_20; break; \ + case 120: PIXEL00_21; PIXEL01_22; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_0; else PIXEL10_20; PIXEL11_10; break; \ + case 75: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_0; else PIXEL00_20; PIXEL01_21; PIXEL10_10; PIXEL11_22; break; \ + case 29: PIXEL00_12; PIXEL01_11; PIXEL10_22; PIXEL11_21; break; \ + case 198: PIXEL00_22; PIXEL01_12; PIXEL10_21; PIXEL11_11; break; \ + case 184: PIXEL00_21; PIXEL01_22; PIXEL10_11; PIXEL11_12; break; \ + case 99: PIXEL00_11; PIXEL01_21; PIXEL10_12; PIXEL11_22; break; \ + case 57: PIXEL00_12; PIXEL01_22; PIXEL10_11; PIXEL11_21; break; \ + case 71: PIXEL00_11; PIXEL01_12; PIXEL10_21; PIXEL11_22; break; \ + case 156: PIXEL00_21; PIXEL01_11; PIXEL10_22; PIXEL11_12; break; \ + case 226: PIXEL00_22; PIXEL01_21; PIXEL10_12; PIXEL11_11; break; \ + case 60: PIXEL00_21; PIXEL01_11; PIXEL10_11; PIXEL11_21; break; \ + case 195: PIXEL00_11; PIXEL01_21; PIXEL10_21; PIXEL11_11; break; \ + case 102: PIXEL00_22; PIXEL01_12; PIXEL10_12; PIXEL11_22; break; \ + case 153: PIXEL00_12; PIXEL01_22; PIXEL10_22; PIXEL11_12; break; \ + case 58: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_10; else PIXEL00_70; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_10; else PIXEL01_70; PIXEL10_11; PIXEL11_21; break; \ + case 83: PIXEL00_11; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_10; else PIXEL01_70; PIXEL10_21; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_10; else PIXEL11_70; break; \ + case 92: PIXEL00_21; PIXEL01_11; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_10; else PIXEL10_70; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_10; else PIXEL11_70; break; \ + case 202: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_10; else PIXEL00_70; PIXEL01_21; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_10; else PIXEL10_70; PIXEL11_11; break; \ + case 78: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_10; else PIXEL00_70; PIXEL01_12; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_10; else PIXEL10_70; PIXEL11_22; break; \ + case 154: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_10; else PIXEL00_70; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_10; else PIXEL01_70; PIXEL10_22; PIXEL11_12; break; \ + case 114: PIXEL00_22; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_10; else PIXEL01_70; PIXEL10_12; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_10; else PIXEL11_70; break; \ + case 89: PIXEL00_12; PIXEL01_22; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_10; else PIXEL10_70; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_10; else PIXEL11_70; break; \ + case 90: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_10; else PIXEL00_70; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_10; else PIXEL01_70; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_10; else PIXEL10_70; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_10; else PIXEL11_70; break; \ + case 55: case 23: if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL00_11, PIXEL01_0; else PIXEL00_60, PIXEL01_90; PIXEL10_20; PIXEL11_21; break; \ + case 182: case 150: PIXEL00_22; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_0, PIXEL11_12; else PIXEL01_90, PIXEL11_61; PIXEL10_20; break; \ + case 213: case 212: PIXEL00_20; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL01_11, PIXEL11_0; else PIXEL01_60, PIXEL11_90; PIXEL10_21; break; \ + case 241: case 240: PIXEL00_20; PIXEL01_22; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL10_12, PIXEL11_0; else PIXEL10_61, PIXEL11_90; break; \ + case 236: case 232: PIXEL00_21; PIXEL01_20; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_0, PIXEL11_11; else PIXEL10_90, PIXEL11_60; break; \ + case 109: case 105: if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL00_12, PIXEL10_0; else PIXEL00_61, PIXEL10_90; PIXEL01_20; PIXEL11_22; break; \ + case 171: case 43: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_0, PIXEL10_11; else PIXEL00_90, PIXEL10_60; PIXEL01_21; PIXEL11_20; break; \ + case 143: case 15: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_0, PIXEL01_12; else PIXEL00_90, PIXEL01_61; PIXEL10_22; PIXEL11_20; break; \ + case 124: PIXEL00_21; PIXEL01_11; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_0; else PIXEL10_20; PIXEL11_10; break; \ + case 203: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_0; else PIXEL00_20; PIXEL01_21; PIXEL10_10; PIXEL11_11; break; \ + case 62: PIXEL00_10; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_0; else PIXEL01_20; PIXEL10_11; PIXEL11_21; break; \ + case 211: PIXEL00_11; PIXEL01_10; PIXEL10_21; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_0; else PIXEL11_20; break; \ + case 118: PIXEL00_22; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_0; else PIXEL01_20; PIXEL10_12; PIXEL11_10; break; \ + case 217: PIXEL00_12; PIXEL01_22; PIXEL10_10; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_0; else PIXEL11_20; break; \ + case 110: PIXEL00_10; PIXEL01_12; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_0; else PIXEL10_20; PIXEL11_22; break; \ + case 155: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_0; else PIXEL00_20; PIXEL01_10; PIXEL10_22; PIXEL11_12; break; \ + case 188: PIXEL00_21; PIXEL01_11; PIXEL10_11; PIXEL11_12; break; \ + case 185: PIXEL00_12; PIXEL01_22; PIXEL10_11; PIXEL11_12; break; \ + case 61: PIXEL00_12; PIXEL01_11; PIXEL10_11; PIXEL11_21; break; \ + case 157: PIXEL00_12; PIXEL01_11; PIXEL10_22; PIXEL11_12; break; \ + case 103: PIXEL00_11; PIXEL01_12; PIXEL10_12; PIXEL11_22; break; \ + case 227: PIXEL00_11; PIXEL01_21; PIXEL10_12; PIXEL11_11; break; \ + case 230: PIXEL00_22; PIXEL01_12; PIXEL10_12; PIXEL11_11; break; \ + case 199: PIXEL00_11; PIXEL01_12; PIXEL10_21; PIXEL11_11; break; \ + case 220: PIXEL00_21; PIXEL01_11; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_10; else PIXEL10_70; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_0; else PIXEL11_20; break; \ + case 158: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_10; else PIXEL00_70; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_0; else PIXEL01_20; PIXEL10_22; PIXEL11_12; break; \ + case 234: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_10; else PIXEL00_70; PIXEL01_21; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_0; else PIXEL10_20; PIXEL11_11; break; \ + case 242: PIXEL00_22; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_10; else PIXEL01_70; PIXEL10_12; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_0; else PIXEL11_20; break; \ + case 59: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_0; else PIXEL00_20; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_10; else PIXEL01_70; PIXEL10_11; PIXEL11_21; break; \ + case 121: PIXEL00_12; PIXEL01_22; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_0; else PIXEL10_20; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_10; else PIXEL11_70; break; \ + case 87: PIXEL00_11; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_0; else PIXEL01_20; PIXEL10_21; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_10; else PIXEL11_70; break; \ + case 79: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_0; else PIXEL00_20; PIXEL01_12; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_10; else PIXEL10_70; PIXEL11_22; break; \ + case 122: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_10; else PIXEL00_70; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_10; else PIXEL01_70; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_0; else PIXEL10_20; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_10; else PIXEL11_70; break; \ + case 94: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_10; else PIXEL00_70; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_0; else PIXEL01_20; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_10; else PIXEL10_70; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_10; else PIXEL11_70; break; \ + case 218: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_10; else PIXEL00_70; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_10; else PIXEL01_70; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_10; else PIXEL10_70; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_0; else PIXEL11_20; break; \ + case 91: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_0; else PIXEL00_20; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_10; else PIXEL01_70; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_10; else PIXEL10_70; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_10; else PIXEL11_70; break; \ + case 229: PIXEL00_20; PIXEL01_20; PIXEL10_12; PIXEL11_11; break; \ + case 167: PIXEL00_11; PIXEL01_12; PIXEL10_20; PIXEL11_20; break; \ + case 173: PIXEL00_12; PIXEL01_20; PIXEL10_11; PIXEL11_20; break; \ + case 181: PIXEL00_20; PIXEL01_11; PIXEL10_20; PIXEL11_12; break; \ + case 186: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_10; else PIXEL00_70; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_10; else PIXEL01_70; PIXEL10_11; PIXEL11_12; break; \ + case 115: PIXEL00_11; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_10; else PIXEL01_70; PIXEL10_12; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_10; else PIXEL11_70; break; \ + case 93: PIXEL00_12; PIXEL01_11; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_10; else PIXEL10_70; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_10; else PIXEL11_70; break; \ + case 206: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_10; else PIXEL00_70; PIXEL01_12; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_10; else PIXEL10_70; PIXEL11_11; break; \ + case 205: case 201: PIXEL00_12; PIXEL01_20; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_10; else PIXEL10_70; PIXEL11_11; break; \ + case 174: case 46: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_10; else PIXEL00_70; PIXEL01_12; PIXEL10_11; PIXEL11_20; break; \ + case 179: case 147: PIXEL00_11; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_10; else PIXEL01_70; PIXEL10_20; PIXEL11_12; break; \ + case 117: case 116: PIXEL00_20; PIXEL01_11; PIXEL10_12; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_10; else PIXEL11_70; break; \ + case 189: PIXEL00_12; PIXEL01_11; PIXEL10_11; PIXEL11_12; break; \ + case 231: PIXEL00_11; PIXEL01_12; PIXEL10_12; PIXEL11_11; break; \ + case 126: PIXEL00_10; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_0; else PIXEL01_20; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_0; else PIXEL10_20; PIXEL11_10; break; \ + case 219: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_0; else PIXEL00_20; PIXEL01_10; PIXEL10_10; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_0; else PIXEL11_20; break; \ + case 125: if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL00_12, PIXEL10_0; else PIXEL00_61, PIXEL10_90; PIXEL01_11; PIXEL11_10; break; \ + case 221: PIXEL00_12; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL01_11, PIXEL11_0; else PIXEL01_60, PIXEL11_90; PIXEL10_10; break; \ + case 207: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_0, PIXEL01_12; else PIXEL00_90, PIXEL01_61; PIXEL10_10; PIXEL11_11; break; \ + case 238: PIXEL00_10; PIXEL01_12; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_0, PIXEL11_11; else PIXEL10_90, PIXEL11_60; break; \ + case 190: PIXEL00_10; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_0, PIXEL11_12; else PIXEL01_90, PIXEL11_61; PIXEL10_11; break; \ + case 187: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_0, PIXEL10_11; else PIXEL00_90, PIXEL10_60; PIXEL01_10; PIXEL11_12; break; \ + case 243: PIXEL00_11; PIXEL01_10; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL10_12, PIXEL11_0; else PIXEL10_61, PIXEL11_90; break; \ + case 119: if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL00_11, PIXEL01_0; else PIXEL00_60, PIXEL01_90; PIXEL10_12; PIXEL11_10; break; \ + case 237: case 233: PIXEL00_12; PIXEL01_20; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_0; else PIXEL10_100; PIXEL11_11; break; \ + case 175: case 47: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_0; else PIXEL00_100; PIXEL01_12; PIXEL10_11; PIXEL11_20; break; \ + case 183: case 151: PIXEL00_11; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_0; else PIXEL01_100; PIXEL10_20; PIXEL11_12; break; \ + case 245: case 244: PIXEL00_20; PIXEL01_11; PIXEL10_12; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_0; else PIXEL11_100; break; \ + case 250: PIXEL00_10; PIXEL01_10; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_0; else PIXEL10_20; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_0; else PIXEL11_20; break; \ + case 123: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_0; else PIXEL00_20; PIXEL01_10; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_0; else PIXEL10_20; PIXEL11_10; break; \ + case 95: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_0; else PIXEL00_20; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_0; else PIXEL01_20; PIXEL10_10; PIXEL11_10; break; \ + case 222: PIXEL00_10; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_0; else PIXEL01_20; PIXEL10_10; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_0; else PIXEL11_20; break; \ + case 252: PIXEL00_21; PIXEL01_11; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_0; else PIXEL10_20; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_0; else PIXEL11_100; break; \ + case 249: PIXEL00_12; PIXEL01_22; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_0; else PIXEL10_100; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_0; else PIXEL11_20; break; \ + case 235: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_0; else PIXEL00_20; PIXEL01_21; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_0; else PIXEL10_100; PIXEL11_11; break; \ + case 111: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_0; else PIXEL00_100; PIXEL01_12; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_0; else PIXEL10_20; PIXEL11_22; break; \ + case 63: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_0; else PIXEL00_100; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_0; else PIXEL01_20; PIXEL10_11; PIXEL11_21; break; \ + case 159: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_0; else PIXEL00_20; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_0; else PIXEL01_100; PIXEL10_22; PIXEL11_12; break; \ + case 215: PIXEL00_11; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_0; else PIXEL01_100; PIXEL10_21; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_0; else PIXEL11_20; break; \ + case 246: PIXEL00_22; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_0; else PIXEL01_20; PIXEL10_12; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_0; else PIXEL11_100; break; \ + case 254: PIXEL00_10; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_0; else PIXEL01_20; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_0; else PIXEL10_20; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_0; else PIXEL11_100; break; \ + case 253: PIXEL00_12; PIXEL01_11; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_0; else PIXEL10_100; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_0; else PIXEL11_100; break; \ + case 251: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_0; else PIXEL00_20; PIXEL01_10; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_0; else PIXEL10_100; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_0; else PIXEL11_20; break; \ + case 239: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_0; else PIXEL00_100; PIXEL01_12; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_0; else PIXEL10_100; PIXEL11_11; break; \ + case 127: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_0; else PIXEL00_100; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_0; else PIXEL01_20; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_0; else PIXEL10_20; PIXEL11_10; break; \ + case 191: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_0; else PIXEL00_100; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_0; else PIXEL01_100; PIXEL10_11; PIXEL11_12; break; \ + case 223: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_0; else PIXEL00_20; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_0; else PIXEL01_100; PIXEL10_10; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_0; else PIXEL11_20; break; \ + case 247: PIXEL00_11; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_0; else PIXEL01_100; PIXEL10_12; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_0; else PIXEL11_100; break; \ + case 255: if (Diff(RGBtoYUVtable[w4], RGBtoYUVtable[w2])) PIXEL00_0; else PIXEL00_100; if (Diff(RGBtoYUVtable[w2], RGBtoYUVtable[w6])) PIXEL01_0; else PIXEL01_100; if (Diff(RGBtoYUVtable[w8], RGBtoYUVtable[w4])) PIXEL10_0; else PIXEL10_100; if (Diff(RGBtoYUVtable[w6], RGBtoYUVtable[w8])) PIXEL11_0; else PIXEL11_100; break; + +template<int GuiScale> +void RenderHQ2X (uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) +{ + // If Snes9x is rendering anything in HiRes, then just copy, don't interpolate + if (height > SNES_HEIGHT_EXTENDED || width == 512) + { + //RenderSimple2X (Src, Dst, rect); + return; + } + + int w1, w2, w3, w4, w5, w6, w7, w8, w9; + + uint32 src1line = srcPitch >> 1; + uint32 dst1line = dstPitch >> 1; + uint16 *sp = (uint16 *) srcPtr; + uint16 *dp = (uint16 *) dstPtr; + + const int* RGBtoYUVtable = RGBtoYUV; + + uint32 pattern; + int l, y; + + while (height--) + { + sp--; + + w1 = *(sp - src1line); + w4 = *(sp); + w7 = *(sp + src1line); + + sp++; + + w2 = *(sp - src1line); + w5 = *(sp); + w8 = *(sp + src1line); + + for (l = width; l; l--) + { + sp++; + + w3 = *(sp - src1line); + w6 = *(sp); + w9 = *(sp + src1line); + + pattern = 0; + + switch(GuiScale) + { + case FILTER_HQ2XBOLD: { + const uint16 avg = (RGBtoBright[w1] + RGBtoBright[w2] + RGBtoBright[w3] + RGBtoBright[w4] + RGBtoBright[w5] + RGBtoBright[w6] + RGBtoBright[w7] + RGBtoBright[w8] + RGBtoBright[w9]) / 9; + const bool diff5 = RGBtoBright[w5] > avg; + if ((w1 != w5) && ((RGBtoBright[w1] > avg) != diff5)) pattern |= (1 << 0); + if ((w2 != w5) && ((RGBtoBright[w2] > avg) != diff5)) pattern |= (1 << 1); + if ((w3 != w5) && ((RGBtoBright[w3] > avg) != diff5)) pattern |= (1 << 2); + if ((w4 != w5) && ((RGBtoBright[w4] > avg) != diff5)) pattern |= (1 << 3); + if ((w6 != w5) && ((RGBtoBright[w6] > avg) != diff5)) pattern |= (1 << 4); + if ((w7 != w5) && ((RGBtoBright[w7] > avg) != diff5)) pattern |= (1 << 5); + if ((w8 != w5) && ((RGBtoBright[w8] > avg) != diff5)) pattern |= (1 << 6); + if ((w9 != w5) && ((RGBtoBright[w9] > avg) != diff5)) pattern |= (1 << 7); + } break; + + case FILTER_HQ2XS: { + bool nosame = true; + if(w1 == w5 || w3 == w5 || w7 == w5 || w9 == w5) + nosame = false; + + if(nosame) + { + const uint16 avg = (RGBtoBright[w1] + RGBtoBright[w2] + RGBtoBright[w3] + RGBtoBright[w4] + RGBtoBright[w5] + RGBtoBright[w6] + RGBtoBright[w7] + RGBtoBright[w8] + RGBtoBright[w9]) / 9; + const bool diff5 = RGBtoBright[w5] > avg; + if((RGBtoBright[w1] > avg) != diff5) pattern |= (1 << 0); + if((RGBtoBright[w2] > avg) != diff5) pattern |= (1 << 1); + if((RGBtoBright[w3] > avg) != diff5) pattern |= (1 << 2); + if((RGBtoBright[w4] > avg) != diff5) pattern |= (1 << 3); + if((RGBtoBright[w6] > avg) != diff5) pattern |= (1 << 4); + if((RGBtoBright[w7] > avg) != diff5) pattern |= (1 << 5); + if((RGBtoBright[w8] > avg) != diff5) pattern |= (1 << 6); + if((RGBtoBright[w9] > avg) != diff5) pattern |= (1 << 7); + } + else + { + y = RGBtoYUV[w5]; + if ((w1 != w5) && (Diff(y, RGBtoYUV[w1]))) pattern |= (1 << 0); + if ((w2 != w5) && (Diff(y, RGBtoYUV[w2]))) pattern |= (1 << 1); + if ((w3 != w5) && (Diff(y, RGBtoYUV[w3]))) pattern |= (1 << 2); + if ((w4 != w5) && (Diff(y, RGBtoYUV[w4]))) pattern |= (1 << 3); + if ((w6 != w5) && (Diff(y, RGBtoYUV[w6]))) pattern |= (1 << 4); + if ((w7 != w5) && (Diff(y, RGBtoYUV[w7]))) pattern |= (1 << 5); + if ((w8 != w5) && (Diff(y, RGBtoYUV[w8]))) pattern |= (1 << 6); + if ((w9 != w5) && (Diff(y, RGBtoYUV[w9]))) pattern |= (1 << 7); + } + } break; + default: + case FILTER_HQ2X: + y = RGBtoYUVtable[w5]; + if ((w1 != w5) && (Diff(y, RGBtoYUVtable[w1]))) pattern |= (1 << 0); + if ((w2 != w5) && (Diff(y, RGBtoYUVtable[w2]))) pattern |= (1 << 1); + if ((w3 != w5) && (Diff(y, RGBtoYUVtable[w3]))) pattern |= (1 << 2); + if ((w4 != w5) && (Diff(y, RGBtoYUVtable[w4]))) pattern |= (1 << 3); + if ((w6 != w5) && (Diff(y, RGBtoYUVtable[w6]))) pattern |= (1 << 4); + if ((w7 != w5) && (Diff(y, RGBtoYUVtable[w7]))) pattern |= (1 << 5); + if ((w8 != w5) && (Diff(y, RGBtoYUVtable[w8]))) pattern |= (1 << 6); + if ((w9 != w5) && (Diff(y, RGBtoYUVtable[w9]))) pattern |= (1 << 7); + break; + } + + switch (pattern) + { + HQ2XCASES + } + + w1 = w2; w4 = w5; w7 = w8; + w2 = w3; w5 = w6; w8 = w9; + + dp += 2; + } + + dp += ((dst1line - width) << 1); + sp += (src1line - width); + } +} + +template<int GuiScale> +void Scanlines (uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) +{ + while (height--) { + uint16 *dp = (uint16 *) dstPtr; + for (int i = 0; i < width; ++i, dp += 2) { + uint16 sp = *((uint16 *)srcPtr + i); + *(dp) = sp; + *(dp + 1) = sp; + *(dp + dstPitch) = 0; + *(dp + dstPitch + 1) = 0; + } + dstPtr += dstPitch<<1; + srcPtr += srcPitch; + } +} \ No newline at end of file diff --git a/plugins/snes9x_gx/source/filter.h b/plugins/snes9x_gx/source/filter.h new file mode 100644 index 00000000..cacbcb6c --- /dev/null +++ b/plugins/snes9x_gx/source/filter.h @@ -0,0 +1,64 @@ +/**************************************************************************** + * Snes9x 1.51 Nintendo Wii/Gamecube Port + * + * Michniewski 2008 + * + * filter.h + * + * Filters Header File + ****************************************************************************/ +#ifndef _FILTER_H_ +#define _FILTER_H_ + +#include <gccore.h> +#include <ogcsys.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <sys/types.h> + +#include "snes9x.h" + +enum RenderFilter{ + FILTER_NONE = 0, + + FILTER_HQ2X, + FILTER_HQ2XS, + FILTER_HQ2XBOLD, + FILTER_SCANLINES, + + NUM_FILTERS +}; + +#define EXT_WIDTH (MAX_SNES_WIDTH + 4) +#define EXT_PITCH (EXT_WIDTH * 2) +#define EXT_HEIGHT (MAX_SNES_HEIGHT + 4) +// Offset into buffer to allow a two pixel border around the whole rendered +// SNES image. This is a speed up hack to allow some of the image processing +// routines to access black pixel data outside the normal bounds of the buffer. +#define EXT_OFFSET (EXT_PITCH * 2 + 2 * 2) + +typedef void (*TFilterMethod)(uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height); + +extern TFilterMethod FilterMethod; +extern TFilterMethod FilterMethodHiRes; + +extern unsigned char * filtermem; + +// +// Prototypes +// +void SelectFilterMethod (); +void RenderPlain (uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height); +void SelectFilterMethod (); +TFilterMethod FilterToMethod (RenderFilter filterID); +const char* GetFilterName (RenderFilter filterID); +bool GetFilterHiResSupport (RenderFilter filterID); +int GetFilterScale(RenderFilter filterID); +template<int GuiScale> void RenderHQ2X (uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height); +template<int GuiScale> void Scanlines (uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height); +void InitLUTs(); + +#endif + diff --git a/plugins/snes9x_gx/source/fonts/font.ttf b/plugins/snes9x_gx/source/fonts/font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..01ce58166c4c97ca7ed556833ac8ecd30a40823c GIT binary patch literal 55620 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 HDeCpV@y8L~ literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/freeze.cpp b/plugins/snes9x_gx/source/freeze.cpp new file mode 100644 index 00000000..234e7641 --- /dev/null +++ b/plugins/snes9x_gx/source/freeze.cpp @@ -0,0 +1,168 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * softdev July 2006 + * crunchy2 May 2007-July 2007 + * Michniewski 2008 + * Tantric 2008-2010 + * + * freeze.cpp + ***************************************************************************/ + +#include <malloc.h> +#include <gccore.h> +#include <stdio.h> + +#include "snes9xgx.h" +#include "fileop.h" +#include "filebrowser.h" +#include "menu.h" +#include "video.h" +#include "utils/pngu.h" + +#include "snes9x/snes9x.h" +#include "snes9x/port.h" +#include "snes9x/memmap.h" +#include "snes9x/snapshot.h" +#include "snes9x/language.h" + +bool8 S9xOpenSnapshotFile(const char *filepath, bool8 readonly, STREAM *file) +{ + return FALSE; +} + +void S9xCloseSnapshotFile(STREAM s) +{ + +} + +/**************************************************************************** + * SaveSnapshot + ***************************************************************************/ + +int +SaveSnapshot (char * filepath, bool silent) +{ + int device; + + if(!FindDevice(filepath, &device)) + return 0; + + // save screenshot + if(gameScreenPngSize > 0) + { + char screenpath[1024]; + strcpy(screenpath, filepath); + screenpath[strlen(screenpath)-4] = 0; + sprintf(screenpath, "%s.png", screenpath); + SaveFile((char *)gameScreenPng, screenpath, gameScreenPngSize, silent); + } + + STREAM fp = OPEN_STREAM(filepath, "wb"); + + if(!fp) + { + if(!silent) + ErrorPrompt("Save failed!"); + return 0; + } + + S9xFreezeToStream(fp); + CLOSE_STREAM(fp); + + if(!silent) + InfoPrompt("Save successful"); + return 1; +} + +int +SaveSnapshotAuto (bool silent) +{ + char filepath[1024]; + + if(!MakeFilePath(filepath, FILE_SNAPSHOT, Memory.ROMFilename, 0)) + return false; + + return SaveSnapshot(filepath, silent); +} + +/**************************************************************************** + * LoadSnapshot + ***************************************************************************/ +int +LoadSnapshot (char * filepath, bool silent) +{ + int device; + + if(!FindDevice(filepath, &device)) + return 0; + + STREAM fp = OPEN_STREAM(filepath, "rb"); + + if(!fp) + { + if(!silent) + ErrorPrompt("Unable to open snapshot!"); + return 0; + } + + int result = S9xUnfreezeFromStream(fp); + CLOSE_STREAM(fp); + + if (result == SUCCESS) + return 1; + + switch (result) + { + case WRONG_FORMAT: + ErrorPrompt(SAVE_ERR_WRONG_FORMAT); + break; + + case WRONG_VERSION: + ErrorPrompt(SAVE_ERR_WRONG_VERSION); + break; + + case SNAPSHOT_INCONSISTENT: + ErrorPrompt(MOVIE_ERR_SNAPSHOT_INCONSISTENT); + break; + } + return 0; +} + +int +LoadSnapshotAuto (bool silent) +{ + char filepath[1024]; + + if(!MakeFilePath(filepath, FILE_SNAPSHOT, Memory.ROMFilename, 0)) + return false; + + return LoadSnapshot(filepath, silent); +} + +/**************************************************************************** + * SavePreview + ***************************************************************************/ + +int +SavePreviewImg (char * filepath, bool silent) +{ + int device; + + if(!FindDevice(filepath, &device)) + return 0; + + // save screenshot + if(gameScreenPngSize > 0) + { + char screenpath[1024]; + strcpy(screenpath, filepath); + screenpath[strlen(screenpath)] = 0; + sprintf(screenpath, "%s.png", screenpath); + SaveFile((char *)gameScreenPng, screenpath, gameScreenPngSize, silent); + } + + if(!silent) + InfoPrompt("Save successful"); + return 1; +} \ No newline at end of file diff --git a/plugins/snes9x_gx/source/freeze.h b/plugins/snes9x_gx/source/freeze.h new file mode 100644 index 00000000..9615bfda --- /dev/null +++ b/plugins/snes9x_gx/source/freeze.h @@ -0,0 +1,20 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * softdev July 2006 + * crunchy2 May 2007-July 2007 + * Michniewski 2008 + * Tantric 2008-2010 + * + * freeze.h + ***************************************************************************/ + +#ifndef _FREEZE_H_ +#define _FREEZE_H_ + +int SaveSnapshot (char * filepath, bool silent); +int SaveSnapshotAuto (bool silent); +int LoadSnapshot (char * filepath, bool silent); +int LoadSnapshotAuto (bool silent); +int SavePreviewImg (char * filepath, bool silent); +#endif diff --git a/plugins/snes9x_gx/source/gcunzip.cpp b/plugins/snes9x_gx/source/gcunzip.cpp new file mode 100644 index 00000000..01562d67 --- /dev/null +++ b/plugins/snes9x_gx/source/gcunzip.cpp @@ -0,0 +1,529 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * softdev July 2006 + * Michniewski 2008 + * Tantric 2008-2010 + * + * gcunzip.cpp + * + * File unzip routines + ***************************************************************************/ + +#include <gccore.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <zlib.h> +#include <sys/stat.h> + +#include "snes9xgx.h" +#include "fileop.h" +#include "filebrowser.h" +#include "menu.h" +#include "gcunzip.h" + +extern "C" { +#include "utils/sz/7zCrc.h" +#include "utils/sz/7zIn.h" +#include "utils/sz/7zExtract.h" +} + +#define ZIPCHUNK 2048 + +/* + * Zip file header definition + */ +typedef struct +{ + unsigned int zipid __attribute__ ((__packed__)); // 0x04034b50 + unsigned short zipversion __attribute__ ((__packed__)); + unsigned short zipflags __attribute__ ((__packed__)); + unsigned short compressionMethod __attribute__ ((__packed__)); + unsigned short lastmodtime __attribute__ ((__packed__)); + unsigned short lastmoddate __attribute__ ((__packed__)); + unsigned int crc32 __attribute__ ((__packed__)); + unsigned int compressedSize __attribute__ ((__packed__)); + unsigned int uncompressedSize __attribute__ ((__packed__)); + unsigned short filenameLength __attribute__ ((__packed__)); + unsigned short extraDataLength __attribute__ ((__packed__)); +} +PKZIPHEADER; + +/* + * Zip files are stored little endian + * Support functions for short and int types + */ +static u32 +FLIP32 (u32 b) +{ + unsigned int c; + + c = (b & 0xff000000) >> 24; + c |= (b & 0xff0000) >> 8; + c |= (b & 0xff00) << 8; + c |= (b & 0xff) << 24; + + return c; +} + +static u16 +FLIP16 (u16 b) +{ + u16 c; + + c = (b & 0xff00) >> 8; + c |= (b & 0xff) << 8; + + return c; +} + +/**************************************************************************** + * IsZipFile + * + * Returns TRUE when 0x504b0304 is first four characters of buffer + ***************************************************************************/ +int +IsZipFile (char *buffer) +{ + unsigned int *check = (unsigned int *) buffer; + + if (check[0] == 0x504b0304) + return 1; + + return 0; +} + +/***************************************************************************** +* UnZipBuffer +******************************************************************************/ + +size_t +UnZipBuffer (unsigned char *outbuffer) +{ + PKZIPHEADER pkzip; + size_t zipoffset = 0; + size_t zipchunk = 0; + char out[ZIPCHUNK]; + z_stream zs; + int res; + size_t bufferoffset = 0; + size_t have = 0; + char readbuffer[ZIPCHUNK]; + size_t sizeread = 0; + + // Read Zip Header + fseek(file, 0, SEEK_SET); + sizeread = fread (readbuffer, 1, ZIPCHUNK, file); + + if(sizeread <= 0) + return 0; + + /*** Copy PKZip header to local, used as info ***/ + memcpy (&pkzip, readbuffer, sizeof (PKZIPHEADER)); + + pkzip.uncompressedSize = FLIP32 (pkzip.uncompressedSize); + + ShowProgress ("Loading...", 0, pkzip.uncompressedSize); + + /*** Prepare the zip stream ***/ + memset (&zs, 0, sizeof (z_stream)); + zs.zalloc = Z_NULL; + zs.zfree = Z_NULL; + zs.opaque = Z_NULL; + zs.avail_in = 0; + zs.next_in = Z_NULL; + res = inflateInit2 (&zs, -MAX_WBITS); + + if (res != Z_OK) + goto done; + + /*** Set ZipChunk for first pass ***/ + zipoffset = + (sizeof (PKZIPHEADER) + FLIP16 (pkzip.filenameLength) + + FLIP16 (pkzip.extraDataLength)); + zipchunk = ZIPCHUNK - zipoffset; + + /*** Now do it! ***/ + do + { + zs.avail_in = zipchunk; + zs.next_in = (Bytef *) & readbuffer[zipoffset]; + + /*** Now inflate until input buffer is exhausted ***/ + do + { + zs.avail_out = ZIPCHUNK; + zs.next_out = (Bytef *) & out; + + res = inflate (&zs, Z_NO_FLUSH); + + if (res == Z_MEM_ERROR) + { + goto done; + } + + have = ZIPCHUNK - zs.avail_out; + if (have) + { + /*** Copy to normal block buffer ***/ + memcpy (&outbuffer[bufferoffset], &out, have); + bufferoffset += have; + } + } + while (zs.avail_out == 0); + + // Readup the next 2k block + zipoffset = 0; + zipchunk = ZIPCHUNK; + + sizeread = fread (readbuffer, 1, ZIPCHUNK, file); + if(sizeread <= 0) + goto done; // read failure + + ShowProgress ("Loading...", bufferoffset, pkzip.uncompressedSize); + } + while (res != Z_STREAM_END); + +done: + inflateEnd (&zs); + CancelAction(); + + if (res == Z_STREAM_END) + return pkzip.uncompressedSize; + else + return 0; +} + +/**************************************************************************** +* GetFirstZipFilename +* +* Returns the filename of the first file in the zipped archive +* The idea here is to do the least amount of work required +***************************************************************************/ + +char * +GetFirstZipFilename () +{ + char * firstFilename = NULL; + char tempbuffer[ZIPCHUNK]; + char filepath[1024]; + + if(!MakeFilePath(filepath, FILE_ROM)) + return NULL; + + // read start of ZIP + if(LoadFile (tempbuffer, filepath, ZIPCHUNK, NOTSILENT) < 35) + return NULL; + + tempbuffer[28] = 0; // truncate - filename length is 2 bytes long (bytes 26-27) + int namelength = tempbuffer[26]; // filename length starts 26 bytes in + + if(namelength < 0 || namelength > 200) // filename is not a reasonable length + { + ErrorPrompt("Error - Invalid ZIP file!"); + return NULL; + } + + firstFilename = &tempbuffer[30]; // first filename of a ZIP starts 31 bytes in + firstFilename[namelength] = 0; // truncate at filename length + return strdup(firstFilename); +} + +/**************************************************************************** +* 7z functions +***************************************************************************/ + +typedef struct _SzFileInStream +{ + ISzInStream InStream; + u64 offset; // offset of the file + unsigned int len; // length of the file + u64 pos; // current position of the file pointer +} SzFileInStream; + +// 7zip error list +static char szerrormsg[][100] = { + "File is corrupt.", // 7z: Data error + "Archive contains too many files.", // 7z: Out of memory + "File is corrupt (CRC mismatch).", // 7z: CRC Error + "File uses unsupported compression settings.", // 7z: Not implemented + "File is corrupt.", // 7z: Fail + "Failed to read file data.", // 7z: Data read failure + "File is corrupt.", // 7z: Archive error + "File uses too high of compression settings (dictionary size is too large).", // 7z: Dictionary too large +}; + +static SZ_RESULT SzRes; +static SzFileInStream SzArchiveStream; +static CArchiveDatabaseEx SzDb; +static ISzAlloc SzAllocImp; +static ISzAlloc SzAllocTempImp; +static UInt32 SzBlockIndex = 0xFFFFFFFF; +static size_t SzBufferSize; +static size_t SzOffset; +static size_t SzOutSizeProcessed; +static CFileItem *SzF; + +static char sz_buffer[2048]; +static int szMethod = 0; + +/**************************************************************************** +* Is7ZipFile +* +* Returns 1 when 7z signature is found +****************************************************************************/ +int +Is7ZipFile (char *buffer) +{ + // 7z signature + static Byte Signature[6] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C}; + + int i; + for(i = 0; i < 6; i++) + if(buffer[i] != Signature[i]) + return 0; + + return 1; // 7z archive found +} + +// display an error message +static void SzDisplayError(SZ_RESULT res) +{ + char msg[1024]; + sprintf(msg, "7z decompression failed: %s", szerrormsg[(res - 1)]); + ErrorPrompt(msg); +} + +// function used by the 7zip SDK to read data from SD/USB/DVD/SMB +static SZ_RESULT SzFileReadImp(void *object, void **buffer, size_t maxRequiredSize, size_t *processedSize) +{ + size_t sizeread = 0; + + if(maxRequiredSize == 0) + return SZ_OK; + + // the void* object is a SzFileInStream + SzFileInStream *s = (SzFileInStream *) object; + + if (maxRequiredSize > 2048) + maxRequiredSize = 2048; + + // read data + sizeread = fread(sz_buffer, 1, maxRequiredSize, file); + + if(sizeread <= 0) + return SZE_FAILREAD; + + *buffer = sz_buffer; + *processedSize = sizeread; + s->pos += sizeread; + + if(sizeread > 1024) // only show progress for large reads + // this isn't quite right, but oh well + ShowProgress ("Loading...", s->pos, browserList[browser.selIndex].length); + + return SZ_OK; +} + +// function used by the 7zip SDK to change the filepointer +static SZ_RESULT SzFileSeekImp(void *object, CFileSize pos) +{ + // the void* object is a SzFileInStream + SzFileInStream *s = (SzFileInStream *) object; + + // check if the 7z SDK wants to move the pointer to somewhere after the EOF + if (pos >= s->len) + return SZE_FAIL; + + // save new position and return + if(fseek(file, (long)pos, SEEK_SET) != 0) + return SZE_FAIL; + + s->pos = pos; + return SZ_OK; +} + +/**************************************************************************** +* SzClose +* +* Closes a 7z file +***************************************************************************/ + +void SzClose() +{ + if(SzDb.Database.NumFiles > 0) + SzArDbExFree(&SzDb, SzAllocImp.Free); +} + + +/**************************************************************************** +* SzParse +* +* Opens a 7z file, and parses it +* It parses the entire 7z for full browsing capability +***************************************************************************/ + +int SzParse(char * filepath) +{ + if(!filepath) + return 0; + + int device; + + struct stat filestat; + if(stat(filepath, &filestat) < 0) + return 0; + unsigned int filelen = filestat.st_size; + + if(!FindDevice(filepath, &device) || !filelen) + return 0; + + int nbfiles = 0; + // setup archive stream + SzArchiveStream.offset = 0; + SzArchiveStream.len = filelen; + SzArchiveStream.pos = 0; + + // open file + file = fopen (filepath, "rb"); + if(!file) + return 0; + + // set szMethod to current chosen load device + szMethod = device; + + // set handler functions for reading data from SD/USB/SMB/DVD + SzArchiveStream.InStream.Read = SzFileReadImp; + SzArchiveStream.InStream.Seek = SzFileSeekImp; + + // set default 7Zip SDK handlers for allocation and freeing memory + SzAllocImp.Alloc = SzAlloc; + SzAllocImp.Free = SzFree; + SzAllocTempImp.Alloc = SzAllocTemp; + SzAllocTempImp.Free = SzFreeTemp; + + // prepare CRC and 7Zip database structures + InitCrcTable(); + SzArDbExInit(&SzDb); + + // open the archive + SzRes = SzArchiveOpen(&SzArchiveStream.InStream, &SzDb, &SzAllocImp, + &SzAllocTempImp); + + if (SzRes != SZ_OK) + { + SzDisplayError(SzRes); + // free memory used by the 7z SDK + SzClose(); + } + else // archive opened successfully + { + if(SzDb.Database.NumFiles > 0) + { + // Parses the 7z into a full file listing + + HaltParseThread(); // halt parsing + ResetBrowser(); // reset browser + + // add '..' folder in case the user wants exit the 7z + AddBrowserEntry(); + sprintf(browserList[0].filename, ".."); + sprintf(browserList[0].displayname, "Up One Level"); + browserList[0].isdir = 1; + browserList[0].length = filelen; + browserList[0].icon = ICON_FOLDER; + + // get contents and parse them into file list structure + unsigned int SzI, SzJ; + SzJ = 1; + for (SzI = 0; SzI < SzDb.Database.NumFiles; SzI++) + { + SzF = SzDb.Database.Files + SzI; + + // skip directories + if (SzF->IsDirectory) + continue; + + if(!AddBrowserEntry()) + { + ResetBrowser(); + ErrorPrompt("Out of memory: too many files!"); + SzClose(); + SzJ = 0; + break; + } + + // parse information about this file to the file list structure + snprintf(browserList[SzJ].filename, MAXJOLIET, "%s", SzF->Name); + StripExt(browserList[SzJ].displayname, browserList[SzJ].filename); + char* strPos = strstr(browserList[SzJ].displayname, szname); + if(strPos) + { + snprintf(browserList[SzJ].displayname, MAXJOLIET, "%s", strPos + strlen(szname)); + } + + browserList[SzJ].length = SzF->Size; // filesize + browserList[SzJ].isdir = 0; // only files will be displayed (-> no flags) + browserList[SzJ].filenum = SzI; // the extraction function identifies the file with this number + SzJ++; + } + nbfiles = SzJ; + } + else + { + SzClose(); + } + } + + CancelAction(); + + // close file + fclose(file); + return nbfiles; +} + +/**************************************************************************** +* SzExtractFile +* +* Extracts the given file # into the buffer specified +* Must parse the 7z BEFORE running this function +***************************************************************************/ + +size_t SzExtractFile(int i, unsigned char *buffer) +{ + // prepare some variables + SzBlockIndex = 0xFFFFFFFF; + SzOffset = 0; + + // Unzip the file + + SzRes = SzExtract2( + &SzArchiveStream.InStream, + &SzDb, + i, // index of file + &SzBlockIndex, // index of solid block + &buffer, + &SzBufferSize, + &SzOffset, // offset of stream for required file in *outBuffer + &SzOutSizeProcessed, // size of file in *outBuffer + &SzAllocImp, + &SzAllocTempImp); + + // close 7Zip archive and free memory + SzClose(); + + CancelAction(); + + // check for errors + if(SzRes != SZ_OK) + { + // display error message + SzDisplayError(SzRes); + return 0; + } + else + { + return SzOutSizeProcessed; + } +} diff --git a/plugins/snes9x_gx/source/gcunzip.h b/plugins/snes9x_gx/source/gcunzip.h new file mode 100644 index 00000000..9b606bf5 --- /dev/null +++ b/plugins/snes9x_gx/source/gcunzip.h @@ -0,0 +1,22 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * softdev July 2006 + * Michniewski 2008 + * Tantric 2008-2010 + * + * gcunzip.h + * + * File unzip routines + ****************************************************************************/ +#ifndef _GCUNZIP_H_ +#define _GCUNZIP_H_ + +int IsZipFile (char *buffer); +char * GetFirstZipFilename(); +size_t UnZipBuffer (unsigned char *outbuffer); +int SzParse(char * filepath); +size_t SzExtractFile(int i, unsigned char *buffer); +void SzClose(); + +#endif diff --git a/plugins/snes9x_gx/source/gui/gui.h b/plugins/snes9x_gx/source/gui/gui.h new file mode 100644 index 00000000..7f31cc05 --- /dev/null +++ b/plugins/snes9x_gx/source/gui/gui.h @@ -0,0 +1,1064 @@ +/*!\mainpage libwiigui Documentation + * + * \section Introduction + * libwiigui is a GUI library for the Wii, created to help structure the + * design of a complicated GUI interface, and to enable an author to create + * a sophisticated, feature-rich GUI. It was originally conceived and written + * after I started to design a GUI for Snes9x GX, and found libwiisprite and + * GRRLIB inadequate for the purpose. It uses GX for drawing, and makes use + * of PNGU for displaying images and FreeTypeGX for text. It was designed to + * be flexible and is easy to modify - don't be afraid to change the way it + * works or expand it to suit your GUI's purposes! If you do, and you think + * your changes might benefit others, please share them so they might be + * added to the project! + * + * \section Quickstart + * Start from the supplied template example. For more advanced uses, see the + * source code for Snes9x GX, FCE Ultra GX, and Visual Boy Advance GX. + + * \section Contact + * If you have any suggestions for the library or documentation, or want to + * contribute, please visit the libwiigui website: + * http://code.google.com/p/libwiigui/ + + * \section Credits + * This library was wholly designed and written by Tantric. Thanks to the + * authors of PNGU and FreeTypeGX, of which this library makes use. Thanks + * also to the authors of GRRLIB and libwiisprite for laying the foundations. + * +*/ + +#ifndef LIBWIIGUI_H +#define LIBWIIGUI_H + +#include <gccore.h> +#include <malloc.h> +#include <stdlib.h> +#include <string.h> +#include <vector> +#include <exception> +#include <wchar.h> +#include <math.h> +#include <asndlib.h> +#include <wiiuse/wpad.h> + +#include "snes9xgx.h" +#include "video.h" +#include "filelist.h" +#include "fileop.h" +#include "input.h" +#include "../utils/pngu.h" +#include "../utils/FreeTypeGX.h" +#include "../utils/oggplayer.h" + +extern FreeTypeGX *fontSystem[]; + +#define SCROLL_DELAY_INITIAL 200000 +#define SCROLL_DELAY_LOOP 30000 +#define SCROLL_DELAY_DECREASE 300 +#define FILE_PAGESIZE 10 +#define PAGESIZE 8 +#define SAVELISTSIZE 6 +#define MAX_SAVES 100 +#define MAX_OPTIONS 150 +#define MAX_KEYBOARD_DISPLAY 32 + +typedef void (*UpdateCallback)(void * e); + +enum +{ + ALIGN_LEFT, + ALIGN_RIGHT, + ALIGN_CENTRE, + ALIGN_TOP, + ALIGN_BOTTOM, + ALIGN_MIDDLE +}; + +enum +{ + STATE_DEFAULT, + STATE_SELECTED, + STATE_CLICKED, + STATE_HELD, + STATE_DISABLED +}; + +enum +{ + SOUND_PCM, + SOUND_OGG +}; + +enum +{ + IMAGE_TEXTURE, + IMAGE_COLOR, + IMAGE_DATA +}; + +enum +{ + TRIGGER_SIMPLE, + TRIGGER_HELD, + TRIGGER_BUTTON_ONLY, + TRIGGER_BUTTON_ONLY_IN_FOCUS +}; + +enum +{ + SCROLL_NONE, + SCROLL_HORIZONTAL +}; + +typedef struct _paddata { + u16 btns_d; + u16 btns_u; + u16 btns_h; + s8 stickX; + s8 stickY; + s8 substickX; + s8 substickY; + u8 triggerL; + u8 triggerR; +} PADData; + +typedef struct _wupcfulldata { + u32 btns_d; + u32 btns_u; + u32 btns_h; + s16 stickX; + s16 stickY; + s16 substickX; + s16 substickY; +} WUPCFullData; + +#define EFFECT_SLIDE_TOP 1 +#define EFFECT_SLIDE_BOTTOM 2 +#define EFFECT_SLIDE_RIGHT 4 +#define EFFECT_SLIDE_LEFT 8 +#define EFFECT_SLIDE_IN 16 +#define EFFECT_SLIDE_OUT 32 +#define EFFECT_FADE 64 +#define EFFECT_SCALE 128 +#define EFFECT_COLOR_TRANSITION 256 + +//!Sound conversion and playback. A wrapper for other sound libraries - ASND, libmad, ltremor, etc +class GuiSound +{ + public: + //!Constructor + //!\param s Pointer to the sound data + //!\param l Length of sound data + //!\param t Sound format type (SOUND_PCM or SOUND_OGG) + GuiSound(const u8 * s, s32 l, int t); + //!Destructor + ~GuiSound(); + //!Start sound playback + void Play(); + //!Stop sound playback + void Stop(); + //!Pause sound playback + void Pause(); + //!Resume sound playback + void Resume(); + //!Checks if the sound is currently playing + //!\return true if sound is playing, false otherwise + bool IsPlaying(); + //!Set sound volume + //!\param v Sound volume (0-100) + void SetVolume(int v); + //!Set the sound to loop playback (only applies to OGG) + //!\param l Loop (true to loop) + void SetLoop(bool l); + protected: + const u8 * sound; //!< Pointer to the sound data + int type; //!< Sound format type (SOUND_PCM or SOUND_OGG) + s32 length; //!< Length of sound data + s32 voice; //!< Currently assigned ASND voice channel + s32 volume; //!< Sound volume (0-100) + bool loop; //!< Loop sound playback +}; + +//!Menu input trigger management. Determine if action is neccessary based on input data by comparing controller input data to a specific trigger element. +class GuiTrigger +{ + public: + //!Constructor + GuiTrigger(); + //!Destructor + ~GuiTrigger(); + //!Sets a simple trigger. Requires: element is selected, and trigger button is pressed + //!\param ch Controller channel number + //!\param wiibtns Wii controller trigger button(s) - classic controller buttons are considered separately + //!\param gcbtns GameCube controller trigger button(s) + void SetSimpleTrigger(s32 ch, u32 wiibtns, u16 gcbtns); + //!Sets a held trigger. Requires: element is selected, and trigger button is pressed + //!\param ch Controller channel number + //!\param wiibtns Wii controller trigger button(s) - classic controller buttons are considered separately + //!\param gcbtns GameCube controller trigger button(s) + void SetHeldTrigger(s32 ch, u32 wiibtns, u16 gcbtns); + //!Sets a button-only trigger. Requires: Trigger button is pressed + //!\param ch Controller channel number + //!\param wiibtns Wii controller trigger button(s) - classic controller buttons are considered separately + //!\param gcbtns GameCube controller trigger button(s) + void SetButtonOnlyTrigger(s32 ch, u32 wiibtns, u16 gcbtns); + //!Sets a button-only trigger. Requires: trigger button is pressed and parent window of element is in focus + //!\param ch Controller channel number + //!\param wiibtns Wii controller trigger button(s) - classic controller buttons are considered separately + //!\param gcbtns GameCube controller trigger button(s) + void SetButtonOnlyInFocusTrigger(s32 ch, u32 wiibtns, u16 gcbtns); + //!Get X or Y value from Wii Joystick (classic, nunchuk) input + //!\param stick Controller stick (left = 0, right = 1) + //!\param axis Controller stick axis (x-axis = 0, y-axis = 1) + //!\return Stick value + s8 WPAD_Stick(u8 stick, int axis); + //!Get X value from Wii Joystick (classic, nunchuk) input + //!\param stick Controller stick (left = 0, right = 1) + //!\return Stick value + s8 WPAD_StickX(u8 stick); + //!Get Y value from Wii Joystick (classic, nunchuk) input + //!\param stick Controller stick (left = 0, right = 1) + //!\return Stick value + s8 WPAD_StickY(u8 stick); + //!Move menu selection left (via pad/joystick). Allows scroll delay and button overriding + //!\return true if selection should be moved left, false otherwise + bool Left(); + //!Move menu selection right (via pad/joystick). Allows scroll delay and button overriding + //!\return true if selection should be moved right, false otherwise + bool Right(); + //!Move menu selection up (via pad/joystick). Allows scroll delay and button overriding + //!\return true if selection should be moved up, false otherwise + bool Up(); + //!Move menu selection down (via pad/joystick). Allows scroll delay and button overriding + //!\return true if selection should be moved down, false otherwise + bool Down(); + + WPADData wpaddata; //!< Wii controller trigger data + PADData pad; //!< GameCube controller trigger data + WUPCFullData wupcdata; //!< WiiU Pro controller trigger data + WPADData * wpad; //!< Wii controller trigger + s32 chan; //!< Trigger controller channel (0-3, -1 for all) + u8 type; //!< trigger type (TRIGGER_SIMPLE, TRIGGER_HELD, TRIGGER_BUTTON_ONLY, TRIGGER_BUTTON_ONLY_IN_FOCUS) +}; + +extern GuiTrigger userInput[4]; + +//!Primary GUI class. Most other classes inherit from this class. +class GuiElement +{ + public: + //!Constructor + GuiElement(); + //!Destructor + virtual ~GuiElement(); + //!Set the element's parent + //!\param e Pointer to parent element + void SetParent(GuiElement * e); + //!Gets the element's parent + //!\return Pointer to parent element + GuiElement * GetParent(); + //!Gets the current leftmost coordinate of the element + //!Considers horizontal alignment, x offset, width, and parent element's GetLeft() / GetWidth() values + //!\return left coordinate + int GetLeft(); + //!Gets the current topmost coordinate of the element + //!Considers vertical alignment, y offset, height, and parent element's GetTop() / GetHeight() values + //!\return top coordinate + int GetTop(); + //!Sets the minimum y offset of the element + //!\param y Y offset + void SetMinY(int y); + //!Gets the minimum y offset of the element + //!\return Minimum Y offset + int GetMinY(); + //!Sets the maximum y offset of the element + //!\param y Y offset + void SetMaxY(int y); + //!Gets the maximum y offset of the element + //!\return Maximum Y offset + int GetMaxY(); + //!Sets the minimum x offset of the element + //!\param x X offset + void SetMinX(int x); + //!Gets the minimum x offset of the element + //!\return Minimum X offset + int GetMinX(); + //!Sets the maximum x offset of the element + //!\param x X offset + void SetMaxX(int x); + //!Gets the maximum x offset of the element + //!\return Maximum X offset + int GetMaxX(); + //!Gets the current width of the element. Does not currently consider the scale + //!\return width + int GetWidth(); + //!Gets the height of the element. Does not currently consider the scale + //!\return height + int GetHeight(); + //!Sets the size (width/height) of the element + //!\param w Width of element + //!\param h Height of element + void SetSize(int w, int h); + //!Checks whether or not the element is visible + //!\return true if visible, false otherwise + bool IsVisible(); + //!Checks whether or not the element is selectable + //!\return true if selectable, false otherwise + bool IsSelectable(); + //!Checks whether or not the element is clickable + //!\return true if clickable, false otherwise + bool IsClickable(); + //!Checks whether or not the element is holdable + //!\return true if holdable, false otherwise + bool IsHoldable(); + //!Sets whether or not the element is selectable + //!\param s Selectable + void SetSelectable(bool s); + //!Sets whether or not the element is clickable + //!\param c Clickable + void SetClickable(bool c); + //!Sets whether or not the element is holdable + //!\param h Holdable + void SetHoldable(bool h); + //!Gets the element's current state + //!\return state + int GetState(); + //!Gets the controller channel that last changed the element's state + //!\return Channel number (0-3, -1 = no channel) + int GetStateChan(); + //!Sets the element's alpha value + //!\param a alpha value + void SetAlpha(int a); + //!Gets the element's alpha value + //!Considers alpha, alphaDyn, and the parent element's GetAlpha() value + //!\return alpha + int GetAlpha(); + //!Sets the element's x and y scale + //!\param s scale (1 is 100%) + void SetScale(float s); + //!Sets the element's x scale + //!\param s scale (1 is 100%) + void SetScaleX(float s); + //!Sets the element's y scale + //!\param s scale (1 is 100%) + void SetScaleY(float s); + //!Sets the element's x and y scale, using the provided max width/height + //!\param w Maximum width + //!\param h Maximum height + void SetScale(int w, int h); + //!Gets the element's current scale + //!Considers scale, scaleDyn, and the parent element's GetScale() value + float GetScale(); + //!Gets the element's current x scale + //!Considers scale, scaleDyn, and the parent element's GetScale() value + float GetScaleX(); + //!Gets the element's current y scale + //!Considers scale, scaleDyn, and the parent element's GetScale() value + float GetScaleY(); + //!Set a new GuiTrigger for the element + //!\param t Pointer to GuiTrigger + void SetTrigger(GuiTrigger * t); + //!\overload + //!\param i Index of trigger array to set + //!\param t Pointer to GuiTrigger + void SetTrigger(u8 i, GuiTrigger * t); + //!Checks whether rumble was requested by the element + //!\return true is rumble was requested, false otherwise + bool Rumble(); + //!Sets whether or not the element is requesting a rumble event + //!\param r true if requesting rumble, false if not + void SetRumble(bool r); + //!Set an effect for the element + //!\param e Effect to enable + //!\param a Amount of the effect (usage varies on effect) + //!\param t Target amount of the effect (usage varies on effect) + void SetEffect(int e, int a, int t=0); + //!Sets an effect to be enabled on wiimote cursor over + //!\param e Effect to enable + //!\param a Amount of the effect (usage varies on effect) + //!\param t Target amount of the effect (usage varies on effect) + void SetEffectOnOver(int e, int a, int t=0); + //!Shortcut to SetEffectOnOver(EFFECT_SCALE, 4, 110) + void SetEffectGrow(); + //!Gets the current element effects + //!\return element effects + int GetEffect(); + //!Checks whether the specified coordinates are within the element's boundaries + //!\param x X coordinate + //!\param y Y coordinate + //!\return true if contained within, false otherwise + bool IsInside(int x, int y); + //!Sets the element's position + //!\param x X coordinate + //!\param y Y coordinate + void SetPosition(int x, int y); + //!Updates the element's effects (dynamic values) + //!Called by Draw(), used for animation purposes + void UpdateEffects(); + //!Sets a function to called after after Update() + //!Callback function can be used to response to changes in the state of the element, and/or update the element's attributes + void SetUpdateCallback(UpdateCallback u); + //!Checks whether the element is in focus + //!\return true if element is in focus, false otherwise + int IsFocused(); + //!Sets the element's visibility + //!\param v Visibility (true = visible) + virtual void SetVisible(bool v); + //!Sets the element's focus + //!\param f Focus (true = in focus) + virtual void SetFocus(int f); + //!Sets the element's state + //!\param s State (STATE_DEFAULT, STATE_SELECTED, STATE_CLICKED, STATE_DISABLED) + //!\param c Controller channel (0-3, -1 = none) + virtual void SetState(int s, int c = -1); + //!Resets the element's state to STATE_DEFAULT + virtual void ResetState(); + //!Gets whether or not the element is in STATE_SELECTED + //!\return true if selected, false otherwise + virtual int GetSelected(); + //!Sets the element's alignment respective to its parent element + //!\param hor Horizontal alignment (ALIGN_LEFT, ALIGN_RIGHT, ALIGN_CENTRE) + //!\param vert Vertical alignment (ALIGN_TOP, ALIGN_BOTTOM, ALIGN_MIDDLE) + virtual void SetAlignment(int hor, int vert); + //!Called when the language has changed, to obtain new text values for all text elements + virtual void ResetText(); + //!Called constantly to allow the element to respond to the current input data + //!\param t Pointer to a GuiTrigger, containing the current input data from PAD/WPAD + virtual void Update(GuiTrigger * t); + //!Called constantly to redraw the element + virtual void Draw(); + //!Called constantly to redraw the element's tooltip + virtual void DrawTooltip(); + protected: + GuiTrigger * trigger[3]; //!< GuiTriggers (input actions) that this element responds to + UpdateCallback updateCB; //!< Callback function to call when this element is updated + GuiElement * parentElement; //!< Parent element + int focus; //!< Element focus (-1 = focus disabled, 0 = not focused, 1 = focused) + int width; //!< Element width + int height; //!< Element height + int xoffset; //!< Element X offset + int yoffset; //!< Element Y offset + int ymin; //!< Element's min Y offset allowed + int ymax; //!< Element's max Y offset allowed + int xmin; //!< Element's min X offset allowed + int xmax; //!< Element's max X offset allowed + int xoffsetDyn; //!< Element X offset, dynamic (added to xoffset value for animation effects) + int yoffsetDyn; //!< Element Y offset, dynamic (added to yoffset value for animation effects) + int alpha; //!< Element alpha value (0-255) + int alphaDyn; //!< Element alpha, dynamic (multiplied by alpha value for blending/fading effects) + f32 xscale; //!< Element X scale (1 = 100%) + f32 yscale; //!< Element Y scale (1 = 100%) + f32 scaleDyn; //!< Element scale, dynamic (multiplied by alpha value for blending/fading effects) + int effects; //!< Currently enabled effect(s). 0 when no effects are enabled + int effectAmount; //!< Effect amount. Used by different effects for different purposes + int effectTarget; //!< Effect target amount. Used by different effects for different purposes + int effectsOver; //!< Effects to enable when wiimote cursor is over this element. Copied to effects variable on over event + int effectAmountOver; //!< EffectAmount to set when wiimote cursor is over this element + int effectTargetOver; //!< EffectTarget to set when wiimote cursor is over this element + int alignmentHor; //!< Horizontal element alignment, respective to parent element (LEFT, RIGHT, CENTRE) + int alignmentVert; //!< Horizontal element alignment, respective to parent element (TOP, BOTTOM, MIDDLE) + int state; //!< Element state (DEFAULT, SELECTED, CLICKED, DISABLED) + int stateChan; //!< Which controller channel is responsible for the last change in state + bool selectable; //!< Whether or not this element selectable (can change to SELECTED state) + bool clickable; //!< Whether or not this element is clickable (can change to CLICKED state) + bool holdable; //!< Whether or not this element is holdable (can change to HELD state) + bool visible; //!< Visibility of the element. If false, Draw() is skipped + bool rumble; //!< Wiimote rumble (on/off) - set to on when this element requests a rumble event +}; + +//!Allows GuiElements to be grouped together into a "window" +class GuiWindow : public GuiElement +{ + public: + //!Constructor + GuiWindow(); + //!\overload + //!\param w Width of window + //!\param h Height of window + GuiWindow(int w, int h); + //!Destructor + ~GuiWindow(); + //!Appends a GuiElement to the GuiWindow + //!\param e The GuiElement to append. If it is already in the GuiWindow, it is removed first + void Append(GuiElement* e); + //!Inserts a GuiElement into the GuiWindow at the specified index + //!\param e The GuiElement to insert. If it is already in the GuiWindow, it is removed first + //!\param i Index in which to insert the element + void Insert(GuiElement* e, u32 i); + //!Removes the specified GuiElement from the GuiWindow + //!\param e GuiElement to be removed + void Remove(GuiElement* e); + //!Removes all GuiElements + void RemoveAll(); + //!Looks for the specified GuiElement + //!\param e The GuiElement to find + //!\return true if found, false otherwise + bool Find(GuiElement* e); + //!Returns the GuiElement at the specified index + //!\param index The index of the element + //!\return A pointer to the element at the index, NULL on error (eg: out of bounds) + GuiElement* GetGuiElementAt(u32 index) const; + //!Returns the size of the list of elements + //!\return The size of the current element list + u32 GetSize(); + //!Sets the visibility of the window + //!\param v visibility (true = visible) + void SetVisible(bool v); + //!Resets the window's state to STATE_DEFAULT + void ResetState(); + //!Sets the window's state + //!\param s State + void SetState(int s); + //!Gets the index of the GuiElement inside the window that is currently selected + //!\return index of selected GuiElement + int GetSelected(); + //!Sets the window focus + //!\param f Focus + void SetFocus(int f); + //!Change the focus to the specified element + //!This is intended for the primary GuiWindow only + //!\param e GuiElement that should have focus + void ChangeFocus(GuiElement * e); + //!Changes window focus to the next focusable window or element + //!If no element is in focus, changes focus to the first available element + //!If B or 1 button is pressed, changes focus to the next available element + //!This is intended for the primary GuiWindow only + //!\param t Pointer to a GuiTrigger, containing the current input data from PAD/WPAD + void ToggleFocus(GuiTrigger * t); + //!Moves the selected element to the element to the left or right + //!\param d Direction to move (-1 = left, 1 = right) + void MoveSelectionHor(int d); + //!Moves the selected element to the element above or below + //!\param d Direction to move (-1 = up, 1 = down) + void MoveSelectionVert(int d); + //!Resets the text for all contained elements + void ResetText(); + //!Draws all the elements in this GuiWindow + void Draw(); + //!Draws all of the tooltips in this GuiWindow + void DrawTooltip(); + //!Updates the window and all elements contains within + //!Allows the GuiWindow and all elements to respond to the input data specified + //!\param t Pointer to a GuiTrigger, containing the current input data from PAD/WPAD + void Update(GuiTrigger * t); + protected: + std::vector<GuiElement*> _elements; //!< Contains all elements within the GuiWindow +}; + +//!Converts image data into GX-useable RGBA8. Currently designed for use only with PNG files +class GuiImageData +{ + public: + //!Constructor + //!Converts the image data to RGBA8 - expects PNG format + //!\param i Image data + //!\param w Max image width (0 = not set) + //!\param h Max image height (0 = not set) + GuiImageData(const u8 * i, int w=0, int h=0); + //!Destructor + ~GuiImageData(); + //!Gets a pointer to the image data + //!\return pointer to image data + u8 * GetImage(); + //!Gets the image width + //!\return image width + int GetWidth(); + //!Gets the image height + //!\return image height + int GetHeight(); + protected: + u8 * data; //!< Image data + int height; //!< Height of image + int width; //!< Width of image +}; + +//!Display, manage, and manipulate images in the GUI +class GuiImage : public GuiElement +{ + public: + //!Constructor + GuiImage(); + //!\overload + //!\param img Pointer to GuiImageData element + GuiImage(GuiImageData * img); + //!\overload + //!Sets up a new image from the image data specified + //!\param img + //!\param w Image width + //!\param h Image height + GuiImage(u8 * img, int w, int h); + //!\overload + //!Creates an image filled with the specified color + //!\param w Image width + //!\param h Image height + //!\param c Image color + GuiImage(int w, int h, GXColor c); + //!Destructor + ~GuiImage(); + //!Sets the image rotation angle for drawing + //!\param a Angle (in degrees) + void SetAngle(float a); + //!Sets the number of times to draw the image horizontally + //!\param t Number of times to draw the image + void SetTile(int t); + //!Constantly called to draw the image + void Draw(); + //!Gets the image data + //!\return pointer to image data + u8 * GetImage(); + //!Sets up a new image using the GuiImageData object specified + //!\param img Pointer to GuiImageData object + void SetImage(GuiImageData * img); + //!\overload + //!\param img Pointer to image data + //!\param w Width + //!\param h Height + void SetImage(u8 * img, int w, int h); + //!Gets the pixel color at the specified coordinates of the image + //!\param x X coordinate + //!\param y Y coordinate + GXColor GetPixel(int x, int y); + //!Sets the pixel color at the specified coordinates of the image + //!\param x X coordinate + //!\param y Y coordinate + //!\param color Pixel color + void SetPixel(int x, int y, GXColor color); + //!Directly modifies the image data to create a color-striped effect + //!Alters the RGB values by the specified amount + //!\param s Amount to increment/decrement the RGB values in the image + void ColorStripe(int s); + //!Sets a stripe effect on the image, overlaying alpha blended rectangles + //!Does not alter the image data + //!\param s Alpha amount to draw over the image + void SetStripe(int s); + protected: + int imgType; //!< Type of image data (IMAGE_TEXTURE, IMAGE_COLOR, IMAGE_DATA) + u8 * image; //!< Poiner to image data. May be shared with GuiImageData data + f32 imageangle; //!< Angle to draw the image + int tile; //!< Number of times to draw (tile) the image horizontally + int stripe; //!< Alpha value (0-255) to apply a stripe effect to the texture +}; + +//!Display, manage, and manipulate text in the GUI +class GuiText : public GuiElement +{ + public: + //!Constructor + //!\param t Text + //!\param s Font size + //!\param c Font color + GuiText(const char * t, int s, GXColor c); + //!\overload + //!Assumes SetPresets() has been called to setup preferred text attributes + //!\param t Text + GuiText(const char * t); + //!Destructor + ~GuiText(); + //!Sets the text of the GuiText element + //!\param t Text + void SetText(const char * t); + //!Sets the text of the GuiText element + //!\param t UTF-8 Text + void SetWText(wchar_t * t); + //!Gets the translated text length of the GuiText element + int GetLength(); + //!Sets up preset values to be used by GuiText(t) + //!Useful when printing multiple text elements, all with the same attributes set + //!\param sz Font size + //!\param c Font color + //!\param w Maximum width of texture image (for text wrapping) + //!\param s Font size + //!\param h Text alignment (horizontal) + //!\param v Text alignment (vertical) + void SetPresets(int sz, GXColor c, int w, u16 s, int h, int v); + //!Sets the font size + //!\param s Font size + void SetFontSize(int s); + //!Sets the maximum width of the drawn texture image + //!\param w Maximum width + void SetMaxWidth(int w); + //!Gets the width of the text when rendered + int GetTextWidth(); + //!Enables/disables text scrolling + //!\param s Scrolling on/off + void SetScroll(int s); + //!Enables/disables text wrapping + //!\param w Wrapping on/off + //!\param width Maximum width (0 to disable) + void SetWrap(bool w, int width = 0); + //!Sets the font color + //!\param c Font color + void SetColor(GXColor c); + //!Sets the FreeTypeGX style attributes + //!\param s Style attributes + void SetStyle(u16 s); + //!Sets the text alignment + //!\param hor Horizontal alignment (ALIGN_LEFT, ALIGN_RIGHT, ALIGN_CENTRE) + //!\param vert Vertical alignment (ALIGN_TOP, ALIGN_BOTTOM, ALIGN_MIDDLE) + void SetAlignment(int hor, int vert); + //!Updates the text to the selected language + void ResetText(); + //!Constantly called to draw the text + void Draw(); + protected: + GXColor color; //!< Font color + wchar_t* text; //!< Translated Unicode text value + wchar_t *textDyn[20]; //!< Text value, if max width, scrolling, or wrapping enabled + int textDynNum; //!< Number of text lines + char * origText; //!< Original text data (English) + int size; //!< Font size + int maxWidth; //!< Maximum width of the generated text object (for text wrapping) + int textScroll; //!< Scrolling toggle + int textScrollPos; //!< Current starting index of text string for scrolling + int textScrollInitialDelay; //!< Delay to wait before starting to scroll + int textScrollDelay; //!< Scrolling speed + u16 style; //!< FreeTypeGX style attributes + bool wrap; //!< Wrapping toggle +}; + +//!Display, manage, and manipulate tooltips in the GUI +class GuiTooltip : public GuiElement +{ + public: + //!Constructor + //!\param t Text + GuiTooltip(const char *t); + //!Destructor + ~GuiTooltip(); + //!Gets the element's current scale + float GetScale(); + //!Sets the text of the GuiTooltip element + //!\param t Text + void SetText(const char * t); + //!Constantly called to draw the GuiTooltip + void DrawTooltip(); + + time_t time1, time2; //!< Tooltip times + + protected: + GuiImage leftImage; //!< Tooltip left image + GuiImage tileImage; //!< Tooltip tile image + GuiImage rightImage; //!< Tooltip right image + GuiText *text; //!< Tooltip text +}; + +//!Display, manage, and manipulate buttons in the GUI. Buttons can have images, icons, text, and sound set (all of which are optional) +class GuiButton : public GuiElement +{ + public: + //!Constructor + //!\param w Width + //!\param h Height + GuiButton(int w = 0, int h = 0); + //!Destructor + ~GuiButton(); + //!Sets the button's image + //!\param i Pointer to GuiImage object + void SetImage(GuiImage* i); + //!Sets the button's image on over + //!\param i Pointer to GuiImage object + void SetImageOver(GuiImage* i); + //!Sets the button's image on hold + //!\param i Pointer to GuiImage object + void SetImageHold(GuiImage* i); + //!Sets the button's image on click + //!\param i Pointer to GuiImage object + void SetImageClick(GuiImage* i); + //!Sets the button's icon + //!\param i Pointer to GuiImage object + void SetIcon(GuiImage* i); + //!Sets the button's icon on over + //!\param i Pointer to GuiImage object + void SetIconOver(GuiImage* i); + //!Sets the button's icon on hold + //!\param i Pointer to GuiImage object + void SetIconHold(GuiImage* i); + //!Sets the button's icon on click + //!\param i Pointer to GuiImage object + void SetIconClick(GuiImage* i); + //!Sets the button's label + //!\param t Pointer to GuiText object + //!\param n Index of label to set (optional, default is 0) + void SetLabel(GuiText* t, int n = 0); + //!Sets the button's label on over (eg: different colored text) + //!\param t Pointer to GuiText object + //!\param n Index of label to set (optional, default is 0) + void SetLabelOver(GuiText* t, int n = 0); + //!Sets the button's label on hold + //!\param t Pointer to GuiText object + //!\param n Index of label to set (optional, default is 0) + void SetLabelHold(GuiText* t, int n = 0); + //!Sets the button's label on click + //!\param t Pointer to GuiText object + //!\param n Index of label to set (optional, default is 0) + void SetLabelClick(GuiText* t, int n = 0); + //!Sets the sound to play on over + //!\param s Pointer to GuiSound object + void SetSoundOver(GuiSound * s); + //!Sets the sound to play on hold + //!\param s Pointer to GuiSound object + void SetSoundHold(GuiSound * s); + //!Sets the sound to play on click + //!\param s Pointer to GuiSound object + void SetSoundClick(GuiSound * s); + //!Sets the tooltip for the button + //!\param t Tooltip + void SetTooltip(GuiTooltip * t); + //!Constantly called to draw the GuiButton + void Draw(); + //!Constantly called to draw the GuiButton's tooltip + void DrawTooltip(); + //!Resets the text for all contained elements + void ResetText(); + //!Constantly called to allow the GuiButton to respond to updated input data + //!\param t Pointer to a GuiTrigger, containing the current input data from PAD/WPAD + void Update(GuiTrigger * t); + protected: + GuiImage * image; //!< Button image (default) + GuiImage * imageOver; //!< Button image for STATE_SELECTED + GuiImage * imageHold; //!< Button image for STATE_HELD + GuiImage * imageClick; //!< Button image for STATE_CLICKED + GuiImage * icon; //!< Button icon (drawn after button image) + GuiImage * iconOver; //!< Button icon for STATE_SELECTED + GuiImage * iconHold; //!< Button icon for STATE_HELD + GuiImage * iconClick; //!< Button icon for STATE_CLICKED + GuiText * label[3]; //!< Label(s) to display (default) + GuiText * labelOver[3]; //!< Label(s) to display for STATE_SELECTED + GuiText * labelHold[3]; //!< Label(s) to display for STATE_HELD + GuiText * labelClick[3]; //!< Label(s) to display for STATE_CLICKED + GuiSound * soundOver; //!< Sound to play for STATE_SELECTED + GuiSound * soundHold; //!< Sound to play for STATE_HELD + GuiSound * soundClick; //!< Sound to play for STATE_CLICKED + GuiTooltip * tooltip; //!< Tooltip to display on over +}; + +typedef struct _keytype { + char ch, chShift; +} Key; + +//!On-screen keyboard +class GuiKeyboard : public GuiWindow +{ + public: + GuiKeyboard(char * t, u32 m); + ~GuiKeyboard(); + void Update(GuiTrigger * t); + char kbtextstr[256]; + protected: + u32 kbtextmaxlen; + int shift; + int caps; + GuiText * kbText; + GuiImage * keyTextboxImg; + GuiText * keyCapsText; + GuiImage * keyCapsImg; + GuiImage * keyCapsOverImg; + GuiButton * keyCaps; + GuiText * keyShiftText; + GuiImage * keyShiftImg; + GuiImage * keyShiftOverImg; + GuiButton * keyShift; + GuiText * keyBackText; + GuiImage * keyBackImg; + GuiImage * keyBackOverImg; + GuiButton * keyBack; + GuiImage * keySpaceImg; + GuiImage * keySpaceOverImg; + GuiButton * keySpace; + GuiButton * keyBtn[4][11]; + GuiImage * keyImg[4][11]; + GuiImage * keyImgOver[4][11]; + GuiText * keyTxt[4][11]; + GuiImageData * keyTextbox; + GuiImageData * key; + GuiImageData * keyOver; + GuiImageData * keyMedium; + GuiImageData * keyMediumOver; + GuiImageData * keyLarge; + GuiImageData * keyLargeOver; + GuiSound * keySoundOver; + GuiSound * keySoundClick; + GuiTrigger * trigA; + GuiTrigger * trig2; + Key keys[4][11]; // two chars = less space than one pointer +}; + +typedef struct _optionlist { + int length; + char name[MAX_OPTIONS][50]; + char value[MAX_OPTIONS][50]; +} OptionList; + +//!Display a list of menu options +class GuiOptionBrowser : public GuiElement +{ + public: + GuiOptionBrowser(int w, int h, OptionList * l); + ~GuiOptionBrowser(); + void SetCol1Position(int x); + void SetCol2Position(int x); + int FindMenuItem(int c, int d); + int GetClickedOption(); + void ResetState(); + void SetFocus(int f); + void Draw(); + void TriggerUpdate(); + void ResetText(); + void Update(GuiTrigger * t); + GuiText * optionVal[PAGESIZE]; + protected: + int optionIndex[PAGESIZE]; + GuiButton * optionBtn[PAGESIZE]; + GuiText * optionTxt[PAGESIZE]; + GuiImage * optionBg[PAGESIZE]; + + int selectedItem; + int listOffset; + OptionList * options; + + GuiButton * arrowUpBtn; + GuiButton * arrowDownBtn; + + GuiImage * bgOptionsImg; + GuiImage * scrollbarImg; + GuiImage * arrowDownImg; + GuiImage * arrowDownOverImg; + GuiImage * arrowUpImg; + GuiImage * arrowUpOverImg; + + GuiImageData * bgOptions; + GuiImageData * bgOptionsEntry; + GuiImageData * scrollbar; + GuiImageData * arrowDown; + GuiImageData * arrowDownOver; + GuiImageData * arrowUp; + GuiImageData * arrowUpOver; + + GuiSound * btnSoundOver; + GuiSound * btnSoundClick; + GuiTrigger * trigA; + GuiTrigger * trig2; + + bool listChanged; +}; + +typedef struct _savelist { + int length; + char filename[MAX_SAVES+1][256]; + GuiImageData * previewImg[MAX_SAVES+1]; + char date[MAX_SAVES+1][20]; + char time[MAX_SAVES+1][10]; + int type[MAX_SAVES+1]; + int files[2][MAX_SAVES+1]; +} SaveList; + +//!Display a list of game save files, with screenshots and file information +class GuiSaveBrowser : public GuiElement +{ + public: + GuiSaveBrowser(int w, int h, SaveList * l, int a); + ~GuiSaveBrowser(); + int GetClickedSave(); + void ResetState(); + void SetFocus(int f); + void Draw(); + void Update(GuiTrigger * t); + protected: + int selectedItem; + int action; + int listOffset; + SaveList * saves; + GuiButton * saveBtn[SAVELISTSIZE]; + GuiText * saveDate[SAVELISTSIZE]; + GuiText * saveTime[SAVELISTSIZE]; + GuiText * saveType[SAVELISTSIZE]; + + GuiImage * saveBgImg[SAVELISTSIZE]; + GuiImage * saveBgOverImg[SAVELISTSIZE]; + GuiImage * savePreviewImg[SAVELISTSIZE]; + + GuiButton * arrowUpBtn; + GuiButton * arrowDownBtn; + + GuiImage * scrollbarImg; + GuiImage * arrowDownImg; + GuiImage * arrowDownOverImg; + GuiImage * arrowUpImg; + GuiImage * arrowUpOverImg; + + GuiImageData * gameSave; + GuiImageData * gameSaveOver; + GuiImageData * gameSaveBlank; + GuiImageData * scrollbar; + GuiImageData * arrowDown; + GuiImageData * arrowDownOver; + GuiImageData * arrowUp; + GuiImageData * arrowUpOver; + + GuiSound * btnSoundOver; + GuiSound * btnSoundClick; + GuiTrigger * trigA; + GuiTrigger * trig2; + + bool saveBtnLastOver[SAVELISTSIZE]; +}; + +//!Display a list of files +class GuiFileBrowser : public GuiElement +{ + public: + GuiFileBrowser(int w, int h); + ~GuiFileBrowser(); + void ResetState(); + void SetFocus(int f); + void Draw(); + void DrawTooltip(); + void TriggerUpdate(); + void Update(GuiTrigger * t); + GuiButton * fileList[FILE_PAGESIZE]; + protected: + GuiText * fileListText[FILE_PAGESIZE]; + GuiImage * fileListBg[FILE_PAGESIZE]; + GuiImage * fileListIcon[FILE_PAGESIZE]; + + GuiButton * arrowUpBtn; + GuiButton * arrowDownBtn; + GuiButton * scrollbarBoxBtn; + + GuiImage * bgFileSelectionImg; + GuiImage * scrollbarImg; + GuiImage * arrowDownImg; + GuiImage * arrowDownOverImg; + GuiImage * arrowUpImg; + GuiImage * arrowUpOverImg; + GuiImage * scrollbarBoxImg; + GuiImage * scrollbarBoxOverImg; + + GuiImageData * bgFileSelection; + GuiImageData * bgFileSelectionEntry; + GuiImageData * iconFolder; + GuiImageData * iconSD; + GuiImageData * iconUSB; + GuiImageData * iconDVD; + GuiImageData * iconSMB; + GuiImageData * scrollbar; + GuiImageData * arrowDown; + GuiImageData * arrowDownOver; + GuiImageData * arrowUp; + GuiImageData * arrowUpOver; + GuiImageData * scrollbarBox; + GuiImageData * scrollbarBoxOver; + + GuiSound * btnSoundOver; + GuiSound * btnSoundClick; + GuiTrigger * trigA; + GuiTrigger * trig2; + GuiTrigger * trigHeldA; + + int selectedItem; + int numEntries; + bool listChanged; +}; + +#endif diff --git a/plugins/snes9x_gx/source/gui/gui_button.cpp b/plugins/snes9x_gx/source/gui/gui_button.cpp new file mode 100644 index 00000000..0703933c --- /dev/null +++ b/plugins/snes9x_gx/source/gui/gui_button.cpp @@ -0,0 +1,372 @@ +/**************************************************************************** + * libwiigui + * + * Tantric 2009 + * + * gui_button.cpp + * + * GUI class definitions + ***************************************************************************/ + +#include "gui.h" +/** + * Constructor for the GuiButton class. + */ + +GuiButton::GuiButton(int w, int h) +{ + width = w; + height = h; + image = NULL; + imageOver = NULL; + imageHold = NULL; + imageClick = NULL; + icon = NULL; + iconOver = NULL; + iconHold = NULL; + iconClick = NULL; + + for(int i=0; i < 3; i++) + { + label[i] = NULL; + labelOver[i] = NULL; + labelHold[i] = NULL; + labelClick[i] = NULL; + } + + soundOver = NULL; + soundHold = NULL; + soundClick = NULL; + tooltip = NULL; + selectable = true; + holdable = false; + clickable = true; +} + +/** + * Destructor for the GuiButton class. + */ +GuiButton::~GuiButton() +{ +} + +void GuiButton::SetImage(GuiImage* img) +{ + image = img; + if(img) img->SetParent(this); +} +void GuiButton::SetImageOver(GuiImage* img) +{ + imageOver = img; + if(img) img->SetParent(this); +} +void GuiButton::SetImageHold(GuiImage* img) +{ + imageHold = img; + if(img) img->SetParent(this); +} +void GuiButton::SetImageClick(GuiImage* img) +{ + imageClick = img; + if(img) img->SetParent(this); +} +void GuiButton::SetIcon(GuiImage* img) +{ + icon = img; + if(img) img->SetParent(this); +} +void GuiButton::SetIconOver(GuiImage* img) +{ + iconOver = img; + if(img) img->SetParent(this); +} +void GuiButton::SetIconHold(GuiImage* img) +{ + iconHold = img; + if(img) img->SetParent(this); +} +void GuiButton::SetIconClick(GuiImage* img) +{ + iconClick = img; + if(img) img->SetParent(this); +} +void GuiButton::SetLabel(GuiText* txt, int n) +{ + label[n] = txt; + if(txt) txt->SetParent(this); +} +void GuiButton::SetLabelOver(GuiText* txt, int n) +{ + labelOver[n] = txt; + if(txt) txt->SetParent(this); +} +void GuiButton::SetLabelHold(GuiText* txt, int n) +{ + labelHold[n] = txt; + if(txt) txt->SetParent(this); +} +void GuiButton::SetLabelClick(GuiText* txt, int n) +{ + labelClick[n] = txt; + if(txt) txt->SetParent(this); +} +void GuiButton::SetSoundOver(GuiSound * snd) +{ + soundOver = snd; +} +void GuiButton::SetSoundHold(GuiSound * snd) +{ + soundHold = snd; +} +void GuiButton::SetSoundClick(GuiSound * snd) +{ + soundClick = snd; +} +void GuiButton::SetTooltip(GuiTooltip* t) +{ + tooltip = t; + if(t) + tooltip->SetParent(this); +} + +/** + * Draw the button on screen + */ +void GuiButton::Draw() +{ + if(!this->IsVisible()) + return; + + if(state == STATE_SELECTED || state == STATE_HELD) + { + if(imageOver) + imageOver->Draw(); + else if(image) // draw image + image->Draw(); + + if(iconOver) + iconOver->Draw(); + else if(icon) // draw icon + icon->Draw(); + + // draw text + if(labelOver[0]) + labelOver[0]->Draw(); + else if(label[0]) + label[0]->Draw(); + + if(labelOver[1]) + + labelOver[1]->Draw(); + else if(label[1]) + label[1]->Draw(); + + if(labelOver[2]) + labelOver[2]->Draw(); + else if(label[2]) + label[2]->Draw(); + } + else + { + if(image) // draw image + image->Draw(); + if(icon) // draw icon + icon->Draw(); + + // draw text + if(label[0]) + label[0]->Draw(); + if(label[1]) + label[1]->Draw(); + if(label[2]) + label[2]->Draw(); + } + + this->UpdateEffects(); +} + +void GuiButton::DrawTooltip() +{ + if(tooltip) + tooltip->DrawTooltip(); +} + +void GuiButton::ResetText() +{ + for(int i=0; i<3; i++) + { + if(label[i]) + label[i]->ResetText(); + if(labelOver[i]) + labelOver[i]->ResetText(); + } + if(tooltip) + tooltip->ResetText(); +} + +void GuiButton::Update(GuiTrigger * t) +{ + if(state == STATE_CLICKED || state == STATE_DISABLED || !t) + return; + else if(parentElement && parentElement->GetState() == STATE_DISABLED) + return; + + #ifdef HW_RVL + // cursor + if(t->wpad->ir.valid && t->chan >= 0) + { + if(this->IsInside(t->wpad->ir.x, t->wpad->ir.y)) + { + if(state == STATE_DEFAULT) // we weren't on the button before! + { + this->SetState(STATE_SELECTED, t->chan); + + if(this->Rumble()) + rumbleRequest[t->chan] = 1; + + if(soundOver) + soundOver->Play(); + + if(effectsOver && !effects) + { + // initiate effects + effects = effectsOver; + effectAmount = effectAmountOver; + effectTarget = effectTargetOver; + } + } + } + else + { + if(state == STATE_SELECTED && (stateChan == t->chan || stateChan == -1)) + this->ResetState(); + + if(effectTarget == effectTargetOver && effectAmount == effectAmountOver) + { + // initiate effects (in reverse) + effects = effectsOver; + effectAmount = -effectAmountOver; + effectTarget = 100; + } + } + } + #endif + + // button triggers + if(this->IsClickable()) + { + s32 wm_btns, wm_btns_trig, cc_btns, cc_btns_trig, wupc_btns, wupc_btns_trig; + for(int i=0; i<3; i++) + { + if(trigger[i] && (trigger[i]->chan == -1 || trigger[i]->chan == t->chan)) + { + // higher 16 bits only (wiimote) + wm_btns = t->wpad->btns_d << 16; + wm_btns_trig = trigger[i]->wpad->btns_d << 16; + + // lower 16 bits only (classic controller) + cc_btns = t->wpad->btns_d >> 16; + cc_btns_trig = trigger[i]->wpad->btns_d >> 16; + + // lower 16 bits only (WiiU Pro controller) + wupc_btns = t->wupcdata.btns_d >> 16; + wupc_btns_trig = trigger[i]->wupcdata.btns_d >> 16; + + if( + (t->wpad->btns_d > 0 && + (wm_btns == wm_btns_trig || + (cc_btns == cc_btns_trig && t->wpad->exp.type == EXP_CLASSIC))) || + (t->pad.btns_d == trigger[i]->pad.btns_d && t->pad.btns_d > 0) || + (wupc_btns == wupc_btns_trig && wupc_btns_trig > 0)) + + { + if(t->chan == stateChan || stateChan == -1) + { + if(state == STATE_SELECTED) + { + if(!t->wpad->ir.valid || this->IsInside(t->wpad->ir.x, t->wpad->ir.y)) + { + this->SetState(STATE_CLICKED, t->chan); + + if(soundClick) + soundClick->Play(); + } + } + else if(trigger[i]->type == TRIGGER_BUTTON_ONLY) + { + this->SetState(STATE_CLICKED, t->chan); + } + else if(trigger[i]->type == TRIGGER_BUTTON_ONLY_IN_FOCUS && + parentElement->IsFocused()) + { + this->SetState(STATE_CLICKED, t->chan); + } + } + } + } + } + } + + if(this->IsHoldable()) + { + bool held = false; + s32 wm_btns, wm_btns_h, wm_btns_trig, cc_btns, cc_btns_h, cc_btns_trig, wupc_btns, wupc_btns_h, wupc_btns_trig; + + for(int i=0; i<3; i++) + { + if(trigger[i] && (trigger[i]->chan == -1 || trigger[i]->chan == t->chan)) + { + // higher 16 bits only (wiimote) + wm_btns = t->wpad->btns_d << 16; + wm_btns_h = t->wpad->btns_h << 16; + wm_btns_trig = trigger[i]->wpad->btns_h << 16; + + // lower 16 bits only (classic controller) + cc_btns = t->wpad->btns_d >> 16; + cc_btns_h = t->wpad->btns_h >> 16; + cc_btns_trig = trigger[i]->wpad->btns_h >> 16; + + // lower 16 bits only (WiiU Pro controller) + wupc_btns = t->wpad->btns_d >> 16; + wupc_btns_h = t->wpad->btns_h >> 16; + wupc_btns_trig = trigger[i]->wpad->btns_h >> 16; + + if( + (t->wpad->btns_d > 0 && + (wm_btns == wm_btns_trig || + (cc_btns == cc_btns_trig && t->wpad->exp.type == EXP_CLASSIC))) || + (t->pad.btns_d == trigger[i]->pad.btns_h && t->pad.btns_d > 0) || + (wupc_btns == wupc_btns_trig && wupc_btns > 0)) + { + if(trigger[i]->type == TRIGGER_HELD && state == STATE_SELECTED && + (t->chan == stateChan || stateChan == -1)) + this->SetState(STATE_CLICKED, t->chan); + } + + if( + (t->wpad->btns_h > 0 && + (wm_btns_h == wm_btns_trig || + (cc_btns_h == cc_btns_trig && t->wpad->exp.type == EXP_CLASSIC))) || + (t->pad.btns_h == trigger[i]->pad.btns_h && t->pad.btns_h > 0) || + (wupc_btns_h == wupc_btns_trig && wupc_btns_h > 0)) + + { + if(trigger[i]->type == TRIGGER_HELD) + held = true; + } + + if(!held && state == STATE_HELD && stateChan == t->chan) + { + this->ResetState(); + } + else if(held && state == STATE_CLICKED && stateChan == t->chan) + { + this->SetState(STATE_HELD, t->chan); + } + } + } + } + + if(updateCB) + updateCB(this); +} diff --git a/plugins/snes9x_gx/source/gui/gui_element.cpp b/plugins/snes9x_gx/source/gui/gui_element.cpp new file mode 100644 index 00000000..9efb1c10 --- /dev/null +++ b/plugins/snes9x_gx/source/gui/gui_element.cpp @@ -0,0 +1,582 @@ +/**************************************************************************** + * libwiigui + * + * Tantric 2009 + * + * gui_element.cpp + * + * GUI class definitions + ***************************************************************************/ + +#include "gui.h" + +/** + * Constructor for the Object class. + */ +GuiElement::GuiElement() +{ + xoffset = 0; + yoffset = 0; + xmin = 0; + xmax = 0; + ymin = 0; + ymax = 0; + width = 0; + height = 0; + alpha = 255; + xscale = 1; + yscale = 1; + state = STATE_DEFAULT; + stateChan = -1; + trigger[0] = NULL; + trigger[1] = NULL; + trigger[2] = NULL; + parentElement = NULL; + rumble = true; + selectable = false; + clickable = false; + holdable = false; + visible = true; + focus = -1; // cannot be focused + updateCB = NULL; + yoffsetDyn = 0; + xoffsetDyn = 0; + alphaDyn = -1; + scaleDyn = 1; + effects = 0; + effectAmount = 0; + effectTarget = 0; + effectsOver = 0; + effectAmountOver = 0; + effectTargetOver = 0; + + // default alignment - align to top left + alignmentVert = ALIGN_TOP; + alignmentHor = ALIGN_LEFT; +} + +/** + * Destructor for the GuiElement class. + */ +GuiElement::~GuiElement() +{ +} + +void GuiElement::SetParent(GuiElement * e) +{ + parentElement = e; +} + +GuiElement * GuiElement::GetParent() +{ + return parentElement; +} + +int GuiElement::GetLeft() +{ + int x = 0; + int pWidth = 0; + int pLeft = 0; + + if(parentElement) + { + pWidth = parentElement->GetWidth(); + pLeft = parentElement->GetLeft(); + } + + if(effects & (EFFECT_SLIDE_IN | EFFECT_SLIDE_OUT)) + pLeft += xoffsetDyn; + + switch(alignmentHor) + { + case ALIGN_LEFT: + x = pLeft; + break; + case ALIGN_CENTRE: + x = pLeft + pWidth/2.0 - (width*xscale)/2.0; + break; + case ALIGN_RIGHT: + x = pLeft + pWidth - width*xscale; + break; + } + x += (width*(xscale - 1))/2.0; // correct offset for scaled images + return x + xoffset; +} + +int GuiElement::GetTop() +{ + int y = 0; + int pHeight = 0; + int pTop = 0; + + if(parentElement) + { + pHeight = parentElement->GetHeight(); + pTop = parentElement->GetTop(); + } + + if(effects & (EFFECT_SLIDE_IN | EFFECT_SLIDE_OUT)) + pTop += yoffsetDyn; + + switch(alignmentVert) + { + case ALIGN_TOP: + y = pTop; + break; + case ALIGN_MIDDLE: + y = pTop + pHeight/2.0 - (height*yscale)/2.0; + break; + case ALIGN_BOTTOM: + y = pTop + pHeight - height*yscale; + break; + } + y += (height*(yscale - 1))/2.0; // correct offset for scaled images + return y + yoffset; +} + +void GuiElement::SetMinX(int x) +{ + xmin = x; +} + +int GuiElement::GetMinX() +{ + return xmin; +} + +void GuiElement::SetMaxX(int x) +{ + xmax = x; +} + +int GuiElement::GetMaxX() +{ + return xmax; +} + +void GuiElement::SetMinY(int y) +{ + ymin = y; +} + +int GuiElement::GetMinY() +{ + return ymin; +} + +void GuiElement::SetMaxY(int y) +{ + ymax = y; +} + +int GuiElement::GetMaxY() +{ + return ymax; +} + +int GuiElement::GetWidth() +{ + return width; +} + +int GuiElement::GetHeight() +{ + return height; +} + +void GuiElement::SetSize(int w, int h) +{ + + width = w; + height = h; +} + +bool GuiElement::IsVisible() +{ + return visible; +} + +void GuiElement::SetVisible(bool v) +{ + visible = v; +} + +void GuiElement::SetAlpha(int a) +{ + alpha = a; +} + +int GuiElement::GetAlpha() +{ + int a = alpha; + + if(alphaDyn >= 0) + a = alphaDyn; + + if(parentElement) + a *= float(parentElement->GetAlpha())/255.0f; + + return a; +} + +void GuiElement::SetScale(float s) +{ + xscale = s; + yscale = s; +} + +void GuiElement::SetScaleX(float s) +{ + xscale = s; +} + +void GuiElement::SetScaleY(float s) +{ + yscale = s; +} + +void GuiElement::SetScale(int mw, int mh) +{ + xscale = 1.0f; + if(width > mw || height > mh) + { + if(width/(height*1.0) > mw/(mh*1.0)) + xscale = mw/(width*1.0); + else + xscale = mh/(height*1.0); + } + yscale = xscale; +} + +float GuiElement::GetScale() +{ + float s = xscale * scaleDyn; + + if(parentElement) + s *= parentElement->GetScale(); + + return s; +} + +float GuiElement::GetScaleX() +{ + float s = xscale * scaleDyn; + + if(parentElement) + s *= parentElement->GetScale(); + + return s; +} + +float GuiElement::GetScaleY() +{ + float s = yscale * scaleDyn; + + if(parentElement) + s *= parentElement->GetScaleY(); + + return s; +} + +int GuiElement::GetState() +{ + return state; +} + +int GuiElement::GetStateChan() +{ + return stateChan; +} + +void GuiElement::SetState(int s, int c) +{ + state = s; + stateChan = c; +} + +void GuiElement::ResetState() +{ + if(state != STATE_DISABLED) + { + state = STATE_DEFAULT; + stateChan = -1; + } +} + +void GuiElement::SetClickable(bool c) +{ + clickable = c; +} + +void GuiElement::SetSelectable(bool s) +{ + selectable = s; +} + +void GuiElement::SetHoldable(bool d) +{ + holdable = d; +} + +bool GuiElement::IsSelectable() +{ + if(state == STATE_DISABLED || state == STATE_CLICKED) + return false; + else + return selectable; +} + +bool GuiElement::IsClickable() +{ + if(state == STATE_DISABLED || + state == STATE_CLICKED || + state == STATE_HELD) + return false; + else + return clickable; +} + +bool GuiElement::IsHoldable() +{ + if(state == STATE_DISABLED) + return false; + else + return holdable; +} + +void GuiElement::SetFocus(int f) +{ + focus = f; +} + +int GuiElement::IsFocused() +{ + return focus; +} + +void GuiElement::SetTrigger(GuiTrigger * t) +{ + if(!trigger[0]) + trigger[0] = t; + else if(!trigger[1]) + trigger[1] = t; + else if(!trigger[2]) + trigger[2] = t; + else // all were assigned, so we'll just overwrite the first one + trigger[0] = t; +} + +void GuiElement::SetTrigger(u8 i, GuiTrigger * t) +{ + trigger[i] = t; +} + +bool GuiElement::Rumble() +{ + return rumble; +} + +void GuiElement::SetRumble(bool r) +{ + rumble = r; +} + +int GuiElement::GetEffect() +{ + return effects; +} + +void GuiElement::SetEffect(int eff, int amount, int target) +{ + if(eff & EFFECT_SLIDE_IN) + { + // these calculations overcompensate a little + if(eff & EFFECT_SLIDE_TOP) + yoffsetDyn = -screenheight; + else if(eff & EFFECT_SLIDE_LEFT) + xoffsetDyn = -screenwidth; + else if(eff & EFFECT_SLIDE_BOTTOM) + yoffsetDyn = screenheight; + else if(eff & EFFECT_SLIDE_RIGHT) + xoffsetDyn = screenwidth; + } + if(eff & EFFECT_FADE) + { + if(amount > 0) + alphaDyn = 0; + else if(amount < 0) + alphaDyn = alpha; + } + + effects |= eff; + effectAmount = amount; + effectTarget = target; +} + +void GuiElement::SetEffectOnOver(int eff, int amount, int target) +{ + effectsOver |= eff; + effectAmountOver = amount; + effectTargetOver = target; +} + +void GuiElement::SetEffectGrow() +{ + SetEffectOnOver(EFFECT_SCALE, 4, 110); +} + +void GuiElement::UpdateEffects() +{ + if(effects & (EFFECT_SLIDE_IN | EFFECT_SLIDE_OUT)) + { + if(effects & EFFECT_SLIDE_IN) + { + if(effects & EFFECT_SLIDE_LEFT) + { + xoffsetDyn += effectAmount; + + if(xoffsetDyn >= 0) + { + xoffsetDyn = 0; + effects = 0; + } + } + else if(effects & EFFECT_SLIDE_RIGHT) + { + xoffsetDyn -= effectAmount; + + if(xoffsetDyn <= 0) + { + xoffsetDyn = 0; + effects = 0; + } + } + else if(effects & EFFECT_SLIDE_TOP) + { + yoffsetDyn += effectAmount; + + if(yoffsetDyn >= 0) + { + yoffsetDyn = 0; + effects = 0; + } + } + else if(effects & EFFECT_SLIDE_BOTTOM) + { + yoffsetDyn -= effectAmount; + + if(yoffsetDyn <= 0) + { + yoffsetDyn = 0; + effects = 0; + } + } + } + else + { + if(effects & EFFECT_SLIDE_LEFT) + { + xoffsetDyn -= effectAmount; + + if(xoffsetDyn <= -screenwidth) + effects = 0; // shut off effect + } + else if(effects & EFFECT_SLIDE_RIGHT) + { + xoffsetDyn += effectAmount; + + if(xoffsetDyn >= screenwidth) + effects = 0; // shut off effect + } + else if(effects & EFFECT_SLIDE_TOP) + { + yoffsetDyn -= effectAmount; + + if(yoffsetDyn <= -screenheight) + effects = 0; // shut off effect + } + else if(effects & EFFECT_SLIDE_BOTTOM) + { + yoffsetDyn += effectAmount; + + if(yoffsetDyn >= screenheight) + effects = 0; // shut off effect + } + } + } + if(effects & EFFECT_FADE) + { + alphaDyn += effectAmount; + + if(effectAmount < 0 && alphaDyn <= 0) + { + alphaDyn = 0; + effects = 0; // shut off effect + } + else if(effectAmount > 0 && alphaDyn >= alpha) + { + alphaDyn = alpha; + effects = 0; // shut off effect + } + } + if(effects & EFFECT_SCALE) + { + scaleDyn += f32(effectAmount)*0.01f; + f32 effTar100 = f32(effectTarget)*0.01f; + + if((effectAmount < 0 && scaleDyn <= effTar100) + || (effectAmount > 0 && scaleDyn >= effTar100)) + { + scaleDyn = effTar100; + effects = 0; // shut off effect + } + } +} + +void GuiElement::Update(GuiTrigger * t) +{ + if(updateCB) + updateCB(this); +} + +void GuiElement::SetUpdateCallback(UpdateCallback u) +{ + updateCB = u; +} + +void GuiElement::SetPosition(int xoff, int yoff) +{ + xoffset = xoff; + yoffset = yoff; +} + +void GuiElement::SetAlignment(int hor, int vert) +{ + alignmentHor = hor; + alignmentVert = vert; +} + +int GuiElement::GetSelected() +{ + return -1; +} + +void GuiElement::ResetText() +{ +} + +void GuiElement::Draw() +{ +} + +void GuiElement::DrawTooltip() +{ +} + +bool GuiElement::IsInside(int x, int y) +{ + if(unsigned(x - this->GetLeft()) < unsigned(width) + && unsigned(y - this->GetTop()) < unsigned(height)) + return true; + return false; +} diff --git a/plugins/snes9x_gx/source/gui/gui_filebrowser.cpp b/plugins/snes9x_gx/source/gui/gui_filebrowser.cpp new file mode 100644 index 00000000..42edebd0 --- /dev/null +++ b/plugins/snes9x_gx/source/gui/gui_filebrowser.cpp @@ -0,0 +1,457 @@ +/**************************************************************************** + * libwiigui + * + * Tantric 2009 + * + * gui_filebrowser.cpp + * + * GUI class definitions + ***************************************************************************/ + +#include "gui.h" +#include "filebrowser.h" + +/** + * Constructor for the GuiFileBrowser class. + */ +GuiFileBrowser::GuiFileBrowser(int w, int h) +{ + width = w; + height = h; + numEntries = 0; + selectedItem = 0; + selectable = true; + listChanged = true; // trigger an initial list update + focus = 0; // allow focus + + trigA = new GuiTrigger; + trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); + trig2 = new GuiTrigger; + trig2->SetSimpleTrigger(-1, WPAD_BUTTON_2, 0); + + trigHeldA = new GuiTrigger; + trigHeldA->SetHeldTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); + + btnSoundOver = new GuiSound(button_over_pcm, button_over_pcm_size, SOUND_PCM); + btnSoundClick = new GuiSound(button_click_pcm, button_click_pcm_size, SOUND_PCM); + + bgFileSelection = new GuiImageData(bg_game_selection_png); + bgFileSelectionImg = new GuiImage(bgFileSelection); + bgFileSelectionImg->SetParent(this); + bgFileSelectionImg->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + + bgFileSelectionEntry = new GuiImageData(bg_game_selection_entry_png); + + iconFolder = new GuiImageData(icon_folder_png); + iconSD = new GuiImageData(icon_sd_png); + iconUSB = new GuiImageData(icon_usb_png); + iconDVD = new GuiImageData(icon_dvd_png); + iconSMB = new GuiImageData(icon_smb_png); + + scrollbar = new GuiImageData(scrollbar_png); + scrollbarImg = new GuiImage(scrollbar); + scrollbarImg->SetParent(this); + scrollbarImg->SetAlignment(ALIGN_RIGHT, ALIGN_TOP); + scrollbarImg->SetPosition(0, 30); + + arrowDown = new GuiImageData(scrollbar_arrowdown_png); + arrowDownImg = new GuiImage(arrowDown); + arrowDownOver = new GuiImageData(scrollbar_arrowdown_over_png); + arrowDownOverImg = new GuiImage(arrowDownOver); + arrowUp = new GuiImageData(scrollbar_arrowup_png); + arrowUpImg = new GuiImage(arrowUp); + arrowUpOver = new GuiImageData(scrollbar_arrowup_over_png); + arrowUpOverImg = new GuiImage(arrowUpOver); + scrollbarBox = new GuiImageData(scrollbar_box_png); + scrollbarBoxImg = new GuiImage(scrollbarBox); + scrollbarBoxOver = new GuiImageData(scrollbar_box_over_png); + scrollbarBoxOverImg = new GuiImage(scrollbarBoxOver); + + arrowUpBtn = new GuiButton(arrowUpImg->GetWidth(), arrowUpImg->GetHeight()); + arrowUpBtn->SetParent(this); + arrowUpBtn->SetImage(arrowUpImg); + arrowUpBtn->SetImageOver(arrowUpOverImg); + arrowUpBtn->SetAlignment(ALIGN_RIGHT, ALIGN_TOP); + arrowUpBtn->SetSelectable(false); + arrowUpBtn->SetClickable(false); + arrowUpBtn->SetHoldable(true); + arrowUpBtn->SetTrigger(trigHeldA); + arrowUpBtn->SetSoundOver(btnSoundOver); + arrowUpBtn->SetSoundClick(btnSoundClick); + + arrowDownBtn = new GuiButton(arrowDownImg->GetWidth(), arrowDownImg->GetHeight()); + arrowDownBtn->SetParent(this); + arrowDownBtn->SetImage(arrowDownImg); + arrowDownBtn->SetImageOver(arrowDownOverImg); + arrowDownBtn->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); + arrowDownBtn->SetSelectable(false); + arrowDownBtn->SetClickable(false); + arrowDownBtn->SetHoldable(true); + arrowDownBtn->SetTrigger(trigHeldA); + arrowDownBtn->SetSoundOver(btnSoundOver); + arrowDownBtn->SetSoundClick(btnSoundClick); + + scrollbarBoxBtn = new GuiButton(scrollbarBoxImg->GetWidth(), scrollbarBoxImg->GetHeight()); + scrollbarBoxBtn->SetParent(this); + scrollbarBoxBtn->SetImage(scrollbarBoxImg); + scrollbarBoxBtn->SetImageOver(scrollbarBoxOverImg); + scrollbarBoxBtn->SetAlignment(ALIGN_RIGHT, ALIGN_TOP); + scrollbarBoxBtn->SetMinY(0); + scrollbarBoxBtn->SetMaxY(156); + scrollbarBoxBtn->SetSelectable(false); + scrollbarBoxBtn->SetClickable(false); + scrollbarBoxBtn->SetHoldable(true); + scrollbarBoxBtn->SetTrigger(trigHeldA); + + for(int i=0; i<FILE_PAGESIZE; ++i) + { + fileListText[i] = new GuiText(NULL, 20, (GXColor){0, 0, 0, 0xff}); + fileListText[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + fileListText[i]->SetPosition(5,0); + fileListText[i]->SetMaxWidth(295); + + fileListBg[i] = new GuiImage(bgFileSelectionEntry); + fileListIcon[i] = NULL; + + fileList[i] = new GuiButton(295, 26); + fileList[i]->SetParent(this); + fileList[i]->SetLabel(fileListText[i]); + fileList[i]->SetImageOver(fileListBg[i]); + fileList[i]->SetPosition(2,26*i+3); + fileList[i]->SetTrigger(trigA); + fileList[i]->SetTrigger(trig2); + fileList[i]->SetSoundClick(btnSoundClick); + } +} + +/** + * Destructor for the GuiFileBrowser class. + */ +GuiFileBrowser::~GuiFileBrowser() +{ + delete arrowUpBtn; + delete arrowDownBtn; + delete scrollbarBoxBtn; + + delete bgFileSelectionImg; + delete scrollbarImg; + delete arrowDownImg; + delete arrowDownOverImg; + delete arrowUpImg; + delete arrowUpOverImg; + delete scrollbarBoxImg; + delete scrollbarBoxOverImg; + + delete bgFileSelection; + delete bgFileSelectionEntry; + delete iconFolder; + delete iconSD; + delete iconUSB; + delete iconDVD; + delete iconSMB; + delete scrollbar; + delete arrowDown; + delete arrowDownOver; + delete arrowUp; + delete arrowUpOver; + delete scrollbarBox; + delete scrollbarBoxOver; + + delete btnSoundOver; + delete btnSoundClick; + delete trigHeldA; + delete trigA; + delete trig2; + + for(int i=0; i<FILE_PAGESIZE; i++) + { + delete fileListText[i]; + delete fileList[i]; + delete fileListBg[i]; + + if(fileListIcon[i]) + delete fileListIcon[i]; + } +} + +void GuiFileBrowser::SetFocus(int f) +{ + focus = f; + + for(int i=0; i<FILE_PAGESIZE; i++) + fileList[i]->ResetState(); + + if(f == 1) + fileList[selectedItem]->SetState(STATE_SELECTED); +} + +void GuiFileBrowser::ResetState() +{ + state = STATE_DEFAULT; + stateChan = -1; + selectedItem = 0; + + for(int i=0; i<FILE_PAGESIZE; i++) + { + fileList[i]->ResetState(); + } +} + +void GuiFileBrowser::TriggerUpdate() +{ + int newIndex = browser.selIndex-browser.pageIndex; + + if(newIndex >= FILE_PAGESIZE) + newIndex = FILE_PAGESIZE-1; + else if(newIndex < 0) + newIndex = 0; + + selectedItem = newIndex; + listChanged = true; +} + +/** + * Draw the button on screen + */ +void GuiFileBrowser::Draw() +{ + if(!this->IsVisible()) + return; + + bgFileSelectionImg->Draw(); + + for(u32 i=0; i<FILE_PAGESIZE; ++i) + { + fileList[i]->Draw(); + } + + scrollbarImg->Draw(); + arrowUpBtn->Draw(); + arrowDownBtn->Draw(); + scrollbarBoxBtn->Draw(); + + this->UpdateEffects(); +} + +void GuiFileBrowser::DrawTooltip() +{ +} + +void GuiFileBrowser::Update(GuiTrigger * t) +{ + if(state == STATE_DISABLED || !t) + return; + + int position = 0; + int positionWiimote = 0; + + arrowUpBtn->Update(t); + arrowDownBtn->Update(t); + scrollbarBoxBtn->Update(t); + + // move the file listing to respond to wiimote cursor movement + if(scrollbarBoxBtn->GetState() == STATE_HELD && + scrollbarBoxBtn->GetStateChan() == t->chan && + t->wpad->ir.valid && + browser.numEntries > FILE_PAGESIZE + ) + { + scrollbarBoxBtn->SetPosition(0,0); + positionWiimote = t->wpad->ir.y - 60 - scrollbarBoxBtn->GetTop(); + + if(positionWiimote < scrollbarBoxBtn->GetMinY()) + positionWiimote = scrollbarBoxBtn->GetMinY(); + else if(positionWiimote > scrollbarBoxBtn->GetMaxY()) + positionWiimote = scrollbarBoxBtn->GetMaxY(); + + browser.pageIndex = (positionWiimote * browser.numEntries)/156.0f - selectedItem; + + if(browser.pageIndex <= 0) + { + browser.pageIndex = 0; + } + else if(browser.pageIndex+FILE_PAGESIZE >= browser.numEntries) + { + browser.pageIndex = browser.numEntries-FILE_PAGESIZE; + } + listChanged = true; + focus = false; + } + + if(arrowDownBtn->GetState() == STATE_HELD && arrowDownBtn->GetStateChan() == t->chan) + { + t->wpad->btns_d |= WPAD_BUTTON_DOWN; + if(!this->IsFocused()) + ((GuiWindow *)this->GetParent())->ChangeFocus(this); + } + else if(arrowUpBtn->GetState() == STATE_HELD && arrowUpBtn->GetStateChan() == t->chan) + { + t->wpad->btns_d |= WPAD_BUTTON_UP; + if(!this->IsFocused()) + ((GuiWindow *)this->GetParent())->ChangeFocus(this); + } + + // pad/joystick navigation + if(!focus) + { + goto endNavigation; // skip navigation + listChanged = false; + } + + if(t->Right()) + { + if(browser.pageIndex < browser.numEntries && browser.numEntries > FILE_PAGESIZE) + { + browser.pageIndex += FILE_PAGESIZE; + if(browser.pageIndex+FILE_PAGESIZE >= browser.numEntries) + browser.pageIndex = browser.numEntries-FILE_PAGESIZE; + listChanged = true; + } + } + else if(t->Left()) + { + if(browser.pageIndex > 0) + { + browser.pageIndex -= FILE_PAGESIZE; + if(browser.pageIndex < 0) + browser.pageIndex = 0; + listChanged = true; + } + } + else if(t->Down()) + { + if(browser.pageIndex + selectedItem + 1 < browser.numEntries) + { + if(selectedItem == FILE_PAGESIZE-1) + { + // move list down by 1 + ++browser.pageIndex; + listChanged = true; + } + else if(fileList[selectedItem+1]->IsVisible()) + { + fileList[selectedItem]->ResetState(); + fileList[++selectedItem]->SetState(STATE_SELECTED, t->chan); + } + } + } + else if(t->Up()) + { + if(selectedItem == 0 && browser.pageIndex + selectedItem > 0) + { + // move list up by 1 + --browser.pageIndex; + listChanged = true; + } + else if(selectedItem > 0) + { + fileList[selectedItem]->ResetState(); + fileList[--selectedItem]->SetState(STATE_SELECTED, t->chan); + } + } + + endNavigation: + + for(int i=0; i<FILE_PAGESIZE; ++i) + { + if(listChanged || numEntries != browser.numEntries) + { + if(browser.pageIndex+i < browser.numEntries) + { + if(fileList[i]->GetState() == STATE_DISABLED) + fileList[i]->SetState(STATE_DEFAULT); + + fileList[i]->SetVisible(true); + + fileListText[i]->SetText(browserList[browser.pageIndex+i].displayname); + + if(fileListIcon[i]) + { + delete fileListIcon[i]; + fileListIcon[i] = NULL; + fileListText[i]->SetPosition(5,0); + } + + switch(browserList[browser.pageIndex+i].icon) + { + case ICON_FOLDER: + fileListIcon[i] = new GuiImage(iconFolder); + break; + case ICON_SD: + fileListIcon[i] = new GuiImage(iconSD); + break; + case ICON_USB: + fileListIcon[i] = new GuiImage(iconUSB); + break; + case ICON_DVD: + fileListIcon[i] = new GuiImage(iconDVD); + break; + case ICON_SMB: + fileListIcon[i] = new GuiImage(iconSMB); + break; + } + fileList[i]->SetIcon(fileListIcon[i]); + if(fileListIcon[i] != NULL) + fileListText[i]->SetPosition(30,0); + } + else + { + fileList[i]->SetVisible(false); + fileList[i]->SetState(STATE_DISABLED); + } + } + + if(i != selectedItem && fileList[i]->GetState() == STATE_SELECTED) + fileList[i]->ResetState(); + else if(focus && i == selectedItem && fileList[i]->GetState() == STATE_DEFAULT) + fileList[selectedItem]->SetState(STATE_SELECTED, t->chan); + + int currChan = t->chan; + + if(t->wpad->ir.valid && !fileList[i]->IsInside(t->wpad->ir.x, t->wpad->ir.y)) + t->chan = -1; + + fileList[i]->Update(t); + t->chan = currChan; + + if(fileList[i]->GetState() == STATE_SELECTED) + { + selectedItem = i; + browser.selIndex = browser.pageIndex + i; + } + + if(selectedItem == i) + fileListText[i]->SetScroll(SCROLL_HORIZONTAL); + else + fileListText[i]->SetScroll(SCROLL_NONE); + } + + // update the location of the scroll box based on the position in the file list + if(positionWiimote > 0) + { + position = positionWiimote; // follow wiimote cursor + scrollbarBoxBtn->SetPosition(0,position+36); + } + else if(listChanged || numEntries != browser.numEntries) + { + if(float((browser.pageIndex<<1))/(float(FILE_PAGESIZE)) < 1.0) + { + position = 0; + } + else if(browser.pageIndex+FILE_PAGESIZE >= browser.numEntries) + { + position = 156; + } + else + { + position = 156 * (browser.pageIndex + FILE_PAGESIZE/2) / (float)browser.numEntries; + } + scrollbarBoxBtn->SetPosition(0,position+36); + } + + listChanged = false; + numEntries = browser.numEntries; + + if(updateCB) + updateCB(this); +} diff --git a/plugins/snes9x_gx/source/gui/gui_image.cpp b/plugins/snes9x_gx/source/gui/gui_image.cpp new file mode 100644 index 00000000..acf1b00c --- /dev/null +++ b/plugins/snes9x_gx/source/gui/gui_image.cpp @@ -0,0 +1,255 @@ +/**************************************************************************** + * libwiigui + * + * Tantric 2009 + * + * gui_image.cpp + * + * GUI class definitions + ***************************************************************************/ + +#include "gui.h" +/** + * Constructor for the GuiImage class. + */ +GuiImage::GuiImage() +{ + image = NULL; + width = 0; + height = 0; + imageangle = 0; + tile = -1; + stripe = 0; + imgType = IMAGE_DATA; +} + +GuiImage::GuiImage(GuiImageData * img) +{ + image = NULL; + width = 0; + height = 0; + if(img) + { + image = img->GetImage(); + width = img->GetWidth(); + height = img->GetHeight(); + } + imageangle = 0; + tile = -1; + stripe = 0; + imgType = IMAGE_DATA; +} + +GuiImage::GuiImage(u8 * img, int w, int h) +{ + image = img; + width = w; + height = h; + imageangle = 0; + tile = -1; + stripe = 0; + imgType = IMAGE_TEXTURE; +} + +GuiImage::GuiImage(int w, int h, GXColor c) +{ + image = (u8 *)memalign (32, w * h << 2); + width = w; + height = h; + imageangle = 0; + tile = -1; + stripe = 0; + imgType = IMAGE_COLOR; + + if(!image) + return; + + int x, y; + + for(y=0; y < h; ++y) + { + for(x=0; x < w; ++x) + { + this->SetPixel(x, y, c); + } + } + int len = w * h << 2; + if(len%32) len += (32-len%32); + DCFlushRange(image, len); +} + +/** + * Destructor for the GuiImage class. + */ +GuiImage::~GuiImage() +{ + if(imgType == IMAGE_COLOR && image) + free(image); +} + +u8 * GuiImage::GetImage() +{ + return image; +} + +void GuiImage::SetImage(GuiImageData * img) +{ + image = NULL; + width = 0; + height = 0; + if(img) + { + image = img->GetImage(); + width = img->GetWidth(); + height = img->GetHeight(); + } + imgType = IMAGE_DATA; +} + +void GuiImage::SetImage(u8 * img, int w, int h) +{ + image = img; + width = w; + height = h; + imgType = IMAGE_TEXTURE; +} + +void GuiImage::SetAngle(float a) +{ + imageangle = a; +} + +void GuiImage::SetTile(int t) +{ + tile = t; +} + +GXColor GuiImage::GetPixel(int x, int y) +{ + if(!image || this->GetWidth() <= 0 || x < 0 || y < 0) + return (GXColor){0, 0, 0, 0}; + + u32 offset = (((y >> 2)<<4)*this->GetWidth()) + ((x >> 2)<<6) + (((y%4 << 2) + x%4 ) << 1); + GXColor color; + color.a = *(image+offset); + color.r = *(image+offset+1); + color.g = *(image+offset+32); + color.b = *(image+offset+33); + return color; +} + +void GuiImage::SetPixel(int x, int y, GXColor color) +{ + if(!image || this->GetWidth() <= 0 || x < 0 || y < 0) + return; + + u32 offset = (((y >> 2)<<4)*this->GetWidth()) + ((x >> 2)<<6) + (((y%4 << 2) + x%4 ) << 1); + *(image+offset) = color.a; + *(image+offset+1) = color.r; + *(image+offset+32) = color.g; + *(image+offset+33) = color.b; +} + +void GuiImage::SetStripe(int s) +{ + stripe = s; +} + +void GuiImage::ColorStripe(int shift) +{ + GXColor color; + int x, y=0; + int alt = 0; + + int thisHeight = this->GetHeight(); + int thisWidth = this->GetWidth(); + + for(; y < thisHeight; ++y) + { + if(y % 3 == 0) + alt ^= 1; + + if(alt) + { + for(x=0; x < thisWidth; ++x) + { + color = GetPixel(x, y); + + if(color.r < 255-shift) + color.r += shift; + else + color.r = 255; + if(color.g < 255-shift) + color.g += shift; + else + color.g = 255; + if(color.b < 255-shift) + color.b += shift; + else + color.b = 255; + + color.a = 255; + SetPixel(x, y, color); + } + } + else + { + for(x=0; x < thisWidth; ++x) + { + color = GetPixel(x, y); + + if(color.r > shift) + color.r -= shift; + else + color.r = 0; + if(color.g > shift) + color.g -= shift; + else + color.g = 0; + if(color.b > shift) + color.b -= shift; + else + color.b = 0; + + color.a = 255; + SetPixel(x, y, color); + } + } + } +} + +/** + * Draw the button on screen + */ +void GuiImage::Draw() +{ + if(!image || !this->IsVisible() || tile == 0) + return; + + float currScaleX = this->GetScaleX(); + float currScaleY = this->GetScaleY(); + int currLeft = this->GetLeft(); + int thisTop = this->GetTop(); + + if(tile > 0) + { + int alpha = this->GetAlpha(); + for(int i=0; i<tile; ++i) + { + Menu_DrawImg(currLeft+width*i, thisTop, width, height, image, imageangle, currScaleX, currScaleY, alpha); + } + } + else + { + Menu_DrawImg(currLeft, thisTop, width, height, image, imageangle, currScaleX, currScaleY, this->GetAlpha()); + } + + if(stripe > 0) + { + int thisHeight = this->GetHeight(); + int thisWidth = this->GetWidth(); + for(int y=0; y < thisHeight; y+=6) + Menu_DrawRectangle(currLeft,thisTop+y,thisWidth,3,(GXColor){0, 0, 0, stripe},1); + } + this->UpdateEffects(); +} diff --git a/plugins/snes9x_gx/source/gui/gui_imagedata.cpp b/plugins/snes9x_gx/source/gui/gui_imagedata.cpp new file mode 100644 index 00000000..97e7513e --- /dev/null +++ b/plugins/snes9x_gx/source/gui/gui_imagedata.cpp @@ -0,0 +1,51 @@ +/**************************************************************************** + * libwiigui + * + * Tantric 2009 + * + * gui_imagedata.cpp + * + * GUI class definitions + ***************************************************************************/ + +#include "gui.h" + +/** + * Constructor for the GuiImageData class. + */ +GuiImageData::GuiImageData(const u8 * i, int maxw, int maxh) +{ + data = NULL; + width = 0; + height = 0; + + if(i) + data = DecodePNG(i, &width, &height, data, maxw, maxh); +} + +/** + * Destructor for the GuiImageData class. + */ +GuiImageData::~GuiImageData() +{ + if(data) + { + free(data); + data = NULL; + } +} + +u8 * GuiImageData::GetImage() +{ + return data; +} + +int GuiImageData::GetWidth() +{ + return width; +} + +int GuiImageData::GetHeight() +{ + return height; +} diff --git a/plugins/snes9x_gx/source/gui/gui_keyboard.cpp b/plugins/snes9x_gx/source/gui/gui_keyboard.cpp new file mode 100644 index 00000000..db4a9647 --- /dev/null +++ b/plugins/snes9x_gx/source/gui/gui_keyboard.cpp @@ -0,0 +1,372 @@ +/**************************************************************************** + * libwiigui + * + * Tantric 2009 + * + * gui_keyboard.cpp + * + * GUI class definitions + ***************************************************************************/ + +#include "gui.h" + +static char tmptxt[MAX_KEYBOARD_DISPLAY]; + +static char * GetDisplayText(char * t) +{ + if(!t) + return NULL; + + int len = strlen(t); + + if(len < MAX_KEYBOARD_DISPLAY) + return t; + + snprintf(tmptxt, MAX_KEYBOARD_DISPLAY, "%s", &t[len-MAX_KEYBOARD_DISPLAY]); + return &tmptxt[0]; +} + +/** + * Constructor for the GuiKeyboard class. + */ + +GuiKeyboard::GuiKeyboard(char * t, u32 max) +{ + width = 540; + height = 400; + shift = 0; + caps = 0; + selectable = true; + focus = 0; // allow focus + alignmentHor = ALIGN_CENTRE; + alignmentVert = ALIGN_MIDDLE; + snprintf(kbtextstr, 255, "%s", t); + kbtextmaxlen = max; + + Key thekeys[4][11] = { + { + {'1','!'}, + {'2','@'}, + {'3','#'}, + {'4','$'}, + {'5','%'}, + {'6','^'}, + {'7','&'}, + {'8','*'}, + {'9','('}, + {'0',')'}, + {'\0','\0'} + }, + { + {'q','Q'}, + {'w','W'}, + {'e','E'}, + {'r','R'}, + {'t','T'}, + {'y','Y'}, + {'u','U'}, + {'i','I'}, + {'o','O'}, + {'p','P'}, + {'-','_'} + }, + { + {'a','A'}, + {'s','S'}, + {'d','D'}, + {'f','F'}, + {'g','G'}, + {'h','H'}, + {'j','J'}, + {'k','K'}, + {'l','L'}, + {';',':'}, + {'\'','"'} + }, + + { + {'z','Z'}, + {'x','X'}, + {'c','C'}, + {'v','V'}, + {'b','B'}, + {'n','N'}, + {'m','M'}, + {',','<'}, + {'.','>'}, + {'/','?'}, + {'\0','\0'} + } + }; + memcpy(keys, thekeys, sizeof(thekeys)); + + keyTextbox = new GuiImageData(keyboard_textbox_png); + keyTextboxImg = new GuiImage(keyTextbox); + keyTextboxImg->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + keyTextboxImg->SetPosition(0, 0); + this->Append(keyTextboxImg); + + kbText = new GuiText(GetDisplayText(kbtextstr), 22, (GXColor){0, 0, 0, 0xff}); + kbText->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + kbText->SetPosition(0, 13); + this->Append(kbText); + + key = new GuiImageData(keyboard_key_png); + keyOver = new GuiImageData(keyboard_key_over_png); + keyMedium = new GuiImageData(keyboard_mediumkey_png); + keyMediumOver = new GuiImageData(keyboard_mediumkey_over_png); + keyLarge = new GuiImageData(keyboard_largekey_png); + keyLargeOver = new GuiImageData(keyboard_largekey_over_png); + + keySoundOver = new GuiSound(button_over_pcm, button_over_pcm_size, SOUND_PCM); + keySoundClick = new GuiSound(button_click_pcm, button_click_pcm_size, SOUND_PCM); + + trigA = new GuiTrigger; + trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); + trig2 = new GuiTrigger; + trig2->SetSimpleTrigger(-1, WPAD_BUTTON_2, 0); + + keyBackImg = new GuiImage(keyMedium); + keyBackOverImg = new GuiImage(keyMediumOver); + keyBackText = new GuiText("Back", 22, (GXColor){0, 0, 0, 0xff}); + keyBack = new GuiButton(keyMedium->GetWidth(), keyMedium->GetHeight()); + keyBack->SetImage(keyBackImg); + keyBack->SetImageOver(keyBackOverImg); + keyBack->SetLabel(keyBackText); + keyBack->SetSoundOver(keySoundOver); + keyBack->SetSoundClick(keySoundClick); + keyBack->SetTrigger(trigA); + keyBack->SetTrigger(trig2); + keyBack->SetPosition(10*42+40, 0*42+80); + keyBack->SetEffectGrow(); + this->Append(keyBack); + + keyCapsImg = new GuiImage(keyMedium); + keyCapsOverImg = new GuiImage(keyMediumOver); + keyCapsText = new GuiText("Caps", 22, (GXColor){0, 0, 0, 0xff}); + keyCaps = new GuiButton(keyMedium->GetWidth(), keyMedium->GetHeight()); + keyCaps->SetImage(keyCapsImg); + keyCaps->SetImageOver(keyCapsOverImg); + keyCaps->SetLabel(keyCapsText); + keyCaps->SetSoundOver(keySoundOver); + keyCaps->SetSoundClick(keySoundClick); + keyCaps->SetTrigger(trigA); + keyCaps->SetTrigger(trig2); + keyCaps->SetPosition(0, 2*42+80); + keyCaps->SetEffectGrow(); + this->Append(keyCaps); + + keyShiftImg = new GuiImage(keyMedium); + keyShiftOverImg = new GuiImage(keyMediumOver); + keyShiftText = new GuiText("Shift", 22, (GXColor){0, 0, 0, 0xff}); + keyShift = new GuiButton(keyMedium->GetWidth(), keyMedium->GetHeight()); + keyShift->SetImage(keyShiftImg); + keyShift->SetImageOver(keyShiftOverImg); + keyShift->SetLabel(keyShiftText); + keyShift->SetSoundOver(keySoundOver); + keyShift->SetSoundClick(keySoundClick); + keyShift->SetTrigger(trigA); + keyShift->SetTrigger(trig2); + keyShift->SetPosition(21, 3*42+80); + keyShift->SetEffectGrow(); + this->Append(keyShift); + + keySpaceImg = new GuiImage(keyLarge); + keySpaceOverImg = new GuiImage(keyLargeOver); + keySpace = new GuiButton(keyLarge->GetWidth(), keyLarge->GetHeight()); + keySpace->SetImage(keySpaceImg); + keySpace->SetImageOver(keySpaceOverImg); + keySpace->SetSoundOver(keySoundOver); + keySpace->SetSoundClick(keySoundClick); + keySpace->SetTrigger(trigA); + keySpace->SetTrigger(trig2); + keySpace->SetPosition(0, 4*42+80); + keySpace->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + keySpace->SetEffectGrow(); + this->Append(keySpace); + + char txt[2] = { 0, 0 }; + + for(int i=0; i<4; i++) + { + for(int j=0; j<11; j++) + { + if(keys[i][j].ch != '\0') + { + txt[0] = keys[i][j].ch; + keyImg[i][j] = new GuiImage(key); + keyImgOver[i][j] = new GuiImage(keyOver); + keyTxt[i][j] = new GuiText(txt, 22, (GXColor){0, 0, 0, 0xff}); + keyTxt[i][j]->SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM); + keyTxt[i][j]->SetPosition(0, -8); + keyBtn[i][j] = new GuiButton(key->GetWidth(), key->GetHeight()); + keyBtn[i][j]->SetImage(keyImg[i][j]); + keyBtn[i][j]->SetImageOver(keyImgOver[i][j]); + keyBtn[i][j]->SetSoundOver(keySoundOver); + keyBtn[i][j]->SetSoundClick(keySoundClick); + keyBtn[i][j]->SetTrigger(trigA); + keyBtn[i][j]->SetTrigger(trig2); + keyBtn[i][j]->SetLabel(keyTxt[i][j]); + keyBtn[i][j]->SetPosition(j*42+21*i+40, i*42+80); + keyBtn[i][j]->SetEffectGrow(); + this->Append(keyBtn[i][j]); + } + } + } +} + +/** + * Destructor for the GuiKeyboard class. + */ +GuiKeyboard::~GuiKeyboard() +{ + delete kbText; + delete keyTextbox; + delete keyTextboxImg; + delete keyCapsText; + delete keyCapsImg; + delete keyCapsOverImg; + delete keyCaps; + delete keyShiftText; + delete keyShiftImg; + delete keyShiftOverImg; + delete keyShift; + delete keyBackText; + delete keyBackImg; + delete keyBackOverImg; + delete keyBack; + delete keySpaceImg; + delete keySpaceOverImg; + delete keySpace; + delete key; + delete keyOver; + delete keyMedium; + delete keyMediumOver; + delete keyLarge; + delete keyLargeOver; + delete keySoundOver; + delete keySoundClick; + delete trigA; + delete trig2; + + for(int i=0; i<4; i++) + { + for(int j=0; j<11; j++) + { + if(keys[i][j].ch != '\0') + { + delete keyImg[i][j]; + delete keyImgOver[i][j]; + delete keyTxt[i][j]; + delete keyBtn[i][j]; + } + } + } +} + +void GuiKeyboard::Update(GuiTrigger * t) +{ + if(_elements.size() == 0 || (state == STATE_DISABLED && parentElement)) + return; + + for (u8 i = 0; i < _elements.size(); i++) + { + try { _elements.at(i)->Update(t); } + catch (const std::exception& e) { } + } + + bool update = false; + + if(keySpace->GetState() == STATE_CLICKED) + { + if(strlen(kbtextstr) < kbtextmaxlen) + { + kbtextstr[strlen(kbtextstr)] = ' '; + kbText->SetText(kbtextstr); + } + keySpace->SetState(STATE_SELECTED, t->chan); + } + else if(keyBack->GetState() == STATE_CLICKED) + { + if(strlen(kbtextstr) > 0) + { + kbtextstr[strlen(kbtextstr)-1] = 0; + kbText->SetText(GetDisplayText(kbtextstr)); + } + keyBack->SetState(STATE_SELECTED, t->chan); + } + else if(keyShift->GetState() == STATE_CLICKED) + { + shift ^= 1; + keyShift->SetState(STATE_SELECTED, t->chan); + update = true; + } + else if(keyCaps->GetState() == STATE_CLICKED) + { + caps ^= 1; + keyCaps->SetState(STATE_SELECTED, t->chan); + update = true; + } + + char txt[2] = { 0, 0 }; + + startloop: + + for(int i=0; i<4; i++) + { + for(int j=0; j<11; j++) + { + if(keys[i][j].ch != '\0') + { + if(update) + { + if(shift || caps) + txt[0] = keys[i][j].chShift; + else + txt[0] = keys[i][j].ch; + + keyTxt[i][j]->SetText(txt); + } + + if(keyBtn[i][j]->GetState() == STATE_CLICKED) + { + if(strlen(kbtextstr) < kbtextmaxlen) + { + if(shift || caps) + { + kbtextstr[strlen(kbtextstr)] = keys[i][j].chShift; + } + else + { + kbtextstr[strlen(kbtextstr)] = keys[i][j].ch; + } + } + kbText->SetText(GetDisplayText(kbtextstr)); + keyBtn[i][j]->SetState(STATE_SELECTED, t->chan); + + if(shift) + { + shift ^= 1; + update = true; + goto startloop; + } + } + } + } + } + + this->ToggleFocus(t); + + if(focus) // only send actions to this window if it's in focus + { + // pad/joystick navigation + if(t->Right()) + this->MoveSelectionHor(1); + else if(t->Left()) + this->MoveSelectionHor(-1); + else if(t->Down()) + this->MoveSelectionVert(1); + else if(t->Up()) + this->MoveSelectionVert(-1); + } +} diff --git a/plugins/snes9x_gx/source/gui/gui_optionbrowser.cpp b/plugins/snes9x_gx/source/gui/gui_optionbrowser.cpp new file mode 100644 index 00000000..027fbfb6 --- /dev/null +++ b/plugins/snes9x_gx/source/gui/gui_optionbrowser.cpp @@ -0,0 +1,366 @@ +/**************************************************************************** + * libwiigui + * + * Tantric 2009 + * + * gui_optionbrowser.cpp + * + * GUI class definitions + ***************************************************************************/ + +#include "gui.h" + +/** + * Constructor for the GuiOptionBrowser class. + */ +GuiOptionBrowser::GuiOptionBrowser(int w, int h, OptionList * l) +{ + width = w; + height = h; + options = l; + selectable = true; + listOffset = this->FindMenuItem(-1, 1); + listChanged = true; // trigger an initial list update + selectedItem = 0; + focus = 0; // allow focus + + trigA = new GuiTrigger; + trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); + trig2 = new GuiTrigger; + trig2->SetSimpleTrigger(-1, WPAD_BUTTON_2, 0); + + btnSoundOver = new GuiSound(button_over_pcm, button_over_pcm_size, SOUND_PCM); + btnSoundClick = new GuiSound(button_click_pcm, button_click_pcm_size, SOUND_PCM); + + bgOptions = new GuiImageData(bg_options_png); + bgOptionsImg = new GuiImage(bgOptions); + bgOptionsImg->SetParent(this); + bgOptionsImg->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + + bgOptionsEntry = new GuiImageData(bg_options_entry_png); + + scrollbar = new GuiImageData(scrollbar_png); + scrollbarImg = new GuiImage(scrollbar); + scrollbarImg->SetParent(this); + scrollbarImg->SetAlignment(ALIGN_RIGHT, ALIGN_TOP); + scrollbarImg->SetPosition(0, 30); + + arrowDown = new GuiImageData(scrollbar_arrowdown_png); + arrowDownImg = new GuiImage(arrowDown); + arrowDownOver = new GuiImageData(scrollbar_arrowdown_over_png); + arrowDownOverImg = new GuiImage(arrowDownOver); + arrowUp = new GuiImageData(scrollbar_arrowup_png); + arrowUpImg = new GuiImage(arrowUp); + arrowUpOver = new GuiImageData(scrollbar_arrowup_over_png); + arrowUpOverImg = new GuiImage(arrowUpOver); + + arrowUpBtn = new GuiButton(arrowUpImg->GetWidth(), arrowUpImg->GetHeight()); + arrowUpBtn->SetParent(this); + arrowUpBtn->SetImage(arrowUpImg); + arrowUpBtn->SetImageOver(arrowUpOverImg); + arrowUpBtn->SetAlignment(ALIGN_RIGHT, ALIGN_TOP); + arrowUpBtn->SetSelectable(false); + arrowUpBtn->SetTrigger(trigA); + arrowUpBtn->SetSoundOver(btnSoundOver); + arrowUpBtn->SetSoundClick(btnSoundClick); + + arrowDownBtn = new GuiButton(arrowDownImg->GetWidth(), arrowDownImg->GetHeight()); + arrowDownBtn->SetParent(this); + arrowDownBtn->SetImage(arrowDownImg); + arrowDownBtn->SetImageOver(arrowDownOverImg); + arrowDownBtn->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); + arrowDownBtn->SetSelectable(false); + arrowDownBtn->SetTrigger(trigA); + arrowDownBtn->SetSoundOver(btnSoundOver); + arrowDownBtn->SetSoundClick(btnSoundClick); + + for(int i=0; i<PAGESIZE; i++) + { + optionTxt[i] = new GuiText(NULL, 20, (GXColor){0, 0, 0, 0xff}); + optionTxt[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + optionTxt[i]->SetPosition(8,0); + + optionVal[i] = new GuiText(NULL, 20, (GXColor){0, 0, 0, 0xff}); + optionVal[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + optionVal[i]->SetPosition(250,0); + + optionBg[i] = new GuiImage(bgOptionsEntry); + + optionBtn[i] = new GuiButton(512,30); + optionBtn[i]->SetParent(this); + optionBtn[i]->SetLabel(optionTxt[i], 0); + optionBtn[i]->SetLabel(optionVal[i], 1); + optionBtn[i]->SetImageOver(optionBg[i]); + optionBtn[i]->SetPosition(0,30*i+3); + optionBtn[i]->SetTrigger(trigA); + optionBtn[i]->SetTrigger(trig2); + optionBtn[i]->SetSoundClick(btnSoundClick); + } +} + +/** + * Destructor for the GuiOptionBrowser class. + */ +GuiOptionBrowser::~GuiOptionBrowser() +{ + delete arrowUpBtn; + delete arrowDownBtn; + + delete bgOptionsImg; + delete scrollbarImg; + delete arrowDownImg; + delete arrowDownOverImg; + delete arrowUpImg; + delete arrowUpOverImg; + + delete bgOptions; + delete bgOptionsEntry; + delete scrollbar; + delete arrowDown; + delete arrowDownOver; + delete arrowUp; + delete arrowUpOver; + + delete trigA; + delete trig2; + delete btnSoundOver; + delete btnSoundClick; + + for(int i=0; i<PAGESIZE; i++) + { + delete optionTxt[i]; + delete optionVal[i]; + delete optionBg[i]; + delete optionBtn[i]; + } +} + +void GuiOptionBrowser::SetCol1Position(int x) +{ + for(int i=0; i<PAGESIZE; i++) + optionTxt[i]->SetPosition(x,0); +} + +void GuiOptionBrowser::SetCol2Position(int x) +{ + for(int i=0; i<PAGESIZE; i++) + optionVal[i]->SetPosition(x,0); +} + +void GuiOptionBrowser::SetFocus(int f) +{ + focus = f; + + for(int i=0; i<PAGESIZE; i++) + optionBtn[i]->ResetState(); + + if(f == 1) + optionBtn[selectedItem]->SetState(STATE_SELECTED); +} + +void GuiOptionBrowser::ResetState() +{ + if(state != STATE_DISABLED) + { + state = STATE_DEFAULT; + stateChan = -1; + } + + for(int i=0; i<PAGESIZE; i++) + { + optionBtn[i]->ResetState(); + } +} + +int GuiOptionBrowser::GetClickedOption() +{ + int found = -1; + for(int i=0; i<PAGESIZE; i++) + { + if(optionBtn[i]->GetState() == STATE_CLICKED) + { + optionBtn[i]->SetState(STATE_SELECTED); + found = optionIndex[i]; + break; + } + } + return found; +} + +/**************************************************************************** + * FindMenuItem + * + * Help function to find the next visible menu item on the list + ***************************************************************************/ + +int GuiOptionBrowser::FindMenuItem(int currentItem, int direction) +{ + int nextItem = currentItem + direction; + + if(nextItem < 0 || nextItem >= options->length) + return -1; + + if(strlen(options->name[nextItem]) > 0) + return nextItem; + else + return FindMenuItem(nextItem, direction); +} + +/** + * Draw the button on screen + */ +void GuiOptionBrowser::Draw() +{ + if(!this->IsVisible()) + return; + + bgOptionsImg->Draw(); + + int next = listOffset; + + for(int i=0; i<PAGESIZE; ++i) + { + if(next >= 0) + { + optionBtn[i]->Draw(); + next = this->FindMenuItem(next, 1); + } + else + break; + } + + scrollbarImg->Draw(); + arrowUpBtn->Draw(); + arrowDownBtn->Draw(); + + this->UpdateEffects(); +} + +void GuiOptionBrowser::TriggerUpdate() +{ + listChanged = true; +} + +void GuiOptionBrowser::ResetText() +{ + int next = listOffset; + + for(int i=0; i<PAGESIZE; i++) + { + if(next >= 0) + { + optionBtn[i]->ResetText(); + next = this->FindMenuItem(next, 1); + } + else + break; + } +} + +void GuiOptionBrowser::Update(GuiTrigger * t) +{ + if(state == STATE_DISABLED || !t) + return; + + int next, prev; + + arrowUpBtn->Update(t); + arrowDownBtn->Update(t); + + next = listOffset; + + if(listChanged) + { + listChanged = false; + for(int i=0; i<PAGESIZE; ++i) + { + if(next >= 0) + { + if(optionBtn[i]->GetState() == STATE_DISABLED) + { + optionBtn[i]->SetVisible(true); + optionBtn[i]->SetState(STATE_DEFAULT); + } + + optionTxt[i]->SetText(options->name[next]); + optionVal[i]->SetText(options->value[next]); + optionIndex[i] = next; + next = this->FindMenuItem(next, 1); + } + else + { + optionBtn[i]->SetVisible(false); + optionBtn[i]->SetState(STATE_DISABLED); + } + } + } + + for(int i=0; i<PAGESIZE; ++i) + { + if(i != selectedItem && optionBtn[i]->GetState() == STATE_SELECTED) + optionBtn[i]->ResetState(); + else if(focus && i == selectedItem && optionBtn[i]->GetState() == STATE_DEFAULT) + optionBtn[selectedItem]->SetState(STATE_SELECTED, t->chan); + + int currChan = t->chan; + + if(t->wpad->ir.valid && !optionBtn[i]->IsInside(t->wpad->ir.x, t->wpad->ir.y)) + t->chan = -1; + + optionBtn[i]->Update(t); + t->chan = currChan; + + if(optionBtn[i]->GetState() == STATE_SELECTED) + selectedItem = i; + } + + // pad/joystick navigation + if(!focus) + return; // skip navigation + + if(t->Down() || arrowDownBtn->GetState() == STATE_CLICKED) + { + next = this->FindMenuItem(optionIndex[selectedItem], 1); + + if(next >= 0) + { + if(selectedItem == PAGESIZE-1) + { + // move list down by 1 + listOffset = this->FindMenuItem(listOffset, 1); + listChanged = true; + } + else if(optionBtn[selectedItem+1]->IsVisible()) + { + optionBtn[selectedItem]->ResetState(); + optionBtn[selectedItem+1]->SetState(STATE_SELECTED, t->chan); + ++selectedItem; + } + } + arrowDownBtn->ResetState(); + } + else if(t->Up() || arrowUpBtn->GetState() == STATE_CLICKED) + { + prev = this->FindMenuItem(optionIndex[selectedItem], -1); + + if(prev >= 0) + { + if(selectedItem == 0) + { + // move list up by 1 + listOffset = prev; + listChanged = true; + } + else + { + optionBtn[selectedItem]->ResetState(); + optionBtn[selectedItem-1]->SetState(STATE_SELECTED, t->chan); + --selectedItem; + } + } + arrowUpBtn->ResetState(); + } + + if(updateCB) + updateCB(this); +} diff --git a/plugins/snes9x_gx/source/gui/gui_savebrowser.cpp b/plugins/snes9x_gx/source/gui/gui_savebrowser.cpp new file mode 100644 index 00000000..5e181773 --- /dev/null +++ b/plugins/snes9x_gx/source/gui/gui_savebrowser.cpp @@ -0,0 +1,398 @@ +/**************************************************************************** + * libwiigui + * + * Tantric 2009 + * + * gui_savebrowser.cpp + * + * GUI class definitions + ***************************************************************************/ + +#include "gui.h" +#include "filebrowser.h" + +/** + * Constructor for the GuiSaveBrowser class. + */ +GuiSaveBrowser::GuiSaveBrowser(int w, int h, SaveList * s, int a) +{ + width = w; + height = h; + saves = s; + action = a; + selectable = true; + + if(action == 0) // load + listOffset = 0; + else + listOffset = -2; // save - reserve -2 & -1 for new slots + + selectedItem = 0; + focus = 0; // allow focus + + trigA = new GuiTrigger; + trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); + trig2 = new GuiTrigger; + trig2->SetSimpleTrigger(-1, WPAD_BUTTON_2, 0); + + btnSoundOver = new GuiSound(button_over_pcm, button_over_pcm_size, SOUND_PCM); + btnSoundClick = new GuiSound(button_click_pcm, button_click_pcm_size, SOUND_PCM); + + gameSave = new GuiImageData(button_gamesave_png); + gameSaveOver = new GuiImageData(button_gamesave_over_png); + gameSaveBlank = new GuiImageData(button_gamesave_blank_png); + + scrollbar = new GuiImageData(scrollbar_png); + scrollbarImg = new GuiImage(scrollbar); + scrollbarImg->SetParent(this); + scrollbarImg->SetAlignment(ALIGN_RIGHT, ALIGN_TOP); + scrollbarImg->SetPosition(0, 30); + + arrowDown = new GuiImageData(scrollbar_arrowdown_png); + arrowDownImg = new GuiImage(arrowDown); + arrowDownOver = new GuiImageData(scrollbar_arrowdown_over_png); + arrowDownOverImg = new GuiImage(arrowDownOver); + arrowUp = new GuiImageData(scrollbar_arrowup_png); + arrowUpImg = new GuiImage(arrowUp); + arrowUpOver = new GuiImageData(scrollbar_arrowup_over_png); + arrowUpOverImg = new GuiImage(arrowUpOver); + + arrowUpBtn = new GuiButton(arrowUpImg->GetWidth(), arrowUpImg->GetHeight()); + arrowUpBtn->SetParent(this); + arrowUpBtn->SetImage(arrowUpImg); + arrowUpBtn->SetImageOver(arrowUpOverImg); + arrowUpBtn->SetAlignment(ALIGN_RIGHT, ALIGN_TOP); + arrowUpBtn->SetSelectable(false); + arrowUpBtn->SetTrigger(trigA); + arrowUpBtn->SetSoundOver(btnSoundOver); + arrowUpBtn->SetSoundClick(btnSoundClick); + + arrowDownBtn = new GuiButton(arrowDownImg->GetWidth(), arrowDownImg->GetHeight()); + arrowDownBtn->SetParent(this); + arrowDownBtn->SetImage(arrowDownImg); + arrowDownBtn->SetImageOver(arrowDownOverImg); + arrowDownBtn->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); + arrowDownBtn->SetSelectable(false); + arrowDownBtn->SetTrigger(trigA); + arrowDownBtn->SetSoundOver(btnSoundOver); + arrowDownBtn->SetSoundClick(btnSoundClick); + + for(int i=0; i<SAVELISTSIZE; i++) + { + saveDate[i] = new GuiText(NULL, 18, (GXColor){0, 0, 0, 0xff}); + saveDate[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP); + saveDate[i]->SetPosition(80,5); + saveTime[i] = new GuiText(NULL, 18, (GXColor){0, 0, 0, 0xff}); + saveTime[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP); + saveTime[i]->SetPosition(80,27); + + saveType[i] = new GuiText(NULL, 18, (GXColor){0, 0, 0, 0xff}); + saveType[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP); + saveType[i]->SetPosition(80,50); + + saveBgImg[i] = new GuiImage(gameSave); + saveBgOverImg[i] = new GuiImage(gameSaveOver); + savePreviewImg[i] = new GuiImage(gameSaveBlank); + savePreviewImg[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + savePreviewImg[i]->SetPosition(5,0); + + saveBtn[i] = new GuiButton(saveBgImg[i]->GetWidth(),saveBgImg[i]->GetHeight()); + saveBtn[i]->SetParent(this); + saveBtn[i]->SetLabel(saveDate[i], 0); + saveBtn[i]->SetLabel(saveTime[i], 1); + saveBtn[i]->SetLabel(saveType[i], 2); + saveBtn[i]->SetImage(saveBgImg[i]); + saveBtn[i]->SetImageOver(saveBgOverImg[i]); + saveBtn[i]->SetIcon(savePreviewImg[i]); + saveBtn[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP); + saveBtn[i]->SetPosition(257*(i % 2),87*(i>>1)); + saveBtn[i]->SetTrigger(trigA); + saveBtn[i]->SetTrigger(trig2); + saveBtn[i]->SetState(STATE_DISABLED); + saveBtn[i]->SetEffectGrow(); + saveBtn[i]->SetVisible(false); + saveBtn[i]->SetSoundOver(btnSoundOver); + saveBtn[i]->SetSoundClick(btnSoundClick); + saveBtnLastOver[i] = false; + } + saveBtn[0]->SetState(STATE_SELECTED, -1); + saveBtn[0]->SetVisible(true); +} + +/** + * Destructor for the GuiSaveBrowser class. + */ +GuiSaveBrowser::~GuiSaveBrowser() +{ + delete arrowUpBtn; + delete arrowDownBtn; + + delete scrollbarImg; + delete arrowDownImg; + delete arrowDownOverImg; + delete arrowUpImg; + delete arrowUpOverImg; + + delete gameSave; + delete gameSaveOver; + delete gameSaveBlank; + delete scrollbar; + delete arrowDown; + delete arrowDownOver; + delete arrowUp; + delete arrowUpOver; + + delete btnSoundOver; + delete btnSoundClick; + delete trigA; + delete trig2; + + for(int i=0; i<SAVELISTSIZE; i++) + { + delete saveBtn[i]; + delete saveDate[i]; + delete saveTime[i]; + delete saveType[i]; + delete saveBgImg[i]; + delete saveBgOverImg[i]; + delete savePreviewImg[i]; + } +} + +void GuiSaveBrowser::SetFocus(int f) +{ + focus = f; + + for(int i=0; i<SAVELISTSIZE; i++) + saveBtn[i]->ResetState(); + + if(f == 1 && selectedItem >= 0) + saveBtn[selectedItem]->SetState(STATE_SELECTED); +} + +void GuiSaveBrowser::ResetState() +{ + if(state != STATE_DISABLED) + { + state = STATE_DEFAULT; + stateChan = -1; + } + + for(int i=0; i<SAVELISTSIZE; i++) + { + saveBtn[i]->ResetState(); + } +} + +int GuiSaveBrowser::GetClickedSave() +{ + int found = -3; + for(int i=0; i<SAVELISTSIZE; i++) + { + if(saveBtn[i]->GetState() == STATE_CLICKED) + { + saveBtn[i]->SetState(STATE_SELECTED); + found = listOffset+i; + break; + } + } + return found; +} + +/** + * Draw the button on screen + */ +void GuiSaveBrowser::Draw() +{ + if(!this->IsVisible()) + return; + + for(int i=0; i<SAVELISTSIZE; i++) + saveBtn[i]->Draw(); + + scrollbarImg->Draw(); + arrowUpBtn->Draw(); + arrowDownBtn->Draw(); + + this->UpdateEffects(); +} + +void GuiSaveBrowser::Update(GuiTrigger * t) +{ + if(state == STATE_DISABLED || !t) + return; + + int i, len; + char savetext[50]; + + arrowUpBtn->Update(t); + arrowDownBtn->Update(t); + + // pad/joystick navigation + if(!focus) + goto endNavigation; // skip navigation + + if(selectedItem < 0) selectedItem = 0; + + if(t->Right()) + { + if(selectedItem == SAVELISTSIZE-1) + { + if(listOffset + SAVELISTSIZE < saves->length) + { + // move list down by 1 row + listOffset += 2; + selectedItem -= 1; + } + } + else if(saveBtn[selectedItem+1]->IsVisible()) + { + saveBtn[selectedItem]->ResetState(); + saveBtn[selectedItem+1]->SetState(STATE_SELECTED, t->chan); + selectedItem += 1; + } + } + else if(t->Left()) + { + if(selectedItem == 0) + { + if((listOffset - 2 >= 0 && action == 0) || + (listOffset >= 0 && action == 1)) + { + // move list up by 1 + listOffset -= 2; + selectedItem = SAVELISTSIZE-1; + } + } + else + { + selectedItem -= 1; + } + } + else if(t->Down() || arrowDownBtn->GetState() == STATE_CLICKED) + { + if(selectedItem >= SAVELISTSIZE-2) + { + if(listOffset + SAVELISTSIZE + 1 < saves->length) + { + listOffset += 2; + } + else if(listOffset + SAVELISTSIZE < saves->length) + { + listOffset += 2; + + if(selectedItem == SAVELISTSIZE-1) + selectedItem -= 1; + } + } + else if(saveBtn[selectedItem+2]->IsVisible()) + { + selectedItem += 2; + } + } + else if(t->Up() || arrowUpBtn->GetState() == STATE_CLICKED) + { + if(selectedItem < 2) + { + if((listOffset - 2 >= 0 && action == 0) || + (listOffset >= 0 && action == 1)) + { + // move list up by 1 + listOffset -= 2; + } + } + else + { + selectedItem -= 2; + } + } + + endNavigation: + + if(arrowDownBtn->GetState() == STATE_CLICKED) + arrowDownBtn->ResetState(); + + if(arrowUpBtn->GetState() == STATE_CLICKED) + arrowUpBtn->ResetState(); + + for(i=0; i<SAVELISTSIZE; i++) + { + if(listOffset+i < 0 && action == 1) + { + saveDate[0]->SetText(NULL); + saveDate[1]->SetText(NULL); + saveTime[0]->SetText("New"); + saveTime[1]->SetText("New"); + saveType[0]->SetText("SRAM"); + saveType[1]->SetText("Snapshot"); + savePreviewImg[0]->SetImage(gameSaveBlank); + savePreviewImg[1]->SetImage(gameSaveBlank); + saveBtn[0]->SetVisible(true); + saveBtn[1]->SetVisible(true); + + if(saveBtn[0]->GetState() == STATE_DISABLED) + saveBtn[0]->SetState(STATE_DEFAULT); + if(saveBtn[1]->GetState() == STATE_DISABLED) + saveBtn[1]->SetState(STATE_DEFAULT); + } + else if(listOffset+i < saves->length) + { + if(saveBtn[i]->GetState() == STATE_DISABLED || !saveBtn[i]->IsVisible()) + { + saveBtn[i]->SetVisible(true); + saveBtn[i]->SetState(STATE_DEFAULT); + } + + saveDate[i]->SetText(saves->date[listOffset+i]); + saveTime[i]->SetText(saves->time[listOffset+i]); + + if(saves->type[listOffset+i] == FILE_SRAM) + sprintf(savetext, "SRAM"); + else + sprintf(savetext, "Snapshot"); + + len = strlen(saves->filename[listOffset+i]); + if(len > 10 && + ((saves->filename[listOffset+i][len-8] == 'A' && + saves->filename[listOffset+i][len-7] == 'u' && + saves->filename[listOffset+i][len-6] == 't' && + saves->filename[listOffset+i][len-5] == 'o') || + saves->filename[listOffset+i][len-5] == '0') + ) + { + strcat(savetext, " (Auto)"); + } + saveType[i]->SetText(savetext); + + if(saves->previewImg[listOffset+i] != NULL) + savePreviewImg[i]->SetImage(saves->previewImg[listOffset+i]); + else + savePreviewImg[i]->SetImage(gameSaveBlank); + } + else + { + saveBtn[i]->SetVisible(false); + saveBtn[i]->SetState(STATE_DISABLED); + } + + if(i != selectedItem && saveBtn[i]->GetState() == STATE_SELECTED) + saveBtn[i]->ResetState(); + else if(focus && i == selectedItem && saveBtn[i]->GetState() == STATE_DEFAULT) + saveBtn[selectedItem]->SetState(STATE_SELECTED, t->chan); + + if(t->wpad->ir.valid) + { + if(!saveBtnLastOver[i] && saveBtn[i]->IsInside(t->wpad->ir.x, t->wpad->ir.y)) + saveBtn[i]->ResetState(); + saveBtnLastOver[i] = saveBtn[i]->IsInside(t->wpad->ir.x, t->wpad->ir.y); + } + + saveBtn[i]->Update(t); + + if(saveBtn[i]->GetState() == STATE_SELECTED) + selectedItem = i; + } + + if(updateCB) + updateCB(this); +} diff --git a/plugins/snes9x_gx/source/gui/gui_sound.cpp b/plugins/snes9x_gx/source/gui/gui_sound.cpp new file mode 100644 index 00000000..4dcd5e25 --- /dev/null +++ b/plugins/snes9x_gx/source/gui/gui_sound.cpp @@ -0,0 +1,155 @@ +/**************************************************************************** + * libwiigui + * + * Tantric 2009 + * + * gui_sound.cpp + * + * GUI class definitions + ***************************************************************************/ + +#include "gui.h" + +/** + * Constructor for the GuiSound class. + */ +GuiSound::GuiSound(const u8 * s, s32 l, int t) +{ + sound = s; + length = l; + type = t; + voice = -1; + volume = 100; + loop = false; +} + +/** + * Destructor for the GuiSound class. + */ +GuiSound::~GuiSound() +{ + #ifndef NO_SOUND + if(type == SOUND_OGG) + StopOgg(); + #endif +} + +void GuiSound::Play() +{ + #ifndef NO_SOUND + int vol; + + switch(type) + { + case SOUND_PCM: + vol = 0.0255f*(volume*GCSettings.SFXVolume); + voice = ASND_GetFirstUnusedVoice(); + if(voice >= 0) + ASND_SetVoice(voice, VOICE_STEREO_16BIT, 48000, 0, + (u8 *)sound, length, vol, vol, NULL); + break; + + case SOUND_OGG: + voice = 0; + if(loop) + PlayOgg((char *)sound, length, 0, OGG_INFINITE_TIME); + else + PlayOgg((char *)sound, length, 0, OGG_ONE_TIME); + SetVolumeOgg(2.55f*(volume)); + break; + } + #endif +} + +void GuiSound::Stop() +{ + #ifndef NO_SOUND + if(voice < 0) + return; + + switch(type) + { + case SOUND_PCM: + ASND_StopVoice(voice); + break; + + case SOUND_OGG: + StopOgg(); + break; + } + #endif +} + +void GuiSound::Pause() +{ + #ifndef NO_SOUND + if(voice < 0) + return; + + switch(type) + { + case SOUND_PCM: + ASND_PauseVoice(voice, 1); + break; + + case SOUND_OGG: + PauseOgg(1); + break; + } + #endif +} + +void GuiSound::Resume() +{ + #ifndef NO_SOUND + if(voice < 0) + return; + + switch(type) + { + case SOUND_PCM: + ASND_PauseVoice(voice, 0); + break; + + case SOUND_OGG: + PauseOgg(0); + break; + } + #endif +} + +bool GuiSound::IsPlaying() +{ + if(ASND_StatusVoice(voice) == SND_WORKING || ASND_StatusVoice(voice) == SND_WAITING) + return true; + else + return false; +} + +void GuiSound::SetVolume(int vol) +{ + #ifndef NO_SOUND + volume = vol; + + if(voice < 0) + return; + + int newvol = 0.0255f*(volume*GCSettings.SFXVolume); + + switch(type) + { + case SOUND_PCM: + ASND_ChangeVolumeVoice(voice, newvol, newvol); + break; + + case SOUND_OGG: + SetVolumeOgg(2.55f*(volume)); + break; + } + #endif +} + +void GuiSound::SetLoop(bool l) +{ + loop = l; +} diff --git a/plugins/snes9x_gx/source/gui/gui_text.cpp b/plugins/snes9x_gx/source/gui/gui_text.cpp new file mode 100644 index 00000000..c2d3a093 --- /dev/null +++ b/plugins/snes9x_gx/source/gui/gui_text.cpp @@ -0,0 +1,480 @@ +/**************************************************************************** + * libwiigui + * + * Tantric 2009 + * + * gui_text.cpp + * + * GUI class definitions + ***************************************************************************/ + +#include "gui.h" +#include "../utils/gettext.h" + +static GXColor presetColor = (GXColor){255, 255, 255, 255}; +static int currentSize = 0; +static int presetSize = 0; +static int presetMaxWidth = 0; +static int presetAlignmentHor = 0; +static int presetAlignmentVert = 0; +static u16 presetStyle = 0; + +#define TEXT_SCROLL_DELAY 8 +#define TEXT_SCROLL_INITIAL_DELAY 6 + +/** + * Constructor for the GuiText class. + */ +GuiText::GuiText(const char * t, int s, GXColor c) +{ + origText = NULL; + text = NULL; + size = s; + color = c; + alpha = c.a; + style = FTGX_JUSTIFY_CENTER | FTGX_ALIGN_MIDDLE; + maxWidth = 0; + wrap = false; + textDynNum = 0; + textScroll = SCROLL_NONE; + textScrollPos = 0; + textScrollInitialDelay = TEXT_SCROLL_INITIAL_DELAY; + textScrollDelay = TEXT_SCROLL_DELAY; + + alignmentHor = ALIGN_CENTRE; + alignmentVert = ALIGN_MIDDLE; + + if(t) + { + origText = strdup(t); + text = charToWideChar(gettext(t)); + } + + for(int i=0; i < 20; i++) + textDyn[i] = NULL; +} + +/** + * Constructor for the GuiText class, uses presets + */ +GuiText::GuiText(const char * t) +{ + origText = NULL; + text = NULL; + size = presetSize; + color = presetColor; + alpha = presetColor.a; + style = presetStyle; + maxWidth = presetMaxWidth; + wrap = false; + textDynNum = 0; + textScroll = SCROLL_NONE; + textScrollPos = 0; + textScrollInitialDelay = TEXT_SCROLL_INITIAL_DELAY; + textScrollDelay = TEXT_SCROLL_DELAY; + + alignmentHor = presetAlignmentHor; + alignmentVert = presetAlignmentVert; + + if(t) + { + origText = strdup(t); + text = charToWideChar(gettext(t)); + } + + for(int i=0; i < 20; i++) + textDyn[i] = NULL; +} + +/** + * Destructor for the GuiText class. + */ +GuiText::~GuiText() +{ + if(origText) + free(origText); + if(text) + delete[] text; + + if(textDynNum > 0) + { + for(int i=0; i < textDynNum; i++) + if(textDyn[i]) + delete[] textDyn[i]; + } +} + +void GuiText::SetText(const char * t) +{ + if(origText) + free(origText); + if(text) + delete[] text; + + if(textDynNum > 0) + { + for(int i=0; i < textDynNum; i++) + if(textDyn[i]) + delete[] textDyn[i]; + } + + origText = NULL; + text = NULL; + textDynNum = 0; + textScrollPos = 0; + textScrollInitialDelay = TEXT_SCROLL_INITIAL_DELAY; + + if(t) + { + origText = strdup(t); + text = charToWideChar(gettext(t)); + } +} + +void GuiText::SetWText(wchar_t * t) +{ + if(origText) + free(origText); + if(text) + delete[] text; + + if(textDynNum > 0) + { + for(int i=0; i < textDynNum; i++) + if(textDyn[i]) + delete[] textDyn[i]; + } + + origText = NULL; + text = NULL; + textDynNum = 0; + textScrollPos = 0; + textScrollInitialDelay = TEXT_SCROLL_INITIAL_DELAY; + + if(t) + text = wcsdup(t); +} + +int GuiText::GetLength() +{ + if(!text) + return 0; + + return wcslen(text); +} + +void GuiText::SetPresets(int sz, GXColor c, int w, u16 s, int h, int v) +{ + presetSize = sz; + presetColor = c; + presetStyle = s; + presetMaxWidth = w; + presetAlignmentHor = h; + presetAlignmentVert = v; +} + +void GuiText::SetFontSize(int s) +{ + size = s; +} + +void GuiText::SetMaxWidth(int width) +{ + maxWidth = width; + + for(int i=0; i < textDynNum; i++) + { + if(textDyn[i]) + { + delete[] textDyn[i]; + textDyn[i] = NULL; + } + } + + textDynNum = 0; +} + +int GuiText::GetTextWidth() +{ + if(!text) + return 0; + + if(currentSize != size) + { + ChangeFontSize(size); + + if(!fontSystem[size]) + fontSystem[size] = new FreeTypeGX(size); + + currentSize = size; + } + return fontSystem[size]->getWidth(text); +} + +void GuiText::SetWrap(bool w, int width) +{ + wrap = w; + maxWidth = width; + + for(int i=0; i < textDynNum; i++) + { + if(textDyn[i]) + { + delete[] textDyn[i]; + textDyn[i] = NULL; + } + } + + textDynNum = 0; +} + +void GuiText::SetScroll(int s) +{ + if(textScroll == s) + return; + + for(int i=0; i < textDynNum; i++) + { + if(textDyn[i]) + { + delete[] textDyn[i]; + textDyn[i] = NULL; + } + } + + textDynNum = 0; + + textScroll = s; + textScrollPos = 0; + textScrollInitialDelay = TEXT_SCROLL_INITIAL_DELAY; + textScrollDelay = TEXT_SCROLL_DELAY; +} + +void GuiText::SetColor(GXColor c) +{ + color = c; + alpha = c.a; +} + +void GuiText::SetStyle(u16 s) +{ + style = s; +} + +void GuiText::SetAlignment(int hor, int vert) +{ + style = 0; + + switch(hor) + { + case ALIGN_LEFT: + style |= FTGX_JUSTIFY_LEFT; + break; + case ALIGN_RIGHT: + style |= FTGX_JUSTIFY_RIGHT; + break; + default: + style |= FTGX_JUSTIFY_CENTER; + break; + } + switch(vert) + { + case ALIGN_TOP: + style |= FTGX_ALIGN_TOP; + break; + case ALIGN_BOTTOM: + style |= FTGX_ALIGN_BOTTOM; + break; + default: + style |= FTGX_ALIGN_MIDDLE; + break; + } + + alignmentHor = hor; + alignmentVert = vert; +} + +void GuiText::ResetText() +{ + if(!origText) + return; + if(text) + delete[] text; + + text = charToWideChar(gettext(origText)); + + for(int i=0; i < textDynNum; i++) + { + if(textDyn[i]) + { + delete[] textDyn[i]; + textDyn[i] = NULL; + } + } + + textDynNum = 0; + currentSize = 0; +} + +/** + * Draw the text on screen + */ +void GuiText::Draw() +{ + if(!text) + return; + + if(!this->IsVisible()) + return; + + GXColor c = color; + c.a = this->GetAlpha(); + + int newSize = size*this->GetScale(); + + if(newSize > MAX_FONT_SIZE) + newSize = MAX_FONT_SIZE; + + if(newSize != currentSize) + { + ChangeFontSize(newSize); + if(!fontSystem[newSize]) + fontSystem[newSize] = new FreeTypeGX(newSize); + currentSize = newSize; + } + + if(maxWidth == 0) + { + fontSystem[currentSize]->drawText(this->GetLeft(), this->GetTop(), text, c, style); + this->UpdateEffects(); + return; + } + + u32 textlen = wcslen(text); + + if(wrap) + { + if(textDynNum == 0) + { + u32 n = 0, ch = 0; + int linenum = 0; + int lastSpace = -1; + int lastSpaceIndex = -1; + + while(ch < textlen && linenum < 20) + { + if(n == 0) + textDyn[linenum] = new wchar_t[textlen + 1]; + + textDyn[linenum][n] = text[ch]; + textDyn[linenum][n+1] = 0; + + if(text[ch] == ' ' || ch == textlen-1) + { + if(fontSystem[currentSize]->getWidth(textDyn[linenum]) > maxWidth) + { + if(lastSpace >= 0) + { + textDyn[linenum][lastSpaceIndex] = 0; // discard space, and everything after + ch = lastSpace; // go backwards to the last space + lastSpace = -1; // we have used this space + lastSpaceIndex = -1; + } + ++linenum; + n = -1; + } + else if(ch == textlen-1) + { + ++linenum; + } + } + if(text[ch] == ' ' && n >= 0) + { + lastSpace = ch; + lastSpaceIndex = n; + } + ++ch; + ++n; + } + textDynNum = linenum; + } + + int lineheight = newSize + 6; + int voffset = 0; + + if(alignmentVert == ALIGN_MIDDLE) + voffset = (lineheight >> 1) * (1-textDynNum); + + int left = this->GetLeft(); + int top = this->GetTop() + voffset; + + for(int i=0; i < textDynNum; ++i) + fontSystem[currentSize]->drawText(left, top+i*lineheight, textDyn[i], c, style); + } + else + { + if(textDynNum == 0) + { + textDynNum = 1; + textDyn[0] = wcsdup(text); + int len = wcslen(textDyn[0]); + + while(fontSystem[currentSize]->getWidth(textDyn[0]) > maxWidth) + textDyn[0][--len] = 0; + } + + if(textScroll == SCROLL_HORIZONTAL) + { + if(fontSystem[currentSize]->getWidth(text) > maxWidth && (FrameTimer % textScrollDelay == 0)) + { + if(textScrollInitialDelay) + { + --textScrollInitialDelay; + } + else + { + ++textScrollPos; + if((u32)textScrollPos > textlen-1) + { + textScrollPos = 0; + textScrollInitialDelay = TEXT_SCROLL_INITIAL_DELAY; + } + + wcscpy(textDyn[0], &text[textScrollPos]); + u32 dynlen = wcslen(textDyn[0]); + + if(dynlen+2 < textlen) + { + textDyn[0][dynlen] = ' '; + textDyn[0][dynlen+1] = ' '; + textDyn[0][dynlen+2] = 0; + dynlen += 2; + } + + if(fontSystem[currentSize]->getWidth(textDyn[0]) > maxWidth) + { + while(fontSystem[currentSize]->getWidth(textDyn[0]) > maxWidth) + textDyn[0][--dynlen] = 0; + } + else + { + int i = 0; + + while(fontSystem[currentSize]->getWidth(textDyn[0]) < maxWidth && dynlen+1 < textlen) + { + textDyn[0][dynlen] = text[i++]; + textDyn[0][++dynlen] = 0; + } + + if(fontSystem[currentSize]->getWidth(textDyn[0]) > maxWidth) + textDyn[0][dynlen-2] = 0; + else + textDyn[0][dynlen-1] = 0; + } + } + } + } + fontSystem[currentSize]->drawText(this->GetLeft(), this->GetTop(), textDyn[0], c, style); + } + this->UpdateEffects(); +} diff --git a/plugins/snes9x_gx/source/gui/gui_trigger.cpp b/plugins/snes9x_gx/source/gui/gui_trigger.cpp new file mode 100644 index 00000000..85f7d331 --- /dev/null +++ b/plugins/snes9x_gx/source/gui/gui_trigger.cpp @@ -0,0 +1,303 @@ +/**************************************************************************** + * libwiigui + * + * Tantric 2009 + * + * gui_trigger.cpp + * + * GUI class definitions + ***************************************************************************/ + +#include "gui.h" +#include <ogc/lwp_watchdog.h> +#include <gctypes.h> + +static u64 prev[4]; +static u64 now[4]; +static u32 delay[4]; + +/** + * Constructor for the GuiTrigger class. + */ +GuiTrigger::GuiTrigger() +{ + chan = -1; + memset(&wupcdata, 0, sizeof(WUPCFullData)); + memset(&wpaddata, 0, sizeof(WPADData)); + memset(&pad, 0, sizeof(PADData)); + wpad = &wpaddata; +} + +/** + * Destructor for the GuiTrigger class. + */ +GuiTrigger::~GuiTrigger() +{ +} + +/** + * Sets a simple trigger. Requires: + * - Element is selected + * - Trigger button is pressed + */ +void GuiTrigger::SetSimpleTrigger(s32 ch, u32 wiibtns, u16 gcbtns) +{ + type = TRIGGER_SIMPLE; + chan = ch; + wupcdata.btns_d = wiibtns; + wpaddata.btns_d = wiibtns; + pad.btns_d = gcbtns; +} + +/** + * Sets a held trigger. Requires: + * - Element is selected + * - Trigger button is pressed and held + */ +void GuiTrigger::SetHeldTrigger(s32 ch, u32 wiibtns, u16 gcbtns) +{ + type = TRIGGER_HELD; + chan = ch; + wupcdata.btns_h = wiibtns; + wpaddata.btns_h = wiibtns; + pad.btns_h = gcbtns; +} + +/** + * Sets a button trigger. Requires: + * - Trigger button is pressed + */ +void GuiTrigger::SetButtonOnlyTrigger(s32 ch, u32 wiibtns, u16 gcbtns) +{ + type = TRIGGER_BUTTON_ONLY; + chan = ch; + wupcdata.btns_d = wiibtns; + wpaddata.btns_d = wiibtns; + pad.btns_d = gcbtns; +} + +/** + * Sets a button trigger. Requires: + * - Trigger button is pressed + * - Parent window is in focus + */ +void GuiTrigger::SetButtonOnlyInFocusTrigger(s32 ch, u32 wiibtns, u16 gcbtns) +{ + type = TRIGGER_BUTTON_ONLY_IN_FOCUS; + chan = ch; + wupcdata.btns_d = wiibtns; + wpaddata.btns_d = wiibtns; + pad.btns_d = gcbtns; +} + +/**************************************************************************** + * WPAD_Stick + * + * Get X/Y value from Wii Joystick (classic, nunchuk) input + ***************************************************************************/ + +s8 GuiTrigger::WPAD_Stick(u8 stick, int axis) +{ + #ifdef HW_RVL + + float mag = 0.0; + float ang = 0.0; + + switch (wpad->exp.type) + { + case WPAD_EXP_NUNCHUK: + case WPAD_EXP_GUITARHERO3: + if (stick == 0) + { + mag = wpad->exp.nunchuk.js.mag; + ang = wpad->exp.nunchuk.js.ang; + } + break; + + case WPAD_EXP_CLASSIC: + if (stick == 0) + { + mag = wpad->exp.classic.ljs.mag; + ang = wpad->exp.classic.ljs.ang; + } + else + { + mag = wpad->exp.classic.rjs.mag; + ang = wpad->exp.classic.rjs.ang; + } + break; + + default: + break; + } + + /* calculate x/y value (angle need to be converted into radian) */ + if (mag > 1.0) mag = 1.0; + else if (mag < -1.0) mag = -1.0; + double val; + + if(axis == 0) // x-axis + val = mag * sin((PI * ang)/180.0f); + else // y-axis + val = mag * cos((PI * ang)/180.0f); + + return (s8)(val * 128.0f); + + #else + return 0; + #endif +} + +s8 GuiTrigger::WPAD_StickX(u8 stick) +{ + return WPAD_Stick(stick, 0); +} + +s8 GuiTrigger::WPAD_StickY(u8 stick) +{ + return WPAD_Stick(stick, 1); +} + +bool GuiTrigger::Left() +{ + u32 wiibtn = GCSettings.WiimoteOrientation ? WPAD_BUTTON_UP : WPAD_BUTTON_LEFT; + + if((wpad->btns_d | wpad->btns_h) & (wiibtn | WPAD_CLASSIC_BUTTON_LEFT) + || (wupcdata.btns_d | wupcdata.btns_h) & (wiibtn | WPAD_CLASSIC_BUTTON_LEFT) + || (pad.btns_d | pad.btns_h) & PAD_BUTTON_LEFT + || pad.stickX < -PADCAL + || WPAD_StickX(0) < -PADCAL + || wupcdata.stickX < -WUPCCAL) + { + if((wpad->btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_LEFT)) + || (wupcdata.btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_LEFT)) + || pad.btns_d & PAD_BUTTON_LEFT) + { + prev[chan] = gettime(); + delay[chan] = SCROLL_DELAY_INITIAL; // reset scroll delay + return true; + } + + now[chan] = gettime(); + + if(diff_usec(prev[chan], now[chan]) > delay[chan]) + { + prev[chan] = now[chan]; + + if(delay[chan] == SCROLL_DELAY_INITIAL) + delay[chan] = SCROLL_DELAY_LOOP; + else if(delay[chan] > SCROLL_DELAY_DECREASE) + delay[chan] -= SCROLL_DELAY_DECREASE; + return true; + } + } + return false; +} + +bool GuiTrigger::Right() +{ + u32 wiibtn = GCSettings.WiimoteOrientation ? WPAD_BUTTON_DOWN : WPAD_BUTTON_RIGHT; + + if((wpad->btns_d | wpad->btns_h) & (wiibtn | WPAD_CLASSIC_BUTTON_RIGHT) + || ((wupcdata.btns_d | wupcdata.btns_h) & (wiibtn | WPAD_CLASSIC_BUTTON_RIGHT)) + || (pad.btns_d | pad.btns_h) & PAD_BUTTON_RIGHT + || pad.stickX > PADCAL + || WPAD_StickX(0) > PADCAL + || wupcdata.stickX > WUPCCAL) + { + if((wpad->btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_RIGHT)) + || (wupcdata.btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_RIGHT)) + || pad.btns_d & PAD_BUTTON_RIGHT) + { + prev[chan] = gettime(); + delay[chan] = SCROLL_DELAY_INITIAL; // reset scroll delay + return true; + } + + now[chan] = gettime(); + + if(diff_usec(prev[chan], now[chan]) > delay[chan]) + { + prev[chan] = now[chan]; + + if(delay[chan] == SCROLL_DELAY_INITIAL) + delay[chan] = SCROLL_DELAY_LOOP; + else if(delay[chan] > SCROLL_DELAY_DECREASE) + delay[chan] -= SCROLL_DELAY_DECREASE; + return true; + } + } + return false; +} + +bool GuiTrigger::Up() +{ + u32 wiibtn = GCSettings.WiimoteOrientation ? WPAD_BUTTON_RIGHT : WPAD_BUTTON_UP; + + if(((wpad->btns_d | wpad->btns_h) & (wiibtn | WPAD_CLASSIC_BUTTON_UP)) + || ((wupcdata.btns_d | wupcdata.btns_h) & (wiibtn | WPAD_CLASSIC_BUTTON_UP)) + || (pad.btns_d | pad.btns_h) & PAD_BUTTON_UP + || pad.stickY > PADCAL + || WPAD_StickY(0) > PADCAL + || wupcdata.stickY > WUPCCAL) + { + if((wpad->btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_UP)) + || (wupcdata.btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_UP)) + || pad.btns_d & PAD_BUTTON_UP) + { + prev[chan] = gettime(); + delay[chan] = SCROLL_DELAY_INITIAL; // reset scroll delay + return true; + } + + now[chan] = gettime(); + + if(diff_usec(prev[chan], now[chan]) > delay[chan]) + { + prev[chan] = now[chan]; + + if(delay[chan] == SCROLL_DELAY_INITIAL) + delay[chan] = SCROLL_DELAY_LOOP; + else if(delay[chan] > SCROLL_DELAY_DECREASE) + delay[chan] -= SCROLL_DELAY_DECREASE; + return true; + } + } + return false; +} + +bool GuiTrigger::Down() +{ + u32 wiibtn = GCSettings.WiimoteOrientation ? WPAD_BUTTON_LEFT : WPAD_BUTTON_DOWN; + + if(((wpad->btns_d | wpad->btns_h) & (wiibtn | WPAD_CLASSIC_BUTTON_DOWN)) + || ((wupcdata.btns_d | wupcdata.btns_h) & (wiibtn | WPAD_CLASSIC_BUTTON_DOWN)) + || (pad.btns_d | pad.btns_h) & PAD_BUTTON_DOWN + || pad.stickY < -PADCAL + || WPAD_StickY(0) < -PADCAL + || wupcdata.stickY < -WUPCCAL) + { + if((wpad->btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_DOWN)) + || wupcdata.btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_DOWN) + || pad.btns_d & PAD_BUTTON_DOWN) + { + prev[chan] = gettime(); + delay[chan] = SCROLL_DELAY_INITIAL; // reset scroll delay + return true; + } + + now[chan] = gettime(); + + if(diff_usec(prev[chan], now[chan]) > delay[chan]) + { + prev[chan] = now[chan]; + + if(delay[chan] == SCROLL_DELAY_INITIAL) + delay[chan] = SCROLL_DELAY_LOOP; + else if(delay[chan] > SCROLL_DELAY_DECREASE) + delay[chan] -= SCROLL_DELAY_DECREASE; + return true; + } + } + return false; +} diff --git a/plugins/snes9x_gx/source/gui/gui_window.cpp b/plugins/snes9x_gx/source/gui/gui_window.cpp new file mode 100644 index 00000000..636d8ba3 --- /dev/null +++ b/plugins/snes9x_gx/source/gui/gui_window.cpp @@ -0,0 +1,451 @@ +/**************************************************************************** + * libwiigui + * + * Tantric 2009 + * + * gui_window.cpp + * + * GUI class definitions + ***************************************************************************/ + +#include "gui.h" + +GuiWindow::GuiWindow() +{ + width = 0; + height = 0; + focus = 0; // allow focus +} + +GuiWindow::GuiWindow(int w, int h) +{ + width = w; + height = h; + focus = 0; // allow focus +} + +GuiWindow::~GuiWindow() +{ +} + +void GuiWindow::Append(GuiElement* e) +{ + if (e == NULL) + return; + + Remove(e); + _elements.push_back(e); + e->SetParent(this); +} + +void GuiWindow::Insert(GuiElement* e, u32 index) +{ + if (e == NULL || index > (_elements.size() - 1)) + return; + + Remove(e); + _elements.insert(_elements.begin()+index, e); + e->SetParent(this); +} + +void GuiWindow::Remove(GuiElement* e) +{ + if (e == NULL) + return; + + u32 elemSize = _elements.size(); + for (u32 i = 0; i < elemSize; ++i) + { + if(e == _elements.at(i)) + { + _elements.erase(_elements.begin()+i); + break; + } + } +} + +void GuiWindow::RemoveAll() +{ + _elements.clear(); +} + +bool GuiWindow::Find(GuiElement* e) +{ + if (e == NULL) + return false; + + u32 elemSize = _elements.size(); + for (u32 i = 0; i < elemSize; ++i) + if(e == _elements.at(i)) + return true; + return false; +} + +GuiElement* GuiWindow::GetGuiElementAt(u32 index) const +{ + if (index >= _elements.size()) + return NULL; + return _elements.at(index); +} + +u32 GuiWindow::GetSize() +{ + return _elements.size(); +} + +void GuiWindow::Draw() +{ + if(_elements.size() == 0 || !this->IsVisible()) + return; + + u32 elemSize = _elements.size(); + for (u32 i = 0; i < elemSize; ++i) + { + try { _elements.at(i)->Draw(); } + catch (const std::exception& e) { } + } + + this->UpdateEffects(); + + if(parentElement && state == STATE_DISABLED) + Menu_DrawRectangle(0,0,screenwidth,screenheight,(GXColor){0xbe, 0xca, 0xd5, 0x70},1); +} + +void GuiWindow::DrawTooltip() +{ + if(_elements.size() == 0 || !this->IsVisible()) + return; + + u32 elemSize = _elements.size(); + for (u32 i = 0; i < elemSize; i++) + { + try { _elements.at(i)->DrawTooltip(); } + catch (const std::exception& e) { } + } +} + +void GuiWindow::ResetState() +{ + if(state != STATE_DISABLED) + state = STATE_DEFAULT; + + u32 elemSize = _elements.size(); + for (u32 i = 0; i < elemSize; ++i) + { + try { _elements.at(i)->ResetState(); } + catch (const std::exception& e) { } + } +} + +void GuiWindow::SetState(int s) +{ + state = s; + + u32 elemSize = _elements.size(); + for (u32 i = 0; i < elemSize; ++i) + { + try { _elements.at(i)->SetState(s); } + catch (const std::exception& e) { } + } +} + +void GuiWindow::SetVisible(bool v) +{ + visible = v; + + u32 elemSize = _elements.size(); + for (u32 i = 0; i < elemSize; ++i) + { + try { _elements.at(i)->SetVisible(v); } + catch (const std::exception& e) { } + } +} + +void GuiWindow::SetFocus(int f) +{ + focus = f; + + if(f == 1) + this->MoveSelectionVert(1); + else + this->ResetState(); +} + +void GuiWindow::ChangeFocus(GuiElement* e) +{ + if(parentElement) + return; // this is only intended for the main window + + u32 elemSize = _elements.size(); + for (u32 i = 0; i < elemSize; ++i) + { + if(e == _elements.at(i)) + _elements.at(i)->SetFocus(1); + else if(_elements.at(i)->IsFocused() == 1) + _elements.at(i)->SetFocus(0); + } +} + +void GuiWindow::ToggleFocus(GuiTrigger * t) +{ + if(parentElement) + return; // this is only intended for the main window + + int found = -1; + int newfocus = -1; + int i; + + int elemSize = _elements.size(); + + // look for currently in focus element + for (i = 0; i < elemSize; ++i) + { + try + { + if(_elements.at(i)->IsFocused() == 1) + { + found = i; + break; + } + } + catch (const std::exception& e) { } + } + + // element with focus not found, try to give focus + if(found == -1) + { + for (i = 0; i < elemSize; ++i) + { + try + { + if(_elements.at(i)->IsFocused() == 0 && _elements.at(i)->GetState() != STATE_DISABLED) // focus is possible (but not set) + { + _elements.at(i)->SetFocus(1); // give this element focus + break; + } + } + catch (const std::exception& e) { } + } + } + // change focus + else if((t->wpad->btns_d & (WPAD_BUTTON_1 | WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B)) + || (t->pad.btns_d & PAD_BUTTON_B) || (t->wupcdata.btns_d & WPAD_CLASSIC_BUTTON_B)) + { + for (i = found; i < elemSize; ++i) + { + try + { + if(_elements.at(i)->IsFocused() == 0 && _elements.at(i)->GetState() != STATE_DISABLED) // focus is possible (but not set) + { + newfocus = i; + _elements.at(i)->SetFocus(1); // give this element focus + _elements.at(found)->SetFocus(0); // disable focus on other element + break; + } + } + catch (const std::exception& e) { } + } + + if(newfocus == -1) + { + for (i = 0; i < found; ++i) + { + try + { + if(_elements.at(i)->IsFocused() == 0 && _elements.at(i)->GetState() != STATE_DISABLED) // focus is possible (but not set) + { + _elements.at(i)->SetFocus(1); // give this element focus + _elements.at(found)->SetFocus(0); // disable focus on other element + break; + } + } + catch (const std::exception& e) { } + } + } + } +} + +int GuiWindow::GetSelected() +{ + // find selected element + int found = -1; + u32 elemSize = _elements.size(); + for (u32 i = 0; i < elemSize; ++i) + { + try + { + if(_elements.at(i)->GetState() == STATE_SELECTED) + { + found = int(i); + break; + } + } + catch (const std::exception& e) { } + } + return found; +} + +// set element to left/right as selected +// there's probably a more clever way to do this, but this way works +void GuiWindow::MoveSelectionHor(int dir) +{ + int found = -1; + u16 left = 0; + u16 top = 0; + u32 i; + u32 elemSize = _elements.size(); + + int selected = this->GetSelected(); + + if(selected >= 0) + { + left = _elements.at(selected)->GetLeft(); + top = _elements.at(selected)->GetTop(); + } + + + // look for a button on the same row, to the left/right + for (i = 0; i < elemSize; ++i) + { + try + { + if(_elements.at(i)->IsSelectable()) + { + if(_elements.at(i)->GetLeft()*dir > left*dir && _elements.at(i)->GetTop() == top) + { + if(found == -1) + found = int(i); + else if(_elements.at(i)->GetLeft()*dir < _elements.at(found)->GetLeft()*dir) + found = int(i); // this is a better match + } + } + } + catch (const std::exception& e) { } + } + if(found >= 0) + goto matchfound; + + // match still not found, let's try the first button in the next row + for (i = 0; i < elemSize; ++i) + { + try + { + if(_elements.at(i)->IsSelectable()) + { + if(_elements.at(i)->GetTop()*dir > top*dir) + { + if(found == -1) + found = i; + else if(_elements.at(i)->GetTop()*dir < _elements.at(found)->GetTop()*dir) + found = i; // this is a better match + else if(_elements.at(i)->GetTop()*dir == _elements.at(found)->GetTop()*dir + && + _elements.at(i)->GetLeft()*dir < _elements.at(found)->GetLeft()*dir) + found = i; // this is a better match + } + } + } + catch (const std::exception& e) { } + } + + // match found + matchfound: + if(found >= 0) + { + _elements.at(found)->SetState(STATE_SELECTED); + if(selected >= 0) + _elements.at(selected)->ResetState(); + } +} + +void GuiWindow::MoveSelectionVert(int dir) +{ + int found = -1; + u16 left = 0; + u16 top = 0; + + int selected = this->GetSelected(); + + if(selected >= 0) + { + left = _elements.at(selected)->GetLeft(); + top = _elements.at(selected)->GetTop(); + } + + // look for a button above/below, with the least horizontal difference + u32 elemSize = _elements.size(); + for (u32 i = 0; i < elemSize; ++i) + { + try + { + if(_elements.at(i)->IsSelectable()) + { + if(_elements.at(i)->GetTop()*dir > top*dir) + { + if(found == -1) + found = i; + else if(_elements.at(i)->GetTop()*dir < _elements.at(found)->GetTop()*dir) + found = i; // this is a better match + else if(_elements.at(i)->GetTop()*dir == _elements.at(found)->GetTop()*dir + && + abs(_elements.at(i)->GetLeft() - left) < + abs(_elements.at(found)->GetLeft() - left)) + found = i; + } + } + } + catch (const std::exception& e) { } + } + if(found >= 0) + goto matchfound; + + // match found + matchfound: + if(found >= 0) + { + _elements.at(found)->SetState(STATE_SELECTED); + if(selected >= 0) + _elements.at(selected)->ResetState(); + } +} + +void GuiWindow::ResetText() +{ + u32 elemSize = _elements.size(); + for (u32 i = 0; i < elemSize; i++) + { + try { _elements.at(i)->ResetText(); } + catch (const std::exception& e) { } + } +} + +void GuiWindow::Update(GuiTrigger * t) +{ + if(_elements.size() == 0 || (state == STATE_DISABLED && parentElement)) + return; + + u32 elemSize = _elements.size(); + for (u32 i = 0; i < elemSize; ++i) + { + try { _elements.at(i)->Update(t); } + catch (const std::exception& e) { } + } + + this->ToggleFocus(t); + + if(focus) // only send actions to this window if it's in focus + { + // pad/joystick navigation + if(t->Right()) + this->MoveSelectionHor(1); + else if(t->Left()) + this->MoveSelectionHor(-1); + else if(t->Down()) + this->MoveSelectionVert(1); + else if(t->Up()) + this->MoveSelectionVert(-1); + } + + if(updateCB) + updateCB(this); +} diff --git a/plugins/snes9x_gx/source/images/battery.png b/plugins/snes9x_gx/source/images/battery.png new file mode 100644 index 0000000000000000000000000000000000000000..1733f41e5bb42a4bbcf3015192bcd19dba5ba6f4 GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^IzTMK!3HG1t-XH`NJ*BsMwA5Sr<If^7Ns&crsOB3 zDtP85rl$s_CZ<#to=mj?Dys5yaSW-rmGtNTfBVA$OgaHpxf6Efi|t}iHfdqcHZXp~ zl_>Co^$0gxr*q*kiz1GCmZV0<M-ToVY59=Aaze3|vBTf6!Rd!ROHIQjcIIPjw;YRn zc$|59tSYV?T+Am|`oW<1L&Ex(678WJn|U9VeY}v*Z_GDUg;5}ZVb8&Zb<13~Oa{7w N!PC{xWt~$(69B4gO&b6J literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/battery_bar.png b/plugins/snes9x_gx/source/images/battery_bar.png new file mode 100644 index 0000000000000000000000000000000000000000..474f24d6ac7c7018ea08ab6262dedc7fad48584e GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^96&6>!3HEZNY`WoDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MaG^kjv*DdlK%YvZ_jLZ;D`gm1xH5iDSn3)?YjkEamU0Z r%JA%y@KLnnp3Zd4ae^EJ6A#0QAnx7&&bh|`wKI6S`njxgN@xNA&{8V0 literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/battery_red.png b/plugins/snes9x_gx/source/images/battery_red.png new file mode 100644 index 0000000000000000000000000000000000000000..fd7d995c7808bc605a2a3bd2eb51496c59e95ad9 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^IzTMK!3HG1t-XH`NJ*BsMwA5Sr<If^7Ns&crsOB3 zDtP85rl$s_CZ<#to=mj?D(dibaSW-r^=6tOSAzkM>+hu&)n4l#$<DFqpX`3|>eJa` z?OIxWo}LfHH|^agA~k_$n$|Pn7gIm=PWOAFB+a%Z>zJ&C*jv4sQyTX9?J?QoX{CDL zPjW=^)Mer)WhN!2ecSM9&#a~oiq1*7O&g06*vk^w*YQOB_HSRsvpqg~lGIbP?}<WT e^NuJUVCc{fzi?>f$w@#rF?hQAxvX<aXaWFN`C0h@ literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/bg_bottom.png b/plugins/snes9x_gx/source/images/bg_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..35cb2b853abc9ae6a5c018972d2e616217065094 GIT binary patch literal 838 zcmZ8fZAep57=G_|)j6Clo#01_v#60s2I2>dxW<O=hijNW0?AytT$pY;Ax*2JeL$kv zPc6*}eL#_5L?fukATkwQ5JjV+FHE8lEG^rp^_;5~^yi*?&ilO2d7kGzXKmIpjXFb3 zL>f!Esgg+H$G=+@i*M1hvT7{pt>!(gyIluckJwurR9ffS@5r_^+Up&a4trgD^Am>= zT?-adX;oX`%j*e?SgJEW{XFXaFx9tius43-<iO3nm-Tmj&huTK+T`Wy)1P)NjsM6Z zlIHCqQMOm0x5<yAUmvAmld#Y~H?r*j5u52e))6g)4wW*TuOymO9yK`m61G92_FL}; zBHfT1G!wBIMCvB+c-78d2}JEuf1?VRxJ7%6hHqWDa%VsRV9UjEun9QlyQU&vRI4B< z%YWa5mXa;&R}@K-k{$%-Gp2ReYn=N+vBZW_5{V3LacH~73Rff*ccWnR4s#u;el<#= zwNhR@?r4@GDS8MMf+A`?Y=?}@^4GkB#jReAK=hu~bPOtpE(t+yq=&uX!b0qJ7pQZ* z_Z|XcmZAYDg3N~DE11b4Y2>P=fas$TJOv>=?7Kb{+7toK5Mni}#YS!uX^bM9?4^8M zGFcI+mw_>H=;rY;hHDyTf@i=JV$bJ@Y~ros+-@d9(;{nk-yPpZSTBDG2^=n`=euC# zto6#(B*(V<T<x;Na5_@9787~%^Zr6kml#D^%rx$wEP;KQ<%OHutB@k+@CFNn8yuhH z{D~o&rE2bYHWw4I$*34E$S^Y=<e)?u^xwQXr!x6$xCyO?6Z0fR<n(HGM1|*3yC#;O zsle8@*%L|9%Q>dP;Xhq#jmDG{IU=!c9=7hcm_~+0SH<$-O;ylO7PHkfwzIbT53!o) A8UO$Q literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/bg_game_selection.png b/plugins/snes9x_gx/source/images/bg_game_selection.png new file mode 100644 index 0000000000000000000000000000000000000000..7978d45ec479936e51af36d6bce983ac618de3d4 GIT binary patch literal 1409 zcmeAS@N?(olHy`uVBq!ia0y~yV6+Be9u793$nM30mw*&olDE4H!+#K5uy^@npa^Gy zM`SSr1Gg{;GcwGYBLNg-FY)wsWxvlN#ILO9$<H9mz`)Aq>EaktaqI0Z`;0lI497k` z*Q@uLJ<H@$zzPXX-5Hm|jP9s-35vJQmXTqJ-Th+0<i<szT&0&Br}N3KQn+$(q09>< zC9c+@W{<Pc?E+GnnX|*9eP`F3m42N1c}v+@Y5Vzazwa)uYSVvT7=GHe<W}!WmEDtj z*b^Q{dKg{L5xxKSy7SiEEP2tBls)4_EEhOk{H=0wVcP15J?U?(-X7cR*{3>lgKU7~ zXHPz}=%eE0y|K&h{!loneYf2C@NVOh|MR}^+a)+99R6AR^|{V}v)NB)7w?s?y^$lj z{-1K$+_J~LD(<I0Ke%wtX3P7tIro2VF>U01|Lf`cPnU0&Z`xI}^LN#*n_Bn&YJ-$s zRJpJI(tFa!PVr6IpSFJC?}-vvaW4Aat=<@$?{#9&>~+`YsaNi~sg?GsK2Ap0+1$o# zYUkhfR=yQ;{xx3od1F84;l`DpR;~YYEb8?ZX?``!_+#rnUP-@cWt3^UU{l`TD!rrT z=garswT<yFTJU?V-;0J-x2=qB{w^zDFfS#)(s<KjPHo27PX6b=UAz2s`NMw)4Y|SG zW3Qiv-%we3^_LDy4wtR%>(#Sae%K3GJG@~y!iPo(STk&7#vsrX!MIpd0(E1U3096_ zCfFXBNoaZ~HTcLmmWCUQ9kOVILK#C6I|hNK2*$;t5~v%)Ot5kcGr{)2OhVH`sljN* zLAi8wf<hTSzfJAA8&nywe{YUpLhy^1H-l_X`cy{6&DkojLG#O(oMrQ#lvM62dl+&p zY+V%RiY;5GuHFgceZTs$YIEor70byg<=3tkrM_!f+TgX@s9XuiJN0;G+Ugma^$TX` z<?El7JAdfs<ZDb?nGgS*jG1M7uhw*~%GOU;GR^J0J_S|Yv-%aG_HFOfhi`wcVb7^B zUqAospPSo@UmxSYdtKf<`snGs8>M|drA|`cJzwVb*O+ZNw<kCLE{hPpQ2=yLT4tfy z{+K^|zAw(7Y;!qBbaj1qZ1|Tr|00!>V#Z9OTc$h-*c`g&dTr$I?dsNVk0}F-7Rv<l p1y1|?iZ<NTsxx5)7LTIe*mrK-z!KgPxeLf+@O1TaS?83{1OV)0J&gbW literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/bg_game_selection_entry.png b/plugins/snes9x_gx/source/images/bg_game_selection_entry.png new file mode 100644 index 0000000000000000000000000000000000000000..47efdde64d13193da59fbf025dbb15f7f6d8c014 GIT binary patch literal 35487 zcmeI*Jxjw-6vpuzwXJRGQbDQ|aZnLDI*LLir43>c=^`%T;wsodbWq#`w+`aV;O3^E zp!fk4Tt!5k1rdZQh@z>`5CYlbIe*3GCM|NG-wDqY=-zy_oJkF)j4>IfVlNnDO}guR zZ`^$y>dJk)hxp2D*)~7z-_zz<!@ZJRt1PY?lkRK(S?1^@=Uz<Iow-utv3npkmTS~6 z-G4A_9J^TCuuOL6W!rK;^7r#_vw7WFb3_0E1f&V{_ySG%)+`Y~00B_~UfE^)3!;J% z1_1;R@C$fl7mKI;*I6Tg00N=}x<sWR3<3xs5F$X?g}`tb0R&_TP<FEB8R0aa&BO7| zvj7p^CR<Y>K=G*<Ga(T`fU@HrKmY+10+gMKF%uF21SmW10R#|GAwb!w7&9ReK!CF2 z9zXyAkpfrKmHn`10VqC^BPSFB2m}QvyPyc?2p}L*fU*-gRze|wKv00P3yN@#00JTf zC_9m3B@_Y(1O+I&pa|y(ARtnJvJ*Mh2!+Z`wGP6b1&Gi#*@`X!ici<PNsEA50m@G8 z=n0O1E&<9;*StxKfLa0Xdn!I!&uS3}jsODk1-!C*dwr6hmV^i(pjN;uJ6GUXtpdRj zKtPJX(#2NZnB<pZ7i*!Jth?msd+58ofdB#sAb<b@2q5s!1V&a<)_t*X+upWQs@mr> G%e%jiW;N~r literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/bg_options.png b/plugins/snes9x_gx/source/images/bg_options.png new file mode 100644 index 0000000000000000000000000000000000000000..5365f1727b40253cb9af08063b1ba97414e6579d GIT binary patch literal 1637 zcmeAS@N?(olHy`uVBq!ia0y~yV3Gl{e{iq?$>m$@4+1I464!{5;QX|b^2DN42FH~A zq*MjZ+{E<Mpwz^a%EFVWHVh1G?4B-;Ar-gY+}WRfCspRa$LB>mU&mfP=2jG@?dG&9 zH~A{pBL&vN;5)LP*h2)4z6uaovgLxK%&sjD7BzQ2SfubaVhe|;$^w&Z!A_Z8e=i=H zlyNKWvfA^{G4G}KSzem;<i&zLaUULjs(HVuW|{f@-+>ag8@2y*+ZM7tzQV+CplEX8 zvFPIPyX8CgX`Y*Cq3p!W5RqCT(_d_I&gu8$SnWTDwF}Q3t#r>}U|4M;@cgkw`Xiq0 z_BZR=A4kmD{z+WRwt3;EN{y1~@>{$Z5@!CC-rx4?j!VrS-Q8cD=FETervLLvuY(`! z?95J0UHfq3UG~G%*6QC@V<_;yJbfRR`1!gWQv@HL^X>U!cKT$=!VAAHWbFD{Xy#`q zo5j4oJ=gj^@7<;BIRXq3Q(td>e)x%g`{AuKH@>-a)xv+t@kje6K09t=*Lzu~f8IXZ z#1}u47p{)jXvvUp)oW_hi<_T(X3YI%r*r3@b?mBRnMW+A+L`>ym~(xTIR6{FjAVub zyF#kVTaM4So3ek(zK^&5OgrVh@N1aYuH73qmM_m`WO#io`nL3`tL~eUe|<Yuz}5HG zTmMD<#c2!;eWB*|Gwu17J&5?Vw)b7pd|pNdS?$~x=jG-74hEj_YjwKV22>=v%j;+I z&eL8D4ZnR07#NzE83cf7141=CU;y!uC>C}w4@fCkFfgD}2N}VFK#GHpfdPeb0GbRG z1W`bfQK?buC<x5Mz&wpBq%i^<5z?6Pi-=fIY~zYpP^1rg>;B}MNOk{w?8Mb4eKWIg zVV*OC!|}ZH@n_|i2NldY@Aq{lr!*6TRoML96YTw#J@}z${kQVx?1I<Nw&(&gV_9yR zPQ9@5-B&*>cOU+kyz5fL9?^9%Kkh7JXeixX^3LPmkJ60VHszlRyMO&YlAieL(e!Ps z3~M}p>AZMyW8pK|zG*)#<d@oa{dUWGX}I^Ik;wC#B{TLGS)D6SOnzUW5iYmMk>SC- zf3xg_kGbE^v3n-dQEc=VTu$ze=quJbckhq(?`?afR?Tj6%5>hJ%fxW{&Yn8UE6<M| zJ|lmBn|-Oxx!X4t<z;4mf3(Cre$_P&hBX&M=9nLvdp=Jm@@4z}zGIbo=Q6FC8LmC( zw(#G2+$|`>MCuwd!=3QDTQZ=c;6VL-dnO)+<AIB;x%DR81J)Z1p00i_>zopr03CuC AI{*Lx literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/bg_options_entry.png b/plugins/snes9x_gx/source/images/bg_options_entry.png new file mode 100644 index 0000000000000000000000000000000000000000..61b00c5860415cf6c7ffebfcb0533b441379d6b0 GIT binary patch literal 299 zcmeAS@N?(olHy`uVBq!ia0y~yV3Gl{6*$;{WaQ0-%|J@B#5JNMI6tkVJh3R1!7(L2 zDOJHUH!(dmC^a#qvhZZ84N%cpPZ!6Kid%1PDe^T32)G7jFa)>1P}7Q(^G@^@z03Gw zmYT2BlLke_tMx9Ei|^c6zHWw<(yGIMWaLE|91_o-x1GVl;KAGXuWUO9!vtxW-14m) z3;}nJvM@9}U|?WjhfxX^U>*{6kdXnz15zA(Xp}<%14s}=H8F#!{|hbUUw=;(WKb}- zuzP=0iNPVS;Emd328N|q1ru2r6s9f@WKg)Pc7Q=8Pk{6IEw3p+k1=?<`njxgN@xNA DHDXl9 literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/bg_preview.png b/plugins/snes9x_gx/source/images/bg_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..19b28251465acf51ff67a10d141d619e82a43fc6 GIT binary patch literal 19890 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 YK~Yu^FT@G}n(VRvqDw^5F&6)iu> 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 literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/bg_top.png b/plugins/snes9x_gx/source/images/bg_top.png new file mode 100644 index 0000000000000000000000000000000000000000..dd6c1dd77f0c92d7ac672184906142dc398288f3 GIT binary patch literal 771 zcmX|8Ur1A76hGg+`%iO|CZ)8s5-OYo)~FtwU1cjrrM7BGL2csF9+suUT4-Da`y<wT zFbpNVJxD!-AdP5*Fw4{!)OyO64uTm9Hbq9LWOcr~)yw_v`M&e}bAIPuRmD-YDo+If zYJ0iW0l-A@-=&b@*UZ?$c;xzQ)xJ{=mweaVjUFhiZK&}W?Ou1C$Ki3;`meqB6eDWL zZY@21Bepm@;$@4p){_I_nftG{OkR06`|QNpgW$18%DviUgCN`5TKLmB`T1j$2Ee#a z(}4VbP9s$VjNI7`z|U+uf(E+fsV9R3jGFmxGC6>bcp2;{+Mdk-H>ScHGihDz)B>#V z@pON1Z9hPw#i{`4xZK79^zlw4(!O{@@MfV?FS2ytLnm)Yax8G!(e+$PaDmCA$4lC1 z<05qcQy~`BIzok|*k*{n-BFKs?70#Vbl?zxpqL-+J&SIO1q%Z(PJX04c_oOWbV=p> zTz(nA9wwF#l*5@uMHHfzVHdR~Pc3Ab(KKm&ERvapi%<0^g&>L8c5CCN6rh}4PgNGs zOoFCnfGTNFiKuZhy7BNJMO$vuIzhaE;x^7CnvGHBOl+Y{u+#&GlZW-suj1br73t&S z!?Z9&KTH$gHm8j$>jUCm0&_XIr9>AEZxN9^F9W`xiBXqRU)r!}KkOjD7YM!dr6(r~ z-LKx&Qr_kXEE@l7TE0(5Oei!(RaGTBC5WZIb-(Boy5j-?!9|yRhI?Iu3$}6n{{+u7 zndoV1-A$BNHTh@hD=r*;4-VkoR`}n`n=n#YDlSs@1Qa+;h5!iCE+r~?0$md=fogy9 P6HW(qTZMJF%+>xEb+z9{ literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/button.png b/plugins/snes9x_gx/source/images/button.png new file mode 100644 index 0000000000000000000000000000000000000000..ed7d4e555d87f4cac066a04d1f487422672ab6dc GIT binary patch literal 1842 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 literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/button_arrow_down.png b/plugins/snes9x_gx/source/images/button_arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..bb0b639b095b1984bf280217daa4c60be3492f85 GIT binary patch literal 792 zcmV+z1LypSP)<h;3K|Lk000e1NJLTq001BW000~a1^@s60K&Z@0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!x=BPqRCwCNS3QdpQ53y1CX<he;<{jE zZ?*mcZ59M=tn?3TBU&srb_-TQun+`6*lH_56ofPi3)?6Nwy74Z7Om9mhx3)mB=Mfv z`^?Ksl9_B~-3upqnR)M=Gk5O$i1BrMjm|PkTKg{J2BXXP%-CT#1?e;xtBmW63gZ*w zoo)c)Z?yrB<@=);X)$)^6urv0Bf_^5_tqKrU_u$dlat+8=FcJZ!hpiiBN+%hW3(kR zFtg3*CrHmRZi*<LbVa{uS#>H~Rc;yNI=_|XKLbd~y6+v*(()Cm)i2U;I1nQ)g<YQp zgJ?xaA29Z1%#Ms-6~ZMYXqqLmDm50iV`0NEW6u4~chWS;(2DQ_o)+SE<5DW0Q53Qf zk4-Up!Ni=G%T*Suvv8eCB`bB`bvopG2kO<{P8Q))7(j<gwUHvg@A#U{*%=Hd?D=fS zJx*`MCaYW{!!)NB1Rg-dmDX{lv_5#ho3YbBzh+h!geok0{=(%LXwMQ)aBhlL$^ha% ziVZ0a{G-C=I=JMuwMB!b89+2+$8LuUufMQ3IKZWIXBl|Sc#roi(`BIm2e`l~+?fUt zj~IvDz~QR*Pb`kKg9BW`NqG(IF<zkIpm>JE`PF%hbM#aFdMTW_4IrLiq3QQ~<c+3J z?!Xv~mBngfT0b*`r<owj6$#VLS$(q%V9no()0we0=%Kx~E#Ww^0g|<U7sV(AH8Zrr z{l<8h)jyAcKoz7mr6$+i_|$#Q@QW~jc!g~^v8bfy{AlrN$rvii0I5pGvKmd;4Wsep zdm}IDJO<iovzk<p&iH22J`DqEv-*<QTH`jZ;a+mHDcZnjZEz28N{WGYo;hEX0TkF9 z9Iude0Bu~8d#7%IWPbm^5e+~)&z#TtUocN#E?$$<uR2Y2{-*(DqD2daNoO2?1sDJ{ WHBrFSMM%d00000<MNUMnLSTYiX>E=G literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/button_arrow_down_over.png b/plugins/snes9x_gx/source/images/button_arrow_down_over.png new file mode 100644 index 0000000000000000000000000000000000000000..96a4e7bb3614f5793d3dd97fddf28fd48742c221 GIT binary patch literal 764 zcmV<Y0t5YtP)<h;3K|Lk000e1NJLTq001BW000~a1^@s60K&Z@0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!o=HSORCwCNS4~S>K@^?$Y;hA8T8y}| zLaCd!KcKW5p<p*%)!!iPLb`D$bX5pl6oi71m8*iZAY{`*!A%SK0a?@(6_o};gCD_S z)nK0IICpfMe7s3~trt$-@MiA0XXf2IGYRI0ht+l34Xgbecnll?-+^V|PeO50z&P*- z=mow3pKJjP{?T%nk>?i?k^_nz1|0*QN#F^mZyK1S2qS<qS9gOzMR@KIQN;FyIKKr7 zvN9C&6*zH7dw?erlrz0=Is#w-+ym178AT@Mxd1N7^d>qUhM^iEI~*vYg7!9^N1Bj$ z0qly;viOe+VZRB=b-o3TK?&X?iu3ilvSO;hO2W^a?QIOc69f(G$z-TN2u1C-So3}f zHVCAe^smBqL(iU{_NkkMZzzDPFa(0WCRvoi`%$3ACBV4f(wAm%yuaBdA@+ey9o)n^ zv(OsD@0;b2B9<v?L&iX91iU9m#{^fGIkOV0K>%%v$+m}|QWPat>%YLYr<(<dp;`%` zW%#oOr{e^I9}Abw9Vg%euvEJ!mn#`LYPz{3+_3^^uYhV<vc6kmwUo7gRXCNefGuE- zjTI2oy9iF79~U+MUO2r4&|Y(+Il#|G7pp*@1Ks3iHQQ=j7{ils$h^!EooP2VP5}4( zg}QtSU$Z{jf^c*#K*`=;WHOdLL|BQt3cQRP?<3&QB&1bRP0cCYcfj8y1kmPr3_F`j zgISwbPJC2S0+h*QZqd~yoz=_R_pC2zCjtuQuv&2rE9YHS#wISn99DTAty|WoV0< z^X_4jw1D%vUe~vzGpu{od{P3KV2dYG?}S_q7p3o?3s6$uC0@}gdiEusnveTm(24Ql u{6KEM<~FtSKLr>OIdw$~)iv9x00RIQI}zA>_-yO|0000<MNUMnLSTZeI8ogI literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/button_arrow_left.png b/plugins/snes9x_gx/source/images/button_arrow_left.png new file mode 100644 index 0000000000000000000000000000000000000000..29898cff0c6a845614e57334e21d977a26fb3831 GIT binary patch literal 842 zcmV-Q1GW5#P)<h;3K|Lk000e1NJLTq000~S001Be1^@s60ks%H0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!>`6pHRCwCFS50dZQ53y1`JTqM#=6Q6 z5QGXYbRo^ATCGGXh#)8kTF`}vA_%T3y6j3(1O-75gsg-@L5aAjAnHc!R&b$J5KYoH z&F3WXoasz65tB?N6E7UzdowR{=H7emeG}z<`n>dG`wl(sX}@0vXdhn9p2Cm-mhfV! zff0geKZaYtw0Y?gt}z-ZbpT`!F}x$0>hnu<+n9AL;i-pa_^tu;P9oZfXhYkjT*_Np ze4Y@3D30L{aMF07KP1uNofw10{YtrDZC&z$a1OWv#1uu9p=eCPk>RbIjYdPN)uOdr z?1yj?xB*OY5ei2^wnJ3a*RqLZB!#6Rm{m7~jMD>P)<}vkV2C0RjQn%6Eu632)ZqnF z6uU%GMAJqgj8ROLwm+y;3N7JuO1K-C2a;US8+t|WI+?Clq+ZiGT}C*Uof6KQUip|G z=85@oV%4U1Z=AHY8Q?lF!3C8^1yYGl&6dB#PJ}Vw9&mcIrh-QJ{DE*!%4*c>P-w|o zzHCQGvQI#qo@hgxqHtq2u`D2edOJdfFCGkO5{-@t`=DF15x)5Qp6AWGo7oAerWGbT zoB1ZiLeBL=gF(%jPIn^A0DFLEjYeHI@)^m2Sl7$_5YC{v`#Xh{q-TKR^q9q)%dAL# z{g?11oSLGl5@;&>h?5*Hm<Q%vE=t8U$^QOoKij%{8QStP*^6kd0()7!^?FU#*M7=s z?uXQB)vknrW>_bBRq03I7;qW*T&)z1+!i*nJn-6oouO%%r8SN`j=L#~`=+R#@QfoN z)yx-gAfBY#I^@&O0f%|UF|-UZL(PzP$m3+cg`Wlv0=I!Y#Y9n2TrGJFM6C023Sk}b zqSM?o!~C3O!}7^xzZ++vQ63;8sXeTHw>C8AFTe>*&r)DIP6>*Nje{>?3v0sDUJBBu z088kRk!-X^ipplSfi!QBUc_*KCj~z-7-lcOOWTpY#c=e${h6^5lO$!o_D6sL01den Um%6r1XaE2J07*qoM6N<$g52bU2LJ#7 literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/button_arrow_left_over.png b/plugins/snes9x_gx/source/images/button_arrow_left_over.png new file mode 100644 index 0000000000000000000000000000000000000000..d37e21976e76741d60b7d3115188f1848a215d48 GIT binary patch literal 776 zcmV+j1NZ!iP)<h;3K|Lk000e1NJLTq000~S001Be1^@s60ks%H0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!s!2paRCwCFmtRN}Q542!R|}C!n2cB# zBZ{yBgI;_H_r<Ub!ytm7Ac&xXh$IMlD(cavqUhgK5ClF2LQn|37?}kTNrV)Jgi2%! zhE$ll+wa3GcN%ubo!Qwge0%5ajQjI^_ndQg6Sq?-r;>4cYAV$8wN4esou;P4Oc^x9 zKh|G0AfPs;E2zu7b%yukMt`yju)9nng4OZTl1MDw%ETI>vF|);6QUW=W;9(WEIm>a z3lLD6=^8qu^%}G-nRHg0`!n{@p*Vn-&^hGlgA`G-wb03<tc~z-CBP1J5p`;@9*Fj8 zrSBoZ@{5;)B+P6Spg!{!I-x~9+6u_^MCBbGJD)|V!;>Z{T9n!wfk;7VKI5~qT;O)p zhq|>;G>WQznLnCCzZWk@v2(OsV4sPqMqX|Klqz9gKy=T`X>C2|0&3SH4Meao{ui^e z7|=yG&=D<GnVM<{nOT3(tX)1W1r+R^0#ZxZL_`}<B0|l4Cpr_~0Q<L43Ml*1>r746 zRnQGQ<?zIRFZSlW-0%XGO_SfSV>q98Caf)?N29&$3Ib-)4)id`%SV7CfPX{)uC;sL zLvybUvQ*Hc=zt<t@xB5&27Dm|a0T*Y_TF;#aKIdx*R}Wp@CD$nh4M{qv<;#=Ow#nC zohsgW^(cUE(9dwd_OMy{7VSr8(I*`_FNt>C9z8{enuaN@R`#(qN?F`ANp)YKaRbf< z*j&ukuyyzg9Y=d~#>rY){2t8*mq$mXg+GXPqpLcJrcF{!`l5C1dD)4r4RLgu%f{wM zDw_`gUjv@=MC1Bwt+=((oIj(3Tpm+`>6B2zP~*t`YilOfUJCR9QVHFYu@k06dQ8q$ zrFjEA#k5N&g}!2p*?o=Wdub`?Fw?$bKV}mD`{&wU0R{jV8trg8K$rRe0000<MNUMn GLSTY2&te|{ literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/button_arrow_right.png b/plugins/snes9x_gx/source/images/button_arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..21a7b483d3fda68eedc855c9820693a72c75b026 GIT binary patch literal 821 zcmV-51Iqk~P)<h;3K|Lk000e1NJLTq000~S001Be1^@s60ks%H0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!*GWV{RCwC7R!wUYQ53y1nM^*Kwn<t9 zse*r??i7@EQxt_j-3Wq93l$VW5M7DlPAmvQH%beFAc6~_P!y|fS`>9tT(}b4=uXqr zCX<huB;ND#9*nh<%p@}x&V0NKIdktl@7&QotzDo&;>d~RK+o&0>vN1nd5$b}7uhq$ zWqE$dI2I-0G!B{JanfT3E>APwGag1o7*h+m`~ga(v+8!9@iELYE5dag8g+{_O{bwu zp0Z4A7zr#Nm1Ta;m<Wq-6$jg{QoG$23x;7b>4YdVUV`H+;|t?f7=+u5HIRYS9m&)P z<;D(DBALN$o^glqnlUp7A>y4X>wgdFF&ZA(N2A&O6pO{NbdvFwvGn=PoY^m-C~Ko( zc|IIBQ=+%&p&W6Yu{4J=GwHlvLT#7RphuG(!E}G|X49tf&M&eXRrd?uVCVVjH$%jR z5KosZRiLyeF-nb+a};E@_ks|vdiBvOASQ?k;*$IMI+Lz5X8n{DHe=&rZ2S;ux*kY@ zj$IRFcASP<ddj%MWiEPU=rC4#iN`C9cv6T8#v%9ad0FPX7a`(Rzl17ajj%{FktXR* zQ{4z74P%crObRm1bl-nkwYJHsY_UzYaQjoKf3FPj0<--RI!>KR#UE5D|5juW&0)7_ zc4v4>I0`pEh(ht_m2#14)jw+K17m@SUi2zyL1dTkpIyCH78$i#O||rZiLUzX;Z(;n zdlPzC+f63h^edW40G}9LeUwL-WtCVMB{e(0$*dNGs<hBcEXW2~Av+n58JC!>+RwI_ z@#-J?gFc~OuGx7PLp$hqsUjT3P}O+G#p9`e9)R+oKq+%D-e=q%bmJE~+aX0-XRrzb z7Dmj5ECUk1#`qqF(@d*!A``395rvFRnbngpt!+nb;4OBFR?|_xKVn>r;zL+?9eO3n zFfopYP3F!JGw_Vu_#0{_Mm;T7q9juBSAYQk<01-U5nkry00000NkvXXu0mjfuorAK literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/button_arrow_right_over.png b/plugins/snes9x_gx/source/images/button_arrow_right_over.png new file mode 100644 index 0000000000000000000000000000000000000000..9a68beb6a5b5eb1e2626cbf06defb46bcb0133ff GIT binary patch literal 775 zcmV+i1Ni)jP)<h;3K|Lk000e1NJLTq000~S001Be1^@s60ks%H0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!sYygZRCwC7mQP4jQ544CeNG}F1ydoT zL=Z%am=-PiBicfcf&tqELEFHh2!g0p6z#$w2n0)92tfobf&nRt+9*k_q(%S#NTLy# zV2MfD*!RsnmwOp}&bu@39r)gxcW2)Fz4P63&mA?8%LVnsshJtC--piUV^F`GQ;X1n z-Gk1^`5|;5O<*SvJCzEW^z~urIdnTMU;__|X@z014Pd3md!ZLe+H8QMJj@Dt2Y~wk z-k`tRD>mPU+L8i}@G!Ts5|m`1nIu4Ib4Cvxg<e6IlK{>`Pf7xHV=I8|0Jo^J$yw+s z^cd=@2grD4Y^{t&C=cKsXuTflhMq!0w^~~pYXz2Vovp~wjVyrsk?nSz<;D}V8PMLi zKvmIcI7fLtw7JTSi_lxVoHGS{;fv@zuj6LO7^{}030g~wcR}K5L9*@h0gl84n#f5} zwdtbbs=5H^DAW_jQm%l%y!9X+vd*&tS?X^}rC`Ah-G$D==DDa0m!Tr_`{9wLiH#5& z1{+6%9y%^IXQP0OM^VcoRuw{Qjck!yw9V{J9cuwojm#=z+$n<1H9n9NF@@>)1pU)P z)28}Y%aAY7LnAgR<qi7@y+qNxw=fpXZntPEGdyG_-={)ZY0PNK7TP#;9iRu*EG?An z^vLczAn%|*cIYNR=i<&`M_gb;Yr6#4MBJjuQ%$lLMg_O9NkAs;-uY3o>i4bEs&+CP zX0>RChN07d{jOzMbVV%(&d&#czFGUYcV6SB?fbtp<8-C&Q1(1GrU4;rSzoeE-hi&u zyYLHUgEb3tK^pPA{VhxUJoF`rPSa`Z<bwT-jJ`r*;Dls#C&||KD-hT?vRbm=4?-u? z_#<5Ib)2guyJNH`4RbRrLPuobkI8lFyG1cgkcs~S3;^2s-C^?=PVxW%002ovPDHLk FV1fmcX&(Rp literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/button_arrow_up.png b/plugins/snes9x_gx/source/images/button_arrow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..2f676a3d75d71d5ba43e56fcf2196345da2eaf29 GIT binary patch literal 746 zcmV<G0u}v<P)<h;3K|Lk000e1NJLTq001BW000~a1^@s60K&Z@0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!j7da6RCwCNSIuh^Q4pW~OtM)UKkC)1 zP!Mtr*o#o82!aq0dJ+$UAQpszAQS|_lLs$~|3krRq0mb`d9=_!z@y+-n`DzsO`PBE zY&uz6cbm_F-}16EZ|3*j&dhr;KJPrFd5TGM7JH1j6~;{&e`5TeB>@Eg!nh{CzcQ+f zpR@V|?-1N|JpzQt`&s3{9mbkrnB-qrB!6L%FlM<gx~UU*frnSVNTy|zY1+|P>!wNI zHKS(RE|t7N&}fWz&@nzti@*)Wa}3J7^=VP>9*OP53B1CiSXv;*DgL9xJLt6SBndob z+%-*$%H_*v8bJpe*vg!V5WsSuL;?IOWSD19fetnz>oRw20;umLY;mFJXBxxCaZ4Cp z&(j;S2;5>k;6mqmznVK)&>t`-nj8BVnLu3gTxOQ#<R$=H&&$^v{zqUF>{HHiiz1C3 zczIp|=<Ux^+j&00XFKT)>+0ajMc@riJe5!*3Fb=TR>Ws60&9$Vs-#91Rl0TYok?IL z)l|m2at$}HjVuB<NUHX5TOC{A%Z}T3HGNoV0yQ~Ebn=`k{a%kcohBU}ev5!H-evZN zlf$ZZ+LdfGb+iu2pW~1NwW!+-s2c`Dx=y<>NIJ*i#4C7YrF<kuc+mQl#Ja5sAVF63 z<)Yv3M}fkyMIi_7^^Uba-2L_#yQ*U@v;8H^X*GXD7ZtY<U)ey+;If2okY!)15_2md zupF<xLhaxv4$LcM7CPvG+<rew;85w_GF%~Y54U9wveXU^2|!P9d1pWbF`A9<Nz4HO ztmdgGwCo7B8T%Qz7K+`ry1-ziE4+}EXeSv;_M(2J{u$Mioe(7)H6~ODzL3%Wx6%aW cB7X%K0BgOZ-6`3{ZU6uP07*qoM6N<$f?I4;=Kufz literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/button_arrow_up_over.png b/plugins/snes9x_gx/source/images/button_arrow_up_over.png new file mode 100644 index 0000000000000000000000000000000000000000..9d3fd7927e469be4cc2f2ddf8e81b31396967239 GIT binary patch literal 710 zcmV;%0y+JOP)<h;3K|Lk000e1NJLTq001BW000~a1^@s60K&Z@0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!Xh}ptRCwCNSIsL#Q51h~e1>U^uZVmW zV@l0dnT=AUl$ugjR#QrpQc5YMtSoHE|1f2%lns9YvQQR8iI8G}!tXclyym`(nK$33 ze)k^lo_o&k-Z}T&%iL*cF^VZ3qsUU4#atgSB>FM%Qb+;}egd@1-`7A0crMgWu+88N zrfCpDWT#L$Fb+(Ypa~#&KTu+QpOUe>6Ifx>g}{~QD@0ev@=0I=81$m)NCb`RUP~PW zcJoDG09dBd=kXY(GGIEtMa4Gf1lHNKVYRh?4DwrRVprC4O<)$7C`Z#{n*SPctlUy3 zWKK>9FxTd&^ddl662mgF5m}JASrg#-4*JnFCt1BMw5hY~`rOopR0M{B85;F_+@}lc zgILdqkBkY#&vhppR;7`xRWip-ZAeC7mFzWVu0<iu9au}30BifAww-BLxPUVu+tVSi z$s12esEmYjC2@V?(-nbfAfg?qj72%R5%Hapz>-!}vJ$O$Eu|vBizMW8mes6<zI>J% z(l0BO0B^D=!v?g=Mwd_E{`=cF6Hxz5Vz2p(N~~W`vekI{C$3h9yh%{Lxt`Fga>oYW zm~^a|P3Wt&`CjpTWzA)*F_i!lWR#DKZrS=T;1R};=pWF(JN=Qz5pbwf%rJ=gpP*dA zp1vC4s~&y59A)~xvwV$8%$Q9eY(Fe+CFnEyFK5tmdHwE5;16YNOY)6GCiz-Mkl+n` z-0*is?-w$RabfL3SS7&K%wK3*3po(%1E(o+?L+MLl?M!0I)a6a*t@C7Q9M7C|BNE` sPRJk~z2@j3)Cd{Xe@rJ(6!{Tg0Q8uLKUeh!@&Et;07*qoM6N<$f_r2~^#A|> literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/button_gamesave.png b/plugins/snes9x_gx/source/images/button_gamesave.png new file mode 100644 index 0000000000000000000000000000000000000000..1e44a737e6f7d09772e0aa73b0de81309ae7e884 GIT binary patch literal 546 zcmeAS@N?(olHy`uVBq!ia0vp^Ux3(ygAGU?RKM{7NJ*BsMwA5Sr<If^7Ns&crsOB3 zDtP85rl$s_CZ<#to=ml2U|>Ar>EaktaqG?Xjb1W=A`K6%1686U*DQFT%n~B7hRG{v z*;cOuYWWFICrxk?So<wkhga_<6ZcJ)&urYm5iSD4G1E_49{Ir#X8ozQ;K8{m>~-&a zN-xLieczV+E!iwNjN9P#F~h?%>Yi_sd(!>N?nU#A<ll|gUb$XTmn^w=Cf%_3v-SE@ zf0pwvjjB$xHF!Mhz4+62A6DF%TYv6&<{3Y>zp8xt&##%EK6G=XuH)%D`|5(1E&lUK zubJmpxQy8R{(V!kN{^N;$Tk1EL$Cgt`KOAhj^>qJ@AGFjPW!d@%X_1`G|>+w98xU2 z98v-%3K<~maG_xVqhm7=GdHn;Bxox6;m3mYpDy%d-)<1gdevUG-uQ)l<*YY*w@YR$ zJh{8QtX=ZU@fj~mOmrsS-M)0^k4)zaZL=+-&Zcd?n`05ZE^pWAp9KQNIj$F?_MS_v z{bc`Qi|l6k&7zx=><vDDdj2!p$36)ds{5IE7!>p(y^|LE`T--I!PC{xWt~$(69D>N B-%$Vn literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/button_gamesave_blank.png b/plugins/snes9x_gx/source/images/button_gamesave_blank.png new file mode 100644 index 0000000000000000000000000000000000000000..056d8c98ba25bbee26b86f1cacb03dc5c52d5a16 GIT binary patch literal 1100 zcmV-S1he~zP)<h;3K|Lk000e1NJLTq002Y)002M;1^@s6qk_?-0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#?ny*JRCwC#oIQxtKorMk*PxBUA=n6F zDd>R~S}1}dVrQqF<$+(V*9bNuHfJX)3W9|;wstli!l|Hz;s-V=B3vha7N?wf{^xdP zGaqk~-P~O^*~!R1Gf8H4lHbkCyqQew5Rqs@7P>70J0x;5|KVO<o-NQJXopI#g@$WZ z{Z>c=pZ8Pbl_B>yUrz`7-w}U8{1ovVtYSfkbSYc!SI7nu2-~1@&@pJD6mFt?cFcJj z1hHj^fy38BewyeFwpXD$(BDB#<_z=%nkofDULd9UEy6jU-ICm<e2YLCa$5vj4>?Lz z`K8j6*tv<stZMazKxUw8(8lJ2AXVO}qi0%sk$4Cl%mXs5%w&8)P;X!T+l-z2*q_wp zOdtoK%aMRE%WQ&fA<sIQuWLM9FBLpwoeQL<gXot-B+ci9*+Qfp?H>*V)eHoc0b%Z+ zh7#Q(jxOJisG|EcVyiV|$8?%<$~oPz-rt4IP7P#t#2|FZHHh{khBq232(#X;8pwvo zLFhc|6P4&h4x)cFX+hY>l2rvE%&x88AauE;Ss+ZmK?LBG17Ww27DPXt<WJ1h1q62k zZn@=waDX%!1XEuL5IRpHtg%M(LD=^*I0&*^NLn!ne=c*>Aas;)Hyl%o$RfAfjm$J$ z5Ec-kbVv|(H#iO;!k#MYW{(&ISKkVQU`-}w5c=7vJk>OM5T0WeI|vaT{*M}j$R>d+ z1i`eBxIyS`=BY*wLU$^Obx+I?I~EYkGo)$|+<<arK=5Owd=S=XchG6KaR$M7s#Fn( zyqg*w2+L&18vZv41ZUbsAo9j(Ubj0gAh?^(2jM?dBL`u>sIp+h1%mZMS`e<u7%e1L z5Z*In<RG|m6@su`_ew!97h3}m&f9-(v^xw4$1!Rk2*+g73P9wvq#A&*=0mK}ZkdrJ zg)Xi+Ae;#zDnF#AX154_3Xz%uLipb03W0FDU5XuqJs%>(FYHY;A4CYnpdT=a-@2Fi zBIH`tN<kF89IF(B4xhU!{|h2#O*p%*om*#4fu#*<l{xpJ0K1mmU5~C(p>^--cS!_Z z(u<-s`QGt=(DSaM`ygTvI=qBlsjnf@S(KlP6od{pphaaev<N5{kXVcmgbea)&AT#T zeo^%ZI=^}#L>)oM@D(}<{V{;_Kfakke5DwKC;=j^8weTZq2thNeV}XoP_Le8L}!us z76y?v9fUTMBg!&_4a5)Ep?#?3HuNJijk<vlWk9@xPKn-Ub#DW%I~(3ZQ>gADDn5*w zw=X$wf)c~iDwxR*d7;a7sB+HvLH^NyLLZ@L&|_#Jl)2OX?+`w{HW=Z*00RIXQEN5{ S<-v#m0000<MNUMnLSTY_z2esZ literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/button_gamesave_over.png b/plugins/snes9x_gx/source/images/button_gamesave_over.png new file mode 100644 index 0000000000000000000000000000000000000000..0f44608a3e4a93b50c6398d7dd348fb71f1f6133 GIT binary patch literal 549 zcmeAS@N?(olHy`uVBq!ia0vp^Ux3(ygAGU?RKM{7NJ*BsMwA5Sr<If^7Ns&crsOB3 zDtP85rl$s_CZ<#to=ml2U|>A%>EaktaqG<uNAHkCk%ou<#~1i!NqX%3#LmL3q&M65 z!72I2T31qoR@e1Nw{o~;2rIF^%}&)?u`+nV4OuJqcMY$@>OR^O=-r>Y+xkOMdfJ=U z%eP*tlG`k`S-?2FVfQ<QH2Y_7Ys!nw?IrT%_w>9xzNSNRmEm=>+yB2++Dhvse{4Hv z{`vQeb6;}S``E>4&8?ms##$azTpOw9Z#V7p<9}y!ee#v`)*C%zH|~D=aI*L|mZ>Mi z^UZGm`5DT#yn1eq<^Cf3)9wB9^ll4;ya?NUm#6C0v*RVt_nmcU&D&~inkV}~{%9_% zLWaYIh6Rj{%|OiD#KywQAqBz$CLjr#N;cN>{ZisT{A_!!Lu=dN)fYdev;9@|PrqND z!=_bIw!zlwUHS!S!?O=c*8j1n37_@4k=K!R)72ca+h=d*R4VE1&b_k!eE)A%_7&%j z)s%le{K9{ux#8X!YiB6$Zq$<5diI;rvz#4&L=zY~)k91#m#=yUjCTf4S3j3^P6<r_ D%&_3U literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/button_large.png b/plugins/snes9x_gx/source/images/button_large.png new file mode 100644 index 0000000000000000000000000000000000000000..49312d698928ced7d3837768e31f32453efe130c GIT binary patch literal 3327 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 JPDHLkV1n=)IkNx& literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/button_large_over.png b/plugins/snes9x_gx/source/images/button_large_over.png new file mode 100644 index 0000000000000000000000000000000000000000..99f819716ebc0b222f7c1c97079ba8d9806d1355 GIT binary patch literal 3442 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 UB7J~Vf&c&j07*qoM6N<$f)T`&X8-^I literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/button_long.png b/plugins/snes9x_gx/source/images/button_long.png new file mode 100644 index 0000000000000000000000000000000000000000..82fa9a23310dd216a2884a78995f452dae77a082 GIT binary patch literal 1866 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 Ef-a157XSbN literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/button_long_over.png b/plugins/snes9x_gx/source/images/button_long_over.png new file mode 100644 index 0000000000000000000000000000000000000000..5674c9438fde52713097c35aa1a388bb2b301277 GIT binary patch literal 1896 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 literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/button_over.png b/plugins/snes9x_gx/source/images/button_over.png new file mode 100644 index 0000000000000000000000000000000000000000..605cfeb41c31df4eb3f23d7cea9dff15fa41cf13 GIT binary patch literal 1911 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 literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/button_prompt.png b/plugins/snes9x_gx/source/images/button_prompt.png new file mode 100644 index 0000000000000000000000000000000000000000..1bf942e7983a5c482de19410b7a68c56aadaa484 GIT binary patch literal 1855 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 literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/button_prompt_over.png b/plugins/snes9x_gx/source/images/button_prompt_over.png new file mode 100644 index 0000000000000000000000000000000000000000..2f244c2526fc2407a1f57b055b686cf474a739cf GIT binary patch literal 1625 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 XV|=zGMT}Q+00000NkvXXu0mjf^6&_8 literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/button_short.png b/plugins/snes9x_gx/source/images/button_short.png new file mode 100644 index 0000000000000000000000000000000000000000..487ee9ab6e7c9cc7e3b36b18c505f3b2c2988083 GIT binary patch literal 1821 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 LNkvXXu0mjf4p~az literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/button_short_over.png b/plugins/snes9x_gx/source/images/button_short_over.png new file mode 100644 index 0000000000000000000000000000000000000000..9fc69f0f9cb94a435b9d29ce93eeeff07c095821 GIT binary patch literal 1907 zcmV-(2aNcMP)<h;3K|Lk000e1NJLTq005u>001-y1^@s64LCD+0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU(6-h)vRCwC#oqudoRTRfhx2|2c?nk>H z6bfv}2(mF9S^NXR%%LP0ql5$_@mDZWi3vs%6C=@ROf--fiAD_JFNg*skw`R}plHB| z2!tsaI-Ce2!wLJ@^~cs9Yx_Ls{TR2e?e@C162|!?XOMGWJGk$gbMCqKzWYp)Bmr^u z=w`?vF0=-;Mz}HD1576TG);Ri+TW^WOiTN|v~A`b{Rf<A8`0LGtwyWidwNsxgu&~A zXg{iUaHfJ3Dai8kZD?Pj4WR8o+rZ+R)!5V^vmNaM+6gpDorV9m0Nd1Gehls5Z2kev zP0dQQy{Z_Wo5>esnu001y^r?TlwWEo2dk|Xic9A4Et&;H!ov^_4nQP0nC_BAY6c_` zK0_r%J_NWHZGXBHTT;FlDymmNMNKPMimUmq%|c?)Ab5v5V9a{~M*B~KB*pcYw4$9t z+lIC?mjZlM&HG7Ix!a-Kc?Xm^n*^`KcWV|>Xf6h)Yn5!Z3)X=LML5*=1H@xt@iGhA zdulQIxLUYmB|u8KFY2A;&St2Z*M41i5{vFu!fKlXuKM+|7>D}4M?0#&gbLE{(AJ}k zr28JzH1mKTqHWbX=hQs}wF@8QyTDB1>Hh_;T|NZSh)>^i8tvYe_I<%j1(=j}i>yv? zH*CVFx14*NNg_HCfGgd5A>cW$Z~BHJA&M|&GzHUK&)cHIR#p%57H<NZeE~?EZkd#0 z#8Rkl+6ukr_keG>Q*5Gi`4-yiMj{|BqjieaZjsdib&Xq~xYW(P%oyVG?;k;6^v{GM z8tnm$f=8wkAWgL-%=5XIJPDPxcX6*WhKa{QaH(@AgvYOmZd$r)LJ>yNrQp?i@lml+ zS<{MDZk&6SF-$>$1*+ZmLEnY_qMJ6TydkDyeFUWCwUt_<-O&gOmp#k9$;_C+D~Hj( z6<q<eI*fuN`Utp26d&Q7b2mpmCM#;(_k(ZfEQEvolW`4{dF40t5%3F8CJ$vCu2tZw z-@rY{WX<ru$6%oM>x96FHlN0VW>tJnwN##@%t3oeIr=f#<D9z+Mh8!cn;B|Uy&ck0 zFl{EaXsyNe1@h(siPJBW6HM}c0a`Z}*eD9HO>8N5Ea$NwlT+-KOZ5U=BNicR6E1c% z@oEQ?Q>-O!uvn|)y@e_+9Qrky@rN6PRS$Df85CJ7c>KrYUWBD{MFA4c6agDVPf@Xx z$9_y+pa`gADG6{<f&eX*EI=kNn5_=ItAPY)7d-_9MO=U|d7-edSnqNs3D8tv0g1QN zGkL&7!A(~jr`QiDaRg-Yf+R)tE_o%yD|%wF5RU<wybzB?^sZo%0OQdRM?fYo#G+$* z*B}Y7NAyfYMmYj9d0`^#(Yty`fL)0fjo>Jd1<2%{NN8B^>N2;q@AIBLx|z00Hz;{J z4B@e>U@dWRk1@Fw;PpL$8XZ~{d<29Qk#T<ySZuZ2V@%E%_g#eOgkN;^V({w~1^B$y zGUojYDr@*5Bqn!+#`^TGujq#+z{8*%pWxKSf&S4huvgyBJ;!8CG~xxn=bYaC3H^}I z2UL$uI3TtLM*dLFdtqbC(&+hMDV{J1-Hn<%Ek;1%15nO)lMkB=2d|-OISMk_PQ8qP zckqnf{jT;GQGnf`ocsHz=I{;w3Z)gdfyrd%o@8c(Z#e0!%3dw~>IF#91H<$voJGmq zJ{Y-r9Gr98xF?y6319}Lf>y`2sZK_q`M`HTIY?%*A~qM5Ls`|G+@p+PXwJ{m|FhnG z9L4vk=tz}Ycc@XYMRRzE&Okw-1xk55$QT;;c~Xgw_8dH=ccu~`g~vzGXyjO-IX(R+ z<TYY0N|>p|H!L4knPS~{3r4>lBLdV?@g`8-0W$f#@aVuvh(*VtylMsaG?T=*|04JX zJ0KQIIt+COitj+G&rDU`(&Y5hpd8mWiGQRMq7y!-sBV=HBxD$++Wif+aV}NUZWQ0P zbf24UeuV~%bg<yZVk8XuFGF~&5A2R+`2;QI)+Ok_goSE%s+}$b%`Lw))#r^&@KNZb zQwBc=;rZcsd_tZl3<i3@X0HQV*&>XHC45J20VF9V2cgi|l~ilIpa!j1z`(mgjLtCA z%jsy~_ZcXMSSD0FWHjMOFQ~DW&IhZ_B_C+c%pPbrGl^{?G>CuxBa1K%G|^1&2RUx! zdox+$AgR-9P-)l9cCkX9ET2O|vT2)c=#^b26Te38rmt)xUL%ibkRo@1vX~Jt`rR{G zW81B!<<~%2JGQ60FvU9~nAr){3bcUHmFWj(`nF8ky7e;Je6$zTiaEyj;g+HUlv7TZ zs42H=CSQ{6E(5O`c6X^MnNHcF%?wM?n)x2hDtc9s(Mx9zsY9}?$>lZ|65~PDG-!^- tb^|(V8S5n@&QH@$6MT_;{Nn!v7y#2=cgKpUf>Qth002ovPDHLkV1oMhh|vH5 literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/button_small.png b/plugins/snes9x_gx/source/images/button_small.png new file mode 100644 index 0000000000000000000000000000000000000000..9ffde9eaeaef0f01b2f0686e5c958322a0a36f24 GIT binary patch literal 1241 zcmV;~1Sb25P)<h;3K|Lk000e1NJLTq003wJ001Zm1^@s65=6hv0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU$dr3q=RCwC#TYX4XXBdC12yPjQb;CZm z4zv#~Evf}$(8O&J)he3AQmjTnWkymgtp3=7;ldhBY`9SyT5%ie7F%fv<t2lPWQmqv z<u$xzDc+K++!X}op6Bj8^4_<j-Q&IY;2+NqejI$>bC2-*o#*|0PSoJwATY)*qR61w z#cPcI&VtN9eu7Lw+K^UpWdJ-udc@U*tU)@Fuhkp9^%WyNXoA6iOlA}yGm$au!?3Uk zE){=&gX}{(kVl1SL1A2w_r)PgkWI*KY|f|<BeZK0TE>OTpe&>tnTMRnI){vjLQA*M zHl#7=C*)qehLkxUz`D;qhU7#W%${KdYg{bMj<>S>h|X>gczV6i+2w(j_9yW7^;^)~ z)-l}e#W)V-kH(<W$Q(7ebm3gs^5sg%S^qgZVE||Tx(4MJs^DJZBi&{+X|oZ7Xd>`~ z8a%RhE9}{_fz=KHCFK|4+v2jIGfB^&waAOe@mgRBX3dX>cEO_giL7uK(9qfr`wL5< z?%iz4Mw9F#88i#oij39*G_G7eSqQe7(^=VYE|i}4z_x-SsB3DI!#?DEH0jxJv$!JJ z9Kzw;Y&Itn3nkQ)dL;$X!UNq5N<rS2yEYngcIT{TH6w^qe^x?4(MdTpfK0<IYF0C7 zpKQ*DY4g||6R>^bYQNSJ#tSb3x;Ts2z8S(+oJv!6F(XgXT0tiEY8Kg`40-z|IVk}) zu1e?E+a!?Iq`9&!M4k+7mS)JUUu1j)d<<bONb?q#TMm&Ym0AX+$}P)M=dxlZLr3#e zIfDX5sU+Jh&LERPnk$$mk3j*)2UDUav0^4eNAnmtg8~hjY~c(t+n~u7U4zE4G-Df@ zL49(t-}j1@F&VyB@02U}<SwpH?&kV^|LUb2BZBbu`_xdcoIwxe7FWkJR?K8Pe%hsm zTyh3IKn@*|{?qsfRxD3r)l5WfL#rC9movyIw_L5MWyMT}j^<7|gPdYe@}C7YwROPx zt2L0has?}A0vuI0{hBKi1gD%qG=*@;cU-Ez!^)Wi9jzVS`ij@;I_Q{uNA>MGD79ba z<A4bBcSn_9YX!&Dbr6A0@B#`JzW@0w)ZA_0S3E*!cDdoZ;&L@?*G^OQb`lO~3nUE% z$A5#TT|NA^hnb}5!Q-c3;O$#=>^Y#flc0eXK-qGD9+Y>a#P2pEe3?U<-fL`An{wrf z9>Q>ii-)O)Q-g<gWx>u(YgpkB@XNUhC@i(>HJw0n_NYO_rN4`l6CrEur|{M4bXMB{ z{;0eG_Dj`J-_owvY`FB7K-DEwJfEl6n39wLtJ0T4N@4<7r^Z11v^bbPHI|(~^t|*! z_lsWeyzGPKb~jwPQ9IHQaRQl-1`QZBNCSN$@hd0=jf{{%6M`LTsjrG)&V%RyRB}>^ ze8akij5k8d1a(<6T7w9*^_`1cfGks|;*6j(rc7v<D>QvCjDDj^Ti{<KX||z#L`=mE z@$i4)eLVZ%N4HqA(3OsIw2z1lzt~Y+doZ@~p8x{@gein+Rj9*S00000NkvXXu0mjf DD9Ta_ literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/button_small_over.png b/plugins/snes9x_gx/source/images/button_small_over.png new file mode 100644 index 0000000000000000000000000000000000000000..983c38267d2101ec2bcaff833dee587c57e6c478 GIT binary patch literal 1261 zcmV<J1QPp+P)<h;3K|Lk000e1NJLTq003wJ001Zm1^@s65=6hv0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU$k4Z#9RCwC#TU}^VXBd8)G(T-)W71}( z)wL=`MXeL+ZX75IyBc^QV~mNSC<sMS1V!*xQ0$Fkg6w9L39<_jyzpw^&&2I!ia*n- z%b4}2jiyZ+n<nYWpYMD6o$Tx9NllvM(2MthhmXErastoO_k8d9zV|c~3I$-yUo?<G z_pa}*^m|Rnt;o&D9%L6XAVvnj3uHu$A>>WuHDpTt;QB3tvtFpN!XG9xjw8QDdfA7P z=o0J`e;-B0k(ZFCg=uBMR_5pY$RCi8kbBvjIl(KmdnB~<*UF&pkVD7=NGI!DHJn1r zA)#$mYtUKbA+rg0%VO{b`t;H1@<XGu6&x-<%a6!RMIo!b0}aRY<ZFmW?&xC)e2?qU z;kg*}GjgXIY+kSw{2iOXAN+!yr~uLMZHSKi2FZ!%X44nYq+OL5M1{a9H5gpB9Rf?f zWVNe6<khbb{_k?xnPg_rHY8oaE@w?=&$rOz`IHr|0aA&VFdX{DESq+qNf&1`Xfg5$ z(qjZ1E*~uGJq%7auP?QPmX5;9r$0ezVn_}rkgL$7*QK6=&dBBvKI!@jO<D+rLY`Hv zAxP8C<=?=+_Xp&#M|iNqEQ3}fAIP`1MN79qd*>Ebv!2Dn$SoL|xhCb1>oAKRs~L1e zHm3>Kowkn6oH=!d53Awv(Ytu7E3QX&;l(~VgJ^GUMBX8wqQKkU#|m12_~;$IXplq5 z4$PvIkwIH!b6m|qXl+}M*^^`SEC6XeHhcr7l3^p{6`ov`4Ju-RZ!G}d+AIZWE*S)> zLA~lW4rh<GAk7u@%0<FTdB*8(<Kn<#kmd?j$_C9iK4`ExID;$(X|6!`#KzLhZ_JWG ze2be88Pq7%-9?k~*(BKPE>_J#<nx*uN|ZDxmra>D%BUl9nWP$u$_70JsUt^AN5JlA zVbv^zHZ`V(Lb5>*k;Rj^^yDzs<=jDKCDMskYUrM95cO;wF=i&?|A05}Ijd$NNOJ|( zRD)<y@))<cMC>tm7OrCDEI?xXiLSX)Aj~j`Iv%O1ZukF=K7$tT3RcgO?0Ke!F40c5 zY!G2UHYk-Cg81lNXl?t96|5sBVt?scD;Q88R0(u~M-2<bX1ejWf9O34?v^F2WF3&f z$}JYYt%ffer>O*WtLK>UfMg&Rz6IF~JtpOuH6&>oMQs5J>e_S6Y^%orb(2uT!WAQs z%}l`9@OAJl+Q^-wHOrhR#NPZ4TI#Jj)h~DS=vzP~8W&F>PkyjD6xaYBI?Q9ty<)>P zCm#9JZ0a1Eb5IRd-1_Tux9inib88Q)T>+BsLVC5PrAN)COSb;b_I}VFnBJp1Fk?#s ze}I@6{~O$%Zg4n#U~hDT&EAY-6FULZdztxM62~-Tv>2qZO3O^eN`3qsa!$?j2B@n0 z5tN2TM)h|)<bJi)S4BAoc65Pm<atUU*0pMALd$NUEmUg|fwsQ;k!z5HYAMbrJ7Wfg zhW$d*kD}6dR6}BIqH4o<iI|!jf-v29A7meNgvBEZjdYY_yhL2_KXwDZhCjdYUVs4r X($n%D(ZSc$00000NkvXXu0mjfVRl;# literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/credits_box.png b/plugins/snes9x_gx/source/images/credits_box.png new file mode 100644 index 0000000000000000000000000000000000000000..d0404ba1278605898456b8583505e707eebaca20 GIT binary patch literal 2521 zcmeAS@N?(olHy`uVBq!ia0y~yU~*w#U_8LV1{87DEawDLk|nMYCBgY=CFO}lsSJ)O z`AMk?p1FzXsX?iUDV2pMQ*9U+IIBHf978H@y}9F?9TUpX@UZx^sjsS(N5@n*@t_xr znw%Cc*fBRxt4ScJK=Fq-lP<?2Cjpm(@)u*h90hjI)MFK&8YC##l)KgB;EZLAlg$iQ zPX0JYEj<5{=QHM2&wkkyyqIHLoZe=9^24)p7uJ}?^7?)`_AyOHxKO75@zl4b3=Pdo z<c@DIJaeQ_vrqq0ROzN|kKJm0`Ft2l6#Ig|2{2eZxWqYk^6kfOE!G|Tc&<$0@6z<^ zj=_a7;?4{Xo=cDItb6+C<;q7%VLwj1nQU=RbiItEByV$b^TME&H}?JCvS#hlwC>1i z_II_j&E%I~EsgxRtMA?BqsgXsXZgL;e*Nm_n;mAaKYWynJ{4tq=-%=4xAuP5zLcJ| zs=s%$&U)_F(mQqE|KC`;rrS2RDCgSAjgh<Uudj_ie{SCQ`^VGo{;MnbVtnysZOQMN zZ@>5EJg;4OwL0PV@pS(ed#Ba=FTTi;z1sWXzfUzYcK<#5Zngbdzia1~bN`fFwE3un z7o&;YzZwZSIWcF30|#wW1^#zf{JG*GQT@)v;@>6dem(IyyNf=4x#_-rwQo54qy5_- zS<Dh^Yim1n<HqK)4+(qk#Qwkfh$qlIojJ;0KE31Ht<3a}If}PlFD+>6s6Y31c6{s7 z-R7TP_FDKYF?JEI<oWvjd$%IPf-7+qAHUwPY5w^oB5R?DOZum&Uj!u?9A+-<zu4Ea zKPJX%a?^_xJMZ`fYz!K^m$x79z8oGbAbT=>@7~%n4hD_A{~8Y;eR)yD<@}S)^XAD} zvoK7FoAx$i9wRFY!=Lw@N(>GHH<^G0BLjyL1A`+AgF*)b1B)O-g8~zS05EYjag0ii z2Eu4c82IeabV6)2JC2q~G%A=6Oy*s5|I^85&z8wDGI-^0{<pzm@BF3=yZKjN*WUnE zLto_b)`%@H*6djKbo17&rl5M{-l<ReM_+Cgahd-4=A}!MWSJPe)?UnL`ML9bm-qBw zf!MCcZnLhw{<>kqhJ@t|4VQKmzkdD5J<Wcpn3v-g!Q;PwzB+ZPXvW;RysuxsF5_X) z=)KDR{m_~3@om-R^*Va{!{@Ha{gUgy?6HOD@sL?-*8i7V{K8K{R+hJ&kGIWhX_7c& z1GBUfe^?#wX8ZWNwO7*(+k%)|_Z@ol)8f+f4!e$I1zjCIy<4sf3vw<kPnJLSv2b4i z&!Q?B`PQ}XMPfOk(|Z^gPN~dQtJ-cA`Fr7x8`qz-85iymJ04x=bEHtGZ}K;O28#uk t>J6vtvzcor_uD3CF3YWl{)}u4_1z06Y`n=B1#GJ^c)I$ztaD0e0sySLeR2Q* literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/dialogue_box.png b/plugins/snes9x_gx/source/images/dialogue_box.png new file mode 100644 index 0000000000000000000000000000000000000000..f479bf1ec80781b88ab676360e9eba097349abdd GIT binary patch literal 4827 zcmdUxS5On&7KKj)=}o00NC{PXl@0-cP^C!|rH3lL7eS=hKoWWkV4;N$iXtuaCP6@I zfG7kJ75Jqi?ef3hC-2jp`S$EHduBbXHM7s`hc`_1>1jA=008uG16>OMAh@&QrJ^{S z2spp`eb%T04D5mdpuO~OK|ua<b^vJ1ymWMK-0<`d@elU&58#FC=<o&v`FnWzx&sg~ zi?KvlS+26G?=5V@j8fw>jr=WGsCX@4kK>s$gv9u$nG93;Ud*tVcU-uBot&$`D3vTN zE&d6Mxj5Y;nrTWB-^;YbSE-K%55Gpg@|kSe`!;;?c1mNVatqTiLW!fI%QlcRSBR%8 zhw)talGxYX`;{cAl|Tax08CU3ZhXPV0uZntr>1t5A4k~+AQ9uVQ~+m!#z|jJIc59- z%ew`Me*nRSWLz_%if0B|QE9Leprr?i$K(oGf+BL@H00{C1a3$GC*gbF#z8!0KQ9^r z95VS>AVnE~_mX?6F7Q+Zl_NJFT?e+(fZ4;STNzAC0BN|5hXJU42XJ^M+Im1m2c*qY zlSBb|G;rz{5QqQ|@&L2mrj6R~tJO>^VrNO^)vGl@m9Hl_P)P(*+So|)h~VLDSD6)^ z&pGF7Np?o&amXgfGk)3n2tZK=%bDA);|M%MH6E{+*2r*2;zv8hDZh)$(#i5jMSvCn zUqj+XPsF7fIOA0*;{8ru3a*oT-li=I-Fxg&hl6s^wMYz6$A&Gi@0nr3E}Nu+7R zZkU7fpiS%vqVo>U=GgZjPVH!K=S$lnG(pxeL7#m8OXtUJ<KoLBNa_bJbKlbSkKWOq z9&wNJcf(zpY{i(D%r6F}>E=J#k}c+c2t$hY2#%e)EfU2K$ux)xpw?Rh5}hGY=IBbc zYb4BM8-iQh17Ne+zvHtA6<NGz;@6Sz(+$mI{USjS?*T^!0&rUwDrq&?pxH+SfNoKO zSgkhKb_csSj^c91`MD0-BPYcNFlcutj0r~L7JoU&Nwo4lOeA@@mRrn8>a!NNJkH!R z85O`F*=hZrK|O%+k26(4he%5THMw>_)g@=X*;I(jBU^zqDz?0&eZCF@@{5n5yaTDs z=KMw(3I;M3kF0pD4Y)VegU%_Z+|v7yq1q2*?;j<%=*wg#)SIh+rhBW?RHnrFK<_2( zC$|up{B+hL^rxUVoa#>$U#xtp@MN4#*U;&c#(ig}l<W4DmhA0<)m;;(M!62v@mJDS z^m5kTtR!oGxZ^rf7fyaL;X005kvts6>&&BVU~6n^I&DzKdl@Q!VU}8nn(Tpjr!YUN z%;=5KhYJVY>@Ko0DYgdU0+SchFG(>)r|NVoK`%bkkri%wb`D<m+G_0LnBLf33xQSf za<sewrvPeT*3GA$QaMwc_iBF<2}9~4$&t87e47q57#FR;*ZY=>A{K+*h8)XG%ks+< z?zyts*01s{=F47KT~J83hgH33w5TypDZ3;eny);Z$O<<qu6mg@&gseKx#v~$J><iM z`79pOoKH4mL#z7VbH0;phtts~vn2MVB1AaQ?3C;Xj&SyxT;mds@y8r}R?<o`KXX^| z81wwCZN(bJVpuW;X|fEngtEBAq^!!ZCD;Wlt@W1mkX3s5ZOhndJ!?73rE==e*%j7U z%#ELxT$YG()v^>UqRih)^L3ov@k0u`F5@mUo!90?b$6CpdU<JGIT|9w`F!Xrl0y>| zx`pb7XJW#{nsbl2n;)xV%U>w#$QjDnG+1n9dT3HE<p%CQ4>6@)5h=~tihH!cydk<M z%2gt7+$7_E%LkjClWkjJP+?x7|Fc!GdaV>w(t5qw?l6HtyU$Sgmask|9e*CPVmV_u zUrJNTYND>PQ!R=0Ddu|7tQ+2bw{$(XpzU^ifw6z-LS*a8pUbgQ$5zLFe@b`s>1-() z=%5q?Iy}2tk3yio8n;v*;kUVtW0#grv2&Jl&esPSO`~eBCiI@_F+TC?y|n~g^6T~M zeI-O8#3y8A^2203-@>G+M6^WJSk<_1_~Y=);mJG&w7Sfc><W4XJ%uK|bFz=H7jG<U zeD4mgC)t<Stv9yZO|n<EE4H<^cWltB!c+-PHdi&5UMOucMVVF<Od`5!e>V;^mcQeu zU7n^OR5$uH#yTTh*bwh}s=L-vt*F=!u}_cHDd|&Y7%I5!x#NQ01Tm}JR9VQ!KVR33 z?b*&=l|tB#FpW&hEj3;m67BZFSfa=E5p0O2;KZ%e#}AF}4@u@|NTRuV=lfeph9NtF zj$fn3b};A$bmv+bp=Moi-D^E%uJEILp=g1fT=1u^ew{Do%cGjKg;~-*#L74`9kT?) z+Z6#RSE&q}s;Sy{#o^dJ=M6TEU5%i^C5<IDr3KjqyE`A1aPRux4ViWM7u-oA>f94J zbvunZ9R;QFf)E7R!vyUFhjWMfQ89e&X__ho_ucxLHSH%wP1-El>G!MdFLzY&dG`N$ zR>ilsl8ev4dod*4i2FYIiPHI-^W&~KI^m?0B%5T-w18Aw&QX~hh49fionWHwAKh%- z1vEm&Ou0tFP(e%sE9tE^tMozsgJ!R!huy~sTZ}E-*XXjcq*%4$UEen1(b`tZB4&|x zDVi-;s^2jn@&&$gJE@elT=Js0O1749s_C`Nf3%sz%2=NWZe9u(OrweH<nBc9ON}ay zrcUeJ65}!5G!Qe1LjKBVQHX^0$Q6q(H$4z8f7W75Z#<7yDPYYH<MoqOS80_=L}ok- zgkkwiP>qNmh;JTYLzV7H^(Q@dAHS30$)X(aX?Rw7-cEw15mxfu%3fqjjIti#ZsXBD z{BTe?yQ1Lg@Y=_QLBcbo=NpBmYZp5&enmDGCmY#FaNB-st@Ku|R|||J&@8c>znXlL zqEhYsqed~m3A2hdo1E&nR-q^ppM={TgZDe$LVSMGTGK2i#r~X|T5~kBm9itgb^eo# z;nHAv_^6thz?Q>uZ(3w7Vwo$&f3Q7oF7r)!MR$|ih{u@6>bC`n0tbd{Y|ghFhP(7L zvv25$H{Y!7>|Q5G<qV4uniCs!nqIZ5y>D?Z9l#H(YFfRv+P3;*rMNye|JHeG|L*8I zS9Hs+{I3auL(AT=#y}gv8e(lS;W6QU2tRDt)2x1oUER+<^mD8-^$T3<BO4<-rW9ak zoND?!!9AvKWsyF4^`|~V-<7r#%tp8by&}E!)91a50s*>_q}4rY;vNsZ%52z^=*q8@ z<5$AC5!_PVu>8$@J+x*1p@WOV2eXeFqmw@tqK@<lR~VnmtJy^wZdna@&92@bM<F&x zo?x;tv2l_Ib54YpjnONvc%nC>|HcQVkgsFcPam(Swy5H7ZN3lLtS2mAvUzWlU!!uz z??=cFwG-61Szq(>=KSiWTRu(eQLS&IJ@!_)3Y75k+pUqmSx+Y?3Y697TeqV8_j>kr zh^+H*LBhxQq2`%z;q|H(vz9yCT5H-fI`b(Lnhqy((;IX5ym8@0TcdOOdlX5DBPSU< z>5Mw()AQ1YlIfFw7F^R%R$kN$I$k|0)fsUc5h`Fid3iEa&BiJfw?FZ73O|}V`XXmD z2i5KuQ+)gb_miWB(A(L|(>4$xCv$uI=HXgL_*^*m#w#MD87YSMp2(@^LEVn!r_w_d z2MTpcPL{iM<SHjYIJ-A_T@5Tu0EiL<AU+X*gVVFV3P7kd06&}nP{{>=%^!KEM-Koh z3b?MeRmAMCIWu2$ICtOgk&U|XH}1s_&QG3(!U)hPEf_9=j8oc6hw7<`YDWSA-yFyu zko$mq{8}fym%(MBGOZibrk6YyrRjyHzt6H@tBm<GOE}j42pf%e$MG<Dy%w)SF$>ml zx8LrY9=UXQs1~;nc{D95bvgDLI=}}hC3s+n)JM)`y(S0AT`ovXXr#ixD6|wAGU-s{ z%Y<VTj8qv=Ld|)!fhVcK@U~Ea<oVm-Ws`RMKJXJH3I3bRse3MubO60)60|o={!cly z-E=chj@;=%tk}S+xMMFtI-Y2<X^d=ag4ELfGTU@Pj#RPX{GkU0c4vduT#`WRxrl26 z>Gda}+JN2q5P9^{2Hbl_3fqD>u|-P{kX<E<fDSBuJBMT6KM4XxNMU3Q&KR(hF+vZV zvPe!y{b90rnavq7BjQeTpEzI_(8r3$I>go30cpK;+c;Wg&^zF^{EIO@kYuz0sCfU9 zb5!8J(uJMh%PxVVRNyj#$v0fdaV41+JHB>Akd4j4=7$umYL3ZJ>D9eG%7X};L`jtY z?2$KVZ31D<Q^ALrLj2c59>aIRvFJkEx`%_NA79hOD9z1IWT9KaIqK)DIY0Rhu~s!c z`Q_t(n6B;KfBP_Tmd;&-fu(A9p(S#0rRiEQf7LFj7vh_*5-r3?`tss%-0nGHOkcxF zmB>U{OV_hB{{v(vs2A3&Tyy_KXmvy1u@zv(1)(a~a9`E#(j$Pd&@RGdL;|fzb}P+k z-qB#*ky#5ecOEi_mD7TpJuer7u!^veeL;=$G`QT0T7aDCFM*JQzeNi`{u(AN@Ynpc z*E8YYdOZ{V4_*bp{~-Rq4$5hYyq28|EV1L(e_YAVln=#}co|d0U$C~A3e7J;Swv9= zR8P6g<9Fmk`>6TBtJ!w>9oUEYo&t#q<Sm2EHp^BE6Sv*L_Tbo)Aj4%@KJcm(D<rEF zt+C;#j<ztVY>TWm+^m7-EVSRa8r(2`wt8aLZ~K@b?5!aCrpL*a;Wr{0ZvFNqF{auu zNOGXU2Y<OD3}1L0%*s|>f}Itj#u;Fa9nsOk<Capz-aBd;(XI!aU$%VM?jm*vtrkxD z{Kw_zGsk4jfgXR{JU+(s%BkHqkJ3X-_p#r>Ibsd6Wx_}BOuO>2+|?`pu6-38b>7J! z>&@)p*y_jSjT-fwyoQ?B6NkSxa^Texh~M7GD?$eYvsr5c+n<f>ZoSX%+SAA+d$)js z9=G$GD@H{qHQ`QW;xU}tyH!}<t_G3BLU&QJXbm4Bdy3Zip~;1I->JDU7vlG=gKfV* z^E#n)Vydx6Vyf@4^@-{AuQSC=99PCvg||k=`+|NS4ZIQF-EsIrfY)!f{L=(Yhen3% zJgS&<lYFk3H^esb@6QxWNYTtVrqsv}i}uf#f7QH2|2qvD-^Gd3_Dh$cb($Ff3;~3+ zAdo@|&$6h0FO8lVvTTwLR?9hwRyoVVeywf8Rs&5kMrN|5X|!x6rwbm$A_ZErz4KK< z=i#Euy?j04<Q&YWuRAiGm+|(ca1=J*Ks1&J+qXnY3EA1kQshDrs2KGDf8<<q;~VSt zJ<9~g{=)aa`1?>Xp~`Xajquq!W}C~<d-75sEP*I^07Hh`oYWE{7xTm&8DkU&6dK5! z$Xn4QRXC4Pko(TlpRtqPiUXE#jY3i>d_mC&=;6@txaTAkyZ~;o_hH=Qq-V$nUSJUP zy?2nuY%>oUF0AZ{2Xxa(;<3rgw#XdRa|7A-QP?RL@V39yJ!i9_cy>Ji_;pj=YM9gg F{{YO8=Z*jX literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/icon_dvd.png b/plugins/snes9x_gx/source/images/icon_dvd.png new file mode 100644 index 0000000000000000000000000000000000000000..c8e735698848ea0f11021c65f5120cc731c58faf GIT binary patch literal 1227 zcmV;+1T_1JP)<h;3K|Lk000e1NJLTq000~S000~a1^@s6at+^<0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU$ZAnByRCwC#R$WXSRTTbaXJ>Y1XLgod z_77a3QUO~iP{Bf?!Ne9?AMCb<m}sIt8LfRX@u7)HeK7IW3MNf_@m&%PzR)N(wg!`$ zE-A&`g0PgIg@yfJ_Gfl>cXqssvC%{tCNX{DBsZDdnR~u_zVn@PhSD?*Ptpu{!gdJw zzngKt7yYNs!0z>;xl@24vkPihbslkAU-mY-E;t&!y(ZCaqd7}1y_*XzE{DDkhr`nz zk7rG*YTC7HpF<D?tgfye9Pn?eshBoWy|0cO{j9srH6T-hHOERc#aqEk4tM*p<E<|a zy)?A8zW&Gb^z_w|Qo8Xt<v*6vYE=bgpkMcWICP_Dxb+pGp0%3{8g0<Xe(f+#gJD?8 zDoNJoPM&=J()*VtXqvvlah#EuK1x-!0t00lId$=^FKM^pjL2cQqzb5<3c6Z_Mp1i! zG;vHB{<^otB8rzUe{fY4h26=?$?G+O4jdt4q?~;(y!ok7>2vO^x{*+w$kd6bS_lYL zA)cyWO&oZR2Z`#@IZ2XupU-!NW!WBG5%zR-jdpq+y`{}<6f$O{Dve<5RTNnn>39m6 zXa&wP1F5ba9MAvjY;$vSlkfcbcgW+t0|Ry(Z9d&#NwJxH5^_dFN#ziZ(MYeS5nb3u zPFBI*U&8v@CeEH4hSTXJN!L)RlxulKUtiydt_a=Ur@9#40JB;ESFIqI1ws!VA`n<W zIuSuKmViZ+u(GlOhGlT>><Gy@pePDShY>8xcy$4aB5&u+ED=YQIHJH53dkqJ*bZ+X zw6uuL%`hDG_3$>eU}ol596#0uGjB$@T!Mj!D4)w3bpZ-ylV+>4fG3~~!w{-0U^yew z=@ewSKpdA*B+=AXKA%H$Yl{fRf(lV^?fYyttFJ7G0%H!B%T+8YAaw<bMA?0!8$aE= z1-GXGb#+!SCKJq78yub^1eBBsp`S948Z~o}^SQh(z-TN!Z?ii(m0}S_BPj*ih~YD* zu}g0L?RS%V)G?$yI{G`v>PJ@dKq;2MYZ<UKMW~M~>H@rb*FWXE;2SlOuJMRwQN-wL z7t!`iE7n2_;Hw$9+a<^@19oy8l3@q9f(vRPtIY);PU&iGcYeDw<@e9t`sZG$q#zoP zp`yrWsJFnu(NI?xQI5{QC<eeamr(JvU~WrYm<ujV=!!6zNW{j+#y)<!rKPK(vC&=I zOQqA;i9`^OM-kgthNNauPbEo%&y!rzu(vg0Wl2$P-~9TMcrv}DD?*Xb7YGFIjE#@K zO-4^>Pe`P`WLe&8XM$isQKL}ESJ9-pFkmNT7ymta`<pM`jc&|MaJ=xJeyRON$>881 zY8{^l6(@)d4h+24-roL3zL2%=5?YJ-G_tXEh`AV?9F(Y;n)o5K_LYA=@k>6%p_rC& z-~Xe&d04v)Px@pe5}6MMgCF^4XRix_dDvyQJ!_MAHd~^~%iD5DPQ`zAHkcmlY-O@0 po<lCV|2(7)e-jS@_1d2T3;;@)%(;lR7exR7002ovPDHLkV1j{CI)MNH literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/icon_folder.png b/plugins/snes9x_gx/source/images/icon_folder.png new file mode 100644 index 0000000000000000000000000000000000000000..14fab1d46cad338044c142ee96186f70bf06ccdc GIT binary patch literal 1323 zcmV+`1=RY9P)<h;3K|Lk000e1NJLTq000~S000~a1^@s6at+^<0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU$%}GQ-RCwC#R?Tl4RS=)|_U&%G{@B?0 za$-`aBvq8A6oi6$t2iK_s1k=>I1~wS<Iul?e}M}J#0gbMa6t&ELNo#i4zvwa>IXCm z0X3v`Qm4VSo!xz3%&eWNfhwB=%86%<?cHb3Z{|0@nYYYZ3x~Nl9P&DJK=I_o2k)QX zv&k5PD2ia_*euM=PJxnLSXo(hg3@>}G8`5Ij~DYfw|H&odP!;+t546BIkV%1Lg`l_ zyv?Z>&RyCU@L!ASi=YTR$iR-{w;{)IYGGc~^8>u*ySyg2t<BHP6d4ye-}ih5Dg<Fa zV@xljhy4N3*`7^f3>=xLzIWo-*t>-sOgM#H`AGGoaF}&54zOV0QAfgHSOm}IfZ&kC zJFufv5f}uSlnxIM@7dJa_>;BD*=I(A1*sK~qK%Fa27}`qHXgK~9T}LO3cvx40a}O? z1<FVc{OS7GUo?yvsZ_Uvb&O*PNg_d^8Kq%)^*(&@^)*;;Y=P@=pyo0dkV+D)walXx zG69vg|1^VHCR$0%79A-v1$5om*n*ACZDj6obeN&WeF?}$pwKcYWqfZ9Q7A|fBp7W< z=kAO!oZ>V{YwuTmg<&8HBxY#1a=F9&OhEfYyuE9%THBbM*j>@4fDELhTG>7S(pYCH z6D)8dFhG$B=zxSMCPyZ9qS0X#m`Eu<b=>a~{A6i1)|g!?(mi5=C<mKxZY|FQ{OICk zIQ`NLR7XnCjp@$@c5)DDT}0=)M=3hzh)T6G>AhaslwHyj3{oJ0n*&UmZ@&KpuHU)~ zQ<Ed`)*H|D>w*%XY^W{RuF_bViNSk}D76Hr)B2Hti-7h3fW9Z-VXF)6I}P}-)rQwk z&q1k}Pbf9)t&~c_w3wlmy}qMt(+vCSC1Z{z1=<7kp}=V~;0sva=(10~ya}6IZ5(Sl z?LVSR_Khec+m#H7<?)_U1DJ7kTj27rCVm{p`A#?XPt1;=I)1eL=1#Ybj?A8+E-@42 z8E)KOhS`}KxENFqlql6D%S<UVL(lWdI6v#1ZntiYtkx&TPMutMxo*&%N}@hxz1rbG z#R(%|b@g|+kJE;xPpVQ$VlqA|IF|`{=FFMxN~O}pA5(NCZ5)T^s@hP)^c6_zB&&_) zp&a@kW2~1oI9+6#9Z`=gxp*_X4;zg}jOzOfzfyF*Hae$zHAz+3lYyna0D1|B#6){k zW0M9&b;UQ|ay^g<xVX5;gb*RtXcVKg8fmdsGA(=A@&0V18m1$T>WE71O&E)SF@DB4 zK}3@a??EPD5Cr6L9TnC@yyMu{g-()#MC#NLGb){~7z&<$KH#ZtwRO6<@5xxY@lFQ@ z$BwQ}zj*e7@N$1<0+OV0MV#~Ru<)Z&o5F);!-+aAq%{HI7UO}ScrP5P-719P&C55w zUA^?<did%qtqX%5Oa$Th^31~7cZMhDe=x>mH~tfkj7{PC7q2ee{_U&JKVCZb+VeAo z%EHxfbo!^}+MSi^(fL23)|%XW7{Nxf^DLf*Zx<?4?SY}fc?|XnF+gMQAbq%dN`UW* z*4B1=ab>OfbFNq}=S#!)xFgyOpOP5k>Ei{Sl~5fD*2A#;X`xcTyS?4Kk_K)2PM&tA h|NkKTU$4If7ywWx00;E+bT|M2002ovPDHLkV1nZle!l<! literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/icon_game_cheats.png b/plugins/snes9x_gx/source/images/icon_game_cheats.png new file mode 100644 index 0000000000000000000000000000000000000000..e45c70cb00237b2c9fc76bd565acfe23c8a52d45 GIT binary patch literal 3550 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 Y0P+F|tB!&Ne*gdg07*qoM6N<$f_QAVP5=M^ literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/icon_game_controllers.png b/plugins/snes9x_gx/source/images/icon_game_controllers.png new file mode 100644 index 0000000000000000000000000000000000000000..be2747acdc20b7e8b3ffa31adc31c070db14ebad GIT binary patch literal 11068 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 literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/icon_game_load.png b/plugins/snes9x_gx/source/images/icon_game_load.png new file mode 100644 index 0000000000000000000000000000000000000000..19c11d35e17a45794f1c1636a8d8789353345d6b GIT binary patch literal 5705 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 Q9~(x~RMk^yR<eux4`Qj^U;qFB literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/icon_game_reset.png b/plugins/snes9x_gx/source/images/icon_game_reset.png new file mode 100644 index 0000000000000000000000000000000000000000..43663736cb7ba3d4b273e48d8a939f36c4a2f34c GIT binary patch literal 5460 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 I5P10i0GiR7xc~qF literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/icon_game_save.png b/plugins/snes9x_gx/source/images/icon_game_save.png new file mode 100644 index 0000000000000000000000000000000000000000..121c462e4651c27bb7f11015d7e5d8bda8a4ce76 GIT binary patch literal 5649 zcmaKwbx;%zu*U)E5Co1+QM!&$;(((&JdT#;q(Qpn07;3Xkq*fdkZvS|L+S_-P9#t1 zMjGV#d;h=p$L`L2XJ==3X8+jz#2e_TQ;;%|;^5#=XlkfH{>2af%!ZiopHCmhVE+Y1 zUsY3IL(f;f0k+;S97P9DI~a$iyR9P(0<(1p^7;w`;otz8G*uL#fj{;v&3stq{p7<! z4lzVgtQ8#a5<xRN77J2Cy;0#Vexn!V{FKIQcRTFA+ZO&(yz!HU0fb~T(|ChQR1xqv zKR6~NYgu;lr_~e=UutP_j`DJu%+7XUd0viZuTQTJx<_cpi+td%oXGH(B5)4Q2T@x* z!~i}=GzkrymK%pp=RXNo!}fnAFe%OdA>lxB{>u`n;yd+iX!BgjdUG{qU3d5Q;<L$9 z&B(DyhLB%C_jf7pP;711AmK6Z-n;I3t2e@npKqCh-$=0#vWFh^_b+;Wrck(Dqf~rB zD<vyy5puK|;lDY_8hEi3z?ty)FI(ffqu03xTD(AS@b2!eY}$!-edU4M;@^SKiy&RY z_X6O*dyWcS=kKg<OV3PeL~yE!D^L;pVg^omSJ*ydP+?E<vO1h!Ui~K9+9dQL?yuU9 zA6dFjCuLVVg^6a?)@=9x{P`wE{(wzBG;l4}5TpQZEy{0$R5M%#$-aHwj|k^F1=aiS zeixdO5F+Bl!2G+%V}|UDQ2F|Ux%#KM>y#zLfj`#I1S~8p=8vwQ+9{1SmL?@p)LPY7 z;$+)y1dcduZ;rJ`?}3^#XT!;&Vg_n1j|ktKhuzZP;~~NyaM39mufhc*YZ)fxJ#QpF zUa4~2l-{Aq=2c^~88i3y_l4-t%5K?LOI_j7lWVN)tuEdiT8((rhE&Cmz_fN!l+v8T zR7&BH2s2Zm`&A-^_Ty=F_9Y`DNu|xr(tWpQgXk^+oGU-34ZWXH9D$EHL^j{(GY=OL zAoPPR{jE9=_DqNOd=nSa*z~z+0yixHm(z=|hbr96#al+9CFBv$BSdo)si>o_R|&*I zeNR~NE8XnmubDO~FOHg`_EtK(x@5EA`2v}DQk<vvYbwS-m2rw;bI03Htt)r4qvGM; z>4_=vTo?!$epnv8Bx;L~Wf-vk`c`A+5uE>RDtYH*-_+CBaw!XQ1NkR}<@gzSX*azh zO6TuhG4PjjkS>ff=eEvPqeHvslx;Yal<ya&O_&$=gM%;~Gd>U}H9D1qU!jjiFOSKU z8|<dpC|6$SSgh)m6fn@uGB#n{dcPlD9KPrj@*bflcsrtc8Lh3jHDX_HSP*#E$v#m7 znh_w^(dMj3M@8AzBH4n8N3h5n+*M2&&N>1S11_tgdJ^=6%V3l#yl^O^@e3bsx=;kQ zkNUp_yk(7`zL3Km=^(Uw5<L=EsPK&2sx5h~Bl*?|l40b>I7-1<Lnf2q%9Pm2);`-H z<E8dHUVKWxc(y0Ob;^&`w}~_@?G=PrDgH!b4!<IY14%bxPLN@f08cE2@^d;V*Y!1l z083TI$Q6*he6MVZPBk%y+IR{Gb4>KxOceag*M&g{#;t9WNn6E1ETH>fym4TVS8+%X zX_E!bA-A*_b<eKHLp<?lZEGtr|4bq)j4fv!<+EHQZ~#$@bniU?0|?(mi6o*lJ#_D3 z>q+$Ap89!t9ZQZ21h_30l7J`UrPoGOIKKD1ewkusGu>8A#r(bHEk!B-pc~V?gZGk! z%RnM(&DA$2(ald{*QmRXks%jgH6(c!+r*LxCB6QYu3sG1{NVmp2#ReSdY=}RswAuS zJI*ugXUZj7+ZeE=)7nQtzF(<ux9$4*dahoc8lE3Z4OyuEvG%nBzk%O&L_CfnPsULN znf6VZ<gHiVZ#hvuKFF*+K+(Kr+r~6mB2V|@+MjWWW|LtP$T@;~HGOQW=JDX}bE}B( zn`~grF5yTpfUD!{Tp)u~VA4Z=7y35gdczq?m->76tz=(OUCZUgMJ{s+0*<0Xu#j%l zftU+H%TMsLFNl|FqL4abMrLZ!nHQ;F_yn~y1HXioeeg2yM;W?H$RP#i>j@Dl)qcmX z^`brK?Bp3s+DQPn^iz~-Y9{@Z%J@8uPux?VT8e-XkUPWNt`oF2W*>_Z7fO5}rzF{R z;sV$~@-iTjrI?jQV^q-zOQ4L>z__PV6aan-GHBFSdq-2XEQ#L28N>Xns9TkY%48*W zIm6YjS#^Mo&>nO)HKN8LSj;fLFU2-+!v>sw0<`;vl*aK9tw29wFbmds0p&FzchG$B zavm6)-ZV3>jDXA-^oz2L{Q_2P<t8YQS`t_qUK#MO)QHJfxN57#@)8xa5jb1VAcTep zU422@AD$_JTfg(?)C1Yr_yp;dCC8K{wez2nCje=DG+15y$YKhr-O!x?R35odnKvxy zA=Kh_cv!|j^BCJiVf8M<0l<*trR^<qLQ`4%4vrK7{fdD;iVLdx9Cq`}uXG%rqsT{q zuXb8uM+*DGMkiJtY5~=X0I3T`rUFh!{zw7f4z$lR)kw7FfO!~kq=I|{6`~C3fbzeg zJwLdAwA}d&UsH28HK9L3lQU1v!){zs<ClRckIlIwQuGumO3pfrZ4hMeW|N{e{m|r% zz94dqYT}c~8tq8X0|!|xVuQFef~2{LxaC{52)|Kf5Z%?u=lb&tOe5`wo40D}(nqBi z>+1%>Lq%|22^J^RoyL$=WFhz@>pl+lsXohBTs7?f8Aa4{=)lk1dw+L`Hex*~FC2gi zVg^G6SbSMtJK9<;Yj*naT4yL`r3tNMql?lz+Ee?R$(;m^MMDMLK+Kt<*`X>w+y6oj z$SEhLn=8Zoz1yw@OBPj6e0r)@Ii<Gh^x1qaAQ#6B(XNn%ELc2?x0Q}P%p{W{WM_Qm zOB%C<ZXu7-WK8r?K?6+Kcc#umHO9LIzvUId<U{u|1&?ftmNUMvzh4+@&ObVGXpAX$ zS)WH%$9ozcU;drgy$`(xGzaWJylbQH2g{QmbGmGd3wB_<G6#bX7h=vP=o*Xj=UJNU z0%xi%x7r*w`!ehZD{Pf~8VGx4OYG3szYD`ah3(2=Qrl3JA+tR)Rz#88-Pl$vci@F% zz?CzuCcO01cpu8gZXs*n8<%_`YkH0%Zu(wqV2iEd)_4&Km|r)9C0`GvjBdOUcM>+5 zJ<%tWiI3fTtYIb`oK|aFGxf4cvD`R~JL>(L`>k|8bdgz&umBWP|D4{&xrN}jH;Me^ z#685S$~P7@4DlHZqGot*9YnA*$1KVh!s{ea_*@IFB?}1}<#?+4AP#_EnFxmg|1#$q zICCqfgkKJ_L#enVeKJ(EwH!v~dWkHNJ`!)gYjN@IYS0fpL$gK{h}(098uEJ>X-%0{ z4HSnsROhrx=1H2q^iU$}p9X)*8iNJ4hY$;MN403p)@9KZ*3dYDTGz0$?2#oynrpH~ zSAEo?T0s}mzZQ9oXPcEv&5~e0z3@3UM@D}@Jn7D}W%nD_bwGtQc<eHv85A_|QD@C9 zP<FHElX?%q;}_}XWq4%oD5{>j<d>K7sy$`tKj?}5(l~8rUslhrZ@m7eqtcP}Hcjp5 zzyihL96w;(ELOAkK~gALIS!9qm7H&%q!$(2^EXfQlO%7Z&ce^1EC~p?fc4=Mi4KWR zJXqs4cdp_ZO<Q78w~+;ch(X~w9+Eh+TJD$w?u=17JXNie&!T#cEZ0+ql$r&xyS25I zbw)FB+GSQzndLywj|P7Tg9&h*E%81)cvFlu3R$hvE`HC%5JULfb2)KiyNgP|B!4q4 zOf|YHY$|#xC9s2sS?L3{zVXhQo=@Es!^xEwbx%#j@%vQUQh}3;?M__v8~39nDguKb z;|3<{8Z4)hO{^_`KMiPHZd@*5gER#Xv1!`{+sy?sp0Ps5xM-=GiNQ1NeGbw@CdNhM zAnCf-aPGmNO+RhT(OehcpF&@bBV|*Mm%Cx_cSjSB#QdV0+ysvG3U9r31pVZ{y>Gnk z_PdEg6oei3*;&?+JEmF4$Zs{aOtkohc5%2h+74#OogNhkyzVe)(%H=*9@!2gj9SKF z%pf3}%lv9+!ko(3)@Bv$^4ns{xcXb!6CXFF+tl{$tw-AY2s8II72OsOrRuDgsGGyj z^;jB1+!1Lpkz5x=so64K1LCMkb-A1*)~Y!H0!5!f^^L{Q?i)J~KEPY5=woaY&6Yp+ z)W<n)ePo@uKS<hnF#LXl#wp|O!$cyOZ;X#w9RBek8xJd%`b;^7?(GZ6`Fp*}7@S`$ zrnE%kDJ&C|j#<n<j6_~*H!?A2=HklmZ}gF+AHAe~miF&}`@_p@#j;s(uS7mebfaE8 z^2k&Tb}q5g=~R|VF-9iS9e{k0NXE4L@|!4^^G6L;3KI;ki+@PHvWOAJv-^11sjxRY zn-1Y0IO83qDU>KTCTdh}EMBtwv47?SPr}@<%2)v8pmo)LUZ!=^Z6X#X@3|#sZT^&8 zX<=otl5o|gr)BAWMzeR^0GMY}BEF;|$~`G@nl}0hd{^+LILkGH#)Y>+qW#TXuprJA z3-gZAcgpkLHPozehcVu)pdy)K4&amS*q1H(Q{uqhKMA1?99Dvf)}(7grP4izTbB$h zs3_`2ECkDprjw}-&8Q=%f~Ay6738s=%J2kS;~sY`dC6GIZpYKYLz9K#<mSkDgph70 zO6T9tTn(zT6o*3vh#xyN=QOeEI=7F<NKXkzi3lJZ*FXhXHGE7zKeuTsad|+q3Om5M zaw(WgzjYw{;|x=oR}-kl*<-i3$x|(Ohrms@FC6-0F#V~!1e46%u@fmO*3l*>C%am# zic~v`r-Q1HjNA-5N8Pp1Jx0wz7qQ*W<~u19$4gh+(n@5_78gHSH@}SEwZ7KjESNX^ z=>?3aox)7aL8I>RQAS+TE7uOvq#=hF$d$W;fKvP0E8#;8FHJL0{2EmHau2$jf1W{f z!8R}v9{9l6I9pL%f~{3<UZH5=Ea!N)d-^fG+|UW)%iLLI_!Vu;ATWV(tU8;%$Qg)h z{w>28s6AZISVZyl9aLwuE$Aw?OdQv__0!yIDM2!@{N}61idvW9IvPr3;dA7|!H4s| z_4n#Oep<zzxw?Mxaxb97?aaApXl_o6{f)LAB>T<zV;D;A>C>`oYRdFQBJ1+0Nmseg z0Xxe;dmGXH^@TeE%7m(e>nyGFConna^j<<W3~l6=C50m>iOS|}r1YTY>+7Wkm{S`j z0a-$%Ov%o}e5Y@DmrK86yVT3EWzSgT-3HI*t)eqqVCFK6jUNPyh7EF-5%XM(W7!fV zcJ1OmtE;QT&`g4}(HYZH(`)hyJCCm3UOdm27vS%C)>2uzFn04v)SkPdXGS7yrPEJ< z3ZBnp_<q|tVf%UF*&8&*!e6PY;dGuWY>JhaY)p5dx0j&)^OcNPK}t|Xf*Y-zSUq=M z>PRD}EOaxfpXvw7vdUQN01}3MPc{o=M?LJnsFsJjjVK*7OBB&Y^Km$jDy@GjX1-K} z5R&F>F%+S@(~doBVeTyjubs00D8d{lbCW}y_77S694SRnx0AY6M#w31bA0xG%@rSR zkF*Xch;U@plhf7Z2UETzqp!kBN6_-y0_(7R9>2s&R28L3=K@d|M|$&Bb&|80bx!UM z=G(D)d9~-f!riXb_OD;~t*vb~KBs{8H(0{P@`1`iZ!lgyx~2cME)u@7g5mUI{rIe{ z6HPwM8@ao<Xi(22%J(^m(_FiA*dDU5m6~6(*KD7kLu1z5umIN*-_|O%sDl5SBOJLi z_6%1%viP}gGIQ&!*<Wly*IrW(SJ3?$XXJ^D<mU?4m@z8qcbf47az7OCLqK@CE!{)) zRCQk`WrxcKF8v@`kpp7Wm{Q!()Q_fX0p7*5rHlIs$;b2+uf8@TfLwxey%>M3GDXMR z*I!$Cey1GXVq|1MZwrz_j?NX9Bcr1UXxYEkYHd9vmc2MQC0uf;zRINaXt2Ls@#JR3 zdM^X(xVUyZM)g!CGE!iN6wB1CSdmcP`JIDT$PR@ZR+C}9HkmC-rm|_vyMv;`0fn%` z5QfRNk~wn~@XqTW9`;fxw&e|&`<l%Onc-|YRG+Y4ViOcr^xWhLD^?s(Kd1pcxA5!% zkbrypz6;haO1gTPH%z*Pd`JG!tG~*#UNH_}2f<C8Vr<HA_s>a8V}P~U^z~1m|9S&j zhrCqE)MraykKu)loO*aM$q4!<#@Z6&Aw+^H41t5?I~!F-7zXt1i;MQ~@Q$#b)vfwJ z5}X;SBW!%GhNn$l%m-n3N(o8W{oajXQb<?GBR}j7nnXQO_floM2~DFXa;Ei))|E^B zS5G@R9*(TmZc+<^9XcEp%lpNC|Hf(|kTf@~wmWPxxkPN>>WVZF@C2K7;ilS^<UaF4 z`V8p?Tx;#<16BC(Ag4hX$B5cUBSY{k^zss$GDO-bQdTQjPgyGU$!~)Es(lT>5YM!7 zv0A2ozNR0ZN-FRPmcl6_`xKQ1EH@3t!F2ES^vLBZVIILlNpy{TCslOPut>aLYio}J z(`hcJ+b9i2zNIflBC1M;4gm!LiKh*Fz627ayOczpeH^S~Ru&dC_LzY>s$VsvE#(A( ze)jpov<5_ymdW}M-Q~K}jIfH43PS`i_U(a8#!SQB;hT%D5}Xg81jI|tAq#I1g4_V{ zqON=rMsf@%J1Ti<TiyZ4K3iy#DYOAY(@0#obl4t1LVKTBFLMjSv`;2BcO3B$r#5`O zRjH9oLf$EZ>fVzgo!F26m3)lKID^C_UJ5Ct$qsTq=HC}vuN#--{r5ix2v!7`j)1d1 zm7x#E`#kLvZy@sb>Ki^Dm)^L}i<s^RpE{L^^uO)lNak+q@}@m*-D=mWM#&)@qb3Be zB#zmp>qAWpKciSuK;HJr41ZMuer`qCgU{g<OSn2XC$5d#zUDSb?<OiS28=~Ntw+ie zZZOy}>uYQ>ph(+%d@`i~J^$v<*&minmn~p{$RZv3u+yUvZqz#LU^|T)tkcFfIoZ?M zi8q%(Alvl(wA}C#R1^vn2(HhkAL`f{u5U5dmES$zU*u+EBLlyoIA2`(`%J~4Cb2<1 z?Q#s2kZ2e>5gq?G`T}&&F;;Zk?!HmDd2HmJnmVwwwB$kf<8f2vq3!+Ea)=N=$^oZB zdd)ld!sOaE>~bykD%1s!$C?YSpQ_O)$PH@~i3n||?pB~~%nRTyl6$Z7q#t3Oes*(* zKGI&Y`^pq>3<CocRjk!gITccHMVc0|=OXMP@<q}@A@fcWAEupt?eFdFT?D6C`yKYM z-{;)@;!)tkhS1`bjCzt)9$(2cvnH!ehTq+8a)+@+zl;_k%el1>L(qGCFTAfxP=F_9 zD%|~<t%I4JzbuCx=dXNxvG5M21S9(ock2AZnEyWk{Xe1To@&cIjSbELL@T%6BWds- P<HgZb)l;ccvWfg3gMY>r literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/icon_game_settings.png b/plugins/snes9x_gx/source/images/icon_game_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..b47dabe0850f38569c86c1efc612d09d8b2d320e GIT binary patch literal 1098 zcmeAS@N?(olHy`uVBq!ia0vp^OMp0mgAGVdK6CRikdiEMjVKAuPb(=;EJ|f?Ovz75 zRq)JBOiv9;O-!jQJeg|4z`*>*)5S5Q;?|qF-2RsXL>lrX75G_ao{|u7Ty*6B|Lhu- zeN3}8RydUGc=*clX5^&_Tlc2MUM{;oeNN6vt7Gr>-6=l*_HC{}+d^gyZf+As1r-J- zCMPBZ6;uYCpOU`u)c-$myXQXr&~{|iky%GJ9hr0_;8EBj^+M&3%f0UZ-*VgaM3<n) z8gCO-Gv6Z?PQss@9<?8_|E1k>X0~Xjb0@pxldCtTSxnsFB6w^<<)W28<{l}3&A7Sa zPtc-XC61ZqwVnDx?^V|s?<)^)UzOo>Y98x#vGXcrLB}QsmaTcP(?PuIMC5{(zkQFH z?90!T5hzmQQOf+YJzXtxA-9v*#AEko&1s&JJbT_%D}^T^Ez|a$x4o4$`I*xRrOOpk z(k8-AVmE`AE!4DLuu@<Xht#~|7t%N)IqWW5H7?&_u-wV4D5u?B?)b}B3SzNmCajvj z^5*vAed&Qh$DN;-KTFGC<d8faY(A^+;?c(EdbgFj40X>ZEv-MlpTBt0rvJAV>usym zD||DvYVnJmx%Xer$)4iqA+NZ2<@c#4cRu-87yJ9g?pf}^Uqw$TqzLWhOx|^%YVY-F z=N<=bj5}8_Wud_(!&kf@DbMQ%GbR>2aO2Ls{(jH4RNI$DZRam}eiZLpY1B1K<eYBk z@r{X(Pvz&8cpeh&{{7*`l0P0>efcGi`%kainvgK{%SRETds8RP6H-j>?w#CJt+T}C zgiDFlvfvNtN~%t3MQu|!BF(<!oMkt^o9P0SyVEVRSI05D@qX1lb(d2`0oP9_eC6qj zQ~!Lm_gwMoEf-eR-e(mq*t5Jp>_vFlop)1$<h*K%d^i<Tcxqp3nl^Pzc<j4uk?rG( zR~b^8+usz=Sgw*<z4U40*Llq|OzxgtXrNT9obs+UFfOR*FR#-xwN!I<&Hjw!mNVUa zFQpY<&)Jum-QwcalH$`jh2!K5Aw|#o9-R|_s9_2RP=piA0W&SlgN!QsCM<0_S=^#h ztE{4+>IC$UQ{<94v!_1ih~(8Yf4+3N%ZW!zQoJ}6y;*~uI6N0NPY9SXrTXnRCMTzv z$EL7@)Mp->;v2rXx<Wan^iuixq)Ah@CJL&1DK4F~<@Kz0_m=%$@tQ5Ns{Z)f6WOOr zvv{gbWPO>U_2fc}O|j{|`$|q>i!VfW+gzXR;94HK`s&+Bo;ROrmmK1J8GZT7D%<_l z^XGcEv@AM4<(KtVHJR1B|HVz%w2<fO_IE6Qer~zF_Ug5ZUnV@A7L>2IOL?QvOPdnw zSMk4gov>JOdph4CgD1<`gUqmIJ*P`74HFnRI71)oXJBTicfXP5u5RT8EF2g-UHx3v IIVCg!0BN}S0{{R3 literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/icon_home.png b/plugins/snes9x_gx/source/images/icon_home.png new file mode 100644 index 0000000000000000000000000000000000000000..b1fac47aa584903336871d38b786d2ddf5b1165a GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h86P_-PAr-fho;-h^uD~?I`Q_vnLh^Ps4i7gAB+lRz$Zy-U zx8Vnm-BBMGiEV-%t_v%aLwa<W6Wcr$J3R%BrgX9#?f{Z5hdHE9xwIu}v~h88%y?il zLF90O6qoS@(T?(o84{Zo?rvz?b?DMU0fE&_ADI;X@f@jfn8SJ`hlS@C>ygV1KZFH7 zH=SXSs+uO~?Z?Pz({ky@0e6LI?9Zn3w<JkE$#PTLbE-pkxuIczWRH}E5YLgYr2p;9 n>e3YcHM`$eUlAq3AdtY|qoBG&I-_7e&`%7Wu6{1-oD!M<)Lm+7 literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/icon_sd.png b/plugins/snes9x_gx/source/images/icon_sd.png new file mode 100644 index 0000000000000000000000000000000000000000..7f12ae83532fa2cebe5cf752732131af6e920d4f GIT binary patch literal 644 zcmV-~0(<?5P)<h;3K|Lk000e1NJLTq000~S000~a1^@s6at+^<0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!CP_p=RCwC#mc33JK@fmvckgm{1mP$h z0wWO-p@5P!G%2WPXe}Oq2cS-Elpyf{6v?~LrZE;pIz*HLi5ST~3S(Q~{mtyzSP`+= zyG3%voK|;Q&CNGIyE{vaF)&S`FlCuKFmNeUDwS_R5UgvhoyG_ufO^O6cKd6$+l5-K zRvaj$++vKr1;ye2YTFrt&*018Ln+-%;+S<hoqewewNky?z63V6jOGT$M}&vEI7cx` zqA#nZ(%dyp9TksI^aC<ehUonsLgZM`$QUCa(PZ!R2xiUg_Bfz((Gb(W&<1OxBxot{ zJ$@)m`Oc@;5Cs|()*DN4=atfr%NMJs=?9oi80JhrvS0w}zuFLm6c{n+fR<jsMpONK zGas&e*<A#|`QzzV242p@aPT{V^D}zv1^jcfa`<jR?37{yoVrh?IJRX_@FI%WynsN$ zL}LB!`T{r??ww6oR>L%HmA!zyUiUNB!!Cks<k+`ZKLvP3b1xw0yljn#;cy8PA_Go3 zncN%S7-0?MjZiR_0dW}Llg4B~^xO_-gp@uJsC5R+n^HQA&`fBwd4NzPrECa9UHzm8 zi>B0j(b%8wJ;&CQD?-et{ZDxTv8n22vk52l`k(_k?m!mUN>hLdeZ>jHsFFsb0o7`C zl%{*A?eGsBut2;aK$0Y}7cdON?`U9Sz{#u=D+s^BthEsE3Y}W|HzKQs^FPM7yXR}- eGq9li6<`47&R<(tVmTrJ0000<MNUMnLSTY;av_}n literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/icon_settings.png b/plugins/snes9x_gx/source/images/icon_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..690763fd2e241d9613ad405b185f604579dd2e37 GIT binary patch literal 434 zcmV;j0ZsmiP)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzR7pfZRCwB?)ITVNQ5eVZ_rCd){K=y3 z#b~%AvPxvJh-+X}Ho3%LL>Wxvx@5AVOfvXWltD&D6ANx8qL|3{(R1oJ-EQxB?^B=N zb55sUJ?}a1n`llZ1Fcr<qFd*8n8#62qMizcfAi29KVlHectaX{=nOn6bmkJYfIfVp z7PI99ntH&uj?=z@IdnMdBdFK$i*H~TuCb^swqwQG^XwZahfs|r+~N{V)}C?9_ynF{ z60c}OgR`d+>zIxbSfS5toT3LcdMI<~xAw}r{=sIHK&g9W>I(Z9u-5XZ!kX{3k$T4% zE}ZpMWa9*y&>@^T>l^ysy#u8_H1ynA-zs)cVZ__;g-nt5b1kV<Hcp^ve;CJZ`-D!# z2`qI`c|!l%Pgws$pOWwV5WUX&L>R;?_n>aDBUdVJplLs&-+m+N<VR9Ypb3?~{DIzt c(O&@u0Qz`Cp3HOR-T(jq07*qoM6N<$f@y8aY5)KL literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/icon_settings_classic.png b/plugins/snes9x_gx/source/images/icon_settings_classic.png new file mode 100644 index 0000000000000000000000000000000000000000..bce6d72321a6adbc54b53def5399950748263009 GIT binary patch literal 7662 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 literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/icon_settings_file.png b/plugins/snes9x_gx/source/images/icon_settings_file.png new file mode 100644 index 0000000000000000000000000000000000000000..41ab9940cfaffc1e663277edf104914afd7c9739 GIT binary patch literal 7169 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 D*q_OZ literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/icon_settings_gamecube.png b/plugins/snes9x_gx/source/images/icon_settings_gamecube.png new file mode 100644 index 0000000000000000000000000000000000000000..1c113a1f2296f3f79fab7ed28899b69b82259b11 GIT binary patch literal 16094 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 literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/icon_settings_justifier.png b/plugins/snes9x_gx/source/images/icon_settings_justifier.png new file mode 100644 index 0000000000000000000000000000000000000000..b2bbfd828bfe263f4342828d855febe22fa57992 GIT binary patch literal 7628 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 YTYUpPKEw(A)3X2tSrwUTDbp|i0}aoc-v9sr literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/icon_settings_mappings.png b/plugins/snes9x_gx/source/images/icon_settings_mappings.png new file mode 100644 index 0000000000000000000000000000000000000000..36969b7948144d61498e00161a35ce5fcbe751b5 GIT binary patch literal 13082 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 literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/icon_settings_menu.png b/plugins/snes9x_gx/source/images/icon_settings_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..b0c86c29f103f428917876390b1667ac6a2a9c2f GIT binary patch literal 1236 zcmeAS@N?(olHy`uVBq!ia0vp^OMp0mgAGVdK6CRikdiEMjVKAuPb(=;EJ|f?Ovz75 zRq)JBOiv9;O-!jQJeg|4z`#=G>EaktaqG?8Y=03$5r^mq7Qss8gocK$V?U1m|8L&2 zDDXoghlJ7z=eW~--_v$;YF(ZgYjtVUa}{&zlRc+zSYH0V&Fr)hvjDfP3ZsGwgA<bz zlY$B=1H^Z*+d3ofSk!A<-NN{!fJO0(rXPR4RIgB}a7OA){T80~E^}?erztJpPCRkF zKmEL}V6pnQ*;@_Iw(n7Dmzh|hQz*W^>4S4p=)9kjPTTaKEIDHI_09ts?=>fi?Uw}x z&r9rFej<W1>Xyy)>HFIzJbk_O^g2Q2tDZYu7B7>z)gY-+xi;(?zlxu#-maKUvxIY( zq|E)@_+--Uppy5>OZL0k#y;8=+gYlvyk*wqOL77yw_K5)9-*Q5tfzXVpb`7q^f&rD zo^3u7{^j)4O^Wi?O3&ui*iD@AA;!*2_R{%)gFpLEL`3<#m8egj6>D4hMRCde#-^lS z(yO+rF8%g$t=F8TMdxih@AyCK%F2lMnp&v5bXp`=#?jv=itBu$d)0ixFZy@-mjAh6 z^4n#y!>is~mpAAM&HGd8)z0%gxZ>VQj-BBJb$SadZaMvZ_ax5b<=6IkJLEd-i##WW z#=j8kdSft0Y^o3A|FFZJ8Fve_p6qq-yrLW|Xyj^`x8~N2A}OOV9uCfi2@Mk%I5=U9 z%FPk)Bo&h@S6Br;RN46ZTHvh5Q-t@mRqu3q6>wWS*rwTbnarArm$XDVZrYWKXQuRT zPY~8=Iivr}M7=s?*8b0&C#P{coY>ZKWy{QU3p(aHc}SVcUOy@H)31fa!Nb9Wp@jv+ zfKm<~m)cGCtM#PD_x8oV){&28GI;WYOIG>5a;4xVVa3pSqQZ4Wu5O={o|GQpnd|m^ zdSA8g0o_k)w(@Q-(sR0J6!lp#J|rOJwbp@npJK<VzyBtj){5_#^4|4SY|EZnr>t8% z;Q=YzuVsWNI{&v>bo_4dCZ|h}K2LsBb7IN!XeH!?=&+sh<h`5M{k6L%JlyeFzV+=& zi`qP`v%iBXF0Aai^5R8X{$t;}m8;Ds%&?MP{%&9P>6W{HwTi#5l9~0a!|TLFso0Hg z=iiNAyY<(cb^)U`6LtmX-1}5<ThAw<@|xBk`<LgU@|*4z{7VXcyz<F}jiNUz568{= zeKy$k%>t*)waf0x^v*i>;ce!M-Fy8OMcmez^~|MDrDN?0J1vX-Z|urHtT9N>Icf2D z=bF9=btUm{iv4Tdi@&5Vvpkx0SmeFX?X^a)WX`d6UTpH_7r5kq_i5c`*6S~SYF=M- zr@VJ=x8C;+YD)Ktc@J!y^j~dPsaCGfX@=cNZog&XmtE5Gk$8KrO7^zV1;etQ?D7** z`$D?Hy2FxVCfi(_D5bm2{-JN`)kWKtlBYz^I}(u+@3y;Y8qfZ}oUPxIY9^%DN#r)` z6e)_zF1*-xm-EOQiL<<=D%rvF%CGe97iq~UJib+d{jOo~^FJ#pZs{)D`LOPdlAERq p!%iO50svklfJ%af_WMjc3?lab`5I5mmI4-244$rjF6*2UngGUZHMsx) literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/icon_settings_mouse.png b/plugins/snes9x_gx/source/images/icon_settings_mouse.png new file mode 100644 index 0000000000000000000000000000000000000000..f836b124f04ca73c48f74dc3ba36fa6ef0123a51 GIT binary patch literal 5037 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 D4E2$p literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/icon_settings_network.png b/plugins/snes9x_gx/source/images/icon_settings_network.png new file mode 100644 index 0000000000000000000000000000000000000000..fc53f51224f653a98c985cbc268438caf5fd82fa GIT binary patch literal 7205 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 literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/icon_settings_nunchuk.png b/plugins/snes9x_gx/source/images/icon_settings_nunchuk.png new file mode 100644 index 0000000000000000000000000000000000000000..55052a1de6bd638ef9fba687bbdd565dfaa6345f GIT binary patch literal 9654 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�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 literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/icon_settings_screenshot.png b/plugins/snes9x_gx/source/images/icon_settings_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..6cc3a45a0b100a3ebb6bccee06084807142b97f0 GIT binary patch literal 11719 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 NL0(!#stRNn^gqiq=}Z6s literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/icon_settings_snescontroller.png b/plugins/snes9x_gx/source/images/icon_settings_snescontroller.png new file mode 100644 index 0000000000000000000000000000000000000000..562c80eb28ebce1e0e5f236aac0a0cbe58f390d4 GIT binary patch literal 10158 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 literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/icon_settings_superscope.png b/plugins/snes9x_gx/source/images/icon_settings_superscope.png new file mode 100644 index 0000000000000000000000000000000000000000..88fb5a17a95b20f9e34e732b8a868e13a2f28c01 GIT binary patch literal 5431 zcmaJ_RZtrMki}h#y9IX$PH}fBQYy3%+=E+jhY-9Z!5vzl6e#X4#i2Mw8lX50PPyLA z{oLHm&FtGZyYKz%$Ik3*f{}qHF#$aR8X6k0ww9X7KQ8@;cX&Aea>m5+&Of5_QMdFl z^|1Hxe-E}pQwDk1*s*H6y?3xPv3m~+^cuC3M?<4r)>cz~5wLRf#>w^dl5dwsft2_z zkwXj7=udVN2Bzf(-i3xw1b!U^23Z)s@PWT+LwGinl0=vi&|)WJTCMk#j%}^sZ!n!c z&?@gNYKJc>BYOA{LB=4r?53CIJSJ;0yU?$~9;Y(blTcNwOc0#XLE~DS`OnQS!R!3{ z^{?xLh#l$Zh$5>VadHt66|w)q|40An`Tz9)*8X{3uneFA4o3F8Q2-8flA0C5)~ah= zsg68_DJiLFsBiT2YgfrnL7kB8bC8;`hzw-B-!~XrJC7iVLk3ck9mcb6sB^vJ{VRy_ z&*yI+9&-zpJ2->99Y=y9ir^Q9Zy)QL`{NY%e}tWOebEYTr#^<z>+37mG&L<ZxWPT; z4Jp<A;&-5WlH;i<`eSYG@ent;NLJ~HcP02zU}A+js%Ruega(6_&ZY;9nj9-1kiko_ z5tyruAit=tch#j-he&4&KK+_*hc^{#yT)-)Bca7<%8%c+@gbg6IW2>VYrnO&#x|k# zt*;>+XML9rr>*|hctXPe=Ke$y=ZP`w&BS!9W&)c2Nd4L<JeeyOUhs)^4T*z91&uza zn0yg<rRFw@H|j~H5NXPj2$-GG!MdSw6($Gd0_L!7EL)pc0W-dNH=zm@eWab|C?AB; zm%>}4pQ?G%H>)^Or9GDq@*E&4^qXJ%<;vUV*zDua7N8^pg48!DS--9cTd}ias6#ov z6;crO6Lmgplgb4|?AY6Su>=6Fte=jp9}LW%CqvEDwQf?80S-1kiFh4KL>ZVYCajEF zle+{i7sUE=tUMRAg(*i2X2Lhr2ft6reAitw0LqUu{B?fJa(=~xA@&y|9JoS?4_Ua| z^1_t4qqVZcqsxh(tP%o9CSZ7Knflt)Oxm2~+d0N>z=gbl(;_NDIXQ0#4KUrS-?kF0 zo*HqEWJw5f%DtTf=B;@RLoi<Jel}&=j{qF4Q}$w1o=s-^@RdAVq*%vo-rO=gO1`E7 zq=oGKwr+nIVUd@{>~bae{SIc%An%+b$K5jbk!_^6KwV=bg%to)Vw*}Ze11L8eXSVc zZ<4Oo)?H&~r6n5IGO!&GfqX{DdtOFky}G_Y5s`#b#?o~7?nw>Le2aP8C>@+xUzi+^ z-#a6S`KbDi{#Zph2~6AL-7$HIcsUkmvy<bUzt|LSQH3srY8ofw!47}%ECd<{;aJU{ zEcm<sDQLHoG%{{Oem-iChRyOaz-;ze!n3%X=x>_}v#zTKczgud&2E*jsFMVqM9CIG zzhKRp#rCRTW)S%+n%uf!k~Wl>31$O+zoLGd{b8aetb?9cNmoM%!IFTGdp=uNS$ufO zTUywA9I1MSsECf>$)o8#;;3S>Ipo5Rp&ydKbA2|dW@~C{i;;j=i(tY79x4<ph4=Si z%3(qYwX1XR9DC)et{NibX_E@4TymR<n6xKBU=;ys3-PMt5GO}V1+PD#%YlJtYko@Q z&vLcdu?DkiGs<`0h{;k{@X)i-^G5pGlx}_Sw)Je_lE1po7`7Vr)le4)rys5l#Er_+ zP_$JqX;es35yTPU)Czm)5v`S48@$uDG3j(X=FlF~X946>#-v#jIN4N#`<YqjR{_^< zjDGgg$hFe1JD=z|!>_!Qq6!0nd`$OLpb`$DvW7!WL3MoR!`R4j7zLJTX7n=EjF;A2 za(T>csTkNv-qA7}D5kKyXJ)o-L3Kl*NpWx{vWP*y9vdfUBP01ylj885a-P78>P*^Z z+nFuxs7)o8myhtE@{qTwILHpb1=merBT8?4`;2kq$Z@b37~=GaA*Fr_iFqslEjBOQ zT_Vl{iM>pR8K#5Sl^=@8oX}Nl0>guEh%-4J2sfh$%k7j}T_^gVQFb~ps8N4D5}%Uy zTKR1j=VHG<%~ZO@$LP<5aQO1x#zx1N(O(5OoseD`4ZJm}gcHZFo;Od{C*jDDp*e?M z&$x7i#+z__ryfm7ppGwr38TOx0kFbjh@%*b`UHI?J6NX9;pu?o8Ak`|G0cJnSCJff zN1O>i$FpyEn~_6%Emfl*vG#riN%<P5U}1Bfr+&Ztb4e2dLAP^tn`vVXEJSaF?{uyD zGMuLxNf)Yy*L$8E#ZWscwOE$o`+o0(m>$CC_uF9veA<8wul5+8%=F(XRf^ItN@O8| zfQ*D%pTrt1ove+)tPQiaZI83?2elkah%zOqVTS^hY*cEaZ}iWuxAg09B?Zhz_V@@` zp#1AJbadk+72Q2=+1!M^%I=zvXTfZHnz@41wTpU^(8@q(XD;yJd~RNn;5l}lPtJ67 zh%E7lpiAY&DgWsL8<dubVQE-{JGrRny~meIuj>ziPdBaNNErCGBXf!-^Wt0m7tl*d z#_?_cB*ZlOcf~F~oF!7E1bd(vaU+x%h?8N@n!^+jN0y*gs`+$Ng9XHQ3*kc!Zk2<$ z7FkmRsr+q6>ptC_WQ7_)cEQ-`*vF$@55+t)lOr@l&)|cFB>LZ!Z$JpfeG<~szn2bE zQL%c9uZ=Jx@!xhxH>#SML0;g?GiMQz#O~$Ed1O!|0O(j4xQ&KtU4;x22iX@WlQ1w+ zuv6HI3Os)dOnZ;cMl}!isEHDnu-7?ee17!}8ih+5-n~~=PTOQAp&HTi>tUG<e6pr) zRl&b&yWVz=fsf`?^8Tr9Pk+hG<Q;+B@NfmpY=IxlXyHp7(SUoY9~9I+x_*C^-r5={ z78IDNr>EDJa7tw-RHk75r^SRGw~1GNZk`h0zu6flDd4Q3Zd}cq(o{)qOabP6k}H_X z@R2pdh(K%8srknJu!w&xnTFEMt>tDD)!f!Cn}r*5kejSODKeg^Mj)6<D=K~yru4ll zfdlc1s?t-mkvX#Qy7J$N?|PzbaeKAejHbh*9g8F4tAM#l!bX!D)6<@l(RYGMT84n+ z=Du296%{2iItKWWw?3MtGxiS=>v{jEo<x{amkL~V*Ew|drJ!^Nq*RJm{luM}xjWSf zZc`Mm%yJVOm_GSSn}n2=?d|ZnH{#CxBtQ$8I_zy$79o^`b-MmWi{fHBDi@^#sdJ!d zwzBHm83oCbS~b)#l7O4~C#STv;!}H1=M(8~N>-?%;>W^&jUnBYBGHZQ!c7!(dfCaQ z3OSzJZ5z+pc>^*=jfvw22JX!jteIP@{$$lrt<j(9br+@OL+haKPNLFMOy+XYSek+K z5G*Y5gZ%vORh9x9&`}V5L?M$=V3A1+3X8n>>|j&|{AZt+wX6#fzb2;h_UGNKhZfWk zsM1XQhXP-(n`Cz!nFPqv%g~e6#gA80Q<+thTsS&811-O(%L+Lc44l4uHKeJ1-ut-I zAz-&Oj^6&BL*nC$MTvgy(PDYUf<F_JgYd0=zbwsAs40e+f&Sn~+U5tX(Hr$&QnF>c zEyE?#N|^cr&I1j)#s?g=-;VSG!i?rdGLVL8-&LQyu?T$dlPu?4oRu6e6E(}{a;>aX zoNc4J1K+(H|1&?IEGx%AI<#|noNYJOwCf>6nurB<a)dF;-I0?Gv%5$vQ#)YFP^CR+ zDB;d^`GeDMx^J73vfUiK%7gXGLu(^3px%szvT~~no;>pt=b#`zzwZ=DlM;hAUyT`; zxFw2ZjH4b;wnZF=OixA#frU=)A+6b*!-}gJNmf6?d-%}0JmE?{Pqx<9WB@1oH&hl` z`n5*AbRIb3WfQ|0`L{73Pf6-iuQB`3P>q^eC)x3?WoNgf+-O@(L#vLSHyU5xFwIaI zwAIJ_YoLk`x<8EXEc#BpiRzaY;OB4fUg~LHYhM3G9bi0gi=X68>1+=kq@TPp_FczQ zwGFl}M?NHgWa~u=4pq9Vz=)vFR#RTt?D~jsHar{SZ1vBg)AfZT=_KgU{(gQ%!A|?L z<x`c_=}s;#`H6n&&#GR?s#>s{<Fa^BYCjG#c=#4bd$rx`z`&wzYH?bEvP>jV72I8q zH^Xus3?C(XyasbGB9uy$YwOXD?O)}*L3^*arCr)7!$^ReUZpk*Lm&>Y(Ptc+U9%O0 zWzI!e3pUo)fIFya_3ljzN1_|wg%V4$)@``HNcWb?IagzfA?4uq{ywO#Sj)-*D7L(? zkdJ|3^{&BtOMFPBXe$=~cY<Q*qW;wMdp$_B3fo0a7)mb{Fv^%O%+01LN69rR%AKIe zN(&%my15wqWmMnd`^wtDc(;o9e9(pMT_JiJyF;_<`fecdY2y@i|A<v#e#`JMP*M#n zv~+)4H`RT3c+$}r8obHq_?j56tUp-fXOf`vNMd83;V!bRZFTY_{|Y;RTKi+%{Z6Tl zUsKN=Yj0b7$!@kV@m8NG2J96*O95niY)HLedRki&&e8H<z9a#w7zjDolz&<~&(8M5 zkYy=nlya4E7o4PB3jI)r-Zx2;q%Ld_X=&LrXd$K?5&Za8+Jd@d)rBiaKM9R)XX`TM zwQ!Y^xWS7W&*`<3&F&oeo9R%X+585%yNur-Jq|L`iZ$bHDuO^A4d4`Qz<ZI{5}hLG zH!>ng`pP{i`B%oTs;ES}-R^%KWN<4S3a3)!=o`r9mG@#x|5S^>>GhWFp2`bG9pHS5 z6$v2rIwS2?IcYy-uI3~!L=C2;iE`%Zg$samRQyBM^E`5OxRr5mgoas#AJ#8v3T^GH zi&I>*_gNbU7LOl``cFfZ=4b2at?7r=Q{pi+!P{qa&!`{ubSC(BvCjYQ3>!$1p0qXL z!8|$^@p&;1K3rb4yI134bjOh%Asd!~r}nrlg9*$$bpi4?D`L8D5S_uNjHkybk)(PK z-Qp@AG$>bBtO)!!B&0(w1`ZT}GW^3%<5=oQ<|bAMF9+NCMwaO?ghg?AbA2w?-NVBz zc8lxncr+0f!<YeZvUn#mv~Eh%f5=h>$9<VgsIyFLrOnqHUDmD3`O}sLkE~}g2dmtd z(yIMh;*&pN{`hDXZw;-|<oh|RrpJBFP|3%u-EoX^f8W<+FFpLY9REdknaOh|#ygHR z=+bQ0z7*i@h0j;3`uD)_>Atz5;O~{_S(!5o8v59&n?jIhxD~iOO^hCTBu3{&0{Zf? zBJb;3?&;cBe#|c0i*f*ftb{XbEP5m4(&+d6uAXTEt6w0SxFe7`hb}^i31Jemq(9eZ zCqz;kv;1Wz`?me+#M#x=wO*9{VRswK5|d2Kipfj0jAG(%;+iA`Q>iuOG**rzsm&$! zt*u4=*w|pt@P+k)OCn)nLBSlXy1FfA=SDQo8i+pmOFCpm(zUt3XI55RUzm1!(6R}R zyXWRZB)V^e>()p>WabRBeD_hhG}&S@6cncV9$mN8=z<4Z7y|P?Eg?!#@p8IIwu^a- z3m$^=>bJ5I)@ZXbh_Cxn=IL_{dSWg2khJphaPx6cM`Re|-P!Ik&JkiS)AHp<ONUJI zF`Lu%;PUC?+Ug$EkfTP0Oqy2g-vbuww!C5ae&13%a}IuHSh-gvomU{*n<b1c8<`a$ zN&?_^IXzlq6v4m%qU`W|I+o{idRb}5BV<+M`uM(+?q!<L5+U7}4Ve9nh9)<IXJ%Q4 z<9Obv`?Mp&UU<WbH}V94<<km>K&68Z?l+(AmGk>!2EO}dc<gnKH&u6jBKI5;hj9bA z(`Pvy(g5kB&t#}D%9$Z(&$~m<7H95Rekcl#0!a_%3E8med(JPoX@r`DYgq+Gzw1Z8 zN&>HW{q|ccbo^`20Z7GiB8i(LTfnzCSl*HXlL-BdV|HzYEo`%)J^Q-+NmEKMqCz=Q zDW(fHs`-Sc30^~S$mVs$X#eryN@-U`qwCz=v-tb-<1hzJcrrya8GN2RD2U@?Vgi8& z&M;CnXSW_{Z~u&rgX<4bjg#noWRqfGb7M8WkTd*nDe%#PS)aSLFUXlSH7afjxi@z} zB(yzDPRrcLOuGB?@)ko8=<~AG^QTRJ+9q>~{a2Y*#y53VttMEIqzNOrt;05)Fxw3z z3Rd>n_%JaU*dqG5{1Pc7DO<KKqC=f%5I4Tp0Q?$`ZUkIOILKFN%6f|Z=$fjTpvnH( zLcb=UQ};QQ)@{{h?^<G1)VDD?KUY$PyZzqfpFhXPeqJj&1|jqMJ1eQ`n)*l+62|2t z_BX5_55xLNSz1za0HO)D^C;Weg9-2xuBJkA8=T@t(gCwR|7?*eY(mf(v{akdk`VT9 zXLhZ8KgjnG8CQ`Ixtd9#uA;k9pNAbjJnSsJV!J!(ue@`n|C+pH{j|L3zxf<-vvHj- zM?rvls3GTm=t2Y3M^;ogbY%VRHRj57g|!LoA68b|G^$&Pu9t|a)G`q;n<=wE?}u!| zUdZ1p#O>5|-C6BEUPFAWUAz>&SFC-pU1e-ET`vvN$xYfiNL9Eh(tg|eoJ9yrwSZm% ziAlPa1m=HX%XIiYObZvdgT=U=VW?0<O5{4;@i0s3fo=k>LCPlF{@4j?K%1JFC#3V* zZm4D0xI_v|{+JH~X5a279<k~7ifC7u{<~S*@q{4eS*S|xFy@Ep@$1d7srl~Ci>YC^ zRmm~>q6;O>r>cr>Zyb6NW5X44DXuNN3dZN);?9oYo!R%((b5oW+=$F_r<`U<Q1t7t zEMWpsyu#S09qy+O7>HZDQZ=!YmC$=fLqiMtNW^VWwZEYU9HCVn4dUZ$M@i%`S^5LG z?$Y2=9(+n74x%a>(zMd&S4~e3Gx+&5L>8(>x38uY?j7dV*Jnn9YD6rto<=DuI%%Cs zQae^6g1xR#{w}s9U(Ie6ovM+~hrAee(+VCR%r2r>9$W}zuU<9(+3T6o3G77WgiVxw z#c)(aUSDteI-xovU1w*=MFqx%gsw$vaHaa0clP<Syya-kkiWlN|0Ga?wm->cCSzaQ zFBa!H+tUePVqUV*(f*77#Q&uK-T9yTe^>vfZ4viLxCf0dRh)k&!N2<7ClpOv-9W8Y I<z3`|0E+}b#{d8T literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/icon_settings_video.png b/plugins/snes9x_gx/source/images/icon_settings_video.png new file mode 100644 index 0000000000000000000000000000000000000000..19eab99dc08466d1b7693c600360be59218cce35 GIT binary patch literal 3613 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 literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/icon_settings_wiimote.png b/plugins/snes9x_gx/source/images/icon_settings_wiimote.png new file mode 100644 index 0000000000000000000000000000000000000000..d337aec5498adc2448f4ec483798c602476b871f GIT binary patch literal 5108 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 literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/icon_settings_wiiupro.png b/plugins/snes9x_gx/source/images/icon_settings_wiiupro.png new file mode 100644 index 0000000000000000000000000000000000000000..69eeeeda0f8b8d4461ca059983fa46c0f7132731 GIT binary patch literal 10729 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 X?64N+9saMG6JV%oa=%R5KK%ayBr9>- literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/icon_smb.png b/plugins/snes9x_gx/source/images/icon_smb.png new file mode 100644 index 0000000000000000000000000000000000000000..5b62deb5eae63b79ae1c0f072cba242b37196749 GIT binary patch literal 1064 zcmV+@1lRkCP)<h;3K|Lk000e1NJLTq000~S000~a1^@s6at+^<0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#%1J~)RCwC#R$XWuRTTd2{A70~`<pc8 z-)2LTu-!ysqF7X-i51&uu?7(=BKRUmTTqcwP}E}e!HR-{Z@%;)s1;QDqTrT-G}zeM zNRp;)Vw#vH+1+HbyR$R1v-5Yo3HTC_?1~hHoWnc}_n!03Ip;g)455_bb_$2vEZczp ze?Z~y4*JRSs6`88UP5DK3$k1i1y}cLeD1yuv3H<as_OOefxwEH$S&&hqbYMSUW?|7 zX*+2Zi~?4X*oeo1feZA^)_|LYH>m!?y>kC+HO|h?qC#P<SsTtm@FU1a2BWh6&Z0YW zIb|)LV)wsd4=pRgzr=;x?jxbk_E|4Isw*Zkw7@*sOby3^X}h2zY{J<^n?X19c8Q@c z7P*;c6Yj!M0iLC@08JQs`sl$kL8YN7NAv7mQ?gi&&tY=dfHu;Cs6L5{vLE3`?!@jx zUPzCrR=&cA@K84%h~B{DGwj~gk^q@e&mKHA%)4?^4k;ut`~4Ws9gbGD&stc$yCxJq z7?K>hQ4QyBtXw;93ai6jBivJKww+=hI^e*G)}a2&0+iR8yC1d$l;MAv2O?SALILW# zBlz|$f51EFuke4}?6ls49AKp_wDK`DNxSScm-u<so;l{w;$FYi@Ck);ga_9dLD$nI z0cMf<d=BIL0tk;SW9me^)bVMXbJr1?bfMGY1}6wpn<bjnS@3f^9@^~*j7*d9_hxYA zXbWN<0Z#n_rcaiXQURip!2D1O^HLQ;r*|6dhYUs-29Q!o{+k@lT*zQ07seeSnMnPW zu5XB?BG8Q1H$*JgOykONMlF?qw@Pk&0%(kpEscmAuqk6GR?kk5U)r4T+RKINm8-@2 zw3!bs|E72nFD`keyV?1V>vq+sd%^>61BGjDZjVy>@X{21eVY;B{ydV;RaMFdWKn*< zi^O8oV#$;!bWtCh&CeZP!u7`^=s24}=DRf{C%lY$W%nUrNhm=7cmkt*BdLF7m)ZUy zRVin%+KJ43z5NAF>~7^EaThmVy@c~m$_Nowl7Bu+DN_!dR730b6BC>xI9bDQot_Wg zI;s1t;UbC|!4|zcP`BTJ&TY(#a%bsg5h1EK$;_LSL|mOH$1JLjXI&-aT3RMS(hqi! zt`k#q{I~<#S!eIRvMpGYqYL<BP<69`YFa(n<#wih)OXo&Oy?&qzE>yO6t{)Tvey$O z)D@|BK-T1_rsYV`4EA`5)TcrLSAsjC`~}Lfp^*8g!Yee#<et9YwQKQd>-q;miLS`@ iU)wg|e;)8p0R{k1ov3={`Ext~0000<MNUMnLSTXzBMATi literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/icon_usb.png b/plugins/snes9x_gx/source/images/icon_usb.png new file mode 100644 index 0000000000000000000000000000000000000000..9b6c82a835ebcacd7136185168883c6387db8591 GIT binary patch literal 888 zcmV-;1Bd*HP)<h;3K|Lk000e1NJLTq000~S000~a1^@s6at+^<0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#8c9S!RCwC#R!wUZSrk3@y;omdRq3R= z&Ex}g8U+Ox0VSH9hzms#ciGHr#I1iq24*)acjCsCE_5RZ?iKvNsQ3|xBH9i^VuDF9 zXu7THdUL8OgCL?7h|D4nimra|)IIl}dtSW~Yb}1}Q25DXlkkTR^R>mveN$+~?%v-H z@BS;Qd7g-Z(!7*{Rstm!+VMpx4b6#s-t!%qnf>SC`O7y>-<!Gru@a$Kyo;?yrVpy; z2WrYkPN;J-k{Y)L9gji3{~K_9aFP!&T+K%m%uinL&Hc#`uPRBJW)^W^BV{!DR-sRL zmj9-GWIKNc4xK|9wPCw!ut^Wrk~C8Y2mCCvX}z+fH5aG{s_BuikkY0_h9<vXe$4#q zP{|6i{bxwjg}k^x6@Yj!QgI-0Wz)P{2O>|!o+Ho<XvX%zKYj_OeFSEG0qDQywF+tO zf(-91qbZ9Z4&XRuq;iFW0WcJ*5!WcB$e@uxc>}EG1K_ZHnni^2F5HBy%<!Hb(IH#v zV6@?kR<5v{Vz3#R5mT7Nhk5$|_SJRB;%%nt!1_b%<w?l9Cy=$-(mc6)-NLOqD-+gz zw1z_65=}{o6na8>i^$r?DCHVuoMdJ9Aj@}1Mme}{iG>j~Vzad}VXu#op-4Mm49Ss> z2kBg4U>9}=UHaw*tD||mh;syS%M=lL-yG1}Die;^(Te<BBNW*eWwLjwa}h}10>PF- z+T19gFjC;gnr^GIX?SuqLSGeqL0)DalqRtQze3v6kZ>GXx(fC3EZ3Y3mzJchMi5jc zYzEx-nvTp2>2h5O&o^4K1k7LKMjeB!-pU(G^amnL8It<f8^%^9?0Un)%cDoJRtpQF z{GBQJre_86`Vp&n${e^Bo+$e#r5Y;nupW(9e|c}2I@OGh`~lz7r5{xJfPBxfu&q~} zu-)FiXW{iT^!xpd87UO~_K9barU@n{CMrtWT@UBx=8z-_iDbh_WothF{~uXO6N$Jy zIBITX!cM1iwZ%cgGVN~+p{bUZo+Ai;kuV&d{~~7dt8J6;e^2<Y00RKK;n8w<V}o)4 O0000<MNUMnLSTZSexN`A literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/keyboard_key.png b/plugins/snes9x_gx/source/images/keyboard_key.png new file mode 100644 index 0000000000000000000000000000000000000000..07d829893d5d5d8decef8a2e99f21a26463b9ef3 GIT binary patch literal 524 zcmV+n0`vWeP)<h;3K|Lk000e1NJLTq001Ze001Zm1^@s6jQ+T70000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzu1Q2eRCwC#Sg}q5K@fd+UO@pOqG)1F zL~YPesR=RGhRVd&KhS7pDY3%V#729+$4<b)LXZZ9NWw)t4zlacdB-V~Cf-Px<lRoT zdU<bVXK%Ir+%4SLQ#e$}BG|ZBxN!l)-OMYTQKD%Y=Ht;on7y^$(XqQ}m0l~*dPD>d zJaW64b!5^jfy(#z{DQlOGOgrh-EeJ1b~}x&wIrkr*5B2|ImbmJs^VN%pPiYh2sTq+ z<Tzk?A%Tt568be5kA@)vR&Fq+C&NBLV?tNVc`?*=%_m6I1TO*M$z}96m?`Md@fDPe z6(se9;HIGbX0c?b;IPG#vBlu7pya2Z_)&x7F8*Z~v#&vL?Bby&VK$5f|8r0d9y6?K zP>ySG1ZOex+sr@fV)m1S<t!fG2S>aHg=GF;jA4se->3yU1%*3%9fBX01#S*oR>vpU zYMH3L){#ievLI*MHY(MslhXs{DJ8{H3H3(9u{ub!+ig6RD<0P?Qt(nCsc>8<6cLNX z5DAA73WfeuwQjEm(=^dgBDq1Y{1@IabD~gF$Tyo!5CRSoEl2I~DZl_1W}k})RT7W@ O0000<MNUMnLSTZa#OfUY literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/keyboard_key_over.png b/plugins/snes9x_gx/source/images/keyboard_key_over.png new file mode 100644 index 0000000000000000000000000000000000000000..f8a55daf05d5832e9f5515deb72971452f604b33 GIT binary patch literal 537 zcmV+!0_OdRP)<h;3K|Lk000e1NJLTq001Ze001Zm1^@s6jQ+T70000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzyGcYrRCwCdn7>NHU=+n~OKPpOgRKZH z3Mx*bZy@U6;N&C-F3yThj*3%V1s8oAg}#7D-5rEl)K+M%scn+$y=juhxSP{kPVzO= zk8{5NiTm4q@@iXjAljmMt17zjM27dVEIQRjB9Wx=>})J#J@b`p%UqG>wMgHG3b^OP z6&H4BYGyN5``XPaHEI=oYnpF{7b}$(cd1a?kQT=Zn9DC~jxMOwc~Ty$>4_p0itED0 z5Xwz13C|h@eK4Jw7T=hVYD|~{z+^Hd<PH>|4%Prry<^65(5Eqmf3Y0&5eI<c9)m?p z90m-1fOL@Ep96-+kv<3=u{%Ga0Xn}OL<1bHh&e=z=^z6-7>yWyqJ|qJ{3l`?EMh0J zl3+)SJ`Xa1FLjWc1qXb)#RNV`(0A0#=$nOTA7u1H6ZjwjT#LyWrE@Xj%|bY0cLc*N zb@mX@>bK#x{8qm+1nhO+$!tAQCN~EGXWJ%yemuHuz2iF3Mzda_Zs$2TLd7Mk-=cQo z!Dqcv2QNkQqN7Ibj`X%QmCloq%Kq=VVfWl52PV0txBM6WC_Wa|Mdk0W7gEJsYTB8| b{1IRP1nN(2IzHeE00000NkvXXu0mjfjlS!B literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/keyboard_largekey.png b/plugins/snes9x_gx/source/images/keyboard_largekey.png new file mode 100644 index 0000000000000000000000000000000000000000..cbf157467b3945135d2e3e6ef2e7e835bcffd616 GIT binary patch literal 632 zcmV-;0*C#HP)<h;3K|Lk000e1NJLTq0077U001Zm1^@s6yBxI~0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!8c9S!RCwC#-M>o$aTv$(=j;Xt&CIeO zf_^O(P8CQrM^n(+e^AuaSTxmG&{BJUPfh(AS}F^yBtZ$y<gV{m?oK@}lh%8`;6c0b z3m=~6IWINV_Rhtzs%k^kiU8qtrRvNnF`bJCs&@4o!!TqxmEf2VIv=G^`Ko<q)Z0^4 z`gKzWWZezNa&}g-nMqCxp>_ZCDi?PT`c+R;@1`?W$;x6z7G}o9wmBq(*VO1xV~Wy2 zQTBB}mInIbGCxf?0BvF<EpyXja;Z8=V+TnkVqy^vz|-Fw6K_d3dm^fPkPyHXi5Sg* z=xA7+3E*+th3Q?Og8<Ed*y8IT<O2xqAi8^4Bm@xuL}j{hAs;};5sQQX!6Ozs2+*N} z*mMw}mDRR`&_RF>BNlhD0N;pZvx5L#?I5i)7l5E8orkdi@$ck(4gv%&>9((fkPqOu z9mJ-C0PG;Ze*(e|0{p&%@H8*bj=NYuw;hB}(t!>;i0~{H@Yj;gp#Z@F;r~GZb`YRj zmj7v9z84E<Ya#v-i!%Xy`EUbb(LsRL5zBe@su7S%waQN)04=K3uVz3>rLyGT-X)zL z<YW+fwOUOcb2%>{JF1RuZg0hi%*sG2#R(y_DwT@lo?qNQPjo<zRgJ6Ky1u@VWHKr7 zSWKePD5r(c_^#KbTrNwYP;f8lU%5SWZ}V=e%Bwmk7K@?_2r=C>_H;w}5nuo*UjFA2 S(4VRR0000<MNUMnLSTX)v==`B literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/keyboard_largekey_over.png b/plugins/snes9x_gx/source/images/keyboard_largekey_over.png new file mode 100644 index 0000000000000000000000000000000000000000..16d9ceb5b434b21f37d37c84db170e6536ac7d08 GIT binary patch literal 666 zcmV;L0%iS)P)<h;3K|Lk000e1NJLTq0077U001Zm1^@s6yBxI~0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!JV``BRCwC#-OoxJQ547VlbAm$rl2W8 zq(WO<Nd+IEs0*R4TnR!qZrh?yQ0dBU1vmOOE%*X1bT36PqDH|)N0UsZ=T2raccvz7 z*Yo|zWoELx@Z+2_&Lo+m9~%-_)%97|iU8?#tm`0Hk_$fE(e>4wWHMP99-C&HkUCB0 zQrxyPr>Fb6%<+o}$j2}omA7m1^3^gsh19Cw982x|&>T%Sb(IU+Dw&#Dm-5t-o_XvN zQmZua&h$}!P}DaQkoU#Wij*shnhnAMl*VT@4+~PO9(HGt;>e`d4Z;D03Yv-Dke<!v zwR&{e6(C@4R`mj6YKKRA1@wez$VHb_5Fi<mZa}npc(ho6l@B{0)&~F*6~y!Zs31TT z4=*u;&|(37S}c<f0s>e8>BK7t0Rd>Sfd6l?JS#B(k`=_Gf&j^gFoOX9(qeV52?!A7 z;g1%}WmkZnjy<H)VgUnMECK?=NA$#h(z%NT45}bJtO!^YB=)F@@VGk=PY6Rg@VA8U zMj`O*2*SgPzyOIEgdrUm&|)#91AT{dp2Y&<`AED`$oFCa{aP&Hn-zgrJnR<Bzk@}K z1y~7jqkyzqbzZpzEbZ2P6p-fQwK#XDGE#cY&LH(%*OA8UiGM!yX=A>w#}7{9mlTF4 zBv*LB4k5*rqb`k`6KOrw%;lb`AiKKW=-RBE{}l6UQ~9C>B|pY)AvHQ~)9<7n@6W=I z%&**j5AR}a>AKLh^Yl;^vw##cMPpl+^IL!c04TWfn;l%}SpWb407*qoM6N<$g4ez) A761SM literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/keyboard_mediumkey.png b/plugins/snes9x_gx/source/images/keyboard_mediumkey.png new file mode 100644 index 0000000000000000000000000000000000000000..789302269bce2b4bb1fbebbc91272e54c6c28066 GIT binary patch literal 582 zcmV-M0=fN(P)<h;3K|Lk000e1NJLTq002+`001Zm1^@s6X<&T;0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz=t)FDRCwC#nommtK^Vqgbq^YAW|jpJ zWOcFdRDncvEKh;gzClr+An9b+piABRJax+G&?WU^tt7aFf7xkf+f|cT9Cty2=Yf|Q z=J?}z-)Cl7C7Zh^OGms;cx4E3(i5*ct4Og9^Smy^#^>|VVk`nof9SLRMXh!x#kaS- z#Cj?K9^3E^(wme{t$~z-UQ6%v@bV^B(XE<dwJl|KQ?#>@AjSa6N$blCW|s<(T$cji z-rP)>wv&K2s#cfcw3S?;NA5&(2F4;P8Gt9H*=dz}A)*BQ+<hP@BfsC*2Pn`PU?L^k zZc6U}4wM7PXvl%!H@*Xf`wS42bRZjOVFm|!(83@%ehXs;x^y6e17&6Wnt^a2Qh1^% zj2Y;11`<-(gAl=ESTaO#4|EwKZ1@@jC@y9og99-G@fQBSGZ0^6kirvAVZ20KrZC>Z zUW5psxVy$+24V(IEQNnu2!fIp#9P<{el|b@4wP+S>+Nd-Y&4trwM|mZW~&ddUe~Ge zp;0_O4>BXD-ELE{TsHTC<bGD?>!GG;q^c@Sg+d_YphlxX#ZsAcU0|ad;lOKN30`M~ z!ZSsqQ3`XA!C(-y2Gr?xO=#6>)jkq`>0jB`m~&ngUin(BMxr1`3Df0-A-@F}0Ql?z U)lvAPssI2007*qoM6N<$g5kXTZ2$lO literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/keyboard_mediumkey_over.png b/plugins/snes9x_gx/source/images/keyboard_mediumkey_over.png new file mode 100644 index 0000000000000000000000000000000000000000..928e67d521c9dd5f91b6d2270dbe71b3364f5a16 GIT binary patch literal 599 zcmV-d0;v6oP)<h;3K|Lk000e1NJLTq002+`001Zm1^@s6X<&T;0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz`AI}URCwC#nn6nfQ51!*qM4zKGy<id zqE*yCh-%TIRjVLq)4Hft%c7NSgEsYV3j6~Rwr>%nR2pbDrp`?Fj*gC2;+q$=IY$oj zoaM*4@4olu1#Yi*sjW@+9(#kJLCUeO+NMzZWrlq$gFqliqp@jV`ayN$narlK#KTLr zJog3Qjteg}w?z|E>mW5il~Rt1Pg!|NwZ4SfWlQP#ZAzxscw~dp0L2rFQl}0`)~Nto zj*O)!nObFbfHxGx@df6!LdATxH3vqblbk!iQ_%=B>ok#IFwE(*Kt(~)Y&!rYdp62f zNiMBW_b(FY2Vn~!r_V+SEAsOK^t^z4B+zz#NT3=%yKfFe32T(F@B=_afL3n;0T3np ze<f^th(dl6Xd{7o3u(-O`U`0QROR=rgiTOUlGV2pK>~G37yvc9Frf=;ClH4TiV3uO zyD*Nkd@TdfME+(WjT33jbs!EC^wxpiNfGi{!e}B|O$2*k&1DR}3+t6I;bwx*jfgu3 zTIj;c1kEnMW}|{5eML1J)h@t#?Uju314ZLAATxwa)1ddaduJ?nw2ov@DrBiveRO*= z{EM57GF6IqF3Sr^;5mDieNcS5A-Sy@jwC1)jv;E^eTP|hDzz0dM{-O5%<aO5>;gOU l`H?3vG*A+{6SnaszyMOmI3Uc}!$trA002ovPDHLkV1jb)0l)wN literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/keyboard_textbox.png b/plugins/snes9x_gx/source/images/keyboard_textbox.png new file mode 100644 index 0000000000000000000000000000000000000000..081a63c86fb513c04e36920b1f385ea95e4f523c GIT binary patch literal 714 zcmV;*0yX`KP)<h;3K|Lk000e1NJLTq00EEy001Zm1^@s6&{3>l0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!Y)M2xRCwC#-9JxLQ5*)~Ux5Kk5fMcb zV<PH;hDl9`F^<Y)!s<8B=qHdk;cDU{yProVF%B*Q3tA!x#I*cL>pe{iE%nc7U7siU z<=))!EN|YPdrwP?OYfrPQ87=7SqK2=^|6?h*2GBb;c_uA(oLyUii=YdmI;6(KX!h` z-u}T{ar?HIbbXov<Z(MZ9?aj2`MGOW3V<G8*1yI3&tKCu{aRH?0g`TF;qF}AxiJ%s zhD8FP*Y(R6n!i$|ASt{|0dnu$nen(iD?9-ByQ`O`<JRnz_)s*F<{rq@L^<lh1Aq)? zPnVn5W`K+g4;Af0f&lPuLqnzG07=nNw<Z8&XxELAqX!xY0678Dh!YJ&egM#K14-?p zE<pguY9Ni{07-EoKLE%Jkj@4YDL^C$02u)iJpp1-0O+@YG&B$Z^3=QbKr|2lavMl= zH4txM0gxFWoejhu2mtv3($PR7?12C<K!7wi(H({bK!&>SKmZu1fkfj(1Cbv9<OE3f z9!Nt20igc?u?GUcU;z^LKmf=LkZ>9=00ZzA76AX>KzxY~Kz4w1y@lm0EC2=x5Df%? z!2-npfdG&jAof527)1T#X}k>$1c1B>($PSC2LeEU`OyxLx&{J3mU`>#t7d>yYqgLc z0OY9E_KpK&XJ<DyzgJ><`n;6^;E(qA_hW5iqj^6(dw+4axIU~@Dp4+%<J8!g6#}3~ zwOWm}^^MrwO|cPgQUiHi%uF%QR#!j8<m6<G7eO*QI%>55h=aq!W@v0}ZM7e*6!WV6 w8t?OBHj7!_-rkNh0Pq{BbS$Mp@=JgL0AIcW(%!OI#Q*>R07*qoM6N<$g1KBQ3;+NC literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/logo.png b/plugins/snes9x_gx/source/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..512a99b9aed2e768925eb87bf63af95eeb734699 GIT binary patch literal 8887 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 FV1k)UGK2sC literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/logo_over.png b/plugins/snes9x_gx/source/images/logo_over.png new file mode 100644 index 0000000000000000000000000000000000000000..1b8c03c45f063c0d03a4c45b9c392d4336c27bbc GIT binary patch literal 10463 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 VeZ+pNRYw2-002ovPDHLkV1hhgENuV) literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/player1_grab.png b/plugins/snes9x_gx/source/images/player1_grab.png new file mode 100644 index 0000000000000000000000000000000000000000..d95c2b35a7a3631944cd8ecc750b8900d9b7b667 GIT binary patch literal 2293 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 S@|(Xu2EdrvqU%h(lK%~cUmmRh literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/player1_point.png b/plugins/snes9x_gx/source/images/player1_point.png new file mode 100644 index 0000000000000000000000000000000000000000..19f94e8624890b2763ec47b403781848e555a5f9 GIT binary patch literal 2339 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 aCjc)S9ccy26&k-^4}gHT$5mN+#Qg_WuS^I4 literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/player2_grab.png b/plugins/snes9x_gx/source/images/player2_grab.png new file mode 100644 index 0000000000000000000000000000000000000000..5f3f6abd878649434404588d3368504efd36e809 GIT binary patch literal 2434 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 H8<6lH$%BXh literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/player2_point.png b/plugins/snes9x_gx/source/images/player2_point.png new file mode 100644 index 0000000000000000000000000000000000000000..f4b1232769c978c7cbc2b2f2e57a30a7d02d9961 GIT binary patch literal 2500 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 literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/player3_grab.png b/plugins/snes9x_gx/source/images/player3_grab.png new file mode 100644 index 0000000000000000000000000000000000000000..c0c3546ba9aa3b2049997b2a4314e9d3b62ca12a GIT binary patch literal 2485 zcmb`JS0LMq0>=MFt)sPPqg1Sms9l@byS6H7RjFCWCKBy&D@Lh`9-*ky+A~J99HVB{ zCU&hvtWbiOIo#g&`*<I|@ArHEUcM9?Ym=KSf-C?4+%z*awEIQR|AvX-SL1V|)qX)B z!suayedyDOXs_RW0qB!ZZ(k9!U@t#kJ72FSv0;P0S^&W8Y-R{`h*{WmO9<i~;JMx_ z*bidr^CPJBtKhi#SZOq&<|*kUL6pQNI~o;ntHoaK3h^c$X-+$6Ia4u<t)oa~>PaS+ zy)Q*n@FGhJYF@xg<H(`H9wdwV{0a#BAj&{EBkUgSEgiSdXD&958Jl5z0#{tM_eXbk zcb6{PV}+H%RZ({A7spZ}qU-=YaF<38VCVdQ%S8-Ig+mwR#UCAb7>VEKyeBa#(E+9M zl0$b%@zy>R;T!2GXLT&bG$Mvn8T@PTk5KUA2ULzQb&MG`6z@c{x(pmB;foIYhS5rx zfNAOV%}oNX!d@*5pEOlkL^RTxmOJGTZY~PU_XoBzBn30|j)J`^#Vy{IW3j448%4B3 zTlBsYc2$K7`OFtTgq^=oClB>@iaqwttbAZ)oz0v$BAaX@^~t(Wt3q)il}E-w4dk@g z66!pVA!KiodB-s_GSc7$|98n0zPbI+nQHg#pNj%O=Tmi5PEN(u)m1vMJBKlFbaJ{? zwSo=KmwB$}(rN{TzTitbMP7U7mq+0d?4jbL!hwK<J%44^;OOX`36u5pbrF8nTXbQh znVMV$pI0XWeq)73K0e^l0?lNID^|^FgT3yq99ZsdE!JvUVG(^P!z!e2ky0cAAFfJ4 zBVjM%SAMe-<NUfi-)L)Z|A%_`#+HWM{!$yCkdRP$UEQp80`Ys!w~>))>jJ1~rI?Ps zn+0q!G-Zw(Plr{X^VM8?V93f!r(YU4r+vsF()pq%nT;@BY%te}(ET>BW$QB~iWfeE zaNXj(es^X9Dye@~QC>d&XvhD&odxVdn6KvH<!z00TW<7YtE{YiU+D;^^MsHaVYcq> zH7bX{mYVw#E{P|fA-h2!&~Q0XL;XWshc4=K=koI7UT=)omv4u}p#pEr3Je$^NkJfe zSzr?z2Z!~54S(g(Wi8yy%+tRIC@_Q+kx2BS>`dqCB*Yn)>1?EGKzqhzs1vHe3s1x! zMaT<j#n_A#XgX6UlrNMEQ;8*2^v=}J*qy&A(gv6AZBgo8I~2@CEmtJHzhm^S;vk)I zS8BjFy74UBEOXAma0PwSy!@8jZ1|mOR>>IgGH?1l$?T8<cm_(-pWbsJAx!s&^bo)B zgrx(3;%fJYX6w;L)E~Iio3)uub~N}DD1YrXrTNGjQ1SMe?|wKlv8D`}lBKj72)G6N zDZW<IKeoN;+Qr=K5+sJ}wHf9Yt)oVgls#YN<SgZpYA`$>I5_?SGZRCBNz2z+(v5q{ zl+UK=I!V=G#oGRdJ~8&hmuPN47I^y%{BlSl2cO|GA!@Nr&2jyc95;3Qv*qS<`J~DQ z>FU~te^h%q<vEoZr<u1s%`N4pO$;P(T~xdEyp^}iJ>l2Odqb;+*aMxkx3g)}X@>-p zMx1DgEULQLbGfSEnTHB)J}M^wy@V=&6~T!NsPZFCCKjh^z`WVi#FX5~jRx;Ac7uPm z|7<!)1NW6zRrVbIE`!!sjsqd$Pxo>C8t?t8H{UlTSocp2=OV1$w3l}0&6Tv;ULDW| zosk*JW&iz9@#z4X6_vBb;J}_{&ij}ADO{^1Na$yg(+85~rRD^zMj+H9NY5(P>Ox72 zR2;Oq+c7H`_WhuZ%gGD^pBc|pM}9BKDSzC`+A^|;l(h5m4e0G94}V-~kp1#ir<?N- z_oi7xK#4KJ{X%KuO+Bh;W<Ckt*_i;K=@O*uO>`!pT(<4f=s~aef^uKo5Xz6qycH@u zyY`V93A!|kyqnFK*jq0@n+&LB<o0!8m(BaDKkbG@VEz%kr3}&w8qa$oGkEVS7h4Uk z_VQ<jLZBPyz>q<&>WFf3;&AaKli_A+R=x7Fl1#uH0+nAa&VDOt5aJ3L>SQO|M44(n z%E>zf1sqk!viH!Q8DCQF#!~oU6U?oU60|i>>^TQW=ZaCQHRfMBNcY)}E}K^-5+4yK z9WSH=7X`_2gg|6|Shf3!asXdKtizASbP@9g-Lxslb+=OUN^ilaTu0c8b%*UT`D3H2 z9*?W@vciFLi%qg#R55P{54<0;;%Q}?{!OdEt?@Gh8$2ZIXA@@c7#aNK0Rw8KXP<Do z&>gLtSp=x9!nUh|oiSHcq_DNa8{9<hZKnRzB}R8u?O7}56{x|Hhr*k!S&D>Rnmi_E zxQ6hfdodZhCUrWtzjjKF*Y4I`y)WElw+IA2JDitc?an5V+gjk6hhz7;Mz#<N<@n|G z>5^B`f(Oun$R=zHJ}Wl!Lt_~i#QEM<e2y<0xKO#qFC7=|m1HB|42<ln5H26U*=84( zqg&(WuRwpmk7!1T+^%%7DV!xo7UXVB95*lD2bnmNOZo!S*zPd|_I-DL*$QZ8lj?Fr z-m8N#u6e$@-Oxa0zM+p?UtjCF-BJ%X5~{_v=8d)8o%y=3vqfqzes9!HA84Z7;nc!# z`Ivg+=kW@(Zs#^{Vg2v-Jp!OpB@(c?Sg!dskgTjb@}8p;n46_+-aVtDl%dqqc$78B z<&^7h+v~ikk)o6$a7HPu7$S6(c*AvB|Dn3}Jw8MboF@yf6>$^x$tS9Bg5#w|e6z8^ zc(#xD<ag^k#Y*n2T!Vu~v#;e~AH5;1Z87#LYP5v&)St&pkwNRqE>Zm$`NwN%{vO;* zOWLdR^o4Jg94+ho!(d}mxS7ZRZ>tCHRk(H6Nu6*_c;V&R)nB&G^Bw}yFb}`(J3G&f zlN&alTl&5YVWdQw=S#UpZA77*r)Vq0Ex{$zadJ%0G`BVSk1VVt05?reCdTIT@!yUM zzX<uwOW4ETVd1-$d;&8d&eK1)wQ2P<C;<Zk_sK=?oM7bNEZFmSCz(-XW<Qpf$CNai zL@tPAMCbBpdVXiVVdopP(ePB>c^0E+40U@zA^0M}RBY0DNHOF!f7D7||7roQeJQ~| zrkTe5e&o!e8I`>nvcu0NsfC6McQtW*yq?2f6JHY`WrHWT6-vvH2xNR)=(YR9&U)&U yKXBGhf1a|Qyg-`>h=>79fd2my-7N$yD=^fQIFZ5Glm6?60cJ+lhPC>hFaHBG1*n(+ literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/player3_point.png b/plugins/snes9x_gx/source/images/player3_point.png new file mode 100644 index 0000000000000000000000000000000000000000..e88b90f235047f736868b2c64848ce9ee5972718 GIT binary patch literal 2527 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 G3HHBKg}~AP literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/player4_grab.png b/plugins/snes9x_gx/source/images/player4_grab.png new file mode 100644 index 0000000000000000000000000000000000000000..7e9a814eea6203a9b2044dd3c94d4d67e973226f GIT binary patch literal 2460 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 literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/player4_point.png b/plugins/snes9x_gx/source/images/player4_point.png new file mode 100644 index 0000000000000000000000000000000000000000..68bb3aa4a2dce8c43c2252742f2c7b94d2477b96 GIT binary patch literal 2474 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 BnMwcv literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/progressbar.png b/plugins/snes9x_gx/source/images/progressbar.png new file mode 100644 index 0000000000000000000000000000000000000000..87ec09d0bdd727dd4182f7ef44456ae97dcdb65b GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^EI_Qm!2~43{+>wzQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jikv)M978H@CD|<0JI=tY)6>&qVZmdOIwK%u#*BiQZ92{F z{C=rEJEjV%JA0@0xXe1{F^6%7v&izy6(0|~WX)k>kzgo&$Q0XRGXrQC1B0ilpUXO@ GgeCy%<S~K( literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/progressbar_empty.png b/plugins/snes9x_gx/source/images/progressbar_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..ddf53cdf437e92252f2a426c72ef2477714af40a GIT binary patch literal 279 zcmV+y0qFjTP)<h;3K|Lk000e1NJLTq000C4001Zm0ssI2R{hLm0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUyxk*GpRCwB4QHc%2FbJ~|`>&UAIE+bD zU8+7Q#t-2+2X_TND*^V4M4^)N4HUuNa3FdHXV<qYjh<>?V7{u^$fhqLnK4oVccuTA zn<xTTuFfM|Q43!OGK369tr@Y|v0))rnN|dBNz}0hXtua<)D!Ymu&Dfxi;~XHMiJWM z8<l$0GBX&w{i%l+_22Ui2bTtHoic@BWoJ}`4uL^BoZ7X^nXBaAVL4Iks63#=JJc2! d$Gd(43;^1lF~`Qvx48fS002ovPDHLkV1nQ?Z&?5U literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/progressbar_outline.png b/plugins/snes9x_gx/source/images/progressbar_outline.png new file mode 100644 index 0000000000000000000000000000000000000000..c4db064658be625e4505afb70edd8ba7f3b50f4a GIT binary patch literal 810 zcmeAS@N?(olHy`uVBq!ia0y~yV4MJCYjCgu$qRvN5`Yw2lDE4H!+#K5uy^@npa^Gy zM`SSr1Gg{;GcwGYBLNg-FY)wsWxvlN#4l%Y-T3b(1_q|>o-U3d6}R4A_w^7-WH|OQ zeaTsV16vNwE(Hl8StV|vx6GbgS-)9qMN+3IxkM;PWJ>8gS?Ih(ldW-rqEM%&poT^e zr(vLg9FM9;SIWv~0?eFo%bKlEzuvVocGr&o@;YbEy?OI+=buX5>l;P0lP+DGyPJP+ zc<_5x29LPRmC{!O;{QJSwDj`9J7+Dm=S8MD?9;6Y_l{m}Zew&Vi=kn~p+h!z-{)=r z7B*!a--+q#6X&kl`RMGqv$Nmpct}n85_G9&iEA25!`J)Vo<}FGQn@;dKWg38=<Bmz zPustv4`^fPw(8yLC;zmlJl&wopt5zr68SXws`p!$?&#YqGa-7R+tDM7XPsqW5M-Uy zcE)edyf^-rcboT%a^x61zIY&vp+TZ@(!F16EvlcbSpIAo_p_JDQ+gQ~>I1XpIc>>) zZua?0;7L1%2GcK+XFKBlq=+*(Fqzhw2ldRJf0LDAg2NWkG>1cPm>4`1Wb_rhL5u{= zI0puXAL%SC3=TjBf?{A|Vo*>3Mh2W>U}R(v5CFzBoN8!bVEE_naA_tp(Cn%`4No?6 zGbl9vsbJKcxTQ0ffgxL?lkG`D=+64NTABQ}85ph=s8pH$c(F~Ta^m@(B@DkA7#`ht z{#{91`|{;KcV>JlDz;Hpnw!JI(6P}q=tjQl<*T<ucJ{6Pw~z0$$Rkg#jiL++i+nDv zx!>{TjnDhXUyM(d<^ZKXKliIJ6qM}U!@}U<$LMLEbnAg_{ViZXr|#^N{hRvsXjpzl zip@8EH5FgaUn(!ftC<e$3fEZ~a7ocK`tNK>$(L0ZsxMoKt(mf9D&xc@>*g_T-Bw=t zhMnO9EC2g&_Z1hlw6r?zMT-h}{xYzg{VgRUXXEPh2iuqMEMsnX5)!!2nYZ-nwUdw8 c!)$*ucdj_Y|2A%0Far>Hy85}Sb4q9e0NyT31ONa4 literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/screen_position.png b/plugins/snes9x_gx/source/images/screen_position.png new file mode 100644 index 0000000000000000000000000000000000000000..edecaffea1747f58d01387147696fe22bc367a4a GIT binary patch literal 1372 zcmV-i1*7_jP)<h;3K|Lk000e1NJLTq002Y)002M;1^@s6qk_?-0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU${z*hZRCwC#oK0*LHxz*1ER!YK&BC@2 zpaBAc15%3s2`WKVskAD+aYJ0-2omiXj@&rG5edWrsRvHIaswnHBxt3!5(ubNRZuEg z3WS7^&F^M+U!Ql!gJ;I}c+~9Ac;e*6vv2J2%$H}s=ZPH$5n(yKPtG!sgg|co@Xcn* zz9RXAgdOKe(nQfAnI!p><VTXbB=h{_p`$kfg<TDZ9h99WIYLsl$Os;hTqOCPq#8b% zQ^5F+vU?;aEQ7()PLeAmqn_34y9~j&;8}*BRt}V*yk<M}^%cR%<un~8rYAMqLQM@+ z)RDELYYX4!=s>+*g=%#cCdZ%9@uFDp1<5h$HltD?1mg^4=Y0_UWf<PF9}0u(6F;aq z2vmZ=uwK~?N<c{3pzq0vXYlf$`(ouWHbxSZM*$!N;|t1e@o|M&#Kx_kTLXfBW`{G= zui@Y4ze2s{4<T%@{gR+8<UAM*!Z{9Opg5$5!ER6oqj|oeczpJ=5v|KWP@Mn_$#sHP z6Qo%`)P}D>|BD?L2iL;z$X@Y+2S|>KgX%#NpTO|QeghELV<0dVgeZl=8rZOLmw54S znPG4shq-p$@E+(de3(KIXaqtmv%0)VY-A6~ZVqH0*A`13Sr5Yh%!Y@8A62X%`IH0M z%(Z>_qWvI*XDgQ0i4AYzk!s10)N-zVu<V-G2<k+yp{f_qVXzFZ*?L|-4Z1?S-=prc zJs?!~?q(MR@5UxTmI?%j{kO+JC~P1KL^4?R4hVVlDQhzx1WM;mZu~UOQV@#wK&~1_ zFM)`5g=oE`AdG?VI3g_|B<&f4F!C~(Y7jvS*MUgtcH0U<j5xam0)!}5>t$LYw!Ic1 zb}0i3VMU!xfROtQSLt-MAcAf%l^~4c5JZWO?lK5jdrJ($(975iB2lE8JrD*KVmSx| z;iZyEq}nwQ5O~GcE)Xg!QN$tH0}&I4U`9Zg&Siv~vloOs)N<uxY9~O*enU$GLOxdt zgFtf&!AyWiG={Vjgzlj_3<8bchhR!T$hvkM2-Q4IH--c*l131+hc=n8>MSG^AWQ-? zt=qL1L_)V~Cy3VQVDQEaGXO&6el=rAhe62dbr6Js+ie#J$<1~Zgh`}|NkN1Hqcni< z^cWwhLTk3W<RCPb)B_+4UosocBvEy9=>cIrsK!mHG0hf{WG>T_AcFe;2SN`7r87XQ zLFl_o1-xw_jYbV}xfLk|p+cbsfsMf5v8VYu)#qHZxHu<S3yPAi6kbD$iofW4v9D}> zymZZcc&(`rVxxThD_^OAvFlx<5NBs9qUJ9S<QJ})oq5|K5RI;a;P<q!Fw3=dlAk${ z>s&kW<{2!^S1bqNjT4ng@hsa!^MC^xh1TZ0W*U3-ht(ihnxCJ6@i#9-)#XD+Z`7JV z*a2l{Novi)a}{{?@^>piurxO}4P&qW7FBEm(KU9U-C~x{7hq`pHs~KHCGZ+?6RGxk zji5)2rb^{)*fPeUwVUc;1c(PEvI#N2vH+!3L*Tl3a2!YT78{Ial=@|#pm|u6O^%`D zuu!4_wZ$q-O-;~oT|CRk948pJ{o=BX%-%Ltw&m;tus5-8a*|*?7M0R{yHw~BWuK8; zC3$BVh~G#~L2Fyx<A^~SY;_-@>}!&bp|#P-jkn#NO6-?DMe>y7Cz3m$+3LRh&k&MY eNY>JS0t^5~n{}Xa$|Ae~0000<MNUMnLSTZg7;&%w literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/scrollbar.png b/plugins/snes9x_gx/source/images/scrollbar.png new file mode 100644 index 0000000000000000000000000000000000000000..195ec168a7fc61182ed034a2178061e2502bf59b GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^8bEx4gAGW|+O_ySkdiEMjVKAuPb(=;EJ|f?Ovz75 zRq)JBOiv9;O-!jQJeg_(RJ6g<#WAGf)|+#Rf(!}*42}ypd0(_IljrUD<nlvOB*}mN x4Jkp@*KcO}^MBo#^=-?i%7%dh`%76R7zB7Zdb^gD@dDk>;OXk;vd$@?2>}1rZASnA literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/scrollbar_arrowdown.png b/plugins/snes9x_gx/source/images/scrollbar_arrowdown.png new file mode 100644 index 0000000000000000000000000000000000000000..5616c301ad8ed7840bf7acb57d1c2a52134a9172 GIT binary patch literal 721 zcmV;?0xtcDP)<h;3K|Lk000e1NJLTq001Ze001Zm1^@s6jQ+T70000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!b4f%&RCwBA{Qv(y!(aw1$egoVwX}g$ zHV}IQu^<rtqmw%rf%p%|2|zpzh_@JfU;6`=fQ2B?agji(8Hkk!IM99o@eCkt0Xp(6 z*nvRD1px&X05R_%irtw&+{6NOoF$M^1allKyC{R4Zao99usL00_~+LL3=c0iF?{=Y z1tu5|#5X}{Fcyd{V4}*#6B)P#4d@<RT>Lr=nl`H#t{(}5Ig$g2ZJB_C1`soYL_iK3 z2*)7<8O;)8t{@XM2Z4dKdcmM8W|$ZTIT&@|uy-H}u?l~FeZ=tj?Fp(_$}4Qaz|Jj4 zT?ewVi!eO9J)PnAkCzlVj+H~4K}X7m`ccfp!UZgb@+b~HX^ld#Su{z5LehQ=Tznej z*A_s%LQ>we%Os49%nY*HHDo&wq!(lcO>;4ikP$Exd`Na2NDoLaU5XhQ&0^Bh5l}5i z58cW^P)?LoNhex8NG(VYT?=Y)#RQ@(1*rk4rF%`n$izxiw1L!s)DB2hM=0Two1v&$ z7vm~AC@qqx=0H&4D<T()Ar2Cwq)?}7Yeq^vpMiyyAI@iH;RTBgn&uYBapKBJaK3~} z3W|dVMSBoblz^I0AWTWILUwbDm|{m(s}jy0bPfaoelh#eKFO#9DRSW7KVJr=1K+_o zk1jV3xPyLvdxFgU1Ioo4fmk1im4E+y&2ZyrBzX9Zol6ENMBm}zkFO3hJi3AsNEbm4 zTm!_aKn$+gzkayLaQ$%5V2IsQK)en%!paBaOakI)YL|^<0?+_qy0Q1QW5{FFYz&Z5 zO;A0h2E=T1k7EXg7eKrdh<kyKdjzhP2KzJwK!5=Nl0S`G?)~d$00000NkvXXu0mjf D_L(Bv literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/scrollbar_arrowdown_over.png b/plugins/snes9x_gx/source/images/scrollbar_arrowdown_over.png new file mode 100644 index 0000000000000000000000000000000000000000..69dbb75df0aea3ce5fa3b6e46cb610b89e48c009 GIT binary patch literal 733 zcmV<30wVp1P)<h;3K|Lk000e1NJLTq001Ze001Zm1^@s6jQ+T70000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!e@R3^RCwBA{Qv(y!(aw1$ehn|vf4l@ z8;HGuSP+Q+(a9Z*K>P=Y&jRr@Al}0J=<y%01S|xBj*A3R%|NU?z=8Gyh-UzC3(%2o z!43pEE(j>F0El@9QS8nH;wBcL<1B%UBADZtgd`c*E87{EUCn{K|8$Gtf7k9a{A{da z_<QpVOfVjZZ!&(8l>x<h8W1ysM7ic|VqkVL9I#;f<{F6X$n{J>LIdVFW^MBUbsPw= z6;vQ|1(~2Z2qKwNI_QcSCWb){Mjc4ingnm@nN-B^@6lcAgo>Op1IN5R>N=3c%a7rE zQ7m<GYDOXTqnIVcfq})!oAM|FngKG4CTWnps)~V;g^m3B0;m^c2F)@Flb##{YhVi5 z4g~21nL*QB%vPSsz{o31dguZ5fb`P5m|+wXU|>%xC)py99*|zTl!GkUp$yE*x<so7 zsRikwTS3jp!ot8_(L#La0o8)^(6uIEb~j>Rbs-!oAT=Ph15(wo6%^ntc0h6<H3L=` zgNh8cux#8O0LqbCtWdqNz*?5Uz$7e*X)sU>Bsbu#8Ac&42DZFf%+Ldhf#e27bBi_6 zmw`ps5>X5R*&wk&)gELktwFF0E9u`JBv|Y?=rORmMnc$B?08Ylf#8s<E*`iRHBsqB zNqn@^H0nUg9QftSpmg9n80Tku<$ycr|HCK9+&`dPyb*}?fmr$9yXOqwJVF@Q8=4uI z)MOdxH~a>5&Bj9vKYPlMg)V}I-#`^6DClYiS?rzy;zHO6D<6<E35cVqT{e;lt^jd5 z@1w`ZkjJP&El<#>W&#kafhq>N$1wxL3n1PJ#JxbrJp#9u2KzJwK!5=NmavY!Yz6P! P00000NkvXXu0mjf)U!fT literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/scrollbar_arrowup.png b/plugins/snes9x_gx/source/images/scrollbar_arrowup.png new file mode 100644 index 0000000000000000000000000000000000000000..7dd5334124f7dad696827438c2cfdfbbb0bee584 GIT binary patch literal 700 zcmV;t0z>_YP)<h;3K|Lk000e1NJLTq001Ze001Zm1^@s6jQ+T70000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!UP(kjRCwBA{Qv(y!(aw1Fvi)fT5>?D z7>M10Sc1;(U<Be{Kzs{`7Xa}>WAAIfz!IPk1Uk+N$eszrI)fn4{s8e(AkG6i@)P5k zEt(+5^#iflAdB4=AZ`amaS+ULj7+Qy3i|B~{9?9rkKv!+o-jPR+{p0t!$p{2BoN;Q zIZz)aBBxW&ASC5AAi>4Or@^3My`16F9(#u0KVO4{l!4fv2|1&%bIA;Nyvpg;BXfnA z23xVh%)*1hA9M~x2cr%gbs#C=<Ew*UOq05pQt<!ZZ-&R$+QDo-5i4+^Kd3_R^}`hm zKfgW#V-R~#Me(2C9~qwCo(AWG*dVb%<G^P(C!#nA#0H5C3I~4sbc5l|qtzJVATf~K zfIIN<)fR^T|NmlU8lV_RZa^LQ?%5WGFYnIbln2Ry)C`CNLB-0mTT=+9PoNr*TDm*% z<^2WVB83nDsR5~_s{?=kc**em&P<}!gVcib(9MBQuJ<zh`}2)x^&qt%J#=v(xe1?8 zhN7ASVf8IpMG_f$nMe(VZy&FcU#J81k{bF<^higPq+g<&TVH{`=NGf5O8p8li&xl` zx();xNUWiwP5w~_4rK>Ey*UA;O#*V@dqfe?GoX(9`u+kKLjkCfc>|P-4+F6$5OaL{ zc!lBmkuU~%-8u$#ZUvAB=oXQm-<|{yzafDWK)e_<fGGuJ)B$n&Ad2bFK%8LgeQg~R zkaz~<R0A<6@_!5h$K3@57RYfR4kK)o|Lj&RP;~nMaTX98Lksc$bj+-vys#CBrve=Z iukaZM`!obVfB^sw{sK*-1lyee0000<MNUMnLSTaV^fq(= literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/scrollbar_arrowup_over.png b/plugins/snes9x_gx/source/images/scrollbar_arrowup_over.png new file mode 100644 index 0000000000000000000000000000000000000000..6badbafa760799d1693bd00d0a4907007e5efde4 GIT binary patch literal 739 zcmV<90v!E`P)<h;3K|Lk000e1NJLTq001Ze001Zm1^@s6jQ+T70000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!g-Jv~RCwBA{Qv(y!(aw1Fve#&Sveq8 z48-n0EJ0^?Faq%}Aif2}3xIeb@1w`Rz!IPk1Uk+N$eszrI)fn4{s8e(AkG6i@)P4H zSs9Sy`hnPNki~8b5VwP(I0)uAMiw>(_S#7dEdF+MkKuo}9y9!GsAc$j?IcVv5{Peu zLU1>b;Q|ujsF=XOniV{t!S>a_jN#wA=P>R%CghC5C@(YM@ycG=j?5Ke8g%6f4-X1= z@Hr3-j5=^oIq=`Tmtahjs*W1qS8Fer=9t?x_#F6m&v}O5yO)F6tOsHkm>u*6R}}y1 zN0eW`x?2WU8vH$fGsB<D#}TzXkPQ+W6b}6V?i<6eNzIrc3KRp$4Y&h;cg<k<_x3qv zjs}W><ObA%|1LdZ__b;(?sN&11F0D>2mYEcf#Lt3U$~<mC<jtAAP)Sy^BlwPJ*x>P z0iYU?TDm&$|DQh$KRarORu57O(nB`~{+S94mAjXT4{e}YkRG}?@c*k13_oXel57!3 z4@fV~9r&wrI>Z0ZZ%I!UKs_M6G<6`T$oRc}4*6v!P%o*)4oMFD+17@)SRtIbeu2%P zi39(vIl%De*jCDW<v=q)W>LMl^=I2A24*!Q>I@wK&0-00psoWs=Jk#CNk$zwA{_W@ zN;gW$1ajbeMDwX*Kph9_c>TQ!AKm&3#5X{>_%INAf->sgn`aolxdt+@*EcaRX(@s{ zKqsd$GW^|rlHq52C9>cNAYKd_ev<++>VP<X5XJOoAWq<Y^mrW;kaz~<R0A=n>HA|4 zIPNYeut1Ijhb?TB|FfJdD7t-sI17l4p@sN=I%ZZ-UI5jlQ-O}V3XlB3J`Dj7U;v^Z V|5Fv&hra*-002ovPDHLkV1fgXL!AHs literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/scrollbar_box.png b/plugins/snes9x_gx/source/images/scrollbar_box.png new file mode 100644 index 0000000000000000000000000000000000000000..1dbfca7c876ecfcaaa17c5e2539771bd8519f85e GIT binary patch literal 481 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+7@Iv^978H@y_sq2eK<kj`1-Bef>s6{Ir&JaW~IJHNr0oh z<2F7g!HZ`Px*iD>SiQQLZ&7r*pyP#uJ6|bSOqmvD&daw*LoCNoqW8c0x5gLj9`hdZ z)p@?#^k;{+Q4G_z+{vc|i`1_#XKuF8Ws*H|aJ#!4V*)4Z25!Hgs+&c5C-|K7nlH0m zsL8v<euH`TgqlJY#p!N}>`7d{<?<=c6J{Scx@k&wUrEsS4^l_1j@iuJ5V?Et@1$w3 zu1?Z9*BJeg=Uh`^<kg_tSES^>?uotlP0`CwF5qcRl-IU~l?r@+7kGxW%#bg7=b;jQ zC)4IeMf02&ucCwA84If%ZDx&}fCWi^Ox>%k`9n*1@s4-9Cq&j4ET48GPqtZbLG7&b zCB+j9ujNn7U{cM$e)#Hg8_A{izFHgyoi8wlxi0+{w!q77?V*zO2PWRxuubtMqw$yg z{I|g!tPh>M^y7DxUrGFRH|tz;oWQr5V=ny<cyb)i3A8r6+OJs0BEg_<n6);3CYK~I P&KNvh{an^LB{Ts5#_Gzt literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/scrollbar_box_over.png b/plugins/snes9x_gx/source/images/scrollbar_box_over.png new file mode 100644 index 0000000000000000000000000000000000000000..ceb9e01eced7eed1f9215f57454c57d7dc2070e9 GIT binary patch literal 469 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+7|T6f978H@CH?vT-~Mm{o6d<j=ZiMoa?q0Q*xMK((DDD` zN!cEUKkOannLe5*+&lF9#Yg!KEIKTWecdcUXC2nq9BBN;+>y>u$bDgA{y{z#D?JX4 z4GbNX?1692u{=@}Tku$?u}5jf;~6a~k~g$(OU{Tr+qma{N%zD0>+g*J<g7{lQT>_6 z$3U(l->7cVRK}x~QUb=!E<2y)CMA>^%4|sZ{Y<Lk&55r*4o=L^EYfm6GnUG5Y!D4m zC}y3xz>-60X0X+ZE=jdEM?N=Mi&qB%+54;tt~4&@lPP_$g4rESNP(y3r;৾kR zZ^l_Z;QRIe1E<k<{*0DVWr5es8$azYKQFnjvc+J7xrwpC%9BPH@_+EYn$_DbQTJ_% zB6lnc@BTtY$ps5mOQvkB=IY>1R9;i#a85;`FU>)EyPQG+YsckEd0V?S8@IE^7$mRy zFeI5Oq%E$NF*ex4@Mx~X9qy7l$`cqKC(LhS;4ollj7bgnxp;mUFrFAZUHx3vIVCg! E0Ei8}%>V!Z literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/images/throbber.png b/plugins/snes9x_gx/source/images/throbber.png new file mode 100644 index 0000000000000000000000000000000000000000..47bb5478bb2a480e8dbd16d89e92a62080c792ea GIT binary patch literal 2542 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 Ef(6yo?f?J) literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/input.cpp b/plugins/snes9x_gx/source/input.cpp new file mode 100644 index 00000000..a1a49935 --- /dev/null +++ b/plugins/snes9x_gx/source/input.cpp @@ -0,0 +1,791 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * softdev July 2006 + * crunchy2 May-June 2007 + * Michniewski 2008 + * Tantric 2008-2010 + * + * input.cpp + * + * Wii/Gamecube controller management + ***************************************************************************/ + +#include <gccore.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <math.h> + +#include <ogcsys.h> +#include <unistd.h> +#include <wiiuse/wpad.h> +#include <wupc/wupc.h> +#include <ogc/lwp_watchdog.h> + +#include "snes9xgx.h" +#include "button_mapping.h" +#include "menu.h" +#include "video.h" +#include "input.h" +#include "gui/gui.h" + +#include "snes9x/snes9x.h" +#include "snes9x/memmap.h" +#include "snes9x/controls.h" + +int rumbleRequest[4] = {0,0,0,0}; +GuiTrigger userInput[4]; + +#ifdef HW_RVL +static int rumbleCount[4] = {0,0,0,0}; +#endif + +// hold superscope/mouse/justifier cursor positions +static int cursor_x[5] = {0,0,0,0,0}; +static int cursor_y[5] = {0,0,0,0,0}; + +/**************************************************************************** + * Controller Functions + * + * The following map the Wii controls to the Snes9x controller system + ***************************************************************************/ +#define ASSIGN_BUTTON_TRUE( keycode, snescmd ) \ + S9xMapButton( keycode, cmd = S9xGetCommandT(snescmd), true) + +#define ASSIGN_BUTTON_FALSE( keycode, snescmd ) \ + S9xMapButton( keycode, cmd = S9xGetCommandT(snescmd), false) + +static int scopeTurbo = 0; // tracks whether superscope turbo is on or off +u32 btnmap[4][4][12]; // button mapping + +void ResetControls(int consoleCtrl, int wiiCtrl) +{ + int i; + /*** Gamecube controller Padmap ***/ + if(consoleCtrl == -1 || (consoleCtrl == CTRL_PAD && wiiCtrl == CTRLR_GCPAD)) + { + i=0; + btnmap[CTRL_PAD][CTRLR_GCPAD][i++] = PAD_BUTTON_A; + btnmap[CTRL_PAD][CTRLR_GCPAD][i++] = PAD_BUTTON_B; + btnmap[CTRL_PAD][CTRLR_GCPAD][i++] = PAD_BUTTON_X; + btnmap[CTRL_PAD][CTRLR_GCPAD][i++] = PAD_BUTTON_Y; + btnmap[CTRL_PAD][CTRLR_GCPAD][i++] = PAD_TRIGGER_L; + btnmap[CTRL_PAD][CTRLR_GCPAD][i++] = PAD_TRIGGER_R; + btnmap[CTRL_PAD][CTRLR_GCPAD][i++] = PAD_BUTTON_START; + btnmap[CTRL_PAD][CTRLR_GCPAD][i++] = PAD_TRIGGER_Z; + btnmap[CTRL_PAD][CTRLR_GCPAD][i++] = PAD_BUTTON_UP; + btnmap[CTRL_PAD][CTRLR_GCPAD][i++] = PAD_BUTTON_DOWN; + btnmap[CTRL_PAD][CTRLR_GCPAD][i++] = PAD_BUTTON_LEFT; + btnmap[CTRL_PAD][CTRLR_GCPAD][i++] = PAD_BUTTON_RIGHT; + } + + /*** Wiimote Padmap ***/ + if(consoleCtrl == -1 || (consoleCtrl == CTRL_PAD && wiiCtrl == CTRLR_WIIMOTE)) + { + i=0; + btnmap[CTRL_PAD][CTRLR_WIIMOTE][i++] = WPAD_BUTTON_B; + btnmap[CTRL_PAD][CTRLR_WIIMOTE][i++] = WPAD_BUTTON_2; + btnmap[CTRL_PAD][CTRLR_WIIMOTE][i++] = WPAD_BUTTON_1; + btnmap[CTRL_PAD][CTRLR_WIIMOTE][i++] = WPAD_BUTTON_A; + btnmap[CTRL_PAD][CTRLR_WIIMOTE][i++] = 0x0000; + btnmap[CTRL_PAD][CTRLR_WIIMOTE][i++] = 0x0000; + btnmap[CTRL_PAD][CTRLR_WIIMOTE][i++] = WPAD_BUTTON_PLUS; + btnmap[CTRL_PAD][CTRLR_WIIMOTE][i++] = WPAD_BUTTON_MINUS; + btnmap[CTRL_PAD][CTRLR_WIIMOTE][i++] = WPAD_BUTTON_RIGHT; + btnmap[CTRL_PAD][CTRLR_WIIMOTE][i++] = WPAD_BUTTON_LEFT; + btnmap[CTRL_PAD][CTRLR_WIIMOTE][i++] = WPAD_BUTTON_UP; + btnmap[CTRL_PAD][CTRLR_WIIMOTE][i++] = WPAD_BUTTON_DOWN; + } + + /*** Classic Controller Padmap ***/ + if(consoleCtrl == -1 || (consoleCtrl == CTRL_PAD && wiiCtrl == CTRLR_CLASSIC)) + { + i=0; + btnmap[CTRL_PAD][CTRLR_CLASSIC][i++] = WPAD_CLASSIC_BUTTON_A; + btnmap[CTRL_PAD][CTRLR_CLASSIC][i++] = WPAD_CLASSIC_BUTTON_B; + btnmap[CTRL_PAD][CTRLR_CLASSIC][i++] = WPAD_CLASSIC_BUTTON_X; + btnmap[CTRL_PAD][CTRLR_CLASSIC][i++] = WPAD_CLASSIC_BUTTON_Y; + btnmap[CTRL_PAD][CTRLR_CLASSIC][i++] = WPAD_CLASSIC_BUTTON_FULL_L; + btnmap[CTRL_PAD][CTRLR_CLASSIC][i++] = WPAD_CLASSIC_BUTTON_FULL_R; + btnmap[CTRL_PAD][CTRLR_CLASSIC][i++] = WPAD_CLASSIC_BUTTON_PLUS; + btnmap[CTRL_PAD][CTRLR_CLASSIC][i++] = WPAD_CLASSIC_BUTTON_MINUS; + btnmap[CTRL_PAD][CTRLR_CLASSIC][i++] = WPAD_CLASSIC_BUTTON_UP; + btnmap[CTRL_PAD][CTRLR_CLASSIC][i++] = WPAD_CLASSIC_BUTTON_DOWN; + btnmap[CTRL_PAD][CTRLR_CLASSIC][i++] = WPAD_CLASSIC_BUTTON_LEFT; + btnmap[CTRL_PAD][CTRLR_CLASSIC][i++] = WPAD_CLASSIC_BUTTON_RIGHT; + } + + /*** Nunchuk + wiimote Padmap ***/ + if(consoleCtrl == -1 || (consoleCtrl == CTRL_PAD && wiiCtrl == CTRLR_NUNCHUK)) + { + i=0; + btnmap[CTRL_PAD][CTRLR_NUNCHUK][i++] = WPAD_BUTTON_A; + btnmap[CTRL_PAD][CTRLR_NUNCHUK][i++] = WPAD_BUTTON_B; + btnmap[CTRL_PAD][CTRLR_NUNCHUK][i++] = WPAD_NUNCHUK_BUTTON_C; + btnmap[CTRL_PAD][CTRLR_NUNCHUK][i++] = WPAD_NUNCHUK_BUTTON_Z; + btnmap[CTRL_PAD][CTRLR_NUNCHUK][i++] = WPAD_BUTTON_2; + btnmap[CTRL_PAD][CTRLR_NUNCHUK][i++] = WPAD_BUTTON_1; + btnmap[CTRL_PAD][CTRLR_NUNCHUK][i++] = WPAD_BUTTON_PLUS; + btnmap[CTRL_PAD][CTRLR_NUNCHUK][i++] = WPAD_BUTTON_MINUS; + btnmap[CTRL_PAD][CTRLR_NUNCHUK][i++] = WPAD_BUTTON_UP; + btnmap[CTRL_PAD][CTRLR_NUNCHUK][i++] = WPAD_BUTTON_DOWN; + btnmap[CTRL_PAD][CTRLR_NUNCHUK][i++] = WPAD_BUTTON_LEFT; + btnmap[CTRL_PAD][CTRLR_NUNCHUK][i++] = WPAD_BUTTON_RIGHT; + } + + /*** Superscope : GC controller button mapping ***/ + if(consoleCtrl == -1 || (consoleCtrl == CTRL_SCOPE && wiiCtrl == CTRLR_GCPAD)) + { + i=0; + btnmap[CTRL_SCOPE][CTRLR_GCPAD][i++] = PAD_BUTTON_A; + btnmap[CTRL_SCOPE][CTRLR_GCPAD][i++] = PAD_BUTTON_B; + btnmap[CTRL_SCOPE][CTRLR_GCPAD][i++] = PAD_TRIGGER_Z; + btnmap[CTRL_SCOPE][CTRLR_GCPAD][i++] = PAD_BUTTON_Y; + btnmap[CTRL_SCOPE][CTRLR_GCPAD][i++] = PAD_BUTTON_X; + btnmap[CTRL_SCOPE][CTRLR_GCPAD][i++] = PAD_BUTTON_START; + } + + /*** Superscope : wiimote button mapping ***/ + if(consoleCtrl == -1 || (consoleCtrl == CTRL_SCOPE && wiiCtrl == CTRLR_WIIMOTE)) + { + i=0; + btnmap[CTRL_SCOPE][CTRLR_WIIMOTE][i++] = WPAD_BUTTON_B; + btnmap[CTRL_SCOPE][CTRLR_WIIMOTE][i++] = WPAD_BUTTON_A; + btnmap[CTRL_SCOPE][CTRLR_WIIMOTE][i++] = WPAD_BUTTON_MINUS; + btnmap[CTRL_SCOPE][CTRLR_WIIMOTE][i++] = WPAD_BUTTON_UP; + btnmap[CTRL_SCOPE][CTRLR_WIIMOTE][i++] = WPAD_BUTTON_DOWN; + btnmap[CTRL_SCOPE][CTRLR_WIIMOTE][i++] = WPAD_BUTTON_PLUS; + } + + /*** Mouse : GC controller button mapping ***/ + if(consoleCtrl == -1 || (consoleCtrl == CTRL_MOUSE && wiiCtrl == CTRLR_GCPAD)) + { + i=0; + btnmap[CTRL_MOUSE][CTRLR_GCPAD][i++] = PAD_BUTTON_A; + btnmap[CTRL_MOUSE][CTRLR_GCPAD][i++] = PAD_BUTTON_B; + } + + /*** Mouse : wiimote button mapping ***/ + if(consoleCtrl == -1 || (consoleCtrl == CTRL_MOUSE && wiiCtrl == CTRLR_WIIMOTE)) + { + i=0; + btnmap[CTRL_MOUSE][CTRLR_WIIMOTE][i++] = WPAD_BUTTON_A; + btnmap[CTRL_MOUSE][CTRLR_WIIMOTE][i++] = WPAD_BUTTON_B; + } + + /*** Justifier : GC controller button mapping ***/ + if(consoleCtrl == -1 || (consoleCtrl == CTRL_JUST && wiiCtrl == CTRLR_GCPAD)) + { + i=0; + btnmap[CTRL_JUST][CTRLR_GCPAD][i++] = PAD_BUTTON_B; + btnmap[CTRL_JUST][CTRLR_GCPAD][i++] = PAD_BUTTON_A; + btnmap[CTRL_JUST][CTRLR_GCPAD][i++] = PAD_BUTTON_START; + } + + /*** Justifier : wiimote button mapping ***/ + if(consoleCtrl == -1 || (consoleCtrl == CTRL_JUST && wiiCtrl == CTRLR_WIIMOTE)) + { + i=0; + btnmap[CTRL_JUST][CTRLR_WIIMOTE][i++] = WPAD_BUTTON_B; + btnmap[CTRL_JUST][CTRLR_WIIMOTE][i++] = WPAD_BUTTON_A; + btnmap[CTRL_JUST][CTRLR_WIIMOTE][i++] = WPAD_BUTTON_PLUS; + } +} + +/**************************************************************************** + * UpdatePads + * + * Scans pad and wpad + ***************************************************************************/ + +void +UpdatePads() +{ + #ifdef HW_RVL + WUPC_UpdateButtonStats(); + WPAD_ScanPads(); + #endif + + PAD_ScanPads(); + + for(int i=3; i >= 0; i--) + { + userInput[i].pad.btns_d = PAD_ButtonsDown(i); + userInput[i].pad.btns_u = PAD_ButtonsUp(i); + userInput[i].pad.btns_h = PAD_ButtonsHeld(i); + userInput[i].pad.stickX = PAD_StickX(i); + userInput[i].pad.stickY = PAD_StickY(i); + userInput[i].pad.substickX = PAD_SubStickX(i); + userInput[i].pad.substickY = PAD_SubStickY(i); + userInput[i].pad.triggerL = PAD_TriggerL(i); + userInput[i].pad.triggerR = PAD_TriggerR(i); + #ifdef HW_RVL + userInput[i].wupcdata.btns_d = WUPC_ButtonsDown(i); + userInput[i].wupcdata.btns_u = WUPC_ButtonsUp(i); + userInput[i].wupcdata.btns_h = WUPC_ButtonsHeld(i); + userInput[i].wupcdata.stickX = WUPC_lStickX(i); + userInput[i].wupcdata.stickY = WUPC_lStickY(i); + userInput[i].wupcdata.substickX = WUPC_rStickX(i); + userInput[i].wupcdata.substickY = WUPC_rStickY(i); + #endif + } +} + +/**************************************************************************** + * SetupPads + * + * Sets up userInput triggers for use + ***************************************************************************/ +void +SetupPads() +{ + PAD_Init(); + + #ifdef HW_RVL + // read wiimote accelerometer and IR data + WPAD_SetDataFormat(WPAD_CHAN_ALL,WPAD_FMT_BTNS_ACC_IR); + WPAD_SetVRes(WPAD_CHAN_ALL, screenwidth, screenheight); + #endif + + for(int i=0; i < 4; i++) + { + userInput[i].chan = i; + #ifdef HW_RVL + userInput[i].wpad = WPAD_Data(i); + #endif + } +} + +#ifdef HW_RVL +/**************************************************************************** + * ShutoffRumble + ***************************************************************************/ +void ShutoffRumble() +{ + if(CONF_GetPadMotorMode() == 0) + return; + + for(int i=0;i<4;i++) + { + WPAD_Rumble(i, 0); + rumbleCount[i] = 0; + rumbleRequest[i] = 0; + } +} + +/**************************************************************************** + * DoRumble + ***************************************************************************/ +void DoRumble(int i) +{ + if(CONF_GetPadMotorMode() == 0 || !GCSettings.Rumble) return; + + if(rumbleRequest[i] && rumbleCount[i] < 3) + { + WPAD_Rumble(i, 1); // rumble on + rumbleCount[i]++; + } + else if(rumbleRequest[i]) + { + rumbleCount[i] = 12; + rumbleRequest[i] = 0; + } + else + { + if(rumbleCount[i]) + rumbleCount[i]--; + WPAD_Rumble(i, 0); // rumble off + } +} +#endif + +/**************************************************************************** + * UpdateCursorPosition + * + * Updates X/Y coordinates for Superscope/mouse/justifier position + ***************************************************************************/ +static void UpdateCursorPosition (int chan, int &pos_x, int &pos_y) +{ + #define SCOPEPADCAL 20 + + #define WUPCSCOPEPADCAL 160 + // gc left joystick + + if (userInput[chan].pad.stickX > SCOPEPADCAL) + { + pos_x += (userInput[chan].pad.stickX*1.0)/SCOPEPADCAL; + if (pos_x > 256) pos_x = 256; + } + if (userInput[chan].pad.stickX < -SCOPEPADCAL) + { + pos_x -= (userInput[chan].pad.stickX*-1.0)/SCOPEPADCAL; + if (pos_x < 0) pos_x = 0; + } + + if (userInput[chan].pad.stickY < -SCOPEPADCAL) + { + pos_y += (userInput[chan].pad.stickY*-1.0)/SCOPEPADCAL; + if (pos_y > 224) pos_y = 224; + } + if (userInput[chan].pad.stickY > SCOPEPADCAL) + { + pos_y -= (userInput[chan].pad.stickY*1.0)/SCOPEPADCAL; + if (pos_y < 0) pos_y = 0; + } + +#ifdef HW_RVL + if (userInput[chan].wpad->ir.valid) + { + pos_x = (userInput[chan].wpad->ir.x * 256) / 640; + pos_y = (userInput[chan].wpad->ir.y * 224) / 480; + } + else + { + s8 wm_ax = userInput[chan].WPAD_StickX(0); + s8 wm_ay = userInput[chan].WPAD_StickY(0); + + if (wm_ax > SCOPEPADCAL) + { + pos_x += (wm_ax*1.0)/SCOPEPADCAL; + if (pos_x > 256) pos_x = 256; + } + if (wm_ax < -SCOPEPADCAL) + { + pos_x -= (wm_ax*-1.0)/SCOPEPADCAL; + if (pos_x < 0) pos_x = 0; + } + + if (wm_ay < -SCOPEPADCAL) + { + pos_y += (wm_ay*-1.0)/SCOPEPADCAL; + if (pos_y > 224) pos_y = 224; + } + if (wm_ay > SCOPEPADCAL) + { + pos_y -= (wm_ay*1.0)/SCOPEPADCAL; + if (pos_y < 0) pos_y = 0; + } + + /* WiiU Pro Controller */ + s8 wupc_ax = userInput[chan].wupcdata.stickX; + s8 wupc_ay = userInput[chan].wupcdata.stickX; + + if (wupc_ax > WUPCSCOPEPADCAL) + { + pos_x += (wupc_ax*1.0)/WUPCSCOPEPADCAL; + if (pos_x > 256) pos_x = 256; + } + if (wupc_ax < -WUPCSCOPEPADCAL) + { + pos_x -= (wupc_ax*-1.0)/WUPCSCOPEPADCAL; + if (pos_x < 0) pos_x = 0; + } + + if (wupc_ay < -WUPCSCOPEPADCAL) + { + pos_y += (wupc_ay*-1.0)/WUPCSCOPEPADCAL; + if (pos_y > 224) pos_y = 224; + } + if (wupc_ay > WUPCSCOPEPADCAL) + { + pos_y -= (wupc_ay*1.0)/WUPCSCOPEPADCAL; + if (pos_y < 0) pos_y = 0; + } + } +#endif + +} + +/**************************************************************************** + * decodepad + * + * Reads the changes (buttons pressed, etc) from a controller and reports + * these changes to Snes9x + ***************************************************************************/ +static void decodepad (int chan) +{ + int i, offset; + double angle; + static const double THRES = 0.38268343236508984; // cos(67.5) + + s8 pad_x = userInput[chan].pad.stickX; + s8 pad_y = userInput[chan].pad.stickY; + u32 jp = userInput[chan].pad.btns_h; + +#ifdef HW_RVL + s8 wm_ax = userInput[chan].WPAD_StickX(0); + s8 wm_ay = userInput[chan].WPAD_StickY(0); + u32 wp = userInput[chan].wpad->btns_h; + + u32 exp_type; + if ( WPAD_Probe(chan, &exp_type) != 0 ) + exp_type = WPAD_EXP_NONE; + + s16 wupc_ax = userInput[chan].wupcdata.stickX; + s16 wupc_ay = userInput[chan].wupcdata.stickY; + u32 wupcp = userInput[chan].wupcdata.btns_h; +#endif + + /*** + Gamecube Joystick input + ***/ + // Is XY inside the "zone"? + if (pad_x * pad_x + pad_y * pad_y > PADCAL * PADCAL) + { + angle = atan2(pad_y, pad_x); + + if(cos(angle) > THRES) + jp |= PAD_BUTTON_RIGHT; + else if(cos(angle) < -THRES) + jp |= PAD_BUTTON_LEFT; + if(sin(angle) > THRES) + jp |= PAD_BUTTON_UP; + else if(sin(angle) < -THRES) + jp |= PAD_BUTTON_DOWN; + } + + // Count as pressed if down far enough (~50% down) + if (userInput[chan].pad.triggerL > 0x80) + jp |= PAD_TRIGGER_L; + if (userInput[chan].pad.triggerR > 0x80) + jp |= PAD_TRIGGER_R; + +#ifdef HW_RVL + /*** + Wii Joystick (classic, nunchuk) input + ***/ + // Is XY inside the "zone"? + if (wm_ax * wm_ax + wm_ay * wm_ay > PADCAL * PADCAL) + { + angle = atan2(wm_ay, wm_ax); + + if(cos(angle) > THRES) + wp |= (exp_type == WPAD_EXP_CLASSIC) ? WPAD_CLASSIC_BUTTON_RIGHT : WPAD_BUTTON_RIGHT; + else if(cos(angle) < -THRES) + wp |= (exp_type == WPAD_EXP_CLASSIC) ? WPAD_CLASSIC_BUTTON_LEFT : WPAD_BUTTON_LEFT; + if(sin(angle) > THRES) + wp |= (exp_type == WPAD_EXP_CLASSIC) ? WPAD_CLASSIC_BUTTON_UP : WPAD_BUTTON_UP; + else if(sin(angle) < -THRES) + wp |= (exp_type == WPAD_EXP_CLASSIC) ? WPAD_CLASSIC_BUTTON_DOWN : WPAD_BUTTON_DOWN; + } + + /* Pro Controller */ + if (wupc_ax * wupc_ax + wupc_ay * wupc_ay > WUPCCAL * WUPCCAL) + { + angle = atan2(wupc_ay, wupc_ax); + if(cos(angle) > THRES) + wupcp |= WPAD_CLASSIC_BUTTON_RIGHT; + else if(cos(angle) < -THRES) + wupcp |= WPAD_CLASSIC_BUTTON_LEFT; + if(sin(angle) > THRES) + wupcp |= WPAD_CLASSIC_BUTTON_UP; + else if(sin(angle) < -THRES) + wupcp |= WPAD_CLASSIC_BUTTON_DOWN; + } +#endif + + /*** Fix offset to pad ***/ + offset = ((chan + 1) << 4); + + /*** Report pressed buttons (gamepads) ***/ + for (i = 0; i < MAXJP; i++) + { + if ( (jp & btnmap[CTRL_PAD][CTRLR_GCPAD][i]) // gamecube controller +#ifdef HW_RVL + || ( (exp_type == WPAD_EXP_NONE) && (wp & btnmap[CTRL_PAD][CTRLR_WIIMOTE][i]) ) // wiimote + || ( (exp_type == WPAD_EXP_CLASSIC) && (wp & btnmap[CTRL_PAD][CTRLR_CLASSIC][i]) ) // classic controller + || ( (exp_type == WPAD_EXP_NUNCHUK) && (wp & btnmap[CTRL_PAD][CTRLR_NUNCHUK][i]) ) // nunchuk + wiimote + || ( (wupcp & btnmap[CTRL_PAD][CTRLR_CLASSIC][i]) ) // WiiU Pro Controller +#endif + ) + S9xReportButton (offset + i, true); + else + S9xReportButton (offset + i, false); + } + + /*** Superscope ***/ + if (Settings.SuperScopeMaster && chan == 0) // report only once + { + // buttons + offset = 0x50; + for (i = 0; i < 6; i++) + { + if (jp & btnmap[CTRL_SCOPE][CTRLR_GCPAD][i] +#ifdef HW_RVL + || wp & btnmap[CTRL_SCOPE][CTRLR_WIIMOTE][i] + || wupcp & btnmap[CTRL_SCOPE][CTRLR_WIIMOTE][i] +#endif + ) + { + if(i == 3 || i == 4) // turbo + { + if((i == 3 && scopeTurbo == 1) || // turbo ON already, don't change + (i == 4 && scopeTurbo == 0)) // turbo OFF already, don't change + { + S9xReportButton(offset + i, false); + } + else // turbo changed to ON or OFF + { + scopeTurbo = 4-i; + S9xReportButton(offset + i, true); + } + } + else + S9xReportButton(offset + i, true); + } + else + S9xReportButton(offset + i, false); + } + // pointer + offset = 0x80; + UpdateCursorPosition(chan, cursor_x[0], cursor_y[0]); + S9xReportPointer(offset, (u16) cursor_x[0], (u16) cursor_y[0]); + } + /*** Mouse ***/ + else if (Settings.MouseMaster && chan == 0) + { + // buttons + offset = 0x60 + (2 * chan); + for (i = 0; i < 2; i++) + { + if (jp & btnmap[CTRL_MOUSE][CTRLR_GCPAD][i] +#ifdef HW_RVL + || wp & btnmap[CTRL_MOUSE][CTRLR_WIIMOTE][i] + || wupcp & btnmap[CTRL_MOUSE][CTRLR_WIIMOTE][i] +#endif + ) + S9xReportButton(offset + i, true); + else + S9xReportButton(offset + i, false); + } + // pointer + offset = 0x81; + UpdateCursorPosition(chan, cursor_x[1 + chan], cursor_y[1 + chan]); + S9xReportPointer(offset + chan, (u16) cursor_x[1 + chan], + (u16) cursor_y[1 + chan]); + } + /*** Justifier ***/ + else if (Settings.JustifierMaster && chan < 2) + { + // buttons + offset = 0x70 + (3 * chan); + for (i = 0; i < 3; i++) + { + if (jp & btnmap[CTRL_JUST][CTRLR_GCPAD][i] +#ifdef HW_RVL + || wp & btnmap[CTRL_JUST][CTRLR_WIIMOTE][i] + || wupcp & btnmap[CTRL_JUST][CTRLR_WIIMOTE][i] +#endif + ) + S9xReportButton(offset + i, true); + else + S9xReportButton(offset + i, false); + } + // pointer + offset = 0x83; + UpdateCursorPosition(chan, cursor_x[3 + chan], cursor_y[3 + chan]); + S9xReportPointer(offset + chan, (u16) cursor_x[3 + chan], + (u16) cursor_y[3 + chan]); + } + +#ifdef HW_RVL + // screenshot (temp) + if (wp & CLASSIC_CTRL_BUTTON_ZR) + S9xReportButton(0x90, true); + else + S9xReportButton(0x90, false); +#endif +} + +bool MenuRequested() +{ + for(int i=0; i<4; i++) + { + if ( + (userInput[i].pad.substickX < -70) || + (userInput[i].pad.btns_h & PAD_TRIGGER_L && + userInput[i].pad.btns_h & PAD_TRIGGER_R && + userInput[i].pad.btns_h & PAD_BUTTON_X && + userInput[i].pad.btns_h & PAD_BUTTON_Y + ) + #ifdef HW_RVL + || (userInput[i].wpad->btns_h & WPAD_BUTTON_HOME) || + (userInput[i].wpad->btns_h & WPAD_CLASSIC_BUTTON_HOME) || + (userInput[i].wupcdata.btns_h & WPAD_CLASSIC_BUTTON_HOME) + #endif + ) + { + return true; + } + } + return false; +} + +/**************************************************************************** + * ReportButtons + * + * Called on each rendered frame + * Our way of putting controller input into Snes9x + ***************************************************************************/ +void ReportButtons () +{ + int i, j; + + UpdatePads(); + + Settings.TurboMode = ( + userInput[0].pad.substickX > 70 || + userInput[0].WPAD_StickX(1) > 70 || + userInput[0].wupcdata.substickX > 560 + ); // RIGHT on c-stick and on classic controller right joystick + + /* Check for menu: + * CStick left + * OR "L+R+X+Y" (eg. Homebrew/Adapted SNES controllers) + * OR "Home" on the wiimote or classic controller + * OR Left on classic right analog stick + */ + if(MenuRequested()) + ScreenshotRequested = 1; // go to the menu + + j = (Settings.MultiPlayer5Master == true ? 4 : 2); + + for (i = 0; i < j; i++) + decodepad (i); +} + +void SetControllers() +{ + if (Settings.MultiPlayer5Master == true) + { + S9xSetController (0, CTL_JOYPAD, 0, 0, 0, 0); + S9xSetController (1, CTL_MP5, 1, 2, 3, -1); + } + else if (Settings.SuperScopeMaster == true) + { + S9xSetController (0, CTL_JOYPAD, 0, 0, 0, 0); + S9xSetController (1, CTL_SUPERSCOPE, 0, 0, 0, 0); + } + else if (Settings.MouseMaster == true) + { + S9xSetController (0, CTL_MOUSE, 0, 0, 0, 0); + S9xSetController (1, CTL_JOYPAD, 1, 0, 0, 0); + } + else if (Settings.JustifierMaster == true) + { + S9xSetController (0, CTL_JOYPAD, 0, 0, 0, 0); + S9xSetController(1, CTL_JUSTIFIER, 1, 0, 0, 0); + } + else + { + // Plugin 2 Joypads by default + S9xSetController (0, CTL_JOYPAD, 0, 0, 0, 0); + S9xSetController (1, CTL_JOYPAD, 1, 0, 0, 0); + } +} + +/**************************************************************************** + * Set the default mapping + ***************************************************************************/ +void SetDefaultButtonMap () +{ + int maxcode = 0x10; + s9xcommand_t cmd; + + /*** Joypad 1 ***/ + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad1 A"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad1 B"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad1 X"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad1 Y"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad1 L"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad1 R"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad1 Start"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad1 Select"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad1 Up"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad1 Down"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad1 Left"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad1 Right"); + + maxcode = 0x20; + /*** Joypad 2 ***/ + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad2 A"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad2 B"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad2 X"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad2 Y"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad2 L"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad2 R"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad2 Start"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad2 Select"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad2 Up"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad2 Down"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad2 Left"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad2 Right"); + + maxcode = 0x30; + /*** Joypad 3 ***/ + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad3 A"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad3 B"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad3 X"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad3 Y"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad3 L"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad3 R"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad3 Start"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad3 Select"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad3 Up"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad3 Down"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad3 Left"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad3 Right"); + + maxcode = 0x40; + /*** Joypad 4 ***/ + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad4 A"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad4 B"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad4 X"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad4 Y"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad4 L"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad4 R"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad4 Start"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad4 Select"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad4 Up"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad4 Down"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad4 Left"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad4 Right"); + + maxcode = 0x50; + /*** Superscope ***/ + ASSIGN_BUTTON_FALSE (maxcode++, "Superscope Fire"); + ASSIGN_BUTTON_FALSE (maxcode++, "Superscope AimOffscreen"); + ASSIGN_BUTTON_FALSE (maxcode++, "Superscope Cursor"); + ASSIGN_BUTTON_FALSE (maxcode++, "Superscope ToggleTurbo"); + ASSIGN_BUTTON_FALSE (maxcode++, "Superscope ToggleTurbo"); + ASSIGN_BUTTON_FALSE (maxcode++, "Superscope Pause"); + + maxcode = 0x60; + /*** Mouse ***/ + ASSIGN_BUTTON_FALSE (maxcode++, "Mouse1 L"); + ASSIGN_BUTTON_FALSE (maxcode++, "Mouse1 R"); + ASSIGN_BUTTON_FALSE (maxcode++, "Mouse2 L"); + ASSIGN_BUTTON_FALSE (maxcode++, "Mouse2 R"); + + maxcode = 0x70; + /*** Justifier ***/ + ASSIGN_BUTTON_FALSE (maxcode++, "Justifier1 Trigger"); + ASSIGN_BUTTON_FALSE (maxcode++, "Justifier1 AimOffscreen"); + ASSIGN_BUTTON_FALSE (maxcode++, "Justifier1 Start"); + ASSIGN_BUTTON_FALSE (maxcode++, "Justifier2 Trigger"); + ASSIGN_BUTTON_FALSE (maxcode++, "Justifier2 AimOffscreen"); + ASSIGN_BUTTON_FALSE (maxcode++, "Justifier2 Start"); + + maxcode = 0x80; + S9xMapPointer(maxcode++, S9xGetCommandT("Pointer Superscope"), false); + S9xMapPointer(maxcode++, S9xGetCommandT("Pointer Mouse1"), false); + S9xMapPointer(maxcode++, S9xGetCommandT("Pointer Mouse2"), false); + S9xMapPointer(maxcode++, S9xGetCommandT("Pointer Justifier1"), false); + S9xMapPointer(maxcode++, S9xGetCommandT("Pointer Justifier2"), false); + + maxcode = 0x90; + //ASSIGN_BUTTON_FALSE (maxcode++, "Screenshot"); + + SetControllers(); +} diff --git a/plugins/snes9x_gx/source/input.h b/plugins/snes9x_gx/source/input.h new file mode 100644 index 00000000..efcf6e1d --- /dev/null +++ b/plugins/snes9x_gx/source/input.h @@ -0,0 +1,38 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * softdev July 2006 + * crunchy2 May-June 2007 + * Michniewski 2008 + * Tantric 2008-2010 + * + * input.h + * + * Wii/Gamecube controller management + ***************************************************************************/ + +#ifndef _INPUT_H_ +#define _INPUT_H_ + +#include <gccore.h> +#include <wiiuse/wpad.h> + +#define PI 3.14159265f +#define PADCAL 50 +#define WUPCCAL 400 +#define MAXJP 12 // # of mappable controller buttons + +extern u32 btnmap[4][4][12]; +extern int rumbleRequest[4]; + +void ResetControls(int cc = -1, int wc = -1); +void ShutoffRumble(); +void DoRumble(int i); +void ReportButtons (); +void SetControllers (); +void SetDefaultButtonMap (); +bool MenuRequested(); +void SetupPads(); +void UpdatePads(); + +#endif diff --git a/plugins/snes9x_gx/source/lang/ca.lang b/plugins/snes9x_gx/source/lang/ca.lang new file mode 100644 index 00000000..522e21ae --- /dev/null +++ b/plugins/snes9x_gx/source/lang/ca.lang @@ -0,0 +1,854 @@ +msgid "&" +msgstr "&" + +msgid "16:9 Correction" +msgstr "Correcció 16:9" + +msgid "7z decompression failed: Archive contains too many files" +msgstr "Error descomprimint 7z: L'arxiu conté massa fitxers" + +msgid "7z decompression failed: Failed to read file data" +msgstr "Error descomprimint 7z: error llegint fitxer" + +msgid "7z decompression failed: File is corrupt" +msgstr "Error descomprimint 7z: Arxiu corrupte" + +msgid "7z decompression failed: File is corrupt (CRC mismatch)" +msgstr "Error descomprimint 7z: Arxiu corrupte (error de CRC)" + +msgid "7z decompression failed: File uses too high of compression settings (dictionary size is too large)" +msgstr "Error descomprimint 7z: Paràmetre de compressió massa alt (format de diccionari massa gran)" + +msgid "7z decompression failed: File uses unsupported compression settings" +msgstr "Error descomprimint 7z: El fitxer fa servir paràmetres incompatibles" + +msgid "A (Rapid)" +msgstr "A (Ràpid)" + +msgid "Additional coding" +msgstr "Programació addic." + +msgid "Aim Offscreen" +msgstr "Apunteu fora" + +msgid "An update is available!" +msgstr "Actualització disponible!" + +msgid "Are you sure that you want to reset this game? Any unsaved progress will be lost." +msgstr "Segur que voleu reiniciar aquest joc? Es perdrà qualsevol progrés no desat." + +msgid "Are you sure that you want to reset your mappings?" +msgstr "Segur que voleu reiniciar els controls?" + +msgid "Are you sure that you want to reset your settings?" +msgstr "Segur que voleu reiniciar la configuració?" + +msgid "Maintain Aspect Ratio" +msgstr "Conservar proporcions" + +msgid "Attempting to determine load device..." +msgstr "Detectant dispositiu de càrrega..." + +msgid "Attempting to determine save device..." +msgstr "Detectant el dispositiu d'enmagatzament" + +msgid "Auto" +msgstr "Auto" + +msgid "Auto Detect" +msgstr "Auto detectar" + +msgid "Auto Load" +msgstr "Auto carregar" + +msgid "Auto Save" +msgstr "Auto desar" + +msgid "Automatic (Recommended)" +msgstr "Automàtic (Recomenat)" + +msgid "B (Rapid)" +msgstr "B (Ràpid)" + +msgid "Back" +msgstr "Enrera" + +msgid "Both" +msgstr "Tots dos" + +msgid "Controles" +msgstr "Controls" + +msgid "Button Mappings" +msgstr "Redefinir botons" + +msgid "Cancel" +msgstr "Cancel.la" + +msgid "Caps" +msgstr "Maj." + +msgid "Cheats" +msgstr "Cheats" + +msgid "Cheats file not found!" +msgstr "No trobo fitxer cheats!" + +msgid "Cheats Folder" +msgstr "Carpeta Cheats" + +msgid "Choose Game" +msgstr "Escollir joc" + +msgid "Classic Controller" +msgstr "Comandament clàssic" + +msgid "Close" +msgstr "Tancar" + +msgid "Coding" +msgstr "Programació" + +msgid "Coding & menu design" +msgstr "Programació & disseny menú" + +msgid "Compressed GBA files are not supported!" +msgstr "Els fitxers GBA comprimits incompatibles!" + +msgid "Connecting to network share..." +msgstr "Connectant a xarxa compartida..." + +msgid "Controller" +msgstr "Comandament" + +msgid "Cover View" +msgstr "Veure cover" + +msgid "Covers Folder" +msgstr "Carpeta covers" + +msgid "Credits" +msgstr "Crèdits" + +msgid "Cropping" +msgstr "Retallar" + +msgid "Crosshair" +msgstr "Punter" + +msgid "Cursor" +msgstr "Cursor" + +msgid "Data DVD" +msgstr "Dades DVD" + +msgid "Default" +msgstr "Per defecte" + +msgid "Directory name is too long!" +msgstr "Nom de directori massa larg!" + +msgid "Disabled" +msgstr "Desactivat" + +msgid "DISABLED" +msgstr "DESACTIVAT" + +msgid "distributed, or modified under the terms of the" +msgstr "distribuït, o modificat sota els termes de" + +msgid "Don't Save" +msgstr "No desis" + +msgid "Down" +msgstr "Avall" + +msgid "DOWN" +msgstr "AVALL" + +msgid "Downloading..." +msgstr "Descarregant" + +msgid "Dutch" +msgstr "Holandès" + +msgid "Empty or invalid ZIP file!" +msgstr "Fitxer zip buit o invàlid!" + +msgid "Enabled" +msgstr "Activat" + +msgid "ENABLED" +msgstr "ACTIVAT" + +msgid "English" +msgstr "Anglès" + +msgid "Error" +msgstr "Error" + +msgid "Error - Invalid ZIP file!" +msgstr "Error - Fitxer ZIP invàlid!" + +msgid "Error creating file!" +msgstr "Error creant fitxer!" + +msgid "Error loading game!" +msgstr "Error carregant joc!" + +msgid "Error opening archive!" +msgstr "Error obrint l'arxiu!" + +msgid "Error opening directory!" +msgstr "Error obrint directori!" + +msgid "Error opening file!" +msgstr "Error obrint fitxer!" + +msgid "Error reading file!" +msgstr "Error llegint fitxer!" + +msgid "Error saving file!" +msgstr "Error desant fitxer!" + +msgid "Exit" +msgstr "Surt" + +msgid "Exit Action" +msgstr "Mode sortida" + +msgid "Failed to connect to network share." +msgstr "Error de connexió a xarxa compartida." + +msgid "FDS BIOS file is invalid!" +msgstr "Fitxer BIOS FDS invàlid!" + +msgid "FDS BIOS file not found!" +msgstr "Fitxer BIOS FDS no trobat!" + +msgid "Filtered" +msgstr "Filtrat" + +msgid "Filtering" +msgstr "Filtrar" + +msgid "Fire" +msgstr "Foc" + +msgid "French" +msgstr "Francès" + +msgid "GBA Screen Zoom" +msgstr "Zoom pantalla GBA" + +msgid "Game Genie ROM not found!" +msgstr "No es troba ROM GameGenie!" + +msgid "Game Settings" +msgstr "Configuració" + +msgid "Game Settings - Button Mappings" +msgstr "Configuració - Redefinir botons" +msgid "Game Settings - Cheats" +msgstr "Configuració - Cheats" + +msgid "Game Settings - Video" +msgstr "Configuració - Vídeo" + +msgid "Game Timing" +msgstr "Timing de joc" + +msgid "Game Genie DISABLED" +msgstr "GameGenie DESACTIVAT" + +msgid "Game Genie ENABLED" +msgstr "GameGenie ACTIVAT" + +msgid "GameCube Controller" +msgstr "Comandament Gamecube" + +msgid "German" +msgstr "Alemany" + +msgid "GNU General Public License (GPL) Version 2." +msgstr "GNU General Public License (GPL) Versió 2." + +msgid "Go Back" +msgstr "Tornar" + +msgid "Horizontal" +msgstr "Horitzontal" + +msgid "Information" +msgstr "Informació" + +msgid "Initializing network..." +msgstr "Iniciant la xarxa..." + + +msgid "Insert Coin" +msgstr "Ficar Moneda" + +msgid "Insert Coin / Switch Disk" +msgstr "Ficar Moneda / Canviar Disc" + +msgid "Invalid file size!" +msgstr "Format fitxer invàlid!" + +msgid "Invalid game file!" +msgstr "Fitxer de joc invàlid!" + +msgid "Invalid network settings - Check settings.xml." +msgstr "Error de xarxa - Comproveu fitxer settings.xml." + +msgid "Invalid network settings - Share IP is blank." +msgstr "Configuració de xarxa invàlida - IP en blanc." + +msgid "Invalid network settings - Share name is blank." +msgstr "Configuració de xarxa invàlida - Nom en blanc." + +msgid "Invalid save file" +msgstr "Fitxer de save invàlid" + +msgid "Invalid state file" +msgstr "Fitxer d'estat invàlid" + +msgid "Italian" +msgstr "Italià" + +msgid "Japanese" +msgstr "Japonès" + +msgid "Justifier" +msgstr "Justifier" + +msgid "Justifier - GameCube Controller" +msgstr "Justifier - Comandament GameCube" + +msgid "Justifier - Wiimote" +msgstr "Justifier - Wiimote" + +msgid "Korean" +msgstr "Coreà" + +msgid "L TRIG" +msgstr "L" + +msgid "Language" +msgstr "Llengua" + +msgid "Languages Folder" +msgstr "Carpeta d'idioma" + +msgid "Left" +msgstr "Esquerra" + +msgid "LEFT" +msgstr "ESQUERRA" + +msgid "Left Button" +msgstr "Botó esquerre" + +msgid "Load" +msgstr "Carregar" + +msgid "Load Device" +msgstr "Càrrega" + +msgid "Load Folder" +msgstr "Carpeta partides" + +msgid "Load Game" +msgstr "Carregar partida" + +msgid "Loading" +msgstr "Carregant" + +msgid "Loading DVD..." +msgstr "Carregant DVD..." + +msgid "Loading patch..." +msgstr "Carregant patch..." + +msgid "Loading..." +msgstr "Carregant..." + +msgid "Main Menu" +msgstr "Inici" + +msgid "Match GC Controls" +msgstr "Coincidir controls GC" + +msgid "Match Wii Controls" +msgstr "Coincidir controls Wii" + +msgid "Maximum filepath length reached!" +msgid "Llargada màxima de ruta!" + +msgid "Menu" +msgstr "Menú" + +msgid "Menu artwork" +msgstr "Artwork menú" + +msgid "Menu sound" +msgstr "So del menú" + +msgid "MINUS" +msgstr "MENYS" + +msgid "Music Volume" +msgstr "Volum música" + +msgid "Mute" +msgstr "Silenci" + +msgid "NES Controller" +msgstr "Comandament NES" + +msgid "NES Controllers (2)" +msgstr "Comandaments NES (2)" + +msgid "NES Controllers (4)" +msgstr "Comandaments NES (4)" + +msgid "NES Zapper" +msgstr "NES Zapper" + +msgid "Network" +msgstr "Xarxa" + +msgid "Network Share" +msgstr "Xarxa compartida" + +msgid "New" +msgstr "Nou" + +msgid "New Snapshot" +msgstr "Nova captura" + +msgid "New SRAM" +msgstr "Nova SRAM" + +msgid "No" +msgstr "No" + +msgid "No data to save!" +msgstr "cap dada per desar!" + +msgid "No disc inserted!" +msgstr "No hi ha cap disc!" + +msgid "No SRAM data to save!" +msgstr "Cap dada SRAM per desar!" + +msgid "No game saves found." +msgstr "No hi ha partides" + +msgid "None" +msgstr "Cap" + +msgid "NTSC (480i)" +msgstr "NTSC (480i)" + +msgid "Nunchuk" +msgstr "Nunchuk" + +msgid "Off" +msgstr "Off" + +msgid "Official Site: http://code.google.com/p/fceugc/" +msgstr "Lloc Oficial: http://code.google.com/p/fceugc/" + +msgid "Official Site: http://code.google.com/p/snes9x-gx/" +msgstr "Lloc Oficial: http://code.google.com/p/snes9x-gx/" + +msgid "Official Site: http://code.google.com/p/vba-wii/" +msgstr "Lloc Oficial: http://code.google.com/p/vba-wii/" + +msgid "OK" +msgstr "D'acord" + +msgid "On" +msgstr "Encès" + +msgid "Original" +msgstr "Original" + +msgid "Out of memory!" +msgstr "Fora de memòria!" + +msgid "Out of memory: too many files!" +msgstr "Memòria insuficient: massa fitxers!" + +msgid "P1" +msgstr "J1" + +msgid "P2" +msgstr "J2" + +msgid "P3" +msgstr "J3" + +msgid "P4" +msgstr "J4" + +msgid "PAL (50Hz)" +msgstr "PAL (50Hz)" + +msgid "PAL (60Hz)" +msgstr "PAL (60Hz)" + +msgid "Palette saved" +msgstr "Paleta desada" + +msgid "Partial Stretch" +msgstr "Ajustament parcial" + +msgid "Pause" +msgstr "Pausa" + +msgid "Please Wait" +msgstr "Espereu sisplau" + +msgid "PLUS" +msgstr "MÉS" + +msgid "Portuguese" +msgstr "Portugès" + +msgid "Power off Wii" +msgstr "Apagar la Wii" + +msgid "Preferences saved" +msgstr "Preferències desades" + +msgid "Press any button on the Classic Controller now. Press Home to clear the existing mapping." +msgstr "Premeu qualsevol botó al Comandament Clàssic. Premeu HOME per eliminar la configuració." + +msgid "Press any button on the GameCube Controller now. Press Home or the C-Stick in any direction to clear the existing mapping." +msgstr "Premeu qualsevol botó al comandament de GameCube. Premeu HOME o moveu el Stick-C per eliminar la configuració actual." + +msgid "Press any button on the GameCube Controller now. Press the C-Stick in any direction to clear the existing mapping." +msgstr "Premeu qualsevol botó al comandament de GameCube. Moveu el Stick-C per eliminar la configuració actual." + +msgid "Press any button on the Wiimote now. Press Home to clear the existing mapping." +msgstr "Premeu qualsevol botó al Wiimote. Premeu HOME per eliminar la configuració." + +msgid "Press any button on the Wiimote or Nunchuk now. Press Home to clear the existing mapping." +msgstr "Premeu qualsevol botó al Wiimote o al Nunchuk. Premeu HOME per eliminar la configuració" + +msgid "Progressive (480p)" +msgstr "Progressu (480p)" + +msgid "Quit Game" +msgstr "Treure joc" + +msgid "Quit this game? Any unsaved progress will be lost." +msgstr "Treure joc? Qualsevol progrés no desat serà perdut." + +msgid "R TRIG" +msgstr "R" + +msgid "RAM saving is not available for FDS games!" +msgstr "Desar RAM és incompatible per als jocs FDS!" + +msgid "Reboot" +msgstr "Reiniciar" + +msgid "Rendering" +msgstr "Renderitzat" + +msgid "Reset" +msgstr "Reset" + +msgid "Reset Game" +msgstr "Reiniciar" + +msgid "Reset this game? Any unsaved progress will be lost." +msgstr "Reiniciar joc? Es perdrà qualsevol progrés no desat." + +msgid "Reset Mappings" +msgstr "Reiniciar Config." + +msgid "Reset Settings" +msgstr "Reiniciar Config." + +msgid "Retry" +msgstr "Prova" + +msgid "Return to Loader" +msgstr "Tornar al Loader" + +msgid "Return to Wii Menu" +msgstr "Tornar al Menú Wii" + +msgid "Right" +msgstr "Dreta" + +msgid "RIGHT" +msgstr "DRETA" + +msgid "Right Button" +msgstr "Botó dret" + +msgid "Rumble" +msgstr "Vibració" + +msgid "Save" +msgstr "Desar" + +msgid "Save Device" +msgstr "Disp. desar" + +msgid "Save failed!" +msgstr "Error desant!" + +msgid "Save file not found" +msgstr "Fitxer save no trobat" + +msgid "Save Folder" +msgstr "Carpeta de save" + +msgid "Save Game" +msgstr "Desar Joc" + +msgid "Save RAM and State?" +msgstr "Desar RAM i estat?" + +msgid "Save Snapshot?" +msgstr "Desar imatge?" + +msgid "Save SRAM and Snapshot?" +msgstr "Desar SRAM i imatge?" + +msgid "Save State?" +msgstr "Desar estat?" + +msgid "Save successful" +msgstr "Partida desada" + +msgid "Saving" +msgstr "Desant" + +msgid "Saving preferences..." +msgstr "Desant preferències..." + +msgid "Saving..." +msgstr "Desant..." + +msgid "Scaling" +msgstr "Ajust" + +msgid "Screen Position" +msgstr "Posició pantalla" + +msgid "Screen Zoom" +msgstr "Zoom" + +msgid "Select" +msgstr "Select" + +msgid "Seek error!" +msgstr "Error seek!" + +msgid "Settings" +msgstr "Config." + +msgid "Settings - Menu" +msgstr "Config. - Menú" + +msgid "Settings - Network" +msgstr "Config. - Xarxa" + +msgid "Settings - Saving & Loading" +msgstr "Config. - Desar & Carregar" + +msgid "SD Card" +msgstr "Targeta SD" + +msgid "SD card not found!" +msgstr "No trobo targeta SD!" + +msgid "Shift" +msgstr "Maj." + +msgid "Simp_chinese" +msgstr "Xinès simpl." + +msgid "SMB Share IP" +msgstr "IP del SMB" + +msgid "SMB Share Name" +msgstr "Nom del SMB" + +msgid "SMB Share Password" +msgstr "Contrasenya del SMB" + +msgid "SMB Share Username" +msgstr "Usuari del SMB" + +msgid "Snapshot" +msgstr "Imatge" + +msgid "Snapshot (Auto)" +msgstr "Imatge (Auto)" + +msgid "SNES Controller" +msgstr "Comandament SNES" + +msgid "SNES Controllers (2)" +msgstr "Comandaments SNES (2)" + +msgid "SNES Controllers (4)" +msgstr "Comandaments SNES (4)" + +msgid "SNES Controller - Classic Controller" +msgstr "Comandament SNES - Comandament Clàssic" + +msgid "SNES Controller - GameCube Controller" +msgstr "Comandament SNES - Comandament GameCube" + +msgid "SNES Controller - Nunchuk + Wiimote" +msgstr "Comandament SNES - Nunchuk + Wiimote" + +msgid "SNES Controller - Wiimote" +msgstr "Comandament SNES - Wiimote" + +msgid "SNES Mouse" +msgstr "Ratolí SNES" + +msgid "SNES Mouse - GameCube Controller" +msgstr "Ratolí SNES - Comandament GameCube" + +msgid "SNES Mouse - Wiimote" +msgstr "Ratolí SNES - Wiimote" + +msgid "Snes9x - Copyright (c) Snes9x Team 1996 - 2006" +msgstr "Snes9x - Copyright (c) Snes9x Team 1996 - 2006" + +msgid "Sound Effects Volume" +msgstr "Volum d'efectes sonors" + +msgid "Spanish" +msgstr "Castellà" + +msgid "Sprite Limit" +msgstr "Límit sprites" + +msgid "SRAM file not found" +msgstr "No trobo fitxer SRAM" + +msgid "State" +msgstr "Estat" + +msgid "State (Auto)" +msgstr "Estat (Auto)" + +msgid "State file not found" +msgstr "No trobo fitxer d'estat" + +msgid "Stretch to Fit" +msgstr "Estirar a mida" + +msgid "Superscope" +msgstr "SuperScope" + +msgid "Superscope - GameCube Controller" +msgstr "SuperScope - Comandament GameCube" + +msgid "Superscope - Wiimote" +msgstr "SuperScope - Wiimote" + +msgid "This software is open source and may be copied," +msgstr "Aquest software és de codi obert i pot ser copiat," + +msgid "Trad_chinese" +msgstr "Xinès trad." + +msgid "Unable to initialize network!" +msgstr "Impossible iniciar la xarxa!" + +msgid "Unable to locate a load device!" +msgstr "No trobo dispositiu de càrrega!" + +msgid "Unable to locate a save device!" +msgstr "No trobo dispositiu per desar!" + +msgid "Unable to open snapshot!" +msgstr "Impossible obrir imatge!" + +msgid "Unfiltered" +msgstr "No filtrat" + +msgid "Unknown file type!" +msgstr "Fitxer desconegut!" + +msgid "Unrecognized DVD format." +msgstr "Format de DVD desconegut." + +msgid "Unrecognized file extension!" +msgstr "No reconec extensió fitxer!" + +msgid "Up" +msgstr "Amunt" + +msgid "UP" +msgstr "AMUNT" + +msgid "Up One Level" +msgstr "Pujar nivell" + +msgid "Update Available" +msgstr "Nova actualització" + +msgid "Update failed!" +msgstr "No actualitzat" + +msgid "Update later" +msgstr "Fer després" + +msgid "Update now" +msgstr "Actualitzar" + +msgid "Update successful!" +msgstr "Actualització feta!" + +msgid "USB drive not found!" +msgstr "No trobo dispositiu USB!" + +msgid "USB Mass Storage" +msgstr "Dispositiu USB" + +msgid "Vertical" +msgstr "Vertical" + +msgid "Video" +msgstr "Vídeo" + +msgid "Video Mode" +msgstr "Mode vídeo" + +msgid "VM8: Unknown page type!" +msgstr "VM8: Pàgina desconeguda!" + +msgid "VM16: Unknown page type!" +msgstr "VM16: Pàgina desconeguda!" + +msgid "VM32: Unknown page type!" +msgstr "VM32: Pàgina desconeguda!" + +msgid "Wiimote" +msgstr "Wiimote" + +msgid "Wiimote Orientation" +msgstr "Orientació Wiimote" + +msgid "Yes" +msgstr "Sí" + +msgid "Zapper" +msgstr "Nintendo Zapper" + +msgid "Zapper Crosshair" +msgstr "Punter Zapper" diff --git a/plugins/snes9x_gx/source/lang/de.lang b/plugins/snes9x_gx/source/lang/de.lang new file mode 100644 index 00000000..6c7321e1 --- /dev/null +++ b/plugins/snes9x_gx/source/lang/de.lang @@ -0,0 +1,854 @@ +msgid "&" +msgstr "" + +msgid "16:9 Correction" +msgstr "16:9" + +msgid "7z decompression failed: Archive contains too many files" +msgstr "7z Dekomprimierung fehlgeschlagen: Archiv enthält zu viele Dateien" + +msgid "7z decompression failed: Failed to read file data" +msgstr "7z Dekomprimierung fehlgeschlagen: Dateidaten konnten nicht gelesen werden" + +msgid "7z decompression failed: File is corrupt" +msgstr "7z Dekomprimierung fehlgeschlagen: Datei ist fehlerhaft" + +msgid "7z decompression failed: File is corrupt (CRC mismatch)" +msgstr "7z Dekomprimierung fehlgeschlagen: Datei ist fehlerhaft (CRC-Fehler)" + +msgid "7z decompression failed: File uses too high of compression settings (dictionary size is too large)" +msgstr "7z Dekomprimierung fehlgeschlagen: Datei benutzt zu hohe Komprimierungseinstellungen (Wörterbuch ist zu groß)" + +msgid "7z decompression failed: File uses unsupported compression settings" +msgstr "7z Dekomprimierung fehlgeschlagen: Datei benutzt nicht unterstüzte Komprimierungseinstellungen" + +msgid "A (Rapid)" +msgstr "A (Turbo)" + +msgid "Additional coding" +msgstr "Uusätzliche Programmierung" + +msgid "Aim Offscreen" +msgstr "Neben Bildsch. zielen" + +msgid "An update is available!" +msgstr "Ein Update ist verfügbar!" + +msgid "Are you sure that you want to reset this game? Any unsaved progress will be lost." +msgstr "Bist du sicher das du das Spiel zurücksetzen willst? Ungespeicherter Fortschritt geht verloren." + +msgid "Are you sure that you want to reset your mappings?" +msgstr "Bist du sicher das du deine Tastenbelegung zurücksetzten willst?" + +msgid "Are you sure that you want to reset your settings?" +msgstr "Bist du sicher das du die Einstellungen zurücksetzten willst?" + +msgid "Maintain Aspect Ratio" +msgstr "Bildschirmverhältnis" + +msgid "Attempting to determine load device..." +msgstr "Versuche Ladegerät zu ermitteln..." + +msgid "Attempting to determine save device..." +msgstr "Versuche Speichergerät zu ermitteln..." + +msgid "Auto" +msgstr "" + +msgid "Auto Detect" +msgstr "Auto. feststellen" + +msgid "Auto Load" +msgstr "Auto. laden" + +msgid "Auto Save" +msgstr "Auto. speichern" + +msgid "Automatic (Recommended)" +msgstr "Automatisch (Empfohlen)" + +msgid "B (Rapid)" +msgstr "B (Turbo)" + +msgid "Back" +msgstr "Zurück" + +msgid "Both" +msgstr "Beide" + +msgid "Button Mapping" +msgstr "Tastenbelegung" + +msgid "Button Mappings" +msgstr "Tasten Belegung" + +msgid "Cancel" +msgstr "Abbrechen" + +msgid "Caps" +msgstr "" + +msgid "Cheats" +msgstr "" + +msgid "Cheats file not found!" +msgstr "Cheatdatei nicht gefunden!" + +msgid "Cheats Folder" +msgstr "Ordner f. Cheats" + +msgid "Choose Game" +msgstr "Spiel auswählen" + +msgid "Classic Controller" +msgstr "" + +msgid "Close" +msgstr "Schließen" + +msgid "Coding" +msgstr "Programmierung" + +msgid "Coding & menu design" +msgstr "Programmierung & Menüdesign" + +msgid "Compressed GBA files are not supported!" +msgstr "Komprimierte GBA Dateien werden nicht unterstützt!" + +msgid "Connecting to network share..." +msgstr "Verbinde mit Netzwerk Share..." + +msgid "Controller" +msgstr "" + +msgid "Cover View" +msgstr "Cover anzeigen" + +msgid "Covers Folder" +msgstr "Ordner f. Cover" + +msgid "Credits" +msgstr "" + +msgid "Cropping" +msgstr "Pan & Scan" + +msgid "Crosshair" +msgstr "Fadenkreuz" + +msgid "Cursor" +msgstr "Eingabezeiger" + +msgid "Data DVD" +msgstr "Daten DVD" + +msgid "Default" +msgstr "Standard" + +msgid "Directory name is too long!" +msgstr "Verzeichnisname ist zu lang!" + +msgid "Disabled" +msgstr "Deaktiviert" + +msgid "DISABLED" +msgstr "DEAKTIVIERT" + +msgid "distributed, or modified under the terms of the" +msgstr "veröffentlich, oder verändert unter den Bedingungen der" + +msgid "Don't Save" +msgstr "Nicht speichern" + +msgid "Down" +msgstr "Unten" + +msgid "DOWN" +msgstr "UNTEN" + +msgid "Downloading..." +msgstr "Lade herunter..." + +msgid "Dutch" +msgstr "Niederländisch" + +msgid "Empty or invalid ZIP file!" +msgstr "Leere order ungültige ZIP Datei!" + +msgid "Enabled" +msgstr "Aktiviert" + +msgid "ENABLED" +msgstr "AKTIVIERT" + +msgid "English" +msgstr "Englisch" + +msgid "Error" +msgstr "Fehler" + +msgid "Error - Invalid ZIP file!" +msgstr "Fehler - Ungültige ZIP Datei!" + +msgid "Error creating file!" +msgstr "Fehler beim Erstellen der Datei!" + +msgid "Error loading game!" +msgstr "Fehler beim Laden des Spiels!" + +msgid "Error opening archive!" +msgstr "Fehler beim Öffnen des Archivs!" + +msgid "Error opening directory!" +msgstr "Fehler beim Öffnen des Verzeichnis'!" + +msgid "Error opening file!" +msgstr "Fehler beim Öffnen der Datei!" + +msgid "Error reading file!" +msgstr "Fehler beim Lesen der Datei!" + +msgid "Error saving file!" +msgstr "Fehler beim Speichern der Datei!" + +msgid "Exit" +msgstr "Beenden" + +msgid "Exit Action" +msgstr "Aktion beim Beenden" + +msgid "Failed to connect to network share." +msgstr "Verbinden mit Netzwerk Share ist fehlgeschlagen." + +msgid "FDS BIOS file is invalid!" +msgstr "FDS BIOS Datei ist ungültig!" + +msgid "FDS BIOS file not found!" +msgstr "FDS BIOS Datei nicht gefunden!" + +msgid "Filtered" +msgstr "Gefiltert" + +msgid "Filtering" +msgstr "Filter" + +msgid "Fire" +msgstr "Schießen" + +msgid "French" +msgstr "Französich" + +msgid "GBA Screen Zoom" +msgstr "GBA Bildschirm Zoom" + +msgid "Game Genie ROM not found!" +msgstr "Game Genie ROM nicht gefunden!" + +msgid "Game Settings" +msgstr "Spiel Einstellungen" + +msgid "Game Settings - Button Mappings" +msgstr "Spieleinstellungen - Tastenbelegung" + +msgid "Game Settings - Cheats" +msgstr "Spieleinstellungen - Cheats" + +msgid "Game Settings - Video" +msgstr "Spieleinstellungen - Video" + +msgid "Game Timing" +msgstr "Spiel Timing" + +msgid "Game Genie DISABLED" +msgstr "Game Genie DEAKTIVIERT" + +msgid "Game Genie ENABLED" +msgstr "Game Genie AKTIVIERT" + +msgid "GameCube Controller" +msgstr "" + +msgid "German" +msgstr "Deutsch" + +msgid "GNU General Public License (GPL) Version 2." +msgstr "" + +msgid "Go Back" +msgstr "Zurück" + +msgid "Horizontal" +msgstr "" + +msgid "Information" +msgstr "" + +msgid "Initializing network..." +msgstr "Initialisiere Netzwerk..." + +msgid "Insert Coin" +msgstr "Münze einwerfen" + +msgid "Insert Coin / Switch Disk" +msgstr "Münze einwerfen / Disc wechseln" + +msgid "Invalid file size!" +msgstr "Ungültige Dateigröße!" + +msgid "Invalid game file!" +msgstr "Ungültige Spieldatei!" + +msgid "Invalid network settings - Check settings.xml." +msgstr "Ungültige Netzwerkeinstellung - Prüfe die settings.xml." + +msgid "Invalid network settings - Share IP is blank." +msgstr "Ungültige Netzwerkeinstellung - Share IP ist leer." + +msgid "Invalid network settings - Share name is blank." +msgstr "Ungültige Netzwerkeinstellung - Share Name ist leer." + +msgid "Invalid save file" +msgstr "Ungültige Speicherdatei" + +msgid "Invalid state file" +msgstr "Ungültige Statusdatei" + +msgid "Italian" +msgstr "Italienisch" + +msgid "Japanese" +msgstr "Japanisch" + +msgid "Justifier" +msgstr "" + +msgid "Justifier - GameCube Controller" +msgstr "" + +msgid "Justifier - Wiimote" +msgstr "Justifier - Wii-FB" + +msgid "Korean" +msgstr "Koreanisch" + +msgid "L TRIG" +msgstr "" + +msgid "Language" +msgstr "Sprache" + +msgid "Languages Folder" +msgstr "Ordner f. Sprachen" + +msgid "Left" +msgstr "Links" + +msgid "LEFT" +msgstr "LINKS" + +msgid "Left Button" +msgstr "Linke Taste" + +msgid "Load" +msgstr "Laden" + +msgid "Load Device" +msgstr "Startgerät" + +msgid "Load Folder" +msgstr "Ordner f. ROMs" + +msgid "Load Game" +msgstr "Spiel laden" + +msgid "Loading" +msgstr "Laden" + +msgid "Loading DVD..." +msgstr "Lade DVD..." + +msgid "Loading patch..." +msgstr "Lade Patch..." + +msgid "Loading..." +msgstr "Lade..." + +msgid "Main Menu" +msgstr "Hauptmenü" + +msgid "Match GC Controls" +msgstr "GC Steuerung anpassen" + +msgid "Match Wii Controls" +msgstr "Wii Steuerung anpassen" + +msgid "Maximum filepath length reached!" +msgid "Maximale Länge für Dateipfade erreicht!" + +msgid "Menu" +msgstr "Menü" + +msgid "Menu artwork" +msgstr "Menü Artwork" + +msgid "Menu sound" +msgstr "Menü Sound" + +msgid "MINUS" +msgstr "" + +msgid "Music Volume" +msgstr "Musik Lautstärke" + +msgid "Mute" +msgstr "Stumm" + +msgid "NES Controller" +msgstr "" + +msgid "NES Controllers (2)" +msgstr "" + +msgid "NES Controllers (4)" +msgstr "" + +msgid "NES Zapper" +msgstr "" + +msgid "Network" +msgstr "Netzwerk" + +msgid "Network Share" +msgstr "Netzwerk Share" + +msgid "New" +msgstr "Neu" + +msgid "New Snapshot" +msgstr "Neuer Schnappschuss" + +msgid "New SRAM" +msgstr "Neuer SRAM" + +msgid "No" +msgstr "Nein" + +msgid "No data to save!" +msgstr "Keine Daten gespeichert!" + +msgid "No disc inserted!" +msgstr "Keine Disc eingelegt!" + +msgid "No SRAM data to save!" +msgstr "Keine SRAM Daten zum speichern!" + +msgid "No game saves found." +msgstr "Kein Spielstand gefunden." + +msgid "None" +msgstr "Nichts" + +msgid "NTSC (480i)" +msgstr "" + +msgid "Nunchuk" +msgstr "" + +msgid "Off" +msgstr "Aus" + +msgid "Official Site: http://code.google.com/p/fceugc/" +msgstr "Offizielle Seite: http://code.google.com/p/fceugc/" + +msgid "Official Site: http://code.google.com/p/snes9x-gx/" +msgstr "Offizielle Seite: http://code.google.com/p/snes9x-gx/" + +msgid "Official Site: http://code.google.com/p/vba-wii/" +msgstr "Offizielle Seite: http://code.google.com/p/vba-wii/" + +msgid "OK" +msgstr "" + +msgid "On" +msgstr "An" + +msgid "Original" +msgstr "" + +msgid "Out of memory!" +msgstr "Nicht genug Speicher!" + +msgid "Out of memory: too many files!" +msgstr "Nicht genug Speicher: Zu viele Dateien!" + +msgid "P1" +msgstr "S1" + +msgid "P2" +msgstr "S2" + +msgid "P3" +msgstr "S3" + +msgid "P4" +msgstr "S4" + +msgid "PAL (50Hz)" +msgstr "" + +msgid "PAL (60Hz)" +msgstr "" + +msgid "Palette saved" +msgstr "Palette gespeichert" + +msgid "Partial Stretch" +msgstr "Partiell gestreckt" + +msgid "Pause" +msgstr "" + +msgid "Please Wait" +msgstr "Bitte Warten" + +msgid "PLUS" +msgstr "" + +msgid "Portuguese" +msgstr "Portugiesisch" + +msgid "Power off Wii" +msgstr "Wii ausschalten" + +msgid "Preferences saved" +msgstr "Einstellungen gespeichert" + +msgid "Press any button on the Classic Controller now. Press Home to clear the existing mapping." +msgstr "Drücke jetzt eine Taste auf dem Classic Controller. Drücke HOME um die vorhandene Belegung zu löschen." + +msgid "Press any button on the GameCube Controller now. Press Home or the C-Stick in any direction to clear the existing mapping." +msgstr "Drücke jetzt eine Taste auf dem GameCube Controller. Drücke HOME oder den C-Stick in eine beliebige Richtung um die vorhandene Belegung zu löschen." + +msgid "Press any button on the GameCube Controller now. Press the C-Stick in any direction to clear the existing mapping." +msgstr "Drücke jetzt eine Taste auf dem GameCube Controller. Drücke den C-Stick in eine beliebige Richtung um die vorhandene Belegung zu löschen." + +msgid "Press any button on the Wiimote now. Press Home to clear the existing mapping." +msgstr "Drücke jetzt eine Taste auf der Wii-FB. Drücke HOME um die vorhandene Belegung zu löschen." + +msgid "Press any button on the Wiimote or Nunchuk now. Press Home to clear the existing mapping." +msgstr "Drücke jetzt eine Taste auf der Wii-FB oder dem Nunchuk. Drücke HOME um die vorhandene Belegung zu löschen." + +msgid "Progressive (480p)" +msgstr "" + +msgid "Quit Game" +msgstr "Spiel beenden" + +msgid "Quit this game? Any unsaved progress will be lost." +msgstr "Dieses Spiel beenden? Ungespeicherter Fortschritt geht verloren." + +msgid "R TRIG" +msgstr "" + +msgid "RAM saving is not available for FDS games!" +msgstr "RAM speichern ist für FDS Spiele nicht verfügbar!" + +msgid "Reboot" +msgstr "Neustart" + +msgid "Rendering" +msgstr "Darstellung" + +msgid "Reset" +msgstr "Zurücksetzen" + +msgid "Reset Game" +msgstr "Spiel zurücksetzen" + +msgid "Reset this game? Any unsaved progress will be lost." +msgstr "Spiel zurücksetzen? Nicht gespeicherte Fortschritte gehen verloren." + +msgid "Reset Mappings" +msgstr "Belegung zurücksetzen" + +msgid "Reset Settings" +msgstr "Zurücksetzen" + +msgid "Retry" +msgstr "Wiederholen" + +msgid "Return to Loader" +msgstr "Zum Loader zurückkehren" + +msgid "Return to Wii Menu" +msgstr "Zum Wii Menü zurückkehren" + +msgid "Right" +msgstr "Rechts" + +msgid "RIGHT" +msgstr "RECHTS" + +msgid "Right Button" +msgstr "Rechte Taste" + +msgid "Rumble" +msgstr "" + +msgid "Save" +msgstr "Speichern" + +msgid "Save Device" +msgstr "Speichergerät" + +msgid "Save failed!" +msgstr "Speichern fehlgeschlagen!" + +msgid "Save file not found" +msgstr "Speicherdatei nicht gefunden" + +msgid "Save Folder" +msgstr "Ordner f. Spielstände" + +msgid "Save Game" +msgstr "Spiel speichern" + +msgid "Save RAM and State?" +msgstr "RAM und Status speichern?" + +msgid "Save Snapshot?" +msgstr "Schnappschuss speichern?" + +msgid "Save SRAM and Snapshot?" +msgstr "SRAM und Schnappschuss speichern?" + +msgid "Save State?" +msgstr "Status speichern?" + +msgid "Save successful" +msgstr "Erfolgreich gespeichert" + +msgid "Saving" +msgstr "Speichern" + +msgid "Saving preferences..." +msgstr "Einstellungen werden gespeichert..." + +msgid "Saving..." +msgstr "Speichern..." + +msgid "Scaling" +msgstr "Auflösung" + +msgid "Screen Position" +msgstr "Bildschirm Position" + +msgid "Screen Zoom" +msgstr "Bildschirm Zoom" + +msgid "Select" +msgstr "" + +msgid "Seek error!" +msgstr "Seekfehler!" + +msgid "Settings" +msgstr "Einstellungen" + +msgid "Settings - Menu" +msgstr "Einstellungen - Menü" + +msgid "Settings - Network" +msgstr "Einstellungen - Netzwerk" + +msgid "Settings - Saving & Loading" +msgstr "Einstellungen - Speichern & Laden" + +msgid "SD Card" +msgstr "" + +msgid "SD card not found!" +msgstr "SD Card nicht gefunden!" + +msgid "Shift" +msgstr "" + +msgid "Simp_chinese" +msgstr "Vereinfachtes Chinesisch" + +msgid "SMB Share IP" +msgstr "" + +msgid "SMB Share Name" +msgstr "" + +msgid "SMB Share Password" +msgstr "SMB Share Passwort" + +msgid "SMB Share Username" +msgstr "SMB Share Benutzername" + +msgid "Snapshot" +msgstr "Schnappschuss" + +msgid "Snapshot (Auto)" +msgstr "Schnappschuss (Auto)" + +msgid "SNES Controller" +msgstr "" + +msgid "SNES Controllers (2)" +msgstr "" + +msgid "SNES Controllers (4)" +msgstr "" + +msgid "SNES Controller - Classic Controller" +msgstr "" + +msgid "SNES Controller - GameCube Controller" +msgstr "" + +msgid "SNES Controller - Nunchuk + Wiimote" +msgstr "SNES Controller - Nunchuk + Wii-FB" + +msgid "SNES Controller - Wiimote" +msgstr "SNES Controller - Wii-FB" + +msgid "SNES Mouse" +msgstr "SNES Maus" + +msgid "SNES Mouse - GameCube Controller" +msgstr "SNES Maus - GameCube Controller" + +msgid "SNES Mouse - Wiimote" +msgstr "SNES Maus - Wii-FB" + +msgid "Snes9x - Copyright (c) Snes9x Team 1996 - 2006" +msgstr "" + +msgid "Sound Effects Volume" +msgstr "SFX Lautstärke" + +msgid "Spanish" +msgstr "Spanisch" + +msgid "Sprite Limit" +msgstr "" + +msgid "SRAM file not found" +msgstr "SRAM Datei nicht gefunden" + +msgid "State" +msgstr "Status" + +msgid "State (Auto)" +msgstr "Status (Auto)" + +msgid "State file not found" +msgstr "Statusdatei nicht gefunden" + +msgid "Stretch to Fit" +msgstr "Strecken zum Einpassen" + +msgid "Superscope" +msgstr "" + +msgid "Superscope - GameCube Controller" +msgstr "" + +msgid "Superscope - Wiimote" +msgstr "Superscope - Wii-FB" + +msgid "This software is open source and may be copied," +msgstr "Diese Software ist Open Source und evtl. kopiert," + +msgid "Trad_chinese" +msgstr "Traditionelles Chinesisch" + +msgid "Unable to initialize network!" +msgstr "Netzwerk konnte nicht initialisiert werden!" + +msgid "Unable to locate a load device!" +msgstr "Ladegerät konnte nicht gefunden werden!" + +msgid "Unable to locate a save device!" +msgstr "Speichergerät konnte nicht gefunden werden!" + +msgid "Unable to open snapshot!" +msgstr "Schnappschuss konnte nicht geöffnet werden!" + +msgid "Unfiltered" +msgstr "Ungefiltert" + +msgid "Unknown file type!" +msgstr "Unbekannter Dateityp!" + +msgid "Unrecognized DVD format." +msgstr "Unbekanntes DVD Format." + +msgid "Unrecognized file extension!" +msgstr "Unbekannte Dateiendung!" + +msgid "Up" +msgstr "Oben" + +msgid "UP" +msgstr "OBEN" + +msgid "Up One Level" +msgstr "Eine Ebene nach oben" + +msgid "Update Available" +msgstr "Update verfügbar" + +msgid "Update failed!" +msgstr "Aktualisierung fehlgeschlagen!" + +msgid "Update later" +msgstr "Später updaten" + +msgid "Update now" +msgstr "Jetzt updaten" + +msgid "Update successful!" +msgstr "Aktualisierung erfolgreich!" + +msgid "USB drive not found!" +msgstr "USB Laufwerk nicht gefunden!" + +msgid "USB Mass Storage" +msgstr "USB Massenspeicher" + +msgid "Vertical" +msgstr "Vertikal" + +msgid "Video" +msgstr "Bild" + +msgid "Video Mode" +msgstr "Videomodus" + +msgid "VM8: Unknown page type!" +msgstr "VM8: Unbekannter Seitentyp!" + +msgid "VM16: Unknown page type!" +msgstr "VM16: Unbekannter Seitentyp!" + +msgid "VM32: Unknown page type!" +msgstr "VM32: Unbekannter Seitentyp!" + +msgid "Wiimote" +msgstr "Wii-FB" + +msgid "Wiimote Orientation" +msgstr "Wii-FB Ausrichtung" + +msgid "Yes" +msgstr "Ja" + +msgid "Zapper" +msgstr "" + +msgid "Zapper Crosshair" +msgstr "Zapper Fadenkreuz" diff --git a/plugins/snes9x_gx/source/lang/en.lang b/plugins/snes9x_gx/source/lang/en.lang new file mode 100644 index 00000000..85d83649 --- /dev/null +++ b/plugins/snes9x_gx/source/lang/en.lang @@ -0,0 +1,2 @@ +msgid " " +msgstr "" diff --git a/plugins/snes9x_gx/source/lang/es.lang b/plugins/snes9x_gx/source/lang/es.lang new file mode 100644 index 00000000..89f972ab --- /dev/null +++ b/plugins/snes9x_gx/source/lang/es.lang @@ -0,0 +1,446 @@ +msgid "&" +msgstr "" + +msgid "Up" +msgstr "Arriba" + +msgid "Down" +msgstr "Abajo" + +msgid "Left" +msgstr "Izquierda" + +msgid "Right" +msgstr "Derecha" + +msgid "PLUS" +msgstr "MAS" + +msgid "MINUS" +msgstr "MENOS" + +msgid "Aim Offscreen" +msgstr "Apuntar Fuera de Pantalla" + +msgid "Cursor" +msgstr "" + +msgid "Turbo On" +msgstr "Turbo Encendido" + +msgid "Turbo Off" +msgstr "Turbo Apagado" + +msgid "Pause" +msgstr "Pausa" + +msgid "START" +msgstr "Inicio" + +msgid "16:9 Correction" +msgstr "Corrección 16:9" + +msgid "An update is available!" +msgstr "¡Actualización disponible!" + +msgid "Are you sure that you want to reset this game? Any unsaved progress will be lost." +msgstr "¿Seguro que desea reiniciar este juego? Se perderá cualquier progreso no salvado." + +msgid "Are you sure that you want to reset your mappings?" +msgstr "¿Seguro que desea reinicializar los controles?" + +msgid "Are you sure that you want to reset your settings?" +msgstr "¿Seguro que desea reinicializar la configuración?" + +msgid "Auto" +msgstr "Auto" + +msgid "Auto Detect" +msgstr "Auto Detect." + +msgid "Auto Load" +msgstr "Auto Cargar" + +msgid "Auto Save" +msgstr "Auto Salvar" + +msgid "Automatic (Recommended)" +msgstr "Automático (Recomendado)" + +msgid "Back" +msgstr "Atrás" + +msgid "Both" +msgstr "Ambos" + +msgid "Button Mapping" +msgstr "Controles" + +msgid "Button Mappings" +msgstr "Redefinir Controles" + +msgid "Cancel" +msgstr "Cancelar" + +msgid "Caps" +msgstr "" + +msgid "Cheats" +msgstr "Cheats" + +msgid "Cheats file not found!" +msgstr "¡Cheats no encontrado!" + +msgid "Cheats Folder" +msgstr "Carpeta Cheats" + +msgid "Choose Game" +msgstr "Elegir Juego" + +msgid "Classic Controller" +msgstr "Mando Clásico" + +msgid "Close" +msgstr "Cerrar" + +msgid "Coding" +msgstr "Programación" + +msgid "Coding & menu design" +msgstr "Código & diseño de menú" + +msgid "Controller" +msgstr "Mando" + +msgid "Cover View" +msgstr "Vista Portada" + +msgid "Covers Folder" +msgstr "Carpeta Portadas" + +msgid "Wii U Pro Controller" +msgstr "Mando Wii U Pro" + +msgid "Screenshots Folder" +msgstr "Carpeta Img. Pantalla" + +msgid "Credits" +msgstr "Créditos" + +msgid "Default" +msgstr "Por defecto" + +msgid "Disabled" +msgstr "Deshabilitado" + +msgid "distributed, or modified under the terms of the" +msgstr "distribuido, o modificado bajo los términos de" + +msgid "Don't Save" +msgstr "No Salvar" + +msgid "Enabled" +msgstr "Habilitado" + +msgid "Error" +msgstr "Error" + +msgid "Exit" +msgstr "Salir" + +msgid "Exit Action" +msgstr "Acción de Salir" + +msgid "Filtered" +msgstr "Filtrado" + +msgid "Filtering" +msgstr "Filtrar" + +msgid "Game Settings" +msgstr "Configuración" + +msgid "Game Settings - Button Mappings" +msgstr "Configuración - Redefinir Controles" + +msgid "Game Settings - Cheats" +msgstr "Configuración - Cheats" + +msgid "Game Settings - Video" +msgstr "Configuración - Vídeo" + +msgid "GameCube Controller" +msgstr "Mando de GameCube" + +msgid "GNU General Public License (GPL) Version 2." +msgstr "GNU General Public License (GPL) Versión 2." + +msgid "Go Back" +msgstr "Volver" + +msgid "Horizontal" +msgstr "" + +msgid "Information" +msgstr "Información" + +msgid "Justifier" +msgstr "Justificado" + +msgid "Language" +msgstr "Idioma" + +msgid "Languages Folder" +msgstr "Carpeta Idiomas" + +msgid "Load" +msgstr "Cargar" + +msgid "Load Device" +msgstr "Cargar Dispositivo" + +msgid "Load Folder" +msgstr "Cargar Carpeta" + +msgid "Load Game" +msgstr "Cargar Juego" + +msgid "Loading" +msgstr "Cargando" + +msgid "Main Menu" +msgstr "Menú Principal" + +msgid "Menu" +msgstr "Menú" + +msgid "Menu artwork" +msgstr "Artwork del menú" + +msgid "Menu sound" +msgstr "Sonido del menú" + +msgid "Music Volume" +msgstr "Volumen Música" + +msgid "Mute" +msgstr "Silenciar" + +msgid "Network" +msgstr "Red" + +msgid "No" +msgstr "No" + +msgid "No game saves found." +msgstr "No hay partidas salvadas." + +msgid "NTSC (480i)" +msgstr "" + +msgid "Nunchuk" +msgstr "" + +msgid "Off" +msgstr "" + +msgid "Official Site: http://code.google.com/p/snes9x-gx/" +msgstr "Sitio Oficial: http://code.google.com/p/snes9x-gx/" + +msgid "OK" +msgstr "" + +msgid "On" +msgstr "" + +msgid "Original" +msgstr "" + +msgid "PAL (50Hz)" +msgstr "" + +msgid "PAL (60Hz)" +msgstr "" + +msgid "Please Wait" +msgstr "Espere, por favor" + +msgid "Power off Wii" +msgstr "Apagar Wii" + +msgid "Press any button on the Classic Controller now. Press Home to clear the existing mapping." +msgstr "Presione un botón en el Mando Clásico. Presione HOME para eliminar la configuración actual." + +msgid "Press any button on the GameCube Controller now. Press Home or the C-Stick in any direction to clear the existing mapping." +msgstr "Presione un botón en el Mando de GameCube. Presione HOME o mueva el el Stick-C para eliminar la configuración actual." + +msgid "Press any button on the GameCube Controller now. Press the C-Stick in any direction to clear the existing mapping." +msgstr "Presione un botón en el Mando de GameCube. Mueva el el Stick-C para eliminar la configuración actual." + +msgid "Press any button on the Wiimote now. Press Home to clear the existing mapping." +msgstr "Presione un botón en el Wiimote. Presione HOME para eliminar la configuración actual." + +msgid "Press any button on the Wiimote or Nunchuk now. Press Home to clear the existing mapping." +msgstr "Presione un botón en el Wiimote o Nunchuck. Presione HOME para eliminar la configuración actual." + +msgid "Press any button on the Wii U Pro Controller now. Press Home to clear the existing mapping." +msgstr "Presione un botón en el Mando Wii U Pro. Presione HOME para eliminar la configuración actual." + +msgid "ScreenShot" +msgstr "Pantalla" + +msgid "Preview Screenshot" +msgstr "Imagen de Pantalla" + +msgid "Save a new Preview Screenshot? Current Screenshot image will be overwritten." +msgstr "¿Grabar una nueva imagen de pantalla? La imagen actual será sobre-escrita." + +msgid "Progressive (480p)" +msgstr "Progresivo (480p)" + +msgid "Quit Game" +msgstr "Salir" + +msgid "Quit this game? Any unsaved progress will be lost." +msgstr "¿Salir? Se perderá cualquier progreso no salvado." + +msgid "Reboot" +msgstr "Reiniciar" + +msgid "Rendering" +msgstr "Renderizado" + +msgid "Reset" +msgstr "Reinicializar" + +msgid "Reset Game" +msgstr "Reinicializar" + +msgid "Reset Mappings" +msgstr "Reinicializar" + +msgid "Reset Settings" +msgstr "Reinicializar" + +msgid "Retry" +msgstr "Reintentar" + +msgid "Return to Loader" +msgstr "Volver al Loader" + +msgid "Return to Wii Menu" +msgstr "Volver al menú de Wii" + +msgid "Rumble" +msgstr "Vibración" + +msgid "Save" +msgstr "Salvar" + +msgid "Save Device" +msgstr "Salvar Dispositivo" + +msgid "Save Folder" +msgstr "Salvar Carpeta" + +msgid "Save Game" +msgstr "Salvar Juego" + +msgid "Save Snapshot?" +msgstr "Salvar Instantánea?" + +msgid "Save SRAM and Snapshot?" +msgstr "Salvar SRAM e Instantánea?" + +msgid "Saving" +msgstr "Grabando" + +msgid "Scaling" +msgstr "Scaling" + +msgid "Screen Position" +msgstr "Posición Pantalla" + +msgid "Screen Zoom" +msgstr "Zoom Pantalla" + +msgid "Settings" +msgstr "Configuración" + +msgid "Settings - Menu" +msgstr "Configuración - Menú" + +msgid "Settings - Network" +msgstr "Configuración - Red" + +msgid "Settings - Saving & Loading" +msgstr "Configuración - Grabar y Cargar" + +msgid "Shift" +msgstr "Mayús." + +msgid "SMB Share IP" +msgstr "IP del SMB" + +msgid "SMB Share Name" +msgstr "Nombre del SMB" + +msgid "SMB Share Password" +msgstr "Contraseña del SMB" + +msgid "SMB Share Username" +msgstr "Usuario del SMB" + +msgid "Snapshot" +msgstr "Instantánea" + +msgid "SNES Controller" +msgstr "Mando de SNES" + +msgid "SNES Mouse" +msgstr "Ratón de SNES" + +msgid "Snes9x - Copyright (c) Snes9x Team 1996 - 2006" +msgstr "" + +msgid "Sound Effects Volume" +msgstr "Volumen Efectos" + +msgid "Super Scope" +msgstr "" + +msgid "This software is open source and may be copied," +msgstr "Este software es de código abierto y puede ser copiado," + +msgid "Unfiltered" +msgstr "No filtrado" + +msgid "Up One Level" +msgstr "Subir Nivel" + +msgid "Update Available" +msgstr "Actualización disponible" + +msgid "Update later" +msgstr "Actualizar después" + +msgid "Update now" +msgstr "Actualizar ya" + +msgid "Vertical" +msgstr "" + +msgid "Video" +msgstr "Vídeo" + +msgid "Video Mode" +msgstr "Modo de Vídeo" + +msgid "Wiimote" +msgstr "" + +msgid "Wiimote Orientation" +msgstr "Orientación del Wiimote" + +msgid "Yes" +msgstr "Sí" \ No newline at end of file diff --git a/plugins/snes9x_gx/source/lang/fr.lang b/plugins/snes9x_gx/source/lang/fr.lang new file mode 100644 index 00000000..e69456e5 --- /dev/null +++ b/plugins/snes9x_gx/source/lang/fr.lang @@ -0,0 +1,866 @@ +msgid "&" +msgstr "&" + +msgid "16:9 Correction" +msgstr "Correction 16:9" + +msgid "7z decompression failed: Archive contains too many files" +msgstr "La décompression 7z a échoué : l'archive contient trop de fichiers" + +msgid "7z decompression failed: Failed to read file data" +msgstr "La décompression 7z a échoué : la lecture des données du fichier a échoué" + +msgid "7z decompression failed: File is corrupt" +msgstr "La décompression 7z a échoué : le fichier est corrompu" + +msgid "7z decompression failed: File is corrupt (CRC mismatch)" +msgstr "La décompression 7z a échoué : le fichier est corrompu (erreur de contrôle de redondance cyclique - CRC)" + +msgid "7z decompression failed: File uses too high of compression settings (dictionary size is too large)" +msgstr "La décompression 7z a échoué : le fichier utilise un paramètre de compression trop élevé (taille du dictionnaire trop haute)" + +msgid "7z decompression failed: File uses unsupported compression settings" +msgstr "La décompression 7z a échoué : le fichier utilise des paramètres de compression non supportés" + +msgid "A (Rapid)" +msgstr "A (Rapide)" + +msgid "Additional coding" +msgstr "Programmation additionnelle" + +msgid "Aim Offscreen" +msgstr "Visée hors champ" + +msgid "An update is available!" +msgstr "Une mise à jour est disponible !" + +msgid "Are you sure that you want to reset this game? Any unsaved progress will be lost." +msgstr "Êtes-vous sûr de vouloir redémarrer ce jeu ? Toute progression non sauvegardée sera perdue." + +msgid "Are you sure that you want to reset your mappings?" +msgstr "Êtes-vous sûr de vouloir réinitialiser les touches ?" + +msgid "Are you sure that you want to reset your settings?" +msgstr "Êtes-vous sûr de vouloir réinitialiser tout les paramètres ?" + +msgid "Maintain Aspect Ratio" +msgstr "Conserver les proportions" + +msgid "Attempting to determine load device..." +msgstr "Tentative de détection du périphérique d'entrée..." + +msgid "Attempting to determine save device..." +msgstr "Tentative de détection du périphérique de sauvegarde..." + +msgid "Auto" +msgstr "Auto" + +msgid "Auto Detect" +msgstr "Détection Auto" + +msgid "Auto Load" +msgstr "Chargement Auto" + +msgid "Auto Save" +msgstr "Sauvegarde Auto" + +msgid "Automatic (Recommended)" +msgstr "Automatique (Recommandé)" + +msgid "B (Rapid)" +msgstr "B (Rapide)" + +msgid "Back" +msgstr "Retour" + +msgid "Both" +msgstr "Les deux" + +msgid "Button Mapping" +msgstr "Contrôles" + +msgid "Button Mappings" +msgstr "Redéfinir les touches" + +msgid "Cancel" +msgstr "Annuler" + +msgid "Caps" +msgstr "Verr.Maj" + +msgid "Catalan" +msgstr "Catalan" + +msgid "Cheats" +msgstr "Cheats" + +msgid "Cheats file not found!" +msgstr "Fichier Cheats non trouvé !" + +msgid "Cheats Folder" +msgstr "Dossier Cheats" + +msgid "Choose Game" +msgstr "Choisir un jeu" + +msgid "Classic Controller" +msgstr "Manette Classique" + +msgid "Close" +msgstr "Fermer" + +msgid "Coding" +msgstr "Programmation" + +msgid "Coding & menu design" +msgstr "Programmation & design du menu" + +msgid "Compressed GBA files are not supported!" +msgstr "Les fichiers GBA compressés ne sont pas supportés !" + +msgid "Connecting to network share..." +msgstr "Connection au partage réseau en cours..." + +msgid "Controller" +msgstr "Contrôleur" + +msgid "Cover View" +msgstr "Vue Jaquette" + +msgid "Covers Folder" +msgstr "Dossier des jaquettes" + +msgid "Credits" +msgstr "Crédits" + +msgid "Cropping" +msgstr "Recadrage" + +msgid "Crosshair" +msgstr "Réticule de visée" + +msgid "Cursor" +msgstr "Curseur" + +msgid "Data DVD" +msgstr "Données DVD" + +msgid "Default" +msgstr "Par défaut" + +msgid "Directory name is too long!" +msgstr "Le nom du répertoire est trop long !" + +msgid "Disabled" +msgstr "Désactivé" + +msgid "DISABLED" +msgstr "DÉSACTIVÉ" + +msgid "distributed, or modified under the terms of the" +msgstr "distribuée, ou modifiée selon les termes de" + +msgid "Don't Save" +msgstr "Ne pas sauver" + +msgid "Down" +msgstr "Bas" + +msgid "DOWN" +msgstr "BAS" + +msgid "Downloading..." +msgstr "Téléchargement en cours..." + +msgid "Dutch" +msgstr "Néerlandais" + +msgid "Empty or invalid ZIP file!" +msgstr "Fichier ZIP vide ou invalide !" + +msgid "Enabled" +msgstr "Activé" + +msgid "ENABLED" +msgstr "ACTIVÉ" + +msgid "English" +msgstr "Anglais" + +msgid "Error" +msgstr "Erreur" + +msgid "Error - Invalid ZIP file!" +msgstr "Erreur - Fichier ZIP invalide !" + +msgid "Error creating file!" +msgstr "Une erreur est survenue à la création du fichier !" + +msgid "Error loading game!" +msgstr "Erreur de chargement du jeu !" + +msgid "Error opening archive!" +msgstr "Erreur lors de l'ouverture de l'archive !" + +msgid "Error opening directory!" +msgstr "Erreur lors de l'ouverture du répertoire !" + +msgid "Error opening file!" +msgstr "Erreur lors de l'ouverture du fichier !" + +msgid "Error reading file!" +msgstr "Une erreur est survenue à la lecture du fichier !" + +msgid "Error saving file!" +msgstr "Erreur lors de la sauvegarde du fichier !" + +msgid "Exit" +msgstr "Sortir" + +msgid "Exit Action" +msgstr "Sortie de l'émulateur" + +msgid "Failed to connect to network share." +msgstr "La connection au partage réseau a échoué." + +msgid "FDS BIOS file is invalid!" +msgstr "Le fichier du BIOS du FDS (Famicom Disk System) est invalide !" + +msgid "FDS BIOS file not found!" +msgstr "Le fichier du BIOS du FDS (Famicom Disk System) est introuvable !" + +msgid "Filtered" +msgstr "Filtré" + +msgid "Filtering" +msgstr "Filtrage" + +msgid "Fire" +msgstr "Tirer" + +msgid "French" +msgstr "Français" + +msgid "GBA Screen Zoom" +msgstr "Zoom écran GBA" + +msgid "Game Genie ROM not found!" +msgstr "La ROM Game Genie est introuvable !" + +msgid "Game Settings" +msgstr "Configuration" + +msgid "Game Settings - Button Mappings" +msgstr "Configuration - Redéfinir les touches" + +msgid "Game Settings - Cheats" +msgstr "Configuration - Cheats" + +msgid "Game Settings - Video" +msgstr "Configuration - Vidéo" + +msgid "Game Timing" +msgstr "Timing du jeu" + +msgid "Game Genie DISABLED" +msgstr "Game Genie Désactivé" + +msgid "Game Genie ENABLED" +msgstr "Game Genie Activé" + +msgid "GameCube Controller" +msgstr "Manette Gamecube" + +msgid "German" +msgstr "Allemand" + +msgid "GNU General Public License (GPL) Version 2." +msgstr "la Licence Publique Générale (GPL) GNU Version 2." + +msgid "Go Back" +msgstr "Retour" + +msgid "Horizontal" +msgstr "Horizontal" + +msgid "Information" +msgstr "Information" + +msgid "Initializing network..." +msgstr "Initialisation du réseau en cours..." + +msgid "Insert Coin" +msgstr "Insérer une pièce" + +msgid "Insert Coin / Switch Disk" +msgstr "Insér. une pièce/Chang. disqtte" + +msgid "Invalid file size!" +msgstr "Taille du fichier invalide" + +msgid "Invalid game file!" +msgstr "Taille du fichier du jeu invalide" + +msgid "Invalid network settings - Check settings.xml." +msgstr "Paramètres réseau invalides - Veuillez vérifier le fichier settings.xml." + +msgid "Invalid network settings - Share IP is blank." +msgstr "Paramètres réseau invalides - L'IP partagée n'est pas renseignée." + +msgid "Invalid network settings - Share name is blank." +msgstr "Paramètres réseau invalides - Le nom du partage n'est pas renseigné." + +msgid "Invalid save file" +msgstr "Fichier de sauvegarde invalide" + +msgid "Invalid state file" +msgstr "Fichier de sauvegarde d'état invalide" + +msgid "Italian" +msgstr "Italien" + +msgid "Japanese" +msgstr "Japonais" + +msgid "Justifier" +msgstr "Konami Justifier" + +msgid "Justifier - GameCube Controller" +msgstr "Konami Justifier - Manette GameCube" + +msgid "Justifier - Wiimote" +msgstr "Konami Justifier - Wiimote" + +msgid "Korean" +msgstr "Coréen" + +msgid "L TRIG" +msgstr "L" + +msgid "Language" +msgstr "Langage" + +msgid "Languages Folder" +msgstr "Dossier des Langues" + +msgid "Left" +msgstr "Gauche" + +msgid "LEFT" +msgstr "GAUCHE" + +msgid "Left Button" +msgstr "Clic gauche" + +msgid "Load" +msgstr "Charger" + +msgid "Load Device" +msgstr "Périphérique d'entrée" + +msgid "Load Folder" +msgstr "Dossier des Jeux" + +msgid "Load Game" +msgstr "Charger une partie" + +msgid "Loading" +msgstr "Chargement" + +msgid "Loading DVD..." +msgstr "Chargement du DVD en cours..." + +msgid "Loading patch..." +msgstr "Chargement du patch en cours..." + +msgid "Loading..." +msgstr "Chargement en cours..." + +msgid "Main Menu" +msgstr "Menu Principal" + +msgid "Match GC Controls" +msgstr "Jouabilité GC identique" + +msgid "Match Wii Controls" +msgstr "Jouabilité Wii identique" + +msgid "Maximum filepath length reached!" +msgid "La longueur maximale du chemin d'accés est atteinte !" + +msgid "Menu" +msgstr "Menu" + +msgid "Menu artwork" +msgstr "Menu artwork" + +msgid "Menu sound" +msgstr "Menu Son" + +msgid "MINUS" +msgstr "MOINS" + +msgid "Music Volume" +msgstr "Volume de la Musique" + +msgid "Mute" +msgstr "Muet" + +msgid "NES Controller" +msgstr "Manette NES" + +msgid "NES Controllers (2)" +msgstr "Manettes NES (2)" + +msgid "NES Controllers (4)" +msgstr "Manettes NES (4)" + +msgid "NES Zapper" +msgstr "Nintendo Zapper" + +msgid "Network" +msgstr "Réseau" + +msgid "Network Share" +msgstr "Partage réseau" + +msgid "New" +msgstr "Nouvelle" + +msgid "New Snapshot" +msgstr "Nouvelle sauvegarde d'état" + +msgid "New SRAM" +msgstr "Nouvelle sauvegarde SRAM" + +msgid "No" +msgstr "Non" + +msgid "No data to save!" +msgstr "Pas de données (RAM) à sauvegarder !" + +msgid "No disc inserted!" +msgstr "Aucun disque inséré !" + +msgid "No SRAM data to save!" +msgstr "Pas de données SRAM à sauvegarder !" + +msgid "No game saves found." +msgstr "Aucune sauvegarde trouvée." + +msgid "None" +msgstr "Aucun" + +msgid "NTSC (480i)" +msgstr "NTSC (480i)" + +msgid "Nunchuk" +msgstr "Nunchuk" + +msgid "Off" +msgstr "Off" + +msgid "Official Site: http://code.google.com/p/fceugc/" +msgstr "Site Officiel: http://code.google.com/p/fceugc/" + +msgid "Official Site: http://code.google.com/p/snes9x-gx/" +msgstr "Site Officiel: http://code.google.com/p/snes9x-gx/" + +msgid "Official Site: http://code.google.com/p/vba-wii/" +msgstr "Site Officiel: http://code.google.com/p/vba-wii/" + +msgid "OK" +msgstr "OK" + +msgid "On" +msgstr "On" + +msgid "Original" +msgstr "Original" + +msgid "Out of memory!" +msgstr "Mémoire insuffisante !" + +msgid "Out of memory: too many files!" +msgstr "Mémoire insuffisante : trop de fichiers !" + +msgid "P1" +msgstr "J1" + +msgid "P2" +msgstr "J2" + +msgid "P3" +msgstr "J3" + +msgid "P4" +msgstr "J4" + +msgid "PAL (50Hz)" +msgstr "PAL (50Hz)" + +msgid "PAL (60Hz)" +msgstr "PAL (60Hz)" + +msgid "Palette saved" +msgstr "La palette est sauvegardée" + +msgid "Partial Stretch" +msgstr "Étirer partiellement" + +msgid "Pause" +msgstr "Pause" + +msgid "Please Wait" +msgstr "Veuillez patienter" + +msgid "PLUS" +msgstr "PLUS" + +msgid "Portuguese" +msgstr "Portugais" + +msgid "Power off Wii" +msgstr "Éteindre la Wii" + +msgid "Preferences saved" +msgstr "Les préférences ont été sauvegardés" + +msgid "Press any button on the Classic Controller now. Press Home to clear the existing mapping." +msgstr "Appuyer sur un bouton de la manette Classique. Appuyer sur HOME pour effacer le paramètre actuel." + +msgid "Press any button on the GameCube Controller now. Press Home or the C-Stick in any direction to clear the existing mapping." +msgstr "Presser un bouton de la manette Gamecube. Presser HOME ou le stick C pour effacer le paramètre actuel." + +msgid "Press any button on the GameCube Controller now. Press the C-Stick in any direction to clear the existing mapping." +msgstr "Presser un bouton de la manette Gamecube. Presser une direction du stick C pour effacer le paramètre actuel." + +msgid "Press any button on the Wiimote now. Press Home to clear the existing mapping." +msgstr "Presser un bouton de la Wiimote. Presser HOME pour effacer le paramètre actuel." + +msgid "Press any button on the Wiimote or Nunchuk now. Press Home to clear the existing mapping." +msgstr "Presser un bouton de la Wiimote ou du Nunchuk. Presser HOME pour effacer le paramètre actuel." + +msgid "Progressive (480p)" +msgstr "Progressif (480p)" + +msgid "Quit Game" +msgstr "Quitter le Jeu" + +msgid "Quit this game? Any unsaved progress will be lost." +msgstr "Quitter ce jeu ? Toute progression non sauvegardée sera perdue." + +msgid "R TRIG" +msgstr "R" + +msgid "RAM saving is not available for FDS games!" +msgstr "La sauvegarde RAM n'est pas disponible pour les jeux sur disquette (Famicom Disk System) !" + +msgid "Reboot" +msgstr "Redémarrer" + +msgid "Rendering" +msgstr "Rendu" + +msgid "Reset" +msgstr "Réinitialiser" + +msgid "Reset Game" +msgstr "Réinitialiser le Jeu" + +msgid "Reset this game? Any unsaved progress will be lost." +msgstr "Redémarrer ce jeu ? Toute progression non sauvegardée sera perdue." + +msgid "Reset Mappings" +msgstr "Réinit. les touches" + +msgid "Reset Settings" +msgstr "Réinitialiser" + +msgid "Retry" +msgstr "Réessayer" + +msgid "Return to Loader" +msgstr "Retourner au Loader" + +msgid "Return to Wii Menu" +msgstr "Retourner au Menu Wii" + +msgid "Right" +msgstr "Droite" + +msgid "RIGHT" +msgstr "DROITE" + +msgid "Right Button" +msgstr "Clic droit" + +msgid "Rumble" +msgstr "Vibration" + +msgid "Save" +msgstr "Sauver" + +msgid "Save Device" +msgstr "Périph. de sauvegarde" + +msgid "Save failed!" +msgstr "La sauvegarde a échoué !" + +msgid "Save file not found" +msgstr "Pas de fichier de sauvegarde trouvé" + +msgid "Save Folder" +msgstr "Dossier des sauv." + +msgid "Save Game" +msgstr "Sauvegarder la partie" + +msgid "Save RAM and State?" +msgstr "Sauver la RAM et la position du jeu (sauvegarde d'état) ?" + +msgid "Save Snapshot?" +msgstr "Sauver la position du jeu (sauvegarde d'état) ?" + +msgid "Save SRAM and Snapshot?" +msgstr "Sauver la SRAM et la position du jeu (sauvegarde d'état) ?" + +msgid "Save State?" +msgstr "Sauver la position du jeu (sauvegarde d'état) ?" + +msgid "Save successful" +msgstr "Sauvegarde réussie" + +msgid "Saving" +msgstr "Sauvegarde" + +msgid "Saving preferences..." +msgstr "Sauvegarde des préférences en cours..." + +msgid "Saving..." +msgstr "Sauvegarde en cours..." + +msgid "Scaling" +msgstr "Format" + +msgid "Screen Position" +msgstr "Position de l'écran" + +msgid "Screen Zoom" +msgstr "Zoom écran" + +msgid "Select" +msgstr "Select" + +msgid "Seek error!" +msgstr "Erreur de positionnement ! (seek error)" + +msgid "Settings" +msgstr "Paramètres" + +msgid "Settings - Menu" +msgstr "Paramètres - Menu" + +msgid "Settings - Network" +msgstr "Paramètres - Réseau" + +msgid "Settings - Saving & Loading" +msgstr "Paramètres - Sauvegarde & Chargement" + +msgid "SD Card" +msgstr "Carte SD" + +msgid "SD card not found!" +msgstr "Carte SD introuvable !" + +msgid "Shift" +msgstr "Maj" + +msgid "Simp_chinese" +msgstr "Chinois simplifié" + +msgid "SMB Share IP" +msgstr "IP partagée SMB" + +msgid "SMB Share Name" +msgstr "Nom du Partage SMB" + +msgid "SMB Share Password" +msgstr "Mot de passe de partage SMB" + +msgid "SMB Share Username" +msgstr "Nom d'utilisateur de partage SMB" + +msgid "Snapshot" +msgstr "Sauvegarde d'état" + +msgid "Snapshot (Auto)" +msgstr "Sauv. d'état (Auto)" + +msgid "SNES Controller" +msgstr "Manette SNES" + +msgid "SNES Controllers (2)" +msgstr "Manettes SNES (2)" + +msgid "SNES Controllers (4)" +msgstr "Manettes SNES (4)" + +msgid "SNES Controller - Classic Controller" +msgstr "Manette SNES - Manette Classique" + +msgid "SNES Controller - GameCube Controller" +msgstr "Manette SNES - Manette GameCube" + +msgid "SNES Controller - Nunchuk + Wiimote" +msgstr "Manette SNES - Nunchuk + Wiimote" + +msgid "SNES Controller - Wiimote" +msgstr "Manette SNES - Wiimote" + +msgid "SNES Mouse" +msgstr "Souris SNES" + +msgid "SNES Mouse - GameCube Controller" +msgstr "Souris SNES - Manette GameCube" + +msgid "SNES Mouse - Wiimote" +msgstr "Souris SNES - Wiimote" + +msgid "Snes9x - Copyright (c) Snes9x Team 1996 - 2006" +msgstr "Snes9x - Copyright (c) Snes9x Team 1996 - 2006" + +msgid "Sound Effects Volume" +msgstr "Volume des effets sonores" + +msgid "Spanish" +msgstr "Espagnol" + +msgid "Sprite Limit" +msgstr "Limite de Sprites" + +msgid "SRAM file not found" +msgstr "Pas de sauvegarde SRAM trouvée" + +msgid "State" +msgstr "Sauvegarde d'état" + +msgid "State (Auto)" +msgstr "Sauv. d'état (Auto)" + +msgid "State file not found" +msgstr "Pas de sauvegarde d'état trouvée" + +msgid "Stretch to Fit" +msgstr "Étirer au ratio de l'écran" + +msgid "Superscope" +msgstr "Super Scope" + +msgid "Superscope - GameCube Controller" +msgstr "Super Scope - Manette GameCube" + +msgid "Superscope - Wiimote" +msgstr "Super Scope - Wiimote" + +msgid "The current IOS has been altered (fake-signed). Functionality and/or stability may be adversely affected." +msgstr "L'IOS utilisé est altéré (fausse signature, Bug Trucha). Les fonctionnalités et/ou la stabilité peuvent en être affectées." + +msgid "The current IOS is unsupported. Functionality and/or stability may be adversely affected." +msgstr "L'IOS utilisé n'est pas supporté. Les fonctionnalités et/ou la stabilité peuvent en être affectées." + +msgid "This software is open source and may be copied," +msgstr "Cette application est libre et peut être copiée," + +msgid "Trad_chinese" +msgstr "Chinois traditionnel" + +msgid "Unable to initialize network!" +msgstr "Impossible d'initialiser le réseau !" + +msgid "Unable to locate a load device!" +msgstr "Périphérique d'entrée introuvable !" + +msgid "Unable to locate a save device!" +msgstr "Périphérique de sauvegarde introuvable !" + +msgid "Unable to open snapshot!" +msgstr "Impossible d'ouvrir la sauvegarde d'état" + +msgid "Unfiltered" +msgstr "Non-filtré" + +msgid "Unknown file type!" +msgstr "Type de fichier inconnu !" + +msgid "Unrecognized DVD format." +msgstr "Format du DVD inconnu." + +msgid "Unrecognized file extension!" +msgstr "L'extension du fichier est inconnu !" + +msgid "Unzipping..." +msgstr "Extraction de l'archive en cours..." + +msgid "Up" +msgstr "Haut" + +msgid "UP" +msgstr "HAUT" + +msgid "Up One Level" +msgstr "Dossier Parent" + +msgid "Update Available" +msgstr "Une mise à jour est disponible" + +msgid "Update failed!" +msgstr "La mise à jour a échouée !" + +msgid "Update later" +msgstr "Mettre à jour plus tard" + +msgid "Update now" +msgstr "Mettre à jour maintenant" + +msgid "Update successful!" +msgstr "La mise à jour a réussie !" + +msgid "USB drive not found!" +msgstr "Aucun disque USB n'a été trouvé !" + +msgid "USB Mass Storage" +msgstr "Périphérique de stockage USB" + +msgid "Vertical" +msgstr "Vertical" + +msgid "Video" +msgstr "Vidéo" + +msgid "Video Mode" +msgstr "Mode Vidéo" + +msgid "VM8: Unknown page type!" +msgstr "VM8 : Type de page inconnu !" + +msgid "VM16: Unknown page type!" +msgstr "VM16 : Type de page inconnu !" + +msgid "VM32: Unknown page type!" +msgstr "VM32 : Type de page inconnu !" + +msgid "Wiimote" +msgstr "Wiimote" + +msgid "Wiimote Orientation" +msgstr "Orientation de la Wiimote" + +msgid "Yes" +msgstr "Oui" + +msgid "Zapper" +msgstr "Nintendo Zapper" + +msgid "Zapper Crosshair" +msgstr "Réticule du Zapper" diff --git a/plugins/snes9x_gx/source/lang/it.lang b/plugins/snes9x_gx/source/lang/it.lang new file mode 100644 index 00000000..897855b2 --- /dev/null +++ b/plugins/snes9x_gx/source/lang/it.lang @@ -0,0 +1,917 @@ +msgid "&" +msgstr "&" + +msgid "16:9 Correction" +msgstr "Correzione 16:9" + +msgid "7z decompression failed: Archive contains too many files" +msgstr "7z decompressione fallita: L'archivio contiene troppi file" + +msgid "7z decompression failed: Failed to read file data" +msgstr "7z decompressione fallita: Fallimento nella lettura del file" + +msgid "7z decompression failed: File is corrupt" +msgstr "7z decompressione fallita: File corrotto" + +msgid "7z decompression failed: File is corrupt (CRC mismatch)" +msgstr "7z decompressione fallita: File corrotto (il CRC non coincide)" + +msgid "7z decompression failed: File uses too high of compression settings (dictionary size is too large)" +msgstr "7z decompressione fallita: Il file utilizza una compressione troppo alta (dimensione del dizionario troppo grosso)" + +msgid "7z decompression failed: File uses unsupported compression settings" +msgstr "7z decompressione fallita: Il file utilizza un impostazione di compressione sconosciuta" + +msgid "A (Rapid)" +msgstr "A (Rapido)" + +msgid "Additional coding" +msgstr "Codice supplementare" + +msgid "Aim Offscreen" +msgstr "Obiettivo Fuoricampo" + +msgid "An update is available!" +msgstr "Aggiornamento disponibile!" + +msgid "Are you sure that you want to reset this game? Any unsaved progress will be lost." +msgstr "Sei sicuro di voler resettare il gioco? Tutti i progressi non salvati verranno perduti." + +msgid "Are you sure that you want to reset your mappings?" +msgstr "Sei sicuro di voler resettare le tue mappature?" + +msgid "Are you sure that you want to reset your settings?" +msgstr "Sei sicuro di voler resettare le tue impostazioni?" + +msgid "Maintain Aspect Ratio" +msgstr "Mantieni Ascpect Ratio (Rapporto)" + +msgid "Attempting to determine load device..." +msgstr "Cercando di determinare la periferica di caricamento..." + +msgid "Attempting to determine save device..." +msgstr "Cercando di determinare la periferica di salvataggio..." + +msgid "Auto" +msgstr "Automatico" + +msgid "Auto Detect" +msgstr "Individuazione Automatica" + +msgid "Auto Load" +msgstr "Caricamento Automatico" + +msgid "Auto Save" +msgstr "Salvataggio Automatico" + +msgid "Automatic (Recommended)" +msgstr "Automatico (Raccomandato)" + +msgid "B (Rapid)" +msgstr "B (Rapido)" + +msgid "Back" +msgstr "" + +msgid "Both" +msgstr "Entrambi" + +msgid "Controles" +msgstr "Controlli" + +msgid "Button Mapping" +msgstr "Mappatura Pulsanti" + +msgid "Button Mappings" +msgstr "Mappature Pulsanti" + +msgid "Cancel" +msgstr "Annulla" + +msgid "Caps" +msgstr "" + +msgid "Cheats" +msgstr "Cheat" + +msgid "Cheats file not found!" +msgstr "File Cheat non trovato!" + +msgid "Cheats Folder" +msgstr "Cartella Cheat" + +msgid "Choose Game" +msgstr "Scelta Gioco" + +msgid "Classic Controller" +msgstr "Controller Tradizionale" + +msgid "Close" +msgstr "Chiudi" + +msgid "Coding" +msgstr "Programmazione" + +msgid "Coding & menu design" +msgstr "Programmazione e design del menù" + +msgid "Compressed GBA files are not supported!" +msgstr "I file GBA compressi non sono supportati!" + +msgid "Connecting to network share..." +msgstr "Collegandosi alla rete.." + +msgid "Controller" +msgstr "" + +msgid "Cover View" +msgstr "Vista Cover" + +msgid "Covers Folder" +msgstr "Cartella Cover" + +msgid "Credits" +msgstr "Crediti" + +msgid "Cropping" +msgstr "Ritaglio" + +msgid "Crosshair" +msgstr "Mirino" + +msgid "Cursor" +msgstr "Cursore" + +msgid "Data DVD" +msgstr "DVD Dati" + +msgid "Default" +msgstr "Default" + +msgid "Directory name is too long!" +msgstr "Nome della Cartella troppo lungo!" + +msgid "Disabled" +msgstr "Disabilitato" + +msgid "DISABLED" +msgstr "DISABILITATO" + +msgid "distributed, or modified under the terms of the" +msgstr "distribuito o modificato nei termini de" + +msgid "Don't Save" +msgstr "Non Salvare" + +msgid "Down" +msgstr "Giù" + +msgid "DOWN" +msgstr "GIU'" + +msgid "Downloading..." +msgstr "Scaricando..." + +msgid "Dutch" +msgstr "Olandese" + +msgid "Empty or invalid ZIP file!" +msgstr "File ZIP vuoto o non valido!" + +msgid "Enabled" +msgstr "Abilitato" + +msgid "ENABLED" +msgstr "ABILITATO" + +msgid "English" +msgstr "Inglese" + +msgid "Error" +msgstr "Errore" + +msgid "Error - Invalid ZIP file!" +msgstr "Errore - File ZIP non valido!" + +msgid "Error creating file!" +msgstr "Errore nella creazione del file!" + +msgid "Error loading game!" +msgstr "Errore nel caricamento del gioco!" + +msgid "Error opening archive!" +msgstr "Errore nell'apertura dell'archivio!" + +msgid "Error opening directory!" +msgstr "Errore nell'apertura della cartella!" + +msgid "Error opening file!" +msgstr "Errore nell'apertura del file!" + +msgid "Error reading file!" +msgstr "Errore nella lettura del file!" + +msgid "Error saving file!" +msgstr "Errore nel salvataggio del file!" + +msgid "Exit" +msgstr "Esci" + +msgid "Exit Action" +msgstr "Uscita" + +msgid "Failed to connect to network share." +msgstr "Connessione alla rete fallita." + +msgid "FDS BIOS file is invalid!" +msgstr "File BIOS FDS non valido!" + +msgid "FDS BIOS file not found!" +msgstr "File BIOS FDS non trovato!" + +msgid "Filtered" +msgstr "Filtrato" + +msgid "Filtering" +msgstr "Filtrando" + +msgid "Fire" +msgstr "Fuoco" + +msgid "French" +msgstr "Francese" + +msgid "GBA Screen Zoom" +msgstr "GBA Zoom Schermo" + +msgid "Game Genie ROM not found!" +msgstr "ROM Game Genie non trovata!" + +msgid "Game Settings" +msgstr "Impostazioni di Gioco" + +msgid "Game Settings - Button Mappings" +msgstr "Impostazioni di Gioco - Mappature pulsanti" + +msgid "Game Settings - Cheats" +msgstr "Impostazioni di Gioco - Cheat" + +msgid "Game Settings - Video" +msgstr "Impostazioni di Gioco - Video" + +msgid "Game Timing" +msgstr "Sincranizzazione di Gioco" + +msgid "Game Genie DISABLED" +msgstr "Game Genie DISABILITATO" + +msgid "Game Genie ENABLED" +msgstr "Game Genie ABILITATO" + +msgid "GameCube Controller" +msgstr "" + +msgid "German" +msgstr "Tedesco" + +msgid "GNU General Public License (GPL) Version 2." +msgstr "GNU General Public License (GPL) Version 2." + +msgid "Go Back" +msgstr "Torna Indietro" + +msgid "Horizontal" +msgstr "Orizzontale" + +msgid "Information" +msgstr "Informazione" + +msgid "Initializing network..." +msgstr "Inizializzando la rete..." + +msgid "Insert Coin" +msgstr "" + +msgid "Insert Coin / Switch Disk" +msgstr "Insert Coin / Cambia Disco" + +msgid "Invalid file size!" +msgstr "Dimensione del file non valida!" + +msgid "Invalid game file!" +msgstr "File di gioco non valido!" + +msgid "Invalid network settings - Check settings.xml." +msgstr "Impostazioni di rete non valide - Verificare settings.xml." + +msgid "Invalid network settings - Share IP is blank." +msgstr "Impostazioni di rete non valide - Campo IP Condivisione vuoto." + +msgid "Invalid network settings - Share name is blank." +msgstr "Impostazioni di rete non valide - Campo Nome Condivisione vuoto." + +msgid "Invalid save file" +msgstr "File di salvataggio non valido" + +msgid "Invalid state file" +msgstr "FIle di stato non valido" + +msgid "Italian" +msgstr "Italiano" + +msgid "Japanese" +msgstr "Giapponese" + +msgid "Justifier" +msgstr "Giustificato" + +msgid "Justifier - GameCube Controller" +msgstr "Giustificato - GameCube Controller" + +msgid "Justifier - Wiimote" +msgstr "Giustificato - Wiimote" + +msgid "Korean" +msgstr "Coreano" + +msgid "L TRIG" +msgstr "TASTO L" + +msgid "Language" +msgstr "Lingua" + +msgid "Languages Folder" +msgstr "Cartella Lingue" + +msgid "Left" +msgstr "Sinistra" + +msgid "LEFT" +msgstr "SINISTRA" + +msgid "Left Button" +msgstr "Pulsante Sinistro" + +msgid "Load" +msgstr "Carica" + +msgid "Load Device" +msgstr "Periferica di Caricamento" + +msgid "Load Folder" +msgstr "Cartella di Caricamento" + +msgid "Load Game" +msgstr "Carica Gioco" + +msgid "Loading" +msgstr "Caricando" + +msgid "Loading DVD..." +msgstr "Caricando DVD..." + +msgid "Loading patch..." +msgstr "Caricando patch..." + +msgid "Loading..." +msgstr "Caricando..." + +msgid "Main Menu" +msgstr "Menù Principale" + +msgid "Match GC Controls" +msgstr "Identico Controlli GC" + +msgid "Match Wii Controls" +msgstr "Identico Controlli Wii" + +msgid "Menu" +msgstr "Menù" + +msgid "Menu artwork" +msgstr "Menù Artwork" + +msgid "Menu sound" +msgstr "Menù Audio" + +msgid "MINUS" +msgstr "MENO" + +msgid "Music Volume" +msgstr "Volume Musica" + +msgid "Mute" +msgstr "Muto" + +msgid "NES Controller" +msgstr "" + +msgid "NES Controllers (2)" +msgstr "NES Controller (2)" + +msgid "NES Controllers (4)" +msgstr "NES Controller (4)" + +msgid "NES Zapper" +msgstr "" + +msgid "Network" +msgstr "Rete" + +msgid "Network Share" +msgstr "Condivisione Rete" + +msgid "New" +msgstr "Nuovo" + +msgid "New Snapshot" +msgstr "Nuovo Snapshot" + +msgid "New SRAM" +msgstr "Nuova SRAM" + +msgid "No" +msgstr "No" + +msgid "No data to save!" +msgstr "Nessun dato da salvare!" + +msgid "No disc inserted!" +msgstr "Disco non inserito!" + +msgid "No SRAM data to save!" +msgstr "Nessuna SRAM dove salvare!" + +msgid "No game saves found." +msgstr "Nessun salvataggio trovato." + +msgid "None" +msgstr "Nessuno" + +msgid "NTSC (480i)" +msgstr "" + +msgid "Nunchuk" +msgstr "Nunchuk" + +msgid "Off" +msgstr "Off" + +msgid "Official Site: http://code.google.com/p/fceugc/" +msgstr "Sito Ufficiale: http://code.google.com/p/fceugc/" + +msgid "Official Site: http://code.google.com/p/snes9x-gx/" +msgstr "Sito Ufficiale: http://code.google.com/p/snes9x-gx/" + +msgid "Official Site: http://code.google.com/p/vba-wii/" +msgstr "Sito Ufficiale: http://code.google.com/p/vba-wii/" + +msgid "OK" +msgstr "" + +msgid "On" +msgstr "" + +msgid "Original" +msgstr "Originale" + +msgid "Out of memory!" +msgstr "Memoria esaurita!" + +msgid "Out of memory: too many files!" +msgstr "Memoria esaurita: troppo file!" + +msgid "P1" +msgstr "" + +msgid "P2" +msgstr "" + +msgid "P3" +msgstr "" + +msgid "P4" +msgstr "" + +msgid "PAL (50Hz)" +msgstr "" + +msgid "PAL (60Hz)" +msgstr "" + +msgid "Palette saved" +msgstr "Palette salvata" + +msgid "Partial Stretch" +msgstr "Stretch Parziale" + +msgid "Pause" +msgstr "Pausa" + +msgid "Please Wait" +msgstr "Attendere Prego" + +msgid "PLUS" +msgstr "PIU'" + +msgid "Portuguese" +msgstr "Portoghese" + +msgid "Power off Wii" +msgstr "Spegnimento Wii" + +msgid "Preferences saved" +msgstr "Preferenze salvate" + +msgid "Press any button on the Classic Controller now. Press Home to clear the existing mapping." +msgstr "Premi un pulsante del Controller Tradizionale ora. Premi Home per pulire la mappatura esistente." + +msgid "Press any button on the GameCube Controller now. Press Home or the C-Stick in any direction to clear the existing mapping." +msgstr "Premi un pulsante del GameCube Controller ora. Premi Home o sposta il C-Stick per pulire la mappatura esistente." + +msgid "Press any button on the GameCube Controller now. Press the C-Stick in any direction to clear the existing mapping." +msgstr "Premi un pulsante del GameCube Controller ora. Sposta il C-Stick per pulire la mappatura esistente." + +msgid "Press any button on the Wiimote now. Press Home to clear the existing mapping." +msgstr "Premi un pulsante del Wiimote ora. Premi Home per pulire la mappatura esistente." + +msgid "Press any button on the Wiimote or Nunchuk now. Press Home to clear the existing mapping." +msgstr "Premi un pulsante del Wiimote o del Nunchuk ora. Premi Home per pulire la mappatura esistente." + +msgid "Progressive (480p)" +msgstr "Progressiva (480p)" + +msgid "Quit Game" +msgstr "Termina" + +msgid "Quit this game? Any unsaved progress will be lost." +msgstr "Terminare il gioco? Tutti i progressi saranno perduti." + +msgid "R TRIG" +msgstr "TASTO R" + +msgid "RAM saving is not available for FDS games!" +msgstr "Il salvataggio della RAM non è disponibile per i giochi FDS!" + +msgid "Reboot" +msgstr "" + +msgid "Rendering" +msgstr "Rendering" + +msgid "Reset" +msgstr "Reset" + +msgid "Reset Game" +msgstr "Resetta" + +msgid "Reset this game? Any unsaved progress will be lost." +msgstr "Resettare il gioco? Tutti i progressi saranno perduti." + +msgid "Reset Mappings" +msgstr "Resetta Mappatura" + +msgid "Reset Settings" +msgstr "Resetta Impostazioni" + +msgid "Retry" +msgstr "Ritenta" + +msgid "Return to Loader" +msgstr "Ritorna al Loader" + +msgid "Return to Wii Menu" +msgstr "Ritorna al Menù Wii" + +msgid "Right" +msgstr "Destra" + +msgid "RIGHT" +msgstr "DESTRA" + +msgid "Right Button" +msgstr "Pulsante Destro" + +msgid "Rumble" +msgstr "Vibrazione" + +msgid "Save" +msgstr "Salva" + +msgid "Save Device" +msgstr "Periferica Salvataggio" + +msgid "Save failed!" +msgstr "Salvataggio fallito!" + +msgid "Save file not found" +msgstr "File di salvataggio non trovato" + +msgid "Save Folder" +msgstr "Cartella Salvataggio" + +msgid "Save Game" +msgstr "Salvataggio" + +msgid "Save RAM and State?" +msgstr "Salvare RAM e STATO?" + +msgid "Save Snapshot?" +msgstr "Salvare Snapshot?" + +msgid "Save SRAM and Snapshot?" +msgstr "Salvare SRAM e Snapshot?" + +msgid "Save State?" +msgstr "" + +msgid "Save successful" +msgstr "Salvato con successo" + +msgid "Saving" +msgstr "Salvando" + +msgid "Saving preferences..." +msgstr "Salvando le preferenze..." + +msgid "Saving..." +msgstr "Salvando..." + +msgid "Scaling" +msgstr "Scalettatura" + +msgid "Screen Position" +msgstr "Posizione Schermo" + +msgid "Screen Zoom" +msgstr "Zoom Schermo" + +msgid "Select" +msgstr "" + +msgid "Seek error!" +msgstr "Errore di ricerca!" + +msgid "Settings" +msgstr "Impostazioni" + +msgid "Settings - Menu" +msgstr "Impostazioni - Menu" + +msgid "Settings - Network" +msgstr "Impostazioni - Rete" + +msgid "Settings - Saving & Loading" +msgstr "Impostazioni - Salvataggio e Caricamento" + +msgid "SD Card" +msgstr "Scheda SD" + +msgid "SD card not found!" +msgstr "Scheda SD non trovata!" + +msgid "Shift" +msgstr "" + +msgid "Simp_chinese" +msgstr "Cinese Semplificato" + +msgid "SMB Share IP" +msgstr "SMB IP Condivisione" + +msgid "SMB Share Name" +msgstr "SMB Nome Condivisione" + +msgid "SMB Share Password" +msgstr "SMB Password Condivisione" + +msgid "SMB Share Username" +msgstr "SMB Username Condivisione" + +msgid "Snapshot" +msgstr "" + +msgid "Snapshot (Auto)" +msgstr "" + +msgid "SNES Controller" +msgstr "" + +msgid "SNES Controllers (2)" +msgstr "SNES Controller (4)" + +msgid "SNES Controllers (4)" +msgstr "SNES Controller (4)" + +msgid "SNES Controller - Classic Controller" +msgstr "SNES Controller - Controller Tradizionale" + +msgid "SNES Controller - GameCube Controller" +msgstr "" + +msgid "SNES Controller - Nunchuk + Wiimote" +msgstr "" + +msgid "SNES Controller - Wiimote" +msgstr "" + +msgid "SNES Mouse" +msgstr "" + +msgid "SNES Mouse - GameCube Controller" +msgstr "" + +msgid "SNES Mouse - Wiimote" +msgstr "" + +msgid "Snes9x - Copyright (c) Snes9x Team 1996 - 2006" +msgstr "" + +msgid "Sound Effects Volume" +msgstr "Volume Effetti Sonori" + +msgid "Spanish" +msgstr "Spagnolo" + +msgid "Sprite Limit" +msgstr "Limite Sprite" + +msgid "SRAM file not found" +msgstr "File SRAM non trovato" + +msgid "Start" +msgstr "" + +msgid "State" +msgstr "Stato" + +msgid "State (Auto)" +msgstr "Stato (Auto)" + +msgid "State file not found" +msgstr "File di stato non trovato" + +msgid "Stretch to Fit" +msgstr "Allunga per Adattare" + +msgid "Super Scope" +msgstr "" + +msgid "Superscope" +msgstr "" + +msgid "Superscope - GameCube Controller" +msgstr "" + +msgid "Superscope - Wiimote" +msgstr "" + +msgid "This software is open source and may be copied," +msgstr "Questo software è open source e può essere copiato," + +msgid "Trad_chinese" +msgstr "Cinese Tradotto" + +msgid "Unable to initialize network!" +msgstr "Impossibile inizializzare la rete!" + +msgid "Unable to locate a load device!" +msgstr "Impossibile localizzare una periferica di caricamento!" + +msgid "Unable to locate a save device!" +msgstr "Impossibile localizzare una periferica di salvataggio!" + +msgid "Unable to open snapshot!" +msgstr "Impossibile aprire lo snapshot!" + +msgid "Unfiltered" +msgstr "Non filtrato!" + +msgid "Unknown file type!" +msgstr "Tipo di file sconosciuto!" + +msgid "Unrecognized DVD format." +msgstr "Formato DVD non riconosciuto!" + +msgid "Unrecognized file extension!" +msgstr "Estensione file non riconosciuta!" + +msgid "Up" +msgstr "Su" + +msgid "UP" +msgstr "SU" + +msgid "Up One Level" +msgstr "Livello superiore" + +msgid "Update Available" +msgstr "Aggiornamento Disponibile" + +msgid "Update failed!" +msgstr "Aggiornamento fallito!" + +msgid "Update later" +msgstr "Aggiorna più tardi" + +msgid "Update now" +msgstr "Aggiorna ora" + +msgid "Update successful!" +msgstr "Aggiornamento effettuato!" + +msgid "USB drive not found!" +msgstr "Disco USB non trovato!" + +msgid "USB Mass Storage" +msgstr "Memoria di Massa USB" + +msgid "Vertical" +msgstr "Verticale" + +msgid "Video" +msgstr "" + +msgid "Video Mode" +msgstr "Modalità Video" + +msgid "VM8: Unknown page type!" +msgstr "VM8: Tipo di pagina sconosciuta!" + +msgid "VM16: Unknown page type!" +msgstr "VM16: Tipo di pagina sconosciuta!" + +msgid "VM32: Unknown page type!" +msgstr "VM32: Tipo di pagina sconosciuta!" + +msgid "Wiimote" +msgstr "" + +msgid "Wiimote Orientation" +msgstr "Orientamento Wiimote" + +msgid "Yes" +msgstr "Si" + +msgid "Zapper" +msgstr "" + +msgid "Zapper Crosshair" +msgstr "Mirino Zapper" + +msgid "Logo" +msgstr "" + +msgid "Turbo On" +msgstr "" + +msgid "Turbo Off" +msgstr "" + +msgid "Automatic" +msgstr "Automatico" + +msgid "Palette" +msgstr "Paletta" + +msgid "AspiringSquire's Real palette" +msgstr "" + +msgid "Loopy's palette" +msgstr "" + +msgid "Quor's palette" +msgstr "" + +msgid "Chris Covell's palette" +msgstr "" + +msgid "Matthew Conte's palette" +msgstr "" + +msgid "PasoFami/99 palette" +msgstr "" + +msgid "CrashMan's palette" +msgstr "" + +msgid "MESS palette" +msgstr "" + +msgid "Zaphod's VS Castlevania palette" +msgstr "" + +msgid "Zaphod's VS SMB palette" +msgstr "" + +msgid "VS Dr. Mario palette" +msgstr "" + +msgid "VS Castlevania palette" +msgstr "" + +msgid "VS SMB/VS Ice Climber palette" +msgstr "" + +msgid "And many others who have contributed over the years!" +msgstr "E tutti quelli che hanno contribuito negli anni!" diff --git a/plugins/snes9x_gx/source/lang/jp.lang b/plugins/snes9x_gx/source/lang/jp.lang new file mode 100644 index 00000000..7508395c --- /dev/null +++ b/plugins/snes9x_gx/source/lang/jp.lang @@ -0,0 +1,935 @@ +msgid "&" +msgstr "&" + +msgid "16:9 Correction" +msgstr "16:9補正" + +msgid "7z decompression failed: Archive contains too many files" +msgstr "書庫内ã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒå¤šã™ãŽã§ã™" + +msgid "7z decompression failed: Failed to read file data" +msgstr "読ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸ" + +msgid "7z decompression failed: File is corrupt" +msgstr "ファイルãŒç ´æã—ã¦ã„ã¾ã™" + +msgid "7z decompression failed: File is corrupt (CRC mismatch)" +msgstr "ファイルãŒç ´æã—ã¦ã„ã¾ã™(CRCä¸ä¸€è‡´)" + +msgid "7z decompression failed: File uses too high of compression settings (dictionary size is too large)" +msgstr "書庫ã®ã‚µã‚¤ã‚ºãŒå¤šãã™ãŽã§ã™" + +msgid "7z decompression failed: File uses unsupported compression settings" +msgstr "未対応ã®åœ§ç¸®è¨­å®šãŒä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã™" + +msgid "A (Rapid)" +msgstr "A (連打)" + +msgid "Additional coding" +msgstr "追加コーディング" + +msgid "Aim Offscreen" +msgstr "照準をéžè¡¨ç¤º" + +msgid "An update is available!" +msgstr "æ›´æ–°ãŒã‚ã‚Šã¾ã™" + +msgid "Are you sure that you want to reset this game? Any unsaved progress will be lost." +msgstr "未ä¿å­˜ã®ãƒ‡ãƒ¼ã‚¿ã¯å¤±ã‚ã‚Œã¾ã™" + +msgid "Are you sure that you want to reset your mappings?" +msgstr "設定をåˆæœŸåŒ–ã—ã¾ã™ã‹?" + +msgid "Are you sure that you want to reset your settings?" +msgstr "設定をåˆæœŸåŒ–ã—ã¾ã™ã‹?" + +msgid "Maintain Aspect Ratio" +msgstr "アスペクト比を維æŒ" + +msgid "Attempting to determine load device..." +msgstr "デãƒã‚¤ã‚¹ã‚’試ã—ã¦ã„ã¾ã™â€¦" + +msgid "Attempting to determine save device..." +msgstr "デãƒã‚¤ã‚¹ã‚’試ã—ã¦ã„ã¾ã™â€¦" + +msgid "Auto" +msgstr "自動" + +msgid "Auto Detect" +msgstr "自動検出" + +msgid "Auto Load" +msgstr "自動ロード" + +msgid "Auto Save" +msgstr "自動セーブ" + +msgid "Automatic" +msgstr "自動" + +msgid "Automatic (Recommended)" +msgstr "自動(ãŠã™ã™ã‚)" + +msgid "B (Rapid)" +msgstr "B (連打)" + +msgid "Back" +msgstr "" + +msgid "Both" +msgstr "両方" + +msgid "Controles" +msgstr "æ“作" + +msgid "Button Mapping" +msgstr "ボタン設定" + +msgid "Button Mappings" +msgstr "ボタン設定" + +msgid "Cancel" +msgstr "キャンセル" + +msgid "Caps" +msgstr "" + +msgid "Cheats" +msgstr "改造コード" + +msgid "Cheats file not found!" +msgstr "改造コードãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" + +msgid "Cheats Folder" +msgstr "改造コードフォルダ" + +msgid "Choose Game" +msgstr "ゲームをé¸æŠžã—ã¦ãã ã•ã„" + +msgid "Classic Controller" +msgstr "クラコン" + +msgid "Close" +msgstr "ã¨ã˜ã‚‹" + +msgid "Coding" +msgstr "設計" + +msgid "Coding & menu design" +msgstr "設計ã¨ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã®ãƒ‡ã‚¶ã‚¤ãƒ³" + +msgid "Compressed GBA files are not supported!" +msgstr "圧縮ã•ã‚ŒãŸGBAファイルã¯æœªå¯¾å¿œã§ã™" + +msgid "Connecting to network share..." +msgstr "接続ã—ã¦ã„ã¾ã™" + +msgid "Controller" +msgstr "コントローラ" + +msgid "Cover View" +msgstr "ã‚«ãƒãƒ¼ã‚’表示" + +msgid "Covers Folder" +msgstr "ã‚«ãƒãƒ¼ãƒ•ã‚©ãƒ«ãƒ€" + +msgid "Credits" +msgstr "æ供・å”力" + +msgid "Cropping" +msgstr "トリミング" + +msgid "Crosshair" +msgstr "å字ボタン" + +msgid "Cursor" +msgstr "カーソル" + +msgid "Data DVD" +msgstr "データDVD" + +msgid "Default" +msgstr "åˆæœŸå€¤" + +msgid "Directory name is too long!" +msgstr "フォルダåãŒé•·ã™ãŽã§ã™" + +msgid "Disabled" +msgstr "無効" + +msgid "DISABLED" +msgstr "無効" + +msgid "distributed, or modified under the terms of the" +msgstr "以下ã®æ¡ä»¶ã®ä¸‹ã§é…布ã€å¤‰æ›´ã•ã‚Œã¦ã„ã¾ã™" + +msgid "Don't Save" +msgstr "セーブã—ãªã„" + +msgid "Down" +msgstr "下" + +msgid "DOWN" +msgstr "下" + +msgid "Downloading..." +msgstr "ダウンロード中…" + +msgid "Dutch" +msgstr "ドイツ語" + +msgid "Empty or invalid ZIP file!" +msgstr "ä¸æ­£ãªZIPファイルã§ã™" + +msgid "Enabled" +msgstr "有効" + +msgid "ENABLED" +msgstr "有効" + +msgid "English" +msgstr "英語" + +msgid "Error" +msgstr "エラー" + +msgid "Error - Invalid ZIP file!" +msgstr "ä¸æ­£ãªZIPã§ã™" + +msgid "Error creating file!" +msgstr "作æˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ" + +msgid "Error loading game!" +msgstr "読ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ" + +msgid "Error opening archive!" +msgstr "解å‡ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ" + +msgid "Error opening directory!" +msgstr "é–‹ã途中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ" + +msgid "Error opening file!" +msgstr "é–‹ã„ã¦ã„る途中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ" + +msgid "Error reading file!" +msgstr "読ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ" + +msgid "Error saving file!" +msgstr "セーブ中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ" + +msgid "Exit" +msgstr "終了" + +msgid "Exit Action" +msgstr "終了動作" + +msgid "Failed to connect to network share." +msgstr "接続ã«å¤±æ•—ã—ã¾ã—ãŸ" + +msgid "FDS BIOS file is invalid!" +msgstr "disksys.romãŒä¸æ­£ã§ã™" + +msgid "FDS BIOS file not found!" +msgstr "disksys.romãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" + +msgid "Filtered" +msgstr "フィルターã™ã‚‹" + +msgid "Filtering" +msgstr "フィルタ" + +msgid "Fire" +msgstr "ファイア" + +msgid "French" +msgstr "フランス語" + +msgid "GBA Screen Zoom" +msgstr "GBAç”»é¢ã‚’拡大" + +msgid "Game Genie ROM not found!" +msgstr "Game Genieã®ROMãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" + +msgid "Game Settings" +msgstr "ゲーム設定" + +msgid "Game Settings - Button Mappings" +msgstr "ゲーム設定 - ボタン設定" + +msgid "Game Settings - Cheats" +msgstr "ゲーム設定 - 改造コード" + +msgid "Game Settings - Video" +msgstr "ゲーム設定 - 映åƒ" + +msgid "Game Timing" +msgstr "ゲームã®é€Ÿåº¦" + +msgid "Game Genie DISABLED" +msgstr "Game Genie無効" + +msgid "Game Genie ENABLED" +msgstr "Game Genie有効" + +msgid "GameCube Controller" +msgstr "GCコントローラ" + +msgid "German" +msgstr "ドイツ語" + +msgid "GNU General Public License (GPL) Version 2." +msgstr "GNU 一般公衆利用許諾契約書ãƒãƒ¼ã‚¸ãƒ§ãƒ³2" + +msgid "Go Back" +msgstr "戻る" + +msgid "Horizontal" +msgstr "横方å‘" + +msgid "Information" +msgstr "情報" + +msgid "Initializing network..." +msgstr "接続中…" + +msgid "Insert Coin" +msgstr "コインを入れる" + +msgid "Insert Coin / Switch Disk" +msgstr "コイン/ディスクをã„れる" + +msgid "Invalid file size!" +msgstr "ä¸æ­£ãªã‚µã‚¤ã‚ºã§ã™" + +msgid "Invalid game file!" +msgstr "ä¸æ­£ãªã‚µã‚¤ã‚ºã§ã™" + +msgid "Invalid network settings - Check settings.xml." +msgstr "エラー:settings.xmlを確èªã—ã¦ãã ã•ã„" + +msgid "Invalid network settings - Share IP is blank." +msgstr "共有IPãŒç©ºç™½ã§ã™" + +msgid "Invalid network settings - Share name is blank." +msgstr "共有åãŒç©ºç™½ã§ã™" + +msgid "Invalid save file" +msgstr "ä¸æ­£ãªã‚»ãƒ¼ãƒ–データã§ã™" + +msgid "Invalid state file" +msgstr "ä¸æ­£ãªä¸­æ–­ãƒ•ã‚¡ã‚¤ãƒ«ã§ã™" + +msgid "Italian" +msgstr "イタリア語" + +msgid "Japanese" +msgstr "日本語" + +msgid "Justifier" +msgstr "MODEL510" + +msgid "Justifier - GameCube Controller" +msgstr "MODEL510 - GCコントローラ" + +msgid "Justifier - Wiimote" +msgstr "MODEL510 - Wiiリモコン" + +msgid "Korean" +msgstr "韓国語" + +msgid "L TRIG" +msgstr "Lトリガー" + +msgid "Language" +msgstr "言語" + +msgid "Languages Folder" +msgstr "言語フォルダ" + +msgid "Left" +msgstr "å·¦" + +msgid "LEFT" +msgstr "å·¦" + +msgid "Left Button" +msgstr "左ボタン" + +msgid "Load" +msgstr "ロード" + +msgid "Load Device" +msgstr "読ã¿è¾¼ã‚€ãƒ‡ãƒã‚¤ã‚¹" + +msgid "Load Folder" +msgstr "ロムフォルダ" + +msgid "Load Game" +msgstr "ゲームを読ã¿è¾¼ã‚€" + +msgid "Loading" +msgstr "ロード" + +msgid "Loading DVD..." +msgstr "DVDを読ã¿è¾¼ã¿ä¸­â€¦" + +msgid "Loading patch..." +msgstr "パッãƒã‚’読ã¿è¾¼ã¿ä¸­â€¦" + +msgid "Loading..." +msgstr "読ã¿è¾¼ã¿ä¸­â€¦" + +msgid "Main Menu" +msgstr "メインメニュー" + +msgid "Match GC Controls" +msgstr "æ“作を最é©åŒ–" + +msgid "Match Wii Controls" +msgstr "æ“作を最é©åŒ–" + +msgid "Maximum filepath length reached!" +msgid "ファイルã®ãƒ‘スã®é™ç•Œã¾ã§è¡Œãã¾ã—ãŸ" + +msgid "Menu" +msgstr "メニュー" + +msgid "Menu artwork" +msgstr "メニュー画åƒ" + +msgid "Menu sound" +msgstr "メニュー音楽" + +msgid "MINUS" +msgstr "マイナス" + +msgid "Music Volume" +msgstr "音楽ã®éŸ³é‡" + +msgid "Mute" +msgstr "消音" + +msgid "NES Controller" +msgstr "コントローラ" + +msgid "NES Controllers (2)" +msgstr "コントローラ(2)" + +msgid "NES Controllers (4)" +msgstr "コントローラ(4)" + +msgid "NES Zapper" +msgstr "ファミコンザッパー" + +msgid "Network" +msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" + +msgid "Network Share" +msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯å…±æœ‰" + +msgid "New" +msgstr "æ–°ã—ã„" + +msgid "New Snapshot" +msgstr "æ–°ã—ã„中断データ" + +msgid "New SRAM" +msgstr "æ–°ã—ã„SRAM" + +msgid "No" +msgstr "ã„ã„ãˆ" + +msgid "No data to save!" +msgstr "セーブã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãŒã‚ã‚Šã¾ã›ã‚“" + +msgid "No disc inserted!" +msgstr "ディスクãŒæŒ¿å…¥ã•ã‚Œã¦ã„ã¾ã›ã‚“" + +msgid "No SRAM data to save!" +msgstr "セーブã™ã‚‹SRAMデータãŒã‚ã‚Šã¾ã›ã‚“" + +msgid "No game saves found." +msgstr "セーブデータãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" + +msgid "None" +msgstr "ç„¡ã—" + +msgid "NTSC (480i)" +msgstr "NTSC(480i)" + +msgid "Nunchuk" +msgstr "ヌンãƒãƒ£ã‚¯" + +msgid "Off" +msgstr "オフ" + +msgid "Official Site: http://code.google.com/p/fceugc/" +msgstr "å…¬å¼ã‚µã‚¤ãƒˆ:http://code.google.com/p/fceugc/" + +msgid "Official Site: http://code.google.com/p/snes9x-gx/" +msgstr "å…¬å¼ã‚µã‚¤ãƒˆ: http://code.google.com/p/snes9x-gx/" + +msgid "Official Site: http://code.google.com/p/vba-wii/" +msgstr "å…¬å¼ã‚µã‚¤ãƒˆ: http://code.google.com/p/vba-wii/" + +msgid "OK" +msgstr "OK" + +msgid "On" +msgstr "オン" + +msgid "Original" +msgstr "オリジナル" + +msgid "Out of memory!" +msgstr "メモリãŒè¶³ã‚Šã¾ã›ã‚“" + +msgid "Out of memory: too many files!" +msgstr "ファイルãŒå¤šã™ãŽã¦ãƒ¡ãƒ¢ãƒªãŒè¶³ã‚Šã¾ã›ã‚“" + +msgid "P1" +msgstr "" + +msgid "P2" +msgstr "" + +msgid "P3" +msgstr "" + +msgid "P4" +msgstr "" + +msgid "PAL (50Hz)" +msgstr "PAL(50Hz)" + +msgid "PAL (60Hz)" +msgstr "PAL(60Hz)" + +msgid "Palette saved" +msgstr "パレットをセーブã—ã¾ã—ãŸ" + +msgid "Partial Stretch" +msgstr "部分的ã«ä¼¸ç¸®" + +msgid "Pause" +msgstr "一時中断" + +msgid "Please Wait" +msgstr "ãŠå¾…ã¡ãã ã•ã„" + +msgid "PLUS" +msgstr "プラス" + +msgid "Portuguese" +msgstr "ãƒãƒ«ãƒˆã‚¬ãƒ«èªž" + +msgid "Brazilian Portuguese" +msgstr "ブラジルãƒãƒ«ãƒˆã‚¬ãƒ«èªž" + +msgid "Power off Wii" +msgstr "Wiiã®é›»æºã‚’切る" + +msgid "Preferences saved" +msgstr "設定をセーブã—ã¾ã—ãŸ" + +msgid "Press any button on the Classic Controller now. Press Home to clear the existing mapping." +msgstr "ボタンを押ã—ã¦ãã ã•ã„(HOME=ç„¡ã—)" + +msgid "Press any button on the GameCube Controller now. Press Home or the C-Stick in any direction to clear the existing mapping." +msgstr "ボタンを押ã—ã¦ãã ã•ã„(HOMEï½¥C=ç„¡ã—)" + +msgid "Press any button on the GameCube Controller now. Press the C-Stick in any direction to clear the existing mapping." +msgstr "ボタンを押ã—ã¦ãã ã•ã„(HOMEï½¥C=ç„¡ã—)" + +msgid "Press any button on the Wiimote now. Press Home to clear the existing mapping." +msgstr "ボタンを押ã—ã¦ãã ã•ã„(HOME=ç„¡ã—)" + +msgid "Press any button on the Wiimote or Nunchuk now. Press Home to clear the existing mapping." +msgstr "ボタンを押ã—ã¦ãã ã•ã„(HOME=ç„¡ã—)" + +msgid "Progressive (480p)" +msgstr "プログレッシブ(480p)" + +msgid "Quit Game" +msgstr "ゲームを終了" + +msgid "Quit this game? Any unsaved progress will be lost." +msgstr "未ä¿å­˜ã®ãƒ‡ãƒ¼ã‚¿ã¯å¤±ã‚ã‚Œã¾ã™" + +msgid "R TRIG" +msgstr "Rトリガー" + +msgid "RAM saving is not available for FDS games!" +msgstr "ディスクシステムã«ã¯RAMセーブã¯ã‚ã‚Šã¾ã›ã‚“" + +msgid "Reboot" +msgstr "å†èµ·å‹•" + +msgid "Rendering" +msgstr "æç”»" + +msgid "Reset" +msgstr "リセット" + +msgid "Reset Game" +msgstr "ゲームをリセット" + +msgid "Reset this game? Any unsaved progress will be lost." +msgstr "未ä¿å­˜ã®ãƒ‡ãƒ¼ã‚¿ã¯å¤±ã‚ã‚Œã¾ã™" + +msgid "Reset Mappings" +msgstr "ボタン設定をåˆæœŸåŒ–" + +msgid "Reset Settings" +msgstr "設定をåˆæœŸåŒ–" + +msgid "Retry" +msgstr "å†è©¦è¡Œ" + +msgid "Return to Loader" +msgstr "ローダーã«æˆ»ã‚‹" + +msgid "Return to Wii Menu" +msgstr "Wiiメニューã«æˆ»ã‚‹" + +msgid "Right" +msgstr "å³" + +msgid "RIGHT" +msgstr "å³" + +msgid "Right Button" +msgstr "å³ãƒœã‚¿ãƒ³" + +msgid "Rumble" +msgstr "振動" + +msgid "Save" +msgstr "セーブ" + +msgid "Save Device" +msgstr "セーブã™ã‚‹ãƒ‡ãƒã‚¤ã‚¹" + +msgid "Save failed!" +msgstr "セーブã«å¤±æ•—ã—ã¾ã—ãŸ" + +msgid "Save file not found" +msgstr "セーブデータãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" + +msgid "Save Folder" +msgstr "セーブフォルダ" + +msgid "Save Game" +msgstr "セーブデータをセーブ" + +msgid "Save RAM and State?" +msgstr "RAMã¨çŠ¶æ…‹ã‚’セーブã—ã¾ã™ã‹?" + +msgid "Save Snapshot?" +msgstr "中断データをセーブã—ã¾ã™ã‹?" + +msgid "Save SRAM and Snapshot?" +msgstr "SRAMã¨ä¸­æ–­ãƒ‡ãƒ¼ã‚¿ã‚’セーブã—ã¾ã™ã‹?" + +msgid "Save State?" +msgstr "状態をセーブã—ã¾ã™ã‹?" + +msgid "Save successful" +msgstr "セーブã«æˆåŠŸã—ã¾ã—ãŸ" + +msgid "Saving" +msgstr "セーブ" + +msgid "Saving preferences..." +msgstr "優先的ã«ã‚»ãƒ¼ãƒ–中…" + +msgid "Saving..." +msgstr "セーブ中…" + +msgid "Scaling" +msgstr "縮尺" + +msgid "Screen Position" +msgstr "ç”»é¢ã®ä½ç½®" + +msgid "Screen Zoom" +msgstr "ç”»é¢ã®æ‹¡å¤§" + +msgid "Select" +msgstr "セレクト" + +msgid "Seek error!" +msgstr "シークエラーã§ã™" + +msgid "Settings" +msgstr "設定" + +msgid "Settings - Menu" +msgstr "設定 - メニュー" + +msgid "Settings - Network" +msgstr "設定 - ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" + +msgid "Settings - Saving & Loading" +msgstr "設定 - セーブã¨èª­ã¿è¾¼ã¿" + +msgid "SD Card" +msgstr "SD" + +msgid "SD card not found!" +msgstr "SDãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" + +msgid "Shift" +msgstr "" + +msgid "Simp_chinese" +msgstr "簡体字中国語" + +msgid "SMB Share IP" +msgstr "SMB共有IP" + +msgid "SMB Share Name" +msgstr "SMB共有å" + +msgid "SMB Share Password" +msgstr "SMB共有パスワード" + +msgid "SMB Share Username" +msgstr "SMB共有ユーザーå" + +msgid "Snapshot" +msgstr "中断データ" + +msgid "Snapshot (Auto)" +msgstr "中断データ(自動)" + +msgid "SNES Controller" +msgstr "コントローラ" + +msgid "SNES Controllers (2)" +msgstr "コントローラ(2)" + +msgid "SNES Controllers (4)" +msgstr "コントローラ(4)" + +msgid "SNES Controller - Classic Controller" +msgstr "コントローラ - クラコン" + +msgid "SNES Controller - GameCube Controller" +msgstr "コントローラ - GCコン" + +msgid "SNES Controller - Nunchuk + Wiimote" +msgstr "コントローラ - Wiiリモコン+ヌンãƒãƒ£ã‚¯" + +msgid "SNES Controller - Wiimote" +msgstr "コントローラ - Wiiリモコン" + +msgid "SNES Mouse" +msgstr "マウス" + +msgid "SNES Mouse - GameCube Controller" +msgstr "マウス - GCコン" + +msgid "SNES Mouse - Wiimote" +msgstr "マウス - Wiiリモコン" + +msgid "Snes9x - Copyright (c) Snes9x Team 1996 - 2006" +msgstr "Snes9x - 著作権(c) Snes9xãƒãƒ¼ãƒ 1996-2006" + +msgid "Sound Effects Volume" +msgstr "効果音ã®éŸ³é‡" + +msgid "Spanish" +msgstr "スペイン語" + +msgid "Sprite Limit" +msgstr "スプライト制é™" + +msgid "SRAM file not found" +msgstr "SRAMファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" + +msgid "Start" +msgstr "スタート" + +msgid "State" +msgstr "状態" + +msgid "State (Auto)" +msgstr "状態(自動)" + +msgid "State file not found" +msgstr "状態ファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" + +msgid "Stretch to Fit" +msgstr "é©ã™ã‚‹ã‚ˆã†ä¼¸ç¸®" + +msgid "Super Scope" +msgstr "スーパースコープ" + +msgid "Superscope" +msgstr "スーパースコープ" + +msgid "Superscope - GameCube Controller" +msgstr "スーパースコープ - GCコン" + +msgid "Superscope - Wiimote" +msgstr "スーパースコープ - Wiiリモコン" + +msgid "This software is open source and may be copied," +msgstr "ã“ã‚Œã¯ã‚ªãƒ¼ãƒ—ンソースã§ã‚³ãƒ”ーã•ã‚Œã¾ã—ãŸ" + +msgid "Trad_chinese" +msgstr "ç¹ä½“字中国語" + +msgid "Unable to initialize network!" +msgstr "接続ã§ãã¾ã›ã‚“ã§ã—ãŸ" + +msgid "Unable to locate a load device!" +msgstr "デãƒã‚¤ã‚¹ã‚’見ã¤ã‘られã¾ã›ã‚“ã§ã—ãŸ" + +msgid "Unable to locate a save device!" +msgstr "デãƒã‚¤ã‚¹ã‚’見ã¤ã‘られã¾ã›ã‚“ã§ã—ãŸ" + +msgid "Unable to open snapshot!" +msgstr "中断データを開ã‘ã¾ã›ã‚“ã§ã—ãŸ" + +msgid "Unfiltered" +msgstr "フィルタ無ã—" + +msgid "Unknown file type!" +msgstr "ä¸æ˜Žãªãƒ•ã‚¡ã‚¤ãƒ«å½¢å¼ã§ã™" + +msgid "Unrecognized DVD format." +msgstr "èªè­˜ã§ããªã„DVDå½¢å¼ã§ã™" + +msgid "Unrecognized file extension!" +msgstr "èªè­˜ã§ããªã„æ‹¡å¼µå­ã§ã™" + +msgid "Up" +msgstr "上" + +msgid "UP" +msgstr "上" + +msgid "Up One Level" +msgstr "一階層上ã¸" + +msgid "Update Available" +msgstr "æ›´æ–°ãŒã‚ã‚Šã¾ã™" + +msgid "Update failed!" +msgstr "æ›´æ–°ã«å¤±æ•—ã—ã¾ã—ãŸ" + +msgid "Update later" +msgstr "æ›´æ–°ã—ãªã„" + +msgid "Update now" +msgstr "æ›´æ–°ã™ã‚‹" + +msgid "Update successful!" +msgstr "æ›´æ–°ã«æˆåŠŸã—ã¾ã—ãŸ" + +msgid "USB drive not found!" +msgstr "USBドライブãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" + +msgid "USB Mass Storage" +msgstr "USBデãƒã‚¤ã‚¹" + +msgid "Vertical" +msgstr "縦方å‘" + +msgid "Video" +msgstr "映åƒ" + +msgid "Video Mode" +msgstr "映åƒãƒ¢ãƒ¼ãƒ‰" + +msgid "VM8: Unknown page type!" +msgstr "VM8:ä¸æ˜Žãªãƒšãƒ¼ã‚¸å½¢å¼ã§ã™" + +msgid "VM16: Unknown page type!" +msgstr "VM16:ä¸æ˜Žãªãƒšãƒ¼ã‚¸å½¢å¼ã§ã™" + +msgid "VM32: Unknown page type!" +msgstr "VM32:ä¸æ˜Žãªãƒšãƒ¼ã‚¸å½¢å¼ã§ã™" + +msgid "Wiimote" +msgstr "Wiiリモコン" + +msgid "Wiimote Orientation" +msgstr "Wiiリモコンã®å‘ã" + +msgid "Yes" +msgstr "ã¯ã„" + +msgid "Zapper" +msgstr "ザッパー" + +msgid "Zapper Crosshair" +msgstr "ザッパーã®å字カーソル" + +msgid "Logo" +msgstr "ロゴ" + +msgid "Turbo On" +msgstr "連打オン" + +msgid "Turbo Off" +msgstr "連打オフ" + +msgid "Automatic" +msgstr "自動" + +msgid "Palette" +msgstr "使用パレット" + +msgid "AspiringSquire's Real palette" +msgstr "AspiringSquire" + +msgid "Loopy's palette" +msgstr "Loopy" + +msgid "Quor's palette" +msgstr "Quor" + +msgid "Chris Covell's palette" +msgstr "Chris Covell" + +msgid "Matthew Conte's palette" +msgstr "Matthew Conte" + +msgid "PasoFami/99 palette" +msgstr "パソファミ/99" + +msgid "CrashMan's palette" +msgstr "CrashMan" + +msgid "MESS palette" +msgstr "MESS" + +msgid "Zaphod's VS Castlevania palette" +msgstr "VSキャッスルãƒãƒ‹ã‚¢" + +msgid "Zaphod's VS SMB palette" +msgstr "VSスーパーï¾ï¾˜ï½µï¾Œï¾žï¾—ザーズ" + +msgid "VS Dr. Mario palette" +msgstr "VSDr.マリオ" + +msgid "VS Castlevania palette" +msgstr "VSキャッスルãƒãƒ‹ã‚¢" + +msgid "VS SMB/VS Ice Climber palette" +msgstr "VSスーï¾ï¾˜/アイスクライï¾ï½°" + +msgid "Catalan" +msgstr "カタロニア語" + +msgid "The current IOS has been altered (fake-signed). Functionality and/or stability may be adversely affected." +msgstr "ã“ã®IOSã§ã¯ä¸å®‰å®šã«ãªã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™" + +msgid "The current IOS is unsupported. Functionality and/or stability may be adversely affected." +msgstr "ã“ã®IOSã«ã¯å¯¾å¿œã—ã¦ã„ãªã„ã®ã§ä¸å®‰å®šã«ãªã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™" + +msgid "Turkish" +msgstr "トルコ語" diff --git a/plugins/snes9x_gx/source/lang/ko.lang b/plugins/snes9x_gx/source/lang/ko.lang new file mode 100644 index 00000000..85d83649 --- /dev/null +++ b/plugins/snes9x_gx/source/lang/ko.lang @@ -0,0 +1,2 @@ +msgid " " +msgstr "" diff --git a/plugins/snes9x_gx/source/lang/nl.lang b/plugins/snes9x_gx/source/lang/nl.lang new file mode 100644 index 00000000..a501c08d --- /dev/null +++ b/plugins/snes9x_gx/source/lang/nl.lang @@ -0,0 +1,840 @@ +msgid "&" +msgstr "&" + +msgid "16:9 Correction" +msgstr 16:9 Correctie" + +msgid "7z decompression failed: Archive contains too many files" +msgstr "7z decompressie mislukt: te veel bestanden in archief" + +msgid "7z decompression failed: Failed to read file data" +msgstr "7z decompressie mislukt: fout bij lezen van bestand" + +msgid "7z decompression failed: File is corrupt" +msgstr "7z decompressie mislukt: fout bij lezen van bestand" + +msgid "7z decompression failed: File is corrupt (CRC mismatch)" +msgstr "7z decompressie mislukt: fout bij lezen van bestand (CRC komt niet overeen)" + +msgid "7z decompression failed: File uses too high of compression settings (dictionary size is too large)" +msgstr "7z decompressie mislukt: bestand gebruikt een te hoge compressie (woordenboek is te groot)" + +msgid "7z decompression failed: File uses unsupported compression settings" +msgstr "7z decompressie mislukt: bestand gebruikt een niet ondersteunde compressie" + +msgid "A (Rapid)" +msgstr "A (Snel)" + +msgid "Additional coding" +msgstr "Overige programmering" + +msgid "Aim Offscreen" +msgstr "Richt buiten het scherm" + +msgid "An update is available!" +msgstr "Een update is beschikbaar!" + +msgid "Are you sure that you want to reset this game? Any unsaved progress will be lost." +msgstr "Weet je zeker dat je het spel wilt herstarten? Niet opgeslagen gegevens zullen verloren gaan." + +msgid "Are you sure that you want to reset your mappings?" +msgstr "Weet je zeker dat je de controller instellingen wilt wissen?" + +msgid "Are you sure that you want to reset your settings?" +msgstr "Weet je zeker dat je de instellingen wilt wissen?" + +msgid "Maintain Aspect Ratio" +msgstr "Behoud Beeldverhouding" + +msgid "Attempting to determine load device..." +msgstr "Poging om het laadapparaat te bepalen..." + +msgid "Attempting to determine save device..." +msgstr "Poging om het opslaanapparaat te bepalen..." + +msgid "Auto" +msgstr "Auto" + +msgid "Auto Detect" +msgstr "Detecteer Automatisch" + +msgid "Auto Load" +msgstr "Auto Openen" + +msgid "Auto Save" +msgstr "Auto Opslaan" + +msgid "Automatic (Recommended)" +msgstr "Automatisch (Aanbevolen)" + +msgid "B (Rapid)" +msgstr "B (Snel)" + +msgid "Back" +msgstr "Terug" + +msgid "Both" +msgstr "Beide" + +msgid "Button Mapping" +msgstr "Controller" + +msgid "Button Mappings" +msgstr "Controller Instellingen" + +msgid "Cancel" +msgstr "Annuleren" + +msgid "Caps" +msgstr "Caps" + +msgid "Cheats" +msgstr "Cheats" + +msgid "Cheats file not found!" +msgstr "Cheats bestand niet gevonden!" + +msgid "Cheats Folder" +msgstr "Cheats Map" + +msgid "Choose Game" +msgstr "Kies Spel" + +msgid "Classic Controller" +msgstr "Traditionele Controller" + +msgid "Close" +msgstr "Sluiten" + +msgid "Coding" +msgstr "Programmering" + +msgid "Coding & menu design" +msgstr "Programmering & menu ontwerp" + +msgid "Compressed GBA files are not supported!" +msgstr "Gecomprimeerde GBA bestanden zijn niet ondersteund!" + +msgid "Connecting to network share..." +msgstr "Verbinden met gedeelde map..." + +msgid "Controller" +msgstr "Controller" + +msgid "Cover View" +msgstr "Hoes Weergave" + +msgid "Covers Folder" +msgstr "Hoezen map" + +msgid "Credits" +msgstr "Credits" + +msgid "Cropping" +msgstr "Bijsnijden" + +msgid "Crosshair" +msgstr "Crosshair" + +msgid "Cursor" +msgstr "Cursor" + +msgid "Data DVD" +msgstr "DVD-ROM" + +msgid "Default" +msgstr "Standaard" + +msgid "Directory name is too long!" +msgstr "Mapnaam is te lang!" + +msgid "Disabled" +msgstr "Uitgeschakeld" + +msgid "DISABLED" +msgstr "UITGESCHAKELD" + +msgid "distributed, or modified under the terms of the" +msgstr "uitgegeven, of bewerkt onder regels van de" + +msgid "Don't Save" +msgstr "Niet Opslaan" + +msgid "Down" +msgstr "Omlaag" + +msgid "DOWN" +msgstr "OMLAAG" + +msgid "Downloading..." +msgstr "Bezig met downloaden..." + +msgid "Dutch" +msgstr "Nederlands" + +msgid "Empty or invalid ZIP file!" +msgstr "Leeg of beschadigd ZIP bestand!" + +msgid "Enabled" +msgstr "Ingeschakeld" + +msgid "ENABLED" +msgstr "INGESCHAKELD" + +msgid "English" +msgstr "Engels" + +msgid "Error" +msgstr "Fout" + +msgid "Error - Invalid ZIP file!" +msgstr "Fout - Verkeerd ZIP bestand!" + +msgid "Error creating file!" +msgstr "Fout bij het maken van het bestand!" + +msgid "Error loading game!" +msgstr "Fout bij het laden van het spel!" + +msgid "Error opening archive!" +msgstr "Fout bij het openen van het archief!" + +msgid "Error opening directory!" +msgstr "Fout bij het openen van de map!" + +msgid "Error opening file!" +msgstr "Fout bij het openen van het bestand!" + +msgid "Error reading file!" +msgstr "Fout bij het lezen van het bestand!" + +msgid "Error saving file!" +msgstr "Fout bij het opslaan van het bestand!" + +msgid "Exit" +msgstr "Afsluiten" + +msgid "Exit Action" +msgstr "Afsluitactie" + +msgid "Failed to connect to network share." +msgstr "Verbinden met gedeelde map is mislukt." + +msgid "FDS BIOS file is invalid!" +msgstr "FDS BIOS bestand is verkeerd!" + +msgid "FDS BIOS file not found!" +msgstr "FDS BIOS bestand kan niet gevonden worden!" + +msgid "Filtered" +msgstr "Gesorteerd" + +msgid "Filtering" +msgstr "Sortering" + +msgid "Fire" +msgstr "Vuren" + +msgid "French" +msgstr "Frans" + +msgid "GBA Screen Zoom" +msgstr "GBA Scherm Zomen" + +msgid "Game Genie ROM not found!" +msgstr "Game Genie ROM niet gevonden!" + +msgid "Game Settings" +msgstr "Spelinstellingen" + +msgid "Game Settings - Button Mappings" +msgstr "Spelinstellingen - Controller Configuratie" + +msgid "Game Settings - Cheats" +msgstr "Spelinstellingen - Cheats" + +msgid "Game Settings - Video" +msgstr "Spelinstellingen - Video" + +msgid "Game Timing" +msgstr "Spel Timen" + +msgid "Game Genie DISABLED" +msgstr "Game Genie UITGESCHAKELD" + +msgid "Game Genie ENABLED" +msgstr "Game Genie INGESCHAKELD" + +msgid "GameCube Controller" +msgstr "GameCube Controller" + +msgid "German" +msgstr "Duits" + +msgid "GNU General Public License (GPL) Version 2." +msgstr "GNU General Public License (GPL) Versie 2." + +msgid "Go Back" +msgstr "Ga Terug" + +msgid "Horizontal" +msgstr "Horizontaal" + +msgid "Information" +msgstr "Informatie" + +msgid "Initializing network..." +msgstr "Netwerk Initialiseren..." + +msgid "Insert Coin" +msgstr "Munt inwerpen" + +msgid "Insert Coin / Switch Disk" +msgstr "Munt inwerpen / Disk wisselen" + +msgid "Invalid file size!" +msgstr "Verkeerde bestandsgrootte!" + +msgid "Invalid game file!" +msgstr "Verkeerd spelbestand!" + +msgid "Invalid network settings - Check settings.xml." +msgstr "Verkeerde netwerk instellingen - Controleer settings.xml." + +msgid "Invalid network settings - Share IP is blank." +msgstr "Verkeerde netwerk instellingen - Gedeeld ip adres is niet opgegeven." + +msgid "Invalid network settings - Share name is blank." +msgstr "Verkeerde netwerk instellingen - Gedeelde map is niet opgegeven." + +msgid "Invalid save file" +msgstr "Invalide opgeslagen bestand" + +msgid "Invalid state file" +msgstr "Invalide status bestand" + +msgid "Italian" +msgstr "Italiaans" + +msgid "Japanese" +msgstr "Japans" + +msgid "Justifier" +msgstr "Konami Justifier" + +msgid "Justifier - GameCube Controller" +msgstr "Konami Justifier - GameCube Controller" + +msgid "Justifier - Wiimote" +msgstr "Konami Justifier - Wiimote" + +msgid "Korean" +msgstr "Koreaans" + +msgid "L TRIG" +msgstr "L" + +msgid "Language" +msgstr "Taal" + +msgid "Languages Folder" +msgstr "Talenmap" + +msgid "Left" +msgstr "Links" + +msgid "LEFT" +msgstr "LINKS" + +msgid "Left Button" +msgstr "Knop Links" + +msgid "Load" +msgstr "Openen" + +msgid "Load Device" +msgstr "Open Apparaat" + +msgid "Load Folder" +msgstr "Open Map" + +msgid "Load Game" +msgstr "Spel starten" + +msgid "Loading" +msgstr "Laden" + +msgid "Loading DVD..." +msgstr "Bezig met DVD laden..." + +msgid "Loading patch..." +msgstr "Bezig met patch laden..." + +msgid "Loading..." +msgstr "Bezig met laden..." + +msgid "Main Menu" +msgstr "Hoofdmenu" + +msgid "Match GC Controls" +msgstr "Gelijk aan GC besturing" + +msgid "Match Wii Controls" +msgstr "Gelijk aan Wii besturing" + +msgid "Maximum filepath length reached!" +msgid "Maximale bestandspad lengte berijkt!" + +msgid "Menu" +msgstr "Menu" + +msgid "Menu artwork" +msgstr "Menu artwork" + +msgid "Menu sound" +msgstr "Menu geluid" + +msgid "Music Volume" +msgstr "Muziek volume" + +msgid "MINUS" +msgstr "MIN" + +msgid "Mute" +msgstr "Stil" + +msgid "NES Controller" +msgstr "NES Controller" + +msgid "NES Controllers (2)" +msgstr "NES COntrollers (2)" + +msgid "NES Controllers (4)" +msgstr "NES Controllers (4)" + +msgid "NES Zapper" +msgstr "Nintendo Zapper" + +msgid "Network" +msgstr "Netwerk" + +msgid "Network Share" +msgstr "Gedeelde map" + +msgid "New" +msgstr "Nieuw" + +msgid "New Snapshot" +msgstr "Nieuw Snapshot" + +msgid "New SRAM" +msgstr "Nieuw SRAM" + +msgid "No" +msgstr "Nee" + +msgid "No data to save!" +msgstr "Geen data om op te slaan!" + +msgid "No disc inserted!" +msgstr "Geen schijf ingevoerd!" + +msgid "No SRAM data to save!" +msgstr "Geen SRAM om op te slaan!" + +msgid "No game saves found." +msgstr "Geen opgeslagen spellen gevonden." + +msgid "None" + +msgstr "Geen" + +msgid "NTSC (480i)" +msgstr "NTSC (480i)" + +msgid "Nunchuk" +msgstr "Nunchuk" + +msgid "Off" +msgstr "Uit" + +msgid "Official Site: http://code.google.com/p/fceugc/" +msgstr "Officiële Website: http://code.google.com/p/fceugc/" + +msgid "Official Site: http://code.google.com/p/snes9x-gx/" +msgstr "Officiële Website: http://code.google.com/p/snes9x-gx/" + +msgid "Official Site: http://code.google.com/p/vba-wii/" +msgstr "Officiële Website: http://code.google.com/p/vba-wii/" + +msgid "OK" +msgstr "OK" + +msgid "On" +msgstr "Aan" + +msgid "Original" +msgstr "Origineel" + +msgid "Out of memory!" +msgstr "Te weinig geheugen!" + +msgid "Out of memory: too many files!" +msgstr "Te weinig geheugen: te veel bestanden!" + +msgid "P1" +msgstr "P1" + +msgid "P2" +msgstr "P2" + +msgid "P3" +msgstr "P3" + +msgid "P4" +msgstr "P4" + +msgid "PAL (50Hz)" +msgstr "PAL (50Hz)" + +msgid "PAL (60Hz)" +msgstr "PAL (60Hz)" + +msgid "Palette saved" +msgstr "Kleurenpalet opgeslagen" + +msgid "Partial Stretch" +msgstr "Gedeeltelijk Uitgerekt" + +msgid "Pause" +msgstr "Pauze" + +msgid "Please Wait" +msgstr "Even geduld" + +msgid "PLUS" +msgstr "PLUS" + +msgid "Portuguese" +msgstr "Portugees" + +msgid "Power off Wii" +msgstr "Wii uitschakelen" + +msgid "Preferences saved" +msgstr "Instellingen opgeslagen" + +msgid "Press any button on the Classic Controller now. Press Home to clear the existing mapping." +msgstr "Druk op een knop op de Tradionele Controller. Druk op Home om de instelling te wissen." + +msgid "Press any button on the GameCube Controller now. Press Home or the C-Stick in any direction to clear the existing mapping." +msgstr "Druk op een knop op de GameCube Controller. Druk op Home of beweeg de C-stick om de instelling te wissen." + +msgid "Press any button on the GameCube Controller now. Press the C-Stick in any direction to clear the existing mapping." +msgstr "Druk op een knop op de GameCube Controller. Beweeg de C-stick om de instelling te wissen." + +msgid "Press any button on the Wiimote now. Press Home to clear the existing mapping." +msgstr "Druk op een knop op de Wiimote. Druk op Home om de instelling te wissen." + +msgid "Press any button on the Wiimote or Nunchuk now. Press Home to clear the existing mapping." +msgstr "Druk op een knop op de Wiimote of Nunchuck. Druk op Home om de instelling te wissen." + +msgid "Progressive (480p)" +msgstr "Progressief (480p)" + +msgid "Quit Game" +msgstr "Spel Afsluiten" + +msgid "Quit this game? Any unsaved progress will be lost." +msgstr "Sluit dit spel af? Niet opgeslagen gegevens zullen verloren gaan." + +msgid "R TRIG" +msgstr "R" + +msgid "RAM saving is not available for FDS games!" +msgstr "RAM opslaan is niet beschikbaar voor FDS spellen!" + +msgid "Reboot" +msgstr "Herstart" + +msgid "Rendering" +msgstr "Rendering" + +msgid "Reset" +msgstr "Reset" + +msgid "Reset Game" +msgstr "Herstart Spel" + +msgid "Reset this game? Any unsaved progress will be lost." +msgstr "Herstart dit spel? Niet opgeslagen gegevens zullen verloren gaan." + +msgid "Reset Mappings" +msgstr "Reset Controllers" + +msgid "Reset Settings" +msgstr "Reset Instellingen" + +msgid "Retry" +msgstr "Opnieuw" + +msgid "Return to Loader" +msgstr "Terug naar de Lader" + +msgid "Return to Wii Menu" +msgstr "Terug naar het Wii Menu" + +msgid "Right" +msgstr "Rechts" + +msgid "RIGHT" +msgstr "RECHTS" + +msgid "Right Button" +msgstr "Knop Rechts" + +msgid "Rumble" +msgstr "Tril" + +msgid "Save" +msgstr "Opslaan" + +msgid "Save Device" +msgstr "Opslaan Apparaat" + +msgid "Save failed!" +msgstr "Opslaan is mislukt!" + +msgid "Save file not found" +msgstr "Opgeslagen bestand is niet gevonden" + +msgid "Save Folder" +msgstr "Opslaan Map" + +msgid "Save Game" +msgstr "Spel Opslaan" + +msgid "Save RAM and State?" +msgstr "Geheugen en status opslaan?" + +msgid "Save Snapshot?" +msgstr "Snapshot Opslaan?" + +msgid "Save SRAM and Snapshot?" +msgstr "SRAM en Snapshot opslaan?" + +msgid "Save State?" +msgstr "Status Opslaan?" + +msgid "Save successful" +msgstr "Succesvol opgeslagen" + +msgid "Saving" +msgstr "Opslaan" + +msgid "Saving preferences..." +msgstr "Instellingen opslaan..." + +msgid "Saving..." +msgstr "Bezig met opslaan..." + +msgid "Scaling" +msgstr "Schaal" + +msgid "Screen Position" +msgstr "Schermpositie" + +msgid "Screen Zoom" +msgstr "Zomen" + +msgid "Select" +msgstr "Selecteer" + +msgid "Seek error!" +msgstr "Zoekfout!" + +msgid "Settings" +msgstr "Instellingen" + +msgid "Settings - Menu" +msgstr "Instellingen - Menu" + +msgid "Settings - Network" +msgstr "Instellingen - Netwerk" + +msgid "Settings - Saving & Loading" +msgstr "Instellingen - Laden & Opslaan" + +msgid "SD Card" +msgstr "SD Kaart" + +msgid "SD card not found!" +msgstr "Geen SD kaart gevonden!" + +msgid "Shift" +msgstr "Shift" + +msgid "Simp_chinese" +msgstr "Vereenvoudigd Chinees" + +msgid "SMB Share IP" +msgstr "IP SMB Share" + +msgid "SMB Share Name" +msgstr "SMB Share Naam" + +msgid "SMB Share Password" +msgstr "SMB Share Wachtwoord" + +msgid "SMB Share Username" +msgstr "SMB Share Gebruiker" + +msgid "Snapshot" +msgstr "Snapshot" + +msgid "Snapshot (Auto)" +msgstr "Snapshot (Auto)" + +msgid "SNES Controller" +msgstr "SNES Controller" + +msgid "SNES Controllers (2)" +msgstr "SNES Controllers (2)" + +msgid "SNES Controllers (4)" +msgstr "SNES Controllers (4)" + +msgid "SNES Controller - Classic Controller" +msgstr "SNES Controller - Classic Controller" + +msgid "SNES Controller - GameCube Controller" +msgstr "SNES Controller - GameCube Controller" + +msgid "SNES Controller - Nunchuk + Wiimote" +msgstr "SNES Controller - Nunchuk + Wiimote" + +msgid "SNES Controller - Wiimote" +msgstr "SNES Controller - Wiimote" + +msgid "SNES Mouse" +msgstr "SNES Muis" + +msgid "SNES Mouse - GameCube Controller" +msgstr "SNES Muis - GameCube Controller" + +msgid "SNES Mouse - Wiimote" +msgstr "SNES Muis - Wiimote" + +msgid "Snes9x - Copyright (c) Snes9x Team 1996 - 2006" +msgstr "Snes9x - Copyright (c) Snes9x Team 1996 - 2006" + +msgid "Sound Effects Volume" +msgstr "Volume Geluidseffecten" + +msgid "Spanish" +msgstr "Spaans" + +msgid "Sprite Limit" +msgstr "Sprite Limiet" + +msgid "SRAM file not found" +msgstr "SRAM bestand niet gevonden" + +msgid "State" +msgstr "Status" + +msgid "State (Auto)" +msgstr "Status (Auto)" + +msgid "State file not found" +msgstr "Status bestand niet gevonden" + +msgid "Stretch to Fit" +msgstr "Uitrekken tot passend" + +msgid "Superscope" +msgstr "Superscope" + +msgid "Superscope - GameCube Controller" +msgstr "Superscope - GameCube Controller" + +msgid "Superscope - Wiimote" +msgstr "Superscope - Wiimote" + +msgid "This software is open source and may be copied," +msgstr "Deze software is Open Source en mag gekopieerd worden," + +msgid "Trad_chinese" +msgstr "Traditioneel Chinees" + +msgid "Unable to initialize network!" +msgstr "Kan netwerk niet initialiseren!" + +msgid "Unable to locate a load device!" +msgstr "Kan laad apparaat niet vinden!" + +msgid "Unable to locate a save device!" +msgstr "Kan opslaan apparaat niet vinden!" + +msgid "Unable to open snapshot!" +msgstr "Kan snapshot niet openen!" + +msgid "Unfiltered" +msgstr "Ongefiltered" + +msgid "Unknown file type!" +msgstr "Onbekend bestandstype!" + +msgid "Unrecognized DVD format." +msgstr "Onbekend DVD formaat." + +msgid "Unrecognized file extension!" +msgstr "Onbekende bestandsextentie!" + +msgid "Up" +msgstr "Omhoog" + +msgid "UP" +msgstr "OMHOOG" + +msgid "Up One Level" +msgstr "Eén Omhoog" + +msgid "Update Available" +msgstr "Update beschikbaar" + +msgid "Update failed!" +msgstr "Update mislukt!" + +msgid "Update later" +msgstr "Later updaten" + +msgid "Update now" +msgstr "Nu updaten" + +msgid "Update successful!" +msgstr "Update succesvol!" + +msgid "USB drive not found!" +msgstr "USB disk niet gevonden!" + +msgid "USB Mass Storage" +msgstr "USB Mass Storage" + +msgid "Vertical" +msgstr "Vertikaal" + +msgid "Video" +msgstr "Video" + +msgid "Video Mode" +msgstr "Video Modus" + +msgid "VM8: Unknown page type!" +msgstr "VM8: Onbekend pagina type!" + +msgid "VM16: Unknown page type!" +msgstr "VM16: Onbekend pagina type!" + +msgid "VM32: Unknown page type!" +msgstr "VM32: Onbekend pagina type!" \ No newline at end of file diff --git a/plugins/snes9x_gx/source/lang/pt.lang b/plugins/snes9x_gx/source/lang/pt.lang new file mode 100644 index 00000000..a4905ebc --- /dev/null +++ b/plugins/snes9x_gx/source/lang/pt.lang @@ -0,0 +1,872 @@ +msgid "&" +msgstr "&" + +msgid "16:9 Correction" +msgstr "Correcção 16:9" + +msgid "7z decompression failed: Archive contains too many files" +msgstr "Extracção 7z falhou: o ficheiro 7z contém demasiados ficheiros" + +msgid "7z decompression failed: Failed to read file data" +msgstr "Extracção 7z falhou: erro na leitura do ficheiro" + +msgid "7z decompression failed: File is corrupt" +msgstr "Extracção 7z falhou: ficheiro corrupto" + +msgid "7z decompression failed: File is corrupt (CRC mismatch)" +msgstr "Extracção 7z falhou: ficheiro corrupto (erro de CRC)" + +msgid "7z decompression failed: File uses too high of compression settings (dictionary size is too large)" +msgstr "Extracção 7z falhou: O ficheiro usa parâmetros de compressão muito altos (o tamanho de dicionário é muito grande)" + +msgid "7z decompression failed: File uses unsupported compression settings" +msgstr "Extracção 7z falhou: O ficheiro usa parâmetros não suportados" + +msgid "A (Rapid)" +msgstr "A (Rápido)" + +msgid "Additional coding" +msgstr "Programação adicional" + +msgid "Aim Offscreen" +msgstr "Mira fora do ecrã" + +msgid "An update is available!" +msgstr "Actualização disponível!" + +msgid "Are you sure that you want to reset this game? Any unsaved progress will be lost." +msgstr "Quer mesmo reiniciar este jogo? Qualquer progresso não gravado será perdido." + +msgid "Are you sure that you want to reset your mappings?" +msgstr "Quer mesmo repor os controlos mapeados?" + +msgid "Are you sure that you want to reset your settings?" +msgstr "Quer mesmo repor as configurações?" + +msgid "Maintain Aspect Ratio" +msgstr "Manter Proporções" + +msgid "Attempting to determine load device..." +msgstr "A determinar dispositivo de carregamento..." + +msgid "Attempting to determine save device..." +msgstr "A determinar dispositivo de gravação..." + +msgid "Auto" +msgstr "Automático" + +msgid "Auto Detect" +msgstr "Auto detectar" + +msgid "Auto Load" +msgstr "Auto carregar" + +msgid "Auto Save" +msgstr "Auto gravar" + +msgid "Automatic" +msgstr "Automático" + +msgid "Automatic (Recommended)" +msgstr "Automático (Recomendado)" + +msgid "B (Rapid)" +msgstr "B (Rápido)" + +msgid "Back" +msgstr "Voltar" + +msgid "Both" +msgstr "Ambos" + +msgid "Controles" +msgstr "Controlos" + +msgid "Button Mappings" +msgstr "Mapear Botões" + +msgid "Cancel" +msgstr "Cancelar" + +msgid "Caps" +msgstr "Maiúsc." + +msgid "Cheats" +msgstr "Truques" + +msgid "Cheats file not found!" +msgstr "Ficheiro de truques não encontrado!" + +msgid "Cheats Folder" +msgstr "Pasta de Truques" + +msgid "Choose Game" +msgstr "Escolher Jogo" + +msgid "Classic Controller" +msgstr "Comando Clássico" + +msgid "Close" +msgstr "Fechar" + +msgid "Coding" +msgstr "Programação" + +msgid "Coding & menu design" +msgstr "Programação & desenho do menu" + +msgid "Compressed GBA files are not supported!" +msgstr "Ficheiros GBA comprimidos não são suportados!" + +msgid "Connecting to network share..." +msgstr "A ligar à partilha de rede..." + +msgid "Controller" +msgstr "Controlo" + +msgid "Cover View" +msgstr "Visualização de Capas" + +msgid "Covers Folder" +msgstr "Pasta de Capas" + +msgid "Credits" +msgstr "Créditos" + +msgid "Cropping" +msgstr "Cropping" + +msgid "Crosshair" +msgstr "Mira" + +msgid "Cursor" +msgstr "Cursor" + +msgid "Data DVD" +msgstr "DVD de Dados" + +msgid "Default" +msgstr "Padrão" + +msgid "Directory name is too long!" +msgstr "O nome da directoria é muito grande!" + +msgid "Disabled" +msgstr "Desactivado" + +msgid "DISABLED" +msgstr "DESACTIVADO" + +msgid "distributed, or modified under the terms of the" +msgstr "distribuído, ou modificado sob os termos de" + +msgid "Don't Save" +msgstr "Não gravar" + +msgid "Down" +msgstr "Baixo" + +msgid "DOWN" +msgstr "BAIXO" + +msgid "Downloading..." +msgstr "A transferir..." + +msgid "Dutch" +msgstr "Holandês" + +msgid "Empty or invalid ZIP file!" +msgstr "Ficheiro ZIP vazio ou inválido" + +msgid "Enabled" +msgstr "Activado" + +msgid "ENABLED" +msgstr "ACTIVADO" + +msgid "English" +msgstr "Inglês" + +msgid "Error" +msgstr "Erro" + +msgid "Error - Invalid ZIP file!" +msgstr "Erro - Ficheiro ZIP inválido!" + +msgid "Error creating file!" +msgstr "Erro ao criar ficheiro!" + +msgid "Error loading game!" +msgstr "Erro ao carregar jogo!" + +msgid "Error opening archive!" +msgstr "Erro ao abrir arquivo!" + +msgid "Error opening directory!" +msgstr "Erro ao abrir diretoria!" + +msgid "Error opening file!" +msgstr "Erro ao abrir ficheiro!" + +msgid "Error reading file!" +msgstr "Erro ao ler ficheiro!" + +msgid "Error saving file!" +msgstr "Erro ao gravar ficheiro!" + +msgid "Exit" +msgstr "Sair" + +msgid "Exit Action" +msgstr "Acção ao Sair" + +msgid "Failed to connect to network share." +msgstr "Falha ao ligar-se à partilha de rede." + +msgid "FDS BIOS file is invalid!" +msgstr "Ficheiro de BIOS do FDS (Famicom Disk System) inválido!" + +msgid "FDS BIOS file not found!" +msgstr "Ficheiro de BIOS de FDS (Famicom Disk System) não encontrado!" + +msgid "Filtered" +msgstr "Filtrado" + +msgid "Filtering" +msgstr "Filtragem" + +msgid "Fire" +msgstr "Fogo" + +msgid "French" +msgstr "Francês" + +msgid "GBA Screen Zoom" +msgstr "Zoom do ecrã GBA" + +msgid "Game Genie ROM not found!" +msgstr "Não foi encontrada a ROM do Game Genie!" + +msgid "Game Settings" +msgstr "Configurações" + +msgid "Game Settings - Button Mappings" +msgstr "Configurações - Mapear Botões" + +msgid "Game Settings - Cheats" +msgstr "Configurações - Truques" + +msgid "Game Settings - Video" +msgstr "Configurações - Vídeo" + +msgid "Game Timing" +msgstr "Tempo de jogo" + +msgid "Game Genie DISABLED" +msgstr "Game Genie DESACTIVADO" + +msgid "Game Genie ENABLED" +msgstr "Game Genie ACTIVADO" + +msgid "GameCube Controller" +msgstr "Comando GameCube" + +msgid "German" +msgstr "Alemão" + +msgid "GNU General Public License (GPL) Version 2." +msgstr "GNU Licença Pública Geral (GPL) Versão 2." + +msgid "Go Back" +msgstr "Voltar" + +msgid "Horizontal" +msgstr "Horizontal" + +msgid "Information" +msgstr "Informação" + +msgid "Initializing network..." +msgstr "A iniciar ligação de rede..." + +msgid "Insert Coin" +msgstr "Inserir Moeda" + +msgid "Insert Coin / Switch Disk" +msgstr "Inserir Moeda / Trocar Disco" + +msgid "Invalid file size!" +msgstr "Tamanho de ficheiro inválido!" + +msgid "Invalid game file!" +msgstr "Ficheiro de jogo inválido!" + +msgid "Invalid network settings - Check settings.xml." +msgstr "Configuração de rede inválida - Verifique o ficheiro settings.xml." + +msgid "Invalid network settings - Share IP is blank." +msgstr "Configuração de rede inválida - IP vazio." + +msgid "Invalid network settings - Share name is blank." +msgstr "Configuração de rede inválida - Nome vazio." + +msgid "Invalid save file" +msgstr "Ficheiro gravado inválido" + +msgid "Invalid state file" +msgstr "Ficheiro de estado inválido" + +msgid "Italian" +msgstr "Italiano" + +msgid "Japanese" +msgstr "Japonês" + +msgid "Justifier" +msgstr "Justifier" + +msgid "Justifier - GameCube Controller" +msgstr "Justifier - Comando GameCube" + +msgid "Justifier - Wiimote" +msgstr "Justifier - Wii Remote" + +msgid "Korean" +msgstr "Coreano" + +msgid "L TRIG" +msgstr "L" + +msgid "Language" +msgstr "Idioma" + +msgid "Languages Folder" +msgstr "Pasta de Idiomas" + +msgid "Left" +msgstr "Esquerda" + +msgid "LEFT" +msgstr "ESQUERDA" + +msgid "Left Button" +msgstr "Botão Esquerdo" + +msgid "Load" +msgstr "Carregar" + +msgid "Load Device" +msgstr "Carregar do Dispositivo" + +msgid "Load Folder" +msgstr "Pasta de Jogos" + +msgid "Load Game" +msgstr "Carregar Jogo" + +msgid "Loading" +msgstr "A Carregar" + +msgid "Loading DVD..." +msgstr "A Carregar DVD..." + +msgid "Loading patch..." +msgstr "A Carregar patch..." + +msgid "Loading..." +msgstr "A carregar..." + +msgid "Main Menu" +msgstr "Menu Principal" + +msgid "Match GC Controls" +msgstr "Coincidir Controlos GC" + +msgid "Match Wii Controls" +msgstr "Coincidir Controlos Wii" + +msgid "Maximum filepath length reached!" +msgid "Tamanho máximo do caminho do ficheiro alcançado!" + +msgid "Menu" +msgstr "Menu" + +msgid "Menu artwork" +msgstr "Arte do Menu" + +msgid "Menu sound" +msgstr "Som do Menu" + +msgid "MINUS" +msgstr "MENOS" + +msgid "Music Volume" +msgstr "Volume da Música" + +msgid "Mute" +msgstr "Mudo" + +msgid "NES Controller" +msgstr "Comando NES" + +msgid "NES Controllers (2)" +msgstr "Comando NES (2)" + +msgid "NES Controllers (4)" +msgstr "Comando NES (4)" + +msgid "NES Zapper" +msgstr "Nintendo Zapper" + +msgid "Network" +msgstr "Rede" + +msgid "Network Share" +msgstr "Partilha de Rede" + +msgid "New" +msgstr "Novo" + +msgid "New Snapshot" +msgstr "Novo Snapshot" + +msgid "New SRAM" +msgstr "Nova SRAM" + +msgid "No" +msgstr "Não" + +msgid "No data to save!" +msgstr "Não há dados para gravar!" + +msgid "No disc inserted!" +msgstr "Nenhum disco inserido!" + +msgid "No SRAM data to save!" +msgstr "Não há dados de SRAM para gravar!" + +msgid "No game saves found." +msgstr "Nenhum jogo gravado encontrado." + +msgid "None" +msgstr "Nenhum" + +msgid "NTSC (480i)" +msgstr "NTSC (480i)" + +msgid "Nunchuk" +msgstr "Nunchuk" + +msgid "Off" +msgstr "Desligado" + +msgid "Official Site: http://code.google.com/p/fceugc/" +msgstr "Site Oficial: http://code.google.com/p/fceugc/" + +msgid "Official Site: http://code.google.com/p/snes9x-gx/" +msgstr "Site Oficial: http://code.google.com/p/snes9x-gx/" + +msgid "Official Site: http://code.google.com/p/vba-wii/" +msgstr "Site Oficial: http://code.google.com/p/vba-wii/" + +msgid "OK" +msgstr "OK" + +msgid "On" +msgstr "Ligado" + +msgid "Original" +msgstr "Original" + +msgid "Out of memory!" +msgstr "Memória insuficiente!" + +msgid "Out of memory: too many files!" +msgstr "Memória insuficiente: demasiados ficheiros!" + +msgid "P1" +msgstr "J1" + +msgid "P2" +msgstr "J2" + +msgid "P3" +msgstr "J3" + +msgid "P4" +msgstr "J4" + +msgid "PAL (50Hz)" +msgstr "PAL (50Hz)" + +msgid "PAL (60Hz)" +msgstr "PAL (60Hz)" + +msgid "Palette saved" +msgstr "Paleta gravada" + +msgid "Partial Stretch" +msgstr "Esticar Parcial" + +msgid "Pause" +msgstr "Pausa" + +msgid "Please Wait" +msgstr "Espere por favor" + +msgid "PLUS" +msgstr "MAIS" + +msgid "Portuguese" +msgstr "Português" + +msgid "Brazilian Portuguese" +msgstr "Português (BR)" + +msgid "Power off Wii" +msgstr "Desligar Wii" + +msgid "Preferences saved" +msgstr "Preferências gravadas" + +msgid "Press any button on the Classic Controller now. Press Home to clear the existing mapping." +msgstr "Pressione um botão no Comando Clássico. Pressione HOME para eliminar a configuração actual." + +msgid "Press any button on the GameCube Controller now. Press Home or the C-Stick in any direction to clear the existing mapping." +msgstr "Pressione um botão no Comando GameCube. Pressione HOME ou mova o Stick-C para eliminar a configuração actual." + +msgid "Press any button on the GameCube Controller now. Press the C-Stick in any direction to clear the existing mapping." +msgstr "Pressione um botão no Comando GameCube. Mova o Stick-C para eliminar a configuração actual." + +msgid "Press any button on the Wiimote now. Press Home to clear the existing mapping." +msgstr "Pressione um botão no Wii Remote. Pressione HOME para eliminar a configuração actual." + +msgid "Press any button on the Wiimote or Nunchuk now. Press Home to clear the existing mapping." +msgstr "Pressione um botão no Wii Remote ou no Nunchuk. Pressione HOME para eliminar a configuração actual." + +msgid "Progressive (480p)" +msgstr "Progressivo (480p)" + +msgid "Quit Game" +msgstr "Sair do Jogo" + +msgid "Quit this game? Any unsaved progress will be lost." +msgstr "Sair do Jogo? Qualquer progresso não gravado será perdido." + +msgid "R TRIG" +msgstr "R" + +msgid "RAM saving is not available for FDS games!" +msgstr "Gravar RAM não está disponível para jogos do FDS (Famicom Disk System)!" + +msgid "Reboot" +msgstr "Reiniciar" + +msgid "Rendering" +msgstr "Renderização" + +msgid "Reset" +msgstr "Reiniciar" + +msgid "Reset Game" +msgstr "Reiniciar Jogo" + +msgid "Reset this game? Any unsaved progress will be lost." +msgstr "Reiniciar Jogo? Qualquer progresso não gravado será perdido." + +msgid "Reset Mappings" +msgstr "Repor mapeamentos" + +msgid "Reset Settings" +msgstr "Repor configurações" + +msgid "Retry" +msgstr "Repetir" + +msgid "Return to Loader" +msgstr "Voltar ao Loader" + +msgid "Return to Wii Menu" +msgstr "Voltar ao Menu Wii" + +msgid "Right" +msgstr "Direita" + +msgid "RIGHT" +msgstr "DIREITA" + +msgid "Right Button" +msgstr "Botão direito" + +msgid "Rumble" +msgstr "Vibração" + +msgid "Save" +msgstr "Gravar" + +msgid "Save Device" +msgstr "Gravar no dispositivo" + +msgid "Save failed!" +msgstr "Falha ao gravar!" + +msgid "Save file not found" +msgstr "Ficheiro gravado não encontrado" + +msgid "Save Folder" +msgstr "Pasta de gravar" + +msgid "Save Game" +msgstr "Gravar Jogo" + +msgid "Save RAM and State?" +msgstr "Gravar RAM e o estado?" + +msgid "Save Snapshot?" +msgstr "Gravar Snapshot?" + +msgid "Save SRAM and Snapshot?" +msgstr "Gravar SRAM e Snapshot?" + +msgid "Save State?" +msgstr "Gravar estado?" + +msgid "Save successful" +msgstr "Gravado com sucesso" + +msgid "Saving" +msgstr "A gravar" + +msgid "Saving preferences..." +msgstr "A gravar preferências..." + +msgid "Saving..." +msgstr "A gravar..." + +msgid "Scaling" +msgstr "Escala" + +msgid "Screen Position" +msgstr "Posição do ecrã" + +msgid "Screen Zoom" +msgstr "Zoom do ecrã" + +msgid "Select" +msgstr "Seleccionar" + +msgid "Seek error!" +msgstr "Erro de posicionamento!" + +msgid "Settings" +msgstr "Configurações" + +msgid "Settings - Menu" +msgstr "Configurações - Menu" + +msgid "Settings - Network" +msgstr "Configurações - Rede" + +msgid "Settings - Saving & Loading" +msgstr "Configurações - Gravar & Carregar" + +msgid "SD Card" +msgstr "Cartão SD" + +msgid "SD card not found!" +msgstr "Cartão SD não encontrado!" + +msgid "Shift" +msgstr "Shift" + +msgid "Simp_chinese" +msgstr "Chinês Simp." + +msgid "SMB Share IP" +msgstr "IP do SMB" + +msgid "SMB Share Name" +msgstr "Nome do SMB" + +msgid "SMB Share Password" +msgstr "Palavra-passe do SMB" + +msgid "SMB Share Username" +msgstr "Nome de utilizador do SMB" + +msgid "Snapshot" +msgstr "Snapshot" + +msgid "Snapshot (Auto)" +msgstr "Snapshot (Auto)" + +msgid "SNES Controller" +msgstr "Comando SNES" + +msgid "SNES Controllers (2)" +msgstr "Comando SNES (2)" + +msgid "SNES Controllers (4)" +msgstr "Comando SNES (4)" + +msgid "SNES Controller - Classic Controller" +msgstr "Comando SNES - Comando Clássico" + +msgid "SNES Controller - GameCube Controller" +msgstr "Comando SNES - Comando GameCube" + +msgid "SNES Controller - Nunchuk + Wiimote" +msgstr "Comando SNES - Nunchuk + Wii Remote" + +msgid "SNES Controller - Wiimote" +msgstr "Comando SNES - Wii Remote" + +msgid "SNES Mouse" +msgstr "Rato SNES" + +msgid "SNES Mouse - GameCube Controller" +msgstr "Rato SNES - Comando GameCube" + +msgid "SNES Mouse - Wiimote" +msgstr "Rato SNES - Wii Remote" + +msgid "Snes9x - Copyright (c) Snes9x Team 1996 - 2006" +msgstr "Snes9x - Direitos de autor (c) Equipa Snes9x 1996 - 2006" + +msgid "Sound Effects Volume" +msgstr "Volume de Efeitos Sonoros" + +msgid "Spanish" +msgstr "Espanhol" + +msgid "Sprite Limit" +msgstr "Limite de Sprites" + +msgid "SRAM file not found" +msgstr "Ficheiro SRAM não encontrado" + +msgid "State" +msgstr "Estado" + +msgid "State (Auto)" +msgstr "Estado (Auto)" + +msgid "State file not found" +msgstr "Ficheiro de estado não encontrado" + +msgid "Stretch to Fit" +msgstr "Esticar para Caber" + +msgid "Superscope" +msgstr "SuperScope" + +msgid "Superscope - GameCube Controller" +msgstr "SuperScope - Comando GameCube" + +msgid "Superscope - Wiimote" +msgstr "SuperScope - Wii Remote" + +msgid "This software is open source and may be copied," +msgstr "Este software é de código aberto e pode ser copiado," + +msgid "Trad_chinese" +msgstr "Chinês Trad." + +msgid "Unable to initialize network!" +msgstr "Não foi possível iniciar ligação!" + +msgid "Unable to locate a load device!" +msgstr "Dispositivo de carregamento não encontrado!" + +msgid "Unable to locate a save device!" +msgstr "Dispositivo de gravar não encontrado!" + +msgid "Unable to open snapshot!" +msgstr "Não foi possível abrir snapshot!" + +msgid "Unfiltered" +msgstr "Sem filtro" + +msgid "Unknown file type!" +msgstr "Tipo de ficheiro desconhecido!" + +msgid "Unrecognized DVD format." +msgstr "Formato de DVD desconhecido." + +msgid "Unrecognized file extension!" +msgstr "Extensão de ficheiro desconhecida!" + +msgid "Up" +msgstr "Cima" + +msgid "UP" +msgstr "CIMA" + +msgid "Up One Level" +msgstr ".." + +msgid "Update Available" +msgstr "Actualização Disponível" + +msgid "Update failed!" +msgstr "A actualização falhou!" + +msgid "Update later" +msgstr "Actualizar depois" + +msgid "Update now" +msgstr "Actualizar agora" + +msgid "Update successful!" +msgstr "Actualização bem sucedida!" + +msgid "USB drive not found!" +msgstr "Drive USB não encontrado!" + +msgid "USB Mass Storage" +msgstr "Dispositivo USB" + +msgid "Vertical" +msgstr "Vertical" + +msgid "Video" +msgstr "Vídeo" + +msgid "Video Mode" +msgstr "Modo de Vídeo" + +msgid "VM8: Unknown page type!" +msgstr "VM8: Tipo de página desconhecida!" + +msgid "VM16: Unknown page type!" +msgstr "VM16: Tipo de página desconhecida!" + +msgid "VM32: Unknown page type!" +msgstr "VM32: Tipo de página desconhecida!" + +msgid "Wiimote" +msgstr "Wii Remote" + +msgid "Wiimote Orientation" +msgstr "Orientação do Wii Remote" + +msgid "Yes" +msgstr "Sim" + +msgid "Zapper" +msgstr "Zapper" + +msgid "Zapper Crosshair" +msgstr "Mira do Zapper" + +msgid "Catalan" +msgstr "Catalão" + +msgid "The current IOS has been altered (fake-signed). Functionality and/or stability may be adversely affected." +msgstr "O IOS actual foi alterado (fake-signed). A funcionalidade e/ou estabilidade podem ser adversamente afectadas." + +msgid "The current IOS is unsupported. Functionality and/or stability may be adversely affected." +msgstr "O IOS actual não é suportado. A funcionalidade e/ou estabilidade podem ser adversamente afectadas." + +msgid "Turkish" +msgstr "Turco" diff --git a/plugins/snes9x_gx/source/lang/pt_br.lang b/plugins/snes9x_gx/source/lang/pt_br.lang new file mode 100644 index 00000000..c81ba64e --- /dev/null +++ b/plugins/snes9x_gx/source/lang/pt_br.lang @@ -0,0 +1,857 @@ +msgid "&" +msgstr "&" + +msgid "16:9 Correction" +msgstr "Correção 16:9" + +msgid "7z decompression failed: Archive contains too many files" +msgstr "Decompressão 7z falhou: o arquivo contém arquivos demais" + +msgid "7z decompression failed: Failed to read file data" +msgstr "Decompressão 7z falhou: erro na leitura do arquivo" + +msgid "7z decompression failed: File is corrupt" +msgstr "Decompressão 7z falhou: arquivo corrompido" + +msgid "7z decompression failed: File is corrupt (CRC mismatch)" +msgstr "Decompressão 7z falhou: arquivo corrompido (erro de CRC)" + +msgid "7z decompression failed: File uses too high of compression settings (dictionary size is too large)" +msgstr "Decompressão 7z falhou: O arquivo usa parâmetros de compressão muito altos (o tamanho de dicionário é muito grande)" + +msgid "7z decompression failed: File uses unsupported compression settings" +msgstr "Decompressão 7z falhou: O arquivo usa parâmetros não-suportados" + +msgid "A (Rapid)" +msgstr "A (Rápido)" + +msgid "Additional coding" +msgstr "Programação adicional" + +msgid "Aim Offscreen" +msgstr "Mirar fora da tela" + +msgid "An update is available!" +msgstr "Atualização disponível!" + +msgid "Are you sure that you want to reset this game? Any unsaved progress will be lost." +msgstr "Quer mesmo resetar este jogo? Qualquer progresso não-salvo será perdido." + +msgid "Are you sure that you want to reset your mappings?" +msgstr "Quer mesmo resetar os controles?" + +msgid "Are you sure that you want to reset your settings?" +msgstr "Quer mesmo resetar as configurações?" + +msgid "Maintain Aspect Ratio" +msgstr "Manter Proporções" + +msgid "Attempting to determine load device..." +msgstr "Determinando dispositivo de carregamento..." + +msgid "Attempting to determine save device..." +msgstr "Determinando dispositivo de saves..." + +msgid "Auto" +msgstr "Auto" + +msgid "Auto Detect" +msgstr "Auto Detectar" + +msgid "Auto Load" +msgstr "Auto Carregar" + +msgid "Auto Save" +msgstr "Auto Salvar" + +msgid "Automatic (Recommended)" +msgstr "Automático (Recomendado)" + +msgid "B (Rapid)" +msgstr "B (Rápido)" + +msgid "Back" +msgstr "Voltar" + +msgid "Both" +msgstr "Ambos" + +msgid "Controles" +msgstr "Controles" + +msgid "Button Mappings" +msgstr "Redefinir Botões" + +msgid "Cancel" +msgstr "Cancelar" + +msgid "Caps" +msgstr "Maiusc." + +msgid "Cheats" +msgstr "Cheats" + +msgid "Cheats file not found!" +msgstr "Arquivo de Cheats não encontrado!" + +msgid "Cheats Folder" +msgstr "Pasta de Cheats" + +msgid "Choose Game" +msgstr "Escolher Jogo" + +msgid "Classic Controller" +msgstr "Controle Clássico" + +msgid "Close" +msgstr "Fechar" + +msgid "Coding" +msgstr "Programação" + +msgid "Coding & menu design" +msgstr "Programação & desing do menu" + +msgid "Compressed GBA files are not supported!" +msgstr "Arquivos comprimidos do GBA não são suportados!" + +msgid "Connecting to network share..." +msgstr "Conectando ao compartilhamento de rede..." + +msgid "Controller" +msgstr "Controle" + +msgid "Cover View" +msgstr "Visualização de Capas" + +msgid "Covers Folder" +msgstr "Pasta de Capas" + +msgid "Credits" +msgstr "Créditos" + +msgid "Cropping" +msgstr "Recorte" + +msgid "Crosshair" +msgstr "Alvo" + +msgid "Cursor" +msgstr "Cursor" + +msgid "Data DVD" +msgstr "DVD de Dados" + +msgid "Default" +msgstr "Padrão" + +msgid "Directory name is too long!" +msgstr "O nome de diretório é muito grande!" + +msgid "Disabled" +msgstr "Desativado" + +msgid "DISABLED" +msgstr "DESATIVADO" + +msgid "distributed, or modified under the terms of the" +msgstr "distribuído, ou modificado sob os termos de" + +msgid "Don't Save" +msgstr "Não Salvar" + +msgid "Down" +msgstr "Abaixo" + +msgid "DOWN" +msgstr "ABAIXO" + +msgid "Downloading..." +msgstr "Baixando..." + +msgid "Dutch" +msgstr "Holandês" + +msgid "Empty or invalid ZIP file!" +msgstr "Arquivo ZIP vazio ou inválido" + +msgid "Enabled" +msgstr "Ativado" + +msgid "ENABLED" +msgstr "ATIVADO" + +msgid "English" +msgstr "Inglês" + +msgid "Erro" +msgstr "Erro" + +msgid "Error - Invalid ZIP file!" +msgstr "Erro - Arquivo ZIP inválido!" + +msgid "Error creating file!" +msgstr "Erro ao criar o arquivo!" + +msgid "Error loading game!" +msgstr "Erro ao carregar o jogo!" + +msgid "Error opening archive!" +msgstr "Erro ao abrir o arquivo!" + +msgid "Error opening directory!" +msgstr "Erro ao abrir o diretório!" + +msgid "Error opening file!" +msgstr "Erro ao abrir o arquivo!" + +msgid "Error reading file!" +msgstr "Erro ao ler o arquivo!" + +msgid "Error saving file!" +msgstr "Erro ao salvar o arquivo!" + +msgid "Exit" +msgstr "Sair" + +msgid "Exit Action" +msgstr "Ação de Saída" + +msgid "Failed to connect to network share." +msgstr "Falha ao conectar-se ao compartilhamento de rede." + +msgid "FDS BIOS file is invalid!" +msgstr "Arquivo de BIOS do FDS (Famicom Disk System) inválido!" + +msgid "FDS BIOS file not found!" +msgstr "Arquivo de BIOS de FDS (Famicom Disk System) não encontrado!" + +msgid "Filtered" +msgstr "Filtrado" + +msgid "Filtering" +msgstr "Filtragem" + +msgid "Fire" +msgstr "Fogo" + +msgid "French" +msgstr "Francês" + +msgid "GBA Screen Zoom" +msgstr "Zoom da tela do GBA" + +msgid "Game Genie ROM not found!" +msgstr "Não foi encontrada a ROM do Game Genie!" + +msgid "Game Settings" +msgstr "Configuração" + +msgid "Game Settings - Button Mappings" +msgstr "Configuração - Redefinir Botões" + +msgid "Game Settings - Cheats" +msgstr "Configuração - Cheats" + +msgid "Game Settings - Video" +msgstr "Configuração - Vídeo" + +msgid "Game Timing" +msgstr "Timing de jogo" + +msgid "Game Genie DISABLED" +msgstr "Game Genie DESATIVADO" + +msgid "Game Genie ENABLED" +msgstr "Game Genie ATIVADO" + +msgid "GameCube Controller" +msgstr "Controle de GameCube" + +msgid "German" +msgstr "Alemão" + +msgid "GNU General Public License (GPL) Version 2." +msgstr "GNU General Public License (GPL) Versão 2." + +msgid "Go Back" +msgstr "Voltar" + +msgid "Horizontal" +msgstr "Horizontal" + +msgid "Information" +msgstr "Informação" + +msgid "Initializing network..." +msgstr "Inicializando rede..." + +msgid "Insert Coin" +msgstr "Inserir Moeda" + +msgid "Insert Coin / Switch Disk" +msgstr "Inserir Moeda / Trocar Disco" + +msgid "Invalid file size!" +msgstr "Tamanho de arquivo inválido!" + +msgid "Invalid game file!" +msgstr "Arquivo de jogo inválido!" + +msgid "Invalid network settings - Check settings.xml." +msgstr "Configuração de rede inválida - Verifique o arquivo settings.xml." + +msgid "Invalid network settings - Share IP is blank." +msgstr "Configuração de rede inválida - IP em branco." + +msgid "Invalid network settings - Share name is blank." +msgstr "Configuração de rede inválida - Nome em branco." + +msgid "Invalid save file" +msgstr "Arquivo de save inválido" + +msgid "Invalid state file" +msgstr "Arquivo de state inválido" + +msgid "Italian" +msgstr "Italiano" + +msgid "Japanese" +msgstr "Japonês" + +msgid "Justifier" +msgstr "Konami Justifier" + +msgid "Justifier - GameCube Controller" +msgstr "Konami Justifier - Controle de GameCube" + +msgid "Justifier - Wiimote" +msgstr "Konami Justifier - Wiimote" + +msgid "Korean" +msgstr "Coreano" + +msgid "L TRIG" +msgstr "L" + +msgid "Language" +msgstr "Idioma" + +msgid "Languages Folder" +msgstr "Pasta de Idiomas" + +msgid "Left" +msgstr "Esquerda" + +msgid "LEFT" +msgstr "ESQUERDA" + +msgid "Left Button" +msgstr "Botão Esquerdo" + +msgid "Load" +msgstr "Carregar" + +msgid "Load Device" +msgstr "Dispositivo de Carregamento" + +msgid "Load Folder" +msgstr "Pasta dos Jogos" + +msgid "Load Game" +msgstr "Carregar Jogo" + +msgid "Loading" +msgstr "Carregando" + +msgid "Loading DVD..." +msgstr "Carregando DVD..." + +msgid "Loading patch..." +msgstr "Carregando patch..." + +msgid "Loading..." +msgstr "Carregando..." + +msgid "Main Menu" +msgstr "Menu Principal" + +msgid "Match GC Controls" +msgstr "Coincidir Controles do GC" + +msgid "Match Wii Controls" +msgstr "Coincidir Controles do Wii" + +msgid "Maximum filepath length reached!" +msgid "Tamanho máximo de caminho de arquivo alcançado!" + +msgid "Menu" +msgstr "Menu" + +msgid "Menu artwork" +msgstr "Desenho do Menu" + +msgid "Menu sound" +msgstr "Som do Menu" + +msgid "MINUS" +msgstr "MENOS" + +msgid "Music Volume" +msgstr "Volume da Música" + +msgid "Mute" +msgstr "Silenciar" + +msgid "NES Controller" +msgstr "Controle de NES" + +msgid "NES Controllers (2)" +msgstr "Controles de NES (2)" + +msgid "NES Controllers (4)" +msgstr "Controles de NES (4)" + +msgid "NES Zapper" +msgstr "Nintendo Zapper" + +msgid "Network" +msgstr "Rede" + +msgid "Network Share" +msgstr "Compartilhamento de Rede" + +msgid "New" +msgstr "Novo" + +msgid "New Snapshot" +msgstr "Novo State" + +msgid "New SRAM" +msgstr "Nova SRAM" + +msgid "No" +msgstr "Não" + + +msgid "No data to save!" +msgstr "Nenhum dado a salvar!" + +msgid "No disc inserted!" +msgstr "Nenhum disco inserido!" + +msgid "No SRAM data to save!" +msgstr "Nenhum dado de SRAM a salvar!" + + +msgid "No game saves found." +msgstr "Nenhum save foi encontrado." + +msgid "None" + +msgstr "Nenhum" + +msgid "NTSC (480i)" +msgstr "NTSC (480i)" + +msgid "Nunchuk" +msgstr "Nunchuk" + +msgid "Off" +msgstr "Off" + +msgid "Official Site: http://code.google.com/p/fceugc/" +msgstr "Site Oficial: http://code.google.com/p/fceugc/" + +msgid "Official Site: http://code.google.com/p/snes9x-gx/" +msgstr "Site Oficial: http://code.google.com/p/snes9x-gx/" + +msgid "Official Site: http://code.google.com/p/vba-wii/" +msgstr "Site Oficial: http://code.google.com/p/vba-wii/" + +msgid "OK" +msgstr "OK" + +msgid "On" +msgstr "On" + +msgid "Original" +msgstr "Original" + +msgid "Out of memory!" +msgstr "Memória insuficiente!" + +msgid "Out of memory: too many files!" +msgstr "Memória insuficiente: arquivos demais!" + +msgid "P1" +msgstr "P1" + +msgid "P2" +msgstr "P2" + +msgid "P3" +msgstr "P3" + +msgid "P4" +msgstr "P4" + +msgid "PAL (50Hz)" +msgstr "PAL (50Hz)" + +msgid "PAL (60Hz)" +msgstr "PAL (60Hz)" + +msgid "Palette saved" +msgstr "Paleta salva" + +msgid "Partial Stretch" +msgstr "Esticamento Parcial" + +msgid "Pause" +msgstr "Pausa" + +msgid "Please Wait" +msgstr "Espere por favor" + +msgid "PLUS" +msgstr "MAIS" + +msgid "Portuguese" +msgstr "Português" + +msgid "Power off Wii" +msgstr "Desligar Wii" + +msgid "Preferences saved" +msgstr "Preferências salvas" + +msgid "Press any button on the Classic Controller now. Press Home to clear the existing mapping." +msgstr "Pressione um botão no Controle Clássico. Pressione HOME para eliminar a configuração atual." + +msgid "Press any button on the GameCube Controller now. Press Home or the C-Stick in any direction to clear the existing mapping." +msgstr "Pressione um botão no Controle de GameCube. Pressione HOME ou mova o Stick-C para eliminar a configuração atual." + +msgid "Press any button on the GameCube Controller now. Press the C-Stick in any direction to clear the existing mapping." +msgstr "Pressione um botão no Controle de GameCube. Mova o Stick-C para eliminar a configuração atual." + +msgid "Press any button on the Wiimote now. Press Home to clear the existing mapping." +msgstr "Pressione um botão no Wiimote. Pressione HOME para eliminar a configuração atual." + +msgid "Press any button on the Wiimote or Nunchuk now. Press Home to clear the existing mapping." +msgstr "Pressione um botão no Wiimote ou no Nunchuk. Pressione HOME para eliminar a configuração atual." + +msgid "Progressive (480p)" +msgstr "Progressive (480p)" + +msgid "Quit Game" +msgstr "Sair do Jogo" + +msgid "Quit this game? Any unsaved progress will be lost." +msgstr "Sair do Jogo? Qualquer progresso não-salvo será perdido." + +msgid "R TRIG" +msgstr "R" + +msgid "RAM saving is not available for FDS games!" +msgstr "Salvamento de RAM não está disponível para jogos do FDS (Famicom Disk System)!" + +msgid "Reboot" +msgstr "Reiniciar" + +msgid "Rendering" +msgstr "Renderização" + +msgid "Reset" +msgstr "Resetar" + +msgid "Reset Game" +msgstr "Resetar Jogo" + +msgid "Reset this game? Any unsaved progress will be lost." +msgstr "Resetar Jogo? Qualquer progresso não-salvo será perdido." + +msgid "Reset Mappings" +msgstr "Resetar Configuração" + +msgid "Reset Settings" +msgstr "Resetar" + +msgid "Retry" +msgstr "Tentar de novo" + +msgid "Return to Loader" +msgstr "Voltar ao Loader" + +msgid "Return to Wii Menu" +msgstr "Voltar ao Wii Menu" + +msgid "Right" +msgstr "Direita" + +msgid "RIGHT" +msgstr "Direita" + +msgid "Right Button" +msgstr "Botão direito" + +msgid "Rumble" +msgstr "Vibração" + +msgid "Save" +msgstr "Salvar" + +msgid "Save Device" +msgstr "Dispositivo de save" + +msgid "Save failed!" +msgstr "Falha ao salvar!" + +msgid "Save file not found" +msgstr "Arquivo de save não encontrado" + +msgid "Save Folder" +msgstr "Pasta de Saves" + +msgid "Save Game" +msgstr "Salvar Jogo" + +msgid "Save RAM and State?" +msgstr "Salvar a RAM e o State?" + +msgid "Save Snapshot?" +msgstr "Salvar State?" + +msgid "Save SRAM and Snapshot?" +msgstr "Salvar SRAM e State?" + +msgid "Save State?" +msgstr "Salvar State?" + +msgid "Save successful" +msgstr "Salvo com sucesso" + +msgid "Saving" +msgstr "Salvando" + +msgid "Saving preferences..." +msgstr "Salvando preferências..." + +msgid "Saving..." +msgstr "Salvando..." + +msgid "Scaling" +msgstr "Ajuste de Tela" + +msgid "Screen Position" +msgstr "Posição da Tela" + +msgid "Screen Zoom" +msgstr "Zoom da Tela" + +msgid "Select" +msgstr "Select" + +msgid "Seek error!" +msgstr "Erro de posicionamento!" + +msgid "Settings" +msgstr "Configuração" + +msgid "Settings - Menu" +msgstr "Configuração - Menu" + +msgid "Settings - Network" +msgstr "Configuração - Rede" + +msgid "Settings - Saving & Loading" +msgstr "Configuração - Salvar & Carregar" + +msgid "SD Card" +msgstr "Cartão SD" + +msgid "SD card not found!" +msgstr "Cartão SD não encontrado!" + +msgid "Shift" +msgstr "Maius." + +msgid "Simp_chinese" +msgstr "Chines Simp." + +msgid "SMB Share IP" +msgstr "IP do SMB" + +msgid "SMB Share Name" +msgstr "Nome do SMB" + +msgid "SMB Share Password" +msgstr "Senha do SMB" + +msgid "SMB Share Username" +msgstr "Nome de Usuário do SMB" + +msgid "Snapshot" +msgstr "State" + +msgid "Snapshot (Auto)" +msgstr "State (Auto)" + +msgid "SNES Controller" +msgstr "Controle SNES" + +msgid "SNES Controllers (2)" +msgstr "Controle SNES (2)" + +msgid "SNES Controllers (4)" +msgstr "Controle SNES (4)" + +msgid "SNES Controller - Classic Controller" +msgstr "Controle SNES - Controle Clássico" + +msgid "SNES Controller - GameCube Controller" +msgstr "Controle SNES - Controle de GameCube" + +msgid "SNES Controller - Nunchuk + Wiimote" +msgstr "Controle SNES - Nunchuk + Wiimote" + +msgid "SNES Controller - Wiimote" +msgstr "Controle SNES - Wiimote" + +msgid "SNES Mouse" +msgstr "Mouse SNES" + +msgid "SNES Mouse - GameCube Controller" +msgstr "Mouse SNES - Controle de GameCube" + +msgid "SNES Mouse - Wiimote" +msgstr "Mouse SNES - Wiimote" + +msgid "Snes9x - Copyright (c) Snes9x Team 1996 - 2006" +msgstr "Snes9x - Copyright (c) Snes9x Team 1996 - 2006" + +msgid "Sound Effects Volume" +msgstr "Volume dos Efeitos Sonoros" + +msgid "Spanish" +msgstr "Espanhol" + +msgid "Sprite Limit" +msgstr "Limite de Sprites" + +msgid "SRAM file not found" +msgstr "Arquivo de SRAM não encontrado" + +msgid "State" +msgstr "Salvar state" + +msgid "State (Auto)" +msgstr "State (Auto)" + +msgid "State file not found" +msgstr "Arquivo de State não encontrado" + +msgid "Stretch to Fit" +msgstr "Esticar para Caber" + +msgid "Superscope" +msgstr "Super Scope" + +msgid "Superscope - GameCube Controller" +msgstr "Super Scope - Controle de GameCube" + +msgid "Superscope - Wiimote" +msgstr "Super Scope - Wiimote" + +msgid "This software is open source and may be copied," +msgstr "Este software é de código aberto e pode ser copiado," + +msgid "Trad_chinese" +msgstr "Chinês Trad." + +msgid "Unable to initialize network!" +msgstr "Não foi possível inicializar a rede!" + +msgid "Unable to locate a load device!" +msgstr "Dispositivo de carregamento não encontrado!" + +msgid "Unable to locate a save device!" +msgstr "Dispositivo de saves não encontrado!" + +msgid "Unable to open snapshot!" +msgstr "Não foi possível carregar o state!" + +msgid "Unfiltered" +msgstr "Sem filtro" + +msgid "Unknown file type!" +msgstr "Tipo de arquivo desconhecido!" + +msgid "Unrecognized DVD format." +msgstr "Formato de DVD desconhecido." + +msgid "Unrecognized file extension!" +msgstr "Extensão de arquivo desconhecida!" + +msgid "Up" +msgstr "Acima" + +msgid "UP" +msgstr "Acima" + +msgid "Up One Level" +msgstr "Um Nível Acima" + +msgid "Update Available" +msgstr "Atualização Disponível" + +msgid "Update failed!" +msgstr "Atualização falhou!" + +msgid "Update later" +msgstr "Atualizar depois" + +msgid "Update now" +msgstr "Atualizar agora" + +msgid "Update successful!" +msgstr "Atualização concluída!" + +msgid "USB drive not found!" +msgstr "Drive USB não encontrado!" + +msgid "USB Mass Storage" +msgstr "Dispositivo USB Flash" + +msgid "Vertical" +msgstr "Vertical" + +msgid "Video" +msgstr "Vídeo" + +msgid "Video Mode" +msgstr "Modo de Vídeo" + +msgid "VM8: Unknown page type!" +msgstr "VM8: Tipo de página desconhecida!" + +msgid "VM16: Unknown page type!" +msgstr "VM16: Tipo de página desconhecida!" + +msgid "VM32: Unknown page type!" +msgstr "VM32: Tipo de página desconhecida!" + +msgid "Wiimote" +msgstr "Wiimote" + +msgid "Wiimote Orientation" +msgstr "Orientação do Wiimote" + +msgid "Yes" +msgstr "Sim" + +msgid "Zapper" +msgstr "Nintendo Zapper" + +msgid "Zapper Crosshair" +msgstr "Alvo do Zapper" diff --git a/plugins/snes9x_gx/source/lang/tr.lang b/plugins/snes9x_gx/source/lang/tr.lang new file mode 100644 index 00000000..e2e5adcb --- /dev/null +++ b/plugins/snes9x_gx/source/lang/tr.lang @@ -0,0 +1,935 @@ +msgid "&" +msgstr "&" + +msgid "16:9 Correction" +msgstr "16:9 Düzeltmesi" + +msgid "7z decompression failed: Archive contains too many files" +msgstr "7z dosya çıkarma baÅŸarısız: ArÅŸiv çok fazla dosya içeriyor" + +msgid "7z decompression failed: Failed to read file data" +msgstr "7z dosya çıkarma baÅŸarısız: Dosya verisi okunamadı" + +msgid "7z decompression failed: File is corrupt" +msgstr "7z dosya çıkarma baÅŸarısız: Dosya bozuk" + +msgid "7z decompression failed: File is corrupt (CRC mismatch)" +msgstr "7z dosya çıkarma baÅŸarısız: Dosya bozuk (CRC uyumsuz)" + +msgid "7z decompression failed: File uses too high of compression settings (dictionary size is too large)" +msgstr "7z dosya çıkarma baÅŸarısız: Dosya çok yüksek sıkıştırma ayarları kullanıyor (sözlük boyutu çok büyük)" + +msgid "7z decompression failed: File uses unsupported compression settings" +msgstr "7z dosya çıkarma baÅŸarısız: Dosya desteklenmeyen sıkıştırma ayarları kullanıyor" + +msgid "A (Rapid)" +msgstr "A (Seri)" + +msgid "Additional coding" +msgstr "Ä°lave kod" + +msgid "Aim Offscreen" +msgstr "Ekran Dışına Hedefleme" + +msgid "An update is available!" +msgstr "Güncelleme mevcut!" + +msgid "Are you sure that you want to reset this game? Any unsaved progress will be lost." +msgstr "Oyunu tekrar baÅŸlatmak istediÄŸinizden emin misiniz? KaydedilmemiÅŸ tüm veriler kaybolacak." + +msgid "Are you sure that you want to reset your mappings?" +msgstr "Buton ayarlarını sıfırlamak istediÄŸinizden emin misiniz?" + +msgid "Are you sure that you want to reset your settings?" +msgstr "Ayarları sıfırlamak istediÄŸinizden emin misiniz?" + +msgid "Maintain Aspect Ratio" +msgstr "En-Boy Oranını Koru" + +msgid "Attempting to determine load device..." +msgstr "Yükleme aygıtı belirlenmeye çalışılıyor..." + +msgid "Attempting to determine save device..." +msgstr "Kayıt aygıtı belirlenmeye çalışılıyor..." + +msgid "Auto" +msgstr "Otomatik" + +msgid "Auto Detect" +msgstr "Otomatik Algıla" + +msgid "Auto Load" +msgstr "Otomatik Yükleme" + +msgid "Auto Save" +msgstr "Otomatik Kayıt" + +msgid "Automatic" +msgstr "Otomatik" + +msgid "Automatic (Recommended)" +msgstr "Otomatik (Önerilen)" + +msgid "B (Rapid)" +msgstr "B (Seri)" + +msgid "Back" +msgstr "Sil" + +msgid "Both" +msgstr "Her Ä°kisi" + +msgid "Controles" +msgstr "Oyun Kumandaları" + +msgid "Button Mapping" +msgstr "Buton Ayarı" + +msgid "Button Mappings" +msgstr "Buton Ayarları" + +msgid "Cancel" +msgstr "Ä°ptal" + +msgid "Caps" +msgstr "Caps" + +msgid "Cheats" +msgstr "Hile" + +msgid "Cheats file not found!" +msgstr "Hile dosyası bulunamadı!" + +msgid "Cheats Folder" +msgstr "Hile Dizini" + +msgid "Choose Game" +msgstr "Oyun Seç" + +msgid "Classic Controller" +msgstr "Klasik Oyun Kumandası" + +msgid "Close" +msgstr "Kapat" + +msgid "Coding" +msgstr "Kod" + +msgid "Coding & menu design" +msgstr "Kod & Menü Tasarımı" + +msgid "Compressed GBA files are not supported!" +msgstr "Sıkıştırılmış GBA dosyaları desteklenmiyor!" + +msgid "Connecting to network share..." +msgstr "AÄŸ paylaşımına baÄŸlanıyor..." + +msgid "Controller" +msgstr "Oyun Kumandası" + +msgid "Cover View" +msgstr "Kapak" + +msgid "Covers Folder" +msgstr "Kapak Dizini" + +msgid "Credits" +msgstr "Hakkında" + +msgid "Cropping" +msgstr "Kırpma" + +msgid "Crosshair" +msgstr "Artı Ä°mleci" + +msgid "Cursor" +msgstr "Ä°mleç" + +msgid "Data DVD" +msgstr "Veri DVD'si" + +msgid "Default" +msgstr "Varsayılan" + +msgid "Directory name is too long!" +msgstr "Dizin adı çok uzun!" + +msgid "Disabled" +msgstr "Kapalı" + +msgid "DISABLED" +msgstr "KAPALI" + +msgid "distributed, or modified under the terms of the" +msgstr "GNU Genel Kamu Lisansı (GPL) Sürüm 2'nin koÅŸulları altında" + +msgid "Don't Save" +msgstr "Kaydetme" + +msgid "Down" +msgstr "AÅŸağı" + +msgid "DOWN" +msgstr "AÅžAÄžI" + +msgid "Downloading..." +msgstr "Ä°ndiriliyor..." + +msgid "Dutch" +msgstr "Flemenkçe" + +msgid "Empty or invalid ZIP file!" +msgstr "BoÅŸ veya geçersiz ZIP dosyası!" + +msgid "Enabled" +msgstr "Açık" + +msgid "ENABLED" +msgstr "AÇIK" + +msgid "English" +msgstr "Ä°ngilizce" + +msgid "Error" +msgstr "Hata" + +msgid "Error - Invalid ZIP file!" +msgstr "Hata - Geçersiz ZIP dosyası!" + +msgid "Error creating file!" +msgstr "Dosya oluÅŸturulamadı!" + +msgid "Error loading game!" +msgstr "Oyun yüklenemedi!" + +msgid "Error opening archive!" +msgstr "ArÅŸiv açılamadı!" + +msgid "Error opening directory!" +msgstr "Dizin açılamadı!" + +msgid "Error opening file!" +msgstr "Dosya açılamadı!" + +msgid "Error reading file!" +msgstr "Dosya okunamadı!" + +msgid "Error saving file!" +msgstr "Dosya kaydedilemedi!" + +msgid "Exit" +msgstr "Çıkış" + +msgid "Exit Action" +msgstr "Çıkış Eylemi" + +msgid "Failed to connect to network share." +msgstr "AÄŸ paylaşımına baÄŸlanılamadı." + +msgid "FDS BIOS file is invalid!" +msgstr "Geçersiz FDS BIOS dosyası!" + +msgid "FDS BIOS file not found!" +msgstr "FDS BIOS dosyası bulunamadı!" + +msgid "Filtered" +msgstr "Filtre Var" + +msgid "Filtering" +msgstr "Filtreleme" + +msgid "Fire" +msgstr "AteÅŸ" + +msgid "French" +msgstr "Fransızca" + +msgid "GBA Screen Zoom" +msgstr "GBA Ekran YakınlaÅŸtırması" + +msgid "Game Genie ROM not found!" +msgstr "Game Genie ROM'u bulunamadı!" + +msgid "Game Settings" +msgstr "Oyun Ayarları" + +msgid "Game Settings - Button Mappings" +msgstr "Oyun Ayarları - Buton Ayarları" + +msgid "Game Settings - Cheats" +msgstr "Oyun Ayarları - Hileler" + +msgid "Game Settings - Video" +msgstr "Oyun Ayarları - Ekran" + +msgid "Game Timing" +msgstr "Oyun Zamanlaması" + +msgid "Game Genie DISABLED" +msgstr "Game Genie KAPALI" + +msgid "Game Genie ENABLED" +msgstr "Game Genie AÇIK" + +msgid "GameCube Controller" +msgstr "GameCube Oyun Kumandası" + +msgid "German" +msgstr "Almanca" + +msgid "GNU General Public License (GPL) Version 2." +msgstr "kopyalanabilir, dağıtılabilir ve deÄŸiÅŸtirilebilir." + +msgid "Go Back" +msgstr "Geri Dön" + +msgid "Horizontal" +msgstr "Yatay" + +msgid "Information" +msgstr "Bilgi" + +msgid "Initializing network..." +msgstr "AÄŸ baÄŸlantısı baÅŸlatılıyor..." + +msgid "Insert Coin" +msgstr "Jeton Atın" + +msgid "Insert Coin / Switch Disk" +msgstr "Jeton Atın / Diski DeÄŸiÅŸtirin" + +msgid "Invalid file size!" +msgstr "Geçersiz dosya boyutu!" + +msgid "Invalid game file!" +msgstr "Geçersiz oyun dosyası!" + +msgid "Invalid network settings - Check settings.xml." +msgstr "Geçersiz aÄŸ baÄŸlantısı ayarları - settings.xml dosyasını kontrol ediniz." + +msgid "Invalid network settings - Share IP is blank." +msgstr "Geçersiz aÄŸ baÄŸlantısı ayarları - IP paylaşımı boÅŸ." + +msgid "Invalid network settings - Share name is blank." +msgstr "Geçersiz aÄŸ baÄŸlantısı ayarları - Paylaşım adı boÅŸ." + +msgid "Invalid save file" +msgstr "Geçersiz kayıt dosyası" + +msgid "Invalid state file" +msgstr "Geçersiz durum dosyası" + +msgid "Italian" +msgstr "Ä°talyanca" + +msgid "Japanese" +msgstr "Japonca" + +msgid "Justifier" +msgstr "Justifier Tabanca" + +msgid "Justifier - GameCube Controller" +msgstr "Justifier Tabanca - GameCube Oyun Kumandası" + +msgid "Justifier - Wiimote" +msgstr "Justifier Tabanca - Wii Kumanda" + +msgid "Korean" +msgstr "Korece" + +msgid "L TRIG" +msgstr "L Mandalı" + +msgid "Language" +msgstr "Dil" + +msgid "Languages Folder" +msgstr "Dil Dizini" + +msgid "Left" +msgstr "Sol" + +msgid "LEFT" +msgstr "SOL" + +msgid "Left Button" +msgstr "Sol Buton" + +msgid "Load" +msgstr "Yükle" + +msgid "Load Device" +msgstr "Yükleme Aygıtı" + +msgid "Load Folder" +msgstr "Yükleme Dizini" + +msgid "Load Game" +msgstr "Oyun Yükle" + +msgid "Loading" +msgstr "Yükleme" + +msgid "Loading DVD..." +msgstr "DVD yükleniyor..." + +msgid "Loading patch..." +msgstr "Yama dosyası yükleniyor..." + +msgid "Loading..." +msgstr "Yükleniyor..." + +msgid "Main Menu" +msgstr "Ana Menü" + +msgid "Match GC Controls" +msgstr "GC Kumandalarına EÅŸleÅŸtir" + +msgid "Match Wii Controls" +msgstr "Wii Kumandalarına EÅŸleÅŸtir" + +msgid "Maximum filepath length reached!" +msgid "Maksimum dizin yolu uzunluÄŸuna ulaşıldı!" + +msgid "Menu" +msgstr "Menü" + +msgid "Menu artwork" +msgstr "Menü Görselleri" + +msgid "Menu sound" +msgstr "Menü Sesleri" + +msgid "MINUS" +msgstr "EKSÄ°" + +msgid "Music Volume" +msgstr "Müzik Sesleri" + +msgid "Mute" +msgstr "Sessiz" + +msgid "NES Controller" +msgstr "NES Oyun Kumandası" + +msgid "NES Controllers (2)" +msgstr "NES Oyun Kumandası (2)" + +msgid "NES Controllers (4)" +msgstr "NES Oyun Kumandası (4)" + +msgid "NES Zapper" +msgstr "NES Zapper Tabanca" + +msgid "Network" +msgstr "AÄŸ" + +msgid "Network Share" +msgstr "AÄŸ Paylaşımı" + +msgid "New" +msgstr "Yeni" + +msgid "New Snapshot" +msgstr "Yeni Enstantane" + +msgid "New SRAM" +msgstr "Yeni SRAM" + +msgid "No" +msgstr "Hayır" + +msgid "No data to save!" +msgstr "Kaydedilecek veri yok!" + +msgid "No disc inserted!" +msgstr "Disk takılmamış!" + +msgid "No SRAM data to save!" +msgstr "Kaydedilecek SRAM verisi yok!" + +msgid "No game saves found." +msgstr "Hiç bir oyun kaydı bulunamadı." + +msgid "None" +msgstr "Yok" + +msgid "NTSC (480i)" +msgstr "NTSC (480i)" + +msgid "Nunchuk" +msgstr "Nunchuk" + +msgid "Off" +msgstr "Kapalı" + +msgid "Official Site: http://code.google.com/p/fceugc/" +msgstr "Resmi Site: http://code.google.com/p/fceugc/" + +msgid "Official Site: http://code.google.com/p/snes9x-gx/" +msgstr "Resmi Site: http://code.google.com/p/snes9x-gx/" + +msgid "Official Site: http://code.google.com/p/vba-wii/" +msgstr "Resmi Site: http://code.google.com/p/vba-wii/" + +msgid "OK" +msgstr "Tamam" + +msgid "On" +msgstr "Açık" + +msgid "Original" +msgstr "Orijinal" + +msgid "Out of memory!" +msgstr "Bellek yetersiz!" + +msgid "Out of memory: too many files!" +msgstr "Bellek yetersiz: çok fazla dosya!" + +msgid "P1" +msgstr "P1" + +msgid "P2" +msgstr "P2" + +msgid "P3" +msgstr "P3" + +msgid "P4" +msgstr "P4" + +msgid "PAL (50Hz)" +msgstr "PAL (50Hz)" + +msgid "PAL (60Hz)" +msgstr "PAL (60Hz)" + +msgid "Palette saved" +msgstr "Renk paleti kaydedildi" + +msgid "Partial Stretch" +msgstr "Kısmı Uzatma" + +msgid "Pause" +msgstr "Duraklatma" + +msgid "Please Wait" +msgstr "Lütfen Bekleyiniz" + +msgid "PLUS" +msgstr "ARTI" + +msgid "Portuguese" +msgstr "Portekizce" + +msgid "Brazilian Portuguese" +msgstr "Brezilya Portekizcesi" + +msgid "Power off Wii" +msgstr "Wii'yi kapat" + +msgid "Preferences saved" +msgstr "Ayarlar kaydedildi" + +msgid "Press any button on the Classic Controller now. Press Home to clear the existing mapping." +msgstr "Åžimdi Klasik Oyun Kumandasında herhangi bir butona basın. Mevcut buton ayarını sıfırlamak için Home butonuna basın." + +msgid "Press any button on the GameCube Controller now. Press Home or the C-Stick in any direction to clear the existing mapping." +msgstr "Åžimdi GameCube Oyun Kumandasında herhangi bir butona basın. Mevcut buton ayarını sıfırlamak için Home butonuna basın veya C-Stickini herhangi bir yöne itin." + +msgid "Press any button on the GameCube Controller now. Press the C-Stick in any direction to clear the existing mapping." +msgstr "Åžimdi GameCube Oyun Kumandasında herhangi bir butona basın. Mevcut buton ayarını sıfırlamak için C-Stickini herhangi bir yöne itin." + +msgid "Press any button on the Wiimote now. Press Home to clear the existing mapping." +msgstr "Åžimdi Wii Uzaktan Kumandasında herhangi bir butona basın. Mevcut buton ayarını sıfırlamak için Home butonuna basın." + +msgid "Press any button on the Wiimote or Nunchuk now. Press Home to clear the existing mapping." +msgstr "Åžimdi Wii Uzaktan Kumandasında veya Nunchuk'ta herhangi bir butona basın. Mevcut buton ayarını sıfırlamak için Home butonuna basın." + +msgid "Progressive (480p)" +msgstr "Progresif (480p)" + +msgid "Quit Game" +msgstr "Oyundan Çık" + +msgid "Quit this game? Any unsaved progress will be lost." +msgstr "Oyundan çıkılsın mı? KaydedilmemiÅŸ tüm veriler kaybolacak." + +msgid "R TRIG" +msgstr "R Mandalı" + +msgid "RAM saving is not available for FDS games!" +msgstr "RAM kaydetme FDS oyunları için mevcut deÄŸil!" + +msgid "Reboot" +msgstr "Yeniden BaÅŸlat" + +msgid "Rendering" +msgstr "Rendering" + +msgid "Reset" +msgstr "Tekrar BaÅŸlat" + +msgid "Reset Game" +msgstr "Oyunu Tekrar BaÅŸlat" + +msgid "Reset this game? Any unsaved progress will be lost." +msgstr "Oyun sıfırlansın mı? KaydedilmemiÅŸ tüm veriler kaybolacak." + +msgid "Reset Mappings" +msgstr "Buton Ayarlarını Sıfırla" + +msgid "Reset Settings" +msgstr "Ayarları Sıfırla" + +msgid "Retry" +msgstr "Yeniden dene" + +msgid "Return to Loader" +msgstr "Loader Ekranına Dön" + +msgid "Return to Wii Menu" +msgstr "Wii Menüsüne Dön" + +msgid "Right" +msgstr "SaÄŸ" + +msgid "RIGHT" +msgstr "SAÄž" + +msgid "Right Button" +msgstr "SaÄŸ Buton" + +msgid "Rumble" +msgstr "TitreÅŸim" + +msgid "Save" +msgstr "Kaydet" + +msgid "Save Device" +msgstr "Kayıt Aygıtı" + +msgid "Save failed!" +msgstr "Kaydetme baÅŸarısız!" + +msgid "Save file not found" +msgstr "Kayıt dosyası bulunamadı" + +msgid "Save Folder" +msgstr "Kayıt Dizini" + +msgid "Save Game" +msgstr "Oyunu Kaydet" + +msgid "Save RAM and State?" +msgstr "RAM ve Durum Kaydedilsin mi?" + +msgid "Save Snapshot?" +msgstr "Enstantane Kaydedilsin mi?" + +msgid "Save SRAM and Snapshot?" +msgstr "SRAM ve Enstantane Kaydedilsin mi?" + +msgid "Save State?" +msgstr "Durum kaydedilsin mi?" + +msgid "Save successful" +msgstr "Kayıt baÅŸarılı" + +msgid "Saving" +msgstr "Kayıt" + +msgid "Saving preferences..." +msgstr "Ayarlar kaydediliyor..." + +msgid "Saving..." +msgstr "Kaydediliyor..." + +msgid "Scaling" +msgstr "Ölçekleme" + +msgid "Screen Position" +msgstr "Ekran Konumu" + +msgid "Screen Zoom" +msgstr "Ekran YakınlaÅŸtırması" + +msgid "Select" +msgstr "Select" + +msgid "Seek error!" +msgstr "Tarama hatası!" + +msgid "Settings" +msgstr "Ayarlar" + +msgid "Settings - Menu" +msgstr "Ayarlar - Menü" + +msgid "Settings - Network" +msgstr "Ayarlar - AÄŸ" + +msgid "Settings - Saving & Loading" +msgstr "Ayarlar - Kayıt & Yükleme" + +msgid "SD Card" +msgstr "SD Kartı" + +msgid "SD card not found!" +msgstr "SD kartı bulunamadı!" + +msgid "Shift" +msgstr "Shift" + +msgid "Simp_chinese" +msgstr "BasitleÅŸtirilmiÅŸ Çince" + +msgid "SMB Share IP" +msgstr "SMB Paylaşım IP'si" + +msgid "SMB Share Name" +msgstr "SMB Paylaşım Adı" + +msgid "SMB Share Password" +msgstr "SMB Paylaşım Åžifresi" + +msgid "SMB Share Username" +msgstr "SMB Paylaşım Kullanıcı Adı" + +msgid "Snapshot" +msgstr "Enstantane" + +msgid "Snapshot (Auto)" +msgstr "Enstantane (Otomatik)" + +msgid "SNES Controller" +msgstr "SNES Oyun Kumandası" + +msgid "SNES Controllers (2)" +msgstr "SNES Oyun Kumandası (2)" + +msgid "SNES Controllers (4)" +msgstr "SNES Oyun Kumandası (4)" + +msgid "SNES Controller - Classic Controller" +msgstr "SNES Oyun Kumandası - Klasik Oyun Kumandası" + +msgid "SNES Controller - GameCube Controller" +msgstr "SNES Oyun Kumandası - GameCube Oyun Kumandası" + +msgid "SNES Controller - Nunchuk + Wiimote" +msgstr "SNES Oyun Kumandası - Nunchuck + Wii Kumanda" + +msgid "SNES Controller - Wiimote" +msgstr "SNES Oyun Kumandası - Wii Kumanda" + +msgid "SNES Mouse" +msgstr "SNES Faresi" + +msgid "SNES Mouse - GameCube Controller" +msgstr "SNES Faresi - GameCube Oyun Kumandası" + +msgid "SNES Mouse - Wiimote" +msgstr "SNES Faresi - Wii Kumanda" + +msgid "Snes9x - Copyright (c) Snes9x Team 1996 - 2006" +msgstr "Snes9x - Telif Hakkı (c) Snes9x Team 1996-2006" + +msgid "Sound Effects Volume" +msgstr "Efekt Sesleri" + +msgid "Spanish" +msgstr "Ä°spanyolca" + +msgid "Sprite Limit" +msgstr "Sprite Sınırı" + +msgid "SRAM file not found" +msgstr "SRAM dosyası bulunamadı" + +msgid "Start" +msgstr "Start" + +msgid "State" +msgstr "Durum" + +msgid "State (Auto)" +msgstr "Durum (Otomatik)" + +msgid "State file not found" +msgstr "Durum dosyası bulunamadı" + +msgid "Stretch to Fit" +msgstr "Uzat" + +msgid "Super Scope" +msgstr "Super Scope" + +msgid "Superscope" +msgstr "Superscope" + +msgid "Superscope - GameCube Controller" +msgstr "Superscope - GameCube Oyun Kumandası" + +msgid "Superscope - Wiimote" +msgstr "Superscope - Wii Kumanda" + +msgid "This software is open source and may be copied," +msgstr "Bu yazılım açık kaynak kodlu olup," + +msgid "Trad_chinese" +msgstr "Geleneksel Çince" + +msgid "Unable to initialize network!" +msgstr "AÄŸ baÅŸlatılamıyor!" + +msgid "Unable to locate a load device!" +msgstr "Yükleme aygıtı bulunamıyor!" + +msgid "Unable to locate a save device!" +msgstr "Kayıt aygıtı bulunamıyor!" + +msgid "Unable to open snapshot!" +msgstr "Enstantane açılamıyor!" + +msgid "Unfiltered" +msgstr "Filtre Yok" + +msgid "Unknown file type!" +msgstr "Tanınmayan dosya türü!" + +msgid "Unrecognized DVD format." +msgstr "Desteklenmeyen DVD formatı." + +msgid "Unrecognized file extension!" +msgstr "Desteklenmeyen dosya uzantısı!" + +msgid "Up" +msgstr "Yukarı" + +msgid "UP" +msgstr "YUKARI" + +msgid "Up One Level" +msgstr "Ãœst Dizin" + +msgid "Update Available" +msgstr "Güncelleme Mevcut" + +msgid "Update failed!" +msgstr "Güncelleme baÅŸarısız!" + +msgid "Update later" +msgstr "Sonra güncelle" + +msgid "Update now" +msgstr "Åžimdi güncelle" + +msgid "Update successful!" +msgstr "Güncelleme baÅŸarılı!" + +msgid "USB drive not found!" +msgstr "USB aygıtı bulunamadı!" + +msgid "USB Mass Storage" +msgstr "USB Yığın Depolama Aygıtı" + +msgid "Vertical" +msgstr "Dikey" + +msgid "Video" +msgstr "Ekran" + +msgid "Video Mode" +msgstr "Ekran Modu" + +msgid "VM8: Unknown page type!" +msgstr "VM8: Tanınmayan sayfa türü!" + +msgid "VM16: Unknown page type!" +msgstr "VM16: Tanınmayan sayfa türü!" + +msgid "VM32: Unknown page type!" +msgstr "VM32: Tanınmayan sayfa türü!" + +msgid "Wiimote" +msgstr "Wii Kumanda" + +msgid "Wiimote Orientation" +msgstr "Wii Kumanda Yönelimi" + +msgid "Yes" +msgstr "Evet" + +msgid "Zapper" +msgstr "Zapper Tabanca" + +msgid "Zapper Crosshair" +msgstr "Zapper Tabanca Artı Ä°mleci" + +msgid "Logo" +msgstr "Logo" + +msgid "Turbo On" +msgstr "Turbo Açık" + +msgid "Turbo Off" +msgstr "Turbo Kapalı" + +msgid "Automatic" +msgstr "Otomatik" + +msgid "Palette" +msgstr "Renk Paleti" + +msgid "AspiringSquire's Real palette" +msgstr "AspiringSquire Gerçek renk paleti" + +msgid "Loopy's palette" +msgstr "Loopy renk paleti" + +msgid "Quor's palette" +msgstr "Quor renk paleti" + +msgid "Chris Covell's palette" +msgstr "Chris Covell renk paleti" + +msgid "Matthew Conte's palette" +msgstr "Matthew Conte renk paleti" + +msgid "PasoFami/99 palette" +msgstr "PasoFami/99 renk paleti" + +msgid "CrashMan's palette" +msgstr "CrashMan renk paleti" + +msgid "MESS palette" +msgstr "MESS renk paleti" + +msgid "Zaphod's VS Castlevania palette" +msgstr "Zaphod'un VS Castlevania renk paleti" + +msgid "Zaphod's VS SMB palette" +msgstr "Zaphod'un VS SMB renk paleti" + +msgid "VS Dr. Mario palette" +msgstr "VS Dr. Mario renk paleti" + +msgid "VS Castlevania palette" +msgstr "VS Castlevania renk paleti" + +msgid "VS SMB/VS Ice Climber palette" +msgstr "VS SMB/VS Ice Climber renk paleti" + +msgid "Catalan" +msgstr "Katalonca" + +msgid "The current IOS has been altered (fake-signed). Functionality and/or stability may be adversely affected." +msgstr "Geçerli IOS deÄŸiÅŸtirilmiÅŸ (sahte-imzalı). IÅŸlevsellik ve/veya stabilite olumsuz etkilenebilir." + +msgid "The current IOS is unsupported. Functionality and/or stability may be adversely affected." +msgstr "Geçerli IOS desteklenmiyor. IÅŸlevsellik ve/veya stabilite olumsuz etkilenebilir." + +msgid "Turkish" +msgstr "Türkçe" diff --git a/plugins/snes9x_gx/source/lang/zh.lang b/plugins/snes9x_gx/source/lang/zh.lang new file mode 100644 index 00000000..85d83649 --- /dev/null +++ b/plugins/snes9x_gx/source/lang/zh.lang @@ -0,0 +1,2 @@ +msgid " " +msgstr "" diff --git a/plugins/snes9x_gx/source/mem2.cpp b/plugins/snes9x_gx/source/mem2.cpp new file mode 100644 index 00000000..08be67d0 --- /dev/null +++ b/plugins/snes9x_gx/source/mem2.cpp @@ -0,0 +1,43 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * Tantric 2010 + * + * mem2.cpp + * + * MEM2 memory allocator + ***************************************************************************/ + +#ifdef HW_RVL + +#include <ogc/machine/asm.h> +#include <ogc/lwp_heap.h> +#include <ogc/system.h> +#include <ogc/machine/processor.h> + +static heap_cntrl mem2_heap; + +u32 InitMem2Manager () +{ + int size = (12*1024*1024); + u32 level; + _CPU_ISR_Disable(level); + size &= ~0x1f; // round down, because otherwise we may exceed the area + void *mem2_heap_ptr = (void *)((u32)SYS_GetArena2Hi()-size); + SYS_SetArena2Hi(mem2_heap_ptr); + _CPU_ISR_Restore(level); + size = __lwp_heap_init(&mem2_heap, mem2_heap_ptr, size, 32); + return size; +} + +void* mem2_malloc(u32 size) +{ + return __lwp_heap_allocate(&mem2_heap, size); +} + +bool mem2_free(void *ptr) +{ + return __lwp_heap_free(&mem2_heap, ptr); +} + +#endif diff --git a/plugins/snes9x_gx/source/mem2.h b/plugins/snes9x_gx/source/mem2.h new file mode 100644 index 00000000..539b038e --- /dev/null +++ b/plugins/snes9x_gx/source/mem2.h @@ -0,0 +1,22 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * Tantric 2010 + * + * mem2.h + * + * MEM2 memory allocator + ***************************************************************************/ + +#ifdef HW_RVL + +#ifndef _MEM2MANAGER_H_ +#define _MEM2MANAGER_H_ + +u32 InitMem2Manager (); +void* mem2_malloc(u32 size); +bool mem2_free(void *ptr); + +#endif + +#endif diff --git a/plugins/snes9x_gx/source/menu.cpp b/plugins/snes9x_gx/source/menu.cpp new file mode 100644 index 00000000..cd936168 --- /dev/null +++ b/plugins/snes9x_gx/source/menu.cpp @@ -0,0 +1,4091 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * Tantric 2008-2010 + * + * menu.cpp + * + * Menu flow routines - handles all menu logic + ***************************************************************************/ + +#include <gccore.h> +#include <ogcsys.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <wiiuse/wpad.h> +#include <wupc/wupc.h> +#include <sys/stat.h> + +#ifdef HW_RVL +#include <di/di.h> +#endif + +#include "snes9xgx.h" +#include "video.h" +#include "filebrowser.h" +#include "gcunzip.h" +#include "networkop.h" +#include "fileop.h" +#include "sram.h" +#include "freeze.h" +#include "preferences.h" +#include "button_mapping.h" +#include "input.h" +#include "filter.h" +#include "filelist.h" +#include "gui/gui.h" +#include "menu.h" +#include "utils/gettext.h" + +#include "snes9x/snes9x.h" +#include "snes9x/memmap.h" +#include "snes9x/cheats.h" + +extern SCheatData Cheat; + +#define THREAD_SLEEP 100 + +#ifdef HW_RVL +static GuiImageData * pointer[4]; +#endif + +#ifdef HW_RVL + #include "mem2.h" + + #define MEM_ALLOC(A) (u8*)mem2_malloc(A) + #define MEM_DEALLOC(A) mem2_free(A) +#else + #define MEM_ALLOC(A) (u8*)memalign(32, A) + #define MEM_DEALLOC(A) free(A) +#endif + +static GuiTrigger * trigA = NULL; +static GuiTrigger * trig2 = NULL; + +static GuiButton * btnLogo = NULL; +static GuiImageData * gameScreen = NULL; +static GuiImage * gameScreenImg = NULL; +static GuiImage * bgTopImg = NULL; +static GuiImage * bgBottomImg = NULL; +static GuiSound * bgMusic = NULL; +static GuiSound * enterSound = NULL; +static GuiSound * exitSound = NULL; +static GuiWindow * mainWindow = NULL; +static GuiText * settingText = NULL; +static GuiText * settingText2 = NULL; +static int lastMenu = MENU_NONE; +static int wiiuproCtrl = 0; +static int mapMenuCtrl = 0; +static int mapMenuCtrlSNES = 0; + +static lwp_t guithread = LWP_THREAD_NULL; +static lwp_t progressthread = LWP_THREAD_NULL; +#ifdef HW_RVL +static lwp_t updatethread = LWP_THREAD_NULL; +#endif +static bool guiHalt = true; +static int showProgress = 0; + +static char progressTitle[101]; +static char progressMsg[201]; +static int progressDone = 0; +static int progressTotal = 0; + +/**************************************************************************** + * ResumeGui + * + * Signals the GUI thread to start, and resumes the thread. This is called + * after finishing the removal/insertion of new elements, and after initial + * GUI setup. + ***************************************************************************/ +static void +ResumeGui() +{ + guiHalt = false; + LWP_ResumeThread (guithread); +} + +/**************************************************************************** + * HaltGui + * + * Signals the GUI thread to stop, and waits for GUI thread to stop + * This is necessary whenever removing/inserting new elements into the GUI. + * This eliminates the possibility that the GUI is in the middle of accessing + * an element that is being changed. + ***************************************************************************/ +static void +HaltGui() +{ + guiHalt = true; + + // wait for thread to finish + while(!LWP_ThreadIsSuspended(guithread)) + usleep(THREAD_SLEEP); +} + +void ResetText() +{ + LoadLanguage(); + + if(mainWindow) + mainWindow->ResetText(); +} + +/**************************************************************************** + * WindowPrompt + * + * Displays a prompt window to user, with information, an error message, or + * presenting a user with a choice + ***************************************************************************/ +int +WindowPrompt(const char *title, const char *msg, const char *btn1Label, const char *btn2Label) +{ + if(!mainWindow || ExitRequested || ShutdownRequested) + return 0; + + int choice = -1; + + GuiWindow promptWindow(448,288); + promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + promptWindow.SetPosition(0, -10); + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_prompt_png); + GuiImageData btnOutlineOver(button_prompt_over_png); + + GuiImageData dialogBox(dialogue_box_png); + GuiImage dialogBoxImg(&dialogBox); + + GuiText titleTxt(title, 26, (GXColor){70, 70, 10, 255}); + titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + titleTxt.SetPosition(0,14); + GuiText msgTxt(msg, 26, (GXColor){0, 0, 0, 255}); + msgTxt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + msgTxt.SetPosition(0,-20); + msgTxt.SetWrap(true, 430); + + GuiText btn1Txt(btn1Label, 22, (GXColor){0, 0, 0, 255}); + GuiImage btn1Img(&btnOutline); + GuiImage btn1ImgOver(&btnOutlineOver); + GuiButton btn1(btnOutline.GetWidth(), btnOutline.GetHeight()); + + if(btn2Label) + { + btn1.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + btn1.SetPosition(20, -25); + } + else + { + btn1.SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM); + btn1.SetPosition(0, -25); + } + + btn1.SetLabel(&btn1Txt); + btn1.SetImage(&btn1Img); + btn1.SetImageOver(&btn1ImgOver); + btn1.SetSoundOver(&btnSoundOver); + btn1.SetSoundClick(&btnSoundClick); + btn1.SetTrigger(trigA); + btn1.SetTrigger(trig2); + btn1.SetState(STATE_SELECTED); + btn1.SetEffectGrow(); + + GuiText btn2Txt(btn2Label, 22, (GXColor){0, 0, 0, 255}); + GuiImage btn2Img(&btnOutline); + GuiImage btn2ImgOver(&btnOutlineOver); + GuiButton btn2(btnOutline.GetWidth(), btnOutline.GetHeight()); + btn2.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); + btn2.SetPosition(-20, -25); + btn2.SetLabel(&btn2Txt); + btn2.SetImage(&btn2Img); + btn2.SetImageOver(&btn2ImgOver); + btn2.SetSoundOver(&btnSoundOver); + btn2.SetSoundClick(&btnSoundClick); + btn2.SetTrigger(trigA); + btn2.SetTrigger(trig2); + btn2.SetEffectGrow(); + + promptWindow.Append(&dialogBoxImg); + promptWindow.Append(&titleTxt); + promptWindow.Append(&msgTxt); + promptWindow.Append(&btn1); + + if(btn2Label) + promptWindow.Append(&btn2); + + promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50); + CancelAction(); + HaltGui(); + mainWindow->SetState(STATE_DISABLED); + mainWindow->Append(&promptWindow); + mainWindow->ChangeFocus(&promptWindow); + if(btn2Label) + { + btn1.ResetState(); + btn2.SetState(STATE_SELECTED); + } + ResumeGui(); + + while(choice == -1) + { + usleep(THREAD_SLEEP); + + if(btn1.GetState() == STATE_CLICKED) + choice = 1; + else if(btn2.GetState() == STATE_CLICKED) + choice = 0; + } + + promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50); + while(promptWindow.GetEffect() > 0) usleep(THREAD_SLEEP); + HaltGui(); + mainWindow->Remove(&promptWindow); + mainWindow->SetState(STATE_DEFAULT); + ResumeGui(); + return choice; +} + +#ifdef HW_RVL +/**************************************************************************** + * EmulatorUpdate + * + * Prompts for confirmation, and downloads/installs updates + ***************************************************************************/ +static void * +EmulatorUpdate (void *arg) +{ + bool installUpdate = WindowPrompt( + "Update Available", + "An update is available!", + "Update now", + "Update later"); + if(installUpdate) + if(DownloadUpdate()) + ExitRequested = 1; + return NULL; +} +#endif + +/**************************************************************************** + * UpdateGUI + * + * Primary thread to allow GUI to respond to state changes, and draws GUI + ***************************************************************************/ + +static void * +UpdateGUI (void *arg) +{ + int i; + + while(1) + { + if(guiHalt) + LWP_SuspendThread(guithread); + + UpdatePads(); + mainWindow->Draw(); + + if (mainWindow->GetState() != STATE_DISABLED) + mainWindow->DrawTooltip(); + + #ifdef HW_RVL + i = 3; + do + { + if(userInput[i].wpad->ir.valid) + Menu_DrawImg(userInput[i].wpad->ir.x-48, userInput[i].wpad->ir.y-48, + 96, 96, pointer[i]->GetImage(), userInput[i].wpad->ir.angle, 1, 1, 255); + DoRumble(i); + --i; + } while(i>=0); + #endif + + Menu_Render(); + + mainWindow->Update(&userInput[3]); + mainWindow->Update(&userInput[2]); + mainWindow->Update(&userInput[1]); + mainWindow->Update(&userInput[0]); + + #ifdef HW_RVL + if(updateFound) + { + updateFound = false; + + if(!loadingFile) + LWP_CreateThread (&updatethread, EmulatorUpdate, NULL, NULL, 0, 70); + } + #endif + + if(ExitRequested || ShutdownRequested) + { + for(i = 0; i <= 255; i += 15) + { + mainWindow->Draw(); + Menu_DrawRectangle(0,0,screenwidth,screenheight,(GXColor){0, 0, 0, (u8)i},1); + Menu_Render(); + } + ExitApp(); + } + usleep(THREAD_SLEEP); + } + return NULL; +} + +/**************************************************************************** + * ProgressWindow + * + * Opens a window, which displays progress to the user. Can either display a + * progress bar showing % completion, or a throbber that only shows that an + * action is in progress. + ***************************************************************************/ +static int progsleep = 0; + +static void +ProgressWindow(char *title, char *msg) +{ + GuiWindow promptWindow(448,288); + promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + promptWindow.SetPosition(0, -10); + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_png); + GuiImageData btnOutlineOver(button_over_png); + + GuiImageData dialogBox(dialogue_box_png); + GuiImage dialogBoxImg(&dialogBox); + + GuiImageData progressbarOutline(progressbar_outline_png); + GuiImage progressbarOutlineImg(&progressbarOutline); + progressbarOutlineImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + progressbarOutlineImg.SetPosition(25, 40); + + GuiImageData progressbarEmpty(progressbar_empty_png); + GuiImage progressbarEmptyImg(&progressbarEmpty); + progressbarEmptyImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + progressbarEmptyImg.SetPosition(25, 40); + progressbarEmptyImg.SetTile(100); + + GuiImageData progressbar(progressbar_png); + GuiImage progressbarImg(&progressbar); + progressbarImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + progressbarImg.SetPosition(25, 40); + + GuiImageData throbber(throbber_png); + GuiImage throbberImg(&throbber); + throbberImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + throbberImg.SetPosition(0, 40); + + GuiText titleTxt(title, 26, (GXColor){70, 70, 10, 255}); + titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + titleTxt.SetPosition(0,14); + GuiText msgTxt(msg, 26, (GXColor){0, 0, 0, 255}); + msgTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + msgTxt.SetPosition(0,80); + + promptWindow.Append(&dialogBoxImg); + promptWindow.Append(&titleTxt); + promptWindow.Append(&msgTxt); + + if(showProgress == 1) + { + promptWindow.Append(&progressbarEmptyImg); + promptWindow.Append(&progressbarImg); + promptWindow.Append(&progressbarOutlineImg); + } + else + { + promptWindow.Append(&throbberImg); + } + + // wait to see if progress flag changes soon + progsleep = 400000; + + while(progsleep > 0) + { + if(!showProgress) + break; + usleep(THREAD_SLEEP); + progsleep -= THREAD_SLEEP; + } + + if(!showProgress) + return; + + HaltGui(); + int oldState = mainWindow->GetState(); + mainWindow->SetState(STATE_DISABLED); + mainWindow->Append(&promptWindow); + mainWindow->ChangeFocus(&promptWindow); + ResumeGui(); + + float angle = 0; + u32 count = 0; + + while(showProgress) + { + progsleep = 20000; + + while(progsleep > 0) + { + if(!showProgress) + break; + usleep(THREAD_SLEEP); + progsleep -= THREAD_SLEEP; + } + + if(showProgress == 1) + { + progressbarImg.SetTile(100*progressDone/progressTotal); + } + else if(showProgress == 2) + { + if(count % 5 == 0) + { + angle+=45.0f; + if(angle >= 360.0f) + angle = 0; + throbberImg.SetAngle(angle); + } + ++count; + } + } + + HaltGui(); + mainWindow->Remove(&promptWindow); + mainWindow->SetState(oldState); + ResumeGui(); +} + +static void * ProgressThread (void *arg) +{ + while(1) + { + if(!showProgress) + LWP_SuspendThread (progressthread); + + ProgressWindow(progressTitle, progressMsg); + usleep(THREAD_SLEEP); + } + return NULL; +} + +/**************************************************************************** + * InitGUIThread + * + * Startup GUI threads + ***************************************************************************/ +void +InitGUIThreads() +{ + LWP_CreateThread (&guithread, UpdateGUI, NULL, NULL, 0, 70); + LWP_CreateThread (&progressthread, ProgressThread, NULL, NULL, 0, 40); +} + +/**************************************************************************** + * CancelAction + * + * Signals the GUI progress window thread to halt, and waits for it to + * finish. Prevents multiple progress window events from interfering / + * overriding each other. + ***************************************************************************/ +void +CancelAction() +{ + showProgress = 0; + + // wait for thread to finish + while(!LWP_ThreadIsSuspended(progressthread)) + usleep(THREAD_SLEEP); +} + +/**************************************************************************** + * ShowProgress + * + * Updates the variables used by the progress window for drawing a progress + * bar. Also resumes the progress window thread if it is suspended. + ***************************************************************************/ +void +ShowProgress (const char *msg, int done, int total) +{ + if(!mainWindow || ExitRequested || ShutdownRequested) + return; + + if(total < (256*1024)) + return; + else if(done > total) // this shouldn't happen + done = total; + + if(done/total > 0.99) + done = total; + + if(showProgress != 1) + CancelAction(); // wait for previous progress window to finish + + snprintf(progressMsg, 200, "%s", msg); + sprintf(progressTitle, "Please Wait"); + showProgress = 1; + progressTotal = total; + progressDone = done; + LWP_ResumeThread (progressthread); +} + +/**************************************************************************** + * ShowAction + * + * Shows that an action is underway. Also resumes the progress window thread + * if it is suspended. + ***************************************************************************/ +void +ShowAction (const char *msg) +{ + if(!mainWindow || ExitRequested || ShutdownRequested) + return; + + if(showProgress != 0) + CancelAction(); // wait for previous progress window to finish + + snprintf(progressMsg, 200, "%s", msg); + sprintf(progressTitle, "Please Wait"); + showProgress = 2; + progressDone = 0; + progressTotal = 0; + LWP_ResumeThread (progressthread); +} + +void ErrorPrompt(const char *msg) +{ + WindowPrompt("Error", msg, "OK", NULL); +} + +int ErrorPromptRetry(const char *msg) +{ + return WindowPrompt("Error", msg, "Retry", "Cancel"); +} + +void InfoPrompt(const char *msg) +{ + WindowPrompt("Information", msg, "OK", NULL); +} + +/**************************************************************************** + * AutoSave + * + * Automatically saves SRAM/snapshot when returning from in-game to the menu + ***************************************************************************/ +void AutoSave() +{ + if (GCSettings.AutoSave == 1) + { + SaveSRAMAuto(SILENT); + } + else if (GCSettings.AutoSave == 2) + { + if (WindowPrompt("Save", "Save Snapshot?", "Save", "Don't Save") ) + SaveSnapshotAuto(NOTSILENT); + } + else if (GCSettings.AutoSave == 3) + { + if (WindowPrompt("Save", "Save SRAM and Snapshot?", "Save", "Don't Save") ) + { + SaveSRAMAuto(NOTSILENT); + SaveSnapshotAuto(NOTSILENT); + } + } +} + +/**************************************************************************** + * OnScreenKeyboard + * + * Opens an on-screen keyboard window, with the data entered being stored + * into the specified variable. + ***************************************************************************/ +static void OnScreenKeyboard(char * var, u32 maxlen) +{ + int save = -1; + + GuiKeyboard keyboard(var, maxlen); + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_png); + GuiImageData btnOutlineOver(button_over_png); + + GuiText okBtnTxt("OK", 22, (GXColor){0, 0, 0, 255}); + GuiImage okBtnImg(&btnOutline); + GuiImage okBtnImgOver(&btnOutlineOver); + GuiButton okBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + + okBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + okBtn.SetPosition(25, -25); + + okBtn.SetLabel(&okBtnTxt); + okBtn.SetImage(&okBtnImg); + okBtn.SetImageOver(&okBtnImgOver); + okBtn.SetSoundOver(&btnSoundOver); + okBtn.SetSoundClick(&btnSoundClick); + okBtn.SetTrigger(trigA); + okBtn.SetTrigger(trig2); + okBtn.SetEffectGrow(); + + GuiText cancelBtnTxt("Cancel", 22, (GXColor){0, 0, 0, 255}); + GuiImage cancelBtnImg(&btnOutline); + GuiImage cancelBtnImgOver(&btnOutlineOver); + GuiButton cancelBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + cancelBtn.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); + cancelBtn.SetPosition(-25, -25); + cancelBtn.SetLabel(&cancelBtnTxt); + cancelBtn.SetImage(&cancelBtnImg); + cancelBtn.SetImageOver(&cancelBtnImgOver); + cancelBtn.SetSoundOver(&btnSoundOver); + cancelBtn.SetSoundClick(&btnSoundClick); + cancelBtn.SetTrigger(trigA); + cancelBtn.SetTrigger(trig2); + cancelBtn.SetEffectGrow(); + + keyboard.Append(&okBtn); + keyboard.Append(&cancelBtn); + + HaltGui(); + mainWindow->SetState(STATE_DISABLED); + mainWindow->Append(&keyboard); + mainWindow->ChangeFocus(&keyboard); + ResumeGui(); + + while(save == -1) + { + usleep(THREAD_SLEEP); + + if(okBtn.GetState() == STATE_CLICKED) + save = 1; + else if(cancelBtn.GetState() == STATE_CLICKED) + save = 0; + } + + if(save) + { + snprintf(var, maxlen, "%s", keyboard.kbtextstr); + } + + HaltGui(); + mainWindow->Remove(&keyboard); + mainWindow->SetState(STATE_DEFAULT); + ResumeGui(); +} + +/**************************************************************************** + * SettingWindow + * + * Opens a new window, with the specified window element appended. Allows + * for a customizable prompted setting. + ***************************************************************************/ +static int +SettingWindow(const char * title, GuiWindow * w) +{ + int save = -1; + + GuiWindow promptWindow(448,288); + promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_png); + GuiImageData btnOutlineOver(button_over_png); + + GuiImageData dialogBox(dialogue_box_png); + GuiImage dialogBoxImg(&dialogBox); + + GuiText titleTxt(title, 26, (GXColor){70, 70, 10, 255}); + titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + titleTxt.SetPosition(0,14); + + GuiText okBtnTxt("OK", 22, (GXColor){0, 0, 0, 255}); + GuiImage okBtnImg(&btnOutline); + GuiImage okBtnImgOver(&btnOutlineOver); + GuiButton okBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + + okBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + okBtn.SetPosition(20, -25); + + okBtn.SetLabel(&okBtnTxt); + okBtn.SetImage(&okBtnImg); + okBtn.SetImageOver(&okBtnImgOver); + okBtn.SetSoundOver(&btnSoundOver); + okBtn.SetSoundClick(&btnSoundClick); + okBtn.SetTrigger(trigA); + okBtn.SetTrigger(trig2); + okBtn.SetEffectGrow(); + + GuiText cancelBtnTxt("Cancel", 22, (GXColor){0, 0, 0, 255}); + GuiImage cancelBtnImg(&btnOutline); + GuiImage cancelBtnImgOver(&btnOutlineOver); + GuiButton cancelBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + cancelBtn.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); + cancelBtn.SetPosition(-20, -25); + cancelBtn.SetLabel(&cancelBtnTxt); + cancelBtn.SetImage(&cancelBtnImg); + cancelBtn.SetImageOver(&cancelBtnImgOver); + cancelBtn.SetSoundOver(&btnSoundOver); + cancelBtn.SetSoundClick(&btnSoundClick); + cancelBtn.SetTrigger(trigA); + cancelBtn.SetTrigger(trig2); + cancelBtn.SetEffectGrow(); + + promptWindow.Append(&dialogBoxImg); + promptWindow.Append(&titleTxt); + promptWindow.Append(&okBtn); + promptWindow.Append(&cancelBtn); + + HaltGui(); + mainWindow->SetState(STATE_DISABLED); + mainWindow->Append(&promptWindow); + mainWindow->Append(w); + mainWindow->ChangeFocus(w); + ResumeGui(); + + while(save == -1) + { + usleep(THREAD_SLEEP); + + if(okBtn.GetState() == STATE_CLICKED) + save = 1; + else if(cancelBtn.GetState() == STATE_CLICKED) + save = 0; + } + HaltGui(); + mainWindow->Remove(&promptWindow); + mainWindow->Remove(w); + mainWindow->SetState(STATE_DEFAULT); + ResumeGui(); + return save; +} + +/**************************************************************************** + * WindowCredits + * Display credits, legal copyright and licence + * + * THIS MUST NOT BE REMOVED OR DISABLED IN ANY DERIVATIVE WORK + ***************************************************************************/ +static void WindowCredits(void * ptr) +{ + if(btnLogo->GetState() != STATE_CLICKED) + return; + + btnLogo->ResetState(); + + bool exit = false; + int i = 0; + int y = 20; + + GuiWindow creditsWindow(screenwidth,screenheight); + GuiWindow creditsWindowBox(580,448); + creditsWindowBox.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + + GuiImageData creditsBox(credits_box_png); + GuiImage creditsBoxImg(&creditsBox); + creditsBoxImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + creditsWindowBox.Append(&creditsBoxImg); + + int numEntries = 24; + GuiText * txt[numEntries]; + + txt[i] = new GuiText("Credits", 30, (GXColor){0, 0, 0, 255}); + txt[i]->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); txt[i]->SetPosition(0,y); i++; y+=32; + + txt[i] = new GuiText("Official Site: http://code.google.com/p/snes9x-gx/", 20, (GXColor){0, 0, 0, 255}); + txt[i]->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); txt[i]->SetPosition(0,y); i++; y+=40; + + txt[i]->SetPresets(20, (GXColor){0, 0, 0, 255}, 0, + FTGX_JUSTIFY_LEFT | FTGX_ALIGN_TOP, ALIGN_LEFT, ALIGN_TOP); + + txt[i] = new GuiText("Coding & menu design"); + txt[i]->SetPosition(60,y); i++; + txt[i] = new GuiText("Tantric"); + txt[i]->SetPosition(350,y); i++; y+=24; + txt[i] = new GuiText("Coding"); + txt[i]->SetPosition(60,y); i++; + txt[i] = new GuiText("michniewski"); + txt[i]->SetPosition(350,y); i++; y+=24; + txt[i] = new GuiText("Menu artwork"); + txt[i]->SetPosition(60,y); i++; + txt[i] = new GuiText("the3seashells"); + txt[i]->SetPosition(350,y); i++; y+=24; + txt[i] = new GuiText("Menu sound"); + txt[i]->SetPosition(60,y); i++; + txt[i] = new GuiText("Peter de Man"); + txt[i]->SetPosition(350,y); i++; y+=48; + + txt[i] = new GuiText("Snes9x GX GameCube"); + txt[i]->SetPosition(60,y); i++; + txt[i] = new GuiText("SoftDev, crunchy2,"); + txt[i]->SetPosition(350,y); i++; y+=24; + txt[i] = new GuiText("eke-eke, others"); + txt[i]->SetPosition(350,y); i++; y+=24; + txt[i] = new GuiText("Snes9x"); + txt[i]->SetPosition(60,y); i++; + txt[i] = new GuiText("Snes9x Team"); + txt[i]->SetPosition(350,y); i++; y+=24; + + txt[i] = new GuiText("libogc / devkitPPC"); + txt[i]->SetPosition(60,y); i++; + txt[i] = new GuiText("shagkur & wintermute"); + txt[i]->SetPosition(350,y); i++; y+=24; + txt[i] = new GuiText("FreeTypeGX"); + txt[i]->SetPosition(60,y); i++; + txt[i] = new GuiText("Armin Tamzarian"); + txt[i]->SetPosition(350,y); i++; y+=48; + + txt[i]->SetPresets(18, (GXColor){0, 0, 0, 255}, 0, + FTGX_JUSTIFY_CENTER | FTGX_ALIGN_TOP, ALIGN_CENTRE, ALIGN_TOP); + + txt[i] = new GuiText("Snes9x - Copyright (c) Snes9x Team 1996 - 2006"); + txt[i]->SetPosition(0,y); i++; y+=20; + txt[i] = new GuiText("This software is open source and may be copied,"); + txt[i]->SetPosition(0,y); i++; y+=20; + txt[i] = new GuiText("distributed, or modified under the terms of the"); + txt[i]->SetPosition(0,y); i++; y+=20; + txt[i] = new GuiText("GNU General Public License (GPL) Version 2."); + txt[i]->SetPosition(0,y); i++; y+=20; + + char iosVersion[20]; + +#ifdef HW_RVL + sprintf(iosVersion, "IOS: %d", IOS_GetVersion()); +#endif + + txt[i] = new GuiText(iosVersion, 18, (GXColor){0, 0, 0, 255}); + txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + txt[i]->SetPosition(20,-20); + + for(i=0; i < numEntries; i++) + creditsWindowBox.Append(txt[i]); + + creditsWindow.Append(&creditsWindowBox); + + while(!exit) + { + UpdatePads(); + + gameScreenImg->Draw(); + bgBottomImg->Draw(); + bgTopImg->Draw(); + creditsWindow.Draw(); + + #ifdef HW_RVL + i = 3; + do { + if(userInput[i].wpad->ir.valid) + Menu_DrawImg(userInput[i].wpad->ir.x-48, userInput[i].wpad->ir.y-48, + 96, 96, pointer[i]->GetImage(), userInput[i].wpad->ir.angle, 1, 1, 255); + DoRumble(i); + --i; + } while(i >= 0); + #endif + + Menu_Render(); + + if((userInput[0].wpad->btns_d || userInput[0].pad.btns_d || userInput[0].wupcdata.btns_d) || + (userInput[1].wpad->btns_d || userInput[1].pad.btns_d || userInput[1].wupcdata.btns_d) || + (userInput[2].wpad->btns_d || userInput[2].pad.btns_d || userInput[2].wupcdata.btns_d) || + (userInput[3].wpad->btns_d || userInput[3].pad.btns_d || userInput[3].wupcdata.btns_d)) + { + exit = true; + } + usleep(THREAD_SLEEP); + } + + // clear buttons pressed + for(i=0; i < 4; i++) + { + userInput[i].wupcdata.btns_d = 0; + userInput[i].wpad->btns_d = 0; + userInput[i].pad.btns_d = 0; + } + + for(i=0; i < numEntries; i++) + delete txt[i]; +} + +/**************************************************************************** + * MenuGameSelection + * + * Displays a list of games on the specified load device, and allows the user + * to browse and select from this list. + ***************************************************************************/ +static int MenuGameSelection() +{ + int menu = MENU_NONE; + bool res; + int i; + + GuiText titleTxt("Choose Game", 26, (GXColor){255, 255, 255, 255}); + titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + titleTxt.SetPosition(50,50); + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData iconHome(icon_home_png); + GuiImageData iconSettings(icon_settings_png); + GuiImageData btnOutline(button_long_png); + GuiImageData btnOutlineOver(button_long_over_png); + GuiImageData bgPreviewImg(bg_preview_png); + + GuiTrigger trigHome; + trigHome.SetButtonOnlyTrigger(-1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, 0); + + GuiText settingsBtnTxt("Settings", 22, (GXColor){0, 0, 0, 255}); + GuiImage settingsBtnIcon(&iconSettings); + settingsBtnIcon.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + settingsBtnIcon.SetPosition(14,0); + GuiImage settingsBtnImg(&btnOutline); + GuiImage settingsBtnImgOver(&btnOutlineOver); + GuiButton settingsBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + settingsBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + settingsBtn.SetPosition(90, -35); + settingsBtn.SetLabel(&settingsBtnTxt); + settingsBtn.SetIcon(&settingsBtnIcon); + settingsBtn.SetImage(&settingsBtnImg); + settingsBtn.SetImageOver(&settingsBtnImgOver); + settingsBtn.SetSoundOver(&btnSoundOver); + settingsBtn.SetSoundClick(&btnSoundClick); + settingsBtn.SetTrigger(trigA); + settingsBtn.SetTrigger(trig2); + settingsBtn.SetEffectGrow(); + + GuiText exitBtnTxt("Exit", 22, (GXColor){0, 0, 0, 255}); + GuiImage exitBtnIcon(&iconHome); + exitBtnIcon.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + exitBtnIcon.SetPosition(14,0); + GuiImage exitBtnImg(&btnOutline); + GuiImage exitBtnImgOver(&btnOutlineOver); + GuiButton exitBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + exitBtn.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); + exitBtn.SetPosition(-90, -35); + exitBtn.SetLabel(&exitBtnTxt); + exitBtn.SetIcon(&exitBtnIcon); + exitBtn.SetImage(&exitBtnImg); + exitBtn.SetImageOver(&exitBtnImgOver); + exitBtn.SetSoundOver(&btnSoundOver); + exitBtn.SetSoundClick(&btnSoundClick); + exitBtn.SetTrigger(trigA); + exitBtn.SetTrigger(trig2); + exitBtn.SetTrigger(&trigHome); + exitBtn.SetEffectGrow(); + + GuiWindow buttonWindow(screenwidth, screenheight); + buttonWindow.Append(&settingsBtn); + buttonWindow.Append(&exitBtn); + + GuiFileBrowser gameBrowser(330, 268); + gameBrowser.SetPosition(20, 98); + ResetBrowser(); + + GuiImage bgPreview(&bgPreviewImg); + bgPreview.SetPosition(365, 98); + + GuiImage preview; + preview.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + preview.SetPosition(174, -8); + u8* imgBuffer = MEM_ALLOC(512 * 512 * 4); + int previousBrowserIndex = -1; + char screenshotPath[MAXJOLIET + 1]; + + HaltGui(); + btnLogo->SetAlignment(ALIGN_RIGHT, ALIGN_TOP); + btnLogo->SetPosition(-50, 24); + mainWindow->Append(&titleTxt); + mainWindow->Append(&gameBrowser); + mainWindow->Append(&buttonWindow); + mainWindow->Append(&bgPreview); + mainWindow->Append(&preview); + ResumeGui(); + + #ifdef HW_RVL + ShutoffRumble(); + #endif + + // populate initial directory listing + selectLoadedFile = 1; + OpenGameList(); + + gameBrowser.ResetState(); + gameBrowser.fileList[0]->SetState(STATE_SELECTED); + gameBrowser.TriggerUpdate(); + titleTxt.SetText(inSz ? szname : "Choose Game"); + + while(menu == MENU_NONE) + { + usleep(THREAD_SLEEP); + + if(selectLoadedFile == 2) + { + selectLoadedFile = 0; + mainWindow->ChangeFocus(&gameBrowser); + gameBrowser.TriggerUpdate(); + } + + // update gameWindow based on arrow buttons + // set MENU_EXIT if A button pressed on a game + for(i=0; i < FILE_PAGESIZE; i++) + { + if(gameBrowser.fileList[i]->GetState() == STATE_CLICKED) + { + gameBrowser.fileList[i]->ResetState(); + + // check corresponding browser entry + if(browserList[browser.selIndex].isdir || IsSz()) + { + HaltGui(); + res = BrowserChangeFolder(); + if(res) + { + gameBrowser.ResetState(); + gameBrowser.fileList[0]->SetState(STATE_SELECTED); + gameBrowser.TriggerUpdate(); + previousBrowserIndex = -1; + } + else + { + menu = MENU_GAMESELECTION; + break; + } + + + titleTxt.SetText(inSz ? szname : "Choose Game"); + + ResumeGui(); + } + else + { + #ifdef HW_RVL + ShutoffRumble(); + #endif + mainWindow->SetState(STATE_DISABLED); + SavePrefs(SILENT); + if(BrowserLoadFile()) + menu = MENU_EXIT; + else + mainWindow->SetState(STATE_DEFAULT); + } + } + } + + //update game screenshot + if(previousBrowserIndex != browser.selIndex) + { + previousBrowserIndex = browser.selIndex; + snprintf(screenshotPath, MAXJOLIET, "%s%s/%s.png", pathPrefix[GCSettings.LoadMethod], GCSettings.ScreenshotsFolder, browserList[browser.selIndex].displayname); + + AllocSaveBuffer(); + int width, height; + if(LoadFile(screenshotPath, SILENT)) + { + if(DecodePNG(savebuffer, &width, &height, imgBuffer, 512, 512)) + { + preview.SetImage(imgBuffer, width, height); + //preview.SetScale(225.0f / width); + preview.SetScale( MIN(225.0f / width, 235.0f / height) ); + } + else + { + preview.SetImage(NULL, 0, 0); + } + } + else + { + preview.SetImage(NULL, 0, 0); + } + FreeSaveBuffer(); + } + + if(settingsBtn.GetState() == STATE_CLICKED) + menu = MENU_SETTINGS; + else if(exitBtn.GetState() == STATE_CLICKED) + ExitRequested = 1; + } + + HaltParseThread(); // halt parsing + HaltGui(); + ResetBrowser(); + mainWindow->Remove(&titleTxt); + mainWindow->Remove(&buttonWindow); + mainWindow->Remove(&gameBrowser); + mainWindow->Remove(&bgPreview); + mainWindow->Remove(&preview); + MEM_DEALLOC(imgBuffer); + return menu; +} + +/**************************************************************************** + * ControllerWindowUpdate + * + * Callback for controller window. Responds to clicks on window elements. + ***************************************************************************/ +static void ControllerWindowUpdate(void * ptr, int dir) +{ + GuiButton * b = (GuiButton *)ptr; + if(b->GetState() == STATE_CLICKED) + { + GCSettings.Controller += dir; + + if(GCSettings.Controller > CTRL_PAD4) + GCSettings.Controller = CTRL_MOUSE; + if(GCSettings.Controller < CTRL_MOUSE) + GCSettings.Controller = CTRL_PAD4; + + settingText->SetText(ctrlName[GCSettings.Controller]); + b->ResetState(); + } +} + +/**************************************************************************** + * ControllerWindowLeftClick / ControllerWindowRightsClick + * + * Callbacks for controller window arrows. Responds arrow clicks. + ***************************************************************************/ +static void ControllerWindowLeftClick(void * ptr) { ControllerWindowUpdate(ptr, -1); } +static void ControllerWindowRightClick(void * ptr) { ControllerWindowUpdate(ptr, +1); } + +/**************************************************************************** + * ControllerWindow + * + * Opens a window to allow the user to select the controller to be used. + ***************************************************************************/ +static void ControllerWindow() +{ + GuiWindow * w = new GuiWindow(300,250); + w->SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + + GuiTrigger trigLeft; + trigLeft.SetButtonOnlyInFocusTrigger(-1, WPAD_BUTTON_LEFT | WPAD_CLASSIC_BUTTON_LEFT, PAD_BUTTON_LEFT); + + GuiTrigger trigRight; + trigRight.SetButtonOnlyInFocusTrigger(-1, WPAD_BUTTON_RIGHT | WPAD_CLASSIC_BUTTON_RIGHT, PAD_BUTTON_RIGHT); + + GuiImageData arrowLeft(button_arrow_left_png); + GuiImage arrowLeftImg(&arrowLeft); + GuiImageData arrowLeftOver(button_arrow_left_over_png); + GuiImage arrowLeftOverImg(&arrowLeftOver); + GuiButton arrowLeftBtn(arrowLeft.GetWidth(), arrowLeft.GetHeight()); + arrowLeftBtn.SetImage(&arrowLeftImg); + arrowLeftBtn.SetImageOver(&arrowLeftOverImg); + arrowLeftBtn.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + arrowLeftBtn.SetTrigger(trigA); + arrowLeftBtn.SetTrigger(trig2); + arrowLeftBtn.SetTrigger(&trigLeft); + arrowLeftBtn.SetSelectable(false); + arrowLeftBtn.SetUpdateCallback(ControllerWindowLeftClick); + + GuiImageData arrowRight(button_arrow_right_png); + GuiImage arrowRightImg(&arrowRight); + GuiImageData arrowRightOver(button_arrow_right_over_png); + GuiImage arrowRightOverImg(&arrowRightOver); + GuiButton arrowRightBtn(arrowRight.GetWidth(), arrowRight.GetHeight()); + arrowRightBtn.SetImage(&arrowRightImg); + arrowRightBtn.SetImageOver(&arrowRightOverImg); + arrowRightBtn.SetAlignment(ALIGN_RIGHT, ALIGN_MIDDLE); + arrowRightBtn.SetTrigger(trigA); + arrowRightBtn.SetTrigger(trig2); + arrowRightBtn.SetTrigger(&trigRight); + arrowRightBtn.SetSelectable(false); + arrowRightBtn.SetUpdateCallback(ControllerWindowRightClick); + + settingText = new GuiText(ctrlName[GCSettings.Controller], 22, (GXColor){0, 0, 0, 255}); + + int currentController = GCSettings.Controller; + + w->Append(&arrowLeftBtn); + w->Append(&arrowRightBtn); + w->Append(settingText); + + if(!SettingWindow("Controller",w)) + GCSettings.Controller = currentController; // undo changes + + delete(w); + delete(settingText); +} + +/**************************************************************************** + * MenuGame + * + * Menu displayed when returning to the menu from in-game. + ***************************************************************************/ +static int MenuGame() +{ + int menu = MENU_NONE; + + GuiText titleTxt((char *)Memory.ROMFilename, 22, (GXColor){255, 255, 255, 255}); + titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + titleTxt.SetPosition(50,50); + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_png); + GuiImageData btnOutlineOver(button_over_png); + GuiImageData btnCloseOutline(button_small_png); + GuiImageData btnCloseOutlineOver(button_small_over_png); + GuiImageData btnLargeOutline(button_large_png); + GuiImageData btnLargeOutlineOver(button_large_over_png); + GuiImageData iconGameSettings(icon_game_settings_png); + GuiImageData iconLoad(icon_game_load_png); + GuiImageData iconSave(icon_game_save_png); + GuiImageData iconReset(icon_game_reset_png); + + GuiImageData battery(battery_png); + GuiImageData batteryRed(battery_red_png); + GuiImageData batteryBar(battery_bar_png); + + GuiTrigger trigHome; + trigHome.SetButtonOnlyTrigger(-1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, 0); + + GuiText saveBtnTxt("Save", 22, (GXColor){0, 0, 0, 255}); + GuiImage saveBtnImg(&btnLargeOutline); + GuiImage saveBtnImgOver(&btnLargeOutlineOver); + GuiImage saveBtnIcon(&iconSave); + GuiButton saveBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + saveBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + saveBtn.SetPosition(-125, 120); + saveBtn.SetLabel(&saveBtnTxt); + saveBtn.SetImage(&saveBtnImg); + saveBtn.SetImageOver(&saveBtnImgOver); + saveBtn.SetIcon(&saveBtnIcon); + saveBtn.SetSoundOver(&btnSoundOver); + saveBtn.SetSoundClick(&btnSoundClick); + saveBtn.SetTrigger(trigA); + saveBtn.SetTrigger(trig2); + saveBtn.SetEffectGrow(); + + GuiText loadBtnTxt("Load", 22, (GXColor){0, 0, 0, 255}); + GuiImage loadBtnImg(&btnLargeOutline); + GuiImage loadBtnImgOver(&btnLargeOutlineOver); + GuiImage loadBtnIcon(&iconLoad); + GuiButton loadBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + loadBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + loadBtn.SetPosition(125, 120); + loadBtn.SetLabel(&loadBtnTxt); + loadBtn.SetImage(&loadBtnImg); + loadBtn.SetImageOver(&loadBtnImgOver); + loadBtn.SetIcon(&loadBtnIcon); + loadBtn.SetSoundOver(&btnSoundOver); + loadBtn.SetSoundClick(&btnSoundClick); + loadBtn.SetTrigger(trigA); + loadBtn.SetTrigger(trig2); + loadBtn.SetEffectGrow(); + + GuiText resetBtnTxt("Reset", 22, (GXColor){0, 0, 0, 255}); + GuiImage resetBtnImg(&btnLargeOutline); + GuiImage resetBtnImgOver(&btnLargeOutlineOver); + GuiImage resetBtnIcon(&iconReset); + GuiButton resetBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + resetBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + resetBtn.SetPosition(125, 250); + resetBtn.SetLabel(&resetBtnTxt); + resetBtn.SetImage(&resetBtnImg); + resetBtn.SetImageOver(&resetBtnImgOver); + resetBtn.SetIcon(&resetBtnIcon); + resetBtn.SetSoundOver(&btnSoundOver); + resetBtn.SetSoundClick(&btnSoundClick); + resetBtn.SetTrigger(trigA); + resetBtn.SetTrigger(trig2); + resetBtn.SetEffectGrow(); + + GuiText gameSettingsBtnTxt("Game Settings", 22, (GXColor){0, 0, 0, 255}); + gameSettingsBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-20); + GuiImage gameSettingsBtnImg(&btnLargeOutline); + GuiImage gameSettingsBtnImgOver(&btnLargeOutlineOver); + GuiImage gameSettingsBtnIcon(&iconGameSettings); + GuiButton gameSettingsBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + gameSettingsBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + gameSettingsBtn.SetPosition(-125, 250); + gameSettingsBtn.SetLabel(&gameSettingsBtnTxt); + gameSettingsBtn.SetImage(&gameSettingsBtnImg); + gameSettingsBtn.SetImageOver(&gameSettingsBtnImgOver); + gameSettingsBtn.SetIcon(&gameSettingsBtnIcon); + gameSettingsBtn.SetSoundOver(&btnSoundOver); + gameSettingsBtn.SetSoundClick(&btnSoundClick); + gameSettingsBtn.SetTrigger(trigA); + gameSettingsBtn.SetTrigger(trig2); + gameSettingsBtn.SetEffectGrow(); + + char Lable[28]; + snprintf(Lable, sizeof(Lable), "Back to %s", GCSettings.LoaderName); + GuiText mainmenuBtnTxt(Lable, 22, (GXColor){0, 0, 0, 255}); + GuiImage mainmenuBtnImg(&btnOutline); + GuiImage mainmenuBtnImgOver(&btnOutlineOver); + GuiButton mainmenuBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + mainmenuBtn.SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM); + mainmenuBtn.SetPosition(0, -35); + mainmenuBtn.SetLabel(&mainmenuBtnTxt); + mainmenuBtn.SetImage(&mainmenuBtnImg); + mainmenuBtn.SetImageOver(&mainmenuBtnImgOver); + mainmenuBtn.SetSoundOver(&btnSoundOver); + mainmenuBtn.SetSoundClick(&btnSoundClick); + mainmenuBtn.SetTrigger(trigA); + mainmenuBtn.SetTrigger(trig2); + mainmenuBtn.SetEffectGrow(); + + GuiText closeBtnTxt("Close", 20, (GXColor){0, 0, 0, 255}); + GuiImage closeBtnImg(&btnCloseOutline); + GuiImage closeBtnImgOver(&btnCloseOutlineOver); + GuiButton closeBtn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); + closeBtn.SetAlignment(ALIGN_RIGHT, ALIGN_TOP); + closeBtn.SetPosition(-50, 35); + closeBtn.SetLabel(&closeBtnTxt); + closeBtn.SetImage(&closeBtnImg); + closeBtn.SetImageOver(&closeBtnImgOver); + closeBtn.SetSoundOver(&btnSoundOver); + closeBtn.SetSoundClick(&btnSoundClick); + closeBtn.SetTrigger(trigA); + closeBtn.SetTrigger(trig2); + closeBtn.SetTrigger(&trigHome); + closeBtn.SetEffectGrow(); + + #ifdef HW_RVL + int i; + char txt[3]; + bool status[4] = { false, false, false, false }; + int level[4] = { 0, 0, 0, 0 }; + bool newStatus; + int newLevel; + GuiText * batteryTxt[4]; + GuiImage * batteryImg[4]; + GuiImage * batteryBarImg[4]; + GuiButton * batteryBtn[4]; + + for(i=0; i < 4; i++) + { + sprintf(txt, "P%d", i+1); + + batteryTxt[i] = new GuiText(txt, 20, (GXColor){255, 255, 255, 255}); + batteryTxt[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + batteryImg[i] = new GuiImage(&battery); + batteryImg[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + batteryImg[i]->SetPosition(30, 0); + batteryBarImg[i] = new GuiImage(&batteryBar); + batteryBarImg[i]->SetTile(0); + batteryBarImg[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + batteryBarImg[i]->SetPosition(34, 0); + + batteryBtn[i] = new GuiButton(70, 20); + batteryBtn[i]->SetLabel(batteryTxt[i]); + batteryBtn[i]->SetImage(batteryImg[i]); + batteryBtn[i]->SetIcon(batteryBarImg[i]); + batteryBtn[i]->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + batteryBtn[i]->SetRumble(false); + batteryBtn[i]->SetSelectable(false); + batteryBtn[i]->SetAlpha(150); + } + + batteryBtn[0]->SetPosition(45, -65); + batteryBtn[1]->SetPosition(135, -65); + batteryBtn[2]->SetPosition(45, -40); + batteryBtn[3]->SetPosition(135, -40); + #endif + + HaltGui(); + GuiWindow w(screenwidth, screenheight); + w.Append(&titleTxt); + w.Append(&saveBtn); + w.Append(&loadBtn); + w.Append(&resetBtn); + w.Append(&gameSettingsBtn); + + #ifdef HW_RVL + w.Append(batteryBtn[0]); + w.Append(batteryBtn[1]); + w.Append(batteryBtn[2]); + w.Append(batteryBtn[3]); + #endif + + w.Append(&mainmenuBtn); + w.Append(&closeBtn); + + btnLogo->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); + btnLogo->SetPosition(-50, -40); + mainWindow->Append(&w); + + if(lastMenu == MENU_NONE) + { + enterSound->Play(); + bgTopImg->SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 35); + closeBtn.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 35); + titleTxt.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 35); + mainmenuBtn.SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_IN, 35); + bgBottomImg->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_IN, 35); + btnLogo->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_IN, 35); + #ifdef HW_RVL + batteryBtn[0]->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_IN, 35); + batteryBtn[1]->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_IN, 35); + batteryBtn[2]->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_IN, 35); + batteryBtn[3]->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_IN, 35); + #endif + + w.SetEffect(EFFECT_FADE, 15); + } + + ResumeGui(); + + if(lastMenu == MENU_NONE) + AutoSave(); + + while(menu == MENU_NONE) + { + usleep(THREAD_SLEEP); + + #ifdef HW_RVL + for(i=0; i < 4; i++) + { + if(WPAD_Probe(i, NULL) == WPAD_ERR_NONE) + { + newStatus = true; + newLevel = (userInput[i].wpad->battery_level / 100.0) * 4; + if(newLevel > 4) newLevel = 4; + } + else + { + newStatus = false; + newLevel = 0; + } + + if(status[i] != newStatus || level[i] != newLevel) + { + if(newStatus == true) // controller connected + { + batteryBtn[i]->SetAlpha(255); + batteryBarImg[i]->SetTile(newLevel); + + if(newLevel == 0) + batteryImg[i]->SetImage(&batteryRed); + else + batteryImg[i]->SetImage(&battery); + } + else // controller not connected + { + batteryBtn[i]->SetAlpha(150); + batteryBarImg[i]->SetTile(0); + batteryImg[i]->SetImage(&battery); + } + status[i] = newStatus; + level[i] = newLevel; + } + } + #endif + + if(saveBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAME_SAVE; + } + else if(loadBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAME_LOAD; + } + else if(resetBtn.GetState() == STATE_CLICKED) + { + if (WindowPrompt("Reset Game", "Are you sure that you want to reset this game? Any unsaved progress will be lost.", "OK", "Cancel")) + { + S9xSoftReset (); + menu = MENU_EXIT; + } + } + else if(gameSettingsBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAMESETTINGS; + } + else if(mainmenuBtn.GetState() == STATE_CLICKED) + { + if (WindowPrompt("Quit Game", "Quit this game? Any unsaved progress will be lost.", "OK", "Cancel")) + { + HaltGui(); + mainWindow->Remove(gameScreenImg); + delete gameScreenImg; + delete gameScreen; + gameScreen = NULL; + free(gameScreenPng); + gameScreenPng = NULL; + ExitToWiiflow(); + } + } + else if(closeBtn.GetState() == STATE_CLICKED) + { + menu = MENU_EXIT; + + exitSound->Play(); + bgTopImg->SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); + closeBtn.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); + titleTxt.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); + mainmenuBtn.SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); + bgBottomImg->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); + btnLogo->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); + #ifdef HW_RVL + batteryBtn[0]->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); + batteryBtn[1]->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); + batteryBtn[2]->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); + batteryBtn[3]->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); + #endif + + w.SetEffect(EFFECT_FADE, -15); + usleep(350000); // wait for effects to finish + } + } + + HaltGui(); + + #ifdef HW_RVL + for(i=0; i < 4; i++) + { + delete batteryTxt[i]; + delete batteryImg[i]; + delete batteryBarImg[i]; + delete batteryBtn[i]; + } + #endif + + mainWindow->Remove(&w); + return menu; +} + +/**************************************************************************** + * FindGameSaveNum + * + * Determines the save file number of the given file name + * Returns -1 if none is found + ***************************************************************************/ +static int FindGameSaveNum(char * savefile, int device) +{ + int n = -1; + int romlen = strlen(Memory.ROMFilename); + int savelen = strlen(savefile); + + int diff = savelen-romlen; + + if(strncmp(savefile, Memory.ROMFilename, romlen) != 0) + return -1; + + if(savefile[romlen] == ' ') + { + if(diff == 5 && strncmp(&savefile[romlen+1], "Auto", 4) == 0) + n = 0; // found Auto save + else if(diff == 2 || diff == 3) + n = atoi(&savefile[romlen+1]); + } + + if(n >= 0 && n < MAX_SAVES) + return n; + else + return -1; +} + +/**************************************************************************** + * MenuGameSaves + * + * Allows the user to load or save progress. + ***************************************************************************/ +static int MenuGameSaves(int action) +{ + int menu = MENU_NONE; + int ret; + int i, n, type, len, len2; + int j = 0; + SaveList saves; + char filepath[1024]; + char scrfile[1024]; + char tmp[MAXJOLIET+1]; + struct stat filestat; + struct tm * timeinfo; + int device = GCSettings.SaveMethod; + + if(device == DEVICE_AUTO) + autoSaveMethod(NOTSILENT); + + if(!ChangeInterface(device, NOTSILENT)) + return MENU_GAME; + + GuiText titleTxt(NULL, 26, (GXColor){255, 255, 255, 255}); + titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + titleTxt.SetPosition(50,50); + + if(action == 0) + titleTxt.SetText("Load Game"); + else + titleTxt.SetText("Save Game"); + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_png); + GuiImageData btnOutlineOver(button_over_png); + GuiImageData btnCloseOutline(button_small_png); + GuiImageData btnCloseOutlineOver(button_small_over_png); + + GuiTrigger trigHome; + trigHome.SetButtonOnlyTrigger(-1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, 0); + + GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); + GuiImage backBtnImg(&btnOutline); + GuiImage backBtnImgOver(&btnOutlineOver); + GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + backBtn.SetPosition(50, -35); + backBtn.SetLabel(&backBtnTxt); + backBtn.SetImage(&backBtnImg); + backBtn.SetImageOver(&backBtnImgOver); + backBtn.SetSoundOver(&btnSoundOver); + backBtn.SetSoundClick(&btnSoundClick); + backBtn.SetTrigger(trigA); + backBtn.SetTrigger(trig2); + backBtn.SetEffectGrow(); + + GuiText closeBtnTxt("Close", 20, (GXColor){0, 0, 0, 255}); + GuiImage closeBtnImg(&btnCloseOutline); + GuiImage closeBtnImgOver(&btnCloseOutlineOver); + GuiButton closeBtn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); + closeBtn.SetAlignment(ALIGN_RIGHT, ALIGN_TOP); + closeBtn.SetPosition(-50, 35); + closeBtn.SetLabel(&closeBtnTxt); + closeBtn.SetImage(&closeBtnImg); + closeBtn.SetImageOver(&closeBtnImgOver); + closeBtn.SetSoundOver(&btnSoundOver); + closeBtn.SetSoundClick(&btnSoundClick); + closeBtn.SetTrigger(trigA); + closeBtn.SetTrigger(trig2); + closeBtn.SetTrigger(&trigHome); + closeBtn.SetEffectGrow(); + + HaltGui(); + GuiWindow w(screenwidth, screenheight); + w.Append(&backBtn); + w.Append(&closeBtn); + mainWindow->Append(&w); + mainWindow->Append(&titleTxt); + ResumeGui(); + + memset(&saves, 0, sizeof(saves)); + + sprintf(browser.dir, "%s%s", pathPrefix[GCSettings.SaveMethod], GCSettings.SaveFolder); + ParseDirectory(true, false); + + len = strlen(Memory.ROMFilename); + + // find matching files + AllocSaveBuffer(); + + for(i=0; i < browser.numEntries; i++) + { + len2 = strlen(browserList[i].filename); + + if(len2 < 6 || len2-len < 5) + continue; + + if(strncmp(&browserList[i].filename[len2-4], ".srm", 4) == 0) + type = FILE_SRAM; + else if(strncmp(&browserList[i].filename[len2-4], ".frz", 4) == 0) + type = FILE_SNAPSHOT; + else + continue; + + strcpy(tmp, browserList[i].filename); + tmp[len2-4] = 0; + n = FindGameSaveNum(tmp, device); + + if(n >= 0) + { + saves.type[j] = type; + saves.files[saves.type[j]][n] = 1; + strcpy(saves.filename[j], browserList[i].filename); + + if(saves.type[j] == FILE_SNAPSHOT) + { + sprintf(scrfile, "%s%s/%s.png", pathPrefix[GCSettings.SaveMethod], GCSettings.SaveFolder, tmp); + + memset(savebuffer, 0, SAVEBUFFERSIZE); + if(LoadFile(scrfile, SILENT)) + saves.previewImg[j] = new GuiImageData(savebuffer, 64, 48); + } + snprintf(filepath, 1024, "%s%s/%s", pathPrefix[GCSettings.SaveMethod], GCSettings.SaveFolder, saves.filename[j]); + if (stat(filepath, &filestat) == 0) + { + timeinfo = localtime(&filestat.st_mtime); + strftime(saves.date[j], 20, "%a %b %d", timeinfo); + strftime(saves.time[j], 10, "%I:%M %p", timeinfo); + } + j++; + } + } + + FreeSaveBuffer(); + saves.length = j; + + if(saves.length == 0 && action == 0) + { + InfoPrompt("No game saves found."); + menu = MENU_GAME; + } + + GuiSaveBrowser saveBrowser(552, 248, &saves, action); + saveBrowser.SetPosition(0, 108); + saveBrowser.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + + HaltGui(); + mainWindow->Append(&saveBrowser); + mainWindow->ChangeFocus(&saveBrowser); + ResumeGui(); + + while(menu == MENU_NONE) + { + usleep(THREAD_SLEEP); + + ret = saveBrowser.GetClickedSave(); + + // load or save game + if(ret > -3) + { + int result = 0; + + if(action == 0) // load + { + MakeFilePath(filepath, saves.type[ret], saves.filename[ret]); + switch(saves.type[ret]) + { + case FILE_SRAM: + result = LoadSRAM(filepath, NOTSILENT); + break; + case FILE_SNAPSHOT: + result = LoadSnapshot (filepath, NOTSILENT); + break; + } + if(result) + menu = MENU_EXIT; + } + else // save + { + if(ret == -2) // new SRAM + { + for(i=1; i < 100; i++) + if(saves.files[FILE_SRAM][i] == 0) + break; + + if(i < 100) + { + MakeFilePath(filepath, FILE_SRAM, Memory.ROMFilename, i); + SaveSRAM(filepath, NOTSILENT); + menu = MENU_GAME_SAVE; + } + } + else if(ret == -1) // new Snapshot + { + for(i=1; i < 100; i++) + if(saves.files[FILE_SNAPSHOT][i] == 0) + break; + + if(i < 100) + { + MakeFilePath(filepath, FILE_SNAPSHOT, Memory.ROMFilename, i); + SaveSnapshot (filepath, NOTSILENT); + menu = MENU_GAME_SAVE; + } + } + else // overwrite SRAM/Snapshot + { + MakeFilePath(filepath, saves.type[ret], saves.filename[ret]); + switch(saves.type[ret]) + { + case FILE_SRAM: + SaveSRAM(filepath, NOTSILENT); + break; + case FILE_SNAPSHOT: + SaveSnapshot (filepath, NOTSILENT); + break; + } + menu = MENU_GAME_SAVE; + } + } + } + + if(backBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAME; + } + else if(closeBtn.GetState() == STATE_CLICKED) + { + menu = MENU_EXIT; + + exitSound->Play(); + bgTopImg->SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); + closeBtn.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); + titleTxt.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); + backBtn.SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); + bgBottomImg->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); + btnLogo->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); + + w.SetEffect(EFFECT_FADE, -15); + + usleep(350000); // wait for effects to finish + } + } + + HaltGui(); + + for(i=0; i < saves.length; i++) + if(saves.previewImg[i]) + delete saves.previewImg[i]; + + mainWindow->Remove(&saveBrowser); + mainWindow->Remove(&w); + mainWindow->Remove(&titleTxt); + ResetBrowser(); + return menu; +} + +/**************************************************************************** + * MenuGameSettings + ***************************************************************************/ +static int MenuGameSettings() +{ + int menu = MENU_NONE; + char filepath[1024]; + + GuiText titleTxt("Game Settings", 26, (GXColor){255, 255, 255, 255}); + titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + titleTxt.SetPosition(50,50); + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_png); + GuiImageData btnOutlineOver(button_over_png); + GuiImageData btnLargeOutline(button_large_png); + GuiImageData btnLargeOutlineOver(button_large_over_png); + GuiImageData iconMappings(icon_settings_mappings_png); + GuiImageData iconVideo(icon_settings_video_png); + GuiImageData iconController(icon_game_controllers_png); + GuiImageData iconCheats(icon_game_cheats_png); + GuiImageData iconScreenshot(icon_settings_screenshot_png); + GuiImageData btnCloseOutline(button_small_png); + GuiImageData btnCloseOutlineOver(button_small_over_png); + + GuiTrigger trigHome; + trigHome.SetButtonOnlyTrigger(-1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, 0); + + GuiText mappingBtnTxt("Button Mappings", 22, (GXColor){0, 0, 0, 255}); + mappingBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-30); + GuiImage mappingBtnImg(&btnLargeOutline); + GuiImage mappingBtnImgOver(&btnLargeOutlineOver); + GuiImage mappingBtnIcon(&iconMappings); + GuiButton mappingBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + mappingBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + mappingBtn.SetPosition(-125, 120); + mappingBtn.SetLabel(&mappingBtnTxt); + mappingBtn.SetImage(&mappingBtnImg); + mappingBtn.SetImageOver(&mappingBtnImgOver); + mappingBtn.SetIcon(&mappingBtnIcon); + mappingBtn.SetSoundOver(&btnSoundOver); + mappingBtn.SetSoundClick(&btnSoundClick); + mappingBtn.SetTrigger(trigA); + mappingBtn.SetTrigger(trig2); + mappingBtn.SetEffectGrow(); + + GuiText videoBtnTxt("Video", 22, (GXColor){0, 0, 0, 255}); + videoBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-20); + GuiImage videoBtnImg(&btnLargeOutline); + GuiImage videoBtnImgOver(&btnLargeOutlineOver); + GuiImage videoBtnIcon(&iconVideo); + GuiButton videoBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + videoBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + videoBtn.SetPosition(125, 120); + videoBtn.SetLabel(&videoBtnTxt); + videoBtn.SetImage(&videoBtnImg); + videoBtn.SetImageOver(&videoBtnImgOver); + videoBtn.SetIcon(&videoBtnIcon); + videoBtn.SetSoundOver(&btnSoundOver); + videoBtn.SetSoundClick(&btnSoundClick); + videoBtn.SetTrigger(trigA); + videoBtn.SetTrigger(trig2); + videoBtn.SetEffectGrow(); + + GuiText controllerBtnTxt("Controller", 22, (GXColor){0, 0, 0, 255}); + GuiImage controllerBtnImg(&btnLargeOutline); + GuiImage controllerBtnImgOver(&btnLargeOutlineOver); + GuiImage controllerBtnIcon(&iconController); + GuiButton controllerBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + controllerBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + controllerBtn.SetPosition(-200, 250); + controllerBtn.SetLabel(&controllerBtnTxt); + controllerBtn.SetImage(&controllerBtnImg); + controllerBtn.SetImageOver(&controllerBtnImgOver); + controllerBtn.SetIcon(&controllerBtnIcon); + controllerBtn.SetSoundOver(&btnSoundOver); + controllerBtn.SetSoundClick(&btnSoundClick); + controllerBtn.SetTrigger(trigA); + controllerBtn.SetTrigger(trig2); + controllerBtn.SetEffectGrow(); + + GuiText screenshotBtnTxt("ScreenShot", 22, (GXColor){0, 0, 0, 255}); + GuiImage screenshotBtnImg(&btnLargeOutline); + GuiImage screenshotBtnImgOver(&btnLargeOutlineOver); + GuiImage screenshotBtnIcon(&iconScreenshot); + GuiButton screenshotBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + screenshotBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + screenshotBtn.SetPosition(0, 250); + screenshotBtn.SetLabel(&screenshotBtnTxt); + screenshotBtn.SetImage(&screenshotBtnImg); + screenshotBtn.SetImageOver(&screenshotBtnImgOver); + screenshotBtn.SetIcon(&screenshotBtnIcon); + screenshotBtn.SetSoundOver(&btnSoundOver); + screenshotBtn.SetSoundClick(&btnSoundClick); + screenshotBtn.SetTrigger(trigA); + screenshotBtn.SetTrigger(trig2); + screenshotBtn.SetEffectGrow(); + + GuiText cheatsBtnTxt("Cheats", 22, (GXColor){0, 0, 0, 255}); + GuiImage cheatsBtnImg(&btnLargeOutline); + GuiImage cheatsBtnImgOver(&btnLargeOutlineOver); + GuiImage cheatsBtnIcon(&iconCheats); + GuiButton cheatsBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + cheatsBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + cheatsBtn.SetPosition(200, 250); + cheatsBtn.SetLabel(&cheatsBtnTxt); + cheatsBtn.SetImage(&cheatsBtnImg); + cheatsBtn.SetImageOver(&cheatsBtnImgOver); + cheatsBtn.SetIcon(&cheatsBtnIcon); + cheatsBtn.SetSoundOver(&btnSoundOver); + cheatsBtn.SetSoundClick(&btnSoundClick); + cheatsBtn.SetTrigger(trigA); + cheatsBtn.SetTrigger(trig2); + cheatsBtn.SetEffectGrow(); + + GuiText closeBtnTxt("Close", 20, (GXColor){0, 0, 0, 255}); + GuiImage closeBtnImg(&btnCloseOutline); + GuiImage closeBtnImgOver(&btnCloseOutlineOver); + GuiButton closeBtn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); + closeBtn.SetAlignment(ALIGN_RIGHT, ALIGN_TOP); + closeBtn.SetPosition(-50, 35); + closeBtn.SetLabel(&closeBtnTxt); + closeBtn.SetImage(&closeBtnImg); + closeBtn.SetImageOver(&closeBtnImgOver); + closeBtn.SetSoundOver(&btnSoundOver); + closeBtn.SetSoundClick(&btnSoundClick); + closeBtn.SetTrigger(trigA); + closeBtn.SetTrigger(trig2); + closeBtn.SetTrigger(&trigHome); + closeBtn.SetEffectGrow(); + + GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); + GuiImage backBtnImg(&btnOutline); + GuiImage backBtnImgOver(&btnOutlineOver); + GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + backBtn.SetPosition(50, -35); + backBtn.SetLabel(&backBtnTxt); + backBtn.SetImage(&backBtnImg); + backBtn.SetImageOver(&backBtnImgOver); + backBtn.SetSoundOver(&btnSoundOver); + backBtn.SetSoundClick(&btnSoundClick); + backBtn.SetTrigger(trigA); + backBtn.SetTrigger(trig2); + backBtn.SetEffectGrow(); + + HaltGui(); + GuiWindow w(screenwidth, screenheight); + w.Append(&titleTxt); + w.Append(&mappingBtn); + w.Append(&videoBtn); + w.Append(&controllerBtn); + w.Append(&screenshotBtn); + w.Append(&cheatsBtn); + w.Append(&closeBtn); + w.Append(&backBtn); + + mainWindow->Append(&w); + + ResumeGui(); + + while(menu == MENU_NONE) + { + usleep(THREAD_SLEEP); + + if(mappingBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAMESETTINGS_MAPPINGS; + } + else if(videoBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAMESETTINGS_VIDEO; + } + else if(controllerBtn.GetState() == STATE_CLICKED) + { + ControllerWindow(); + } + else if(cheatsBtn.GetState() == STATE_CLICKED) + { + cheatsBtn.ResetState(); + if(Cheat.num_cheats > 0) + menu = MENU_GAMESETTINGS_CHEATS; + else + InfoPrompt("Cheats file not found!"); + } + else if(screenshotBtn.GetState() == STATE_CLICKED) + { + if (WindowPrompt("Preview Screenshot", "Save a new Preview Screenshot? Current Screenshot image will be overwritten.", "OK", "Cancel")) + { + snprintf(filepath, 1024, "%s%s/%s", pathPrefix[GCSettings.SaveMethod], GCSettings.ScreenshotsFolder, Memory.ROMFilename); + SavePreviewImg(filepath, NOTSILENT); + } + } + else if(closeBtn.GetState() == STATE_CLICKED) + { + menu = MENU_EXIT; + + exitSound->Play(); + bgTopImg->SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); + closeBtn.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); + titleTxt.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); + backBtn.SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); + bgBottomImg->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); + btnLogo->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); + + w.SetEffect(EFFECT_FADE, -15); + + usleep(350000); // wait for effects to finish + } + else if(backBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAME; + } + } + + HaltGui(); + mainWindow->Remove(&w); + return menu; +} + +/**************************************************************************** + * MenuGameCheats + * + * Displays a list of cheats available, and allows the user to enable/disable + * them. + ***************************************************************************/ +static int MenuGameCheats() +{ + int menu = MENU_NONE; + int ret; + u16 i = 0; + OptionList options; + + for(i=0; i < Cheat.num_cheats; i++) + { + sprintf (options.name[i], "%s", Cheat.c[i].name); + sprintf (options.value[i], "%s", Cheat.c[i].enabled == true ? "On" : "Off"); + } + + options.length = i; + + GuiText titleTxt("Game Settings - Cheats", 26, (GXColor){255, 255, 255, 255}); + titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + titleTxt.SetPosition(50,50); + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_png); + GuiImageData btnOutlineOver(button_over_png); + + GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); + GuiImage backBtnImg(&btnOutline); + GuiImage backBtnImgOver(&btnOutlineOver); + GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + backBtn.SetPosition(50, -35); + backBtn.SetLabel(&backBtnTxt); + backBtn.SetImage(&backBtnImg); + backBtn.SetImageOver(&backBtnImgOver); + backBtn.SetSoundOver(&btnSoundOver); + backBtn.SetSoundClick(&btnSoundClick); + backBtn.SetTrigger(trigA); + backBtn.SetTrigger(trig2); + backBtn.SetEffectGrow(); + + GuiOptionBrowser optionBrowser(552, 248, &options); + optionBrowser.SetPosition(0, 108); + optionBrowser.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + + HaltGui(); + GuiWindow w(screenwidth, screenheight); + w.Append(&backBtn); + mainWindow->Append(&optionBrowser); + mainWindow->Append(&w); + mainWindow->Append(&titleTxt); + ResumeGui(); + + while(menu == MENU_NONE) + { + usleep(THREAD_SLEEP); + + ret = optionBrowser.GetClickedOption(); + + if(ret >= 0) + { + if(Cheat.c[ret].enabled) + S9xDisableCheat(ret); + else + S9xEnableCheat(ret); + sprintf (options.value[ret], "%s", Cheat.c[ret].enabled == true ? "On" : "Off"); + optionBrowser.TriggerUpdate(); + } + + if(backBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAMESETTINGS; + } + } + HaltGui(); + mainWindow->Remove(&optionBrowser); + mainWindow->Remove(&w); + mainWindow->Remove(&titleTxt); + return menu; +} + +/**************************************************************************** + * MenuSettingsMappings + ***************************************************************************/ +static int MenuSettingsMappings() +{ + int menu = MENU_NONE; + + GuiText titleTxt("Game Settings - Button Mappings", 26, (GXColor){255, 255, 255, 255}); + titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + titleTxt.SetPosition(50,50); + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_png); + GuiImageData btnOutlineOver(button_over_png); + GuiImageData btnLargeOutline(button_large_png); + GuiImageData btnLargeOutlineOver(button_large_over_png); + GuiImageData iconSNESController(icon_settings_snescontroller_png); + GuiImageData iconSuperscope(icon_settings_superscope_png); + GuiImageData iconJustifier(icon_settings_justifier_png); + GuiImageData iconMouse(icon_settings_mouse_png); + + GuiText snesBtnTxt("SNES Controller", 22, (GXColor){0, 0, 0, 255}); + snesBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-40); + GuiImage snesBtnImg(&btnLargeOutline); + GuiImage snesBtnImgOver(&btnLargeOutlineOver); + GuiImage snesBtnIcon(&iconSNESController); + GuiButton snesBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + snesBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + snesBtn.SetPosition(-125, 120); + snesBtn.SetLabel(&snesBtnTxt); + snesBtn.SetImage(&snesBtnImg); + snesBtn.SetImageOver(&snesBtnImgOver); + snesBtn.SetIcon(&snesBtnIcon); + snesBtn.SetSoundOver(&btnSoundOver); + snesBtn.SetSoundClick(&btnSoundClick); + snesBtn.SetTrigger(trigA); + snesBtn.SetTrigger(trig2); + snesBtn.SetEffectGrow(); + + GuiText superscopeBtnTxt("Super Scope", 22, (GXColor){0, 0, 0, 255}); + superscopeBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-20); + GuiImage superscopeBtnImg(&btnLargeOutline); + GuiImage superscopeBtnImgOver(&btnLargeOutlineOver); + GuiImage superscopeBtnIcon(&iconSuperscope); + GuiButton superscopeBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + superscopeBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + superscopeBtn.SetPosition(125, 120); + superscopeBtn.SetLabel(&superscopeBtnTxt); + superscopeBtn.SetImage(&superscopeBtnImg); + superscopeBtn.SetImageOver(&superscopeBtnImgOver); + superscopeBtn.SetIcon(&superscopeBtnIcon); + superscopeBtn.SetSoundOver(&btnSoundOver); + superscopeBtn.SetSoundClick(&btnSoundClick); + superscopeBtn.SetTrigger(trigA); + superscopeBtn.SetTrigger(trig2); + superscopeBtn.SetEffectGrow(); + + GuiText mouseBtnTxt("SNES Mouse", 22, (GXColor){0, 0, 0, 255}); + mouseBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-55); + GuiImage mouseBtnImg(&btnLargeOutline); + GuiImage mouseBtnImgOver(&btnLargeOutlineOver); + GuiImage mouseBtnIcon(&iconMouse); + GuiButton mouseBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + mouseBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + mouseBtn.SetPosition(-125, 250); + mouseBtn.SetLabel(&mouseBtnTxt); + mouseBtn.SetImage(&mouseBtnImg); + mouseBtn.SetImageOver(&mouseBtnImgOver); + mouseBtn.SetIcon(&mouseBtnIcon); + mouseBtn.SetSoundOver(&btnSoundOver); + mouseBtn.SetSoundClick(&btnSoundClick); + mouseBtn.SetTrigger(trigA); + mouseBtn.SetTrigger(trig2); + mouseBtn.SetEffectGrow(); + + GuiText justifierBtnTxt("Justifier", 22, (GXColor){0, 0, 0, 255}); + GuiImage justifierBtnImg(&btnLargeOutline); + GuiImage justifierBtnImgOver(&btnLargeOutlineOver); + GuiImage justifierBtnIcon(&iconJustifier); + GuiButton justifierBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + justifierBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + justifierBtn.SetPosition(125, 250); + justifierBtn.SetLabel(&justifierBtnTxt); + justifierBtn.SetImage(&justifierBtnImg); + justifierBtn.SetImageOver(&justifierBtnImgOver); + justifierBtn.SetIcon(&justifierBtnIcon); + justifierBtn.SetSoundOver(&btnSoundOver); + justifierBtn.SetSoundClick(&btnSoundClick); + justifierBtn.SetTrigger(trigA); + justifierBtn.SetTrigger(trig2); + justifierBtn.SetEffectGrow(); + + GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); + GuiImage backBtnImg(&btnOutline); + GuiImage backBtnImgOver(&btnOutlineOver); + GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + backBtn.SetPosition(50, -35); + backBtn.SetLabel(&backBtnTxt); + backBtn.SetImage(&backBtnImg); + backBtn.SetImageOver(&backBtnImgOver); + backBtn.SetSoundOver(&btnSoundOver); + backBtn.SetSoundClick(&btnSoundClick); + backBtn.SetTrigger(trigA); + backBtn.SetTrigger(trig2); + backBtn.SetEffectGrow(); + + HaltGui(); + GuiWindow w(screenwidth, screenheight); + w.Append(&titleTxt); + w.Append(&snesBtn); + w.Append(&superscopeBtn); + w.Append(&mouseBtn); + w.Append(&justifierBtn); + + w.Append(&backBtn); + + mainWindow->Append(&w); + + ResumeGui(); + + while(menu == MENU_NONE) + { + usleep(THREAD_SLEEP); + + if(snesBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAMESETTINGS_MAPPINGS_CTRL; + mapMenuCtrlSNES = CTRL_PAD; + } + else if(superscopeBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAMESETTINGS_MAPPINGS_CTRL; + mapMenuCtrlSNES = CTRL_SCOPE; + } + else if(mouseBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAMESETTINGS_MAPPINGS_CTRL; + mapMenuCtrlSNES = CTRL_MOUSE; + } + else if(justifierBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAMESETTINGS_MAPPINGS_CTRL; + mapMenuCtrlSNES = CTRL_JUST; + } + else if(backBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAMESETTINGS; + } + } + HaltGui(); + mainWindow->Remove(&w); + return menu; +} + +static int MenuSettingsMappingsController() +{ + int menu = MENU_NONE; + char menuTitle[100]; + char menuSubtitle[100]; + + sprintf(menuTitle, "Game Settings - Button Mappings"); + GuiText titleTxt(menuTitle, 26, (GXColor){255, 255, 255, 255}); + titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + titleTxt.SetPosition(50,30); + + sprintf(menuSubtitle, "%s", ctrlName[mapMenuCtrlSNES]); + GuiText subtitleTxt(menuSubtitle, 20, (GXColor){255, 255, 255, 255}); + subtitleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + subtitleTxt.SetPosition(50,60); + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_png); + GuiImageData btnOutlineOver(button_over_png); + GuiImageData btnLargeOutline(button_large_png); + GuiImageData btnLargeOutlineOver(button_large_over_png); + GuiImageData iconWiimote(icon_settings_wiimote_png); + GuiImageData iconClassic(icon_settings_classic_png); + GuiImageData iconGamecube(icon_settings_gamecube_png); + GuiImageData iconNunchuk(icon_settings_nunchuk_png); + GuiImageData iconWiiupro(icon_settings_wiiupro_png); + + GuiText gamecubeBtnTxt("GameCube Controller", 22, (GXColor){0, 0, 0, 255}); + gamecubeBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-20); + GuiImage gamecubeBtnImg(&btnLargeOutline); + GuiImage gamecubeBtnImgOver(&btnLargeOutlineOver); + GuiImage gamecubeBtnIcon(&iconGamecube); + GuiButton gamecubeBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + gamecubeBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + gamecubeBtn.SetPosition(-125, 120); + gamecubeBtn.SetLabel(&gamecubeBtnTxt); + gamecubeBtn.SetImage(&gamecubeBtnImg); + gamecubeBtn.SetImageOver(&gamecubeBtnImgOver); + gamecubeBtn.SetIcon(&gamecubeBtnIcon); + gamecubeBtn.SetSoundOver(&btnSoundOver); + gamecubeBtn.SetSoundClick(&btnSoundClick); + gamecubeBtn.SetTrigger(trigA); + gamecubeBtn.SetTrigger(trig2); + gamecubeBtn.SetEffectGrow(); + + GuiText wiimoteBtnTxt("Wiimote", 22, (GXColor){0, 0, 0, 255}); + GuiImage wiimoteBtnImg(&btnLargeOutline); + GuiImage wiimoteBtnImgOver(&btnLargeOutlineOver); + GuiImage wiimoteBtnIcon(&iconWiimote); + GuiButton wiimoteBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + wiimoteBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + wiimoteBtn.SetPosition(125, 120); + wiimoteBtn.SetLabel(&wiimoteBtnTxt); + wiimoteBtn.SetImage(&wiimoteBtnImg); + wiimoteBtn.SetImageOver(&wiimoteBtnImgOver); + wiimoteBtn.SetIcon(&wiimoteBtnIcon); + wiimoteBtn.SetSoundOver(&btnSoundOver); + wiimoteBtn.SetSoundClick(&btnSoundClick); + wiimoteBtn.SetTrigger(trigA); + wiimoteBtn.SetTrigger(trig2); + wiimoteBtn.SetEffectGrow(); + + GuiText classicBtnTxt("Classic Controller", 22, (GXColor){0, 0, 0, 255}); + classicBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-20); + GuiImage classicBtnImg(&btnLargeOutline); + GuiImage classicBtnImgOver(&btnLargeOutlineOver); + GuiImage classicBtnIcon(&iconClassic); + GuiButton classicBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + classicBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + classicBtn.SetPosition(-200, 250); + classicBtn.SetLabel(&classicBtnTxt); + classicBtn.SetImage(&classicBtnImg); + classicBtn.SetImageOver(&classicBtnImgOver); + classicBtn.SetIcon(&classicBtnIcon); + classicBtn.SetSoundOver(&btnSoundOver); + classicBtn.SetSoundClick(&btnSoundClick); + classicBtn.SetTrigger(trigA); + classicBtn.SetTrigger(trig2); + classicBtn.SetEffectGrow(); + + GuiText wiiuproBtnTxt("Wii U Pro Controller", 22, (GXColor){0, 0, 0, 255}); + wiiuproBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-20); + GuiImage wiiuproBtnImg(&btnLargeOutline); + GuiImage wiiuproBtnImgOver(&btnLargeOutlineOver); + GuiImage wiiuproBtnIcon(&iconWiiupro); + GuiButton wiiuproBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + wiiuproBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + wiiuproBtn.SetPosition(0, 250); + wiiuproBtn.SetLabel(&wiiuproBtnTxt); + wiiuproBtn.SetImage(&wiiuproBtnImg); + wiiuproBtn.SetImageOver(&wiiuproBtnImgOver); + wiiuproBtn.SetIcon(&wiiuproBtnIcon); + wiiuproBtn.SetSoundOver(&btnSoundOver); + wiiuproBtn.SetSoundClick(&btnSoundClick); + wiiuproBtn.SetTrigger(trigA); + wiiuproBtn.SetTrigger(trig2); + wiiuproBtn.SetEffectGrow(); + + GuiText nunchukBtnTxt1("Wiimote", 22, (GXColor){0, 0, 0, 255}); + GuiText nunchukBtnTxt2("&", 18, (GXColor){0, 0, 0, 255}); + GuiText nunchukBtnTxt3("Nunchuk", 22, (GXColor){0, 0, 0, 255}); + nunchukBtnTxt1.SetPosition(0, -20); + nunchukBtnTxt3.SetPosition(0, +20); + GuiImage nunchukBtnImg(&btnLargeOutline); + GuiImage nunchukBtnImgOver(&btnLargeOutlineOver); + GuiImage nunchukBtnIcon(&iconNunchuk); + GuiButton nunchukBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + nunchukBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + nunchukBtn.SetPosition(200, 250); + nunchukBtn.SetLabel(&nunchukBtnTxt1, 0); + nunchukBtn.SetLabel(&nunchukBtnTxt2, 1); + nunchukBtn.SetLabel(&nunchukBtnTxt3, 2); + nunchukBtn.SetImage(&nunchukBtnImg); + nunchukBtn.SetImageOver(&nunchukBtnImgOver); + nunchukBtn.SetIcon(&nunchukBtnIcon); + nunchukBtn.SetSoundOver(&btnSoundOver); + nunchukBtn.SetSoundClick(&btnSoundClick); + nunchukBtn.SetTrigger(trigA); + nunchukBtn.SetTrigger(trig2); + nunchukBtn.SetEffectGrow(); + + GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); + GuiImage backBtnImg(&btnOutline); + GuiImage backBtnImgOver(&btnOutlineOver); + GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + backBtn.SetPosition(50, -35); + backBtn.SetLabel(&backBtnTxt); + backBtn.SetImage(&backBtnImg); + backBtn.SetImageOver(&backBtnImgOver); + backBtn.SetSoundOver(&btnSoundOver); + backBtn.SetSoundClick(&btnSoundClick); + backBtn.SetTrigger(trigA); + backBtn.SetTrigger(trig2); + backBtn.SetEffectGrow(); + + HaltGui(); + GuiWindow w(screenwidth, screenheight); + w.Append(&titleTxt); + w.Append(&subtitleTxt); + + w.Append(&gamecubeBtn); +#ifdef HW_RVL + w.Append(&wiimoteBtn); + + if(mapMenuCtrlSNES == CTRL_PAD) + { + w.Append(&nunchukBtn); + w.Append(&classicBtn); + w.Append(&wiiuproBtn); + } +#endif + w.Append(&backBtn); + + mainWindow->Append(&w); + + ResumeGui(); + + while(menu == MENU_NONE) + { + usleep(THREAD_SLEEP); + + if(wiimoteBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAMESETTINGS_MAPPINGS_MAP; + mapMenuCtrl = CTRLR_WIIMOTE; + } + else if(nunchukBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAMESETTINGS_MAPPINGS_MAP; + mapMenuCtrl = CTRLR_NUNCHUK; + } + else if(classicBtn.GetState() == STATE_CLICKED) + { + wiiuproCtrl = 0; + menu = MENU_GAMESETTINGS_MAPPINGS_MAP; + mapMenuCtrl = CTRLR_CLASSIC; + } + else if(wiiuproBtn.GetState() == STATE_CLICKED) + { + wiiuproCtrl = 1; + menu = MENU_GAMESETTINGS_MAPPINGS_MAP; + mapMenuCtrl = CTRLR_CLASSIC; + } + else if(gamecubeBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAMESETTINGS_MAPPINGS_MAP; + mapMenuCtrl = CTRLR_GCPAD; + } + else if(backBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAMESETTINGS_MAPPINGS; + } + } + HaltGui(); + mainWindow->Remove(&w); + return menu; +} + +/**************************************************************************** + * ButtonMappingWindow + ***************************************************************************/ + +static u32 +ButtonMappingWindow() +{ + GuiWindow promptWindow(448,288); + promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + promptWindow.SetPosition(0, -10); + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_png); + GuiImageData btnOutlineOver(button_over_png); + + GuiImageData dialogBox(dialogue_box_png); + GuiImage dialogBoxImg(&dialogBox); + + GuiText titleTxt("Button Mapping", 26, (GXColor){70, 70, 10, 255}); + titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + titleTxt.SetPosition(0,14); + + char msg[200]; + + switch(mapMenuCtrl) + { + case CTRLR_GCPAD: + #ifdef HW_RVL + sprintf(msg, "Press any button on the GameCube Controller now. Press Home or the C-Stick in any direction to clear the existing mapping."); + #else + sprintf(msg, "Press any button on the GameCube Controller now. Press the C-Stick in any direction to clear the existing mapping."); + #endif + break; + case CTRLR_WIIMOTE: + sprintf(msg, "Press any button on the Wiimote now. Press Home to clear the existing mapping."); + break; + case CTRLR_CLASSIC: + if(wiiuproCtrl == 1) + { + sprintf(msg, "Press any button on the Wii U Pro Controller now. Press Home to clear the existing mapping."); + } + else + { + sprintf(msg, "Press any button on the Classic Controller now. Press Home to clear the existing mapping."); + } + break; + case CTRLR_NUNCHUK: + sprintf(msg, "Press any button on the Wiimote or Nunchuk now. Press Home to clear the existing mapping."); + break; + } + + GuiText msgTxt(msg, 26, (GXColor){0, 0, 0, 255}); + msgTxt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + msgTxt.SetPosition(0,-20); + msgTxt.SetWrap(true, 430); + + promptWindow.Append(&dialogBoxImg); + promptWindow.Append(&titleTxt); + promptWindow.Append(&msgTxt); + + HaltGui(); + mainWindow->SetState(STATE_DISABLED); + mainWindow->Append(&promptWindow); + mainWindow->ChangeFocus(&promptWindow); + ResumeGui(); + + u32 pressed = 0; + + while(pressed == 0) + { + usleep(THREAD_SLEEP); + + if(mapMenuCtrl == CTRLR_GCPAD) + { + pressed = userInput[0].pad.btns_d; + + if(userInput[0].pad.substickX < -70 || + userInput[0].pad.substickX > 70 || + userInput[0].pad.substickY < -70 || + userInput[0].pad.substickY > 70) + pressed = WPAD_BUTTON_HOME; + + if(userInput[0].wpad->btns_d == WPAD_BUTTON_HOME) + pressed = WPAD_BUTTON_HOME; + } + else + { + pressed = userInput[0].wpad->btns_d; + + // always allow Home button to be pressed to clear the existing mapping + if(pressed != WPAD_BUTTON_HOME) + { + switch(mapMenuCtrl) + { + case CTRLR_WIIMOTE: + if(pressed > 0x1000) + pressed = 0; // not a valid input + break; + + case CTRLR_CLASSIC: + if(userInput[0].wpad->exp.type != WPAD_EXP_CLASSIC) + pressed = 0; // not a valid input + else if(pressed <= 0x1000) + pressed = 0; // not a valid input + break; + + case CTRLR_NUNCHUK: + if(userInput[0].wpad->exp.type != WPAD_EXP_NUNCHUK) + pressed = 0; // not a valid input + break; + } + } + if(pressed == 0) + pressed = userInput[0].wupcdata.btns_d; + } + } + + if(pressed == WPAD_BUTTON_HOME + || pressed == WPAD_CLASSIC_BUTTON_HOME) + pressed = 0; + + HaltGui(); + mainWindow->Remove(&promptWindow); + mainWindow->SetState(STATE_DEFAULT); + ResumeGui(); + + return pressed; +} + +static int MenuSettingsMappingsMap() +{ + int menu = MENU_NONE; + int ret,i,j; + bool firstRun = true; + OptionList options; + + char menuTitle[100]; + char menuSubtitle[100]; + sprintf(menuTitle, "Game Settings - Button Mappings"); + + GuiText titleTxt(menuTitle, 26, (GXColor){255, 255, 255, 255}); + titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + titleTxt.SetPosition(50,30); + + if(wiiuproCtrl == 1) + { + sprintf(menuSubtitle, "%s - %s", gettext(ctrlName[mapMenuCtrlSNES]),"Wii U Pro Controller"); + } + else + { + sprintf(menuSubtitle, "%s - %s", gettext(ctrlName[mapMenuCtrlSNES]), gettext(ctrlrName[mapMenuCtrl])); + } + + GuiText subtitleTxt(menuSubtitle, 20, (GXColor){255, 255, 255, 255}); + subtitleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + subtitleTxt.SetPosition(50,60); + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_png); + GuiImageData btnOutlineOver(button_over_png); + GuiImageData btnShortOutline(button_short_png); + GuiImageData btnShortOutlineOver(button_short_over_png); + + GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); + GuiImage backBtnImg(&btnOutline); + GuiImage backBtnImgOver(&btnOutlineOver); + GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + backBtn.SetPosition(50, -35); + backBtn.SetLabel(&backBtnTxt); + backBtn.SetImage(&backBtnImg); + backBtn.SetImageOver(&backBtnImgOver); + backBtn.SetSoundOver(&btnSoundOver); + backBtn.SetSoundClick(&btnSoundClick); + backBtn.SetTrigger(trigA); + backBtn.SetTrigger(trig2); + backBtn.SetEffectGrow(); + + GuiText resetBtnTxt("Reset", 22, (GXColor){0, 0, 0, 255}); + GuiImage resetBtnImg(&btnShortOutline); + GuiImage resetBtnImgOver(&btnShortOutlineOver); + GuiButton resetBtn(btnShortOutline.GetWidth(), btnShortOutline.GetHeight()); + resetBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + resetBtn.SetPosition(260, -35); + resetBtn.SetLabel(&resetBtnTxt); + resetBtn.SetImage(&resetBtnImg); + resetBtn.SetImageOver(&resetBtnImgOver); + resetBtn.SetSoundOver(&btnSoundOver); + resetBtn.SetSoundClick(&btnSoundClick); + resetBtn.SetTrigger(trigA); + resetBtn.SetTrigger(trig2); + resetBtn.SetEffectGrow(); + + i=0; + + switch(mapMenuCtrlSNES) + { + case CTRL_PAD: + sprintf(options.name[i++], "A"); + sprintf(options.name[i++], "B"); + sprintf(options.name[i++], "X"); + sprintf(options.name[i++], "Y"); + sprintf(options.name[i++], "L"); + sprintf(options.name[i++], "R"); + sprintf(options.name[i++], "Start"); + sprintf(options.name[i++], "Select"); + sprintf(options.name[i++], "Up"); + sprintf(options.name[i++], "Down"); + sprintf(options.name[i++], "Left"); + sprintf(options.name[i++], "Right"); + options.length = i; + break; + case CTRL_SCOPE: + sprintf(options.name[i++], "Fire"); + sprintf(options.name[i++], "Aim Offscreen"); + sprintf(options.name[i++], "Cursor"); + sprintf(options.name[i++], "Turbo On"); + sprintf(options.name[i++], "Turbo Off"); + sprintf(options.name[i++], "Pause"); + options.length = i; + break; + case CTRL_MOUSE: + sprintf(options.name[i++], "Left Button"); + sprintf(options.name[i++], "Right Button"); + options.length = i; + break; + case CTRL_JUST: + sprintf(options.name[i++], "Fire"); + sprintf(options.name[i++], "Aim Offscreen"); + sprintf(options.name[i++], "Start"); + options.length = i; + break; + }; + + for(i=0; i < options.length; i++) + options.value[i][0] = 0; + + GuiOptionBrowser optionBrowser(552, 248, &options); + optionBrowser.SetPosition(0, 108); + optionBrowser.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + optionBrowser.SetCol2Position(215); + + HaltGui(); + GuiWindow w(screenwidth, screenheight); + w.Append(&backBtn); + w.Append(&resetBtn); + mainWindow->Append(&optionBrowser); + mainWindow->Append(&w); + mainWindow->Append(&titleTxt); + mainWindow->Append(&subtitleTxt); + ResumeGui(); + + while(menu == MENU_NONE) + { + usleep(THREAD_SLEEP); + + if(backBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAMESETTINGS_MAPPINGS_CTRL; + } + else if(resetBtn.GetState() == STATE_CLICKED) + { + resetBtn.ResetState(); + + int choice = WindowPrompt( + "Reset Mappings", + "Are you sure that you want to reset your mappings?", + "Yes", + "No"); + + if(choice == 1) + { + ResetControls(mapMenuCtrlSNES, mapMenuCtrl); + firstRun = true; + } + } + + ret = optionBrowser.GetClickedOption(); + + if(ret >= 0) + { + // get a button selection from user + btnmap[mapMenuCtrlSNES][mapMenuCtrl][ret] = ButtonMappingWindow(); + } + + if(ret >= 0 || firstRun) + { + firstRun = false; + + for(i=0; i < options.length; i++) + { + for(j=0; j < ctrlr_def[mapMenuCtrl].num_btns; j++) + { + if(btnmap[mapMenuCtrlSNES][mapMenuCtrl][i] == 0) + { + options.value[i][0] = 0; + } + else if(btnmap[mapMenuCtrlSNES][mapMenuCtrl][i] == + ctrlr_def[mapMenuCtrl].map[j].btn) + { + if(strcmp(options.value[i], ctrlr_def[mapMenuCtrl].map[j].name) != 0) + sprintf(options.value[i], ctrlr_def[mapMenuCtrl].map[j].name); + break; + } + } + } + optionBrowser.TriggerUpdate(); + } + } + wiiuproCtrl = 0; + HaltGui(); + mainWindow->Remove(&optionBrowser); + mainWindow->Remove(&w); + mainWindow->Remove(&titleTxt); + mainWindow->Remove(&subtitleTxt); + return menu; +} + +/**************************************************************************** + * MenuSettingsVideo + ***************************************************************************/ + +static void ScreenZoomWindowUpdate(void * ptr, float h, float v) +{ + GuiButton * b = (GuiButton *)ptr; + if(b->GetState() == STATE_CLICKED) + { + GCSettings.zoomHor += h; + GCSettings.zoomVert += v; + + char zoom[10]; + sprintf(zoom, "%.2f%%", GCSettings.zoomHor*100); + settingText->SetText(zoom); + sprintf(zoom, "%.2f%%", GCSettings.zoomVert*100); + settingText2->SetText(zoom); + b->ResetState(); + } +} + +static void ScreenZoomWindowLeftClick(void * ptr) { ScreenZoomWindowUpdate(ptr, -0.01, 0); } +static void ScreenZoomWindowRightClick(void * ptr) { ScreenZoomWindowUpdate(ptr, +0.01, 0); } +static void ScreenZoomWindowUpClick(void * ptr) { ScreenZoomWindowUpdate(ptr, 0, +0.01); } +static void ScreenZoomWindowDownClick(void * ptr) { ScreenZoomWindowUpdate(ptr, 0, -0.01); } + +static void ScreenZoomWindow() +{ + GuiWindow * w = new GuiWindow(200,200); + w->SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + + GuiTrigger trigLeft; + trigLeft.SetButtonOnlyInFocusTrigger(-1, WPAD_BUTTON_LEFT | WPAD_CLASSIC_BUTTON_LEFT, PAD_BUTTON_LEFT); + + GuiTrigger trigRight; + trigRight.SetButtonOnlyInFocusTrigger(-1, WPAD_BUTTON_RIGHT | WPAD_CLASSIC_BUTTON_RIGHT, PAD_BUTTON_RIGHT); + + GuiTrigger trigUp; + trigUp.SetButtonOnlyInFocusTrigger(-1, WPAD_BUTTON_UP | WPAD_CLASSIC_BUTTON_UP, PAD_BUTTON_UP); + + GuiTrigger trigDown; + trigDown.SetButtonOnlyInFocusTrigger(-1, WPAD_BUTTON_DOWN | WPAD_CLASSIC_BUTTON_DOWN, PAD_BUTTON_DOWN); + + GuiImageData arrowLeft(button_arrow_left_png); + GuiImage arrowLeftImg(&arrowLeft); + GuiImageData arrowLeftOver(button_arrow_left_over_png); + GuiImage arrowLeftOverImg(&arrowLeftOver); + GuiButton arrowLeftBtn(arrowLeft.GetWidth(), arrowLeft.GetHeight()); + arrowLeftBtn.SetImage(&arrowLeftImg); + arrowLeftBtn.SetImageOver(&arrowLeftOverImg); + arrowLeftBtn.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + arrowLeftBtn.SetPosition(50, 0); + arrowLeftBtn.SetTrigger(trigA); + arrowLeftBtn.SetTrigger(trig2); + arrowLeftBtn.SetTrigger(&trigLeft); + arrowLeftBtn.SetSelectable(false); + arrowLeftBtn.SetUpdateCallback(ScreenZoomWindowLeftClick); + + GuiImageData arrowRight(button_arrow_right_png); + GuiImage arrowRightImg(&arrowRight); + GuiImageData arrowRightOver(button_arrow_right_over_png); + GuiImage arrowRightOverImg(&arrowRightOver); + GuiButton arrowRightBtn(arrowRight.GetWidth(), arrowRight.GetHeight()); + arrowRightBtn.SetImage(&arrowRightImg); + arrowRightBtn.SetImageOver(&arrowRightOverImg); + arrowRightBtn.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + arrowRightBtn.SetPosition(164, 0); + arrowRightBtn.SetTrigger(trigA); + arrowRightBtn.SetTrigger(trig2); + arrowRightBtn.SetTrigger(&trigRight); + arrowRightBtn.SetSelectable(false); + arrowRightBtn.SetUpdateCallback(ScreenZoomWindowRightClick); + + GuiImageData arrowUp(button_arrow_up_png); + GuiImage arrowUpImg(&arrowUp); + GuiImageData arrowUpOver(button_arrow_up_over_png); + GuiImage arrowUpOverImg(&arrowUpOver); + GuiButton arrowUpBtn(arrowUp.GetWidth(), arrowUp.GetHeight()); + arrowUpBtn.SetImage(&arrowUpImg); + arrowUpBtn.SetImageOver(&arrowUpOverImg); + arrowUpBtn.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + arrowUpBtn.SetPosition(-76, -27); + arrowUpBtn.SetTrigger(trigA); + arrowUpBtn.SetTrigger(trig2); + arrowUpBtn.SetTrigger(&trigUp); + arrowUpBtn.SetSelectable(false); + arrowUpBtn.SetUpdateCallback(ScreenZoomWindowUpClick); + + GuiImageData arrowDown(button_arrow_down_png); + GuiImage arrowDownImg(&arrowDown); + GuiImageData arrowDownOver(button_arrow_down_over_png); + GuiImage arrowDownOverImg(&arrowDownOver); + GuiButton arrowDownBtn(arrowDown.GetWidth(), arrowDown.GetHeight()); + arrowDownBtn.SetImage(&arrowDownImg); + arrowDownBtn.SetImageOver(&arrowDownOverImg); + arrowDownBtn.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + arrowDownBtn.SetPosition(-76, 27); + arrowDownBtn.SetTrigger(trigA); + arrowDownBtn.SetTrigger(trig2); + arrowDownBtn.SetTrigger(&trigDown); + arrowDownBtn.SetSelectable(false); + arrowDownBtn.SetUpdateCallback(ScreenZoomWindowDownClick); + + GuiImageData screenPosition(screen_position_png); + GuiImage screenPositionImg(&screenPosition); + screenPositionImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + screenPositionImg.SetPosition(0, 0); + + settingText = new GuiText(NULL, 20, (GXColor){0, 0, 0, 255}); + settingText2 = new GuiText(NULL, 20, (GXColor){0, 0, 0, 255}); + char zoom[10]; + sprintf(zoom, "%.2f%%", GCSettings.zoomHor*100); + settingText->SetText(zoom); + settingText->SetPosition(108, 0); + sprintf(zoom, "%.2f%%", GCSettings.zoomVert*100); + settingText2->SetText(zoom); + settingText2->SetPosition(-76, 0); + + float currentZoomHor = GCSettings.zoomHor; + float currentZoomVert = GCSettings.zoomVert; + + w->Append(&arrowLeftBtn); + w->Append(&arrowRightBtn); + w->Append(&arrowUpBtn); + w->Append(&arrowDownBtn); + w->Append(&screenPositionImg); + w->Append(settingText); + w->Append(settingText2); + + if(!SettingWindow("Screen Zoom",w)) + { + // undo changes + GCSettings.zoomHor = currentZoomHor; + GCSettings.zoomVert = currentZoomVert; + } + + delete(w); + delete(settingText); + delete(settingText2); +} + +static void ScreenPositionWindowUpdate(void * ptr, int x, int y) +{ + GuiButton * b = (GuiButton *)ptr; + if(b->GetState() == STATE_CLICKED) + { + GCSettings.xshift += x; + GCSettings.yshift += y; + + char shift[10]; + sprintf(shift, "%i, %i", GCSettings.xshift, GCSettings.yshift); + settingText->SetText(shift); + b->ResetState(); + } +} + +static void ScreenPositionWindowLeftClick(void * ptr) { ScreenPositionWindowUpdate(ptr, -1, 0); } +static void ScreenPositionWindowRightClick(void * ptr) { ScreenPositionWindowUpdate(ptr, +1, 0); } +static void ScreenPositionWindowUpClick(void * ptr) { ScreenPositionWindowUpdate(ptr, 0, -1); } +static void ScreenPositionWindowDownClick(void * ptr) { ScreenPositionWindowUpdate(ptr, 0, +1); } + +static void ScreenPositionWindow() +{ + GuiWindow * w = new GuiWindow(150,150); + w->SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + w->SetPosition(0, -10); + + GuiTrigger trigLeft; + trigLeft.SetButtonOnlyInFocusTrigger(-1, WPAD_BUTTON_LEFT | WPAD_CLASSIC_BUTTON_LEFT, PAD_BUTTON_LEFT); + + GuiTrigger trigRight; + trigRight.SetButtonOnlyInFocusTrigger(-1, WPAD_BUTTON_RIGHT | WPAD_CLASSIC_BUTTON_RIGHT, PAD_BUTTON_RIGHT); + + GuiTrigger trigUp; + trigUp.SetButtonOnlyInFocusTrigger(-1, WPAD_BUTTON_UP | WPAD_CLASSIC_BUTTON_UP, PAD_BUTTON_UP); + + GuiTrigger trigDown; + trigDown.SetButtonOnlyInFocusTrigger(-1, WPAD_BUTTON_DOWN | WPAD_CLASSIC_BUTTON_DOWN, PAD_BUTTON_DOWN); + + GuiImageData arrowLeft(button_arrow_left_png); + GuiImage arrowLeftImg(&arrowLeft); + GuiImageData arrowLeftOver(button_arrow_left_over_png); + GuiImage arrowLeftOverImg(&arrowLeftOver); + GuiButton arrowLeftBtn(arrowLeft.GetWidth(), arrowLeft.GetHeight()); + arrowLeftBtn.SetImage(&arrowLeftImg); + arrowLeftBtn.SetImageOver(&arrowLeftOverImg); + arrowLeftBtn.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + arrowLeftBtn.SetTrigger(trigA); + arrowLeftBtn.SetTrigger(trig2); + arrowLeftBtn.SetTrigger(&trigLeft); + arrowLeftBtn.SetSelectable(false); + arrowLeftBtn.SetUpdateCallback(ScreenPositionWindowLeftClick); + + GuiImageData arrowRight(button_arrow_right_png); + GuiImage arrowRightImg(&arrowRight); + GuiImageData arrowRightOver(button_arrow_right_over_png); + GuiImage arrowRightOverImg(&arrowRightOver); + GuiButton arrowRightBtn(arrowRight.GetWidth(), arrowRight.GetHeight()); + arrowRightBtn.SetImage(&arrowRightImg); + arrowRightBtn.SetImageOver(&arrowRightOverImg); + arrowRightBtn.SetAlignment(ALIGN_RIGHT, ALIGN_MIDDLE); + arrowRightBtn.SetTrigger(trigA); + arrowRightBtn.SetTrigger(trig2); + arrowRightBtn.SetTrigger(&trigRight); + arrowRightBtn.SetSelectable(false); + arrowRightBtn.SetUpdateCallback(ScreenPositionWindowRightClick); + + GuiImageData arrowUp(button_arrow_up_png); + GuiImage arrowUpImg(&arrowUp); + GuiImageData arrowUpOver(button_arrow_up_over_png); + GuiImage arrowUpOverImg(&arrowUpOver); + GuiButton arrowUpBtn(arrowUp.GetWidth(), arrowUp.GetHeight()); + arrowUpBtn.SetImage(&arrowUpImg); + arrowUpBtn.SetImageOver(&arrowUpOverImg); + arrowUpBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + arrowUpBtn.SetTrigger(trigA); + arrowUpBtn.SetTrigger(trig2); + arrowUpBtn.SetTrigger(&trigUp); + arrowUpBtn.SetSelectable(false); + arrowUpBtn.SetUpdateCallback(ScreenPositionWindowUpClick); + + GuiImageData arrowDown(button_arrow_down_png); + GuiImage arrowDownImg(&arrowDown); + GuiImageData arrowDownOver(button_arrow_down_over_png); + GuiImage arrowDownOverImg(&arrowDownOver); + GuiButton arrowDownBtn(arrowDown.GetWidth(), arrowDown.GetHeight()); + arrowDownBtn.SetImage(&arrowDownImg); + arrowDownBtn.SetImageOver(&arrowDownOverImg); + arrowDownBtn.SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM); + arrowDownBtn.SetTrigger(trigA); + arrowDownBtn.SetTrigger(trig2); + arrowDownBtn.SetTrigger(&trigDown); + arrowDownBtn.SetSelectable(false); + arrowDownBtn.SetUpdateCallback(ScreenPositionWindowDownClick); + + GuiImageData screenPosition(screen_position_png); + GuiImage screenPositionImg(&screenPosition); + screenPositionImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + + settingText = new GuiText(NULL, 20, (GXColor){0, 0, 0, 255}); + char shift[10]; + sprintf(shift, "%i, %i", GCSettings.xshift, GCSettings.yshift); + settingText->SetText(shift); + + int currentX = GCSettings.xshift; + int currentY = GCSettings.yshift; + + w->Append(&arrowLeftBtn); + w->Append(&arrowRightBtn); + w->Append(&arrowUpBtn); + w->Append(&arrowDownBtn); + w->Append(&screenPositionImg); + w->Append(settingText); + + if(!SettingWindow("Screen Position",w)) + { + // undo changes + GCSettings.xshift = currentX; + GCSettings.yshift = currentY; + } + + delete(w); + delete(settingText); +} + +static int MenuSettingsVideo() +{ + int menu = MENU_NONE; + int ret; + int i = 0; + bool firstRun = true; + OptionList options; + + sprintf(options.name[i++], "Rendering"); + sprintf(options.name[i++], "Scaling"); + sprintf(options.name[i++], "Filtering"); + sprintf(options.name[i++], "Screen Zoom"); + sprintf(options.name[i++], "Screen Position"); + sprintf(options.name[i++], "Crosshair"); + sprintf(options.name[i++], "Video Mode"); + options.length = i; + +#ifdef HW_DOL + options.name[2][0] = 0; // disable hq2x on GameCube +#endif + + for(i=0; i < options.length; i++) + options.value[i][0] = 0; + + GuiText titleTxt("Game Settings - Video", 26, (GXColor){255, 255, 255, 255}); + titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + titleTxt.SetPosition(50,50); + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_png); + GuiImageData btnOutlineOver(button_over_png); + + GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); + GuiImage backBtnImg(&btnOutline); + GuiImage backBtnImgOver(&btnOutlineOver); + GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + backBtn.SetPosition(50, -35); + backBtn.SetLabel(&backBtnTxt); + backBtn.SetImage(&backBtnImg); + backBtn.SetImageOver(&backBtnImgOver); + backBtn.SetSoundOver(&btnSoundOver); + backBtn.SetSoundClick(&btnSoundClick); + backBtn.SetTrigger(trigA); + backBtn.SetTrigger(trig2); + backBtn.SetEffectGrow(); + + GuiOptionBrowser optionBrowser(552, 248, &options); + optionBrowser.SetPosition(0, 108); + optionBrowser.SetCol2Position(200); + optionBrowser.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + + HaltGui(); + GuiWindow w(screenwidth, screenheight); + w.Append(&backBtn); + mainWindow->Append(&optionBrowser); + mainWindow->Append(&w); + mainWindow->Append(&titleTxt); + ResumeGui(); + + while(menu == MENU_NONE) + { + usleep(THREAD_SLEEP); + + ret = optionBrowser.GetClickedOption(); + + switch (ret) + { + case 0: + GCSettings.render++; + if (GCSettings.render > 2) + GCSettings.render = 0; + break; + + case 1: + GCSettings.widescreen ^= 1; + break; + + case 2: + GCSettings.FilterMethod++; + if (GCSettings.FilterMethod >= NUM_FILTERS) + GCSettings.FilterMethod = 0; + break; + + case 3: + ScreenZoomWindow(); + break; + + case 4: + ScreenPositionWindow(); + break; + + case 5: + GCSettings.crosshair ^= 1; + break; + + case 6: + GCSettings.videomode++; + if(GCSettings.videomode > 4) + GCSettings.videomode = 0; + break; + } + + if(ret >= 0 || firstRun) + { + firstRun = false; + + // don't allow original render mode if progressive video mode detected + if (GCSettings.render==0 && progressive) + GCSettings.render++; + + if (GCSettings.render == 0) + sprintf (options.value[0], "Original"); + else if (GCSettings.render == 1) + sprintf (options.value[0], "Filtered"); + else if (GCSettings.render == 2) + sprintf (options.value[0], "Unfiltered"); + + if(GCSettings.widescreen) + sprintf (options.value[1], "16:9 Correction"); + else + sprintf (options.value[1], "Default"); +#ifdef HW_RVL + sprintf (options.value[2], "%s", GetFilterName((RenderFilter)GCSettings.FilterMethod)); +#endif + sprintf (options.value[3], "%.2f%%, %.2f%%", GCSettings.zoomHor*100, GCSettings.zoomVert*100); + sprintf (options.value[4], "%d, %d", GCSettings.xshift, GCSettings.yshift); + sprintf (options.value[5], "%s", GCSettings.crosshair == 1 ? "On" : "Off"); + + switch(GCSettings.videomode) + { + case 0: + sprintf (options.value[6], "Automatic (Recommended)"); break; + case 1: + sprintf (options.value[6], "NTSC (480i)"); break; + case 2: + sprintf (options.value[6], "Progressive (480p)"); break; + case 3: + sprintf (options.value[6], "PAL (50Hz)"); break; + case 4: + sprintf (options.value[6], "PAL (60Hz)"); break; + } + optionBrowser.TriggerUpdate(); + } + + if(backBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAMESETTINGS; + } + } + HaltGui(); + mainWindow->Remove(&optionBrowser); + mainWindow->Remove(&w); + mainWindow->Remove(&titleTxt); + return menu; +} + +/**************************************************************************** + * MenuSettings + ***************************************************************************/ +static int MenuSettings() +{ + int menu = MENU_NONE; + + GuiText titleTxt("Settings", 26, (GXColor){255, 255, 255, 255}); + titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + titleTxt.SetPosition(50,50); + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_long_png); + GuiImageData btnOutlineOver(button_long_over_png); + GuiImageData btnLargeOutline(button_large_png); + GuiImageData btnLargeOutlineOver(button_large_over_png); + GuiImageData iconFile(icon_settings_file_png); + GuiImageData iconMenu(icon_settings_menu_png); + GuiImageData iconNetwork(icon_settings_network_png); + + GuiText savingBtnTxt1("Saving", 22, (GXColor){0, 0, 0, 255}); + GuiText savingBtnTxt2("&", 18, (GXColor){0, 0, 0, 255}); + GuiText savingBtnTxt3("Loading", 22, (GXColor){0, 0, 0, 255}); + savingBtnTxt1.SetPosition(0, -20); + savingBtnTxt3.SetPosition(0, +20); + GuiImage savingBtnImg(&btnLargeOutline); + GuiImage savingBtnImgOver(&btnLargeOutlineOver); + GuiImage fileBtnIcon(&iconFile); + GuiButton savingBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + savingBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + savingBtn.SetPosition(-125, 120); + savingBtn.SetLabel(&savingBtnTxt1, 0); + savingBtn.SetLabel(&savingBtnTxt2, 1); + savingBtn.SetLabel(&savingBtnTxt3, 2); + savingBtn.SetImage(&savingBtnImg); + savingBtn.SetImageOver(&savingBtnImgOver); + savingBtn.SetIcon(&fileBtnIcon); + savingBtn.SetSoundOver(&btnSoundOver); + savingBtn.SetSoundClick(&btnSoundClick); + savingBtn.SetTrigger(trigA); + savingBtn.SetTrigger(trig2); + savingBtn.SetEffectGrow(); + + GuiText menuBtnTxt("Menu", 22, (GXColor){0, 0, 0, 255}); + menuBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-20); + GuiImage menuBtnImg(&btnLargeOutline); + GuiImage menuBtnImgOver(&btnLargeOutlineOver); + GuiImage menuBtnIcon(&iconMenu); + GuiButton menuBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + menuBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + menuBtn.SetPosition(125, 120); + menuBtn.SetLabel(&menuBtnTxt); + menuBtn.SetImage(&menuBtnImg); + menuBtn.SetImageOver(&menuBtnImgOver); + menuBtn.SetIcon(&menuBtnIcon); + menuBtn.SetSoundOver(&btnSoundOver); + menuBtn.SetSoundClick(&btnSoundClick); + menuBtn.SetTrigger(trigA); + menuBtn.SetTrigger(trig2); + menuBtn.SetEffectGrow(); + + GuiText networkBtnTxt("Network", 22, (GXColor){0, 0, 0, 255}); + networkBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-20); + GuiImage networkBtnImg(&btnLargeOutline); + GuiImage networkBtnImgOver(&btnLargeOutlineOver); + GuiImage networkBtnIcon(&iconNetwork); + GuiButton networkBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + networkBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + networkBtn.SetPosition(0, 250); + networkBtn.SetLabel(&networkBtnTxt); + networkBtn.SetImage(&networkBtnImg); + networkBtn.SetImageOver(&networkBtnImgOver); + networkBtn.SetIcon(&networkBtnIcon); + networkBtn.SetSoundOver(&btnSoundOver); + networkBtn.SetSoundClick(&btnSoundClick); + networkBtn.SetTrigger(trigA); + networkBtn.SetTrigger(trig2); + networkBtn.SetEffectGrow(); + + GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); + GuiImage backBtnImg(&btnOutline); + GuiImage backBtnImgOver(&btnOutlineOver); + GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + backBtn.SetPosition(90, -35); + backBtn.SetLabel(&backBtnTxt); + backBtn.SetImage(&backBtnImg); + backBtn.SetImageOver(&backBtnImgOver); + backBtn.SetSoundOver(&btnSoundOver); + backBtn.SetSoundClick(&btnSoundClick); + backBtn.SetTrigger(trigA); + backBtn.SetTrigger(trig2); + backBtn.SetEffectGrow(); + + GuiText resetBtnTxt("Reset Settings", 22, (GXColor){0, 0, 0, 255}); + GuiImage resetBtnImg(&btnOutline); + GuiImage resetBtnImgOver(&btnOutlineOver); + GuiButton resetBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + resetBtn.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); + resetBtn.SetPosition(-90, -35); + resetBtn.SetLabel(&resetBtnTxt); + resetBtn.SetImage(&resetBtnImg); + resetBtn.SetImageOver(&resetBtnImgOver); + resetBtn.SetSoundOver(&btnSoundOver); + resetBtn.SetSoundClick(&btnSoundClick); + resetBtn.SetTrigger(trigA); + resetBtn.SetTrigger(trig2); + resetBtn.SetEffectGrow(); + + HaltGui(); + GuiWindow w(screenwidth, screenheight); + w.Append(&titleTxt); + w.Append(&savingBtn); + w.Append(&menuBtn); + w.Append(&networkBtn); + w.Append(&backBtn); + w.Append(&resetBtn); + + mainWindow->Append(&w); + + ResumeGui(); + + while(menu == MENU_NONE) + { + usleep(THREAD_SLEEP); + + if(savingBtn.GetState() == STATE_CLICKED) + { + menu = MENU_SETTINGS_FILE; + } + else if(menuBtn.GetState() == STATE_CLICKED) + { + menu = MENU_SETTINGS_MENU; + } + else if(networkBtn.GetState() == STATE_CLICKED) + { + menu = MENU_SETTINGS_NETWORK; + } + else if(backBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAMESELECTION; + } + else if(resetBtn.GetState() == STATE_CLICKED) + { + resetBtn.ResetState(); + + int choice = WindowPrompt( + "Reset Settings", + "Are you sure that you want to reset your settings?", + "Yes", + "No"); + + if(choice == 1) + DefaultSettings(); + } + } + + HaltGui(); + mainWindow->Remove(&w); + return menu; +} + +/**************************************************************************** + * MenuSettingsFile + ***************************************************************************/ + +static int MenuSettingsFile() +{ + int menu = MENU_NONE; + int ret; + int i = 0; + bool firstRun = true; + OptionList options; + sprintf(options.name[i++], "Load Device"); + sprintf(options.name[i++], "Save Device"); + sprintf(options.name[i++], "Load Folder"); + sprintf(options.name[i++], "Save Folder"); + sprintf(options.name[i++], "Cheats Folder"); + sprintf(options.name[i++], "Screenshots Folder"); + sprintf(options.name[i++], "Auto Load"); + sprintf(options.name[i++], "Auto Save"); + options.length = i; + + for(i=0; i < options.length; i++) + options.value[i][0] = 0; + + GuiText titleTxt("Settings - Saving & Loading", 26, (GXColor){255, 255, 255, 255}); + titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + titleTxt.SetPosition(50,50); + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_long_png); + GuiImageData btnOutlineOver(button_long_over_png); + + GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); + GuiImage backBtnImg(&btnOutline); + GuiImage backBtnImgOver(&btnOutlineOver); + GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + backBtn.SetPosition(90, -35); + backBtn.SetLabel(&backBtnTxt); + backBtn.SetImage(&backBtnImg); + backBtn.SetImageOver(&backBtnImgOver); + backBtn.SetSoundOver(&btnSoundOver); + backBtn.SetSoundClick(&btnSoundClick); + backBtn.SetTrigger(trigA); + backBtn.SetTrigger(trig2); + backBtn.SetEffectGrow(); + + GuiOptionBrowser optionBrowser(552, 248, &options); + optionBrowser.SetPosition(0, 108); + optionBrowser.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + optionBrowser.SetCol2Position(215); + + HaltGui(); + GuiWindow w(screenwidth, screenheight); + w.Append(&backBtn); + mainWindow->Append(&optionBrowser); + mainWindow->Append(&w); + mainWindow->Append(&titleTxt); + ResumeGui(); + + while(menu == MENU_NONE) + { + usleep(THREAD_SLEEP); + + ret = optionBrowser.GetClickedOption(); + + switch (ret) + { + case 0: + GCSettings.LoadMethod++; + break; + + case 1: + GCSettings.SaveMethod++; + break; + + case 2: + OnScreenKeyboard(GCSettings.LoadFolder, MAXPATHLEN); + break; + + case 3: + OnScreenKeyboard(GCSettings.SaveFolder, MAXPATHLEN); + break; + + case 4: + OnScreenKeyboard(GCSettings.CheatFolder, MAXPATHLEN); + break; + + case 5: + OnScreenKeyboard(GCSettings.ScreenshotsFolder, MAXPATHLEN); + break; + + case 6: + GCSettings.AutoLoad++; + if (GCSettings.AutoLoad > 2) + GCSettings.AutoLoad = 0; + break; + + case 7: + GCSettings.AutoSave++; + if (GCSettings.AutoSave > 3) + GCSettings.AutoSave = 0; + break; + } + + if(ret >= 0 || firstRun) + { + firstRun = false; + + // some load/save methods are not implemented - here's where we skip them + // they need to be skipped in the order they were enumerated + + // no SD/USB ports on GameCube + #ifdef HW_DOL + if(GCSettings.LoadMethod == DEVICE_SD) + GCSettings.LoadMethod++; + if(GCSettings.SaveMethod == DEVICE_SD) + GCSettings.SaveMethod++; + if(GCSettings.LoadMethod == DEVICE_USB) + GCSettings.LoadMethod++; + if(GCSettings.SaveMethod == DEVICE_USB) + GCSettings.SaveMethod++; + #endif + + // saving to DVD is impossible + if(GCSettings.SaveMethod == DEVICE_DVD) + GCSettings.SaveMethod++; + + // don't allow SD Gecko on Wii + #ifdef HW_RVL + if(GCSettings.LoadMethod == DEVICE_SD_SLOTA) + GCSettings.LoadMethod++; + if(GCSettings.SaveMethod == DEVICE_SD_SLOTA) + GCSettings.SaveMethod++; + if(GCSettings.LoadMethod == DEVICE_SD_SLOTB) + GCSettings.LoadMethod++; + if(GCSettings.SaveMethod == DEVICE_SD_SLOTB) + GCSettings.SaveMethod++; + #endif + + // correct load/save methods out of bounds + if(GCSettings.LoadMethod > 6) + GCSettings.LoadMethod = 0; + if(GCSettings.SaveMethod > 6) + GCSettings.SaveMethod = 0; + + if (GCSettings.LoadMethod == DEVICE_AUTO) sprintf (options.value[0],"Auto Detect"); + else if (GCSettings.LoadMethod == DEVICE_SD) sprintf (options.value[0],"SD"); + else if (GCSettings.LoadMethod == DEVICE_USB) sprintf (options.value[0],"USB"); + else if (GCSettings.LoadMethod == DEVICE_DVD) sprintf (options.value[0],"DVD"); + else if (GCSettings.LoadMethod == DEVICE_SMB) sprintf (options.value[0],"Network"); + else if (GCSettings.LoadMethod == DEVICE_SD_SLOTA) sprintf (options.value[0],"SD Gecko Slot A"); + else if (GCSettings.LoadMethod == DEVICE_SD_SLOTB) sprintf (options.value[0],"SD Gecko Slot B"); + + if (GCSettings.SaveMethod == DEVICE_AUTO) sprintf (options.value[1],"Auto Detect"); + else if (GCSettings.SaveMethod == DEVICE_SD) sprintf (options.value[1],"SD"); + else if (GCSettings.SaveMethod == DEVICE_USB) sprintf (options.value[1],"USB"); + else if (GCSettings.SaveMethod == DEVICE_SMB) sprintf (options.value[1],"Network"); + else if (GCSettings.SaveMethod == DEVICE_SD_SLOTA) sprintf (options.value[1],"SD Gecko Slot A"); + else if (GCSettings.SaveMethod == DEVICE_SD_SLOTB) sprintf (options.value[1],"SD Gecko Slot B"); + + snprintf (options.value[2], 35, "%s", GCSettings.LoadFolder); + snprintf (options.value[3], 35, "%s", GCSettings.SaveFolder); + snprintf (options.value[4], 35, "%s", GCSettings.CheatFolder); + snprintf (options.value[5], 35, "%s", GCSettings.ScreenshotsFolder); + + if (GCSettings.AutoLoad == 0) sprintf (options.value[6],"Off"); + else if (GCSettings.AutoLoad == 1) sprintf (options.value[6],"SRAM"); + else if (GCSettings.AutoLoad == 2) sprintf (options.value[6],"Snapshot"); + + if (GCSettings.AutoSave == 0) sprintf (options.value[7],"Off"); + else if (GCSettings.AutoSave == 1) sprintf (options.value[7],"SRAM"); + else if (GCSettings.AutoSave == 2) sprintf (options.value[7],"Snapshot"); + else if (GCSettings.AutoSave == 3) sprintf (options.value[7],"Both"); + + optionBrowser.TriggerUpdate(); + } + + if(backBtn.GetState() == STATE_CLICKED) + { + menu = MENU_SETTINGS; + } + } + HaltGui(); + mainWindow->Remove(&optionBrowser); + mainWindow->Remove(&w); + mainWindow->Remove(&titleTxt); + return menu; +} + +/**************************************************************************** + * MenuSettingsMenu + ***************************************************************************/ + +static int MenuSettingsMenu() +{ + int menu = MENU_NONE; + int ret; + int i = 0; + bool firstRun = true; + OptionList options; + + sprintf(options.name[i++], "Exit Action"); + sprintf(options.name[i++], "Wiimote Orientation"); + sprintf(options.name[i++], "Music Volume"); + sprintf(options.name[i++], "Sound Effects Volume"); + sprintf(options.name[i++], "Rumble"); + sprintf(options.name[i++], "Language"); + options.length = i; + + for(i=0; i < options.length; i++) + options.value[i][0] = 0; + + GuiText titleTxt("Settings - Menu", 26, (GXColor){255, 255, 255, 255}); + titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + titleTxt.SetPosition(50,50); + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_long_png); + GuiImageData btnOutlineOver(button_long_over_png); + + GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); + GuiImage backBtnImg(&btnOutline); + GuiImage backBtnImgOver(&btnOutlineOver); + GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + backBtn.SetPosition(90, -35); + backBtn.SetLabel(&backBtnTxt); + backBtn.SetImage(&backBtnImg); + backBtn.SetImageOver(&backBtnImgOver); + backBtn.SetSoundOver(&btnSoundOver); + backBtn.SetSoundClick(&btnSoundClick); + backBtn.SetTrigger(trigA); + backBtn.SetTrigger(trig2); + backBtn.SetEffectGrow(); + + GuiOptionBrowser optionBrowser(552, 248, &options); + optionBrowser.SetPosition(0, 108); + optionBrowser.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + optionBrowser.SetCol2Position(275); + + HaltGui(); + GuiWindow w(screenwidth, screenheight); + w.Append(&backBtn); + mainWindow->Append(&optionBrowser); + mainWindow->Append(&w); + mainWindow->Append(&titleTxt); + ResumeGui(); + + while(menu == MENU_NONE) + { + usleep(THREAD_SLEEP); + + ret = optionBrowser.GetClickedOption(); + + switch (ret) + { + case 0: + GCSettings.ExitAction++; + if(GCSettings.ExitAction > 3) + GCSettings.ExitAction = 0; + break; + case 1: + GCSettings.WiimoteOrientation ^= 1; + break; + case 2: + GCSettings.MusicVolume += 10; + if(GCSettings.MusicVolume > 100) + GCSettings.MusicVolume = 0; + bgMusic->SetVolume(GCSettings.MusicVolume); + break; + case 3: + GCSettings.SFXVolume += 10; + if(GCSettings.SFXVolume > 100) + GCSettings.SFXVolume = 0; + break; + case 4: + GCSettings.Rumble ^= 1; + break; + case 5: + GCSettings.language++; + + if(GCSettings.language >= LANG_LENGTH) + GCSettings.language = LANG_JAPANESE; + + if(GCSettings.language == LANG_SIMP_CHINESE) + GCSettings.language = LANG_PORTUGUESE; + else if(GCSettings.language == LANG_JAPANESE) + GCSettings.language = LANG_ENGLISH; + + break; + } + + if(ret >= 0 || firstRun) + { + firstRun = false; + + #ifdef HW_RVL + if (GCSettings.ExitAction == 1) + sprintf (options.value[0], "Return to Wii Menu"); + else if (GCSettings.ExitAction == 2) + sprintf (options.value[0], "Power off Wii"); + else if (GCSettings.ExitAction == 3) + sprintf (options.value[0], "Return to Loader"); + else + sprintf (options.value[0], "Auto"); + #else // GameCube + if(GCSettings.ExitAction > 1) + GCSettings.ExitAction = 0; + if (GCSettings.ExitAction == 0) + sprintf (options.value[0], "Return to Loader"); + else + sprintf (options.value[0], "Reboot"); + + options.name[1][0] = 0; // Wiimote + options.name[2][0] = 0; // Music + options.name[3][0] = 0; // Sound Effects + options.name[4][0] = 0; // Rumble + #endif + + if (GCSettings.WiimoteOrientation == 0) + sprintf (options.value[1], "Vertical"); + else if (GCSettings.WiimoteOrientation == 1) + sprintf (options.value[1], "Horizontal"); + + if(GCSettings.MusicVolume > 0) + sprintf(options.value[2], "%d%%", GCSettings.MusicVolume); + else + sprintf(options.value[2], "Mute"); + + if(GCSettings.SFXVolume > 0) + sprintf(options.value[3], "%d%%", GCSettings.SFXVolume); + else + sprintf(options.value[3], "Mute"); + + if (GCSettings.Rumble == 1) + sprintf (options.value[4], "Enabled"); + else + sprintf (options.value[4], "Disabled"); + + switch(GCSettings.language) + { + case LANG_JAPANESE: sprintf(options.value[5], "Japanese"); break; + case LANG_ENGLISH: sprintf(options.value[5], "English"); break; + case LANG_GERMAN: sprintf(options.value[5], "German"); break; + case LANG_FRENCH: sprintf(options.value[5], "French"); break; + case LANG_SPANISH: sprintf(options.value[5], "Spanish"); break; + case LANG_ITALIAN: sprintf(options.value[5], "Italian"); break; + case LANG_DUTCH: sprintf(options.value[5], "Dutch"); break; + case LANG_SIMP_CHINESE: sprintf(options.value[5], "Chinese (Simplified)"); break; + case LANG_TRAD_CHINESE: sprintf(options.value[5], "Chinese (Traditional)"); break; + case LANG_KOREAN: sprintf(options.value[5], "Korean"); break; + case LANG_PORTUGUESE: sprintf(options.value[5], "Portuguese"); break; + case LANG_BRAZILIAN_PORTUGUESE: sprintf(options.value[5], "Brazilian Portuguese"); break; + case LANG_CATALAN: sprintf(options.value[5], "Catalan"); break; + case LANG_TURKISH: sprintf(options.value[5], "Turkish"); break; + } + + optionBrowser.TriggerUpdate(); + } + + if(backBtn.GetState() == STATE_CLICKED) + { + menu = MENU_SETTINGS; + } + } + HaltGui(); + mainWindow->Remove(&optionBrowser); + mainWindow->Remove(&w); + mainWindow->Remove(&titleTxt); + ResetText(); + return menu; +} + +/**************************************************************************** + * MenuSettingsNetwork + ***************************************************************************/ + +static int MenuSettingsNetwork() +{ + int menu = MENU_NONE; + int ret; + int i = 0; + bool firstRun = true; + OptionList options; + sprintf(options.name[i++], "SMB Share IP"); + sprintf(options.name[i++], "SMB Share Name"); + sprintf(options.name[i++], "SMB Share Username"); + sprintf(options.name[i++], "SMB Share Password"); + options.length = i; + + for(i=0; i < options.length; i++) + options.value[i][0] = 0; + + GuiText titleTxt("Settings - Network", 26, (GXColor){255, 255, 255, 255}); + titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + titleTxt.SetPosition(50,50); + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_long_png); + GuiImageData btnOutlineOver(button_long_over_png); + + GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); + GuiImage backBtnImg(&btnOutline); + GuiImage backBtnImgOver(&btnOutlineOver); + GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + backBtn.SetPosition(90, -35); + backBtn.SetLabel(&backBtnTxt); + backBtn.SetImage(&backBtnImg); + backBtn.SetImageOver(&backBtnImgOver); + backBtn.SetSoundOver(&btnSoundOver); + backBtn.SetSoundClick(&btnSoundClick); + backBtn.SetTrigger(trigA); + backBtn.SetTrigger(trig2); + backBtn.SetEffectGrow(); + + GuiOptionBrowser optionBrowser(552, 248, &options); + optionBrowser.SetPosition(0, 108); + optionBrowser.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + optionBrowser.SetCol2Position(290); + + HaltGui(); + GuiWindow w(screenwidth, screenheight); + w.Append(&backBtn); + mainWindow->Append(&optionBrowser); + mainWindow->Append(&w); + mainWindow->Append(&titleTxt); + ResumeGui(); + + while(menu == MENU_NONE) + { + usleep(THREAD_SLEEP); + + ret = optionBrowser.GetClickedOption(); + + switch (ret) + { + case 0: + OnScreenKeyboard(GCSettings.smbip, 80); + break; + + case 1: + OnScreenKeyboard(GCSettings.smbshare, 20); + break; + + case 2: + OnScreenKeyboard(GCSettings.smbuser, 20); + break; + + case 3: + OnScreenKeyboard(GCSettings.smbpwd, 20); + break; + } + + if(ret >= 0 || firstRun) + { + firstRun = false; + snprintf (options.value[0], 25, "%s", GCSettings.smbip); + snprintf (options.value[1], 19, "%s", GCSettings.smbshare); + snprintf (options.value[2], 19, "%s", GCSettings.smbuser); + snprintf (options.value[3], 19, "%s", GCSettings.smbpwd); + optionBrowser.TriggerUpdate(); + } + + if(backBtn.GetState() == STATE_CLICKED) + { + menu = MENU_SETTINGS; + } + } + HaltGui(); + mainWindow->Remove(&optionBrowser); + mainWindow->Remove(&w); + mainWindow->Remove(&titleTxt); + CloseShare(); + return menu; +} + +/**************************************************************************** + * MainMenu + ***************************************************************************/ + +void +MainMenu (int menu) +{ + static bool init = false; + int currentMenu = menu; + lastMenu = MENU_NONE; + + if(!init) + { + init = true; + #ifdef HW_RVL + pointer[0] = new GuiImageData(player1_point_png); + pointer[1] = new GuiImageData(player2_point_png); + pointer[2] = new GuiImageData(player3_point_png); + pointer[3] = new GuiImageData(player4_point_png); + #endif + + trigA = new GuiTrigger; + trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); + trig2 = new GuiTrigger; + trig2->SetSimpleTrigger(-1, WPAD_BUTTON_2, 0); + } + + mainWindow = new GuiWindow(screenwidth, screenheight); + + if(menu == MENU_GAME) + { + gameScreen = new GuiImageData(gameScreenPng); + gameScreenImg = new GuiImage(gameScreen); + gameScreenImg->SetAlpha(192); + gameScreenImg->ColorStripe(30); + gameScreenImg->SetScaleX(screenwidth/(float)vmode->fbWidth); + gameScreenImg->SetScaleY(screenheight/(float)vmode->efbHeight); + } + else + { + gameScreenImg = new GuiImage(screenwidth, screenheight, (GXColor){175, 200, 215, 255}); + gameScreenImg->ColorStripe(10); + } + + mainWindow->Append(gameScreenImg); + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData bgTop(bg_top_png); + bgTopImg = new GuiImage(&bgTop); + GuiImageData bgBottom(bg_bottom_png); + bgBottomImg = new GuiImage(&bgBottom); + bgBottomImg->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + GuiImageData logo(logo_png); + GuiImage logoImg(&logo); + GuiImageData logoOver(logo_over_png); + GuiImage logoImgOver(&logoOver); + GuiText logoTxt(APPVERSION, 18, (GXColor){255, 255, 255, 255}); + logoTxt.SetAlignment(ALIGN_RIGHT, ALIGN_TOP); + logoTxt.SetPosition(0, 4); + btnLogo = new GuiButton(logoImg.GetWidth(), logoImg.GetHeight()); + btnLogo->SetAlignment(ALIGN_RIGHT, ALIGN_TOP); + btnLogo->SetPosition(-50, 24); + btnLogo->SetImage(&logoImg); + btnLogo->SetImageOver(&logoImgOver); + btnLogo->SetLabel(&logoTxt); + btnLogo->SetSoundOver(&btnSoundOver); + btnLogo->SetSoundClick(&btnSoundClick); + btnLogo->SetTrigger(trigA); + btnLogo->SetTrigger(trig2); + btnLogo->SetUpdateCallback(WindowCredits); + + mainWindow->Append(bgTopImg); + mainWindow->Append(bgBottomImg); + mainWindow->Append(btnLogo); + + if(currentMenu == MENU_GAMESELECTION) + ResumeGui(); + + // Load preferences + if(!LoadPrefs()) + SavePrefs(SILENT); + +#ifdef HW_RVL + static bool checkIOS = true; + + if(checkIOS) + { + u32 ios = IOS_GetVersion(); + + if(!SupportedIOS(ios)) + ErrorPrompt("The current IOS is unsupported. Functionality and/or stability may be adversely affected."); + else if(!SaneIOS(ios)) + ErrorPrompt("The current IOS has been altered (fake-signed). Functionality and/or stability may be adversely affected."); + } + + checkIOS = false; +#endif + + #ifndef NO_SOUND + bgMusic = new GuiSound(bg_music_ogg, bg_music_ogg_size, SOUND_OGG); + bgMusic->SetVolume(GCSettings.MusicVolume); + bgMusic->SetLoop(true); + enterSound = new GuiSound(enter_ogg, enter_ogg_size, SOUND_OGG); + enterSound->SetVolume(GCSettings.SFXVolume); + exitSound = new GuiSound(exit_ogg, exit_ogg_size, SOUND_OGG); + exitSound->SetVolume(GCSettings.SFXVolume); + if(currentMenu == MENU_GAMESELECTION) bgMusic->Play(); // startup music + #endif + + while(currentMenu != MENU_EXIT || SNESROMSize <= 0) + { + switch (currentMenu) + { + case MENU_GAMESELECTION: + currentMenu = MenuGameSelection(); + break; + case MENU_GAME: + currentMenu = MenuGame(); + break; + case MENU_GAME_LOAD: + currentMenu = MenuGameSaves(0); + break; + case MENU_GAME_SAVE: + currentMenu = MenuGameSaves(1); + break; + case MENU_GAMESETTINGS: + currentMenu = MenuGameSettings(); + break; + case MENU_GAMESETTINGS_MAPPINGS: + currentMenu = MenuSettingsMappings(); + break; + case MENU_GAMESETTINGS_MAPPINGS_CTRL: + currentMenu = MenuSettingsMappingsController(); + break; + case MENU_GAMESETTINGS_MAPPINGS_MAP: + currentMenu = MenuSettingsMappingsMap(); + break; + case MENU_GAMESETTINGS_VIDEO: + currentMenu = MenuSettingsVideo(); + break; + case MENU_GAMESETTINGS_CHEATS: + currentMenu = MenuGameCheats(); + break; + case MENU_SETTINGS: + currentMenu = MenuSettings(); + break; + case MENU_SETTINGS_FILE: + currentMenu = MenuSettingsFile(); + break; + case MENU_SETTINGS_MENU: + currentMenu = MenuSettingsMenu(); + break; + case MENU_SETTINGS_NETWORK: + currentMenu = MenuSettingsNetwork(); + break; + default: // unrecognized menu + currentMenu = MenuGameSelection(); + break; + } + lastMenu = currentMenu; + usleep(THREAD_SLEEP); + } + + #ifdef HW_RVL + ShutoffRumble(); + #endif + + CancelAction(); + HaltGui(); + + #ifdef HW_RVL + if(updatethread != LWP_THREAD_NULL) + LWP_JoinThread(updatethread, NULL); + #endif + + #ifndef NO_SOUND + delete bgMusic; + delete enterSound; + delete exitSound; + #endif + + delete btnLogo; + delete gameScreenImg; + delete bgTopImg; + delete bgBottomImg; + delete mainWindow; + + mainWindow = NULL; + + if(gameScreen) + delete gameScreen; + + if(gameScreenPng) + { + free(gameScreenPng); + gameScreenPng = NULL; + } + + // wait for keys to be depressed + while(MenuRequested()) + { + UpdatePads(); + usleep(THREAD_SLEEP); + } +} diff --git a/plugins/snes9x_gx/source/menu.h b/plugins/snes9x_gx/source/menu.h new file mode 100644 index 00000000..fc3cd73e --- /dev/null +++ b/plugins/snes9x_gx/source/menu.h @@ -0,0 +1,46 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * Tantric 2008-2010 + * + * menu.h + * + * Menu flow routines - handles all menu logic + ***************************************************************************/ + +#ifndef _MENU_H_ +#define _MENU_H_ + +#include <ogcsys.h> + +void InitGUIThreads(); +void MainMenu (int menuitem); +void ErrorPrompt(const char * msg); +int ErrorPromptRetry(const char * msg); +void InfoPrompt(const char * msg); +void ShowAction (const char *msg); +void CancelAction(); +void ShowProgress (const char *msg, int done, int total); +void ResetText(); + +enum +{ + MENU_EXIT = -1, + MENU_NONE, + MENU_SETTINGS, + MENU_SETTINGS_FILE, + MENU_SETTINGS_MENU, + MENU_SETTINGS_NETWORK, + MENU_GAMESELECTION, + MENU_GAME, + MENU_GAME_SAVE, + MENU_GAME_LOAD, + MENU_GAMESETTINGS, + MENU_GAMESETTINGS_MAPPINGS, + MENU_GAMESETTINGS_MAPPINGS_CTRL, + MENU_GAMESETTINGS_MAPPINGS_MAP, + MENU_GAMESETTINGS_VIDEO, + MENU_GAMESETTINGS_CHEATS +}; + +#endif diff --git a/plugins/snes9x_gx/source/networkop.cpp b/plugins/snes9x_gx/source/networkop.cpp new file mode 100644 index 00000000..55b8f1e4 --- /dev/null +++ b/plugins/snes9x_gx/source/networkop.cpp @@ -0,0 +1,399 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * Tantric 2008-2010 + * + * networkop.cpp + * + * Network and SMB support routines + ****************************************************************************/ + +#include <network.h> +#include <malloc.h> +#include <ogc/lwp_watchdog.h> +#include <smb.h> +#include <mxml.h> + +#include "snes9xgx.h" +#include "menu.h" +#include "fileop.h" +#include "filebrowser.h" +#include "utils/http.h" +#include "utils/unzip/unzip.h" +#include "utils/unzip/miniunz.h" + +static bool networkInit = false; +static bool networkShareInit = false; +char wiiIP[16] = { 0 }; + +#ifdef HW_RVL +static int netHalt = 0; +static bool updateChecked = true; // true if checked for app update +static char updateURL[128]; // URL of app update +bool updateFound = false; // true if an app update was found + +/**************************************************************************** + * UpdateCheck + * Checks for an update for the application + ***************************************************************************/ + +void UpdateCheck() +{ + // we only check for an update if we have internet + SD/USB + if(updateChecked || !networkInit) + return; + + if(!isMounted[DEVICE_SD] && !isMounted[DEVICE_USB]) + return; + + updateChecked = true; + u8 tmpbuffer[256]; + + if (http_request("http://snes9x-gx.googlecode.com/svn/trunk/update.xml", NULL, tmpbuffer, 256, SILENT) <= 0) + return; + + mxml_node_t *xml; + mxml_node_t *item; + + xml = mxmlLoadString(NULL, (char *)tmpbuffer, MXML_TEXT_CALLBACK); + + if(!xml) + return; + + // check settings version + item = mxmlFindElement(xml, xml, "app", "version", NULL, MXML_DESCEND); + if(item) // a version entry exists + { + const char * version = mxmlElementGetAttr(item, "version"); + + if(version && strlen(version) == 5) + { + int verMajor = version[0] - '0'; + int verMinor = version[2] - '0'; + int verPoint = version[4] - '0'; + int curMajor = APPVERSION[0] - '0'; + int curMinor = APPVERSION[2] - '0'; + int curPoint = APPVERSION[4] - '0'; + + // check that the versioning is valid and is a newer version + if((verMajor >= 0 && verMajor <= 9 && + verMinor >= 0 && verMinor <= 9 && + verPoint >= 0 && verPoint <= 9) && + (verMajor > curMajor || + (verMajor == curMajor && verMinor > curMinor) || + (verMajor == curMajor && verMinor == curMinor && verPoint > curPoint))) + { + item = mxmlFindElement(xml, xml, "file", NULL, NULL, MXML_DESCEND); + if(item) + { + const char * tmp = mxmlElementGetAttr(item, "url"); + if(tmp) + { + snprintf(updateURL, 128, "%s", tmp); + updateFound = false; + } + } + } + } + } + mxmlDelete(xml); +} + +static bool unzipArchive(char * zipfilepath, char * unzipfolderpath) +{ + unzFile uf = unzOpen(zipfilepath); + if (uf==NULL) + return false; + + if(chdir(unzipfolderpath)) // can't access dir + { + makedir(unzipfolderpath); // attempt to make dir + if(chdir(unzipfolderpath)) // still can't access dir + return false; + } + + extractZip(uf,0,1,0); + + unzCloseCurrentFile(uf); + return true; +} + +bool DownloadUpdate() +{ + bool result = false; + + if(updateURL[0] == 0 || appPath[0] == 0 || !ChangeInterface(appPath, NOTSILENT)) + { + ErrorPrompt("Update failed!"); + updateFound = false; // updating is finished (successful or not!) + return false; + } + + // stop checking if devices were removed/inserted + // since we're saving a file + HaltDeviceThread(); + + int device; + FindDevice(appPath, &device); + + char updateFile[50]; + sprintf(updateFile, "%s%s Update.zip", pathPrefix[device], APPNAME); + + FILE * hfile = fopen (updateFile, "wb"); + + if (hfile) + { + if(http_request(updateURL, hfile, NULL, (1024*1024*10), NOTSILENT) > 0) + { + fclose (hfile); + result = unzipArchive(updateFile, (char *)pathPrefix[device]); + } + else + { + fclose (hfile); + } + remove(updateFile); // delete update file + } + + // go back to checking if devices were inserted/removed + ResumeDeviceThread(); + + if(result) + InfoPrompt("Update successful!"); + else + ErrorPrompt("Update failed!"); + + updateFound = false; // updating is finished (successful or not!) + return result; +} + +/**************************************************************************** + * InitializeNetwork + * Initializes the Wii/GameCube network interface + ***************************************************************************/ + +static lwp_t networkthread = LWP_THREAD_NULL; +static u8 netstack[32768] ATTRIBUTE_ALIGN (32); + +static void * netcb (void *arg) +{ + s32 res=-1; + int retry; + int wait; + static bool prevInit = false; + + while(netHalt != 2) + { + retry = 5; + + while (retry>0 && (netHalt != 2)) + { + if(prevInit) + { + int i; + net_deinit(); + for(i=0; i < 400 && (netHalt != 2); i++) // 10 seconds to try to reset + { + res = net_get_status(); + if(res != -EBUSY) // trying to init net so we can't kill the net + { + usleep(2000); + net_wc24cleanup(); //kill the net + prevInit=false; // net_wc24cleanup is called only once + usleep(20000); + break; + } + usleep(20000); + } + } + + usleep(2000); + res = net_init_async(NULL, NULL); + + if(res != 0) + { + sleep(1); + retry--; + continue; + } + + res = net_get_status(); + wait = 400; // only wait 8 sec + while (res == -EBUSY && wait > 0 && (netHalt != 2)) + { + usleep(20000); + res = net_get_status(); + wait--; + } + + if(res==0) break; + retry--; + usleep(2000); + } + if (res == 0) + { + struct in_addr hostip; + hostip.s_addr = net_gethostip(); + if (hostip.s_addr) + { + strcpy(wiiIP, inet_ntoa(hostip)); + networkInit = true; + prevInit = true; + } + } + if(netHalt != 2) LWP_SuspendThread(networkthread); + } + return NULL; +} + +/**************************************************************************** + * StartNetworkThread + * + * Signals the network thread to resume, or creates a new thread + ***************************************************************************/ +void StartNetworkThread() +{ + netHalt = 0; + + if(networkthread == LWP_THREAD_NULL) + LWP_CreateThread(&networkthread, netcb, NULL, netstack, 8192, 40); + else + LWP_ResumeThread(networkthread); +} + +/**************************************************************************** + * StopNetworkThread + * + * Signals the network thread to stop + ***************************************************************************/ +void StopNetworkThread() +{ + if(networkthread == LWP_THREAD_NULL || !LWP_ThreadIsSuspended(networkthread)) + return; + + netHalt = 2; + LWP_ResumeThread(networkthread); + + // wait for thread to finish + LWP_JoinThread(networkthread, NULL); + networkthread = LWP_THREAD_NULL; +} + +#endif + +bool InitializeNetwork(bool silent) +{ +#ifdef HW_RVL + StopNetworkThread(); + + if(networkInit && net_gethostip() > 0) + return true; + + networkInit = false; +#else + if(networkInit) + return true; +#endif + + int retry = 1; + + while(retry) + { + ShowAction("Initializing network..."); + +#ifdef HW_RVL + u64 start = gettime(); + StartNetworkThread(); + + while (!LWP_ThreadIsSuspended(networkthread)) + { + usleep(50 * 1000); + + if(diff_sec(start, gettime()) > 10) // wait for 10 seconds max for net init + break; + } +#else + networkInit = !(if_config(wiiIP, NULL, NULL, true) < 0); +#endif + + CancelAction(); + + if(networkInit || silent) + break; + + retry = ErrorPromptRetry("Unable to initialize network!"); + +#ifdef HW_RVL + if(networkInit && net_gethostip() > 0) +#else + if(networkInit) +#endif + return true; + } + return networkInit; +} + +void CloseShare() +{ + if(networkShareInit) + smbClose("smb"); + networkShareInit = false; + isMounted[DEVICE_SMB] = false; +} + +/**************************************************************************** + * Mount SMB Share + ****************************************************************************/ + +bool +ConnectShare (bool silent) +{ + if(!InitializeNetwork(silent)) + return false; + + if(networkShareInit) + return true; + + int retry = 1; + int chkS = (strlen(GCSettings.smbshare) > 0) ? 0:1; + int chkI = (strlen(GCSettings.smbip) > 0) ? 0:1; + + // check that all parameters have been set + if(chkS + chkI > 0) + { + if(!silent) + { + char msg[50]; + char msg2[100]; + if(chkS + chkI > 1) // more than one thing is wrong + sprintf(msg, "Check settings.xml."); + else if(chkS) + sprintf(msg, "Share name is blank."); + else if(chkI) + sprintf(msg, "Share IP is blank."); + + sprintf(msg2, "Invalid network settings - %s", msg); + ErrorPrompt(msg2); + } + return false; + } + + while(retry) + { + if(!silent) + ShowAction ("Connecting to network share..."); + + if(smbInit(GCSettings.smbuser, GCSettings.smbpwd, GCSettings.smbshare, GCSettings.smbip)) + networkShareInit = true; + + if(networkShareInit || silent) + break; + + retry = ErrorPromptRetry("Failed to connect to network share."); + } + + if(!silent) + CancelAction(); + + return networkShareInit; +} diff --git a/plugins/snes9x_gx/source/networkop.h b/plugins/snes9x_gx/source/networkop.h new file mode 100644 index 00000000..3720c230 --- /dev/null +++ b/plugins/snes9x_gx/source/networkop.h @@ -0,0 +1,23 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * Tantric 2008-2010 + * + * networkop.h + * + * Network and SMB support routines + ****************************************************************************/ + +#ifndef _NETWORKOP_H_ +#define _NETWORKOP_H_ + +void UpdateCheck(); +bool DownloadUpdate(); +void StartNetworkThread(); +bool InitializeNetwork(bool silent); +bool ConnectShare (bool silent); +void CloseShare(); + +extern bool updateFound; + +#endif diff --git a/plugins/snes9x_gx/source/preferences.cpp b/plugins/snes9x_gx/source/preferences.cpp new file mode 100644 index 00000000..93527c59 --- /dev/null +++ b/plugins/snes9x_gx/source/preferences.cpp @@ -0,0 +1,661 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * Tantric 2008-2010 + * + * preferences.cpp + * + * Preferences save/load to XML file + ***************************************************************************/ + +#include <gccore.h> +#include <stdio.h> +#include <string.h> +#include <dirent.h> +#include <ogcsys.h> +#include <mxml.h> + +#include "snes9xgx.h" +#include "menu.h" +#include "fileop.h" +#include "filebrowser.h" +#include "input.h" +#include "button_mapping.h" + +struct SGCSettings GCSettings; + +/**************************************************************************** + * Prepare Preferences Data + * + * This sets up the save buffer for saving. + ***************************************************************************/ +static mxml_node_t *xml = NULL; +static mxml_node_t *data = NULL; +static mxml_node_t *section = NULL; +static mxml_node_t *item = NULL; +static mxml_node_t *elem = NULL; + +static char temp[200]; + +static const char * toStr(int i) +{ + sprintf(temp, "%d", i); + return temp; +} + +static const char * FtoStr(float i) +{ + sprintf(temp, "%.2f", i); + return temp; +} + +static void createXMLSection(const char * name, const char * description) +{ + section = mxmlNewElement(data, "section"); + mxmlElementSetAttr(section, "name", name); + mxmlElementSetAttr(section, "description", description); +} + +static void createXMLSetting(const char * name, const char * description, const char * value) +{ + item = mxmlNewElement(section, "setting"); + mxmlElementSetAttr(item, "name", name); + mxmlElementSetAttr(item, "value", value); + mxmlElementSetAttr(item, "description", description); +} + +static void createXMLController(unsigned int controller[], const char * name, const char * description) +{ + item = mxmlNewElement(section, "controller"); + mxmlElementSetAttr(item, "name", name); + mxmlElementSetAttr(item, "description", description); + + // create buttons + for(int i=0; i < MAXJP; i++) + { + elem = mxmlNewElement(item, "button"); + mxmlElementSetAttr(elem, "number", toStr(i)); + mxmlElementSetAttr(elem, "assignment", toStr(controller[i])); + } +} + +static const char * XMLSaveCallback(mxml_node_t *node, int where) +{ + const char *name; + + name = node->value.element.name; + + if(where == MXML_WS_BEFORE_CLOSE) + { + if(!strcmp(name, "file") || !strcmp(name, "section")) + return ("\n"); + else if(!strcmp(name, "controller")) + return ("\n\t"); + } + if (where == MXML_WS_BEFORE_OPEN) + { + if(!strcmp(name, "file")) + return ("\n"); + else if(!strcmp(name, "section")) + return ("\n\n"); + else if(!strcmp(name, "setting") || !strcmp(name, "controller")) + return ("\n\t"); + else if(!strcmp(name, "button")) + return ("\n\t\t"); + } + return (NULL); +} + +static int +preparePrefsData () +{ + xml = mxmlNewXML("1.0"); + mxmlSetWrapMargin(0); // disable line wrapping + + data = mxmlNewElement(xml, "file"); + mxmlElementSetAttr(data, "app", APPNAME); + mxmlElementSetAttr(data, "version", APPVERSION); + + createXMLSection("File", "File Settings"); + + createXMLSetting("AutoLoad", "Auto Load", toStr(GCSettings.AutoLoad)); + createXMLSetting("AutoSave", "Auto Save", toStr(GCSettings.AutoSave)); + createXMLSetting("LoadMethod", "Load Method", toStr(GCSettings.LoadMethod)); + createXMLSetting("SaveMethod", "Save Method", toStr(GCSettings.SaveMethod)); + createXMLSetting("LoadFolder", "Load Folder", GCSettings.LoadFolder); + createXMLSetting("LastFileLoaded", "Last File Loaded", GCSettings.LastFileLoaded); + createXMLSetting("SaveFolder", "Save Folder", GCSettings.SaveFolder); + createXMLSetting("CheatFolder", "Cheats Folder", GCSettings.CheatFolder); + createXMLSetting("ScreenshotsFolder", "Screenshots Folder", GCSettings.ScreenshotsFolder); + + createXMLSection("Network", "Network Settings"); + + createXMLSetting("smbip", "Share Computer IP", GCSettings.smbip); + createXMLSetting("smbshare", "Share Name", GCSettings.smbshare); + createXMLSetting("smbuser", "Share Username", GCSettings.smbuser); + createXMLSetting("smbpwd", "Share Password", GCSettings.smbpwd); + + createXMLSection("Video", "Video Settings"); + + createXMLSetting("videomode", "Video Mode", toStr(GCSettings.videomode)); + createXMLSetting("zoomHor", "Horizontal Zoom Level", FtoStr(GCSettings.zoomHor)); + createXMLSetting("zoomVert", "Vertical Zoom Level", FtoStr(GCSettings.zoomVert)); + createXMLSetting("render", "Video Filtering", toStr(GCSettings.render)); + createXMLSetting("widescreen", "Aspect Ratio Correction", toStr(GCSettings.widescreen)); + createXMLSetting("crosshair", "Crosshair", toStr(GCSettings.crosshair)); + createXMLSetting("FilterMethod", "Filter Method", toStr(GCSettings.FilterMethod)); + createXMLSetting("xshift", "Horizontal Video Shift", toStr(GCSettings.xshift)); + createXMLSetting("yshift", "Vertical Video Shift", toStr(GCSettings.yshift)); + + createXMLSection("Menu", "Menu Settings"); + + createXMLSetting("WiimoteOrientation", "Wiimote Orientation", toStr(GCSettings.WiimoteOrientation)); + createXMLSetting("ExitAction", "Exit Action", toStr(GCSettings.ExitAction)); + createXMLSetting("MusicVolume", "Music Volume", toStr(GCSettings.MusicVolume)); + createXMLSetting("SFXVolume", "Sound Effects Volume", toStr(GCSettings.SFXVolume)); + createXMLSetting("Rumble", "Rumble", toStr(GCSettings.Rumble)); + createXMLSetting("language", "Language", toStr(GCSettings.language)); + + createXMLSection("Controller", "Controller Settings"); + + createXMLSetting("Controller", "Controller", toStr(GCSettings.Controller)); + + createXMLController(btnmap[CTRL_PAD][CTRLR_GCPAD], "btnmap_pad_gcpad", "SNES Pad - GameCube Controller"); + createXMLController(btnmap[CTRL_PAD][CTRLR_WIIMOTE], "btnmap_pad_wiimote", "SNES Pad - Wiimote"); + createXMLController(btnmap[CTRL_PAD][CTRLR_CLASSIC], "btnmap_pad_classic", "SNES Pad - Classic Controller"); + createXMLController(btnmap[CTRL_PAD][CTRLR_NUNCHUK], "btnmap_pad_nunchuk", "SNES Pad - Nunchuk + Wiimote"); + createXMLController(btnmap[CTRL_SCOPE][CTRLR_GCPAD], "btnmap_scope_gcpad", "Superscope - GameCube Controller"); + createXMLController(btnmap[CTRL_SCOPE][CTRLR_WIIMOTE], "btnmap_scope_wiimote", "Superscope - Wiimote"); + createXMLController(btnmap[CTRL_MOUSE][CTRLR_GCPAD], "btnmap_mouse_gcpad", "Mouse - GameCube Controller"); + createXMLController(btnmap[CTRL_MOUSE][CTRLR_WIIMOTE], "btnmap_mouse_wiimote", "Mouse - Wiimote"); + createXMLController(btnmap[CTRL_JUST][CTRLR_GCPAD], "btnmap_just_gcpad", "Justifier - GameCube Controller"); + createXMLController(btnmap[CTRL_JUST][CTRLR_WIIMOTE], "btnmap_just_wiimote", "Justifier - Wiimote"); + + int datasize = mxmlSaveString(xml, (char *)savebuffer, SAVEBUFFERSIZE, XMLSaveCallback); + + mxmlDelete(xml); + + return datasize; +} + +/**************************************************************************** + * loadXMLSetting + * + * Load XML elements into variables for an individual variable + ***************************************************************************/ + +static void loadXMLSetting(char * var, const char * name, int maxsize) +{ + item = mxmlFindElement(xml, xml, "setting", "name", name, MXML_DESCEND); + if(item) + { + const char * tmp = mxmlElementGetAttr(item, "value"); + if(tmp) + snprintf(var, maxsize, "%s", tmp); + } +} +static void loadXMLSetting(int * var, const char * name) +{ + item = mxmlFindElement(xml, xml, "setting", "name", name, MXML_DESCEND); + if(item) + { + const char * tmp = mxmlElementGetAttr(item, "value"); + if(tmp) + *var = atoi(tmp); + } +} +static void loadXMLSetting(float * var, const char * name) +{ + item = mxmlFindElement(xml, xml, "setting", "name", name, MXML_DESCEND); + if(item) + { + const char * tmp = mxmlElementGetAttr(item, "value"); + if(tmp) + *var = atof(tmp); + } +} + +/**************************************************************************** + * loadXMLController + * + * Load XML elements into variables for a controller mapping + ***************************************************************************/ + +static void loadXMLController(unsigned int controller[], const char * name) +{ + item = mxmlFindElement(xml, xml, "controller", "name", name, MXML_DESCEND); + + if(item) + { + // populate buttons + for(int i=0; i < MAXJP; i++) + { + elem = mxmlFindElement(item, xml, "button", "number", toStr(i), MXML_DESCEND); + if(elem) + { + const char * tmp = mxmlElementGetAttr(elem, "assignment"); + if(tmp) + controller[i] = atoi(tmp); + } + } + } +} + +/**************************************************************************** + * decodePrefsData + * + * Decodes preferences - parses XML and loads preferences into the variables + ***************************************************************************/ + +static bool +decodePrefsData () +{ + bool result = false; + + xml = mxmlLoadString(NULL, (char *)savebuffer, MXML_TEXT_CALLBACK); + + if(xml) + { + // check settings version + item = mxmlFindElement(xml, xml, "file", "version", NULL, MXML_DESCEND); + if(item) // a version entry exists + { + const char * version = mxmlElementGetAttr(item, "version"); + + if(version && strlen(version) == 5) + { + // this code assumes version in format X.X.X + // XX.X.X, X.XX.X, or X.X.XX will NOT work + int verMajor = version[0] - '0'; + int verMinor = version[2] - '0'; + int verPoint = version[4] - '0'; + int curMajor = APPVERSION[0] - '0'; + int curMinor = APPVERSION[2] - '0'; + int curPoint = APPVERSION[4] - '0'; + + // first we'll check that the versioning is valid + if(!(verMajor >= 0 && verMajor <= 9 && + verMinor >= 0 && verMinor <= 9 && + verPoint >= 0 && verPoint <= 9)) + result = false; + else if(verMajor < 4) // less than version 4.0.0 + result = false; // reset settings + else if(verMajor == 4 && verMinor == 0 && verPoint < 2) // anything less than 4.0.2 + result = false; // reset settings + else if((verMajor*100 + verMinor*10 + verPoint) > + (curMajor*100 + curMinor*10 + curPoint)) // some future version + result = false; // reset settings + else + result = true; + } + } + + if(result) + { + // File Settings + + loadXMLSetting(&GCSettings.AutoLoad, "AutoLoad"); + loadXMLSetting(&GCSettings.AutoSave, "AutoSave"); + loadXMLSetting(&GCSettings.LoadMethod, "LoadMethod"); + loadXMLSetting(&GCSettings.SaveMethod, "SaveMethod"); + loadXMLSetting(GCSettings.LoadFolder, "LoadFolder", sizeof(GCSettings.LoadFolder)); + loadXMLSetting(GCSettings.LastFileLoaded, "LastFileLoaded", sizeof(GCSettings.LastFileLoaded)); + loadXMLSetting(GCSettings.SaveFolder, "SaveFolder", sizeof(GCSettings.SaveFolder)); + loadXMLSetting(GCSettings.CheatFolder, "CheatFolder", sizeof(GCSettings.CheatFolder)); + loadXMLSetting(GCSettings.ScreenshotsFolder, "ScreenshotsFolder", sizeof(GCSettings.ScreenshotsFolder)); + + // Network Settings + + loadXMLSetting(GCSettings.smbip, "smbip", sizeof(GCSettings.smbip)); + loadXMLSetting(GCSettings.smbshare, "smbshare", sizeof(GCSettings.smbshare)); + loadXMLSetting(GCSettings.smbuser, "smbuser", sizeof(GCSettings.smbuser)); + loadXMLSetting(GCSettings.smbpwd, "smbpwd", sizeof(GCSettings.smbpwd)); + + // Video Settings + + loadXMLSetting(&GCSettings.videomode, "videomode"); + loadXMLSetting(&GCSettings.zoomHor, "zoomHor"); + loadXMLSetting(&GCSettings.zoomVert, "zoomVert"); + loadXMLSetting(&GCSettings.render, "render"); + loadXMLSetting(&GCSettings.widescreen, "widescreen"); + loadXMLSetting(&GCSettings.crosshair, "crosshair"); + loadXMLSetting(&GCSettings.FilterMethod, "FilterMethod"); + loadXMLSetting(&GCSettings.xshift, "xshift"); + loadXMLSetting(&GCSettings.yshift, "yshift"); + + // Menu Settings + + loadXMLSetting(&GCSettings.WiimoteOrientation, "WiimoteOrientation"); + loadXMLSetting(&GCSettings.ExitAction, "ExitAction"); + loadXMLSetting(&GCSettings.MusicVolume, "MusicVolume"); + loadXMLSetting(&GCSettings.SFXVolume, "SFXVolume"); + loadXMLSetting(&GCSettings.Rumble, "Rumble"); + loadXMLSetting(&GCSettings.language, "language"); + + // Controller Settings + + loadXMLSetting(&GCSettings.Controller, "Controller"); + + loadXMLController(btnmap[CTRL_PAD][CTRLR_GCPAD], "btnmap_pad_gcpad"); + loadXMLController(btnmap[CTRL_PAD][CTRLR_WIIMOTE], "btnmap_pad_wiimote"); + loadXMLController(btnmap[CTRL_PAD][CTRLR_CLASSIC], "btnmap_pad_classic"); + loadXMLController(btnmap[CTRL_PAD][CTRLR_NUNCHUK], "btnmap_pad_nunchuk"); + loadXMLController(btnmap[CTRL_SCOPE][CTRLR_GCPAD], "btnmap_scope_gcpad"); + loadXMLController(btnmap[CTRL_SCOPE][CTRLR_WIIMOTE], "btnmap_scope_wiimote"); + loadXMLController(btnmap[CTRL_MOUSE][CTRLR_GCPAD], "btnmap_mouse_gcpad"); + loadXMLController(btnmap[CTRL_MOUSE][CTRLR_WIIMOTE], "btnmap_mouse_wiimote"); + loadXMLController(btnmap[CTRL_JUST][CTRLR_GCPAD], "btnmap_just_gcpad"); + loadXMLController(btnmap[CTRL_JUST][CTRLR_WIIMOTE], "btnmap_just_wiimote"); + } + mxmlDelete(xml); + } + return result; +} + +/**************************************************************************** + * FixInvalidSettings + * + * Attempts to correct at least some invalid settings - the ones that + * might cause crashes + ***************************************************************************/ +void FixInvalidSettings() +{ + if(GCSettings.LoadMethod > 6) + GCSettings.LoadMethod = DEVICE_AUTO; + if(GCSettings.SaveMethod > 6) + GCSettings.SaveMethod = DEVICE_AUTO; + if(!(GCSettings.zoomHor > 0.5 && GCSettings.zoomHor < 1.5)) + GCSettings.zoomHor = 1.0; + if(!(GCSettings.zoomVert > 0.5 && GCSettings.zoomVert < 1.5)) + GCSettings.zoomVert = 1.0; + if(!(GCSettings.xshift > -50 && GCSettings.xshift < 50)) + GCSettings.xshift = 0; + if(!(GCSettings.yshift > -50 && GCSettings.yshift < 50)) + GCSettings.yshift = 0; + if(!(GCSettings.MusicVolume >= 0 && GCSettings.MusicVolume <= 100)) + GCSettings.MusicVolume = 40; + if(!(GCSettings.SFXVolume >= 0 && GCSettings.SFXVolume <= 100)) + GCSettings.SFXVolume = 40; + if(GCSettings.language < 0 || GCSettings.language >= LANG_LENGTH) + GCSettings.language = LANG_ENGLISH; + if(GCSettings.Controller > CTRL_PAD4 || GCSettings.Controller < CTRL_MOUSE) + GCSettings.Controller = CTRL_PAD2; + if(!(GCSettings.render >= 0 && GCSettings.render < 3)) + GCSettings.render = 2; + if(!(GCSettings.videomode >= 0 && GCSettings.videomode < 5)) + GCSettings.videomode = 0; +} + +/**************************************************************************** + * DefaultSettings + * + * Sets all the defaults! + ***************************************************************************/ +void +DefaultSettings () +{ + memset (&GCSettings, 0, sizeof (GCSettings)); + + ResetControls(); // controller button mappings + + GCSettings.LoadMethod = DEVICE_AUTO; // Auto, SD, DVD, USB, Network (SMB) + GCSettings.SaveMethod = DEVICE_AUTO; // Auto, SD, USB, Network (SMB) + sprintf (GCSettings.LoadFolder, "%s/roms", APPFOLDER); // Path to game files + sprintf (GCSettings.SaveFolder, "%s/saves", APPFOLDER); // Path to save files + sprintf (GCSettings.CheatFolder, "%s/cheats", APPFOLDER); // Path to cheat files + sprintf (GCSettings.ScreenshotsFolder, "%s/screenshots", APPFOLDER); // Path to cheat files + GCSettings.AutoLoad = 1; + GCSettings.AutoSave = 1; + + GCSettings.Controller = CTRL_PAD2; + + GCSettings.videomode = 0; // automatic video mode detection + GCSettings.render = 2; // Unfiltered + GCSettings.FilterMethod = FILTER_NONE; // no hq2x + + GCSettings.widescreen = 0; // no aspect ratio correction + GCSettings.zoomHor = 1.0; // horizontal zoom level + GCSettings.zoomVert = 1.0; // vertical zoom level + GCSettings.xshift = 0; // horizontal video shift + GCSettings.yshift = 0; // vertical video shift + GCSettings.crosshair = 1; + + GCSettings.WiimoteOrientation = 0; + GCSettings.ExitAction = 0; + GCSettings.MusicVolume = 40; + GCSettings.SFXVolume = 40; + GCSettings.Rumble = 1; +#ifdef HW_RVL + GCSettings.language = CONF_GetLanguage(); + + if(GCSettings.language == LANG_JAPANESE || + GCSettings.language == LANG_SIMP_CHINESE || + GCSettings.language == LANG_TRAD_CHINESE || + GCSettings.language == LANG_KOREAN) + GCSettings.language = LANG_ENGLISH; +#else + GCSettings.language = LANG_ENGLISH; +#endif + + /****************** SNES9x Settings ***********************/ + + // Default ALL to false + memset (&Settings, 0, sizeof (Settings)); + + // General + + Settings.MouseMaster = true; + Settings.SuperScopeMaster = true; + Settings.JustifierMaster = true; + Settings.MultiPlayer5Master = true; + Settings.DontSaveOopsSnapshot = true; + Settings.ApplyCheats = true; + + Settings.BlockInvalidVRAMAccess = false; + Settings.HDMATimingHack = 100; + + // Sound defaults. On Wii this is 32Khz/16bit/Stereo + //Settings.SoundSync = true; + Settings.SixteenBitSound = true; + Settings.Stereo = true; + Settings.ReverseStereo = true; + Settings.SoundPlaybackRate = 32000; + Settings.SoundInputRate = 31953; + + // Graphics + Settings.Transparency = true; + Settings.SupportHiRes = true; + Settings.SkipFrames = AUTO_FRAMERATE; + Settings.TurboSkipFrames = 19; + Settings.DisplayFrameRate = false; + Settings.AutoDisplayMessages = 0; + Settings.InitialInfoStringTimeout = 200; // # frames to display messages for + + // Frame timings in 50hz and 60hz cpu mode + Settings.FrameTimePAL = 20000; + Settings.FrameTimeNTSC = 16667; +} + +/**************************************************************************** + * Save Preferences + ***************************************************************************/ +static char prefpath[MAXPATHLEN] = { 0 }; + +bool +SavePrefs (bool silent) +{ + char filepath[MAXPATHLEN]; + int datasize; + int offset = 0; + int device = 0; + + if(prefpath[0] != 0) + { + sprintf(filepath, "%s/%s", prefpath, PREF_FILE_NAME); + FindDevice(filepath, &device); + } + else if(appPath[0] != 0) + { + sprintf(filepath, "%s/%s", appPath, PREF_FILE_NAME); + strcpy(prefpath, appPath); + FindDevice(filepath, &device); + } + else + { + device = autoSaveMethod(silent); + + if(device == 0) + return false; + + sprintf(filepath, "%s%s", pathPrefix[device], APPFOLDER); + DIR *dir = opendir(filepath); + if (!dir) + { + if(mkdir(filepath, 0777) != 0) + return false; + sprintf(filepath, "%s%s/roms", pathPrefix[device], APPFOLDER); + if(mkdir(filepath, 0777) != 0) + return false; + sprintf(filepath, "%s%s/saves", pathPrefix[device], APPFOLDER); + if(mkdir(filepath, 0777) != 0) + return false; + } + else + { + closedir(dir); + } + sprintf(filepath, "%s%s/%s", pathPrefix[device], APPFOLDER, PREF_FILE_NAME); + sprintf(prefpath, "%s%s", pathPrefix[device], APPFOLDER); + } + + if(device == 0) + return false; + + if (!silent) + ShowAction ("Saving preferences..."); + + FixInvalidSettings(); + + AllocSaveBuffer (); + datasize = preparePrefsData (); + + offset = SaveFile(filepath, datasize, silent); + + FreeSaveBuffer (); + + CancelAction(); + + if (offset > 0) + { + if (!silent) + InfoPrompt("Preferences saved"); + return true; + } + return false; +} + +/**************************************************************************** + * Load Preferences from specified filepath + ***************************************************************************/ +bool +LoadPrefsFromMethod (char * path) +{ + bool retval = false; + int offset = 0; + char filepath[MAXPATHLEN]; + sprintf(filepath, "%s/%s", path, PREF_FILE_NAME); + + AllocSaveBuffer (); + + offset = LoadFile(filepath, SILENT); + + if (offset > 0) + retval = decodePrefsData (); + + FreeSaveBuffer (); + + if(retval) + { + strcpy(prefpath, path); + + if(appPath[0] == 0) + strcpy(appPath, prefpath); + } + + return retval; +} + +/**************************************************************************** + * Load Preferences + * Checks sources consecutively until we find a preference file + ***************************************************************************/ +static bool prefLoaded = false; + +bool LoadPrefs() +{ + if(prefLoaded) // already attempted loading + return true; + + bool prefFound = false; + char filepath[5][MAXPATHLEN]; + int numDevices; + +#ifdef HW_RVL + numDevices = 5; + sprintf(filepath[0], "%s", appPath); + sprintf(filepath[1], "sd:/apps/%s", APPFOLDER); + sprintf(filepath[2], "usb:/apps/%s", APPFOLDER); + sprintf(filepath[3], "sd:/%s", APPFOLDER); + sprintf(filepath[4], "usb:/%s", APPFOLDER); +#else + numDevices = 2; + sprintf(filepath[0], "carda:/%s", APPFOLDER); + sprintf(filepath[1], "cardb:/%s", APPFOLDER); +#endif + + for(int i=0; i<numDevices; i++) + { + prefFound = LoadPrefsFromMethod(filepath[i]); + + if(prefFound) + break; + } + + prefLoaded = true; // attempted to load preferences + + if(prefFound) + FixInvalidSettings(); + + // rename snes9x to snes9xgx + if(GCSettings.LoadMethod == DEVICE_SD) + { + if(ChangeInterface(DEVICE_SD, NOTSILENT) && opendir("sd:/snes9x")) + rename("sd:/snes9x", "sd:/snes9xgx"); + } + else if(GCSettings.LoadMethod == DEVICE_USB) + { + if(ChangeInterface(DEVICE_USB, NOTSILENT) && opendir("usb:/snes9x")) + rename("usb:/snes9x", "usb:/snes9xgx"); + } + else if(GCSettings.LoadMethod == DEVICE_SMB) + { + if(ChangeInterface(DEVICE_SMB, NOTSILENT) && opendir("smb:/snes9x")) + rename("smb:/snes9x", "smb:/snes9xgx"); + } + + // update folder locations + if(strcmp(GCSettings.LoadFolder, "snes9x/roms") == 0) + sprintf(GCSettings.LoadFolder, "snes9xgx/roms"); + + if(strcmp(GCSettings.SaveFolder, "snes9x/saves") == 0) + sprintf(GCSettings.SaveFolder, "snes9xgx/saves"); + + if(strcmp(GCSettings.CheatFolder, "snes9x/cheats") == 0) + sprintf(GCSettings.CheatFolder, "snes9xgx/cheats"); + + if(strcmp(GCSettings.ScreenshotsFolder, "snes9x/screenshots") == 0) + sprintf(GCSettings.ScreenshotsFolder, "snes9xgx/screenshots"); + + ResetText(); + return prefFound; +} diff --git a/plugins/snes9x_gx/source/preferences.h b/plugins/snes9x_gx/source/preferences.h new file mode 100644 index 00000000..3f766d32 --- /dev/null +++ b/plugins/snes9x_gx/source/preferences.h @@ -0,0 +1,14 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * Tantric 2008-2010 + * + * preferences.h + * + * Preferences save/load to XML file + ***************************************************************************/ + +void FixInvalidSettings(); +void DefaultSettings(); +bool SavePrefs (bool silent); +bool LoadPrefs (); diff --git a/plugins/snes9x_gx/source/s9xsupport.cpp b/plugins/snes9x_gx/source/s9xsupport.cpp new file mode 100644 index 00000000..579c9f38 --- /dev/null +++ b/plugins/snes9x_gx/source/s9xsupport.cpp @@ -0,0 +1,268 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * softdev July 2006 + * crunchy2 May 2007 + * Michniewski 2008 + * Tantric 2008-2010 + * + * s9xsupport.cpp + * + * Snes9x support functions + ***************************************************************************/ + +#include <gccore.h> +#include <ogcsys.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <ogc/lwp_watchdog.h> + +#include "snes9xgx.h" +#include "video.h" +#include "audio.h" +#include "snes9x/snes9x.h" +#include "snes9x/memmap.h" +#include "snes9x/display.h" +#include "snes9x/apu/apu.h" +#include "snes9x/controls.h" + +#define MAX_MESSAGE_LEN (36 * 3) + +static long long prev; +static long long now; + +/*** Miscellaneous Functions ***/ +void S9xExit() +{ + ExitApp(); +} + +void S9xMessage(int /*type */, int /*number */, const char *message) +{ + static char buffer[MAX_MESSAGE_LEN + 1]; + snprintf(buffer, MAX_MESSAGE_LEN, "%s", message); + S9xSetInfoString(buffer); +} + +void S9xAutoSaveSRAM() +{ + +} + +/*** Sound based functions ***/ +void S9xToggleSoundChannel(int c) +{ + static int sound_switch = 255; + + if (c == 8) + sound_switch = 255; + else + sound_switch ^= 1 << c; + + S9xSetSoundControl (sound_switch); +} + +/**************************************************************************** + * OpenSoundDevice + * + * Main initialisation for Wii sound system + ***************************************************************************/ +bool8 S9xOpenSoundDevice(void) +{ + InitAudio(); + return TRUE; +} + +/* eke-eke */ +void S9xInitSync() +{ + FrameTimer = 0; + prev = gettime(); +} + +/*** Synchronisation ***/ + +void S9xSyncSpeed () +{ + while (!S9xSyncSound()) + usleep(10); + + uint32 skipFrms = Settings.SkipFrames; + + if (Settings.TurboMode) + skipFrms = Settings.TurboSkipFrames; + + if (timerstyle == 0) /* use Wii vertical sync (VSYNC) with NTSC roms */ + { + while (FrameTimer == 0) + { + usleep(50); + } + + if (FrameTimer > skipFrms) + FrameTimer = skipFrms; + + if ((FrameTimer > 1) && (IPPU.SkippedFrames < skipFrms)) + { + IPPU.SkippedFrames++; + IPPU.RenderThisFrame = FALSE; + } + else + { + IPPU.SkippedFrames = 0; + IPPU.RenderThisFrame = TRUE; + } + } + else /* use internal timer for PAL roms */ + { + unsigned int timediffallowed = Settings.TurboMode ? 0 : Settings.FrameTime; + now = gettime(); + + if (diff_usec(prev, now) > timediffallowed) + { + /* Timer has already expired */ + if (IPPU.SkippedFrames < skipFrms) + { + IPPU.SkippedFrames++; + IPPU.RenderThisFrame = FALSE; + } + else + { + IPPU.SkippedFrames = 0; + IPPU.RenderThisFrame = TRUE; + } + } + else + { + /*** Ahead - so hold up ***/ + while (diff_usec(prev, now) < timediffallowed) + { + now = gettime(); + usleep(50); + } + IPPU.RenderThisFrame = TRUE; + IPPU.SkippedFrames = 0; + } + + prev = now; + } + + if (!Settings.TurboMode) + FrameTimer--; + return; +} + +/*** Video / Display related functions ***/ +bool8 S9xInitUpdate() +{ + return (TRUE); +} + +bool8 S9xDeinitUpdate(int Width, int Height) +{ + update_video(Width, Height); + return (TRUE); +} + +bool8 S9xContinueUpdate(int Width, int Height) +{ + return (TRUE); +} + +void S9xSetPalette() +{ + return; +} + +/*** Input functions ***/ +void S9xHandlePortCommand(s9xcommand_t cmd, int16 data1, int16 data2) +{ + return; +} + +bool S9xPollButton(uint32 id, bool * pressed) +{ + return 0; +} + +bool S9xPollAxis(uint32 id, int16 * value) +{ + return 0; +} + +bool S9xPollPointer(uint32 id, int16 * x, int16 * y) +{ + return 0; +} + +/**************************************************************************** + * Note that these are DUMMY functions, and only allow Snes9x to + * compile. Where possible, they will return an error signal. + ***************************************************************************/ + +const char *S9xChooseFilename(bool8 read_only) +{ + ExitApp(); + return NULL; +} + +const char * S9xChooseMovieFilename(bool8 read_only) +{ + ExitApp(); + return NULL; +} + +const char * S9xGetDirectory(enum s9x_getdirtype dirtype) +{ + ExitApp(); + return NULL; +} + +const char * S9xGetFilename(const char *ex, enum s9x_getdirtype dirtype) +{ + ExitApp(); + return NULL; +} + +const char * S9xGetFilenameInc(const char *e, enum s9x_getdirtype dirtype) +{ + ExitApp(); + return NULL; +} + +const char * S9xBasename(const char *name) +{ + ExitApp(); + return name; +} + +const char * S9xStringInput (const char * s) +{ + ExitApp(); + return s; +} + +void _splitpath(char const *buf, char *drive, char *dir, char *fname, char *ext) +{ + ExitApp(); +} + +void _makepath(char *filename, const char *drive, const char *dir, + const char *fname, const char *ext) +{ + ExitApp(); +} + +int dup(int fildes) +{ + ExitApp(); + return 1; +} + +int access(const char *pathname, int mode) +{ + ExitApp(); + return 1; +} diff --git a/plugins/snes9x_gx/source/snes9x/65c816.h b/plugins/snes9x_gx/source/snes9x/65c816.h new file mode 100644 index 00000000..995fcbbb --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/65c816.h @@ -0,0 +1,276 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _65C816_H_ +#define _65C816_H_ + +#define Carry 1 +#define Zero 2 +#define IRQ 4 +#define Decimal 8 +#define IndexFlag 16 +#define MemoryFlag 32 +#define Overflow 64 +#define Negative 128 +#define Emulation 256 + +#define SetCarry() (ICPU._Carry = 1) +#define ClearCarry() (ICPU._Carry = 0) +#define SetZero() (ICPU._Zero = 0) +#define ClearZero() (ICPU._Zero = 1) +#define SetIRQ() (Registers.PL |= IRQ) +#define ClearIRQ() (Registers.PL &= ~IRQ) +#define SetDecimal() (Registers.PL |= Decimal) +#define ClearDecimal() (Registers.PL &= ~Decimal) +#define SetIndex() (Registers.PL |= IndexFlag) +#define ClearIndex() (Registers.PL &= ~IndexFlag) +#define SetMemory() (Registers.PL |= MemoryFlag) +#define ClearMemory() (Registers.PL &= ~MemoryFlag) +#define SetOverflow() (ICPU._Overflow = 1) +#define ClearOverflow() (ICPU._Overflow = 0) +#define SetNegative() (ICPU._Negative = 0x80) +#define ClearNegative() (ICPU._Negative = 0) + +#define CheckCarry() (ICPU._Carry) +#define CheckZero() (ICPU._Zero == 0) +#define CheckIRQ() (Registers.PL & IRQ) +#define CheckDecimal() (Registers.PL & Decimal) +#define CheckIndex() (Registers.PL & IndexFlag) +#define CheckMemory() (Registers.PL & MemoryFlag) +#define CheckOverflow() (ICPU._Overflow) +#define CheckNegative() (ICPU._Negative & 0x80) +#define CheckEmulation() (Registers.P.W & Emulation) + +#define SetFlags(f) (Registers.P.W |= (f)) +#define ClearFlags(f) (Registers.P.W &= ~(f)) +#define CheckFlag(f) (Registers.PL & (f)) + +typedef union +{ +#ifdef LSB_FIRST + struct { uint8 l, h; } B; +#else + struct { uint8 h, l; } B; +#endif + uint16 W; +} pair; + +typedef union +{ +#ifdef LSB_FIRST + struct { uint8 xPCl, xPCh, xPB, z; } B; + struct { uint16 xPC, d; } W; +#else + struct { uint8 z, xPB, xPCh, xPCl; } B; + struct { uint16 d, xPC; } W; +#endif + uint32 xPBPC; +} PC_t; + +struct SRegisters +{ + uint8 DB; + pair P; + pair A; + pair D; + pair S; + pair X; + pair Y; + PC_t PC; +}; + +#define AL A.B.l +#define AH A.B.h +#define XL X.B.l +#define XH X.B.h +#define YL Y.B.l +#define YH Y.B.h +#define SL S.B.l +#define SH S.B.h +#define DL D.B.l +#define DH D.B.h +#define PL P.B.l +#define PH P.B.h +#define PBPC PC.xPBPC +#define PCw PC.W.xPC +#define PCh PC.B.xPCh +#define PCl PC.B.xPCl +#define PB PC.B.xPB + +extern struct SRegisters Registers; + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/apu/SNES_SPC.cpp b/plugins/snes9x_gx/source/snes9x/apu/SNES_SPC.cpp new file mode 100644 index 00000000..567b7ddc --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/apu/SNES_SPC.cpp @@ -0,0 +1,564 @@ +// Core SPC emulation: CPU, timers, SMP registers, memory + +// snes_spc 0.9.0. http://www.slack.net/~ant/ + +#include "SNES_SPC.h" + +#include <string.h> + +/* Copyright (C) 2004-2007 Shay Green. This module is free software; you +can redistribute it and/or modify it under the terms of the GNU Lesser +General Public License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. This +module is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. You should have received a copy of the GNU Lesser General Public +License along with this module; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include "blargg_source.h" + +#define RAM (m.ram.ram) +#define REGS (m.smp_regs [0]) +#define REGS_IN (m.smp_regs [1]) + +// (n ? n : 256) +#define IF_0_THEN_256( n ) ((uint8_t) ((n) - 1) + 1) + +// Note: SPC_MORE_ACCURACY exists mainly so I can run my validation tests, which +// do crazy echo buffer accesses. +#ifndef SPC_MORE_ACCURACY + #define SPC_MORE_ACCURACY 0 +#endif + +#ifdef BLARGG_ENABLE_OPTIMIZER + #include BLARGG_ENABLE_OPTIMIZER +#endif + + +//// Timers + +#if SPC_DISABLE_TEMPO + #define TIMER_DIV( t, n ) ((n) >> t->prescaler) + #define TIMER_MUL( t, n ) ((n) << t->prescaler) +#else + #define TIMER_DIV( t, n ) ((n) / t->prescaler) + #define TIMER_MUL( t, n ) ((n) * t->prescaler) +#endif + +SNES_SPC::Timer* SNES_SPC::run_timer_( Timer* t, rel_time_t time ) +{ + int elapsed = TIMER_DIV( t, time - t->next_time ) + 1; + t->next_time += TIMER_MUL( t, elapsed ); + + if ( t->enabled ) + { + int remain = IF_0_THEN_256( t->period - t->divider ); + int divider = t->divider + elapsed; + int over = elapsed - remain; + if ( over >= 0 ) + { + int n = over / t->period; + t->counter = (t->counter + 1 + n) & 0x0F; + divider = over - n * t->period; + } + t->divider = (uint8_t) divider; + } + return t; +} + +inline SNES_SPC::Timer* SNES_SPC::run_timer( Timer* t, rel_time_t time ) +{ + if ( time >= t->next_time ) + t = run_timer_( t, time ); + return t; +} + + +//// ROM + +void SNES_SPC::enable_rom( int enable ) +{ + if ( m.rom_enabled != enable ) + { + m.rom_enabled = dsp.rom_enabled = enable; + if ( enable ) + memcpy( m.hi_ram, &RAM [rom_addr], sizeof m.hi_ram ); + memcpy( &RAM [rom_addr], (enable ? m.rom : m.hi_ram), rom_size ); + // TODO: ROM can still get overwritten when DSP writes to echo buffer + } +} + + +//// DSP + +#if SPC_LESS_ACCURATE + int const max_reg_time = 29; + + signed char const SNES_SPC::reg_times_ [256] = + { + -1, 0,-11,-10,-15,-11, -2, -2, 4, 3, 14, 14, 26, 26, 14, 22, + 2, 3, 0, 1,-12, 0, 1, 1, 7, 6, 14, 14, 27, 14, 14, 23, + 5, 6, 3, 4, -1, 3, 4, 4, 10, 9, 14, 14, 26, -5, 14, 23, + 8, 9, 6, 7, 2, 6, 7, 7, 13, 12, 14, 14, 27, -4, 14, 24, + 11, 12, 9, 10, 5, 9, 10, 10, 16, 15, 14, 14, -2, -4, 14, 24, + 14, 15, 12, 13, 8, 12, 13, 13, 19, 18, 14, 14, -2,-36, 14, 24, + 17, 18, 15, 16, 11, 15, 16, 16, 22, 21, 14, 14, 28, -3, 14, 25, + 20, 21, 18, 19, 14, 18, 19, 19, 25, 24, 14, 14, 14, 29, 14, 25, + + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + }; + + #define RUN_DSP( time, offset ) \ + int count = (time) - (offset) - m.dsp_time;\ + if ( count >= 0 )\ + {\ + int clock_count = (count & ~(clocks_per_sample - 1)) + clocks_per_sample;\ + m.dsp_time += clock_count;\ + dsp.run( clock_count );\ + } +#else + #define RUN_DSP( time, offset ) \ + {\ + int count = (time) - m.dsp_time;\ + if ( !SPC_MORE_ACCURACY || count )\ + {\ + assert( count > 0 );\ + m.dsp_time = (time);\ + dsp.run( count );\ + }\ + } +#endif + +int SNES_SPC::dsp_read( rel_time_t time ) +{ + RUN_DSP( time, reg_times [REGS [r_dspaddr] & 0x7F] ); + + int result = dsp.read( REGS [r_dspaddr] & 0x7F ); + + #ifdef SPC_DSP_READ_HOOK + SPC_DSP_READ_HOOK( spc_time + time, (REGS [r_dspaddr] & 0x7F), result ); + #endif + + return result; +} + +inline void SNES_SPC::dsp_write( int data, rel_time_t time ) +{ + RUN_DSP( time, reg_times [REGS [r_dspaddr]] ) + #if SPC_LESS_ACCURATE + else if ( m.dsp_time == skipping_time ) + { + int r = REGS [r_dspaddr]; + if ( r == SPC_DSP::r_kon ) + m.skipped_kon |= data & ~dsp.read( SPC_DSP::r_koff ); + + if ( r == SPC_DSP::r_koff ) + { + m.skipped_koff |= data; + m.skipped_kon &= ~data; + } + } + #endif + + #ifdef SPC_DSP_WRITE_HOOK + SPC_DSP_WRITE_HOOK( m.spc_time + time, REGS [r_dspaddr], (uint8_t) data ); + #endif + + if ( REGS [r_dspaddr] <= 0x7F ) + dsp.write( REGS [r_dspaddr], data ); + else if ( !SPC_MORE_ACCURACY ) + dprintf( "SPC wrote to DSP register > $7F\n" ); +} + + +//// Memory access extras + +#if SPC_MORE_ACCURACY + #define MEM_ACCESS( time, addr ) \ + {\ + if ( time >= m.dsp_time )\ + {\ + RUN_DSP( time, max_reg_time );\ + }\ + } +#elif !defined (NDEBUG) + // Debug-only check for read/write within echo buffer, since this might result in + // inaccurate emulation due to the DSP not being caught up to the present. + + bool SNES_SPC::check_echo_access( int addr ) + { + if ( !(dsp.read( SPC_DSP::r_flg ) & 0x20) ) + { + int start = 0x100 * dsp.read( SPC_DSP::r_esa ); + int size = 0x800 * (dsp.read( SPC_DSP::r_edl ) & 0x0F); + int end = start + (size ? size : 4); + if ( start <= addr && addr < end ) + { + if ( !m.echo_accessed ) + { + m.echo_accessed = 1; + return true; + } + } + } + return false; + } + + #define MEM_ACCESS( time, addr ) check( !check_echo_access( (uint16_t) addr ) ); +#else + #define MEM_ACCESS( time, addr ) +#endif + + +//// CPU write + +#if SPC_MORE_ACCURACY +static unsigned char const glitch_probs [3] [256] = +{ + 0xC3,0x92,0x5B,0x1C,0xD1,0x92,0x5B,0x1C,0xDB,0x9C,0x72,0x18,0xCD,0x5C,0x38,0x0B, + 0xE1,0x9C,0x74,0x17,0xCF,0x75,0x45,0x0C,0xCF,0x6E,0x4A,0x0D,0xA3,0x3A,0x1D,0x08, + 0xDB,0xA0,0x82,0x19,0xD9,0x73,0x3C,0x0E,0xCB,0x76,0x52,0x0B,0xA5,0x46,0x1D,0x09, + 0xDA,0x74,0x55,0x0F,0xA2,0x3F,0x21,0x05,0x9A,0x40,0x20,0x07,0x63,0x1E,0x10,0x01, + 0xDF,0xA9,0x85,0x1D,0xD3,0x84,0x4B,0x0E,0xCF,0x6F,0x49,0x0F,0xB3,0x48,0x1E,0x05, + 0xD8,0x77,0x52,0x12,0xB7,0x49,0x23,0x06,0xAA,0x45,0x28,0x07,0x7D,0x28,0x0F,0x07, + 0xCC,0x7B,0x4A,0x0E,0xB2,0x4F,0x24,0x07,0xAD,0x43,0x2C,0x06,0x86,0x29,0x11,0x07, + 0xAE,0x48,0x1F,0x0A,0x76,0x21,0x19,0x05,0x76,0x21,0x14,0x05,0x44,0x11,0x0B,0x01, + 0xE7,0xAD,0x96,0x23,0xDC,0x86,0x59,0x0E,0xDC,0x7C,0x5F,0x15,0xBB,0x53,0x2E,0x09, + 0xD6,0x7C,0x4A,0x16,0xBB,0x4A,0x25,0x08,0xB3,0x4F,0x28,0x0B,0x8E,0x23,0x15,0x08, + 0xCF,0x7F,0x57,0x11,0xB5,0x4A,0x23,0x0A,0xAA,0x42,0x28,0x05,0x7D,0x22,0x12,0x03, + 0xA6,0x49,0x28,0x09,0x82,0x2B,0x0D,0x04,0x7A,0x20,0x0F,0x04,0x3D,0x0F,0x09,0x03, + 0xD1,0x7C,0x4C,0x0F,0xAF,0x4E,0x21,0x09,0xA8,0x46,0x2A,0x07,0x85,0x1F,0x0E,0x07, + 0xA6,0x3F,0x26,0x07,0x7C,0x24,0x14,0x07,0x78,0x22,0x16,0x04,0x46,0x12,0x0A,0x02, + 0xA6,0x41,0x2C,0x0A,0x7E,0x28,0x11,0x05,0x73,0x1B,0x14,0x05,0x3D,0x11,0x0A,0x02, + 0x70,0x22,0x17,0x05,0x48,0x13,0x08,0x03,0x3C,0x07,0x0D,0x07,0x26,0x07,0x06,0x01, + + 0xE0,0x9F,0xDA,0x7C,0x4F,0x18,0x28,0x0D,0xE9,0x9F,0xDA,0x7C,0x4F,0x18,0x1F,0x07, + 0xE6,0x97,0xD8,0x72,0x64,0x13,0x26,0x09,0xDC,0x67,0xA9,0x38,0x21,0x07,0x15,0x06, + 0xE9,0x91,0xD2,0x6B,0x63,0x14,0x2B,0x0E,0xD6,0x61,0xB7,0x41,0x2B,0x0E,0x10,0x09, + 0xCF,0x59,0xB0,0x2F,0x35,0x08,0x0F,0x07,0xB6,0x30,0x7A,0x21,0x17,0x07,0x09,0x03, + 0xE7,0xA3,0xE5,0x6B,0x65,0x1F,0x34,0x09,0xD8,0x6B,0xBE,0x45,0x27,0x07,0x10,0x07, + 0xDA,0x54,0xB1,0x39,0x2E,0x0E,0x17,0x08,0xA9,0x3C,0x86,0x22,0x16,0x06,0x07,0x03, + 0xD4,0x51,0xBC,0x3D,0x38,0x0A,0x13,0x06,0xB2,0x37,0x79,0x1C,0x17,0x05,0x0E,0x06, + 0xA7,0x31,0x74,0x1C,0x11,0x06,0x0C,0x02,0x6D,0x1A,0x38,0x10,0x0B,0x05,0x06,0x03, + 0xEB,0x9A,0xE1,0x7A,0x6F,0x13,0x34,0x0E,0xE6,0x75,0xC5,0x45,0x3E,0x0B,0x1A,0x05, + 0xD8,0x63,0xC1,0x40,0x3C,0x1B,0x19,0x06,0xB3,0x42,0x83,0x29,0x18,0x0A,0x08,0x04, + 0xD4,0x58,0xBA,0x43,0x3F,0x0A,0x1F,0x09,0xB1,0x33,0x8A,0x1F,0x1F,0x06,0x0D,0x05, + 0xAF,0x3C,0x7A,0x1F,0x16,0x08,0x0A,0x01,0x72,0x1B,0x52,0x0D,0x0B,0x09,0x06,0x01, + 0xCF,0x63,0xB7,0x47,0x40,0x10,0x14,0x06,0xC0,0x41,0x96,0x20,0x1C,0x09,0x10,0x05, + 0xA6,0x35,0x82,0x1A,0x20,0x0C,0x0E,0x04,0x80,0x1F,0x53,0x0F,0x0B,0x02,0x06,0x01, + 0xA6,0x31,0x81,0x1B,0x1D,0x01,0x08,0x08,0x7B,0x20,0x4D,0x19,0x0E,0x05,0x07,0x03, + 0x6B,0x17,0x49,0x07,0x0E,0x03,0x0A,0x05,0x37,0x0B,0x1F,0x06,0x04,0x02,0x07,0x01, + + 0xF0,0xD6,0xED,0xAD,0xEC,0xB1,0xEB,0x79,0xAC,0x22,0x47,0x1E,0x6E,0x1B,0x32,0x0A, + 0xF0,0xD6,0xEA,0xA4,0xED,0xC4,0xDE,0x82,0x98,0x1F,0x50,0x13,0x52,0x15,0x2A,0x0A, + 0xF1,0xD1,0xEB,0xA2,0xEB,0xB7,0xD8,0x69,0xA2,0x1F,0x5B,0x18,0x55,0x18,0x2C,0x0A, + 0xED,0xB5,0xDE,0x7E,0xE6,0x85,0xD3,0x59,0x59,0x0F,0x2C,0x09,0x24,0x07,0x15,0x09, + 0xF1,0xD6,0xEA,0xA0,0xEC,0xBB,0xDA,0x77,0xA9,0x23,0x58,0x14,0x5D,0x12,0x2F,0x09, + 0xF1,0xC1,0xE3,0x86,0xE4,0x87,0xD2,0x4E,0x68,0x15,0x26,0x0B,0x27,0x09,0x15,0x02, + 0xEE,0xA6,0xE0,0x5C,0xE0,0x77,0xC3,0x41,0x67,0x1B,0x3C,0x07,0x2A,0x06,0x19,0x07, + 0xE4,0x75,0xC6,0x43,0xCC,0x50,0x95,0x23,0x35,0x09,0x14,0x04,0x15,0x05,0x0B,0x04, + 0xEE,0xD6,0xED,0xAD,0xEC,0xB1,0xEB,0x79,0xAC,0x22,0x56,0x14,0x5A,0x12,0x26,0x0A, + 0xEE,0xBB,0xE7,0x7E,0xE9,0x8D,0xCB,0x49,0x67,0x11,0x34,0x07,0x2B,0x0B,0x14,0x07, + 0xED,0xA7,0xE5,0x76,0xE3,0x7E,0xC4,0x4B,0x77,0x14,0x34,0x08,0x27,0x07,0x14,0x04, + 0xE7,0x8B,0xD2,0x4C,0xCA,0x56,0x9E,0x31,0x36,0x0C,0x11,0x07,0x14,0x04,0x0A,0x02, + 0xF0,0x9B,0xEA,0x6F,0xE5,0x81,0xC4,0x43,0x74,0x10,0x30,0x0B,0x2D,0x08,0x1B,0x06, + 0xE6,0x83,0xCA,0x48,0xD9,0x56,0xA7,0x23,0x3B,0x09,0x12,0x09,0x15,0x07,0x0A,0x03, + 0xE5,0x5F,0xCB,0x3C,0xCF,0x48,0x91,0x22,0x31,0x0A,0x17,0x08,0x15,0x04,0x0D,0x02, + 0xD1,0x43,0x91,0x20,0xA9,0x2D,0x54,0x12,0x17,0x07,0x09,0x02,0x0C,0x04,0x05,0x03, +}; +#endif + +// divided into multiple functions to keep rarely-used functionality separate +// so often-used functionality can be optimized better by compiler + +// If write isn't preceded by read, data has this added to it +int const no_read_before_write = 0x2000; + +void SNES_SPC::cpu_write_smp_reg_( int data, rel_time_t time, int addr ) +{ + switch ( addr ) + { + case r_t0target: + case r_t1target: + case r_t2target: { + Timer* t = &m.timers [addr - r_t0target]; + int period = IF_0_THEN_256( data ); + if ( t->period != period ) + { + t = run_timer( t, time ); + #if SPC_MORE_ACCURACY + // Insane behavior when target is written just after counter is + // clocked and counter matches new period and new period isn't 1, 2, 4, or 8 + if ( t->divider == (period & 0xFF) && + t->next_time == time + TIMER_MUL( t, 1 ) && + ((period - 1) | ~0x0F) & period ) + { + //dprintf( "SPC pathological timer target write\n" ); + + // If the period is 3, 5, or 9, there's a probability this behavior won't occur, + // based on the previous period + int prob = 0xFF; + int old_period = t->period & 0xFF; + if ( period == 3 ) prob = glitch_probs [0] [old_period]; + if ( period == 5 ) prob = glitch_probs [1] [old_period]; + if ( period == 9 ) prob = glitch_probs [2] [old_period]; + + // The glitch suppresses incrementing of one of the counter bits, based on + // the lowest set bit in the new period + int b = 1; + while ( !(period & b) ) + b <<= 1; + + if ( (rand() >> 4 & 0xFF) <= prob ) + t->divider = (t->divider - b) & 0xFF; + } + #endif + t->period = period; + } + break; + } + + case r_t0out: + case r_t1out: + case r_t2out: + if ( !SPC_MORE_ACCURACY ) + dprintf( "SPC wrote to counter %d\n", (int) addr - r_t0out ); + + if ( data < no_read_before_write / 2 ) + run_timer( &m.timers [addr - r_t0out], time - 1 )->counter = 0; + break; + + // Registers that act like RAM + case 0x8: + case 0x9: + REGS_IN [addr] = (uint8_t) data; + break; + + case r_test: + if ( (uint8_t) data != 0x0A ) + dprintf( "SPC wrote to test register\n" ); + break; + + case r_control: + // port clears + if ( data & 0x10 ) + { + REGS_IN [r_cpuio0] = 0; + REGS_IN [r_cpuio1] = 0; + } + if ( data & 0x20 ) + { + REGS_IN [r_cpuio2] = 0; + REGS_IN [r_cpuio3] = 0; + } + + // timers + { + for ( int i = 0; i < timer_count; i++ ) + { + Timer* t = &m.timers [i]; + int enabled = data >> i & 1; + if ( t->enabled != enabled ) + { + t = run_timer( t, time ); + t->enabled = enabled; + if ( enabled ) + { + t->divider = 0; + t->counter = 0; + } + } + } + } + enable_rom( data & 0x80 ); + break; + } +} + +void SNES_SPC::cpu_write_smp_reg( int data, rel_time_t time, int addr ) +{ + if ( addr == r_dspdata ) // 99% + dsp_write( data, time ); + else + cpu_write_smp_reg_( data, time, addr ); +} + +void SNES_SPC::cpu_write_high( int data, int i, rel_time_t time ) +{ + if ( i < rom_size ) + { + m.hi_ram [i] = (uint8_t) data; + if ( m.rom_enabled ) + RAM [i + rom_addr] = m.rom [i]; // restore overwritten ROM + } + else + { + assert( *(&(RAM [0]) + i + rom_addr) == (uint8_t) data ); + *(&(RAM [0]) + i + rom_addr) = cpu_pad_fill; // restore overwritten padding + cpu_write( data, i + rom_addr - 0x10000, time ); + } +} + +int const bits_in_int = CHAR_BIT * sizeof (int); + +void SNES_SPC::cpu_write( int data, int addr, rel_time_t time ) +{ + MEM_ACCESS( time, addr ) + + // RAM + RAM [addr] = (uint8_t) data; + int reg = addr - 0xF0; + if ( reg >= 0 ) // 64% + { + // $F0-$FF + if ( reg < reg_count ) // 87% + { + REGS [reg] = (uint8_t) data; + + // Ports + #ifdef SPC_PORT_WRITE_HOOK + if ( (unsigned) (reg - r_cpuio0) < port_count ) + SPC_PORT_WRITE_HOOK( m.spc_time + time, (reg - r_cpuio0), + (uint8_t) data, ®S [r_cpuio0] ); + #endif + + // Registers other than $F2 and $F4-$F7 + //if ( reg != 2 && reg != 4 && reg != 5 && reg != 6 && reg != 7 ) + // TODO: this is a bit on the fragile side + if ( ((~0x2F00 << (bits_in_int - 16)) << reg) < 0 ) // 36% + cpu_write_smp_reg( data, time, reg ); + } + // High mem/address wrap-around + else + { + reg -= rom_addr - 0xF0; + if ( reg >= 0 ) // 1% in IPL ROM area or address wrapped around + cpu_write_high( data, reg, time ); + } + } +} + + +//// CPU read + +inline int SNES_SPC::cpu_read_smp_reg( int reg, rel_time_t time ) +{ + int result = REGS_IN [reg]; + reg -= r_dspaddr; + // DSP addr and data + if ( (unsigned) reg <= 1 ) // 4% 0xF2 and 0xF3 + { + result = REGS [r_dspaddr]; + if ( (unsigned) reg == 1 ) + result = dsp_read( time ); // 0xF3 + } + return result; +} + +int SNES_SPC::cpu_read( int addr, rel_time_t time ) +{ + MEM_ACCESS( time, addr ) + + // RAM + int result = RAM [addr]; + int reg = addr - 0xF0; + if ( reg >= 0 ) // 40% + { + reg -= 0x10; + if ( (unsigned) reg >= 0xFF00 ) // 21% + { + reg += 0x10 - r_t0out; + + // Timers + if ( (unsigned) reg < timer_count ) // 90% + { + Timer* t = &m.timers [reg]; + if ( time >= t->next_time ) + t = run_timer_( t, time ); + result = t->counter; + t->counter = 0; + } + // Other registers + else if ( reg < 0 ) // 10% + { + result = cpu_read_smp_reg( reg + r_t0out, time ); + } + else // 1% + { + assert( reg + (r_t0out + 0xF0 - 0x10000) < 0x100 ); + result = cpu_read( reg + (r_t0out + 0xF0 - 0x10000), time ); + } + } + } + + return result; +} + + +//// Run + +// Prefix and suffix for CPU emulator function +#define SPC_CPU_RUN_FUNC \ +BOOST::uint8_t* SNES_SPC::run_until_( time_t end_time )\ +{\ + rel_time_t rel_time = m.spc_time - end_time;\ + /*assert( rel_time <= 0 );*/\ + m.spc_time = end_time;\ + m.dsp_time += rel_time;\ + m.timers [0].next_time += rel_time;\ + m.timers [1].next_time += rel_time;\ + m.timers [2].next_time += rel_time; + +#define SPC_CPU_RUN_FUNC_END \ + m.spc_time += rel_time;\ + m.dsp_time -= rel_time;\ + m.timers [0].next_time -= rel_time;\ + m.timers [1].next_time -= rel_time;\ + m.timers [2].next_time -= rel_time;\ + /*assert( m.spc_time >= end_time );*/\ + return ®S [r_cpuio0];\ +} + +int const cpu_lag_max = 12 - 1; // DIV YA,X takes 12 clocks + +void SNES_SPC::end_frame( time_t end_time ) +{ + // Catch CPU up to as close to end as possible. If final instruction + // would exceed end, does NOT execute it and leaves m.spc_time < end. + if ( end_time > m.spc_time ) + run_until_( end_time ); + + m.spc_time -= end_time; + m.extra_clocks += end_time; + + // Greatest number of clocks early that emulation can stop early due to + // not being able to execute current instruction without going over + // allowed time. + assert( -cpu_lag_max <= m.spc_time && m.spc_time <= cpu_lag_max ); + + // Catch timers up to CPU + for ( int i = 0; i < timer_count; i++ ) + run_timer( &m.timers [i], 0 ); + + // Catch DSP up to CPU + if ( m.dsp_time < 0 ) + { + RUN_DSP( 0, max_reg_time ); + } + + // Save any extra samples beyond what should be generated + if ( m.buf_begin ) + save_extra(); +} + +// Inclusion here allows static memory access functions and better optimization +#include "SPC_CPU.h" diff --git a/plugins/snes9x_gx/source/snes9x/apu/SNES_SPC.h b/plugins/snes9x_gx/source/snes9x/apu/SNES_SPC.h new file mode 100644 index 00000000..baf90063 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/apu/SNES_SPC.h @@ -0,0 +1,316 @@ +// SNES SPC-700 APU emulator + +// snes_spc 0.9.0 +#ifndef SNES_SPC_H +#define SNES_SPC_H + +#include "SPC_DSP.h" +#include "blargg_endian.h" + +#ifdef DEBUGGER +#include "snes9x.h" +#include "display.h" +#include "debug.h" +#endif + +struct SNES_SPC { +public: + typedef BOOST::uint8_t uint8_t; + + // Must be called once before using + blargg_err_t init(); + + // Sample pairs generated per second + enum { sample_rate = 32000 }; + +// Emulator use + + // Sets IPL ROM data. Library does not include ROM data. Most SPC music files + // don't need ROM, but a full emulator must provide this. + enum { rom_size = 0x40 }; + void init_rom( uint8_t const rom [rom_size] ); + + // Sets destination for output samples + typedef short sample_t; + void set_output( sample_t* out, int out_size ); + + // Number of samples written to output since last set + int sample_count() const; + + // Resets SPC to power-on state. This resets your output buffer, so you must + // call set_output() after this. + void reset(); + + // Emulates pressing reset switch on SNES. This resets your output buffer, so + // you must call set_output() after this. + void soft_reset(); + + // 1024000 SPC clocks per second, sample pair every 32 clocks + typedef int time_t; + enum { clock_rate = 1024000 }; + enum { clocks_per_sample = 32 }; + + // Emulated port read/write at specified time + enum { port_count = 4 }; + int read_port ( time_t, int port ); + void write_port( time_t, int port, int data ); + + // Runs SPC to end_time and starts a new time frame at 0 + void end_frame( time_t end_time ); + +// Sound control + + // Mutes voices corresponding to non-zero bits in mask (issues repeated KOFF events). + // Reduces emulation accuracy. + enum { voice_count = 8 }; + void mute_voices( int mask ); + + // If true, prevents channels and global volumes from being phase-negated. + // Only supported by fast DSP. + void disable_surround( bool disable = true ); + + // Sets tempo, where tempo_unit = normal, tempo_unit / 2 = half speed, etc. + enum { tempo_unit = 0x100 }; + void set_tempo( int ); + +// SPC music files + + // Loads SPC data into emulator + enum { spc_min_file_size = 0x10180 }; + enum { spc_file_size = 0x10200 }; + blargg_err_t load_spc( void const* in, long size ); + + // Clears echo region. Useful after loading an SPC as many have garbage in echo. + void clear_echo(); + + // Plays for count samples and write samples to out. Discards samples if out + // is NULL. Count must be a multiple of 2 since output is stereo. + blargg_err_t play( int count, sample_t* out ); + + // Skips count samples. Several times faster than play() when using fast DSP. + blargg_err_t skip( int count ); + +// State save/load (only available with accurate DSP) + +#if !SPC_NO_COPY_STATE_FUNCS + // Saves/loads state + enum { state_size = 68 * 1024L }; // maximum space needed when saving + typedef SPC_DSP::copy_func_t copy_func_t; + void copy_state( unsigned char** io, copy_func_t ); + + // Writes minimal header to spc_out + static void init_header( void* spc_out ); + + // Saves emulator state as SPC file data. Writes spc_file_size bytes to spc_out. + // Does not set up SPC header; use init_header() for that. + void save_spc( void* spc_out ); + + // Returns true if new key-on events occurred since last check. Useful for + // trimming silence while saving an SPC. + bool check_kon(); +#endif + +//// Snes9x Accessor + + void spc_allow_time_overflow( bool ); + + void dsp_set_spc_snapshot_callback( void (*callback) (void) ); + void dsp_dump_spc_snapshot( void ); + void dsp_set_stereo_switch( int ); + uint8_t dsp_reg_value( int, int ); + int dsp_envx_value( int ); + +//// Snes9x Debugger + +#ifdef DEBUGGER + void debug_toggle_trace( void ); + bool debug_is_enabled( void ); + void debug_do_trace( int, int, int, uint8_t const *, uint8_t *, int, int, int, int ); + void debug_op_print( char *, int, int, int, uint8_t const *, uint8_t *, int, int, int, int ); + void debug_io_print( char * ); +#endif + +public: + BLARGG_DISABLE_NOTHROW + + typedef BOOST::uint16_t uint16_t; + + // Time relative to m_spc_time. Speeds up code a bit by eliminating need to + // constantly add m_spc_time to time from CPU. CPU uses time that ends at + // 0 to eliminate reloading end time every instruction. It pays off. + typedef int rel_time_t; + + struct Timer + { + rel_time_t next_time; // time of next event + int prescaler; + int period; + int divider; + int enabled; + int counter; + }; + enum { reg_count = 0x10 }; + enum { timer_count = 3 }; + enum { extra_size = SPC_DSP::extra_size }; + + enum { signature_size = 35 }; + +private: + SPC_DSP dsp; + + #if SPC_LESS_ACCURATE + static signed char const reg_times_ [256]; + signed char reg_times [256]; + #endif + + struct state_t + { + Timer timers [timer_count]; + + uint8_t smp_regs [2] [reg_count]; + + struct + { + int pc; + int a; + int x; + int y; + int psw; + int sp; + } cpu_regs; + + rel_time_t dsp_time; + time_t spc_time; + bool echo_accessed; + + int tempo; + int skipped_kon; + int skipped_koff; + const char* cpu_error; + + int extra_clocks; + sample_t* buf_begin; + sample_t const* buf_end; + sample_t* extra_pos; + sample_t extra_buf [extra_size]; + + int rom_enabled; + uint8_t rom [rom_size]; + uint8_t hi_ram [rom_size]; + + unsigned char cycle_table [256]; + + struct + { + // padding to neutralize address overflow + union { + uint8_t padding1 [0x100]; + uint16_t align; // makes compiler align data for 16-bit access + } padding1 [1]; + uint8_t ram [0x10000]; + uint8_t padding2 [0x100]; + } ram; + }; + state_t m; + + enum { rom_addr = 0xFFC0 }; + + enum { skipping_time = 127 }; + + // Value that padding should be filled with + enum { cpu_pad_fill = 0xFF }; + + enum { + r_test = 0x0, r_control = 0x1, + r_dspaddr = 0x2, r_dspdata = 0x3, + r_cpuio0 = 0x4, r_cpuio1 = 0x5, + r_cpuio2 = 0x6, r_cpuio3 = 0x7, + r_f8 = 0x8, r_f9 = 0x9, + r_t0target = 0xA, r_t1target = 0xB, r_t2target = 0xC, + r_t0out = 0xD, r_t1out = 0xE, r_t2out = 0xF + }; + + void timers_loaded(); + void enable_rom( int enable ); + void reset_buf(); + void save_extra(); + void load_regs( uint8_t const in [reg_count] ); + void ram_loaded(); + void regs_loaded(); + void reset_time_regs(); + void reset_common( int timer_counter_init ); + + Timer* run_timer_ ( Timer* t, rel_time_t ); + Timer* run_timer ( Timer* t, rel_time_t ); + int dsp_read ( rel_time_t ); + void dsp_write ( int data, rel_time_t ); + void cpu_write_smp_reg_( int data, rel_time_t, int addr ); + void cpu_write_smp_reg ( int data, rel_time_t, int addr ); + void cpu_write_high ( int data, int i, rel_time_t ); + void cpu_write ( int data, int addr, rel_time_t ); + int cpu_read_smp_reg ( int i, rel_time_t ); + int cpu_read ( int addr, rel_time_t ); + unsigned CPU_mem_bit ( uint8_t const* pc, rel_time_t ); + + bool check_echo_access ( int addr ); + uint8_t* run_until_( time_t end_time ); + + struct spc_file_t + { + char signature [signature_size]; + uint8_t has_id666; + uint8_t version; + uint8_t pcl, pch; + uint8_t a; + uint8_t x; + uint8_t y; + uint8_t psw; + uint8_t sp; + char text [212]; + uint8_t ram [0x10000]; + uint8_t dsp [128]; + uint8_t unused [0x40]; + uint8_t ipl_rom [0x40]; + }; + + static char const signature [signature_size + 1]; + + void save_regs( uint8_t out [reg_count] ); + +// Snes9x timing hack + bool allow_time_overflow; +// Snes9x debugger +#ifdef DEBUGGER + FILE *apu_trace; + bool debug_trace; +#endif +}; + +#include <assert.h> + +inline int SNES_SPC::sample_count() const { return (m.extra_clocks >> 5) * 2; } + +inline int SNES_SPC::read_port( time_t t, int port ) +{ + assert( (unsigned) port < port_count ); + return run_until_( t ) [port]; +} + +inline void SNES_SPC::write_port( time_t t, int port, int data ) +{ + assert( (unsigned) port < port_count ); + run_until_( t ) [0x10 + port] = data; + m.ram.ram [0xF4 + port] = data; +} + +inline void SNES_SPC::mute_voices( int mask ) { dsp.mute_voices( mask ); } + +inline void SNES_SPC::disable_surround( bool disable ) { dsp.disable_surround( disable ); } + +#if !SPC_NO_COPY_STATE_FUNCS +inline bool SNES_SPC::check_kon() { return dsp.check_kon(); } +#endif + +inline void SNES_SPC::spc_allow_time_overflow( bool allow ) { allow_time_overflow = allow; } + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/apu/SNES_SPC_misc.cpp b/plugins/snes9x_gx/source/snes9x/apu/SNES_SPC_misc.cpp new file mode 100644 index 00000000..078120d2 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/apu/SNES_SPC_misc.cpp @@ -0,0 +1,855 @@ +// SPC emulation support: init, sample buffering, reset, SPC loading + +// snes_spc 0.9.0. http://www.slack.net/~ant/ + +#include "SNES_SPC.h" + +#include <string.h> + +/* Copyright (C) 2004-2007 Shay Green. This module is free software; you +can redistribute it and/or modify it under the terms of the GNU Lesser +General Public License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. This +module is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. You should have received a copy of the GNU Lesser General Public +License along with this module; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include "blargg_source.h" + +#define RAM (m.ram.ram) +#define REGS (m.smp_regs [0]) +#define REGS_IN (m.smp_regs [1]) + +// (n ? n : 256) +#define IF_0_THEN_256( n ) ((uint8_t) ((n) - 1) + 1) + + +//// Init + +blargg_err_t SNES_SPC::init() +{ + memset( &m, 0, sizeof m ); + dsp.init( RAM ); + + m.tempo = tempo_unit; + + // Most SPC music doesn't need ROM, and almost all the rest only rely + // on these two bytes + m.rom [0x3E] = 0xFF; + m.rom [0x3F] = 0xC0; + + static unsigned char const cycle_table [128] = + {// 01 23 45 67 89 AB CD EF + 0x28,0x47,0x34,0x36,0x26,0x54,0x54,0x68, // 0 + 0x48,0x47,0x45,0x56,0x55,0x65,0x22,0x46, // 1 + 0x28,0x47,0x34,0x36,0x26,0x54,0x54,0x74, // 2 + 0x48,0x47,0x45,0x56,0x55,0x65,0x22,0x38, // 3 + 0x28,0x47,0x34,0x36,0x26,0x44,0x54,0x66, // 4 + 0x48,0x47,0x45,0x56,0x55,0x45,0x22,0x43, // 5 + 0x28,0x47,0x34,0x36,0x26,0x44,0x54,0x75, // 6 + 0x48,0x47,0x45,0x56,0x55,0x55,0x22,0x36, // 7 + 0x28,0x47,0x34,0x36,0x26,0x54,0x52,0x45, // 8 + 0x48,0x47,0x45,0x56,0x55,0x55,0x22,0xC5, // 9 + 0x38,0x47,0x34,0x36,0x26,0x44,0x52,0x44, // A + 0x48,0x47,0x45,0x56,0x55,0x55,0x22,0x34, // B + 0x38,0x47,0x45,0x47,0x25,0x64,0x52,0x49, // C + 0x48,0x47,0x56,0x67,0x45,0x55,0x22,0x83, // D + 0x28,0x47,0x34,0x36,0x24,0x53,0x43,0x40, // E + 0x48,0x47,0x45,0x56,0x34,0x54,0x22,0x60, // F + }; + + // unpack cycle table + for ( int i = 0; i < 128; i++ ) + { + int n = cycle_table [i]; + m.cycle_table [i * 2 + 0] = n >> 4; + m.cycle_table [i * 2 + 1] = n & 0x0F; + } + + allow_time_overflow = false; + + dsp.rom = m.rom; + dsp.hi_ram = m.hi_ram; + +#ifdef DEBUGGER + apu_trace = NULL; + debug_trace = false; +#endif + + #if SPC_LESS_ACCURATE + memcpy( reg_times, reg_times_, sizeof reg_times ); + #endif + + reset(); + return 0; +} + +void SNES_SPC::init_rom( uint8_t const in [rom_size] ) +{ + memcpy( m.rom, in, sizeof m.rom ); +} + +void SNES_SPC::set_tempo( int t ) +{ + m.tempo = t; + int const timer2_shift = 4; // 64 kHz + int const other_shift = 3; // 8 kHz + + #if SPC_DISABLE_TEMPO + m.timers [2].prescaler = timer2_shift; + m.timers [1].prescaler = timer2_shift + other_shift; + m.timers [0].prescaler = timer2_shift + other_shift; + #else + if ( !t ) + t = 1; + int const timer2_rate = 1 << timer2_shift; + int rate = (timer2_rate * tempo_unit + (t >> 1)) / t; + if ( rate < timer2_rate / 4 ) + rate = timer2_rate / 4; // max 4x tempo + m.timers [2].prescaler = rate; + m.timers [1].prescaler = rate << other_shift; + m.timers [0].prescaler = rate << other_shift; + #endif +} + +// Timer registers have been loaded. Applies these to the timers. Does not +// reset timer prescalers or dividers. +void SNES_SPC::timers_loaded() +{ + int i; + for ( i = 0; i < timer_count; i++ ) + { + Timer* t = &m.timers [i]; + t->period = IF_0_THEN_256( REGS [r_t0target + i] ); + t->enabled = REGS [r_control] >> i & 1; + t->counter = REGS_IN [r_t0out + i] & 0x0F; + } + + set_tempo( m.tempo ); +} + +// Loads registers from unified 16-byte format +void SNES_SPC::load_regs( uint8_t const in [reg_count] ) +{ + memcpy( REGS, in, reg_count ); + memcpy( REGS_IN, REGS, reg_count ); + + // These always read back as 0 + REGS_IN [r_test ] = 0; + REGS_IN [r_control ] = 0; + REGS_IN [r_t0target] = 0; + REGS_IN [r_t1target] = 0; + REGS_IN [r_t2target] = 0; +} + +// RAM was just loaded from SPC, with $F0-$FF containing SMP registers +// and timer counts. Copies these to proper registers. +void SNES_SPC::ram_loaded() +{ + m.rom_enabled = dsp.rom_enabled = 0; + load_regs( &RAM [0xF0] ); + + // Put STOP instruction around memory to catch PC underflow/overflow + memset( m.ram.padding1, cpu_pad_fill, sizeof m.ram.padding1 ); + memset( m.ram.padding2, cpu_pad_fill, sizeof m.ram.padding2 ); +} + +// Registers were just loaded. Applies these new values. +void SNES_SPC::regs_loaded() +{ + enable_rom( REGS [r_control] & 0x80 ); + timers_loaded(); +} + +void SNES_SPC::reset_time_regs() +{ + m.cpu_error = 0; + m.echo_accessed = 0; + m.spc_time = 0; + m.dsp_time = 0; + #if SPC_LESS_ACCURATE + m.dsp_time = clocks_per_sample + 1; + #endif + + for ( int i = 0; i < timer_count; i++ ) + { + Timer* t = &m.timers [i]; + t->next_time = 1; + t->divider = 0; + } + + regs_loaded(); + + m.extra_clocks = 0; + reset_buf(); +} + +void SNES_SPC::reset_common( int timer_counter_init ) +{ + int i; + for ( i = 0; i < timer_count; i++ ) + REGS_IN [r_t0out + i] = timer_counter_init; + + // Run IPL ROM + memset( &m.cpu_regs, 0, sizeof m.cpu_regs ); + m.cpu_regs.pc = rom_addr; + + REGS [r_test ] = 0x0A; + REGS [r_control] = 0xB0; // ROM enabled, clear ports + for ( i = 0; i < port_count; i++ ) + REGS_IN [r_cpuio0 + i] = 0; + + reset_time_regs(); +} + +void SNES_SPC::soft_reset() +{ + reset_common( 0 ); + dsp.soft_reset(); +} + +void SNES_SPC::reset() +{ + m.cpu_regs.pc = 0xFFC0; + m.cpu_regs.a = 0x00; + m.cpu_regs.x = 0x00; + m.cpu_regs.y = 0x00; + m.cpu_regs.psw = 0x02; + m.cpu_regs.sp = 0xEF; + memset( RAM, 0x00, 0x10000 ); + ram_loaded(); + reset_common( 0x0F ); + dsp.reset(); +} + +char const SNES_SPC::signature [signature_size + 1] = + "SNES-SPC700 Sound File Data v0.30\x1A\x1A"; + +blargg_err_t SNES_SPC::load_spc( void const* data, long size ) +{ + spc_file_t const* const spc = (spc_file_t const*) data; + + // be sure compiler didn't insert any padding into fle_t + assert( sizeof (spc_file_t) == spc_min_file_size + 0x80 ); + + // Check signature and file size + if ( size < signature_size || memcmp( spc, signature, 27 ) ) + return "Not an SPC file"; + + if ( size < spc_min_file_size ) + return "Corrupt SPC file"; + + // CPU registers + m.cpu_regs.pc = spc->pch * 0x100 + spc->pcl; + m.cpu_regs.a = spc->a; + m.cpu_regs.x = spc->x; + m.cpu_regs.y = spc->y; + m.cpu_regs.psw = spc->psw; + m.cpu_regs.sp = spc->sp; + + // RAM and registers + memcpy( RAM, spc->ram, 0x10000 ); + ram_loaded(); + + // DSP registers + dsp.load( spc->dsp ); + + reset_time_regs(); + + return 0; +} + +void SNES_SPC::clear_echo() +{ + if ( !(dsp.read( SPC_DSP::r_flg ) & 0x20) ) + { + int addr = 0x100 * dsp.read( SPC_DSP::r_esa ); + int end = addr + 0x800 * (dsp.read( SPC_DSP::r_edl ) & 0x0F); + if ( end > 0x10000 ) + end = 0x10000; + memset( &RAM [addr], 0xFF, end - addr ); + } +} + + +//// Sample output + +void SNES_SPC::reset_buf() +{ + // Start with half extra buffer of silence + sample_t* out = m.extra_buf; + while ( out < &m.extra_buf [extra_size / 2] ) + *out++ = 0; + + m.extra_pos = out; + m.buf_begin = 0; + + dsp.set_output( 0, 0 ); +} + +void SNES_SPC::set_output( sample_t* out, int size ) +{ + require( (size & 1) == 0 ); // size must be even + + m.extra_clocks &= clocks_per_sample - 1; + if ( out ) + { + sample_t const* out_end = out + size; + m.buf_begin = out; + m.buf_end = out_end; + + // Copy extra to output + sample_t const* in = m.extra_buf; + while ( in < m.extra_pos && out < out_end ) + *out++ = *in++; + + // Handle output being full already + if ( out >= out_end ) + { + // Have DSP write to remaining extra space + out = dsp.extra(); + out_end = &dsp.extra() [extra_size]; + + // Copy any remaining extra samples as if DSP wrote them + while ( in < m.extra_pos ) + *out++ = *in++; + assert( out <= out_end ); + } + + dsp.set_output( out, out_end - out ); + } + else + { + reset_buf(); + } +} + +void SNES_SPC::save_extra() +{ + // Get end pointers + sample_t const* main_end = m.buf_end; // end of data written to buf + sample_t const* dsp_end = dsp.out_pos(); // end of data written to dsp.extra() + if ( m.buf_begin <= dsp_end && dsp_end <= main_end ) + { + main_end = dsp_end; + dsp_end = dsp.extra(); // nothing in DSP's extra + } + + // Copy any extra samples at these ends into extra_buf + sample_t* out = m.extra_buf; + sample_t const* in; + for ( in = m.buf_begin + sample_count(); in < main_end; in++ ) + *out++ = *in; + for ( in = dsp.extra(); in < dsp_end ; in++ ) + *out++ = *in; + + m.extra_pos = out; + assert( out <= &m.extra_buf [extra_size] ); +} + +blargg_err_t SNES_SPC::play( int count, sample_t* out ) +{ + require( (count & 1) == 0 ); // must be even + if ( count ) + { + set_output( out, count ); + end_frame( count * (clocks_per_sample / 2) ); + } + + const char* err = m.cpu_error; + m.cpu_error = 0; + return err; +} + +blargg_err_t SNES_SPC::skip( int count ) +{ + #if SPC_LESS_ACCURATE + if ( count > 2 * sample_rate * 2 ) + { + set_output( 0, 0 ); + + // Skip a multiple of 4 samples + time_t end = count; + count = (count & 3) + 1 * sample_rate * 2; + end = (end - count) * (clocks_per_sample / 2); + + m.skipped_kon = 0; + m.skipped_koff = 0; + + // Preserve DSP and timer synchronization + // TODO: verify that this really preserves it + int old_dsp_time = m.dsp_time + m.spc_time; + m.dsp_time = end - m.spc_time + skipping_time; + end_frame( end ); + m.dsp_time = m.dsp_time - skipping_time + old_dsp_time; + + dsp.write( SPC_DSP::r_koff, m.skipped_koff & ~m.skipped_kon ); + dsp.write( SPC_DSP::r_kon , m.skipped_kon ); + clear_echo(); + } + #endif + + return play( count, 0 ); +} + +//// Snes9x Accessor + +void SNES_SPC::dsp_set_spc_snapshot_callback( void (*callback) (void) ) +{ + dsp.set_spc_snapshot_callback( callback ); +} + +void SNES_SPC::dsp_dump_spc_snapshot( void ) +{ + dsp.dump_spc_snapshot(); +} + +void SNES_SPC::dsp_set_stereo_switch( int value ) +{ + dsp.set_stereo_switch( value ); +} + +SNES_SPC::uint8_t SNES_SPC::dsp_reg_value( int ch, int addr ) +{ + return dsp.reg_value( ch, addr ); +} + +int SNES_SPC::dsp_envx_value( int ch ) +{ + return dsp.envx_value( ch ); +} + +//// Snes9x debugger + +#ifdef DEBUGGER + +void SNES_SPC::debug_toggle_trace( void ) +{ + debug_trace = !debug_trace; + + if (debug_trace) + { + printf("APU tracing enabled.\n"); + ENSURE_TRACE_OPEN(apu_trace, "apu_trace.log", "wb") + } + else + { + printf("APU tracing disabled.\n"); + fclose(apu_trace); + apu_trace = NULL; + } +} + +bool SNES_SPC::debug_is_enabled( void ) { return debug_trace; } + +void SNES_SPC::debug_do_trace( int a, int x, int y, uint8_t const *pc, uint8_t *sp, int psw, int c, int nz, int dp ) +{ + char msg[512]; + + ENSURE_TRACE_OPEN(apu_trace, "apu_trace.log", "a") + + debug_op_print(msg, a, x, y, pc, sp, psw, c, nz, dp); + fprintf(apu_trace, "%s ", msg); + debug_io_print(msg); + fprintf(apu_trace, "%s ", msg); + S9xPrintHVPosition(msg); + fprintf(apu_trace, "%s\n", msg); +} + +void SNES_SPC::debug_op_print( char *buffer, int a, int x, int y, uint8_t const *pc, uint8_t *sp, int psw, int c, int nz, int dp ) +{ + static char mnemonics[256][20] = + { + "NOP", + "TCALL 0", + "SET1 $%02X.0", + "BBS $%02X.0,$%04X", + "OR A,$%02X", + "OR A,!$%04X", + "OR A,(X)", + "OR A,[$%02X+X]", + "OR A,#$%02X", + "OR $%02X,$%02X", + "OR1 C,$%04X.%d", + "ASL $%02X", + "MOV !$%04X,Y", + "PUSH PSW", + "TSET1 !$%04X", + "BRK", + "BPL $%04X", + "TCALL 1", + "CLR1 $%02X.0", + "BBC $%02X.0,$%04X", + "OR A,$%02X+X", + "OR A,!$%04X+X", + "OR A,!$%04X+Y", + "OR A,[$%02X]+Y", + "OR $%02X,#$%02X", + "OR (X),(Y)", + "DECW $%02X", + "ASL $%02X+X", + "ASL A", + "DEC X", + "CMP X,!$%04X", + "JMP [!$%04X+X]", + "CLRP", + "TCALL 2", + "SET1 $%02X.1", + "BBS $%02X.1,$%04X", + "AND A,$%02X", + "AND A,!$%04X", + "AND A,(X)", + "AND A,[$%02X+X]", + "AND A,#$%02X", + "AND $%02X,$%02X", + "OR1 C,/$%04X.%d", + "ROL $%02X", + "ROL !$%04X", + "PUSH A", + "CBNE $%02X,$%04X", + "BRA $%04X", + "BMI $%04X", + "TCALL 3", + "CLR1 $%02X.1", + "BBC $%02X.1,$%04X", + "AND A,$%02X+X", + "AND A,!$%04X+X", + "AND A,!$%04X+Y", + "AND A,[$%02X]+Y", + "AND $%02X,#$%02X", + "AND (X),(Y)", + "INCW $%02X", + "ROL $%02X+X", + "ROL A", + "INC X", + "CMP X,$%02X", + "CALL !$%04X", + "SETP", + "TCALL 4", + "SET1 $%02X.2", + "BBS $%02X.2,$%04X", + "EOR A,$%02X", + "EOR A,!$%04X", + "EOR A,(X)", + "EOR A,[$%02X+X]", + "EOR A,#$%02X", + "EOR $%02X,$%02X", + "AND1 C,$%04X.%d", + "LSR $%02X", + "LSR !$%04X", + "PUSH X", + "TCLR1 !$%04X", + "PCALL $%02X", + "BVC $%04X", + "TCALL 5", + "CLR1 $%02X.2", + "BBC $%02X.2,$%04X", + "EOR A,$%02X+X", + "EOR A,!$%04X+X", + "EOR A,!$%04X+Y", + "EOR A,[$%02X]+Y", + "EOR $%02X,#$%02X", + "EOR (X),(Y)", + "CMPW YA,$%02X", + "LSR $%02X+X", + "LSR A", + "MOV X,A", + "CMP Y,!$%04X", + "JMP !$%04X", + "CLRC", + "TCALL 6", + "SET1 $%02X.3", + "BBS $%02X.3,$%04X", + "CMP A,$%02X", + "CMP A,!$%04X", + "CMP A,(X)", + "CMP A,[$%02X+X]", + "CMP A,#$%02X", + "CMP $%02X,$%02X", + "AND1 C,/$%04X.%d", + "ROR $%02X", + "ROR !$%04X", + "PUSH Y", + "DBNZ $%02X,$%04X", + "RET", + "BVS $%04X", + "TCALL 7", + "CLR1 $%02X.3", + "BBC $%02X.3,$%04X", + "CMP A,$%02X+X", + "CMP A,!$%04X+X", + "CMP A,!$%04X+Y", + "CMP A,[$%02X]+Y", + "CMP $%02X,#$%02X", + "CMP (X),(Y)", + "ADDW YA,$%02X", + "ROR $%02X+X", + "ROR A", + "MOV A,X", + "CMP Y,$%02X", + "RET1", + "SETC", + "TCALL 8", + "SET1 $%02X.4", + "BBS $%02X.4,$%04X", + "ADC A,$%02X", + "ADC A,!$%04X", + "ADC A,(X)", + "ADC A,[$%02X+X]", + "ADC A,#$%02X", + "ADC $%02X,$%02X", + "EOR1 C,$%04X.%d", + "DEC $%02X", + "DEC !$%04X", + "MOV Y,#$%02X", + "POP PSW", + "MOV $%02X,#$%02X", + "BCC $%04X", + "TCALL 9", + "CLR1 $%02X.4", + "BBC $%02X.4,$%04X", + "ADC A,$%02X+X", + "ADC A,!$%04X+X", + "ADC A,!$%04X+Y", + "ADC A,[$%02X]+Y", + "ADC $%02X,#$%02X", + "ADC (X),(Y)", + "SUBW YA,$%02X", + "DEC $%02X+X", + "DEC A", + "MOV X,SP", + "DIV YA,X", + "XCN A", + "EI", + "TCALL 10", + "SET1 $%02X.5", + "BBS $%02X.5,$%04X", + "SBC A,$%02X", + "SBC A,!$%04X", + "SBC A,(X)", + "SBC A,[$%02X+X]", + "SBC A,#$%02X", + "SBC $%02X,$%02X", + "MOV1 C,$%04X.%d", + "INC $%02X", + "INC !$%04X", + "CMP Y,#$%02X", + "POP A", + "MOV (X)+,A", + "BCS $%04X", + "TCALL 11", + "CLR1 $%02X.5", + "BBC $%02X.5,$%04X", + "SBC A,$%02X+X", + "SBC A,!$%04X+X", + "SBC A,!$%04X+Y", + "SBC A,[$%02X]+Y", + "SBC $%02X,#$%02X", + "SBC (X),(Y)", + "MOVW YA,$%02X", + "INC $%02X+X", + "INC A", + "MOV SP,X", + "DAS A", + "MOV A,(X)+", + "DI", + "TCALL 12", + "SET1 $%02X.6", + "BBS $%02X.6,$%04X", + "MOV $%02X,A", + "MOV !$%04X,A", + "MOV (X),A", + "MOV [$%02X+X],A", + "CMP X,#$%02X", + "MOV !$%04X,X", + "MOV1 $%04X.%d,C", + "MOV $%02X,Y", + "ASL !$%04X", + "MOV X,#$%02X", + "POP X", + "MUL YA", + "BNE $%04X", + "TCALL 13", + "CLR1 $%02X.6", + "BBC $%02X.6,$%04X", + "MOV $%02X+X,A", + "MOV !$%04X+X,A", + "MOV !$%04X+Y,A", + "MOV [$%02X]+Y,A", + "MOV $%02X,X", + "MOV $%02X+Y,X", + "MOVW $%02X,YA", + "MOV $%02X+X,Y", + "DEC Y", + "MOV A,Y", + "CBNE $%02X+X,$%04X", + "DAA A", + "CLRV", + "TCALL 14", + "SET1 $%02X.7", + "BBS $%02X.7,$%04X", + "MOV A,$%02X", + "MOV A,!$%04X", + "MOV A,(X)", + "MOV A,[$%02X+X]", + "MOV A,#$%02X", + "MOV X,!$%04X", + "NOT1 $%04X.%d", + "MOV Y,$%02X", + "MOV Y,!$%04X", + "NOTC", + "POP Y", + "SLEEP", + "BEQ $%04X", + "TCALL 15", + "CLR1 $%02X.7", + "BBC $%02X.7,$%04X", + "MOV A,$%02X+X", + "MOV A,!$%04X+X", + "MOV A,!$%04X+Y", + "MOV A,[$%02X]+Y", + "MOV X,$%02X", + "MOV X,$%02X+Y", + "MOV $%02X,$%02X", + "MOV Y,$%02X+X", + "INC Y", + "MOV Y,A", + "DBNZ Y,$%04X", + "STOP" + }; + + static int modes[256] = + { + 2, 2, 0, 5, 0, 1, 2, 0, 0, 3, 6, 0, 1, 2, 1, 2, + 7, 2, 0, 5, 0, 1, 1, 0, 4, 2, 0, 0, 2, 2, 1, 1, + 2, 2, 0, 5, 0, 1, 2, 0, 0, 3, 6, 0, 1, 2, 5, 7, + 7, 2, 0, 5, 0, 1, 1, 0, 4, 2, 0, 0, 2, 2, 0, 1, + 2, 2, 0, 5, 0, 1, 2, 0, 0, 3, 6, 0, 1, 2, 1, 0, + 7, 2, 0, 5, 0, 1, 1, 0, 4, 2, 0, 0, 2, 2, 1, 1, + 2, 2, 0, 5, 0, 1, 2, 0, 0, 3, 6, 0, 1, 2, 5, 2, + 7, 2, 0, 5, 0, 1, 1, 0, 4, 2, 0, 0, 2, 2, 0, 2, + 2, 2, 0, 5, 0, 1, 2, 0, 0, 3, 6, 0, 1, 0, 2, 4, + 7, 2, 0, 5, 0, 1, 1, 0, 4, 2, 0, 0, 2, 2, 2, 2, + 2, 2, 0, 5, 0, 1, 2, 0, 0, 3, 6, 0, 1, 0, 2, 2, + 7, 2, 0, 5, 0, 1, 1, 0, 4, 2, 0, 0, 2, 2, 2, 2, + 2, 2, 0, 5, 0, 1, 2, 0, 0, 1, 6, 0, 1, 0, 2, 2, + 7, 2, 0, 5, 0, 1, 1, 0, 0, 0, 0, 0, 2, 2, 5, 2, + 2, 2, 0, 5, 0, 1, 2, 0, 0, 1, 6, 0, 1, 2, 2, 2, + 7, 2, 0, 5, 0, 1, 1, 0, 0, 0, 3, 0, 2, 2, 7, 2 + }; + + static int modesToBytes[] = + { + 2, 3, 1, 3, 3, 3, 3, 2 + }; + + int const n80 = 0x80; // nz + int const p20 = 0x20; // dp + int const z02 = 0x02; // nz + int const c01 = 0x01; // c + + #define GET_PC() (pc - ram) + #define GET_SP() (sp - 0x101 - ram) + #define GET_PSW( out )\ + {\ + out = psw & ~(n80 | p20 | z02 | c01);\ + out |= c >> 8 & c01;\ + out |= dp >> 3 & p20;\ + out |= ((nz >> 4) | nz) & n80;\ + if ( !(uint8_t) nz ) out |= z02;\ + } + + uint8_t const *ram = RAM; + + int addr; + int tsp, tpsw; + uint8_t d0, d1, d2; + + addr = GET_PC(); + tsp = GET_SP(); + GET_PSW(tpsw); + + d0 = *pc; + d1 = (addr < 0xffff) ? *(pc + 1) : 0; + d2 = (addr < 0xfffe) ? *(pc + 2) : 0; + + int mode = modes[d0]; + int bytes = modesToBytes[mode]; + char mnem[100]; + + switch (bytes) + { + case 1: + sprintf(buffer, "%04X %02X ", addr, d0); + break; + + case 2: + sprintf(buffer, "%04X %02X %02X ", addr, d0, d1); + break; + + case 3: + sprintf(buffer, "%04X %02X %02X %02X ", addr, d0, d1, d2); + break; + } + + switch (mode) + { + case 0: + sprintf(mnem, mnemonics[d0], d1); + break; + + case 1: + sprintf(mnem, mnemonics[d0], d1 + (d2 << 8)); + break; + + case 2: + strcpy (mnem, mnemonics[d0]); + break; + + case 3: + sprintf(mnem, mnemonics[d0], d2, d1); + break; + + case 4: + sprintf(mnem, mnemonics[d0], d2, d1); + break; + + case 5: + sprintf(mnem, mnemonics[d0], d1, addr + 3 + (int8_t) d2); + break; + + case 6: + sprintf(mnem, mnemonics[d0], (d1 + (d2 << 8)) & 0x1fff, d2 >> 5); + break; + + case 7: + sprintf(mnem, mnemonics[d0], addr + 2 + (int8_t) d1); + break; + } + + sprintf(buffer, "%s %-20s A:%02X X:%02X Y:%02X S:%02X P:%c%c%c%c%c%c%c%c ROM:%d", + buffer, mnem, a, x, y, tsp, + (tpsw & 0x80) ? 'N' : 'n', + (tpsw & 0x40) ? 'V' : 'v', + (tpsw & 0x20) ? 'P' : 'p', + (tpsw & 0x10) ? 'B' : 'b', + (tpsw & 0x08) ? 'H' : 'h', + (tpsw & 0x04) ? 'I' : 'i', + (tpsw & 0x02) ? 'Z' : 'z', + (tpsw & 0x01) ? 'C' : 'c', + m.rom_enabled ? 1 : 0); +} + +void SNES_SPC::debug_io_print( char *buffer ) +{ + sprintf(buffer, "i/o %02X/%02X %02X/%02X %02X/%02X %02X/%02X", + m.smp_regs[1][r_cpuio0], m.smp_regs[0][r_cpuio0], + m.smp_regs[1][r_cpuio1], m.smp_regs[0][r_cpuio1], + m.smp_regs[1][r_cpuio2], m.smp_regs[0][r_cpuio2], + m.smp_regs[1][r_cpuio3], m.smp_regs[0][r_cpuio3]); +} + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/apu/SNES_SPC_state.cpp b/plugins/snes9x_gx/source/snes9x/apu/SNES_SPC_state.cpp new file mode 100644 index 00000000..3d9d3f3a --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/apu/SNES_SPC_state.cpp @@ -0,0 +1,142 @@ +// SPC emulation state save/load: copy_state(), save_spc() +// Separate file to avoid linking in unless needed + +// snes_spc 0.9.0. http://www.slack.net/‾ant/ + +#include "SNES_SPC.h" + +#if !SPC_NO_COPY_STATE_FUNCS + +#include <string.h> + +/* Copyright (C) 2004-2007 Shay Green. This module is free software; you +can redistribute it and/or modify it under the terms of the GNU Lesser +General Public License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. This +module is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. You should have received a copy of the GNU Lesser General Public +License along with this module; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include <stdio.h> +#include "blargg_source.h" + +#define RAM (m.ram.ram) +#define REGS (m.smp_regs [0]) +#define REGS_IN (m.smp_regs [1]) + +void SNES_SPC::save_regs( uint8_t out [reg_count] ) +{ + // Use current timer counter values + for ( int i = 0; i < timer_count; i++ ) + out [r_t0out + i] = m.timers [i].counter; + + // Last written values + memcpy( out, REGS, r_t0out ); +} + +void SNES_SPC::init_header( void* spc_out ) +{ + spc_file_t* const spc = (spc_file_t*) spc_out; + + spc->has_id666 = 26; // has none + spc->version = 30; + memcpy( spc, signature, sizeof spc->signature ); + memset( spc->text, 0, sizeof spc->text ); +} + +void SNES_SPC::save_spc( void* spc_out ) +{ + spc_file_t* const spc = (spc_file_t*) spc_out; + + // CPU + spc->pcl = (uint8_t) (m.cpu_regs.pc >> 0); + spc->pch = (uint8_t) (m.cpu_regs.pc >> 8); + spc->a = m.cpu_regs.a; + spc->x = m.cpu_regs.x; + spc->y = m.cpu_regs.y; + spc->psw = m.cpu_regs.psw; + spc->sp = m.cpu_regs.sp; + + // RAM, ROM + memcpy( spc->ram, RAM, sizeof spc->ram ); + if ( m.rom_enabled ) + memcpy( spc->ram + rom_addr, m.hi_ram, sizeof m.hi_ram ); + memset( spc->unused, 0, sizeof spc->unused ); + memcpy( spc->ipl_rom, m.rom, sizeof spc->ipl_rom ); + + // SMP registers + save_regs( &spc->ram [0xF0] ); + int i; + for ( i = 0; i < port_count; i++ ) + spc->ram [0xF0 + r_cpuio0 + i] = REGS_IN [r_cpuio0 + i]; + + // DSP registers + for ( i = 0; i < SPC_DSP::register_count; i++ ) + spc->dsp [i] = dsp.read( i ); +} + +#undef IF_0_THEN_256 +#define IF_0_THEN_256( n ) ((uint8_t) ((n) - 1) + 1) +void SNES_SPC::copy_state( unsigned char** io, copy_func_t copy ) +{ + SPC_State_Copier copier( io, copy ); + + // Make state data more readable by putting 64K RAM, 16 SMP registers, + // then DSP (with its 128 registers) first + + // RAM + enable_rom( 0 ); // will get re-enabled if necessary in regs_loaded() below + copier.copy( RAM, 0x10000 ); + + { + // SMP registers + uint8_t regs [reg_count]; + uint8_t regs_in [reg_count]; + + memcpy( regs, REGS, reg_count ); + memcpy( regs_in, REGS_IN, reg_count ); + + copier.copy( regs, sizeof regs ); + copier.copy( regs_in, sizeof regs_in ); + + memcpy( REGS, regs, reg_count); + memcpy( REGS_IN, regs_in, reg_count ); + + enable_rom( REGS [r_control] & 0x80 ); + } + + // CPU registers + SPC_COPY( uint16_t, m.cpu_regs.pc ); + SPC_COPY( uint8_t, m.cpu_regs.a ); + SPC_COPY( uint8_t, m.cpu_regs.x ); + SPC_COPY( uint8_t, m.cpu_regs.y ); + SPC_COPY( uint8_t, m.cpu_regs.psw ); + SPC_COPY( uint8_t, m.cpu_regs.sp ); + copier.extra(); + + SPC_COPY( int16_t, m.spc_time ); + SPC_COPY( int16_t, m.dsp_time ); + + // DSP + dsp.copy_state( io, copy ); + + // Timers + for ( int i = 0; i < timer_count; i++ ) + { + Timer* t = &m.timers [i]; + t->period = IF_0_THEN_256( REGS [r_t0target + i] ); + t->enabled = REGS [r_control] >> i & 1; + SPC_COPY( int16_t, t->next_time ); + SPC_COPY( uint8_t, t->divider ); + SPC_COPY( uint8_t, t->counter ); + copier.extra(); + } + + set_tempo( m.tempo ); + + copier.extra(); +} +#endif diff --git a/plugins/snes9x_gx/source/snes9x/apu/SPC_CPU.h b/plugins/snes9x_gx/source/snes9x/apu/SPC_CPU.h new file mode 100644 index 00000000..67fee8da --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/apu/SPC_CPU.h @@ -0,0 +1,1228 @@ +// snes_spc 0.9.0. http://www.slack.net/~ant/ + +/* Copyright (C) 2004-2007 Shay Green. This module is free software; you +can redistribute it and/or modify it under the terms of the GNU Lesser +General Public License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. This +module is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. You should have received a copy of the GNU Lesser General Public +License along with this module; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + +//// Memory access + +#if SPC_MORE_ACCURACY + #define SUSPICIOUS_OPCODE( name ) ((void) 0) +#else + #define SUSPICIOUS_OPCODE( name ) dprintf( "SPC: suspicious opcode: " name "\n" ) +#endif + +#define CPU_READ( time, offset, addr )\ + cpu_read( addr, time + offset ) + +#define CPU_WRITE( time, offset, addr, data )\ + cpu_write( data, addr, time + offset ) + +#if SPC_MORE_ACCURACY + #define CPU_READ_TIMER( time, offset, addr, out )\ + { out = CPU_READ( time, offset, addr ); } + +#else + // timers are by far the most common thing read from dp + #define CPU_READ_TIMER( time, offset, addr_, out )\ + {\ + rel_time_t adj_time = time + offset;\ + int dp_addr = addr_;\ + int ti = dp_addr - (r_t0out + 0xF0);\ + if ( (unsigned) ti < timer_count )\ + {\ + Timer* t = &m.timers [ti];\ + if ( adj_time >= t->next_time )\ + t = run_timer_( t, adj_time );\ + out = t->counter;\ + t->counter = 0;\ + }\ + else\ + {\ + out = ram [dp_addr];\ + int i = dp_addr - 0xF0;\ + if ( (unsigned) i < 0x10 )\ + out = cpu_read_smp_reg( i, adj_time );\ + }\ + } +#endif + +#define TIME_ADJ( n ) (n) + +#define READ_TIMER( time, addr, out ) CPU_READ_TIMER( rel_time, TIME_ADJ(time), (addr), out ) +#define READ( time, addr ) CPU_READ ( rel_time, TIME_ADJ(time), (addr) ) +#define WRITE( time, addr, data ) CPU_WRITE( rel_time, TIME_ADJ(time), (addr), (data) ) + +#define DP_ADDR( addr ) (dp + (addr)) + +#define READ_DP_TIMER( time, addr, out ) CPU_READ_TIMER( rel_time, TIME_ADJ(time), DP_ADDR( addr ), out ) +#define READ_DP( time, addr ) READ ( time, DP_ADDR( addr ) ) +#define WRITE_DP( time, addr, data ) WRITE( time, DP_ADDR( addr ), data ) + +#define READ_PROG16( addr ) GET_LE16( ram + (addr) ) + +#define SET_PC( n ) (pc = ram + (n)) +#define GET_PC() (pc - ram) +#define READ_PC( pc ) (*(pc)) +#define READ_PC16( pc ) GET_LE16( pc ) + +// TODO: remove non-wrapping versions? +#define SPC_NO_SP_WRAPAROUND 0 + +#define SET_SP( v ) (sp = ram + 0x101 + (v)) +#define GET_SP() (sp - 0x101 - ram) + +#if SPC_NO_SP_WRAPAROUND +#define PUSH16( v ) (sp -= 2, SET_LE16( sp, v )) +#define PUSH( v ) (void) (*--sp = (uint8_t) (v)) +#define POP( out ) (void) ((out) = *sp++) + +#else +#define PUSH16( data )\ +{\ + int addr = (sp -= 2) - ram;\ + if ( addr > 0x100 )\ + {\ + SET_LE16( sp, data );\ + }\ + else\ + {\ + ram [(uint8_t) addr + 0x100] = (uint8_t) data;\ + sp [1] = (uint8_t) (data >> 8);\ + sp += 0x100;\ + }\ +} + +#define PUSH( data )\ +{\ + *--sp = (uint8_t) (data);\ + if ( sp - ram == 0x100 )\ + sp += 0x100;\ +} + +#define POP( out )\ +{\ + out = *sp++;\ + if ( sp - ram == 0x201 )\ + {\ + out = sp [-0x101];\ + sp -= 0x100;\ + }\ +} + +#endif + +#define MEM_BIT( rel ) CPU_mem_bit( pc, rel_time + rel ) + +unsigned SNES_SPC::CPU_mem_bit( uint8_t const* pc, rel_time_t rel_time ) +{ + unsigned addr = READ_PC16( pc ); + unsigned t = READ( 0, addr & 0x1FFF ) >> (addr >> 13); + return t << 8 & 0x100; +} + +//// Status flag handling + +// Hex value in name to clarify code and bit shifting. +// Flag stored in indicated variable during emulation +int const n80 = 0x80; // nz +int const v40 = 0x40; // psw +int const p20 = 0x20; // dp +int const b10 = 0x10; // psw +int const h08 = 0x08; // psw +int const i04 = 0x04; // psw +int const z02 = 0x02; // nz +int const c01 = 0x01; // c + +int const nz_neg_mask = 0x880; // either bit set indicates N flag set + +#define GET_PSW( out )\ +{\ + out = psw & ~(n80 | p20 | z02 | c01);\ + out |= c >> 8 & c01;\ + out |= dp >> 3 & p20;\ + out |= ((nz >> 4) | nz) & n80;\ + if ( !(uint8_t) nz ) out |= z02;\ +} + +#define SET_PSW( in )\ +{\ + psw = in;\ + c = in << 8;\ + dp = in << 3 & 0x100;\ + nz = (in << 4 & 0x800) | (~in & z02);\ +} + +SPC_CPU_RUN_FUNC +{ + uint8_t* const ram = RAM; + int a = m.cpu_regs.a; + int x = m.cpu_regs.x; + int y = m.cpu_regs.y; + uint8_t const* pc; + uint8_t* sp; + int psw; + int c; + int nz; + int dp; + + SET_PC( m.cpu_regs.pc ); + SET_SP( m.cpu_regs.sp ); + SET_PSW( m.cpu_regs.psw ); + + goto loop; + + + // Main loop + +cbranch_taken_loop: + pc += *(BOOST::int8_t const*) pc; +inc_pc_loop: + pc++; +loop: +{ + unsigned opcode; + unsigned data; + + check( (unsigned) a < 0x100 ); + check( (unsigned) x < 0x100 ); + check( (unsigned) y < 0x100 ); + + opcode = *pc; + if (allow_time_overflow && rel_time >= 0 ) + goto stop; + if ( (rel_time += m.cycle_table [opcode]) > 0 && !allow_time_overflow) + goto out_of_time; + + #ifdef SPC_CPU_OPCODE_HOOK + SPC_CPU_OPCODE_HOOK( GET_PC(), opcode ); + #endif + /* + //SUB_CASE_COUNTER( 1 ); + #define PROFILE_TIMER_LOOP( op, addr, len )\ + if ( opcode == op )\ + {\ + int cond = (unsigned) ((addr) - 0xFD) < 3 &&\ + pc [len] == 0xF0 && pc [len+1] == 0xFE - len;\ + SUB_CASE_COUNTER( op && cond );\ + } + + PROFILE_TIMER_LOOP( 0xEC, GET_LE16( pc + 1 ), 3 ); + PROFILE_TIMER_LOOP( 0xEB, pc [1], 2 ); + PROFILE_TIMER_LOOP( 0xE4, pc [1], 2 ); + */ + +#ifdef DEBUGGER + if (debug_trace) + debug_do_trace(a, x, y, pc, sp, psw, c, nz, dp); +#endif + + + // TODO: if PC is at end of memory, this will get wrong operand (very obscure) + data = *++pc; + switch ( opcode ) + { + +// Common instructions + +#define BRANCH( cond )\ +{\ + pc++;\ + pc += (BOOST::int8_t) data;\ + if ( cond )\ + goto loop;\ + pc -= (BOOST::int8_t) data;\ + rel_time -= 2;\ + goto loop;\ +} + + case 0xF0: // BEQ + BRANCH( !(uint8_t) nz ) // 89% taken + + case 0xD0: // BNE + BRANCH( (uint8_t) nz ) + + case 0x3F:{// CALL + int old_addr = GET_PC() + 2; + SET_PC( READ_PC16( pc ) ); + PUSH16( old_addr ); + goto loop; + } + + case 0x6F:// RET + #if SPC_NO_SP_WRAPAROUND + { + SET_PC( GET_LE16( sp ) ); + sp += 2; + } + #else + { + int addr = sp - ram; + SET_PC( GET_LE16( sp ) ); + sp += 2; + if ( addr < 0x1FF ) + goto loop; + + SET_PC( sp [-0x101] * 0x100 + ram [(uint8_t) addr + 0x100] ); + sp -= 0x100; + } + #endif + goto loop; + + case 0xE4: // MOV a,dp + ++pc; + // 80% from timer + READ_DP_TIMER( 0, data, a = nz ); + goto loop; + + case 0xFA:{// MOV dp,dp + int temp; + READ_DP_TIMER( -2, data, temp ); + data = temp + no_read_before_write ; + } + // fall through + case 0x8F:{// MOV dp,#imm + int temp = READ_PC( pc + 1 ); + pc += 2; + + #if !SPC_MORE_ACCURACY + { + int i = dp + temp; + ram [i] = (uint8_t) data; + i -= 0xF0; + if ( (unsigned) i < 0x10 ) // 76% + { + REGS [i] = (uint8_t) data; + + // Registers other than $F2 and $F4-$F7 + //if ( i != 2 && i != 4 && i != 5 && i != 6 && i != 7 ) + if ( ((~0x2F00 << (bits_in_int - 16)) << i) < 0 ) // 12% + cpu_write_smp_reg( data, rel_time, i ); + } + } + #else + WRITE_DP( 0, temp, data ); + #endif + goto loop; + } + + case 0xC4: // MOV dp,a + ++pc; + #if !SPC_MORE_ACCURACY + { + int i = dp + data; + ram [i] = (uint8_t) a; + i -= 0xF0; + if ( (unsigned) i < 0x10 ) // 39% + { + unsigned sel = i - 2; + REGS [i] = (uint8_t) a; + + if ( sel == 1 ) // 51% $F3 + dsp_write( a, rel_time ); + else if ( sel > 1 ) // 1% not $F2 or $F3 + cpu_write_smp_reg_( a, rel_time, i ); + } + } + #else + WRITE_DP( 0, data, a ); + #endif + goto loop; + +#define CASE( n ) case n: + +// Define common address modes based on opcode for immediate mode. Execution +// ends with data set to the address of the operand. +#define ADDR_MODES_( op )\ + CASE( op - 0x02 ) /* (X) */\ + data = x + dp;\ + pc--;\ + goto end_##op;\ + CASE( op + 0x0F ) /* (dp)+Y */\ + data = READ_PROG16( data + dp ) + y;\ + goto end_##op;\ + CASE( op - 0x01 ) /* (dp+X) */\ + data = READ_PROG16( ((uint8_t) (data + x)) + dp );\ + goto end_##op;\ + CASE( op + 0x0E ) /* abs+Y */\ + data += y;\ + goto abs_##op;\ + CASE( op + 0x0D ) /* abs+X */\ + data += x;\ + CASE( op - 0x03 ) /* abs */\ + abs_##op:\ + data += 0x100 * READ_PC( ++pc );\ + goto end_##op;\ + CASE( op + 0x0C ) /* dp+X */\ + data = (uint8_t) (data + x); + +#define ADDR_MODES_NO_DP( op )\ + ADDR_MODES_( op )\ + data += dp;\ + end_##op: + +#define ADDR_MODES( op )\ + ADDR_MODES_( op )\ + CASE( op - 0x04 ) /* dp */\ + data += dp;\ + end_##op: + +// 1. 8-bit Data Transmission Commands. Group I + + ADDR_MODES_NO_DP( 0xE8 ) // MOV A,addr + a = nz = READ( 0, data ); + goto inc_pc_loop; + + case 0xBF:{// MOV A,(X)+ + int temp = x + dp; + x = (uint8_t) (x + 1); + a = nz = READ( -1, temp ); + goto loop; + } + + case 0xE8: // MOV A,imm + a = data; + nz = data; + goto inc_pc_loop; + + case 0xF9: // MOV X,dp+Y + data = (uint8_t) (data + y); + case 0xF8: // MOV X,dp + READ_DP_TIMER( 0, data, x = nz ); + goto inc_pc_loop; + + case 0xE9: // MOV X,abs + data = READ_PC16( pc ); + ++pc; + data = READ( 0, data ); + case 0xCD: // MOV X,imm + x = data; + nz = data; + goto inc_pc_loop; + + case 0xFB: // MOV Y,dp+X + data = (uint8_t) (data + x); + case 0xEB: // MOV Y,dp + // 70% from timer + pc++; + READ_DP_TIMER( 0, data, y = nz ); + goto loop; + + case 0xEC:{// MOV Y,abs + int temp = READ_PC16( pc ); + pc += 2; + READ_TIMER( 0, temp, y = nz ); + //y = nz = READ( 0, temp ); + goto loop; + } + + case 0x8D: // MOV Y,imm + y = data; + nz = data; + goto inc_pc_loop; + +// 2. 8-BIT DATA TRANSMISSION COMMANDS, GROUP 2 + + ADDR_MODES_NO_DP( 0xC8 ) // MOV addr,A + WRITE( 0, data, a ); + goto inc_pc_loop; + + { + int temp; + case 0xCC: // MOV abs,Y + temp = y; + goto mov_abs_temp; + case 0xC9: // MOV abs,X + temp = x; + mov_abs_temp: + WRITE( 0, READ_PC16( pc ), temp ); + pc += 2; + goto loop; + } + + case 0xD9: // MOV dp+Y,X + data = (uint8_t) (data + y); + case 0xD8: // MOV dp,X + WRITE( 0, data + dp, x ); + goto inc_pc_loop; + + case 0xDB: // MOV dp+X,Y + data = (uint8_t) (data + x); + case 0xCB: // MOV dp,Y + WRITE( 0, data + dp, y ); + goto inc_pc_loop; + +// 3. 8-BIT DATA TRANSMISSIN COMMANDS, GROUP 3. + + case 0x7D: // MOV A,X + a = x; + nz = x; + goto loop; + + case 0xDD: // MOV A,Y + a = y; + nz = y; + goto loop; + + case 0x5D: // MOV X,A + x = a; + nz = a; + goto loop; + + case 0xFD: // MOV Y,A + y = a; + nz = a; + goto loop; + + case 0x9D: // MOV X,SP + x = nz = GET_SP(); + goto loop; + + case 0xBD: // MOV SP,X + SET_SP( x ); + goto loop; + + //case 0xC6: // MOV (X),A (handled by MOV addr,A in group 2) + + case 0xAF: // MOV (X)+,A + WRITE_DP( 0, x, a + no_read_before_write ); + x++; + goto loop; + +// 5. 8-BIT LOGIC OPERATION COMMANDS + +#define LOGICAL_OP( op, func )\ + ADDR_MODES( op ) /* addr */\ + data = READ( 0, data );\ + case op: /* imm */\ + nz = a func##= data;\ + goto inc_pc_loop;\ + { unsigned addr;\ + case op + 0x11: /* X,Y */\ + data = READ_DP( -2, y );\ + addr = x + dp;\ + goto addr_##op;\ + case op + 0x01: /* dp,dp */\ + data = READ_DP( -3, data );\ + case op + 0x10:{/*dp,imm*/\ + uint8_t const* addr2 = pc + 1;\ + pc += 2;\ + addr = READ_PC( addr2 ) + dp;\ + }\ + addr_##op:\ + nz = data func READ( -1, addr );\ + WRITE( 0, addr, nz );\ + goto loop;\ + } + + LOGICAL_OP( 0x28, & ); // AND + + LOGICAL_OP( 0x08, | ); // OR + + LOGICAL_OP( 0x48, ^ ); // EOR + +// 4. 8-BIT ARITHMETIC OPERATION COMMANDS + + ADDR_MODES( 0x68 ) // CMP addr + data = READ( 0, data ); + case 0x68: // CMP imm + nz = a - data; + c = ~nz; + nz &= 0xFF; + goto inc_pc_loop; + + case 0x79: // CMP (X),(Y) + data = READ_DP( -2, y ); + nz = READ_DP( -1, x ) - data; + c = ~nz; + nz &= 0xFF; + goto loop; + + case 0x69: // CMP dp,dp + data = READ_DP( -3, data ); + case 0x78: // CMP dp,imm + nz = READ_DP( -1, READ_PC( ++pc ) ) - data; + c = ~nz; + nz &= 0xFF; + goto inc_pc_loop; + + case 0x3E: // CMP X,dp + data += dp; + goto cmp_x_addr; + case 0x1E: // CMP X,abs + data = READ_PC16( pc ); + pc++; + cmp_x_addr: + data = READ( 0, data ); + case 0xC8: // CMP X,imm + nz = x - data; + c = ~nz; + nz &= 0xFF; + goto inc_pc_loop; + + case 0x7E: // CMP Y,dp + data += dp; + goto cmp_y_addr; + case 0x5E: // CMP Y,abs + data = READ_PC16( pc ); + pc++; + cmp_y_addr: + data = READ( 0, data ); + case 0xAD: // CMP Y,imm + nz = y - data; + c = ~nz; + nz &= 0xFF; + goto inc_pc_loop; + + { + int addr; + case 0xB9: // SBC (x),(y) + case 0x99: // ADC (x),(y) + pc--; // compensate for inc later + data = READ_DP( -2, y ); + addr = x + dp; + goto adc_addr; + case 0xA9: // SBC dp,dp + case 0x89: // ADC dp,dp + data = READ_DP( -3, data ); + case 0xB8: // SBC dp,imm + case 0x98: // ADC dp,imm + addr = READ_PC( ++pc ) + dp; + adc_addr: + nz = READ( -1, addr ); + goto adc_data; + +// catch ADC and SBC together, then decode later based on operand +#undef CASE +#define CASE( n ) case n: case (n) + 0x20: + ADDR_MODES( 0x88 ) // ADC/SBC addr + data = READ( 0, data ); + case 0xA8: // SBC imm + case 0x88: // ADC imm + addr = -1; // A + nz = a; + adc_data: { + int flags; + if ( opcode >= 0xA0 ) // SBC + data ^= 0xFF; + + flags = data ^ nz; + nz += data + (c >> 8 & 1); + flags ^= nz; + + psw = (psw & ~(v40 | h08)) | + (flags >> 1 & h08) | + ((flags + 0x80) >> 2 & v40); + c = nz; + if ( addr < 0 ) + { + a = (uint8_t) nz; + goto inc_pc_loop; + } + WRITE( 0, addr, /*(uint8_t)*/ nz ); + goto inc_pc_loop; + } + + } + +// 6. ADDITION & SUBTRACTION COMMANDS + +#define INC_DEC_REG( reg, op )\ + nz = reg op;\ + reg = (uint8_t) nz;\ + goto loop; + + case 0xBC: INC_DEC_REG( a, + 1 ) // INC A + case 0x3D: INC_DEC_REG( x, + 1 ) // INC X + case 0xFC: INC_DEC_REG( y, + 1 ) // INC Y + + case 0x9C: INC_DEC_REG( a, - 1 ) // DEC A + case 0x1D: INC_DEC_REG( x, - 1 ) // DEC X + case 0xDC: INC_DEC_REG( y, - 1 ) // DEC Y + + case 0x9B: // DEC dp+X + case 0xBB: // INC dp+X + data = (uint8_t) (data + x); + case 0x8B: // DEC dp + case 0xAB: // INC dp + data += dp; + goto inc_abs; + case 0x8C: // DEC abs + case 0xAC: // INC abs + data = READ_PC16( pc ); + pc++; + inc_abs: + nz = (opcode >> 4 & 2) - 1; + nz += READ( -1, data ); + WRITE( 0, data, /*(uint8_t)*/ nz ); + goto inc_pc_loop; + +// 7. SHIFT, ROTATION COMMANDS + + case 0x5C: // LSR A + c = 0; + case 0x7C:{// ROR A + nz = (c >> 1 & 0x80) | (a >> 1); + c = a << 8; + a = nz; + goto loop; + } + + case 0x1C: // ASL A + c = 0; + case 0x3C:{// ROL A + int temp = c >> 8 & 1; + c = a << 1; + nz = c | temp; + a = (uint8_t) nz; + goto loop; + } + + case 0x0B: // ASL dp + c = 0; + data += dp; + goto rol_mem; + case 0x1B: // ASL dp+X + c = 0; + case 0x3B: // ROL dp+X + data = (uint8_t) (data + x); + case 0x2B: // ROL dp + data += dp; + goto rol_mem; + case 0x0C: // ASL abs + c = 0; + case 0x2C: // ROL abs + data = READ_PC16( pc ); + pc++; + rol_mem: + nz = c >> 8 & 1; + nz |= (c = READ( -1, data ) << 1); + WRITE( 0, data, /*(uint8_t)*/ nz ); + goto inc_pc_loop; + + case 0x4B: // LSR dp + c = 0; + data += dp; + goto ror_mem; + case 0x5B: // LSR dp+X + c = 0; + case 0x7B: // ROR dp+X + data = (uint8_t) (data + x); + case 0x6B: // ROR dp + data += dp; + goto ror_mem; + case 0x4C: // LSR abs + c = 0; + case 0x6C: // ROR abs + data = READ_PC16( pc ); + pc++; + ror_mem: { + int temp = READ( -1, data ); + nz = (c >> 1 & 0x80) | (temp >> 1); + c = temp << 8; + WRITE( 0, data, nz ); + goto inc_pc_loop; + } + + case 0x9F: // XCN + nz = a = (a >> 4) | (uint8_t) (a << 4); + goto loop; + +// 8. 16-BIT TRANSMISION COMMANDS + + case 0xBA: // MOVW YA,dp + a = READ_DP( -2, data ); + nz = (a & 0x7F) | (a >> 1); + y = READ_DP( 0, (uint8_t) (data + 1) ); + nz |= y; + goto inc_pc_loop; + + case 0xDA: // MOVW dp,YA + WRITE_DP( -1, data, a ); + WRITE_DP( 0, (uint8_t) (data + 1), y + no_read_before_write ); + goto inc_pc_loop; + +// 9. 16-BIT OPERATION COMMANDS + + case 0x3A: // INCW dp + case 0x1A:{// DECW dp + int temp; + // low byte + data += dp; + temp = READ( -3, data ); + temp += (opcode >> 4 & 2) - 1; // +1 for INCW, -1 for DECW + nz = ((temp >> 1) | temp) & 0x7F; + WRITE( -2, data, /*(uint8_t)*/ temp ); + + // high byte + data = (uint8_t) (data + 1) + dp; + temp = (uint8_t) ((temp >> 8) + READ( -1, data )); + nz |= temp; + WRITE( 0, data, temp ); + + goto inc_pc_loop; + } + + case 0x7A: // ADDW YA,dp + case 0x9A:{// SUBW YA,dp + int lo = READ_DP( -2, data ); + int hi = READ_DP( 0, (uint8_t) (data + 1) ); + int result; + int flags; + + if ( opcode == 0x9A ) // SUBW + { + lo = (lo ^ 0xFF) + 1; + hi ^= 0xFF; + } + + lo += a; + result = y + hi + (lo >> 8); + flags = hi ^ y ^ result; + + psw = (psw & ~(v40 | h08)) | + (flags >> 1 & h08) | + ((flags + 0x80) >> 2 & v40); + c = result; + a = (uint8_t) lo; + result = (uint8_t) result; + y = result; + nz = (((lo >> 1) | lo) & 0x7F) | result; + + goto inc_pc_loop; + } + + case 0x5A: { // CMPW YA,dp + int temp = a - READ_DP( -1, data ); + nz = ((temp >> 1) | temp) & 0x7F; + temp = y + (temp >> 8); + temp -= READ_DP( 0, (uint8_t) (data + 1) ); + nz |= temp; + c = ~temp; + nz &= 0xFF; + goto inc_pc_loop; + } + +// 10. MULTIPLICATION & DIVISON COMMANDS + + case 0xCF: { // MUL YA + unsigned temp = y * a; + a = (uint8_t) temp; + nz = ((temp >> 1) | temp) & 0x7F; + y = temp >> 8; + nz |= y; + goto loop; + } + + case 0x9E: // DIV YA,X + { + unsigned ya = y * 0x100 + a; + + psw &= ~(h08 | v40); + + if ( y >= x ) + psw |= v40; + + if ( (y & 15) >= (x & 15) ) + psw |= h08; + + if ( y < x * 2 ) + { + a = ya / x; + y = ya - a * x; + } + else + { + a = 255 - (ya - x * 0x200) / (256 - x); + y = x + (ya - x * 0x200) % (256 - x); + } + + nz = (uint8_t) a; + a = (uint8_t) a; + + goto loop; + } + +// 11. DECIMAL COMPENSATION COMMANDS + + case 0xDF: // DAA + SUSPICIOUS_OPCODE( "DAA" ); + if ( a > 0x99 || c & 0x100 ) + { + a += 0x60; + c = 0x100; + } + + if ( (a & 0x0F) > 9 || psw & h08 ) + a += 0x06; + + nz = a; + a = (uint8_t) a; + goto loop; + + case 0xBE: // DAS + SUSPICIOUS_OPCODE( "DAS" ); + if ( a > 0x99 || !(c & 0x100) ) + { + a -= 0x60; + c = 0; + } + + if ( (a & 0x0F) > 9 || !(psw & h08) ) + a -= 0x06; + + nz = a; + a = (uint8_t) a; + goto loop; + +// 12. BRANCHING COMMANDS + + case 0x2F: // BRA rel + pc += (BOOST::int8_t) data; + goto inc_pc_loop; + + case 0x30: // BMI + BRANCH( (nz & nz_neg_mask) ) + + case 0x10: // BPL + BRANCH( !(nz & nz_neg_mask) ) + + case 0xB0: // BCS + BRANCH( c & 0x100 ) + + case 0x90: // BCC + BRANCH( !(c & 0x100) ) + + case 0x70: // BVS + BRANCH( psw & v40 ) + + case 0x50: // BVC + BRANCH( !(psw & v40) ) + + #define CBRANCH( cond )\ + {\ + pc++;\ + if ( cond )\ + goto cbranch_taken_loop;\ + rel_time -= 2;\ + goto inc_pc_loop;\ + } + + case 0x03: // BBS dp.bit,rel + case 0x23: + case 0x43: + case 0x63: + case 0x83: + case 0xA3: + case 0xC3: + case 0xE3: + CBRANCH( READ_DP( -4, data ) >> (opcode >> 5) & 1 ) + + case 0x13: // BBC dp.bit,rel + case 0x33: + case 0x53: + case 0x73: + case 0x93: + case 0xB3: + case 0xD3: + case 0xF3: + CBRANCH( !(READ_DP( -4, data ) >> (opcode >> 5) & 1) ) + + case 0xDE: // CBNE dp+X,rel + data = (uint8_t) (data + x); + // fall through + case 0x2E:{// CBNE dp,rel + int temp; + // 61% from timer + READ_DP_TIMER( -4, data, temp ); + CBRANCH( temp != a ) + } + + case 0x6E: { // DBNZ dp,rel + unsigned temp = READ_DP( -4, data ) - 1; + WRITE_DP( -3, (uint8_t) data, /*(uint8_t)*/ temp + no_read_before_write ); + CBRANCH( temp ) + } + + case 0xFE: // DBNZ Y,rel + y = (uint8_t) (y - 1); + BRANCH( y ) + + case 0x1F: // JMP [abs+X] + SET_PC( READ_PC16( pc ) + x ); + // fall through + case 0x5F: // JMP abs + SET_PC( READ_PC16( pc ) ); + goto loop; + +// 13. SUB-ROUTINE CALL RETURN COMMANDS + + case 0x0F:{// BRK + int temp; + int ret_addr = GET_PC(); + SUSPICIOUS_OPCODE( "BRK" ); + SET_PC( READ_PROG16( 0xFFDE ) ); // vector address verified + PUSH16( ret_addr ); + GET_PSW( temp ); + psw = (psw | b10) & ~i04; + PUSH( temp ); + goto loop; + } + + case 0x4F:{// PCALL offset + int ret_addr = GET_PC() + 1; + SET_PC( 0xFF00 | data ); + PUSH16( ret_addr ); + goto loop; + } + + case 0x01: // TCALL n + case 0x11: + case 0x21: + case 0x31: + case 0x41: + case 0x51: + case 0x61: + case 0x71: + case 0x81: + case 0x91: + case 0xA1: + case 0xB1: + case 0xC1: + case 0xD1: + case 0xE1: + case 0xF1: { + int ret_addr = GET_PC(); + SET_PC( READ_PROG16( 0xFFDE - (opcode >> 3) ) ); + PUSH16( ret_addr ); + goto loop; + } + +// 14. STACK OPERATION COMMANDS + + { + int temp; + case 0x7F: // RET1 + temp = *sp; + SET_PC( GET_LE16( sp + 1 ) ); + sp += 3; + goto set_psw; + case 0x8E: // POP PSW + POP( temp ); + set_psw: + SET_PSW( temp ); + goto loop; + } + + case 0x0D: { // PUSH PSW + int temp; + GET_PSW( temp ); + PUSH( temp ); + goto loop; + } + + case 0x2D: // PUSH A + PUSH( a ); + goto loop; + + case 0x4D: // PUSH X + PUSH( x ); + goto loop; + + case 0x6D: // PUSH Y + PUSH( y ); + goto loop; + + case 0xAE: // POP A + POP( a ); + goto loop; + + case 0xCE: // POP X + POP( x ); + goto loop; + + case 0xEE: // POP Y + POP( y ); + goto loop; + +// 15. BIT OPERATION COMMANDS + + case 0x02: // SET1 + case 0x22: + case 0x42: + case 0x62: + case 0x82: + case 0xA2: + case 0xC2: + case 0xE2: + case 0x12: // CLR1 + case 0x32: + case 0x52: + case 0x72: + case 0x92: + case 0xB2: + case 0xD2: + case 0xF2: { + int bit = 1 << (opcode >> 5); + int mask = ~bit; + if ( opcode & 0x10 ) + bit = 0; + data += dp; + WRITE( 0, data, (READ( -1, data ) & mask) | bit ); + goto inc_pc_loop; + } + + case 0x0E: // TSET1 abs + case 0x4E: // TCLR1 abs + data = READ_PC16( pc ); + pc += 2; + { + unsigned temp = READ( -2, data ); + nz = (uint8_t) (a - temp); + temp &= ~a; + if ( opcode == 0x0E ) + temp |= a; + WRITE( 0, data, temp ); + } + goto loop; + + case 0x4A: // AND1 C,mem.bit + c &= MEM_BIT( 0 ); + pc += 2; + goto loop; + + case 0x6A: // AND1 C,/mem.bit + c &= ~MEM_BIT( 0 ); + pc += 2; + goto loop; + + case 0x0A: // OR1 C,mem.bit + c |= MEM_BIT( -1 ); + pc += 2; + goto loop; + + case 0x2A: // OR1 C,/mem.bit + c |= ~MEM_BIT( -1 ); + pc += 2; + goto loop; + + case 0x8A: // EOR1 C,mem.bit + c ^= MEM_BIT( -1 ); + pc += 2; + goto loop; + + case 0xEA: // NOT1 mem.bit + data = READ_PC16( pc ); + pc += 2; + { + unsigned temp = READ( -1, data & 0x1FFF ); + temp ^= 1 << (data >> 13); + WRITE( 0, data & 0x1FFF, temp ); + } + goto loop; + + case 0xCA: // MOV1 mem.bit,C + data = READ_PC16( pc ); + pc += 2; + { + unsigned temp = READ( -2, data & 0x1FFF ); + unsigned bit = data >> 13; + temp = (temp & ~(1 << bit)) | ((c >> 8 & 1) << bit); + WRITE( 0, data & 0x1FFF, temp + no_read_before_write ); + } + goto loop; + + case 0xAA: // MOV1 C,mem.bit + c = MEM_BIT( 0 ); + pc += 2; + goto loop; + +// 16. PROGRAM PSW FLAG OPERATION COMMANDS + + case 0x60: // CLRC + c = 0; + goto loop; + + case 0x80: // SETC + c = ~0; + goto loop; + + case 0xED: // NOTC + c ^= 0x100; + goto loop; + + case 0xE0: // CLRV + psw &= ~(v40 | h08); + goto loop; + + case 0x20: // CLRP + dp = 0; + goto loop; + + case 0x40: // SETP + dp = 0x100; + goto loop; + + case 0xA0: // EI + SUSPICIOUS_OPCODE( "EI" ); + psw |= i04; + goto loop; + + case 0xC0: // DI + SUSPICIOUS_OPCODE( "DI" ); + psw &= ~i04; + goto loop; + +// 17. OTHER COMMANDS + + case 0x00: // NOP + goto loop; + + case 0xFF:{// STOP + // handle PC wrap-around + unsigned addr = GET_PC() - 1; + if ( addr >= 0x10000 ) + { + addr &= 0xFFFF; + SET_PC( addr ); + dprintf( "SPC: PC wrapped around\n" ); + goto loop; + } + } + // fall through + case 0xEF: // SLEEP + SUSPICIOUS_OPCODE( "STOP/SLEEP" ); + --pc; + rel_time = 0; + m.cpu_error = "SPC emulation error"; + goto stop; + } // switch + + assert( 0 ); // catch any unhandled instructions +} +out_of_time: + rel_time -= m.cycle_table [*pc]; // undo partial execution of opcode +stop: + + // Uncache registers + if ( GET_PC() >= 0x10000 ) + dprintf( "SPC: PC wrapped around\n" ); + m.cpu_regs.pc = (uint16_t) GET_PC(); + m.cpu_regs.sp = ( uint8_t) GET_SP(); + m.cpu_regs.a = ( uint8_t) a; + m.cpu_regs.x = ( uint8_t) x; + m.cpu_regs.y = ( uint8_t) y; + { + int temp; + GET_PSW( temp ); + m.cpu_regs.psw = (uint8_t) temp; + } +} +SPC_CPU_RUN_FUNC_END diff --git a/plugins/snes9x_gx/source/snes9x/apu/SPC_DSP.cpp b/plugins/snes9x_gx/source/snes9x/apu/SPC_DSP.cpp new file mode 100644 index 00000000..e6ba49ed --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/apu/SPC_DSP.cpp @@ -0,0 +1,1072 @@ +// snes_spc 0.9.0. http://www.slack.net/~ant/ + +#include "SPC_DSP.h" + +#include "blargg_endian.h" +#include <string.h> + +/* Copyright (C) 2007 Shay Green. This module is free software; you +can redistribute it and/or modify it under the terms of the GNU Lesser +General Public License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. This +module is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. You should have received a copy of the GNU Lesser General Public +License along with this module; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include "blargg_source.h" + +#ifdef BLARGG_ENABLE_OPTIMIZER + #include BLARGG_ENABLE_OPTIMIZER +#endif + +#if INT_MAX < 0x7FFFFFFF + #error "Requires that int type have at least 32 bits" +#endif + +// TODO: add to blargg_endian.h +#define GET_LE16SA( addr ) ((BOOST::int16_t) GET_LE16( addr )) +#define GET_LE16A( addr ) GET_LE16( addr ) +#define SET_LE16A( addr, data ) SET_LE16( addr, data ) + +static BOOST::uint8_t const initial_regs [SPC_DSP::register_count] = +{ + 0x45,0x8B,0x5A,0x9A,0xE4,0x82,0x1B,0x78,0x00,0x00,0xAA,0x96,0x89,0x0E,0xE0,0x80, + 0x2A,0x49,0x3D,0xBA,0x14,0xA0,0xAC,0xC5,0x00,0x00,0x51,0xBB,0x9C,0x4E,0x7B,0xFF, + 0xF4,0xFD,0x57,0x32,0x37,0xD9,0x42,0x22,0x00,0x00,0x5B,0x3C,0x9F,0x1B,0x87,0x9A, + 0x6F,0x27,0xAF,0x7B,0xE5,0x68,0x0A,0xD9,0x00,0x00,0x9A,0xC5,0x9C,0x4E,0x7B,0xFF, + 0xEA,0x21,0x78,0x4F,0xDD,0xED,0x24,0x14,0x00,0x00,0x77,0xB1,0xD1,0x36,0xC1,0x67, + 0x52,0x57,0x46,0x3D,0x59,0xF4,0x87,0xA4,0x00,0x00,0x7E,0x44,0x00,0x4E,0x7B,0xFF, + 0x75,0xF5,0x06,0x97,0x10,0xC3,0x24,0xBB,0x00,0x00,0x7B,0x7A,0xE0,0x60,0x12,0x0F, + 0xF7,0x74,0x1C,0xE5,0x39,0x3D,0x73,0xC1,0x00,0x00,0x7A,0xB3,0xFF,0x4E,0x7B,0xFF +}; + +// if ( io < -32768 ) io = -32768; +// if ( io > 32767 ) io = 32767; +#define CLAMP16( io )\ +{\ + if ( (int16_t) io != io )\ + io = (io >> 31) ^ 0x7FFF;\ +} + +// Access global DSP register +#define REG(n) m.regs [r_##n] + +// Access voice DSP register +#define VREG(r,n) r [v_##n] + +#define WRITE_SAMPLES( l, r, out ) \ +{\ + out [0] = l;\ + out [1] = r;\ + out += 2;\ + if ( out >= m.out_end )\ + {\ + check( out == m.out_end );\ + check( m.out_end != &m.extra [extra_size] || \ + (m.extra <= m.out_begin && m.extra < &m.extra [extra_size]) );\ + out = m.extra;\ + m.out_end = &m.extra [extra_size];\ + }\ +}\ + +void SPC_DSP::set_output( sample_t* out, int size ) +{ + require( (size & 1) == 0 ); // must be even + if ( !out ) + { + out = m.extra; + size = extra_size; + } + m.out_begin = out; + m.out = out; + m.out_end = out + size; +} + +// Volume registers and efb are signed! Easy to forget int8_t cast. +// Prefixes are to avoid accidental use of locals with same names. + +// Gaussian interpolation + +static short const gauss [512] = +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, + 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, + 11, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 15, 16, 16, 17, 17, + 18, 19, 19, 20, 20, 21, 21, 22, 23, 23, 24, 24, 25, 26, 27, 27, + 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 36, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 58, 59, 60, 61, 62, 64, 65, 66, 67, 69, 70, 71, 73, 74, 76, 77, + 78, 80, 81, 83, 84, 86, 87, 89, 90, 92, 94, 95, 97, 99, 100, 102, + 104, 106, 107, 109, 111, 113, 115, 117, 118, 120, 122, 124, 126, 128, 130, 132, + 134, 137, 139, 141, 143, 145, 147, 150, 152, 154, 156, 159, 161, 163, 166, 168, + 171, 173, 175, 178, 180, 183, 186, 188, 191, 193, 196, 199, 201, 204, 207, 210, + 212, 215, 218, 221, 224, 227, 230, 233, 236, 239, 242, 245, 248, 251, 254, 257, + 260, 263, 267, 270, 273, 276, 280, 283, 286, 290, 293, 297, 300, 304, 307, 311, + 314, 318, 321, 325, 328, 332, 336, 339, 343, 347, 351, 354, 358, 362, 366, 370, + 374, 378, 381, 385, 389, 393, 397, 401, 405, 410, 414, 418, 422, 426, 430, 434, + 439, 443, 447, 451, 456, 460, 464, 469, 473, 477, 482, 486, 491, 495, 499, 504, + 508, 513, 517, 522, 527, 531, 536, 540, 545, 550, 554, 559, 563, 568, 573, 577, + 582, 587, 592, 596, 601, 606, 611, 615, 620, 625, 630, 635, 640, 644, 649, 654, + 659, 664, 669, 674, 678, 683, 688, 693, 698, 703, 708, 713, 718, 723, 728, 732, + 737, 742, 747, 752, 757, 762, 767, 772, 777, 782, 787, 792, 797, 802, 806, 811, + 816, 821, 826, 831, 836, 841, 846, 851, 855, 860, 865, 870, 875, 880, 884, 889, + 894, 899, 904, 908, 913, 918, 923, 927, 932, 937, 941, 946, 951, 955, 960, 965, + 969, 974, 978, 983, 988, 992, 997,1001,1005,1010,1014,1019,1023,1027,1032,1036, +1040,1045,1049,1053,1057,1061,1066,1070,1074,1078,1082,1086,1090,1094,1098,1102, +1106,1109,1113,1117,1121,1125,1128,1132,1136,1139,1143,1146,1150,1153,1157,1160, +1164,1167,1170,1174,1177,1180,1183,1186,1190,1193,1196,1199,1202,1205,1207,1210, +1213,1216,1219,1221,1224,1227,1229,1232,1234,1237,1239,1241,1244,1246,1248,1251, +1253,1255,1257,1259,1261,1263,1265,1267,1269,1270,1272,1274,1275,1277,1279,1280, +1282,1283,1284,1286,1287,1288,1290,1291,1292,1293,1294,1295,1296,1297,1297,1298, +1299,1300,1300,1301,1302,1302,1303,1303,1303,1304,1304,1304,1304,1304,1305,1305, +}; + +inline int SPC_DSP::interpolate( voice_t const* v ) +{ + // Make pointers into gaussian based on fractional position between samples + int offset = v->interp_pos >> 4 & 0xFF; + short const* fwd = gauss + 255 - offset; + short const* rev = gauss + offset; // mirror left half of gaussian + + int const* in = &v->buf [(v->interp_pos >> 12) + v->buf_pos]; + int out; + out = (fwd [ 0] * in [0]) >> 11; + out += (fwd [256] * in [1]) >> 11; + out += (rev [256] * in [2]) >> 11; + out = (int16_t) out; + out += (rev [ 0] * in [3]) >> 11; + + CLAMP16( out ); + out &= ~1; + return out; +} + + +//// Counters + +int const simple_counter_range = 2048 * 5 * 3; // 30720 + +static unsigned const counter_rates [32] = +{ + simple_counter_range + 1, // never fires + 2048, 1536, + 1280, 1024, 768, + 640, 512, 384, + 320, 256, 192, + 160, 128, 96, + 80, 64, 48, + 40, 32, 24, + 20, 16, 12, + 10, 8, 6, + 5, 4, 3, + 2, + 1 +}; + +static unsigned const counter_offsets [32] = +{ + 1, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 0, + 0 +}; + +inline void SPC_DSP::init_counter() +{ + m.counter = 0; +} + +inline void SPC_DSP::run_counters() +{ + if ( --m.counter < 0 ) + m.counter = simple_counter_range - 1; +} + +inline unsigned SPC_DSP::read_counter( int rate ) +{ + return ((unsigned) m.counter + counter_offsets [rate]) % counter_rates [rate]; +} + + +//// Envelope + +inline void SPC_DSP::run_envelope( voice_t* const v ) +{ + int env = v->env; + if ( v->env_mode == env_release ) // 60% + { + if ( (env -= 0x8) < 0 ) + env = 0; + v->env = env; + } + else + { + int rate; + int env_data = VREG(v->regs,adsr1); + if ( m.t_adsr0 & 0x80 ) // 99% ADSR + { + if ( v->env_mode >= env_decay ) // 99% + { + env--; + env -= env >> 8; + rate = env_data & 0x1F; + if ( v->env_mode == env_decay ) // 1% + rate = (m.t_adsr0 >> 3 & 0x0E) + 0x10; + } + else // env_attack + { + rate = (m.t_adsr0 & 0x0F) * 2 + 1; + env += rate < 31 ? 0x20 : 0x400; + } + } + else // GAIN + { + int mode; + env_data = VREG(v->regs,gain); + mode = env_data >> 5; + if ( mode < 4 ) // direct + { + env = env_data * 0x10; + rate = 31; + } + else + { + rate = env_data & 0x1F; + if ( mode == 4 ) // 4: linear decrease + { + env -= 0x20; + } + else if ( mode < 6 ) // 5: exponential decrease + { + env--; + env -= env >> 8; + } + else // 6,7: linear increase + { + env += 0x20; + if ( mode > 6 && (unsigned) v->hidden_env >= 0x600 ) + env += 0x8 - 0x20; // 7: two-slope linear increase + } + } + } + + // Sustain level + if ( (env >> 8) == (env_data >> 5) && v->env_mode == env_decay ) + v->env_mode = env_sustain; + + v->hidden_env = env; + + // unsigned cast because linear decrease going negative also triggers this + if ( (unsigned) env > 0x7FF ) + { + env = (env < 0 ? 0 : 0x7FF); + if ( v->env_mode == env_attack ) + v->env_mode = env_decay; + } + + if ( !read_counter( rate ) ) + v->env = env; // nothing else is controlled by the counter + } +} + + +//// BRR Decoding + +inline void SPC_DSP::decode_brr( voice_t* v ) +{ + // Arrange the four input nybbles in 0xABCD order for easy decoding + int nybbles = m.t_brr_byte * 0x100 + m.ram [(v->brr_addr + v->brr_offset + 1) & 0xFFFF]; + + int const header = m.t_brr_header; + + // Write to next four samples in circular buffer + int* pos = &v->buf [v->buf_pos]; + int* end; + if ( (v->buf_pos += 4) >= brr_buf_size ) + v->buf_pos = 0; + + // Decode four samples + for ( end = pos + 4; pos < end; pos++, nybbles <<= 4 ) + { + // Extract nybble and sign-extend + int s = (int16_t) nybbles >> 12; + + // Shift sample based on header + int const shift = header >> 4; + s = (s << shift) >> 1; + if ( shift >= 0xD ) // handle invalid range + s = (s >> 25) << 11; // same as: s = (s < 0 ? -0x800 : 0) + + // Apply IIR filter (8 is the most commonly used) + int const filter = header & 0x0C; + int const p1 = pos [brr_buf_size - 1]; + int const p2 = pos [brr_buf_size - 2] >> 1; + if ( filter >= 8 ) + { + s += p1; + s -= p2; + if ( filter == 8 ) // s += p1 * 0.953125 - p2 * 0.46875 + { + s += p2 >> 4; + s += (p1 * -3) >> 6; + } + else // s += p1 * 0.8984375 - p2 * 0.40625 + { + s += (p1 * -13) >> 7; + s += (p2 * 3) >> 4; + } + } + else if ( filter ) // s += p1 * 0.46875 + { + s += p1 >> 1; + s += (-p1) >> 5; + } + + // Adjust and write sample + CLAMP16( s ); + s = (int16_t) (s * 2); + pos [brr_buf_size] = pos [0] = s; // second copy simplifies wrap-around + } +} + + +//// Misc + +#define MISC_CLOCK( n ) inline void SPC_DSP::misc_##n() + +MISC_CLOCK( 27 ) +{ + m.t_pmon = REG(pmon) & 0xFE; // voice 0 doesn't support PMON +} +MISC_CLOCK( 28 ) +{ + m.t_non = REG(non); + m.t_eon = REG(eon); + m.t_dir = REG(dir); +} +MISC_CLOCK( 29 ) +{ + if ( (m.every_other_sample ^= 1) != 0 ) + m.new_kon &= ~m.kon; // clears KON 63 clocks after it was last read +} +MISC_CLOCK( 30 ) +{ + if ( m.every_other_sample ) + { + m.kon = m.new_kon; + m.t_koff = REG(koff) | m.mute_mask; + } + + run_counters(); + + // Noise + if ( !read_counter( REG(flg) & 0x1F ) ) + { + int feedback = (m.noise << 13) ^ (m.noise << 14); + m.noise = (feedback & 0x4000) ^ (m.noise >> 1); + } +} + + +//// Voices + +#define VOICE_CLOCK( n ) void SPC_DSP::voice_##n( voice_t* const v ) + +inline VOICE_CLOCK( V1 ) +{ + m.t_dir_addr = m.t_dir * 0x100 + m.t_srcn * 4; + m.t_srcn = VREG(v->regs,srcn); +} +inline VOICE_CLOCK( V2 ) +{ + // Read sample pointer (ignored if not needed) + uint8_t const* entry = &m.ram [m.t_dir_addr]; + if ( !v->kon_delay ) + entry += 2; + m.t_brr_next_addr = GET_LE16A( entry ); + + m.t_adsr0 = VREG(v->regs,adsr0); + + // Read pitch, spread over two clocks + m.t_pitch = VREG(v->regs,pitchl); +} +inline VOICE_CLOCK( V3a ) +{ + m.t_pitch += (VREG(v->regs,pitchh) & 0x3F) << 8; +} +inline VOICE_CLOCK( V3b ) +{ + // Read BRR header and byte + m.t_brr_byte = m.ram [(v->brr_addr + v->brr_offset) & 0xFFFF]; + m.t_brr_header = m.ram [v->brr_addr]; // brr_addr doesn't need masking +} +VOICE_CLOCK( V3c ) +{ + // Pitch modulation using previous voice's output + if ( m.t_pmon & v->vbit ) + m.t_pitch += ((m.t_output >> 5) * m.t_pitch) >> 10; + + if ( v->kon_delay ) + { + // Get ready to start BRR decoding on next sample + if ( v->kon_delay == 5 ) + { + v->brr_addr = m.t_brr_next_addr; + v->brr_offset = 1; + v->buf_pos = 0; + m.t_brr_header = 0; // header is ignored on this sample + m.kon_check = true; + + if (take_spc_snapshot) + { + take_spc_snapshot = 0; + if (spc_snapshot_callback) + spc_snapshot_callback(); + } + } + + // Envelope is never run during KON + v->env = 0; + v->hidden_env = 0; + + // Disable BRR decoding until last three samples + v->interp_pos = 0; + if ( --v->kon_delay & 3 ) + v->interp_pos = 0x4000; + + // Pitch is never added during KON + m.t_pitch = 0; + } + + // Gaussian interpolation + { + int output = interpolate( v ); + + // Noise + if ( m.t_non & v->vbit ) + output = (int16_t) (m.noise * 2); + + // Apply envelope + m.t_output = (output * v->env) >> 11 & ~1; + v->t_envx_out = (uint8_t) (v->env >> 4); + } + + // Immediate silence due to end of sample or soft reset + if ( REG(flg) & 0x80 || (m.t_brr_header & 3) == 1 ) + { + v->env_mode = env_release; + v->env = 0; + } + + if ( m.every_other_sample ) + { + // KOFF + if ( m.t_koff & v->vbit ) + v->env_mode = env_release; + + // KON + if ( m.kon & v->vbit ) + { + v->kon_delay = 5; + v->env_mode = env_attack; + } + } + + // Run envelope for next sample + if ( !v->kon_delay ) + run_envelope( v ); +} + +inline void SPC_DSP::voice_output( voice_t const* v, int ch ) +{ + // Apply left/right volume + int amp = (m.t_output * (int8_t) VREG(v->regs,voll + ch)) >> 7; + amp *= ((stereo_switch & (1 << (v->voice_number + ch * voice_count))) ? 1 : 0); + + // Add to output total + m.t_main_out [ch] += amp; + CLAMP16( m.t_main_out [ch] ); + + // Optionally add to echo total + if ( m.t_eon & v->vbit ) + { + m.t_echo_out [ch] += amp; + CLAMP16( m.t_echo_out [ch] ); + } +} +VOICE_CLOCK( V4 ) +{ + // Decode BRR + m.t_looped = 0; + if ( v->interp_pos >= 0x4000 ) + { + decode_brr( v ); + + if ( (v->brr_offset += 2) >= brr_block_size ) + { + // Start decoding next BRR block + assert( v->brr_offset == brr_block_size ); + v->brr_addr = (v->brr_addr + brr_block_size) & 0xFFFF; + if ( m.t_brr_header & 1 ) + { + v->brr_addr = m.t_brr_next_addr; + m.t_looped = v->vbit; + } + v->brr_offset = 1; + } + } + + // Apply pitch + v->interp_pos = (v->interp_pos & 0x3FFF) + m.t_pitch; + + // Keep from getting too far ahead (when using pitch modulation) + if ( v->interp_pos > 0x7FFF ) + v->interp_pos = 0x7FFF; + + // Output left + voice_output( v, 0 ); +} +inline VOICE_CLOCK( V5 ) +{ + // Output right + voice_output( v, 1 ); + + // ENDX, OUTX, and ENVX won't update if you wrote to them 1-2 clocks earlier + int endx_buf = REG(endx) | m.t_looped; + + // Clear bit in ENDX if KON just began + if ( v->kon_delay == 5 ) + endx_buf &= ~v->vbit; + m.endx_buf = (uint8_t) endx_buf; +} +inline VOICE_CLOCK( V6 ) +{ + (void) v; // avoid compiler warning about unused v + m.outx_buf = (uint8_t) (m.t_output >> 8); +} +inline VOICE_CLOCK( V7 ) +{ + // Update ENDX + REG(endx) = m.endx_buf; + + m.envx_buf = v->t_envx_out; +} +inline VOICE_CLOCK( V8 ) +{ + // Update OUTX + VREG(v->regs,outx) = m.outx_buf; +} +inline VOICE_CLOCK( V9 ) +{ + // Update ENVX + VREG(v->regs,envx) = m.envx_buf; +} + +// Most voices do all these in one clock, so make a handy composite +inline VOICE_CLOCK( V3 ) +{ + voice_V3a( v ); + voice_V3b( v ); + voice_V3c( v ); +} + +// Common combinations of voice steps on different voices. This greatly reduces +// code size and allows everything to be inlined in these functions. +VOICE_CLOCK(V7_V4_V1) { voice_V7(v); voice_V1(v+3); voice_V4(v+1); } +VOICE_CLOCK(V8_V5_V2) { voice_V8(v); voice_V5(v+1); voice_V2(v+2); } +VOICE_CLOCK(V9_V6_V3) { voice_V9(v); voice_V6(v+1); voice_V3(v+2); } + + +//// Echo + +// Current echo buffer pointer for left/right channel +#define ECHO_PTR( ch ) (&m.ram [m.t_echo_ptr + ch * 2]) + +// Sample in echo history buffer, where 0 is the oldest +#define ECHO_FIR( i ) (m.echo_hist_pos [i]) + +// Calculate FIR point for left/right channel +#define CALC_FIR( i, ch ) ((ECHO_FIR( i + 1 ) [ch] * (int8_t) REG(fir + i * 0x10)) >> 6) + +#define ECHO_CLOCK( n ) inline void SPC_DSP::echo_##n() + +inline void SPC_DSP::echo_read( int ch ) +{ + int s; + if ( m.t_echo_ptr >= 0xffc0 && rom_enabled ) + s = GET_LE16SA( &hi_ram [m.t_echo_ptr + ch * 2 - 0xffc0] ); + else + s = GET_LE16SA( ECHO_PTR( ch ) ); + // second copy simplifies wrap-around handling + ECHO_FIR( 0 ) [ch] = ECHO_FIR( 8 ) [ch] = s >> 1; +} + +ECHO_CLOCK( 22 ) +{ + // History + if ( ++m.echo_hist_pos >= &m.echo_hist [echo_hist_size] ) + m.echo_hist_pos = m.echo_hist; + + m.t_echo_ptr = (m.t_esa * 0x100 + m.echo_offset) & 0xFFFF; + echo_read( 0 ); + + // FIR (using l and r temporaries below helps compiler optimize) + int l = CALC_FIR( 0, 0 ); + int r = CALC_FIR( 0, 1 ); + + m.t_echo_in [0] = l; + m.t_echo_in [1] = r; +} +ECHO_CLOCK( 23 ) +{ + int l = CALC_FIR( 1, 0 ) + CALC_FIR( 2, 0 ); + int r = CALC_FIR( 1, 1 ) + CALC_FIR( 2, 1 ); + + m.t_echo_in [0] += l; + m.t_echo_in [1] += r; + + echo_read( 1 ); +} +ECHO_CLOCK( 24 ) +{ + int l = CALC_FIR( 3, 0 ) + CALC_FIR( 4, 0 ) + CALC_FIR( 5, 0 ); + int r = CALC_FIR( 3, 1 ) + CALC_FIR( 4, 1 ) + CALC_FIR( 5, 1 ); + + m.t_echo_in [0] += l; + m.t_echo_in [1] += r; +} +ECHO_CLOCK( 25 ) +{ + int l = m.t_echo_in [0] + CALC_FIR( 6, 0 ); + int r = m.t_echo_in [1] + CALC_FIR( 6, 1 ); + + l = (int16_t) l; + r = (int16_t) r; + + l += (int16_t) CALC_FIR( 7, 0 ); + r += (int16_t) CALC_FIR( 7, 1 ); + + CLAMP16( l ); + CLAMP16( r ); + + m.t_echo_in [0] = l & ~1; + m.t_echo_in [1] = r & ~1; +} +inline int SPC_DSP::echo_output( int ch ) +{ + int out = (int16_t) ((m.t_main_out [ch] * (int8_t) REG(mvoll + ch * 0x10)) >> 7) + + (int16_t) ((m.t_echo_in [ch] * (int8_t) REG(evoll + ch * 0x10)) >> 7); + CLAMP16( out ); + return out; +} +ECHO_CLOCK( 26 ) +{ + // Left output volumes + // (save sample for next clock so we can output both together) + m.t_main_out [0] = echo_output( 0 ); + + // Echo feedback + int l = m.t_echo_out [0] + (int16_t) ((m.t_echo_in [0] * (int8_t) REG(efb)) >> 7); + int r = m.t_echo_out [1] + (int16_t) ((m.t_echo_in [1] * (int8_t) REG(efb)) >> 7); + + CLAMP16( l ); + CLAMP16( r ); + + m.t_echo_out [0] = l & ~1; + m.t_echo_out [1] = r & ~1; +} +ECHO_CLOCK( 27 ) +{ + // Output + int l = m.t_main_out [0]; + int r = echo_output( 1 ); + m.t_main_out [0] = 0; + m.t_main_out [1] = 0; + + // TODO: global muting isn't this simple (turns DAC on and off + // or something, causing small ~37-sample pulse when first muted) + if ( REG(flg) & 0x40 ) + { + l = 0; + r = 0; + } + + // Output sample to DAC + #ifdef SPC_DSP_OUT_HOOK + SPC_DSP_OUT_HOOK( l, r ); + #else + sample_t* out = m.out; + WRITE_SAMPLES( l, r, out ); + m.out = out; + #endif +} +ECHO_CLOCK( 28 ) +{ + m.t_echo_enabled = REG(flg); +} +inline void SPC_DSP::echo_write( int ch ) +{ + if ( !(m.t_echo_enabled & 0x20) ) + { + if ( m.t_echo_ptr >= 0xffc0 && rom_enabled ) + SET_LE16A( &hi_ram [m.t_echo_ptr + ch * 2 - 0xffc0], m.t_echo_out [ch] ); + else + SET_LE16A( ECHO_PTR( ch ), m.t_echo_out [ch] ); + } + + m.t_echo_out [ch] = 0; +} +ECHO_CLOCK( 29 ) +{ + m.t_esa = REG(esa); + + if ( !m.echo_offset ) + m.echo_length = (REG(edl) & 0x0F) * 0x800; + + m.echo_offset += 4; + if ( m.echo_offset >= m.echo_length ) + m.echo_offset = 0; + + // Write left echo + echo_write( 0 ); + + m.t_echo_enabled = REG(flg); +} +ECHO_CLOCK( 30 ) +{ + // Write right echo + echo_write( 1 ); +} + + +//// Timing + +// Execute clock for a particular voice +#define V( clock, voice ) voice_##clock( &m.voices [voice] ); + +/* The most common sequence of clocks uses composite operations +for efficiency. For example, the following are equivalent to the +individual steps on the right: + +V(V7_V4_V1,2) -> V(V7,2) V(V4,3) V(V1,5) +V(V8_V5_V2,2) -> V(V8,2) V(V5,3) V(V2,4) +V(V9_V6_V3,2) -> V(V9,2) V(V6,3) V(V3,4) */ + +// Voice 0 1 2 3 4 5 6 7 +#define GEN_DSP_TIMING \ +PHASE( 0) V(V5,0)V(V2,1)\ +PHASE( 1) V(V6,0)V(V3,1)\ +PHASE( 2) V(V7_V4_V1,0)\ +PHASE( 3) V(V8_V5_V2,0)\ +PHASE( 4) V(V9_V6_V3,0)\ +PHASE( 5) V(V7_V4_V1,1)\ +PHASE( 6) V(V8_V5_V2,1)\ +PHASE( 7) V(V9_V6_V3,1)\ +PHASE( 8) V(V7_V4_V1,2)\ +PHASE( 9) V(V8_V5_V2,2)\ +PHASE(10) V(V9_V6_V3,2)\ +PHASE(11) V(V7_V4_V1,3)\ +PHASE(12) V(V8_V5_V2,3)\ +PHASE(13) V(V9_V6_V3,3)\ +PHASE(14) V(V7_V4_V1,4)\ +PHASE(15) V(V8_V5_V2,4)\ +PHASE(16) V(V9_V6_V3,4)\ +PHASE(17) V(V1,0) V(V7,5)V(V4,6)\ +PHASE(18) V(V8_V5_V2,5)\ +PHASE(19) V(V9_V6_V3,5)\ +PHASE(20) V(V1,1) V(V7,6)V(V4,7)\ +PHASE(21) V(V8,6)V(V5,7) V(V2,0) /* t_brr_next_addr order dependency */\ +PHASE(22) V(V3a,0) V(V9,6)V(V6,7) echo_22();\ +PHASE(23) V(V7,7) echo_23();\ +PHASE(24) V(V8,7) echo_24();\ +PHASE(25) V(V3b,0) V(V9,7) echo_25();\ +PHASE(26) echo_26();\ +PHASE(27) misc_27(); echo_27();\ +PHASE(28) misc_28(); echo_28();\ +PHASE(29) misc_29(); echo_29();\ +PHASE(30) misc_30();V(V3c,0) echo_30();\ +PHASE(31) V(V4,0) V(V1,2)\ + +#if !SPC_DSP_CUSTOM_RUN + +void SPC_DSP::run( int clocks_remain ) +{ + require( clocks_remain > 0 ); + + int const phase = m.phase; + m.phase = (phase + clocks_remain) & 31; + switch ( phase ) + { + loop: + + #define PHASE( n ) if ( n && !--clocks_remain ) break; case n: + GEN_DSP_TIMING + #undef PHASE + + if ( --clocks_remain ) + goto loop; + } +} + +#endif + + +//// Setup + +void SPC_DSP::init( void* ram_64k ) +{ + m.ram = (uint8_t*) ram_64k; + mute_voices( 0 ); + disable_surround( false ); + set_output( 0, 0 ); + reset(); + + stereo_switch = 0xffff; + take_spc_snapshot = 0; + spc_snapshot_callback = 0; + + #ifndef NDEBUG + // be sure this sign-extends + assert( (int16_t) 0x8000 == -0x8000 ); + + // be sure right shift preserves sign + assert( (-1 >> 1) == -1 ); + + // check clamp macro + int i; + i = +0x8000; CLAMP16( i ); assert( i == +0x7FFF ); + i = -0x8001; CLAMP16( i ); assert( i == -0x8000 ); + + blargg_verify_byte_order(); + #endif +} + +void SPC_DSP::soft_reset_common() +{ + require( m.ram ); // init() must have been called already + + m.noise = 0x4000; + m.echo_hist_pos = m.echo_hist; + m.every_other_sample = 1; + m.echo_offset = 0; + m.phase = 0; + + init_counter(); + + for (int i = 0; i < voice_count; i++) + m.voices[i].voice_number = i; +} + +void SPC_DSP::soft_reset() +{ + REG(flg) = 0xE0; + soft_reset_common(); +} + +void SPC_DSP::load( uint8_t const regs [register_count] ) +{ + memcpy( m.regs, regs, sizeof m.regs ); + memset( &m.regs [register_count], 0, offsetof (state_t,ram) - register_count ); + + // Internal state + for ( int i = voice_count; --i >= 0; ) + { + voice_t* v = &m.voices [i]; + v->brr_offset = 1; + v->vbit = 1 << i; + v->regs = &m.regs [i * 0x10]; + } + m.new_kon = REG(kon); + m.t_dir = REG(dir); + m.t_esa = REG(esa); + + soft_reset_common(); +} + +void SPC_DSP::reset() { load( initial_regs ); } + + +//// State save/load + +#if !SPC_NO_COPY_STATE_FUNCS + +void SPC_State_Copier::copy( void* state, size_t size ) +{ + func( buf, state, size ); +} + +int SPC_State_Copier::copy_int( int state, int size ) +{ + BOOST::uint8_t s [2]; + SET_LE16( s, state ); + func( buf, &s, size ); + return GET_LE16( s ); +} + +void SPC_State_Copier::skip( int count ) +{ + if ( count > 0 ) + { + char temp [64]; + memset( temp, 0, sizeof temp ); + do + { + int n = sizeof temp; + if ( n > count ) + n = count; + count -= n; + func( buf, temp, n ); + } + while ( count ); + } +} + +void SPC_State_Copier::extra() +{ + int n = 0; + SPC_State_Copier& copier = *this; + SPC_COPY( uint8_t, n ); + skip( n ); +} + +void SPC_DSP::copy_state( unsigned char** io, copy_func_t copy ) +{ + SPC_State_Copier copier( io, copy ); + + // DSP registers + copier.copy( m.regs, register_count ); + + // Internal state + + // Voices + int i; + for ( i = 0; i < voice_count; i++ ) + { + voice_t* v = &m.voices [i]; + + // BRR buffer + int i; + for ( i = 0; i < brr_buf_size; i++ ) + { + int s = v->buf [i]; + SPC_COPY( int16_t, s ); + v->buf [i] = v->buf [i + brr_buf_size] = s; + } + + SPC_COPY( uint16_t, v->interp_pos ); + SPC_COPY( uint16_t, v->brr_addr ); + SPC_COPY( uint16_t, v->env ); + SPC_COPY( int16_t, v->hidden_env ); + SPC_COPY( uint8_t, v->buf_pos ); + SPC_COPY( uint8_t, v->brr_offset ); + SPC_COPY( uint8_t, v->kon_delay ); + { + int m = v->env_mode; + SPC_COPY( uint8_t, m ); + v->env_mode = (enum env_mode_t) m; + } + SPC_COPY( uint8_t, v->t_envx_out ); + + copier.extra(); + } + + // Echo history + for ( i = 0; i < echo_hist_size; i++ ) + { + int j; + for ( j = 0; j < 2; j++ ) + { + int s = m.echo_hist_pos [i] [j]; + SPC_COPY( int16_t, s ); + m.echo_hist [i] [j] = s; // write back at offset 0 + } + } + m.echo_hist_pos = m.echo_hist; + memcpy( &m.echo_hist [echo_hist_size], m.echo_hist, echo_hist_size * sizeof m.echo_hist [0] ); + + // Misc + SPC_COPY( uint8_t, m.every_other_sample ); + SPC_COPY( uint8_t, m.kon ); + + SPC_COPY( uint16_t, m.noise ); + SPC_COPY( uint16_t, m.counter ); + SPC_COPY( uint16_t, m.echo_offset ); + SPC_COPY( uint16_t, m.echo_length ); + SPC_COPY( uint8_t, m.phase ); + + SPC_COPY( uint8_t, m.new_kon ); + SPC_COPY( uint8_t, m.endx_buf ); + SPC_COPY( uint8_t, m.envx_buf ); + SPC_COPY( uint8_t, m.outx_buf ); + + SPC_COPY( uint8_t, m.t_pmon ); + SPC_COPY( uint8_t, m.t_non ); + SPC_COPY( uint8_t, m.t_eon ); + SPC_COPY( uint8_t, m.t_dir ); + SPC_COPY( uint8_t, m.t_koff ); + + SPC_COPY( uint16_t, m.t_brr_next_addr ); + SPC_COPY( uint8_t, m.t_adsr0 ); + SPC_COPY( uint8_t, m.t_brr_header ); + SPC_COPY( uint8_t, m.t_brr_byte ); + SPC_COPY( uint8_t, m.t_srcn ); + SPC_COPY( uint8_t, m.t_esa ); + SPC_COPY( uint8_t, m.t_echo_enabled ); + + SPC_COPY( int16_t, m.t_main_out [0] ); + SPC_COPY( int16_t, m.t_main_out [1] ); + SPC_COPY( int16_t, m.t_echo_out [0] ); + SPC_COPY( int16_t, m.t_echo_out [1] ); + SPC_COPY( int16_t, m.t_echo_in [0] ); + SPC_COPY( int16_t, m.t_echo_in [1] ); + + SPC_COPY( uint16_t, m.t_dir_addr ); + SPC_COPY( uint16_t, m.t_pitch ); + SPC_COPY( int16_t, m.t_output ); + SPC_COPY( uint16_t, m.t_echo_ptr ); + SPC_COPY( uint8_t, m.t_looped ); + + copier.extra(); +} +#endif + + +//// Snes9x Accessor + +void SPC_DSP::set_spc_snapshot_callback( void (*callback) (void) ) +{ + spc_snapshot_callback = callback; +} + +void SPC_DSP::dump_spc_snapshot( void ) +{ + take_spc_snapshot = 1; +} + +void SPC_DSP::set_stereo_switch( int value ) +{ + stereo_switch = value; +} + +SPC_DSP::uint8_t SPC_DSP::reg_value( int ch, int addr ) +{ + return m.voices[ch].regs[addr]; +} + +int SPC_DSP::envx_value( int ch ) +{ + return m.voices[ch].env; +} diff --git a/plugins/snes9x_gx/source/snes9x/apu/SPC_DSP.h b/plugins/snes9x_gx/source/snes9x/apu/SPC_DSP.h new file mode 100644 index 00000000..61d05ab5 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/apu/SPC_DSP.h @@ -0,0 +1,319 @@ +// Highly accurate SNES SPC-700 DSP emulator + +// snes_spc 0.9.0 +#ifndef SPC_DSP_H +#define SPC_DSP_H + +#include "blargg_common.h" + +extern "C" { typedef void (*dsp_copy_func_t)( unsigned char** io, void* state, size_t ); } + +class SPC_DSP { +public: + typedef BOOST::uint8_t uint8_t; + +// Setup + + // Initializes DSP and has it use the 64K RAM provided + void init( void* ram_64k ); + + // Sets destination for output samples. If out is NULL or out_size is 0, + // doesn't generate any. + typedef short sample_t; + void set_output( sample_t* out, int out_size ); + + // Number of samples written to output since it was last set, always + // a multiple of 2. Undefined if more samples were generated than + // output buffer could hold. + int sample_count() const; + +// Emulation + + // Resets DSP to power-on state + void reset(); + + // Emulates pressing reset switch on SNES + void soft_reset(); + + // Reads/writes DSP registers. For accuracy, you must first call run() + // to catch the DSP up to present. + int read ( int addr ) const; + void write( int addr, int data ); + + // Runs DSP for specified number of clocks (~1024000 per second). Every 32 clocks + // a pair of samples is be generated. + void run( int clock_count ); + +// Sound control + + // Mutes voices corresponding to non-zero bits in mask (issues repeated KOFF events). + // Reduces emulation accuracy. + enum { voice_count = 8 }; + void mute_voices( int mask ); + +// State + + // Resets DSP and uses supplied values to initialize registers + enum { register_count = 128 }; + void load( uint8_t const regs [register_count] ); + + // Saves/loads exact emulator state + enum { state_size = 640 }; // maximum space needed when saving + typedef dsp_copy_func_t copy_func_t; + void copy_state( unsigned char** io, copy_func_t ); + + // Returns non-zero if new key-on events occurred since last call + bool check_kon(); + +// Snes9x Accessor + + int stereo_switch; + int take_spc_snapshot; + int rom_enabled; // mirror + uint8_t *rom, *hi_ram; // mirror + void (*spc_snapshot_callback) (void); + + void set_spc_snapshot_callback( void (*callback) (void) ); + void dump_spc_snapshot( void ); + void set_stereo_switch( int ); + uint8_t reg_value( int, int ); + int envx_value( int ); + +// DSP register addresses + + // Global registers + enum { + r_mvoll = 0x0C, r_mvolr = 0x1C, + r_evoll = 0x2C, r_evolr = 0x3C, + r_kon = 0x4C, r_koff = 0x5C, + r_flg = 0x6C, r_endx = 0x7C, + r_efb = 0x0D, r_pmon = 0x2D, + r_non = 0x3D, r_eon = 0x4D, + r_dir = 0x5D, r_esa = 0x6D, + r_edl = 0x7D, + r_fir = 0x0F // 8 coefficients at 0x0F, 0x1F ... 0x7F + }; + + // Voice registers + enum { + v_voll = 0x00, v_volr = 0x01, + v_pitchl = 0x02, v_pitchh = 0x03, + v_srcn = 0x04, v_adsr0 = 0x05, + v_adsr1 = 0x06, v_gain = 0x07, + v_envx = 0x08, v_outx = 0x09 + }; + +public: + enum { extra_size = 16 }; + sample_t* extra() { return m.extra; } + sample_t const* out_pos() const { return m.out; } + void disable_surround( bool ) { } // not supported +public: + BLARGG_DISABLE_NOTHROW + + typedef BOOST::int8_t int8_t; + typedef BOOST::int16_t int16_t; + + enum { echo_hist_size = 8 }; + + enum env_mode_t { env_release, env_attack, env_decay, env_sustain }; + enum { brr_buf_size = 12 }; + struct voice_t + { + int buf [brr_buf_size*2];// decoded samples (twice the size to simplify wrap handling) + int buf_pos; // place in buffer where next samples will be decoded + int interp_pos; // relative fractional position in sample (0x1000 = 1.0) + int brr_addr; // address of current BRR block + int brr_offset; // current decoding offset in BRR block + uint8_t* regs; // pointer to voice's DSP registers + int vbit; // bitmask for voice: 0x01 for voice 0, 0x02 for voice 1, etc. + int kon_delay; // KON delay/current setup phase + env_mode_t env_mode; + int env; // current envelope level + int hidden_env; // used by GAIN mode 7, very obscure quirk + uint8_t t_envx_out; + int voice_number; + }; +private: + enum { brr_block_size = 9 }; + + struct state_t + { + uint8_t regs [register_count]; + + // Echo history keeps most recent 8 samples (twice the size to simplify wrap handling) + int echo_hist [echo_hist_size * 2] [2]; + int (*echo_hist_pos) [2]; // &echo_hist [0 to 7] + + int every_other_sample; // toggles every sample + int kon; // KON value when last checked + int noise; + int counter; + int echo_offset; // offset from ESA in echo buffer + int echo_length; // number of bytes that echo_offset will stop at + int phase; // next clock cycle to run (0-31) + bool kon_check; // set when a new KON occurs + + // Hidden registers also written to when main register is written to + int new_kon; + uint8_t endx_buf; + uint8_t envx_buf; + uint8_t outx_buf; + + // Temporary state between clocks + + // read once per sample + int t_pmon; + int t_non; + int t_eon; + int t_dir; + int t_koff; + + // read a few clocks ahead then used + int t_brr_next_addr; + int t_adsr0; + int t_brr_header; + int t_brr_byte; + int t_srcn; + int t_esa; + int t_echo_enabled; + + // internal state that is recalculated every sample + int t_dir_addr; + int t_pitch; + int t_output; + int t_looped; + int t_echo_ptr; + + // left/right sums + int t_main_out [2]; + int t_echo_out [2]; + int t_echo_in [2]; + + voice_t voices [voice_count]; + + // non-emulation state + uint8_t* ram; // 64K shared RAM between DSP and SMP + int mute_mask; + sample_t* out; + sample_t* out_end; + sample_t* out_begin; + sample_t extra [extra_size]; + }; + state_t m; + + void init_counter(); + void run_counters(); + unsigned read_counter( int rate ); + + int interpolate( voice_t const* v ); + void run_envelope( voice_t* const v ); + void decode_brr( voice_t* v ); + + void misc_27(); + void misc_28(); + void misc_29(); + void misc_30(); + + void voice_output( voice_t const* v, int ch ); + void voice_V1( voice_t* const ); + void voice_V2( voice_t* const ); + void voice_V3( voice_t* const ); + void voice_V3a( voice_t* const ); + void voice_V3b( voice_t* const ); + void voice_V3c( voice_t* const ); + void voice_V4( voice_t* const ); + void voice_V5( voice_t* const ); + void voice_V6( voice_t* const ); + void voice_V7( voice_t* const ); + void voice_V8( voice_t* const ); + void voice_V9( voice_t* const ); + void voice_V7_V4_V1( voice_t* const ); + void voice_V8_V5_V2( voice_t* const ); + void voice_V9_V6_V3( voice_t* const ); + + void echo_read( int ch ); + int echo_output( int ch ); + void echo_write( int ch ); + void echo_22(); + void echo_23(); + void echo_24(); + void echo_25(); + void echo_26(); + void echo_27(); + void echo_28(); + void echo_29(); + void echo_30(); + + void soft_reset_common(); +}; + +#include <assert.h> + +inline int SPC_DSP::sample_count() const { return m.out - m.out_begin; } + +inline int SPC_DSP::read( int addr ) const +{ + assert( (unsigned) addr < register_count ); + return m.regs [addr]; +} + +inline void SPC_DSP::write( int addr, int data ) +{ + assert( (unsigned) addr < register_count ); + + m.regs [addr] = (uint8_t) data; + switch ( addr & 0x0F ) + { + case v_envx: + m.envx_buf = (uint8_t) data; + break; + + case v_outx: + m.outx_buf = (uint8_t) data; + break; + + case 0x0C: + if ( addr == r_kon ) + m.new_kon = (uint8_t) data; + + if ( addr == r_endx ) // always cleared, regardless of data written + { + m.endx_buf = 0; + m.regs [r_endx] = 0; + } + break; + } +} + +inline void SPC_DSP::mute_voices( int mask ) { m.mute_mask = mask; } + +inline bool SPC_DSP::check_kon() +{ + bool old = m.kon_check; + m.kon_check = 0; + return old; +} + +#if !SPC_NO_COPY_STATE_FUNCS + +class SPC_State_Copier { + SPC_DSP::copy_func_t func; + unsigned char** buf; +public: + SPC_State_Copier( unsigned char** p, SPC_DSP::copy_func_t f ) { func = f; buf = p; } + void copy( void* state, size_t size ); + int copy_int( int state, int size ); + void skip( int count ); + void extra(); +}; + +#define SPC_COPY( type, state )\ +{\ + state = (BOOST::type) copier.copy_int( state, sizeof (BOOST::type) );\ + assert( (BOOST::type) state == state );\ +} + +#endif + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/apu/SPC_Filter.cpp b/plugins/snes9x_gx/source/snes9x/apu/SPC_Filter.cpp new file mode 100644 index 00000000..b3d57708 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/apu/SPC_Filter.cpp @@ -0,0 +1,68 @@ +// snes_spc 0.9.0. http://www.slack.net/~ant/ + +#include "SPC_Filter.h" + +#include <string.h> + +/* Copyright (C) 2007 Shay Green. This module is free software; you +can redistribute it and/or modify it under the terms of the GNU Lesser +General Public License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. This +module is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. You should have received a copy of the GNU Lesser General Public +License along with this module; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include "blargg_source.h" + +void SPC_Filter::clear() { memset( ch, 0, sizeof ch ); } + +SPC_Filter::SPC_Filter() +{ + gain = gain_unit; + bass = bass_norm; + clear(); +} + +void SPC_Filter::run( short* io, int count ) +{ + require( (count & 1) == 0 ); // must be even + + int const gain = this->gain; + int const bass = this->bass; + chan_t* c = &ch [2]; + do + { + // cache in registers + int sum = (--c)->sum; + int pp1 = c->pp1; + int p1 = c->p1; + + for ( int i = 0; i < count; i += 2 ) + { + // Low-pass filter (two point FIR with coeffs 0.25, 0.75) + int f = io [i] + p1; + p1 = io [i] * 3; + + // High-pass filter ("leaky integrator") + int delta = f - pp1; + pp1 = f; + int s = sum >> (gain_bits + 2); + sum += (delta * gain) - (sum >> bass); + + // Clamp to 16 bits + if ( (short) s != s ) + s = (s >> 31) ^ 0x7FFF; + + io [i] = (short) s; + } + + c->p1 = p1; + c->pp1 = pp1; + c->sum = sum; + ++io; + } + while ( c != ch ); +} diff --git a/plugins/snes9x_gx/source/snes9x/apu/SPC_Filter.h b/plugins/snes9x_gx/source/snes9x/apu/SPC_Filter.h new file mode 100644 index 00000000..d5c83cb8 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/apu/SPC_Filter.h @@ -0,0 +1,47 @@ +// Simple low-pass and high-pass filter to better match sound output of a SNES + +// snes_spc 0.9.0 +#ifndef SPC_FILTER_H +#define SPC_FILTER_H + +#include "blargg_common.h" + +struct SPC_Filter { +public: + + // Filters count samples of stereo sound in place. Count must be a multiple of 2. + typedef short sample_t; + void run( sample_t* io, int count ); + +// Optional features + + // Clears filter to silence + void clear(); + + // Sets gain (volume), where gain_unit is normal. Gains greater than gain_unit + // are fine, since output is clamped to 16-bit sample range. + enum { gain_unit = 0x100 }; + void set_gain( int gain ); + + // Sets amount of bass (logarithmic scale) + enum { bass_none = 0 }; + enum { bass_norm = 8 }; // normal amount + enum { bass_max = 31 }; + void set_bass( int bass ); + +public: + SPC_Filter(); + BLARGG_DISABLE_NOTHROW +private: + enum { gain_bits = 8 }; + int gain; + int bass; + struct chan_t { int p1, pp1, sum; }; + chan_t ch [2]; +}; + +inline void SPC_Filter::set_gain( int g ) { gain = g; } + +inline void SPC_Filter::set_bass( int b ) { bass = b; } + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/apu/apu.cpp b/plugins/snes9x_gx/source/snes9x/apu/apu.cpp new file mode 100644 index 00000000..f0fd8f93 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/apu/apu.cpp @@ -0,0 +1,661 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + + (c) Copyright 2002 - 2011 zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2011 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2011 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2011 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2011 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#include <math.h> +#include "snes9x.h" +#include "apu.h" +#include "snapshot.h" +#include "display.h" +#include "linear_resampler.h" +#include "hermite_resampler.h" + +#define APU_DEFAULT_INPUT_RATE 32000 +#define APU_MINIMUM_SAMPLE_COUNT 512 +#define APU_MINIMUM_SAMPLE_BLOCK 128 +#define APU_NUMERATOR_NTSC 15664 +#define APU_DENOMINATOR_NTSC 328125 +#define APU_NUMERATOR_PAL 34176 +#define APU_DENOMINATOR_PAL 709379 +#define APU_DEFAULT_RESAMPLER HermiteResampler + +SNES_SPC *spc_core = NULL; + +static uint8 APUROM[64] = +{ + 0xCD, 0xEF, 0xBD, 0xE8, 0x00, 0xC6, 0x1D, 0xD0, + 0xFC, 0x8F, 0xAA, 0xF4, 0x8F, 0xBB, 0xF5, 0x78, + 0xCC, 0xF4, 0xD0, 0xFB, 0x2F, 0x19, 0xEB, 0xF4, + 0xD0, 0xFC, 0x7E, 0xF4, 0xD0, 0x0B, 0xE4, 0xF5, + 0xCB, 0xF4, 0xD7, 0x00, 0xFC, 0xD0, 0xF3, 0xAB, + 0x01, 0x10, 0xEF, 0x7E, 0xF4, 0x10, 0xEB, 0xBA, + 0xF6, 0xDA, 0x00, 0xBA, 0xF4, 0xC4, 0xF4, 0xDD, + 0x5D, 0xD0, 0xDB, 0x1F, 0x00, 0x00, 0xC0, 0xFF +}; + +namespace spc +{ + static apu_callback sa_callback = NULL; + static void *extra_data = NULL; + + static bool8 sound_in_sync = TRUE; + static bool8 sound_enabled = FALSE; + + static int buffer_size; + static int lag_master = 0; + static int lag = 0; + + static uint8 *landing_buffer = NULL; + static uint8 *shrink_buffer = NULL; + + static Resampler *resampler = NULL; + + static int32 reference_time; + static uint32 remainder; + + static const int timing_hack_numerator = SNES_SPC::tempo_unit; + static int timing_hack_denominator = SNES_SPC::tempo_unit; + /* Set these to NTSC for now. Will change to PAL in S9xAPUTimingSetSpeedup + if necessary on game load. */ + static uint32 ratio_numerator = APU_NUMERATOR_NTSC; + static uint32 ratio_denominator = APU_DENOMINATOR_NTSC; +} + +static void EightBitize (uint8 *, int); +static void DeStereo (uint8 *, int); +static void ReverseStereo (uint8 *, int); +void UpdatePlaybackRate (void); +static void from_apu_to_state (uint8 **, void *, size_t); +static void to_apu_from_state (uint8 **, void *, size_t); +static void SPCSnapshotCallback (void); +static inline int S9xAPUGetClock (int32); +static inline int S9xAPUGetClockRemainder (int32); + + +static void EightBitize (uint8 *buffer, int sample_count) +{ + uint8 *buf8 = (uint8 *) buffer; + int16 *buf16 = (int16 *) buffer; + + for (int i = 0; i < sample_count; i++) + buf8[i] = (uint8) ((buf16[i] / 256) + 128); +} + +static void DeStereo (uint8 *buffer, int sample_count) +{ + int16 *buf = (int16 *) buffer; + int32 s1, s2; + + for (int i = 0; i < sample_count >> 1; i++) + { + s1 = (int32) buf[2 * i]; + s2 = (int32) buf[2 * i + 1]; + buf[i] = (int16) ((s1 + s2) >> 1); + } +} + +static void ReverseStereo (uint8 *src_buffer, int sample_count) +{ + int16 *buffer = (int16 *) src_buffer; + + for (int i = 0; i < sample_count; i += 2) + { + buffer[i + 1] ^= buffer[i]; + buffer[i] ^= buffer[i + 1]; + buffer[i + 1] ^= buffer[i]; + } +} + +bool8 S9xMixSamples (uint8 *buffer, int sample_count) +{ + static int shrink_buffer_size = -1; + uint8 *dest; + + if (!Settings.SixteenBitSound || !Settings.Stereo) + { + /* We still need both stereo samples for generating the mono sample */ + if (!Settings.Stereo) + sample_count <<= 1; + + /* We still have to generate 16-bit samples for bit-dropping, too */ + if (shrink_buffer_size < (sample_count << 1)) + { + delete[] spc::shrink_buffer; + spc::shrink_buffer = new uint8[sample_count << 1]; + shrink_buffer_size = sample_count << 1; + } + + dest = spc::shrink_buffer; + } + else + dest = buffer; + + if (Settings.Mute) + { + memset(dest, 0, sample_count << 1); + spc::resampler->clear(); + + return (FALSE); + } + else + { + if (spc::resampler->avail() >= (sample_count + spc::lag)) + { + spc::resampler->read((short *) dest, sample_count); + if (spc::lag == spc::lag_master) + spc::lag = 0; + } + else + { + memset(buffer, (Settings.SixteenBitSound ? 0 : 128), (sample_count << (Settings.SixteenBitSound ? 1 : 0)) >> (Settings.Stereo ? 0 : 1)); + if (spc::lag == 0) + spc::lag = spc::lag_master; + + return (FALSE); + } + } + + if (Settings.ReverseStereo && Settings.Stereo) + ReverseStereo(dest, sample_count); + + if (!Settings.Stereo || !Settings.SixteenBitSound) + { + if (!Settings.Stereo) + { + DeStereo(dest, sample_count); + sample_count >>= 1; + } + + if (!Settings.SixteenBitSound) + EightBitize(dest, sample_count); + + memcpy(buffer, dest, (sample_count << (Settings.SixteenBitSound ? 1 : 0))); + } + + return (TRUE); +} + +int S9xGetSampleCount (void) +{ + return (spc::resampler->avail() >> (Settings.Stereo ? 0 : 1)); +} + +void S9xFinalizeSamples (void) +{ + if (!Settings.Mute) + { + if (!spc::resampler->push((short *) spc::landing_buffer, spc_core->sample_count())) + { + /* We weren't able to process the entire buffer. Potential overrun. */ + spc::sound_in_sync = FALSE; + + if (Settings.SoundSync && !Settings.TurboMode) + return; + } + } + + if (!Settings.SoundSync || Settings.TurboMode || Settings.Mute) + spc::sound_in_sync = TRUE; + else + if (spc::resampler->space_empty() >= spc::resampler->space_filled()) + spc::sound_in_sync = TRUE; + else + spc::sound_in_sync = FALSE; + + spc_core->set_output((SNES_SPC::sample_t *) spc::landing_buffer, spc::buffer_size >> 1); +} + +void S9xLandSamples (void) +{ + if (spc::sa_callback != NULL) + spc::sa_callback(spc::extra_data); + else + S9xFinalizeSamples(); +} + +void S9xClearSamples (void) +{ + spc::resampler->clear(); + spc::lag = spc::lag_master; +} + +bool8 S9xSyncSound (void) +{ + if (!Settings.SoundSync || spc::sound_in_sync) + return (TRUE); + + S9xLandSamples(); + + return (spc::sound_in_sync); +} + +void S9xSetSamplesAvailableCallback (apu_callback callback, void *data) +{ + spc::sa_callback = callback; + spc::extra_data = data; +} + +void UpdatePlaybackRate (void) +{ + if (Settings.SoundInputRate == 0) + Settings.SoundInputRate = APU_DEFAULT_INPUT_RATE; + + double time_ratio = (double) Settings.SoundInputRate * spc::timing_hack_numerator / (Settings.SoundPlaybackRate * spc::timing_hack_denominator); + spc::resampler->time_ratio(time_ratio); +} + +bool8 S9xInitSound (int buffer_ms, int lag_ms) +{ + // buffer_ms : buffer size given in millisecond + // lag_ms : allowable time-lag given in millisecond + + int sample_count = buffer_ms * 32000 / 1000; + int lag_sample_count = lag_ms * 32000 / 1000; + + spc::lag_master = lag_sample_count; + if (Settings.Stereo) + spc::lag_master <<= 1; + spc::lag = spc::lag_master; + + if (sample_count < APU_MINIMUM_SAMPLE_COUNT) + sample_count = APU_MINIMUM_SAMPLE_COUNT; + + spc::buffer_size = sample_count; + if (Settings.Stereo) + spc::buffer_size <<= 1; + if (Settings.SixteenBitSound) + spc::buffer_size <<= 1; + + printf("Sound buffer size: %d (%d samples)\n", spc::buffer_size, sample_count); + + if (spc::landing_buffer) + delete[] spc::landing_buffer; + spc::landing_buffer = new uint8[spc::buffer_size * 2]; + if (!spc::landing_buffer) + return (FALSE); + + /* The resampler and spc unit use samples (16-bit short) as + arguments. Use 2x in the resampler for buffer leveling with SoundSync */ + if (!spc::resampler) + { + spc::resampler = new APU_DEFAULT_RESAMPLER(spc::buffer_size >> (Settings.SoundSync ? 0 : 1)); + if (!spc::resampler) + { + delete[] spc::landing_buffer; + return (FALSE); + } + } + else + spc::resampler->resize(spc::buffer_size >> (Settings.SoundSync ? 0 : 1)); + + spc_core->set_output((SNES_SPC::sample_t *) spc::landing_buffer, spc::buffer_size >> 1); + + UpdatePlaybackRate(); + + spc::sound_enabled = S9xOpenSoundDevice(); + + return (spc::sound_enabled); +} + +void S9xSetSoundControl (uint8 voice_switch) +{ + spc_core->dsp_set_stereo_switch(voice_switch << 8 | voice_switch); +} + +void S9xSetSoundMute (bool8 mute) +{ + Settings.Mute = mute; + if (!spc::sound_enabled) + Settings.Mute = TRUE; +} + +void S9xDumpSPCSnapshot (void) +{ + spc_core->dsp_dump_spc_snapshot(); +} + +static void SPCSnapshotCallback (void) +{ + S9xSPCDump(S9xGetFilenameInc((".spc"), SPC_DIR)); + printf("Dumped key-on triggered spc snapshot.\n"); +} + +bool8 S9xInitAPU (void) +{ + spc_core = new SNES_SPC; + if (!spc_core) + return (FALSE); + + spc_core->init(); + spc_core->init_rom(APUROM); + + spc_core->dsp_set_spc_snapshot_callback(SPCSnapshotCallback); + + spc::landing_buffer = NULL; + spc::shrink_buffer = NULL; + spc::resampler = NULL; + + return (TRUE); +} + +void S9xDeinitAPU (void) +{ + if (spc_core) + { + delete spc_core; + spc_core = NULL; + } + + if (spc::resampler) + { + delete spc::resampler; + spc::resampler = NULL; + } + + if (spc::landing_buffer) + { + delete[] spc::landing_buffer; + spc::landing_buffer = NULL; + } + + if (spc::shrink_buffer) + { + delete[] spc::shrink_buffer; + spc::shrink_buffer = NULL; + } +} + +static inline int S9xAPUGetClock (int32 cpucycles) +{ + return (spc::ratio_numerator * (cpucycles - spc::reference_time) + spc::remainder) / + spc::ratio_denominator; +} + +static inline int S9xAPUGetClockRemainder (int32 cpucycles) +{ + return (spc::ratio_numerator * (cpucycles - spc::reference_time) + spc::remainder) % + spc::ratio_denominator; +} + +uint8 S9xAPUReadPort (int port) +{ + return ((uint8) spc_core->read_port(S9xAPUGetClock(CPU.Cycles), port)); +} + +void S9xAPUWritePort (int port, uint8 byte) +{ + spc_core->write_port(S9xAPUGetClock(CPU.Cycles), port, byte); +} + +void S9xAPUSetReferenceTime (int32 cpucycles) +{ + spc::reference_time = cpucycles; +} + +void S9xAPUExecute (void) +{ + /* Accumulate partial APU cycles */ + spc_core->end_frame(S9xAPUGetClock(CPU.Cycles)); + + spc::remainder = S9xAPUGetClockRemainder(CPU.Cycles); + + S9xAPUSetReferenceTime(CPU.Cycles); +} + +void S9xAPUEndScanline (void) +{ + S9xAPUExecute(); + + if (spc_core->sample_count() >= APU_MINIMUM_SAMPLE_BLOCK || !spc::sound_in_sync) + S9xLandSamples(); +} + +void S9xAPUTimingSetSpeedup (int ticks) +{ + if (ticks != 0) + printf("APU speedup hack: %d\n", ticks); + + spc::timing_hack_denominator = SNES_SPC::tempo_unit - ticks; + spc_core->set_tempo(spc::timing_hack_denominator); + + spc::ratio_numerator = Settings.PAL ? APU_NUMERATOR_PAL : APU_NUMERATOR_NTSC; + spc::ratio_denominator = Settings.PAL ? APU_DENOMINATOR_PAL : APU_DENOMINATOR_NTSC; + spc::ratio_denominator = spc::ratio_denominator * spc::timing_hack_denominator / spc::timing_hack_numerator; + + UpdatePlaybackRate(); +} + +void S9xAPUAllowTimeOverflow (bool allow) +{ + spc_core->spc_allow_time_overflow(allow); +} + +void S9xResetAPU (void) +{ + spc::reference_time = 0; + spc::remainder = 0; + spc_core->reset(); + spc_core->set_output((SNES_SPC::sample_t *) spc::landing_buffer, spc::buffer_size >> 1); + + spc::resampler->clear(); +} + +void S9xSoftResetAPU (void) +{ + spc::reference_time = 0; + spc::remainder = 0; + spc_core->soft_reset(); + spc_core->set_output((SNES_SPC::sample_t *) spc::landing_buffer, spc::buffer_size >> 1); + + spc::resampler->clear(); +} + +static void from_apu_to_state (uint8 **buf, void *var, size_t size) +{ + memcpy(*buf, var, size); + *buf += size; +} + +static void to_apu_from_state (uint8 **buf, void *var, size_t size) +{ + memcpy(var, *buf, size); + *buf += size; +} + +void S9xAPUSaveState (uint8 *block) +{ + uint8 *ptr = block; + + spc_core->copy_state(&ptr, from_apu_to_state); + + SET_LE32(ptr, spc::reference_time); + ptr += sizeof(int32); + SET_LE32(ptr, spc::remainder); +} + +void S9xAPULoadState (uint8 *block) +{ + uint8 *ptr = block; + + S9xResetAPU(); + + spc_core->copy_state(&ptr, to_apu_from_state); + + spc::reference_time = GET_LE32(ptr); + ptr += sizeof(int32); + spc::remainder = GET_LE32(ptr); +} diff --git a/plugins/snes9x_gx/source/snes9x/apu/apu.h b/plugins/snes9x_gx/source/snes9x/apu/apu.h new file mode 100644 index 00000000..358469da --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/apu/apu.h @@ -0,0 +1,219 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + + (c) Copyright 2002 - 2011 zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2011 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2011 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2011 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2011 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _APU_H_ +#define _APU_H_ + +#include "snes9x.h" +#include "SNES_SPC.h" + +typedef void (*apu_callback) (void *); + +#define SPC_SAVE_STATE_BLOCK_SIZE (SNES_SPC::state_size + 8) + +bool8 S9xInitAPU (void); +void S9xDeinitAPU (void); +void S9xResetAPU (void); +void S9xSoftResetAPU (void); +uint8 S9xAPUReadPort (int); +void S9xAPUWritePort (int, uint8); +void S9xAPUExecute (void); +void S9xAPUEndScanline (void); +void S9xAPUSetReferenceTime (int32); +void S9xAPUTimingSetSpeedup (int); +void S9xAPUAllowTimeOverflow (bool); +void S9xAPULoadState (uint8 *); +void S9xAPUSaveState (uint8 *); +void S9xDumpSPCSnapshot (void); + +bool8 S9xInitSound (int, int); +bool8 S9xOpenSoundDevice (void); + +bool8 S9xSyncSound (void); +int S9xGetSampleCount (void); +void S9xSetSoundControl (uint8); +void S9xSetSoundMute (bool8); +void S9xLandSamples (void); +void S9xFinalizeSamples (void); +void S9xClearSamples (void); +bool8 S9xMixSamples (uint8 *, int); +void S9xSetSamplesAvailableCallback (apu_callback, void *); + +extern SNES_SPC *spc_core; + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/apu/blargg_common.h b/plugins/snes9x_gx/source/snes9x/apu/blargg_common.h new file mode 100644 index 00000000..75edff39 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/apu/blargg_common.h @@ -0,0 +1,186 @@ +// Sets up common environment for Shay Green's libraries. +// To change configuration options, modify blargg_config.h, not this file. + +// snes_spc 0.9.0 +#ifndef BLARGG_COMMON_H +#define BLARGG_COMMON_H + +#include <stddef.h> +#include <stdlib.h> +#include <assert.h> +#include <limits.h> + +#undef BLARGG_COMMON_H +// allow blargg_config.h to #include blargg_common.h +#include "blargg_config.h" +#ifndef BLARGG_COMMON_H +#define BLARGG_COMMON_H + +// BLARGG_RESTRICT: equivalent to restrict, where supported +#if defined (__GNUC__) || _MSC_VER >= 1100 + #define BLARGG_RESTRICT __restrict +#else + #define BLARGG_RESTRICT +#endif + +// STATIC_CAST(T,expr): Used in place of static_cast<T> (expr) +#ifndef STATIC_CAST + #define STATIC_CAST(T,expr) ((T) (expr)) +#endif + +// blargg_err_t (0 on success, otherwise error string) +#ifndef blargg_err_t + typedef const char* blargg_err_t; +#endif + +// blargg_vector - very lightweight vector of POD types (no constructor/destructor) +template<class T> +class blargg_vector { + T* begin_; + size_t size_; +public: + blargg_vector() : begin_( 0 ), size_( 0 ) { } + ~blargg_vector() { free( begin_ ); } + size_t size() const { return size_; } + T* begin() const { return begin_; } + T* end() const { return begin_ + size_; } + blargg_err_t resize( size_t n ) + { + // TODO: blargg_common.cpp to hold this as an outline function, ugh + void* p = realloc( begin_, n * sizeof (T) ); + if ( p ) + begin_ = (T*) p; + else if ( n > size_ ) // realloc failure only a problem if expanding + return "Out of memory"; + size_ = n; + return 0; + } + void clear() { void* p = begin_; begin_ = 0; size_ = 0; free( p ); } + T& operator [] ( size_t n ) const + { + assert( n <= size_ ); // <= to allow past-the-end value + return begin_ [n]; + } +}; + +#ifndef BLARGG_DISABLE_NOTHROW + // throw spec mandatory in ISO C++ if operator new can return NULL + #if __cplusplus >= 199711 || defined (__GNUC__) + #define BLARGG_THROWS( spec ) throw spec + #else + #define BLARGG_THROWS( spec ) + #endif + #define BLARGG_DISABLE_NOTHROW \ + void* operator new ( size_t s ) BLARGG_THROWS(()) { return malloc( s ); }\ + void operator delete ( void* p ) { free( p ); } + #define BLARGG_NEW new +#else + #include <new> + #define BLARGG_NEW new (std::nothrow) +#endif + +// BLARGG_4CHAR('a','b','c','d') = 'abcd' (four character integer constant) +#define BLARGG_4CHAR( a, b, c, d ) \ + ((a&0xFF)*0x1000000L + (b&0xFF)*0x10000L + (c&0xFF)*0x100L + (d&0xFF)) + +// BOOST_STATIC_ASSERT( expr ): Generates compile error if expr is 0. +#ifndef BOOST_STATIC_ASSERT + #ifdef _MSC_VER + // MSVC6 (_MSC_VER < 1300) fails for use of __LINE__ when /Zl is specified + #define BOOST_STATIC_ASSERT( expr ) \ + void blargg_failed_( int (*arg) [2 / (int) !!(expr) - 1] ) + #else + // Some other compilers fail when declaring same function multiple times in class, + // so differentiate them by line + #define BOOST_STATIC_ASSERT( expr ) \ + void blargg_failed_( int (*arg) [2 / !!(expr) - 1] [__LINE__] ) + #endif +#endif + +// BLARGG_COMPILER_HAS_BOOL: If 0, provides bool support for old compiler. If 1, +// compiler is assumed to support bool. If undefined, availability is determined. +#ifndef BLARGG_COMPILER_HAS_BOOL + #if defined (__MWERKS__) + #if !__option(bool) + #define BLARGG_COMPILER_HAS_BOOL 0 + #endif + #elif defined (_MSC_VER) + #if _MSC_VER < 1100 + #define BLARGG_COMPILER_HAS_BOOL 0 + #endif + #elif defined (__GNUC__) + // supports bool + #elif __cplusplus < 199711 + #define BLARGG_COMPILER_HAS_BOOL 0 + #endif +#endif +#if defined (BLARGG_COMPILER_HAS_BOOL) && !BLARGG_COMPILER_HAS_BOOL + // If you get errors here, modify your blargg_config.h file + typedef int bool; + const bool true = 1; + const bool false = 0; +#endif + +// blargg_long/blargg_ulong = at least 32 bits, int if it's big enough + +#if INT_MAX < 0x7FFFFFFF || LONG_MAX == 0x7FFFFFFF + typedef long blargg_long; +#else + typedef int blargg_long; +#endif + +#if UINT_MAX < 0xFFFFFFFF || ULONG_MAX == 0xFFFFFFFF + typedef unsigned long blargg_ulong; +#else + typedef unsigned blargg_ulong; +#endif + +// BOOST::int8_t etc. + +// HAVE_STDINT_H: If defined, use <stdint.h> for int8_t etc. +#if defined (HAVE_STDINT_H) + #include <stdint.h> + #define BOOST + +// HAVE_INTTYPES_H: If defined, use <stdint.h> for int8_t etc. +#elif defined (HAVE_INTTYPES_H) + #include <inttypes.h> + #define BOOST + +#else + struct BOOST + { + #if UCHAR_MAX == 0xFF && SCHAR_MAX == 0x7F + typedef signed char int8_t; + typedef unsigned char uint8_t; + #else + // No suitable 8-bit type available + typedef struct see_blargg_common_h int8_t; + typedef struct see_blargg_common_h uint8_t; + #endif + + #if USHRT_MAX == 0xFFFF + typedef short int16_t; + typedef unsigned short uint16_t; + #else + // No suitable 16-bit type available + typedef struct see_blargg_common_h int16_t; + typedef struct see_blargg_common_h uint16_t; + #endif + + #if ULONG_MAX == 0xFFFFFFFF + typedef long int32_t; + typedef unsigned long uint32_t; + #elif UINT_MAX == 0xFFFFFFFF + typedef int int32_t; + typedef unsigned int uint32_t; + #else + // No suitable 32-bit type available + typedef struct see_blargg_common_h int32_t; + typedef struct see_blargg_common_h uint32_t; + #endif + }; +#endif + +#endif +#endif diff --git a/plugins/snes9x_gx/source/snes9x/apu/blargg_config.h b/plugins/snes9x_gx/source/snes9x/apu/blargg_config.h new file mode 100644 index 00000000..9dc69db8 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/apu/blargg_config.h @@ -0,0 +1,24 @@ +// snes_spc 0.9.0 user configuration file. Don't replace when updating library. + +// snes_spc 0.9.0 +#ifndef BLARGG_CONFIG_H +#define BLARGG_CONFIG_H + +// Uncomment to disable debugging checks +//#define NDEBUG 1 + +// Uncomment to enable platform-specific (and possibly non-portable) optimizations +//#define BLARGG_NONPORTABLE 1 + +// Uncomment if automatic byte-order determination doesn't work +//#define BLARGG_BIG_ENDIAN 1 + +// Uncomment if you get errors in the bool section of blargg_common.h +//#define BLARGG_COMPILER_HAS_BOOL 1 + +// Use standard config.h if present +#ifdef HAVE_CONFIG_H + #include "config.h" +#endif + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/apu/blargg_endian.h b/plugins/snes9x_gx/source/snes9x/apu/blargg_endian.h new file mode 100644 index 00000000..f2daca64 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/apu/blargg_endian.h @@ -0,0 +1,185 @@ +// CPU Byte Order Utilities + +// snes_spc 0.9.0 +#ifndef BLARGG_ENDIAN +#define BLARGG_ENDIAN + +#include "blargg_common.h" + +// BLARGG_CPU_CISC: Defined if CPU has very few general-purpose registers (< 16) +#if defined (_M_IX86) || defined (_M_IA64) || defined (__i486__) || \ + defined (__x86_64__) || defined (__ia64__) || defined (__i386__) + #define BLARGG_CPU_X86 1 + #define BLARGG_CPU_CISC 1 +#endif + +#if defined (__powerpc__) || defined (__ppc__) || defined (__POWERPC__) || defined (__powerc) + #define BLARGG_CPU_POWERPC 1 + #define BLARGG_CPU_RISC 1 +#endif + +// BLARGG_BIG_ENDIAN, BLARGG_LITTLE_ENDIAN: Determined automatically, otherwise only +// one may be #defined to 1. Only needed if something actually depends on byte order. +#if !defined (BLARGG_BIG_ENDIAN) && !defined (BLARGG_LITTLE_ENDIAN) +#ifdef __GLIBC__ + // GCC handles this for us + #include <endian.h> + #if __BYTE_ORDER == __LITTLE_ENDIAN + #define BLARGG_LITTLE_ENDIAN 1 + #elif __BYTE_ORDER == __BIG_ENDIAN + #define BLARGG_BIG_ENDIAN 1 + #endif +#else + +#if defined (LSB_FIRST) || defined (__LITTLE_ENDIAN__) || BLARGG_CPU_X86 || \ + (defined (LITTLE_ENDIAN) && LITTLE_ENDIAN+0 != 1234) + #define BLARGG_LITTLE_ENDIAN 1 +#endif + +#if defined (MSB_FIRST) || defined (__BIG_ENDIAN__) || defined (WORDS_BIGENDIAN) || \ + defined (__sparc__) || BLARGG_CPU_POWERPC || \ + (defined (BIG_ENDIAN) && BIG_ENDIAN+0 != 4321) + #define BLARGG_BIG_ENDIAN 1 +#elif !defined (__mips__) + // No endian specified; assume little-endian, since it's most common + #define BLARGG_LITTLE_ENDIAN 1 +#endif +#endif +#endif + +#if BLARGG_LITTLE_ENDIAN && BLARGG_BIG_ENDIAN + #undef BLARGG_LITTLE_ENDIAN + #undef BLARGG_BIG_ENDIAN +#endif + +inline void blargg_verify_byte_order() +{ + #ifndef NDEBUG + #if BLARGG_BIG_ENDIAN + volatile int i = 1; + assert( *(volatile char*) &i == 0 ); + #elif BLARGG_LITTLE_ENDIAN + volatile int i = 1; + assert( *(volatile char*) &i != 0 ); + #endif + #endif +} + +inline unsigned get_le16( void const* p ) +{ + return (unsigned) ((unsigned char const*) p) [1] << 8 | + (unsigned) ((unsigned char const*) p) [0]; +} + +inline unsigned get_be16( void const* p ) +{ + return (unsigned) ((unsigned char const*) p) [0] << 8 | + (unsigned) ((unsigned char const*) p) [1]; +} + +inline blargg_ulong get_le32( void const* p ) +{ + return (blargg_ulong) ((unsigned char const*) p) [3] << 24 | + (blargg_ulong) ((unsigned char const*) p) [2] << 16 | + (blargg_ulong) ((unsigned char const*) p) [1] << 8 | + (blargg_ulong) ((unsigned char const*) p) [0]; +} + +inline blargg_ulong get_be32( void const* p ) +{ + return (blargg_ulong) ((unsigned char const*) p) [0] << 24 | + (blargg_ulong) ((unsigned char const*) p) [1] << 16 | + (blargg_ulong) ((unsigned char const*) p) [2] << 8 | + (blargg_ulong) ((unsigned char const*) p) [3]; +} + +inline void set_le16( void* p, unsigned n ) +{ + ((unsigned char*) p) [1] = (unsigned char) (n >> 8); + ((unsigned char*) p) [0] = (unsigned char) n; +} + +inline void set_be16( void* p, unsigned n ) +{ + ((unsigned char*) p) [0] = (unsigned char) (n >> 8); + ((unsigned char*) p) [1] = (unsigned char) n; +} + +inline void set_le32( void* p, blargg_ulong n ) +{ + ((unsigned char*) p) [0] = (unsigned char) n; + ((unsigned char*) p) [1] = (unsigned char) (n >> 8); + ((unsigned char*) p) [2] = (unsigned char) (n >> 16); + ((unsigned char*) p) [3] = (unsigned char) (n >> 24); +} + +inline void set_be32( void* p, blargg_ulong n ) +{ + ((unsigned char*) p) [3] = (unsigned char) n; + ((unsigned char*) p) [2] = (unsigned char) (n >> 8); + ((unsigned char*) p) [1] = (unsigned char) (n >> 16); + ((unsigned char*) p) [0] = (unsigned char) (n >> 24); +} + +#if BLARGG_NONPORTABLE + // Optimized implementation if byte order is known + #if BLARGG_LITTLE_ENDIAN + #define GET_LE16( addr ) (*(BOOST::uint16_t*) (addr)) + #define GET_LE32( addr ) (*(BOOST::uint32_t*) (addr)) + #define SET_LE16( addr, data ) (void) (*(BOOST::uint16_t*) (addr) = (data)) + #define SET_LE32( addr, data ) (void) (*(BOOST::uint32_t*) (addr) = (data)) + #elif BLARGG_BIG_ENDIAN + #define GET_BE16( addr ) (*(BOOST::uint16_t*) (addr)) + #define GET_BE32( addr ) (*(BOOST::uint32_t*) (addr)) + #define SET_BE16( addr, data ) (void) (*(BOOST::uint16_t*) (addr) = (data)) + #define SET_BE32( addr, data ) (void) (*(BOOST::uint32_t*) (addr) = (data)) + + #if BLARGG_CPU_POWERPC + // PowerPC has special byte-reversed instructions + #if defined (__MWERKS__) + #define GET_LE16( addr ) (__lhbrx( addr, 0 )) + #define GET_LE32( addr ) (__lwbrx( addr, 0 )) + #define SET_LE16( addr, in ) (__sthbrx( in, addr, 0 )) + #define SET_LE32( addr, in ) (__stwbrx( in, addr, 0 )) + #elif defined (__GNUC__) + #define GET_LE16( addr ) ({unsigned ppc_lhbrx_; asm( "lhbrx %0,0,%1" : "=r" (ppc_lhbrx_) : "r" (addr), "0" (ppc_lhbrx_) ); ppc_lhbrx_;}) + #define GET_LE32( addr ) ({unsigned ppc_lwbrx_; asm( "lwbrx %0,0,%1" : "=r" (ppc_lwbrx_) : "r" (addr), "0" (ppc_lwbrx_) ); ppc_lwbrx_;}) + #define SET_LE16( addr, in ) ({asm( "sthbrx %0,0,%1" : : "r" (in), "r" (addr) );}) + #define SET_LE32( addr, in ) ({asm( "stwbrx %0,0,%1" : : "r" (in), "r" (addr) );}) + #endif + #endif + #endif +#endif + +#ifndef GET_LE16 + #define GET_LE16( addr ) get_le16( addr ) + #define SET_LE16( addr, data ) set_le16( addr, data ) +#endif + +#ifndef GET_LE32 + #define GET_LE32( addr ) get_le32( addr ) + #define SET_LE32( addr, data ) set_le32( addr, data ) +#endif + +#ifndef GET_BE16 + #define GET_BE16( addr ) get_be16( addr ) + #define SET_BE16( addr, data ) set_be16( addr, data ) +#endif + +#ifndef GET_BE32 + #define GET_BE32( addr ) get_be32( addr ) + #define SET_BE32( addr, data ) set_be32( addr, data ) +#endif + +// auto-selecting versions + +inline void set_le( BOOST::uint16_t* p, unsigned n ) { SET_LE16( p, n ); } +inline void set_le( BOOST::uint32_t* p, blargg_ulong n ) { SET_LE32( p, n ); } +inline void set_be( BOOST::uint16_t* p, unsigned n ) { SET_BE16( p, n ); } +inline void set_be( BOOST::uint32_t* p, blargg_ulong n ) { SET_BE32( p, n ); } +inline unsigned get_le( BOOST::uint16_t* p ) { return GET_LE16( p ); } +inline blargg_ulong get_le( BOOST::uint32_t* p ) { return GET_LE32( p ); } +inline unsigned get_be( BOOST::uint16_t* p ) { return GET_BE16( p ); } +inline blargg_ulong get_be( BOOST::uint32_t* p ) { return GET_BE32( p ); } + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/apu/blargg_source.h b/plugins/snes9x_gx/source/snes9x/apu/blargg_source.h new file mode 100644 index 00000000..5e45c4fb --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/apu/blargg_source.h @@ -0,0 +1,100 @@ +/* Included at the beginning of library source files, after all other #include lines. +Sets up helpful macros and services used in my source code. They don't need +module an annoying module prefix on their names since they are defined after +all other #include lines. */ + +// snes_spc 0.9.0 +#ifndef BLARGG_SOURCE_H +#define BLARGG_SOURCE_H + +// If debugging is enabled, abort program if expr is false. Meant for checking +// internal state and consistency. A failed assertion indicates a bug in the module. +// void assert( bool expr ); +#include <assert.h> + +// If debugging is enabled and expr is false, abort program. Meant for checking +// caller-supplied parameters and operations that are outside the control of the +// module. A failed requirement indicates a bug outside the module. +// void require( bool expr ); +#undef require +#define require( expr ) assert( expr ) + +// Like printf() except output goes to debug log file. Might be defined to do +// nothing (not even evaluate its arguments). +// void dprintf( const char* format, ... ); +static inline void blargg_dprintf_( const char*, ... ) { } +#undef dprintf +#define dprintf (1) ? (void) 0 : blargg_dprintf_ + +// If enabled, evaluate expr and if false, make debug log entry with source file +// and line. Meant for finding situations that should be examined further, but that +// don't indicate a problem. In all cases, execution continues normally. +#undef check +#define check( expr ) ((void) 0) + +// If expr yields error string, return it from current function, otherwise continue. +#undef RETURN_ERR +#define RETURN_ERR( expr ) do { \ + blargg_err_t blargg_return_err_ = (expr); \ + if ( blargg_return_err_ ) return blargg_return_err_; \ + } while ( 0 ) + +// If ptr is 0, return out of memory error string. +#undef CHECK_ALLOC +#define CHECK_ALLOC( ptr ) do { if ( (ptr) == 0 ) return "Out of memory"; } while ( 0 ) + +// Avoid any macros which evaluate their arguments multiple times +#undef min +#undef max + +#define DEF_MIN_MAX( type ) \ + static inline type min( type x, type y ) { if ( x < y ) return x; return y; }\ + static inline type max( type x, type y ) { if ( y < x ) return x; return y; } + +DEF_MIN_MAX( int ) +DEF_MIN_MAX( unsigned ) +DEF_MIN_MAX( long ) +DEF_MIN_MAX( unsigned long ) +DEF_MIN_MAX( float ) +DEF_MIN_MAX( double ) + +#undef DEF_MIN_MAX + +/* +// using const references generates crappy code, and I am currenly only using these +// for built-in types, so they take arguments by value + +// TODO: remove +inline int min( int x, int y ) +template<class T> +inline T min( T x, T y ) +{ + if ( x < y ) + return x; + return y; +} + +template<class T> +inline T max( T x, T y ) +{ + if ( x < y ) + return y; + return x; +} +*/ + +// TODO: good idea? bad idea? +#undef byte +#define byte byte_ +typedef unsigned char byte; + +// deprecated +#define BLARGG_CHECK_ALLOC CHECK_ALLOC +#define BLARGG_RETURN_ERR RETURN_ERR + +// BLARGG_SOURCE_BEGIN: If defined, #included, allowing redefition of dprintf and check +#ifdef BLARGG_SOURCE_BEGIN + #include BLARGG_SOURCE_BEGIN +#endif + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/apu/hermite_resampler.h b/plugins/snes9x_gx/source/snes9x/apu/hermite_resampler.h new file mode 100644 index 00000000..30ee1032 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/apu/hermite_resampler.h @@ -0,0 +1,144 @@ +/* Simple resampler based on bsnes's ruby audio library */ + +#ifndef __HERMITE_RESAMPLER_H +#define __HERMITE_RESAMPLER_H + +#include "resampler.h" + +#undef CLAMP +#undef SHORT_CLAMP +#define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) +#define SHORT_CLAMP(n) ((short) CLAMP((n), -32768, 32767)) + +class HermiteResampler : public Resampler +{ + protected: + + double r_step; + double r_frac; + int r_left[4], r_right[4]; + + double + hermite (double mu1, double a, double b, double c, double d) + { + const double tension = 0.0; //-1 = low, 0 = normal, 1 = high + const double bias = 0.0; //-1 = left, 0 = even, 1 = right + + double mu2, mu3, m0, m1, a0, a1, a2, a3; + + mu2 = mu1 * mu1; + mu3 = mu2 * mu1; + + m0 = (b - a) * (1 + bias) * (1 - tension) / 2; + m0 += (c - b) * (1 - bias) * (1 - tension) / 2; + m1 = (c - b) * (1 + bias) * (1 - tension) / 2; + m1 += (d - c) * (1 - bias) * (1 - tension) / 2; + + a0 = +2 * mu3 - 3 * mu2 + 1; + a1 = mu3 - 2 * mu2 + mu1; + a2 = mu3 - mu2; + a3 = -2 * mu3 + 3 * mu2; + + return (a0 * b) + (a1 * m0) + (a2 * m1) + (a3 * c); + } + + public: + HermiteResampler (int num_samples) : Resampler (num_samples) + { + clear (); + } + + ~HermiteResampler () + { + } + + void + time_ratio (double ratio) + { + r_step = ratio; + clear (); + } + + void + clear (void) + { + ring_buffer::clear (); + r_frac = 1.0; + r_left [0] = r_left [1] = r_left [2] = r_left [3] = 0; + r_right[0] = r_right[1] = r_right[2] = r_right[3] = 0; + } + + void + read (short *data, int num_samples) + { + int i_position = start >> 1; + short *internal_buffer = (short *) buffer; + int o_position = 0; + int consumed = 0; + + while (o_position < num_samples && consumed < buffer_size) + { + int s_left = internal_buffer[i_position]; + int s_right = internal_buffer[i_position + 1]; + int max_samples = buffer_size >> 1; + const double margin_of_error = 1.0e-10; + + if (fabs(r_step - 1.0) < margin_of_error) + { + data[o_position] = (short) s_left; + data[o_position + 1] = (short) s_right; + + o_position += 2; + i_position += 2; + if (i_position >= max_samples) + i_position -= max_samples; + consumed += 2; + + continue; + } + + while (r_frac <= 1.0 && o_position < num_samples) + { + data[o_position] = SHORT_CLAMP (hermite (r_frac, r_left [0], r_left [1], r_left [2], r_left [3])); + data[o_position + 1] = SHORT_CLAMP (hermite (r_frac, r_right[0], r_right[1], r_right[2], r_right[3])); + + o_position += 2; + + r_frac += r_step; + } + + if (r_frac > 1.0) + { + r_left [0] = r_left [1]; + r_left [1] = r_left [2]; + r_left [2] = r_left [3]; + r_left [3] = s_left; + + r_right[0] = r_right[1]; + r_right[1] = r_right[2]; + r_right[2] = r_right[3]; + r_right[3] = s_right; + + r_frac -= 1.0; + + i_position += 2; + if (i_position >= max_samples) + i_position -= max_samples; + consumed += 2; + } + } + + size -= consumed << 1; + start += consumed << 1; + if (start >= buffer_size) + start -= buffer_size; + } + + inline int + avail (void) + { + return (int) floor (((size >> 2) - r_frac) / r_step) * 2; + } +}; + +#endif /* __HERMITE_RESAMPLER_H */ diff --git a/plugins/snes9x_gx/source/snes9x/apu/license.txt b/plugins/snes9x_gx/source/snes9x/apu/license.txt new file mode 100644 index 00000000..5ab7695a --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/apu/license.txt @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + <one line to give the library's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + <signature of Ty Coon>, 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/plugins/snes9x_gx/source/snes9x/apu/linear_resampler.h b/plugins/snes9x_gx/source/snes9x/apu/linear_resampler.h new file mode 100644 index 00000000..35789db1 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/apu/linear_resampler.h @@ -0,0 +1,115 @@ +/* Simple fixed-point linear resampler by BearOso*/ + +#ifndef __LINEAR_RESAMPLER_H +#define __LINEAR_RESAMPLER_H + +#include "resampler.h" +#include "snes9x.h" + +static const int f_prec = 15; +static const uint32 f__one = (1 << f_prec); + +#define lerp(t, a, b) (((((b) - (a)) * (t)) >> f_prec) + (a)) + +class LinearResampler : public Resampler +{ + protected: + uint32 f__r_step; + uint32 f__inv_r_step; + uint32 f__r_frac; + int r_left, r_right; + + public: + LinearResampler (int num_samples) : Resampler (num_samples) + { + f__r_frac = 0; + } + + ~LinearResampler () + { + } + + void + time_ratio (double ratio) + { + if (ratio == 0.0) + ratio = 1.0; + f__r_step = (uint32) (ratio * f__one); + f__inv_r_step = (uint32) (f__one / ratio); + clear (); + } + + void + clear (void) + { + ring_buffer::clear (); + f__r_frac = 0; + r_left = 0; + r_right = 0; + } + + void + read (short *data, int num_samples) + { + int i_position = start >> 1; + short *internal_buffer = (short *) buffer; + int o_position = 0; + int consumed = 0; + int max_samples = (buffer_size >> 1); + + while (o_position < num_samples && consumed < buffer_size) + { + if (f__r_step == f__one) + { + data[o_position] = internal_buffer[i_position]; + data[o_position + 1] = internal_buffer[i_position + 1]; + + o_position += 2; + i_position += 2; + if (i_position >= max_samples) + i_position -= max_samples; + consumed += 2; + + continue; + } + + while (f__r_frac <= f__one && o_position < num_samples) + { + data[o_position] = lerp (f__r_frac, + r_left, + internal_buffer[i_position]); + data[o_position + 1] = lerp (f__r_frac, + r_right, + internal_buffer[i_position + 1]); + + o_position += 2; + + f__r_frac += f__r_step; + } + + if (f__r_frac > f__one) + { + f__r_frac -= f__one; + r_left = internal_buffer[i_position]; + r_right = internal_buffer[i_position + 1]; + i_position += 2; + if (i_position >= max_samples) + i_position -= max_samples; + consumed += 2; + } + } + + size -= consumed << 1; + start += consumed << 1; + if (start >= buffer_size) + start -= buffer_size; + } + + inline int + avail (void) + { + return (((size >> 2) * f__inv_r_step) - ((f__r_frac * f__inv_r_step) >> f_prec)) >> (f_prec - 1); + } +}; + +#endif /* __LINEAR_RESAMPLER_H */ diff --git a/plugins/snes9x_gx/source/snes9x/apu/resampler.h b/plugins/snes9x_gx/source/snes9x/apu/resampler.h new file mode 100644 index 00000000..2e62addb --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/apu/resampler.h @@ -0,0 +1,60 @@ +/* Simple resampler based on bsnes's ruby audio library */ + +#ifndef __RESAMPLER_H +#define __RESAMPLER_H + +#include "ring_buffer.h" + +class Resampler : public ring_buffer +{ + public: + virtual void clear (void) = 0; + virtual void time_ratio (double) = 0; + virtual void read (short *, int) = 0; + virtual int avail (void) = 0; + + Resampler (int num_samples) : ring_buffer (num_samples << 1) + { + } + + ~Resampler () + { + } + + inline bool + push (short *src, int num_samples) + { + if (max_write () < num_samples) + return false; + + !num_samples || ring_buffer::push ((unsigned char *) src, num_samples << 1); + + return true; + } + + inline int + space_empty (void) + { + return buffer_size - size; + } + + inline int + space_filled (void) + { + return size; + } + + inline int + max_write (void) + { + return space_empty () >> 1; + } + + inline void + resize (int num_samples) + { + ring_buffer::resize (num_samples << 1); + } +}; + +#endif /* __RESAMPLER_H */ diff --git a/plugins/snes9x_gx/source/snes9x/apu/ring_buffer.h b/plugins/snes9x_gx/source/snes9x/apu/ring_buffer.h new file mode 100644 index 00000000..b743c471 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/apu/ring_buffer.h @@ -0,0 +1,111 @@ +/* Simple byte-based ring buffer. Licensed under public domain (C) BearOso. */ + +#ifndef __RING_BUFFER_H +#define __RING_BUFFER_H + +#include <string.h> + +#undef MIN +#define MIN(a, b) ((a) < (b) ? (a) : (b)) + +class ring_buffer +{ +protected: + int size; + int buffer_size; + int start; + unsigned char *buffer; + +public: + ring_buffer (int buffer_size) + { + this->buffer_size = buffer_size; + buffer = new unsigned char[this->buffer_size]; + memset (buffer, 0, this->buffer_size); + + size = 0; + start = 0; + } + + ~ring_buffer (void) + { + delete[] buffer; + } + + bool + push (unsigned char *src, int bytes) + { + if (space_empty () < bytes) + return false; + + int end = (start + size) % buffer_size; + int first_write_size = MIN (bytes, buffer_size - end); + + memcpy (buffer + end, src, first_write_size); + + if (bytes > first_write_size) + memcpy (buffer, src + first_write_size, bytes - first_write_size); + + size += bytes; + + return true; + } + + bool + pull (unsigned char *dst, int bytes) + { + if (space_filled () < bytes) + return false; + + memcpy (dst, buffer + start, MIN (bytes, buffer_size - start)); + + if (bytes > (buffer_size - start)) + memcpy (dst + (buffer_size - start), buffer, bytes - (buffer_size - start)); + + start = (start + bytes) % buffer_size; + size -= bytes; + + return true; + } + + inline int + space_empty (void) + { + return buffer_size - size; + } + + inline int + space_filled (void) + { + return size; + } + + void + clear (void) + { + start = 0; + size = 0; + memset (buffer, 0, buffer_size); + } + + void + resize (int size) + { + delete[] buffer; + buffer_size = size; + buffer = new unsigned char[buffer_size]; + memset (buffer, 0, this->buffer_size); + + size = 0; + start = 0; + } + + inline void + cache_silence (void) + { + clear (); + size = buffer_size; + } +}; + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/bsx.cpp b/plugins/snes9x_gx/source/snes9x/bsx.cpp new file mode 100644 index 00000000..abee8a76 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/bsx.cpp @@ -0,0 +1,1206 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + +// Dreamer Nom wrote: +// Large thanks to John Weidman for all his initial research +// Thanks to Seph3 for his modem notes + + +#include "snes9x.h" +#include "memmap.h" +#include "display.h" + +//#define BSX_DEBUG + +#define BIOS_SIZE 0x100000 +#define FLASH_SIZE 0x200000 +#define PSRAM_SIZE 0x80000 + +#define Map Memory.Map +#define BlockIsRAM Memory.BlockIsRAM +#define BlockIsROM Memory.BlockIsROM +#define RAM Memory.RAM +#define SRAM Memory.SRAM +#define PSRAM Memory.BSRAM +#define BIOSROM Memory.BIOSROM +#define MAP_BSX Memory.MAP_BSX +#define MAP_CPU Memory.MAP_CPU +#define MAP_PPU Memory.MAP_PPU +#define MAP_NONE Memory.MAP_NONE + +#define BSXPPUBASE 0x2180 + +struct SBSX_RTC +{ + int hours; + int minutes; + int seconds; + int ticks; +}; + +static struct SBSX_RTC BSX_RTC; + +// flash card vendor information +static const uint8 flashcard[20] = +{ + 0x4D, 0x00, 0x50, 0x00, // vendor id + 0x00, 0x00, // ? + 0x2B, 0x00, // 2MB Flash (1MB = 0x2A) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const uint8 init2192[32] = // FIXME +{ + 00, 00, 00, 00, 00, // unknown + 01, 01, 00, 00, 00, + 00, // seconds (?) + 00, // minutes + 00, // hours + 10, 10, 10, 10, 10, // unknown + 10, 10, 10, 10, 10, // dummy + 00, 00, 00, 00, 00, 00, 00, 00, 00 +}; + +static bool8 FlashMode; +static uint32 FlashSize; +static uint8 *MapROM, *FlashROM; + +static void BSX_Map_SNES (void); +static void BSX_Map_LoROM (void); +static void BSX_Map_HiROM (void); +static void BSX_Map_MMC (void); +static void BSX_Map_FlashIO (void); +static void BSX_Map_SRAM (void); +static void BSX_Map_PSRAM (void); +static void BSX_Map_BIOS (void); +static void BSX_Map_RAM (void); +static void BSX_Map_Dirty (void); +static void BSX_Map (void); +static void BSX_Set_Bypass_FlashIO (uint16, uint8); +static uint8 BSX_Get_Bypass_FlashIO (uint16); +static bool8 BSX_LoadBIOS (void); +static void map_psram_mirror_sub (uint32); +static int is_bsx (unsigned char *); + + +static void BSX_Map_SNES (void) +{ + // These maps will be partially overwritten + + int c; + + // Banks 00->3F and 80->BF + for (c = 0; c < 0x400; c += 16) + { + Map[c + 0] = Map[c + 0x800] = RAM; + Map[c + 1] = Map[c + 0x801] = RAM; + BlockIsRAM[c + 0] = BlockIsRAM[c + 0x800] = TRUE; + BlockIsRAM[c + 1] = BlockIsRAM[c + 0x801] = TRUE; + + Map[c + 2] = Map[c + 0x802] = (uint8 *) MAP_PPU; + Map[c + 3] = Map[c + 0x803] = (uint8 *) MAP_PPU; + Map[c + 4] = Map[c + 0x804] = (uint8 *) MAP_CPU; + Map[c + 5] = Map[c + 0x805] = (uint8 *) MAP_CPU; + Map[c + 6] = Map[c + 0x806] = (uint8 *) MAP_NONE; + Map[c + 7] = Map[c + 0x807] = (uint8 *) MAP_NONE; + } +} + +static void BSX_Map_LoROM (void) +{ + // These maps will be partially overwritten + + int i, c; + + // Banks 00->3F and 80->BF + for (c = 0; c < 0x400; c += 16) + { + for (i = c + 8; i < c + 16; i++) + { + Map[i] = Map[i + 0x800] = &MapROM[(c << 11) % FlashSize] - 0x8000; + BlockIsRAM[i] = BlockIsRAM[i + 0x800] = BSX.write_enable; + BlockIsROM[i] = BlockIsROM[i + 0x800] = !BSX.write_enable; + } + } + + // Banks 40->7F and C0->FF + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 8; i++) + Map[i + 0x400] = Map[i + 0xC00] = &MapROM[(c << 11) % FlashSize]; + + for (i = c + 8; i < c + 16; i++) + Map[i + 0x400] = Map[i + 0xC00] = &MapROM[(c << 11) % FlashSize] - 0x8000; + + for (i = c; i < c + 16; i++) + { + BlockIsRAM[i + 0x400] = BlockIsRAM[i + 0xC00] = BSX.write_enable; + BlockIsROM[i + 0x400] = BlockIsROM[i + 0xC00] = !BSX.write_enable; + } + } +} + +static void BSX_Map_HiROM (void) +{ + // These maps will be partially overwritten + + int i, c; + + // Banks 00->3F and 80->BF + for (c = 0; c < 0x400; c += 16) + { + for (i = c + 8; i < c + 16; i++) + { + Map[i] = Map[i + 0x800] = &MapROM[(c << 12) % FlashSize]; + BlockIsRAM[i] = BlockIsRAM[i + 0x800] = BSX.write_enable; + BlockIsROM[i] = BlockIsROM[i + 0x800] = !BSX.write_enable; + } + } + + // Banks 40->7F and C0->FF + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 16; i++) + { + Map[i + 0x400] = Map[i + 0xC00] = &MapROM[(c << 12) % FlashSize]; + BlockIsRAM[i + 0x400] = BlockIsRAM[i + 0xC00] = BSX.write_enable; + BlockIsROM[i + 0x400] = BlockIsROM[i + 0xC00] = !BSX.write_enable; + } + } +} + +static void BSX_Map_MMC (void) +{ + int c; + + // Banks 01->0E:5000-5FFF + for (c = 0x010; c < 0x0F0; c += 16) + { + Map[c + 5] = (uint8 *) MAP_BSX; + BlockIsRAM[c + 5] = BlockIsROM[c + 5] = FALSE; + } +} + +static void BSX_Map_FlashIO (void) +{ + int c; + + if (BSX.MMC[0x0C] || BSX.MMC[0x0D]) + { + // Bank C0:0000, 2AAA, 5555, FF00-FF1F + for (c = 0; c < 16; c++) + { + Map[c + 0xC00] = (uint8 *) MAP_BSX; + BlockIsRAM[c + 0xC00] = TRUE; + BlockIsROM[c + 0xC00] = FALSE; + } + } +} + +static void BSX_Map_SRAM (void) +{ + int c; + + // Banks 10->17:5000-5FFF + for (c = 0x100; c < 0x180; c += 16) + { + Map[c + 5] = (uint8 *) SRAM + ((c & 0x70) << 8) - 0x5000; + BlockIsRAM[c + 5] = TRUE; + BlockIsROM[c + 5] = FALSE; + } +} + +static void map_psram_mirror_sub (uint32 bank) +{ + int i, c; + + bank <<= 4; + + if (BSX.MMC[0x02]) + { + for (c = 0; c < 0x100; c += 16) + { + for (i = c; i < c + 16; i++) + { + Map[i + bank] = &PSRAM[(c << 12) % PSRAM_SIZE]; + BlockIsRAM[i + bank] = TRUE; + BlockIsROM[i + bank] = FALSE; + } + } + } + else + { + for (c = 0; c < 0x100; c += 16) + { + for (i = c; i < c + 8; i++) + Map[i + bank] = &PSRAM[(c << 11) % PSRAM_SIZE]; + + for (i = c + 8; i < c + 16; i++) + Map[i + bank] = &PSRAM[(c << 11) % PSRAM_SIZE] - 0x8000; + + for (i = c; i < c + 16; i++) + { + BlockIsRAM[i + bank] = TRUE; + BlockIsROM[i + bank] = FALSE; + } + } + } +} + +static void BSX_Map_PSRAM (void) +{ + int c; + + // Banks 70->77:0000-FFFF + // FIXME: could be toggled by $03 + for (c = 0; c < 0x80; c++) + { + Map[c + 0x700] = &PSRAM[((c & 0x70) << 12) % PSRAM_SIZE]; + BlockIsRAM[c + 0x700] = TRUE; + BlockIsROM[c + 0x700] = FALSE; + } + + // Banks 20->3F:6000-7FFF mirrors 70->77:6000-7FFF + for (c = 0x200; c < 0x400; c += 16) + { + Map[c + 6] = &PSRAM[((c & 0x70) << 12) % PSRAM_SIZE]; + Map[c + 7] = &PSRAM[((c & 0x70) << 12) % PSRAM_SIZE]; + BlockIsRAM[c + 6] = TRUE; + BlockIsRAM[c + 7] = TRUE; + BlockIsROM[c + 6] = FALSE; + BlockIsROM[c + 7] = FALSE; + } + + if (!BSX.MMC[0x05]) + // Banks 40->4F:0000-FFFF mirrors 70->77:0000-7FFF + map_psram_mirror_sub(0x40); + + if (!BSX.MMC[0x06]) + // Banks 50->5F:0000-FFFF mirrors 70->77:0000-7FFF + map_psram_mirror_sub(0x50); + + // FIXME + if (!BSX.MMC[0x03]) + // Banks 60->6F:0000-FFFF mirrors 70->77:0000-7FFF (?) + map_psram_mirror_sub(0x60); +} + +static void BSX_Map_BIOS (void) +{ + int i,c; + + // Banks 00->1F:8000-FFFF + if (BSX.MMC[0x07]) + { + for (c = 0; c < 0x200; c += 16) + { + for (i = c + 8; i < c + 16; i++) + { + Map[i] = &BIOSROM[(c << 11) % BIOS_SIZE] - 0x8000; + BlockIsRAM[i] = FALSE; + BlockIsROM[i] = TRUE; + } + } + } + + // Banks 80->9F:8000-FFFF + if (BSX.MMC[0x08]) + { + for (c = 0; c < 0x200; c += 16) + { + for (i = c + 8; i < c + 16; i++) + { + Map[i + 0x800] = &BIOSROM[(c << 11) % BIOS_SIZE] - 0x8000; + BlockIsRAM[i + 0x800] = FALSE; + BlockIsROM[i + 0x800] = TRUE; + } + } + } +} + +static void BSX_Map_RAM (void) +{ + int c; + + // Banks 7E->7F + for (c = 0; c < 16; c++) + { + Map[c + 0x7E0] = RAM; + Map[c + 0x7F0] = RAM + 0x10000; + BlockIsRAM[c + 0x7E0] = TRUE; + BlockIsRAM[c + 0x7F0] = TRUE; + BlockIsROM[c + 0x7E0] = FALSE; + BlockIsROM[c + 0x7F0] = FALSE; + } +} + +static void BSX_Map_Dirty (void) +{ + // for the quick bank change + + int i, c; + + // Banks 00->1F and 80->9F:8000-FFFF + if (BSX.MMC[0x02]) + { + for (c = 0; c < 0x200; c += 16) + { + for (i = c + 8; i < c + 16; i++) + { + Map[i] = Map[i + 0x800] = &MapROM[(c << 12) % FlashSize]; + BlockIsRAM[i] = BlockIsRAM[i + 0x800] = BSX.write_enable; + BlockIsROM[i] = BlockIsROM[i + 0x800] = !BSX.write_enable; + } + } + } + else + { + for (c = 0; c < 0x200; c += 16) + { + for (i = c + 8; i < c + 16; i++) + { + Map[i] = Map[i + 0x800] = &MapROM[(c << 11) % FlashSize] - 0x8000; + BlockIsRAM[i] = BlockIsRAM[i + 0x800] = BSX.write_enable; + BlockIsROM[i] = BlockIsROM[i + 0x800] = !BSX.write_enable; + } + } + } +} + +static void BSX_Map (void) +{ +#ifdef BSX_DEBUG + printf("BS: Remapping\n"); + for (int i = 0; i < 32; i++) + printf("BS: MMC %02X: %d\n", i, BSX.MMC[i]); +#endif + + memcpy(BSX.prevMMC, BSX.MMC, sizeof(BSX.MMC)); + + // Do a quick bank change + if (BSX.dirty2 && !BSX.dirty) + { + BSX_Map_Dirty(); + BSX_Map_BIOS(); + + BSX.dirty2 = FALSE; + + Memory.map_WriteProtectROM(); + return; + } + + if (BSX.MMC[0x01]) + { + MapROM = PSRAM; + FlashSize = PSRAM_SIZE; + } + else + { + MapROM = FlashROM; + FlashSize = FLASH_SIZE; + } + + BSX_Map_SNES(); + + if (BSX.MMC[0x02]) + BSX_Map_HiROM(); + else + BSX_Map_LoROM(); + + BSX_Map_PSRAM(); + BSX_Map_SRAM(); + BSX_Map_RAM(); + + BSX_Map_BIOS(); + BSX_Map_FlashIO(); + BSX_Map_MMC(); + + // Monitor new register changes + BSX.dirty = FALSE; + BSX.dirty2 = FALSE; + + Memory.map_WriteProtectROM(); +} + +static uint8 BSX_Get_Bypass_FlashIO (uint16 offset) +{ + if (BSX.MMC[0x02]) + return (MapROM[offset]); + else + { + if (offset < 0x8000) + return (MapROM[offset]); + else + return (MapROM[offset - 0x8000]); + } +} + +static void BSX_Set_Bypass_FlashIO (uint16 offset, uint8 byte) +{ + if (BSX.MMC[0x02]) + MapROM[offset] = byte; + else + { + if (offset < 0x8000) + MapROM[offset] = byte; + else + MapROM[offset - 0x8000] = byte; + } +} + +uint8 S9xGetBSX (uint32 address) +{ + uint8 bank = (address >> 16) & 0xFF; + uint16 offset = address & 0xFFFF; + uint8 t = 0; + + // MMC + if ((bank >= 0x01 && bank <= 0x0E) && (offset == 0x5000)) + return (BSX.MMC[bank]); + + // Flash IO + if (bank == 0xC0) + { + // default: read-through mode + t = BSX_Get_Bypass_FlashIO(offset); + + // note: may be more registers, purposes unknown + switch (offset) + { + case 0x0002: + if (BSX.flash_enable) + t = 0x80; // status register? + break; + + case 0x5555: + if (BSX.flash_enable) + t = 0x80; // ??? + break; + + case 0xFF00: + case 0xFF02: + case 0xFF04: + case 0xFF06: + case 0xFF08: + case 0xFF0A: + case 0xFF0C: + case 0xFF0E: + case 0xFF10: + case 0xFF12: + // return flash vendor information + if (BSX.read_enable) + t = flashcard[offset - 0xFF00]; + break; + } + } + + return (t); +} + +void S9xSetBSX (uint8 byte, uint32 address) +{ + uint8 bank = (address >> 16) & 0xFF; + uint16 offset = address & 0xFFFF; + + // MMC + if ((bank >= 0x01 && bank <= 0x0E) && (offset == 0x5000)) + { + switch (bank) + { + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x09: + case 0x0A: + case 0x0B: + case 0x0C: + case 0x0D: + if (BSX.MMC[bank] != byte) + { + BSX.MMC[bank] = byte; + BSX.dirty = TRUE; + } + break; + + case 0x07: + case 0x08: + if (BSX.MMC[bank] != byte) + { + BSX.MMC[bank] = byte; + BSX.dirty2 = TRUE; + } + break; + + case 0x0E: + BSX.MMC[bank] = byte; + if (byte && (BSX.dirty || BSX.dirty2)) + BSX_Map(); + break; + } + } + + // Flash IO + if (bank == 0xC0) + { + BSX.old_write = BSX.new_write; + BSX.new_write = address; + + // ???: double writes to the desired address will bypass + // flash registers + if (BSX.old_write == BSX.new_write && BSX.write_enable) + { + BSX_Set_Bypass_FlashIO(offset, byte); + return; + } + + // flash command handling + // note: incomplete + switch (offset) + { + case 0x0000: + BSX.flash_command <<= 8; + BSX.flash_command |= byte; + if ((BSX.flash_command & 0xFFFF) == 0x38D0) + { + // retrieve information about the flash card + BSX.flash_enable = TRUE; + BSX.read_enable = TRUE; + } + break; + + case 0x2AAA: + BSX.flash_command <<= 8; + BSX.flash_command |= byte; + break; + + case 0x5555: + BSX.flash_command <<= 8; + BSX.flash_command |= byte; + + switch (BSX.flash_command & 0xFFFFFF) + { + case 0xAA55F0: + // turn off flash i/o + BSX.flash_enable = FALSE; + BSX.write_enable = FALSE; + BSX.read_enable = FALSE; + break; + + case 0xAA55A0: + // enable writing to flash + BSX.old_write = 0; + BSX.new_write = 0; + BSX.flash_enable = TRUE; + BSX.write_enable = TRUE; + BSX_Map(); + break; + + case 0xAA5570: + // turn on write-protection + BSX.write_enable = FALSE; + BSX_Map(); + break; + + case 0xAA5580: + case 0xAA5510: + // ??? + break; + + } + + break; + } + } +} + +uint8 S9xGetBSXPPU (uint16 address) +{ + uint8 t; + + // known read registers + switch (address) + { + // Test register low? (r/w) + case 0x2188: + t = BSX.PPU[0x2188 - BSXPPUBASE]; + break; + + // Test register high? (r/w) + case 0x2189: + t = BSX.PPU[0x2189 - BSXPPUBASE]; + break; + + case 0x218A: + t = BSX.PPU[0x218A - BSXPPUBASE]; + break; + + case 0x218C: + t = BSX.PPU[0x218C - BSXPPUBASE]; + break; + + // Transmission number low? (r/w) + case 0x218E: + t = BSX.PPU[0x218E - BSXPPUBASE]; + break; + + // Transmission number high? (r/w) + case 0x218F: + t = BSX.PPU[0x218F - BSXPPUBASE]; + break; + + // Status register? (r) + case 0x2190: + t = BSX.PPU[0x2190 - BSXPPUBASE]; + break; + + // Data register? (r/w) + case 0x2192: + t = BSX.PPU[0x2192 - BSXPPUBASE]; + + // test + t = BSX.test2192[BSX.out_index++]; + if (BSX.out_index == 32) + BSX.out_index = 0; + + BSX_RTC.ticks++; + if (BSX_RTC.ticks >= 1000) + { + BSX_RTC.ticks = 0; + BSX_RTC.seconds++; + } + if (BSX_RTC.seconds >= 60) + { + BSX_RTC.seconds = 0; + BSX_RTC.minutes++; + } + if (BSX_RTC.minutes >= 60) + { + BSX_RTC.minutes = 0; + BSX_RTC.hours++; + } + if (BSX_RTC.hours >= 24) + BSX_RTC.hours = 0; + + BSX.test2192[10] = BSX_RTC.seconds; + BSX.test2192[11] = BSX_RTC.minutes; + BSX.test2192[12] = BSX_RTC.hours; + + break; + + // Transmission status? (r/w) + case 0x2193: + // Data ready when bits 2/3 clear? + t = BSX.PPU[0x2193 - BSXPPUBASE] & ~0x0C; + break; + + // Reset? (r/w) + case 0x2194: + t = BSX.PPU[0x2194 - BSXPPUBASE]; + break; + + // Unknown (r) + case 0x2196: + t = BSX.PPU[0x2196 - BSXPPUBASE]; + break; + + // Unknown (r/w) + case 0x2197: + t = BSX.PPU[0x2197 - BSXPPUBASE]; + break; + + // Modem protocol? (r/w) + case 0x2199: + t = BSX.PPU[0x2199 - BSXPPUBASE]; + break; + + default: + t = OpenBus; + break; + } + + return (t); +} + +void S9xSetBSXPPU (uint8 byte, uint16 address) +{ + // known write registers + switch (address) + { + // Test register low? (r/w) + case 0x2188: + BSX.PPU[0x2188 - BSXPPUBASE] = byte; + break; + + // Test register high? (r/w) + case 0x2189: + BSX.PPU[0x2189 - BSXPPUBASE] = byte; + break; + + case 0x218A: + BSX.PPU[0x218A - BSXPPUBASE] = byte; + break; + + case 0x218B: + BSX.PPU[0x218B - BSXPPUBASE] = byte; + break; + + case 0x218C: + BSX.PPU[0x218C - BSXPPUBASE] = byte; + break; + + // Transmission number low? (r/w) + case 0x218E: + BSX.PPU[0x218E - BSXPPUBASE] = byte; + break; + + // Transmission number high? (r/w) + case 0x218F: + BSX.PPU[0x218F - BSXPPUBASE] = byte; + + // ? + BSX.PPU[0x218E - BSXPPUBASE] >>= 1; + BSX.PPU[0x218E - BSXPPUBASE] = BSX.PPU[0x218F - BSXPPUBASE] - BSX.PPU[0x218E - BSXPPUBASE]; + BSX.PPU[0x218F - BSXPPUBASE] >>= 1; + + BSX.PPU[0x2190 - BSXPPUBASE] = 0x80; // ? + break; + + // Strobe assert? (w) + case 0x2191: + BSX.PPU[0x2191 - BSXPPUBASE] = byte; + BSX.out_index = 0; + break; + + // Data register? (r/w) + case 0x2192: + BSX.PPU[0x2192 - BSXPPUBASE] = 0x01; // ? + BSX.PPU[0x2190 - BSXPPUBASE] = 0x80; // ? + break; + + // Transmission status? (r/w) + case 0x2193: + BSX.PPU[0x2193 - BSXPPUBASE] = byte; + break; + + // Reset? (r/w) + case 0x2194: + BSX.PPU[0x2194 - BSXPPUBASE] = byte; + break; + + // Unknown (r/w) + case 0x2197: + BSX.PPU[0x2197 - BSXPPUBASE] = byte; + break; + + // Modem protocol? (r/w) + case 0x2199: + // Lots of modem strings written here when + // connection is lost or no uplink established + BSX.PPU[0x2199 - BSXPPUBASE] = byte; + break; + } +} + +uint8 * S9xGetBasePointerBSX (uint32 address) +{ + return (MapROM); +} + +static bool8 BSX_LoadBIOS (void) +{ +#ifdef GEKKO + return FALSE; // We're not loading the BIOS! +#endif + + FILE *fp; + char path[PATH_MAX + 1], name[PATH_MAX + 1]; + bool8 r = FALSE; + + strcpy(path, S9xGetDirectory(BIOS_DIR)); + strcat(path, SLASH_STR); + strcpy(name, path); + strcat(name, "BS-X.bin"); + + fp = fopen(name, "rb"); + if (!fp) + { + strcpy(name, path); + strcat(name, "BS-X.bios"); + fp = fopen(name, "rb"); + } + + if (fp) + { + size_t size; + + size = fread((void *) BIOSROM, 1, BIOS_SIZE, fp); + fclose(fp); + if (size == BIOS_SIZE) + r = TRUE; + } + +#ifdef BSX_DEBUG + if (r) + printf("BS: BIOS found.\n"); + else + printf("BS: BIOS not found!\n"); +#endif + + return (r); +} + +void S9xInitBSX (void) +{ + Settings.BS = FALSE; + + if (!memcmp(&Memory.ROM[0x7FC0], "Satellaview BS-X ", 21)) + { + // BS-X itself + + Settings.BS = TRUE; + Settings.BSXItself = TRUE; + + Memory.LoROM = TRUE; + Memory.HiROM = FALSE; + + memmove(BIOSROM, Memory.ROM, BIOS_SIZE); + + FlashMode = FALSE; + FlashSize = FLASH_SIZE; + + BSX.bootup = TRUE; + } + else + { + Settings.BSXItself = FALSE; + + int r1, r2; + + r1 = (is_bsx(Memory.ROM + 0x7FC0) == 1); + r2 = (is_bsx(Memory.ROM + 0xFFC0) == 1); + Settings.BS = (r1 | r2) ? TRUE : FALSE; + + if (Settings.BS) + { + // BS games + + Memory.LoROM = r1 ? TRUE : FALSE; + Memory.HiROM = r2 ? TRUE : FALSE; + + uint8 *header = r1 ? Memory.ROM + 0x7FC0 : Memory.ROM + 0xFFC0; + + FlashMode = (header[0x18] & 0xEF) == 0x20 ? FALSE : TRUE; + FlashSize = (header[0x19] & 0x20) ? PSRAM_SIZE : FLASH_SIZE; + +#ifdef BSX_DEBUG + for (int i = 0; i <= 0x1F; i++) + printf("BS: ROM Header %02X: %02X\n", i, header[i]); + printf("BS: FlashMode: %d, FlashSize: %x\n", FlashMode, FlashSize); +#endif + + BSX.bootup = Settings.BSXBootup; + + if (!BSX_LoadBIOS()) + { + BSX.bootup = FALSE; + memset(BIOSROM, 0, BIOS_SIZE); + } + } + } + + if (Settings.BS) + { + MapROM = NULL; + FlashROM = Memory.ROM; + + time_t t; + struct tm *tmr; + + time(&t); + tmr = localtime(&t); + + BSX_RTC.ticks = 0; + memcpy(BSX.test2192, init2192, sizeof(init2192)); + BSX.test2192[10] = BSX_RTC.seconds = tmr->tm_sec; + BSX.test2192[11] = BSX_RTC.minutes = tmr->tm_min; + BSX.test2192[12] = BSX_RTC.hours = tmr->tm_hour; +#ifdef BSX_DEBUG + printf("BS: Current Time: %02d:%02d:%02d\n", BSX_RTC.hours, BSX_RTC.minutes, BSX_RTC.seconds); +#endif + SNESGameFixes.SRAMInitialValue = 0x00; + } +} + +void S9xResetBSX (void) +{ + if (Settings.BSXItself) + memset(Memory.ROM, 0, FLASH_SIZE); + + memset(BSX.PPU, 0, sizeof(BSX.PPU)); + memset(BSX.MMC, 0, sizeof(BSX.MMC)); + memset(BSX.prevMMC, 0, sizeof(BSX.prevMMC)); + + BSX.dirty = FALSE; + BSX.dirty2 = FALSE; + BSX.flash_enable = FALSE; + BSX.write_enable = FALSE; + BSX.read_enable = FALSE; + BSX.flash_command = 0; + BSX.old_write = 0; + BSX.new_write = 0; + + BSX.out_index = 0; + memset(BSX.output, 0, sizeof(BSX.output)); + + // starting from the bios + if (BSX.bootup) + BSX.MMC[0x07] = BSX.MMC[0x08] = 0x80; + else + { + BSX.MMC[0x02] = FlashMode ? 0x80: 0; + + // per bios: run from psram or flash card + if (FlashSize == PSRAM_SIZE) + { + memcpy(PSRAM, FlashROM, PSRAM_SIZE); + + BSX.MMC[0x01] = 0x80; + BSX.MMC[0x03] = 0x80; + BSX.MMC[0x04] = 0x80; + BSX.MMC[0x0C] = 0x80; + BSX.MMC[0x0D] = 0x80; + } + else + { + BSX.MMC[0x03] = 0x80; + BSX.MMC[0x05] = 0x80; + BSX.MMC[0x06] = 0x80; + } + + BSX.MMC[0x0E] = 0x80; + } + + BSX_Map(); +} + +void S9xBSXPostLoadState (void) +{ + uint8 temp[16]; + bool8 pd1, pd2; + + pd1 = BSX.dirty; + pd2 = BSX.dirty2; + memcpy(temp, BSX.MMC, sizeof(BSX.MMC)); + + memcpy(BSX.MMC, BSX.prevMMC, sizeof(BSX.MMC)); + BSX_Map(); + + memcpy(BSX.MMC, temp, sizeof(BSX.MMC)); + BSX.dirty = pd1; + BSX.dirty2 = pd2; +} + +static bool valid_normal_bank (unsigned char bankbyte) +{ + switch (bankbyte) + { + case 32: case 33: case 48: case 49: + return (true); + break; + } + + return (false); +} + +static int is_bsx (unsigned char *p) +{ + if ((p[26] == 0x33 || p[26] == 0xFF) && (!p[21] || (p[21] & 131) == 128) && valid_normal_bank(p[24])) + { + unsigned char m = p[22]; + + if (!m && !p[23]) + return (2); + + if ((m == 0xFF && p[23] == 0xFF) || (!(m & 0xF) && ((m >> 4) - 1 < 12))) + return (1); + } + + return (0); +} diff --git a/plugins/snes9x_gx/source/snes9x/bsx.h b/plugins/snes9x_gx/source/snes9x/bsx.h new file mode 100644 index 00000000..d88bb193 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/bsx.h @@ -0,0 +1,211 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _BSX_H_ +#define _BSX_H_ + +struct SBSX +{ + bool8 dirty; // Changed register values + bool8 dirty2; // Changed register values + bool8 bootup; // Start in bios mapping + bool8 flash_enable; // Flash state + bool8 write_enable; // ROM write protection + bool8 read_enable; // Allow card vendor reading + uint32 flash_command; // Flash command + uint32 old_write; // Previous flash write address + uint32 new_write; // Current flash write address + uint8 out_index; + uint8 output[32]; + uint8 PPU[32]; + uint8 MMC[16]; + uint8 prevMMC[16]; + uint8 test2192[32]; +}; + +extern struct SBSX BSX; + +uint8 S9xGetBSX (uint32); +void S9xSetBSX (uint8, uint32); +uint8 S9xGetBSXPPU (uint16); +void S9xSetBSXPPU (uint8, uint16); +uint8 * S9xGetBasePointerBSX (uint32); +void S9xInitBSX (void); +void S9xResetBSX (void); +void S9xBSXPostLoadState (void); + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/c4.cpp b/plugins/snes9x_gx/source/snes9x/c4.cpp new file mode 100644 index 00000000..d586e79e --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/c4.cpp @@ -0,0 +1,330 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#include <math.h> +#include "snes9x.h" +#include "memmap.h" + +#define C4_PI 3.14159265 + +int16 C4WFXVal; +int16 C4WFYVal; +int16 C4WFZVal; +int16 C4WFX2Val; +int16 C4WFY2Val; +int16 C4WFDist; +int16 C4WFScale; +int16 C41FXVal; +int16 C41FYVal; +int16 C41FAngleRes; +int16 C41FDist; +int16 C41FDistVal; + +static double tanval; +static double c4x, c4y, c4z; +static double c4x2, c4y2, c4z2; + + +void C4TransfWireFrame (void) +{ + c4x = (double) C4WFXVal; + c4y = (double) C4WFYVal; + c4z = (double) C4WFZVal - 0x95; + + // Rotate X + tanval = -(double) C4WFX2Val * C4_PI * 2 / 128; + c4y2 = c4y * cos(tanval) - c4z * sin(tanval); + c4z2 = c4y * sin(tanval) + c4z * cos(tanval); + + // Rotate Y + tanval = -(double) C4WFY2Val * C4_PI * 2 / 128; + c4x2 = c4x * cos(tanval) + c4z2 * sin(tanval); + c4z = c4x * -sin(tanval) + c4z2 * cos(tanval); + + // Rotate Z + tanval = -(double) C4WFDist * C4_PI * 2 / 128; + c4x = c4x2 * cos(tanval) - c4y2 * sin(tanval); + c4y = c4x2 * sin(tanval) + c4y2 * cos(tanval); + + // Scale + C4WFXVal = (int16) (c4x * (double) C4WFScale / (0x90 * (c4z + 0x95)) * 0x95); + C4WFYVal = (int16) (c4y * (double) C4WFScale / (0x90 * (c4z + 0x95)) * 0x95); +} + +void C4TransfWireFrame2 (void) +{ + c4x = (double) C4WFXVal; + c4y = (double) C4WFYVal; + c4z = (double) C4WFZVal; + + // Rotate X + tanval = -(double) C4WFX2Val * C4_PI * 2 / 128; + c4y2 = c4y * cos(tanval) - c4z * sin(tanval); + c4z2 = c4y * sin(tanval) + c4z * cos(tanval); + + // Rotate Y + tanval = -(double) C4WFY2Val * C4_PI * 2 / 128; + c4x2 = c4x * cos(tanval) + c4z2 * sin(tanval); + c4z = c4x * -sin(tanval) + c4z2 * cos(tanval); + + // Rotate Z + tanval = -(double) C4WFDist * C4_PI * 2 / 128; + c4x = c4x2 * cos(tanval) - c4y2 * sin(tanval); + c4y = c4x2 * sin(tanval) + c4y2 * cos(tanval); + + // Scale + C4WFXVal = (int16) (c4x * (double) C4WFScale / 0x100); + C4WFYVal = (int16) (c4y * (double) C4WFScale / 0x100); +} + +void C4CalcWireFrame (void) +{ + C4WFXVal = C4WFX2Val - C4WFXVal; + C4WFYVal = C4WFY2Val - C4WFYVal; + + if (abs(C4WFXVal) > abs(C4WFYVal)) + { + C4WFDist = abs(C4WFXVal) + 1; + C4WFYVal = (int16) (256 * (double) C4WFYVal / abs(C4WFXVal)); + if (C4WFXVal < 0) + C4WFXVal = -256; + else + C4WFXVal = 256; + } + else + { + if (C4WFYVal != 0) + { + C4WFDist = abs(C4WFYVal) + 1; + C4WFXVal = (int16) (256 * (double) C4WFXVal / abs(C4WFYVal)); + if (C4WFYVal < 0) + C4WFYVal = -256; + else + C4WFYVal = 256; + } + else + C4WFDist = 0; + } +} + +void C4Op1F (void) +{ + if (C41FXVal == 0) + { + if (C41FYVal > 0) + C41FAngleRes = 0x80; + else + C41FAngleRes = 0x180; + } + else + { + tanval = (double) C41FYVal / C41FXVal; + C41FAngleRes = (int16) (atan(tanval) / (C4_PI * 2) * 512); + C41FAngleRes = C41FAngleRes; + if (C41FXVal< 0) + C41FAngleRes += 0x100; + C41FAngleRes &= 0x1FF; + } +} + +void C4Op15 (void) +{ + tanval = sqrt((double) C41FYVal * C41FYVal + (double) C41FXVal * C41FXVal); + C41FDist = (int16) tanval; +} + +void C4Op0D (void) +{ + tanval = sqrt((double) C41FYVal * C41FYVal + (double) C41FXVal * C41FXVal); + tanval = C41FDistVal / tanval; + C41FYVal = (int16) (C41FYVal * tanval * 0.99); + C41FXVal = (int16) (C41FXVal * tanval * 0.98); +} + +uint8 * S9xGetBasePointerC4 (uint16 Address) +{ + if (Address >= 0x7f40 && Address <= 0x7f5e) + return (NULL); + return (Memory.C4RAM - 0x6000); +} + +uint8 * S9xGetMemPointerC4 (uint16 Address) +{ + if (Address >= 0x7f40 && Address <= 0x7f5e) + return (NULL); + return (Memory.C4RAM - 0x6000 + (Address & 0xffff)); +} diff --git a/plugins/snes9x_gx/source/snes9x/c4.h b/plugins/snes9x_gx/source/snes9x/c4.h new file mode 100644 index 00000000..9b4c6070 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/c4.h @@ -0,0 +1,211 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _C4_H_ +#define _C4_H_ + +extern int16 C4WFXVal; +extern int16 C4WFYVal; +extern int16 C4WFZVal; +extern int16 C4WFX2Val; +extern int16 C4WFY2Val; +extern int16 C4WFDist; +extern int16 C4WFScale; +extern int16 C41FXVal; +extern int16 C41FYVal; +extern int16 C41FAngleRes; +extern int16 C41FDist; +extern int16 C41FDistVal; + +void C4TransfWireFrame (void); +void C4TransfWireFrame2 (void); +void C4CalcWireFrame (void); +void C4Op0D (void); +void C4Op15 (void); +void C4Op1F (void); +void S9xInitC4 (void); +void S9xSetC4 (uint8, uint16); +uint8 S9xGetC4 (uint16); +uint8 * S9xGetBasePointerC4 (uint16); +uint8 * S9xGetMemPointerC4 (uint16); + +static inline uint8 * C4GetMemPointer (uint32 Address) +{ + return (Memory.ROM + ((Address & 0xff0000) >> 1) + (Address & 0x7fff)); +} + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/c4emu.cpp b/plugins/snes9x_gx/source/snes9x/c4emu.cpp new file mode 100644 index 00000000..65e0f553 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/c4emu.cpp @@ -0,0 +1,1245 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#include <math.h> +#include "snes9x.h" +#include "memmap.h" +#include "sar.h" + +static int16 C4SinTable[512] = +{ + 0, 402, 804, 1206, 1607, 2009, 2410, 2811, + 3211, 3611, 4011, 4409, 4808, 5205, 5602, 5997, + 6392, 6786, 7179, 7571, 7961, 8351, 8739, 9126, + 9512, 9896, 10278, 10659, 11039, 11416, 11793, 12167, + 12539, 12910, 13278, 13645, 14010, 14372, 14732, 15090, + 15446, 15800, 16151, 16499, 16846, 17189, 17530, 17869, + 18204, 18537, 18868, 19195, 19519, 19841, 20159, 20475, + 20787, 21097, 21403, 21706, 22005, 22301, 22594, 22884, + 23170, 23453, 23732, 24007, 24279, 24547, 24812, 25073, + 25330, 25583, 25832, 26077, 26319, 26557, 26790, 27020, + 27245, 27466, 27684, 27897, 28106, 28310, 28511, 28707, + 28898, 29086, 29269, 29447, 29621, 29791, 29956, 30117, + 30273, 30425, 30572, 30714, 30852, 30985, 31114, 31237, + 31357, 31471, 31581, 31685, 31785, 31881, 31971, 32057, + 32138, 32214, 32285, 32351, 32413, 32469, 32521, 32568, + 32610, 32647, 32679, 32706, 32728, 32745, 32758, 32765, + 32767, 32765, 32758, 32745, 32728, 32706, 32679, 32647, + 32610, 32568, 32521, 32469, 32413, 32351, 32285, 32214, + 32138, 32057, 31971, 31881, 31785, 31685, 31581, 31471, + 31357, 31237, 31114, 30985, 30852, 30714, 30572, 30425, + 30273, 30117, 29956, 29791, 29621, 29447, 29269, 29086, + 28898, 28707, 28511, 28310, 28106, 27897, 27684, 27466, + 27245, 27020, 26790, 26557, 26319, 26077, 25832, 25583, + 25330, 25073, 24812, 24547, 24279, 24007, 23732, 23453, + 23170, 22884, 22594, 22301, 22005, 21706, 21403, 21097, + 20787, 20475, 20159, 19841, 19519, 19195, 18868, 18537, + 18204, 17869, 17530, 17189, 16846, 16499, 16151, 15800, + 15446, 15090, 14732, 14372, 14010, 13645, 13278, 12910, + 12539, 12167, 11793, 11416, 11039, 10659, 10278, 9896, + 9512, 9126, 8739, 8351, 7961, 7571, 7179, 6786, + 6392, 5997, 5602, 5205, 4808, 4409, 4011, 3611, + 3211, 2811, 2410, 2009, 1607, 1206, 804, 402, + 0, -402, -804, -1206, -1607, -2009, -2410, -2811, + -3211, -3611, -4011, -4409, -4808, -5205, -5602, -5997, + -6392, -6786, -7179, -7571, -7961, -8351, -8739, -9126, + -9512, -9896, -10278, -10659, -11039, -11416, -11793, -12167, + -12539, -12910, -13278, -13645, -14010, -14372, -14732, -15090, + -15446, -15800, -16151, -16499, -16846, -17189, -17530, -17869, + -18204, -18537, -18868, -19195, -19519, -19841, -20159, -20475, + -20787, -21097, -21403, -21706, -22005, -22301, -22594, -22884, + -23170, -23453, -23732, -24007, -24279, -24547, -24812, -25073, + -25330, -25583, -25832, -26077, -26319, -26557, -26790, -27020, + -27245, -27466, -27684, -27897, -28106, -28310, -28511, -28707, + -28898, -29086, -29269, -29447, -29621, -29791, -29956, -30117, + -30273, -30425, -30572, -30714, -30852, -30985, -31114, -31237, + -31357, -31471, -31581, -31685, -31785, -31881, -31971, -32057, + -32138, -32214, -32285, -32351, -32413, -32469, -32521, -32568, + -32610, -32647, -32679, -32706, -32728, -32745, -32758, -32765, + -32767, -32765, -32758, -32745, -32728, -32706, -32679, -32647, + -32610, -32568, -32521, -32469, -32413, -32351, -32285, -32214, + -32138, -32057, -31971, -31881, -31785, -31685, -31581, -31471, + -31357, -31237, -31114, -30985, -30852, -30714, -30572, -30425, + -30273, -30117, -29956, -29791, -29621, -29447, -29269, -29086, + -28898, -28707, -28511, -28310, -28106, -27897, -27684, -27466, + -27245, -27020, -26790, -26557, -26319, -26077, -25832, -25583, + -25330, -25073, -24812, -24547, -24279, -24007, -23732, -23453, + -23170, -22884, -22594, -22301, -22005, -21706, -21403, -21097, + -20787, -20475, -20159, -19841, -19519, -19195, -18868, -18537, + -18204, -17869, -17530, -17189, -16846, -16499, -16151, -15800, + -15446, -15090, -14732, -14372, -14010, -13645, -13278, -12910, + -12539, -12167, -11793, -11416, -11039, -10659, -10278, -9896, + -9512, -9126, -8739, -8351, -7961, -7571, -7179, -6786, + -6392, -5997, -5602, -5205, -4808, -4409, -4011, -3611, + -3211, -2811, -2410, -2009, -1607, -1206, -804, -402 +}; + +static int16 C4CosTable[512] = +{ + 32767, 32765, 32758, 32745, 32728, 32706, 32679, 32647, + 32610, 32568, 32521, 32469, 32413, 32351, 32285, 32214, + 32138, 32057, 31971, 31881, 31785, 31685, 31581, 31471, + 31357, 31237, 31114, 30985, 30852, 30714, 30572, 30425, + 30273, 30117, 29956, 29791, 29621, 29447, 29269, 29086, + 28898, 28707, 28511, 28310, 28106, 27897, 27684, 27466, + 27245, 27020, 26790, 26557, 26319, 26077, 25832, 25583, + 25330, 25073, 24812, 24547, 24279, 24007, 23732, 23453, + 23170, 22884, 22594, 22301, 22005, 21706, 21403, 21097, + 20787, 20475, 20159, 19841, 19519, 19195, 18868, 18537, + 18204, 17869, 17530, 17189, 16846, 16499, 16151, 15800, + 15446, 15090, 14732, 14372, 14010, 13645, 13278, 12910, + 12539, 12167, 11793, 11416, 11039, 10659, 10278, 9896, + 9512, 9126, 8739, 8351, 7961, 7571, 7179, 6786, + 6392, 5997, 5602, 5205, 4808, 4409, 4011, 3611, + 3211, 2811, 2410, 2009, 1607, 1206, 804, 402, + 0, -402, -804, -1206, -1607, -2009, -2410, -2811, + -3211, -3611, -4011, -4409, -4808, -5205, -5602, -5997, + -6392, -6786, -7179, -7571, -7961, -8351, -8739, -9126, + -9512, -9896, -10278, -10659, -11039, -11416, -11793, -12167, + -12539, -12910, -13278, -13645, -14010, -14372, -14732, -15090, + -15446, -15800, -16151, -16499, -16846, -17189, -17530, -17869, + -18204, -18537, -18868, -19195, -19519, -19841, -20159, -20475, + -20787, -21097, -21403, -21706, -22005, -22301, -22594, -22884, + -23170, -23453, -23732, -24007, -24279, -24547, -24812, -25073, + -25330, -25583, -25832, -26077, -26319, -26557, -26790, -27020, + -27245, -27466, -27684, -27897, -28106, -28310, -28511, -28707, + -28898, -29086, -29269, -29447, -29621, -29791, -29956, -30117, + -30273, -30425, -30572, -30714, -30852, -30985, -31114, -31237, + -31357, -31471, -31581, -31685, -31785, -31881, -31971, -32057, + -32138, -32214, -32285, -32351, -32413, -32469, -32521, -32568, + -32610, -32647, -32679, -32706, -32728, -32745, -32758, -32765, + -32767, -32765, -32758, -32745, -32728, -32706, -32679, -32647, + -32610, -32568, -32521, -32469, -32413, -32351, -32285, -32214, + -32138, -32057, -31971, -31881, -31785, -31685, -31581, -31471, + -31357, -31237, -31114, -30985, -30852, -30714, -30572, -30425, + -30273, -30117, -29956, -29791, -29621, -29447, -29269, -29086, + -28898, -28707, -28511, -28310, -28106, -27897, -27684, -27466, + -27245, -27020, -26790, -26557, -26319, -26077, -25832, -25583, + -25330, -25073, -24812, -24547, -24279, -24007, -23732, -23453, + -23170, -22884, -22594, -22301, -22005, -21706, -21403, -21097, + -20787, -20475, -20159, -19841, -19519, -19195, -18868, -18537, + -18204, -17869, -17530, -17189, -16846, -16499, -16151, -15800, + -15446, -15090, -14732, -14372, -14010, -13645, -13278, -12910, + -12539, -12167, -11793, -11416, -11039, -10659, -10278, -9896, + -9512, -9126, -8739, -8351, -7961, -7571, -7179, -6786, + -6392, -5997, -5602, -5205, -4808, -4409, -4011, -3611, + -3211, -2811, -2410, -2009, -1607, -1206, -804, -402, + 0, 402, 804, 1206, 1607, 2009, 2410, 2811, + 3211, 3611, 4011, 4409, 4808, 5205, 5602, 5997, + 6392, 6786, 7179, 7571, 7961, 8351, 8739, 9126, + 9512, 9896, 10278, 10659, 11039, 11416, 11793, 12167, + 12539, 12910, 13278, 13645, 14010, 14372, 14732, 15090, + 15446, 15800, 16151, 16499, 16846, 17189, 17530, 17869, + 18204, 18537, 18868, 19195, 19519, 19841, 20159, 20475, + 20787, 21097, 21403, 21706, 22005, 22301, 22594, 22884, + 23170, 23453, 23732, 24007, 24279, 24547, 24812, 25073, + 25330, 25583, 25832, 26077, 26319, 26557, 26790, 27020, + 27245, 27466, 27684, 27897, 28106, 28310, 28511, 28707, + 28898, 29086, 29269, 29447, 29621, 29791, 29956, 30117, + 30273, 30425, 30572, 30714, 30852, 30985, 31114, 31237, + 31357, 31471, 31581, 31685, 31785, 31881, 31971, 32057, + 32138, 32214, 32285, 32351, 32413, 32469, 32521, 32568, + 32610, 32647, 32679, 32706, 32728, 32745, 32758, 32765 +}; + +static uint8 C4TestPattern[12 * 4] = +{ + 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x00, + 0x80, 0xff, 0xff, 0x7f, + 0x00, 0x80, 0x00, 0xff, + 0x7f, 0x00, 0xff, 0x7f, + 0xff, 0x7f, 0xff, 0xff, + 0x00, 0x00, 0x01, 0xff, + 0xff, 0xfe, 0x00, 0x01, + 0x00, 0xff, 0xfe, 0x00 +}; + +static void C4ConvOAM (void); +static void C4DoScaleRotate (int); +static void C4DrawLine (int32, int32, int16, int32, int32, int16, uint8); +static void C4DrawWireFrame (void); +static void C4TransformLines (void); +static void C4BitPlaneWave (void); +static void C4SprDisintegrate (void); +static void C4ProcessSprites (void); + + +static void C4ConvOAM (void) +{ + uint8 *OAMptr = Memory.C4RAM + (Memory.C4RAM[0x626] << 2); + for (uint8 *i = Memory.C4RAM + 0x1fd; i > OAMptr; i -= 4) + *i = 0xe0; // Clear OAM-to-be + + uint8 *OAMptr2; + uint16 globalX, globalY; + int16 SprX, SprY; + uint8 SprName, SprAttr; + uint8 SprCount; + + globalX = READ_WORD(Memory.C4RAM + 0x0621); + globalY = READ_WORD(Memory.C4RAM + 0x0623); + OAMptr2 = Memory.C4RAM + 0x200 + (Memory.C4RAM[0x626] >> 2); + +#ifdef DEBUGGER + if (Memory.C4RAM[0x625] != 0) + printf("$6625=%02x, expected 00\n", Memory.C4RAM[0x625]); + if ((Memory.C4RAM[0x626] >> 2) != Memory.C4RAM[0x629]) + printf("$6629=%02x, expected %02x\n", Memory.C4RAM[0x629], (Memory.C4RAM[0x626] >> 2)); + if (((uint16) Memory.C4RAM[0x626] << 2) != READ_WORD(Memory.C4RAM + 0x627)) + printf("$6627=%04x, expected %04x\n", READ_WORD(Memory.C4RAM + 0x627), ((uint16) Memory.C4RAM[0x626] << 2)); +#endif + + if (Memory.C4RAM[0x0620] != 0) + { + SprCount = 128 - Memory.C4RAM[0x626]; + + uint8 offset = (Memory.C4RAM[0x626] & 3) * 2; + uint8 *srcptr = Memory.C4RAM + 0x220; + + for (int i = Memory.C4RAM[0x0620]; i > 0 && SprCount > 0; i--, srcptr += 16) + { + SprX = READ_WORD(srcptr) - globalX; + SprY = READ_WORD(srcptr + 2) - globalY; + SprName = srcptr[5]; + SprAttr = srcptr[4] | srcptr[0x06]; // XXX: mask bits? + + uint8 *sprptr = C4GetMemPointer(READ_3WORD(srcptr + 7)); + if (*sprptr != 0) + { + int16 X, Y; + + for (int SprCnt = *sprptr++; SprCnt > 0 && SprCount > 0; SprCnt--, sprptr += 4) + { + X = (int8) sprptr[1]; + if (SprAttr & 0x40) + X = -X - ((sprptr[0] & 0x20) ? 16 : 8); // flip X + X += SprX; + + if (X >= -16 && X <= 272) + { + Y = (int8) sprptr[2]; + if (SprAttr & 0x80) + Y = -Y - ((sprptr[0] & 0x20) ? 16 : 8); + Y += SprY; + + if (Y >= -16 && Y <= 224) + { + OAMptr[0] = X & 0xff; + OAMptr[1] = (uint8) Y; + OAMptr[2] = SprName + sprptr[3]; + OAMptr[3] = SprAttr ^ (sprptr[0] & 0xc0); // XXX: Carry from SprName addition? + + *OAMptr2 &= ~(3 << offset); + if (X & 0x100) + *OAMptr2 |= 1 << offset; + if (sprptr[0] & 0x20) + *OAMptr2 |= 2 << offset; + + OAMptr += 4; + SprCount--; + + offset = (offset + 2) & 6; + if (offset == 0) + OAMptr2++; + } + } + } + } + else + if (SprCount > 0) + { + // XXX: Should we be testing -16<=SprX<=272 and -16<=SprY<=224? + OAMptr[0] = (uint8) SprX; + OAMptr[1] = (uint8) SprY; + OAMptr[2] = SprName; + OAMptr[3] = SprAttr; + + *OAMptr2 &= ~(3 << offset); + if (SprX & 0x100) + *OAMptr2 |= 3 << offset; + else + *OAMptr2 |= 2 << offset; + + OAMptr += 4; + SprCount--; + + offset = (offset + 2) & 6; + if (offset == 0) + OAMptr2++; + } + } + } +} + +static void C4DoScaleRotate (int row_padding) +{ + int16 A, B, C, D; + + // Calculate matrix + int32 XScale = READ_WORD(Memory.C4RAM + 0x1f8f); + if (XScale & 0x8000) + XScale = 0x7fff; + + int32 YScale = READ_WORD(Memory.C4RAM + 0x1f92); + if (YScale & 0x8000) + YScale = 0x7fff; + + if (READ_WORD(Memory.C4RAM + 0x1f80) == 0) // no rotation + { + // XXX: only do this for C and D? + // XXX: and then only when YScale is 0x1000? + A = (int16) XScale; + B = 0; + C = 0; + D = (int16) YScale; + } + else + if (READ_WORD(Memory.C4RAM + 0x1f80) == 128) // 90 degree rotation + { + // XXX: Really do this? + A = 0; + B = (int16) (-YScale); + C = (int16) XScale; + D = 0; + } + else + if (READ_WORD(Memory.C4RAM + 0x1f80) == 256) // 180 degree rotation + { + // XXX: Really do this? + A = (int16) (-XScale); + B = 0; + C = 0; + D = (int16) (-YScale); + } + else + if (READ_WORD(Memory.C4RAM + 0x1f80) == 384) // 270 degree rotation + { + // XXX: Really do this? + A = 0; + B = (int16) YScale; + C = (int16) (-XScale); + D = 0; + } + else + { + A = (int16) SAR(C4CosTable[READ_WORD(Memory.C4RAM + 0x1f80) & 0x1ff] * XScale, 15); + B = (int16) (-SAR(C4SinTable[READ_WORD(Memory.C4RAM + 0x1f80) & 0x1ff] * YScale, 15)); + C = (int16) SAR(C4SinTable[READ_WORD(Memory.C4RAM + 0x1f80) & 0x1ff] * XScale, 15); + D = (int16) SAR(C4CosTable[READ_WORD(Memory.C4RAM + 0x1f80) & 0x1ff] * YScale, 15); + } + + // Calculate Pixel Resolution + uint8 w = Memory.C4RAM[0x1f89] & ~7; + uint8 h = Memory.C4RAM[0x1f8c] & ~7; + + //printf("%dx%d XScale=%04x YScale=%04x angle=%03x\n", w, h, XScale, YScale, READ_WORD(Memory.C4RAM + 0x1f80) & 0x1ff); + //printf("Matrix: [%10g %10g] [%04x %04x]\n", A / 4096.0, B / 4096.0, A & 0xffff, B & 0xffff); + //printf(" [%10g %10g] [%04x %04x]\n", C / 4096.0, D / 4096.0, C & 0xffff, D & 0xffff); + + // Clear the output RAM + memset(Memory.C4RAM, 0, (w + row_padding / 4) * h / 2); + + int32 Cx = (int16) READ_WORD(Memory.C4RAM + 0x1f83); + int32 Cy = (int16) READ_WORD(Memory.C4RAM + 0x1f86); + +#ifdef DEBUGGER + if (Memory.C4RAM[0x1f97] != 0) + printf("$7f97=%02x, expected 00\n", Memory.C4RAM[0x1f97]); + if ((Cx & ~1) != w / 2 || (Cy & ~1) != h / 2) + printf("Center is not middle of image! (%d, %d) != (%d, %d)\n", Cx, Cy, w / 2, h / 2); +#endif + + // Calculate start position (i.e. (Ox, Oy) = (0, 0)) + // The low 12 bits are fractional, so (Cx<<12) gives us the Cx we want in the function. + // We do Cx*A etc normally because the matrix parameters already have the fractional parts. + int32 LineX = (Cx << 12) - Cx * A - Cx * B; + int32 LineY = (Cy << 12) - Cy * C - Cy * D; + + // Start loop + uint32 X, Y; + uint8 byte; + int outidx = 0; + uint8 bit = 0x80; + + for (int y = 0; y < h; y++) + { + X = LineX; + Y = LineY; + + for (int x = 0; x < w; x++) + { + if ((X >> 12) >= w || (Y >> 12) >= h) + byte = 0; + else + { + uint32 addr = (Y >> 12) * w + (X >> 12); + byte = Memory.C4RAM[0x600 + (addr >> 1)]; + if (addr & 1) + byte >>= 4; + } + + // De-bitplanify + if (byte & 1) + Memory.C4RAM[outidx] |= bit; + if (byte & 2) + Memory.C4RAM[outidx + 1] |= bit; + if (byte & 4) + Memory.C4RAM[outidx + 16] |= bit; + if (byte & 8) + Memory.C4RAM[outidx + 17] |= bit; + + bit >>= 1; + if (bit == 0) + { + bit = 0x80; + outidx += 32; + } + + X += A; // Add 1 to output x => add an A and a C + Y += C; + } + + outidx += 2 + row_padding; + if (outidx & 0x10) + outidx &= ~0x10; + else + outidx -= w * 4 + row_padding; + + LineX += B; // Add 1 to output y => add a B and a D + LineY += D; + } +} + +static void C4DrawLine (int32 X1, int32 Y1, int16 Z1, int32 X2, int32 Y2, int16 Z2, uint8 Color) +{ + // Transform coordinates + C4WFXVal = (int16) X1; + C4WFYVal = (int16) Y1; + C4WFZVal = Z1; + C4WFScale = Memory.C4RAM[0x1f90]; + C4WFX2Val = Memory.C4RAM[0x1f86]; + C4WFY2Val = Memory.C4RAM[0x1f87]; + C4WFDist = Memory.C4RAM[0x1f88]; + C4TransfWireFrame2(); + X1 = (C4WFXVal + 48) << 8; + Y1 = (C4WFYVal + 48) << 8; + + C4WFXVal = (int16) X2; + C4WFYVal = (int16) Y2; + C4WFZVal = Z2; + C4TransfWireFrame2(); + X2 = (C4WFXVal + 48) << 8; + Y2 = (C4WFYVal + 48) << 8; + + // Get line info + C4WFXVal = (int16) (X1 >> 8); + C4WFYVal = (int16) (Y1 >> 8); + C4WFX2Val = (int16) (X2 >> 8); + C4WFY2Val = (int16) (Y2 >> 8); + C4CalcWireFrame(); + X2 = (int16) C4WFXVal; + Y2 = (int16) C4WFYVal; + + // Render line + for (int i = C4WFDist ? C4WFDist : 1; i > 0; i--) + { + if (X1 > 0xff && Y1 > 0xff && X1 < 0x6000 && Y1 < 0x6000) + { + uint16 addr = (((Y1 >> 8) >> 3) << 8) - (((Y1 >> 8) >> 3) << 6) + (((X1 >> 8) >> 3) << 4) + ((Y1 >> 8) & 7) * 2; + uint8 bit = 0x80 >> ((X1 >> 8) & 7); + + Memory.C4RAM[addr + 0x300] &= ~bit; + Memory.C4RAM[addr + 0x301] &= ~bit; + if (Color & 1) + Memory.C4RAM[addr + 0x300] |= bit; + if (Color & 2) + Memory.C4RAM[addr + 0x301] |= bit; + } + + X1 += X2; + Y1 += Y2; + } +} + +static void C4DrawWireFrame (void) +{ + uint8 *line = C4GetMemPointer(READ_3WORD(Memory.C4RAM + 0x1f80)); + uint8 *point1, *point2; + int16 X1, Y1, Z1; + int16 X2, Y2, Z2; + uint8 Color; + +#ifdef DEBUGGER + if (READ_3WORD(Memory.C4RAM + 0x1f8f) & 0xff00ff) + printf("wireframe: Unexpected value in $7f8f: %06x\n", READ_3WORD(Memory.C4RAM + 0x1f8f)); + if (READ_3WORD(Memory.C4RAM + 0x1fa4) != 0x001000) + printf("wireframe: Unexpected value in $7fa4: %06x\n", READ_3WORD(Memory.C4RAM + 0x1fa4)); +#endif + + for (int i = Memory.C4RAM[0x0295]; i > 0; i--, line += 5) + { + if (line[0] == 0xff && line[1] == 0xff) + { + uint8 *tmp = line - 5; + while (tmp[2] == 0xff && tmp[3] == 0xff) + tmp -= 5; + point1 = C4GetMemPointer((Memory.C4RAM[0x1f82] << 16) | (tmp[2] << 8) | tmp[3]); + } + else + point1 = C4GetMemPointer((Memory.C4RAM[0x1f82] << 16) | (line[0] << 8) | line[1]); + + point2 = C4GetMemPointer((Memory.C4RAM[0x1f82] << 16) | (line[2] << 8) | line[3]); + + X1 = (point1[0] << 8) | point1[1]; + Y1 = (point1[2] << 8) | point1[3]; + Z1 = (point1[4] << 8) | point1[5]; + X2 = (point2[0] << 8) | point2[1]; + Y2 = (point2[2] << 8) | point2[3]; + Z2 = (point2[4] << 8) | point2[5]; + + Color = line[4]; + + C4DrawLine(X1, Y1, Z1, X2, Y2, Z2, Color); + } +} + +static void C4TransformLines (void) +{ + C4WFX2Val = Memory.C4RAM[0x1f83]; + C4WFY2Val = Memory.C4RAM[0x1f86]; + C4WFDist = Memory.C4RAM[0x1f89]; + C4WFScale = Memory.C4RAM[0x1f8c]; + +#ifdef DEBUGGER + if (Memory.C4RAM[0x1f8a] != 0x90) + printf("lines: $7f8a = %02x, expected 90\n", READ_WORD(Memory.C4RAM + 0x1f8a)); +#endif + + // Transform vertices + uint8 *ptr = Memory.C4RAM; + + for (int i = READ_WORD(Memory.C4RAM + 0x1f80); i > 0; i--, ptr += 0x10) + { + C4WFXVal = READ_WORD(ptr + 1); + C4WFYVal = READ_WORD(ptr + 5); + C4WFZVal = READ_WORD(ptr + 9); + C4TransfWireFrame(); + + // Displace + WRITE_WORD(ptr + 1, C4WFXVal + 0x80); + WRITE_WORD(ptr + 5, C4WFYVal + 0x50); + } + + WRITE_WORD(Memory.C4RAM + 0x600, 23); + WRITE_WORD(Memory.C4RAM + 0x602, 0x60); + WRITE_WORD(Memory.C4RAM + 0x605, 0x40); + WRITE_WORD(Memory.C4RAM + 0x600 + 8, 23); + WRITE_WORD(Memory.C4RAM + 0x602 + 8, 0x60); + WRITE_WORD(Memory.C4RAM + 0x605 + 8, 0x40); + + ptr = Memory.C4RAM + 0xb02; + uint8 *ptr2 = Memory.C4RAM; + + for (int i = READ_WORD(Memory.C4RAM + 0xb00); i > 0; i--, ptr += 2, ptr2 += 8) + { + C4WFXVal = READ_WORD(Memory.C4RAM + (ptr[0] << 4) + 1); + C4WFYVal = READ_WORD(Memory.C4RAM + (ptr[0] << 4) + 5); + C4WFX2Val = READ_WORD(Memory.C4RAM + (ptr[1] << 4) + 1); + C4WFY2Val = READ_WORD(Memory.C4RAM + (ptr[1] << 4) + 5); + C4CalcWireFrame(); + + WRITE_WORD(ptr2 + 0x600, C4WFDist ? C4WFDist : 1); + WRITE_WORD(ptr2 + 0x602, C4WFXVal); + WRITE_WORD(ptr2 + 0x605, C4WFYVal); + } +} + +static void C4BitPlaneWave (void) +{ + static uint16 bmpdata[] = + { + 0x0000, 0x0002, 0x0004, 0x0006, 0x0008, 0x000A, 0x000C, 0x000E, + 0x0200, 0x0202, 0x0204, 0x0206, 0x0208, 0x020A, 0x020C, 0x020E, + 0x0400, 0x0402, 0x0404, 0x0406, 0x0408, 0x040A, 0x040C, 0x040E, + 0x0600, 0x0602, 0x0604, 0x0606, 0x0608, 0x060A, 0x060C, 0x060E, + 0x0800, 0x0802, 0x0804, 0x0806, 0x0808, 0x080A, 0x080C, 0x080E + }; + + uint8 *dst = Memory.C4RAM; + uint32 waveptr = Memory.C4RAM[0x1f83]; + uint16 mask1 = 0xc0c0; + uint16 mask2 = 0x3f3f; + +#ifdef DEBUGGER + if (READ_3WORD(Memory.C4RAM + 0x1f80) != Memory.C4RAM[waveptr + 0xb00]) + printf("$7f80=%06x, expected %02x\n", READ_3WORD(Memory.C4RAM + 0x1f80), Memory.C4RAM[waveptr + 0xb00]); +#endif + + for (int j = 0; j < 0x10; j++) + { + do + { + int16 height = -((int8) Memory.C4RAM[waveptr + 0xb00]) - 16; + + for (int i = 0; i < 40; i++) + { + uint16 tmp = READ_WORD(dst + bmpdata[i]) & mask2; + if (height >= 0) + { + if (height < 8) + tmp |= mask1 & READ_WORD(Memory.C4RAM + 0xa00 + height * 2); + else + tmp |= mask1 & 0xff00; + } + + WRITE_WORD(dst + bmpdata[i], tmp); + + height++; + } + + waveptr = (waveptr + 1) & 0x7f; + mask1 = (mask1 >> 2) | (mask1 << 6); + mask2 = (mask2 >> 2) | (mask2 << 6); + } + while (mask1 != 0xc0c0); + + dst += 16; + + do + { + int16 height = -((int8) Memory.C4RAM[waveptr + 0xb00]) - 16; + + for (int i = 0; i < 40; i++) + { + uint16 tmp = READ_WORD(dst + bmpdata[i]) & mask2; + if (height >= 0) + { + if (height < 8) + tmp |= mask1 & READ_WORD(Memory.C4RAM + 0xa10 + height * 2); + else + tmp |= mask1 & 0xff00; + } + + WRITE_WORD(dst + bmpdata[i], tmp); + + height++; + } + + waveptr = (waveptr + 1) & 0x7f; + mask1 = (mask1 >> 2) | (mask1 << 6); + mask2 = (mask2 >> 2) | (mask2 << 6); + } + while (mask1 != 0xc0c0); + + dst += 16; + } +} + +static void C4SprDisintegrate (void) +{ + uint8 *src; + uint8 width, height; + uint32 StartX, StartY; + int32 scaleX, scaleY; + int32 Cx, Cy; + + width = Memory.C4RAM[0x1f89]; + height = Memory.C4RAM[0x1f8c]; + Cx = (int16) READ_WORD(Memory.C4RAM + 0x1f80); + Cy = (int16) READ_WORD(Memory.C4RAM + 0x1f83); + +#ifdef DEBUGGER + if ((Cx & ~1) != width / 2 || (Cy & ~1) != height / 2) + printf("Center is not middle of image for disintegrate! (%d, %d) != (%d, %d)\n", Cx, Cy, width / 2, height / 2); +#endif + + scaleX = (int16) READ_WORD(Memory.C4RAM + 0x1f86); + scaleY = (int16) READ_WORD(Memory.C4RAM + 0x1f8f); + StartX = -Cx * scaleX + (Cx << 8); + StartY = -Cy * scaleY + (Cy << 8); + + src = Memory.C4RAM + 0x600; + + memset(Memory.C4RAM, 0, width * height / 2); + + for (uint32 y = StartY, i = 0; i < height; i++, y += scaleY) + { + for (uint32 x = StartX, j = 0; j < width; j++, x += scaleX) + { + if ((x >> 8) < width && (y >> 8) < height && (y >> 8) * width + (x >> 8) < 0x2000) + { + uint8 pixel = (j & 1) ? (*src >> 4) : *src; + int idx = (y >> 11) * width * 4 + (x >> 11) * 32 + ((y >> 8) & 7) * 2; + uint8 mask = 0x80 >> ((x >> 8) & 7); + + if (pixel & 1) + Memory.C4RAM[idx] |= mask; + if (pixel & 2) + Memory.C4RAM[idx + 1] |= mask; + if (pixel & 4) + Memory.C4RAM[idx + 16] |= mask; + if (pixel & 8) + Memory.C4RAM[idx + 17] |= mask; + } + + if (j & 1) + src++; + } + } +} + +static void C4ProcessSprites (void) +{ + switch (Memory.C4RAM[0x1f4d]) + { + case 0x00: // Build OAM + #ifdef DEBUGGER + //printf("00 00 Build OAM!\n"); + #endif + C4ConvOAM(); + break; + + case 0x03: // Scale/Rotate + #ifdef DEBUGGER + //printf("00 03 Scale/Rotate!\n"); + #endif + C4DoScaleRotate(0); + break; + + case 0x05: // Transform Lines + #ifdef DEBUGGER + //printf("00 05 Transform Lines!\n"); + #endif + C4TransformLines(); + break; + + case 0x07: // Scale/Rotate + #ifdef DEBUGGER + //printf("00 07 Scale/Rotate!\n"); + #endif + C4DoScaleRotate(64); + break; + + case 0x08: // Draw wireframe + #ifdef DEBUGGER + //printf("00 08 Draw wireframe!\n"); + #endif + C4DrawWireFrame(); + break; + + case 0x0b: // Disintegrate + #ifdef DEBUGGER + //printf("00 0b Disintegrate!\n"); + #endif + C4SprDisintegrate(); + break; + + case 0x0c: // Wave + #ifdef DEBUGGER + //printf("00 0b Wave!\n"); + #endif + C4BitPlaneWave(); + break; + + default: + #ifdef DEBUGGER + printf("Unknown C4 sprite command (%02x)\n", Memory.C4RAM[0x1f4d]); + #endif + break; + } +} + +void S9xInitC4 (void) +{ + // Stupid zsnes code, we can't do the logical thing without breaking savestates + // Memory.C4RAM = &Memory.FillRAM [0x6000]; + memset(Memory.C4RAM, 0, 0x2000); +} + +uint8 S9xGetC4 (uint16 Address) +{ + if (Address == 0x7f5e) + return (0); + + return (Memory.C4RAM[Address - 0x6000]); +} + +void S9xSetC4 (uint8 byte, uint16 Address) +{ + Memory.C4RAM[Address - 0x6000] = byte; + + if (Address == 0x7f4f) + { + if (Memory.C4RAM[0x1f4d] == 0x0e && byte < 0x40 && (byte & 3) == 0) + { + #ifdef DEBUGGER + printf("Test command %02x 0e used!\n", byte); + #endif + Memory.C4RAM[0x1f80] = byte >> 2; + } + else + { + switch (byte) + { + case 0x00: // Sprite + #ifdef DEBUGGER + //printf("00 Sprite!\n"); + #endif + C4ProcessSprites(); + break; + + case 0x01: // Draw wireframe + #ifdef DEBUGGER + //printf("01 Draw wireframe!\n"); + if (Memory.C4RAM[0x1f4d] != 8) + printf("$7f4d=%02x, expected 08 for command 01 %02x\n", Memory.C4RAM[0x1f4d], Memory.C4RAM[0x1f4d]); + #endif + memset(Memory.C4RAM + 0x300, 0, 16 * 12 * 3 * 4); + C4DrawWireFrame(); + break; + + case 0x05: // Propulsion (?) + { + #ifdef DEBUGGER + //printf("05 Propulsion (?)!\n"); + if (Memory.C4RAM[0x1f4d] != 2) + printf("$7f4d=%02x, expected 02 for command 05 %02x\n", Memory.C4RAM[0x1f4d], Memory.C4RAM[0x1f4d]); + #endif + int32 tmp = 0x10000; + if (READ_WORD(Memory.C4RAM + 0x1f83)) + tmp = SAR((tmp / READ_WORD(Memory.C4RAM + 0x1f83)) * READ_WORD(Memory.C4RAM + 0x1f81), 8); + + WRITE_WORD(Memory.C4RAM + 0x1f80, (uint16) tmp); + break; + } + + case 0x0d: // Set vector length + #ifdef DEBUGGER + //printf("0d Set vector length!\n"); + if (Memory.C4RAM[0x1f4d] != 2) + printf("$7f4d=%02x, expected 02 for command 0d %02x\n", Memory.C4RAM[0x1f4d], Memory.C4RAM[0x1f4d]); + #endif + C41FXVal = READ_WORD(Memory.C4RAM + 0x1f80); + C41FYVal = READ_WORD(Memory.C4RAM + 0x1f83); + C41FDistVal = READ_WORD(Memory.C4RAM + 0x1f86); + C4Op0D(); + WRITE_WORD(Memory.C4RAM + 0x1f89, C41FXVal); + WRITE_WORD(Memory.C4RAM + 0x1f8c, C41FYVal); + break; + + case 0x10: // Polar to rectangluar + { + #ifdef DEBUGGER + //printf("10 Polar->Rect!\n"); + if (Memory.C4RAM[0x1f4d] != 2) + printf("$7f4d=%02x, expected 02 for command 10 %02x\n", Memory.C4RAM[0x1f4d], Memory.C4RAM[0x1f4d]); + #endif + int32 tmp; + int32 r1; + r1 = READ_WORD(Memory.C4RAM + 0x1f83); + if (r1 & 0x8000) + r1 |= ~0x7fff; + else + r1 &= 0x7fff; + + tmp = SAR(r1 * C4CosTable[READ_WORD(Memory.C4RAM + 0x1f80) & 0x1ff] * 2, 16); + WRITE_3WORD(Memory.C4RAM + 0x1f86, tmp); + tmp = SAR(r1 * C4SinTable[READ_WORD(Memory.C4RAM + 0x1f80) & 0x1ff] * 2, 16); + WRITE_3WORD(Memory.C4RAM + 0x1f89, (tmp - SAR(tmp, 6))); + break; + } + + case 0x13: // Polar to rectangluar + { + #ifdef DEBUGGER + //printf("13 Polar->Rect!\n"); + if (Memory.C4RAM[0x1f4d] != 2) + printf("$7f4d=%02x, expected 02 for command 13 %02x\n", Memory.C4RAM[0x1f4d], Memory.C4RAM[0x1f4d]); + #endif + int32 tmp; + tmp = SAR((int32) READ_WORD(Memory.C4RAM + 0x1f83) * C4CosTable[READ_WORD(Memory.C4RAM + 0x1f80) & 0x1ff] * 2, 8); + WRITE_3WORD(Memory.C4RAM + 0x1f86, tmp); + tmp = SAR((int32) READ_WORD(Memory.C4RAM + 0x1f83) * C4SinTable[READ_WORD(Memory.C4RAM + 0x1f80) & 0x1ff] * 2, 8); + WRITE_3WORD(Memory.C4RAM + 0x1f89, tmp); + break; + } + + case 0x15: // Pythagorean + #ifdef DEBUGGER + //printf("15 Pythagorean!\n"); + if (Memory.C4RAM[0x1f4d] != 2) + printf("$7f4d=%02x, expected 02 for command 15 %02x\n", Memory.C4RAM[0x1f4d], Memory.C4RAM[0x1f4d]); + #endif + C41FXVal = READ_WORD(Memory.C4RAM + 0x1f80); + C41FYVal = READ_WORD(Memory.C4RAM + 0x1f83); + //C4Op15(); // optimized to: + C41FDist = (int16) sqrt((double) C41FXVal * C41FXVal + (double) C41FYVal * C41FYVal); + WRITE_WORD(Memory.C4RAM + 0x1f80, C41FDist); + break; + + case 0x1f: // atan + #ifdef DEBUGGER + //printf("1f atan!\n"); + if (Memory.C4RAM[0x1f4d] != 2) + printf("$7f4d=%02x, expected 02 for command 1f %02x\n", Memory.C4RAM[0x1f4d], Memory.C4RAM[0x1f4d]); + #endif + C41FXVal = READ_WORD(Memory.C4RAM + 0x1f80); + C41FYVal = READ_WORD(Memory.C4RAM + 0x1f83); + C4Op1F(); + WRITE_WORD(Memory.C4RAM + 0x1f86, C41FAngleRes); + break; + + case 0x22: // Trapezoid + { + #ifdef DEBUGGER + //printf("22 Trapezoid!\n"); + if (Memory.C4RAM[0x1f4d] != 2) + printf("$7f4d=%02x, expected 02 for command 22 %02x\n", Memory.C4RAM[0x1f4d], Memory.C4RAM[0x1f4d]); + #endif + int16 angle1 = READ_WORD(Memory.C4RAM + 0x1f8c) & 0x1ff; + int16 angle2 = READ_WORD(Memory.C4RAM + 0x1f8f) & 0x1ff; + + #ifdef DEBUGGER + if (C4CosTable[angle1] == 0) + fprintf(stderr, "22 Trapezoid: Invalid tangent! angle1=%d\n", angle1); + if (C4CosTable[angle2] == 0) + fprintf(stderr, "22 Trapezoid: Invalid tangent! angle2=%d\n", angle2); + #endif + + int32 tan1 = (C4CosTable[angle1] != 0) ? ((((int32) C4SinTable[angle1]) << 16) / C4CosTable[angle1]) : 0x80000000; + int32 tan2 = (C4CosTable[angle2] != 0) ? ((((int32) C4SinTable[angle2]) << 16) / C4CosTable[angle2]) : 0x80000000; + + int16 y = READ_WORD(Memory.C4RAM + 0x1f83) - READ_WORD(Memory.C4RAM + 0x1f89); + int16 left, right; + + for (int j = 0; j < 225; j++) + { + if (y >= 0) + { + left = SAR((int32) tan1 * y, 16) - READ_WORD(Memory.C4RAM + 0x1f80) + READ_WORD(Memory.C4RAM + 0x1f86); + right = SAR((int32) tan2 * y, 16) - READ_WORD(Memory.C4RAM + 0x1f80) + READ_WORD(Memory.C4RAM + 0x1f86) + READ_WORD(Memory.C4RAM + 0x1f93); + + if (left < 0 && right < 0) + { + left = 1; + right = 0; + } + else + if (left < 0) + left = 0; + else + if (right < 0) + right = 0; + + if (left > 255 && right > 255) + { + left = 255; + right = 254; + } + else + if (left > 255) + left = 255; + else + if (right > 255) + right = 255; + } + else + { + left = 1; + right = 0; + } + + Memory.C4RAM[j + 0x800] = (uint8) left; + Memory.C4RAM[j + 0x900] = (uint8) right; + + y++; + } + + break; + } + + case 0x25: // Multiply + { + #ifdef DEBUGGER + //printf("25 Multiply!\n"); + if (Memory.C4RAM[0x1f4d] != 2) + printf("$7f4d=%02x, expected 02 for command 25 %02x\n", Memory.C4RAM[0x1f4d], Memory.C4RAM[0x1f4d]); + #endif + int32 foo = READ_3WORD(Memory.C4RAM + 0x1f80); + int32 bar = READ_3WORD(Memory.C4RAM + 0x1f83); + foo *= bar; + WRITE_3WORD(Memory.C4RAM + 0x1f80, foo); + break; + } + + case 0x2d: // Transform Coords + #ifdef DEBUGGER + //printf("2d Transform Coords!\n"); + if (Memory.C4RAM[0x1f4d] != 2) + printf("$7f4d=%02x, expected 02 for command 2d %02x\n", Memory.C4RAM[0x1f4d], Memory.C4RAM[0x1f4d]); + if (READ_3WORD(Memory.C4RAM + 0x1f8f) & 0xff00ff) + printf("2d transform coords: Unexpected value in $7f8f: %06x\n", READ_3WORD(Memory.C4RAM + 0x1f8f)); + if (READ_3WORD(Memory.C4RAM + 0x1f8c) != 0x001000) + printf("0d transform coords: Unexpected value in $7f8c: %06x\n", READ_3WORD(Memory.C4RAM + 0x1f8c)); + #endif + C4WFXVal = READ_WORD(Memory.C4RAM + 0x1f81); + C4WFYVal = READ_WORD(Memory.C4RAM + 0x1f84); + C4WFZVal = READ_WORD(Memory.C4RAM + 0x1f87); + C4WFX2Val = Memory.C4RAM[0x1f89]; + C4WFY2Val = Memory.C4RAM[0x1f8a]; + C4WFDist = Memory.C4RAM[0x1f8b]; + C4WFScale = READ_WORD(Memory.C4RAM + 0x1f90); + C4TransfWireFrame2(); + WRITE_WORD(Memory.C4RAM + 0x1f80, C4WFXVal); + WRITE_WORD(Memory.C4RAM + 0x1f83, C4WFYVal); + break; + + case 0x40: // Sum + { + #ifdef DEBUGGER + //printf("40 Sum!\n"); + if (Memory.C4RAM[0x1f4d] != 0x0e) + printf("$7f4d=%02x, expected 0e for command 40 %02x\n", Memory.C4RAM[0x1f4d], Memory.C4RAM[0x1f4d]); + #endif + uint16 sum = 0; + for (int i = 0; i < 0x800; sum += Memory.C4RAM[i++]) ; + WRITE_WORD(Memory.C4RAM + 0x1f80, sum); + break; + } + + case 0x54: // Square + { + #ifdef DEBUGGER + //printf("54 Square!\n"); + if (Memory.C4RAM[0x1f4d] != 0x0e) + printf("$7f4d=%02x, expected 0e for command 54 %02x\n", Memory.C4RAM[0x1f4d], Memory.C4RAM[0x1f4d]); + #endif + int64 a = SAR((int64) READ_3WORD(Memory.C4RAM + 0x1f80) << 40, 40); + //printf("%08X%08X\n", (uint32) (a>>32), (uint32) (a&0xFFFFFFFF)); + a *= a; + //printf("%08X%08X\n", (uint32) (a>>32), (uint32) (a&0xFFFFFFFF)); + WRITE_3WORD(Memory.C4RAM + 0x1f83, a); + WRITE_3WORD(Memory.C4RAM + 0x1f86, (a >> 24)); + break; + } + + case 0x5c: // Immediate Reg + #ifdef DEBUGGER + //printf("5c Immediate Reg!\n"); + if (Memory.C4RAM[0x1f4d] != 0x0e) + printf("$7f4d=%02x, expected 0e for command 5c %02x\n", Memory.C4RAM[0x1f4d], Memory.C4RAM[0x1f4d]); + #endif + for (int i = 0; i < 12 * 4; i++) + Memory.C4RAM[i] = C4TestPattern[i]; + break; + + case 0x89: // Immediate ROM + #ifdef DEBUGGER + //printf("89 Immediate ROM!\n"); + if (Memory.C4RAM[0x1f4d] != 0x0e) + printf("$7f4d=%02x, expected 0e for command 89 %02x\n", Memory.C4RAM[0x1f4d], Memory.C4RAM[0x1f4d]); + #endif + Memory.C4RAM[0x1f80] = 0x36; + Memory.C4RAM[0x1f81] = 0x43; + Memory.C4RAM[0x1f82] = 0x05; + break; + + default: + #ifdef DEBUGGER + printf("Unknown C4 command (%02x)\n", byte); + #endif + break; + } + } + } + else + if (Address == 0x7f47) + { + #ifdef DEBUGGER + //printf("C4 load memory %06x => %04x, %04x bytes\n", READ_3WORD(Memory.C4RAM + 0x1f40), READ_WORD(Memory.C4RAM + 0x1f45), READ_WORD(Memory.C4RAM + 0x1f43)); + if (byte != 0) + printf("C4 load: non-0 written to $7f47! Wrote %02x\n", byte); + if (READ_WORD(Memory.C4RAM + 0x1f45) < 0x6000 || (READ_WORD(Memory.C4RAM + 0x1f45) + READ_WORD(Memory.C4RAM + 0x1f43)) > 0x6c00) + printf("C4 load: Dest unusual! It's %04x\n", READ_WORD(Memory.C4RAM + 0x1f45)); + #endif + memmove(Memory.C4RAM + (READ_WORD(Memory.C4RAM + 0x1f45) & 0x1fff), C4GetMemPointer(READ_3WORD(Memory.C4RAM + 0x1f40)), READ_WORD(Memory.C4RAM + 0x1f43)); + } +} diff --git a/plugins/snes9x_gx/source/snes9x/cheats.cpp b/plugins/snes9x_gx/source/snes9x/cheats.cpp new file mode 100644 index 00000000..e4d648d0 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/cheats.cpp @@ -0,0 +1,578 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#include <ctype.h> +#include "snes9x.h" +#include "memmap.h" +#include "cheats.h" + +#define WRAM_BITS ALL_BITS +#define SRAM_BITS ALL_BITS + (0x20000 >> 5) +#define IRAM_BITS ALL_BITS + (0x30000 >> 5) + +#define BIT_CLEAR(a, v) (a)[(v) >> 5] &= ~(1 << ((v) & 31)) + +#define TEST_BIT(a, v) ((a)[(v) >> 5] & (1 << ((v) & 31))) + +#define _S9XCHTC(c, a, b) \ + ((c) == S9X_LESS_THAN ? (a) < (b) : \ + (c) == S9X_GREATER_THAN ? (a) > (b) : \ + (c) == S9X_LESS_THAN_OR_EQUAL ? (a) <= (b) : \ + (c) == S9X_GREATER_THAN_OR_EQUAL ? (a) >= (b) : \ + (c) == S9X_EQUAL ? (a) == (b) : \ + (a) != (b)) + +#define _S9XCHTD(s, m, o) \ + ((s) == S9X_8_BITS ? ((uint8) (*((m) + (o)))) : \ + (s) == S9X_16_BITS ? ((uint16) (*((m) + (o)) + (*((m) + (o) + 1) << 8))) : \ + (s) == S9X_24_BITS ? ((uint32) (*((m) + (o)) + (*((m) + (o) + 1) << 8) + (*((m) + (o) + 2) << 16))) : \ + ((uint32) (*((m) + (o)) + (*((m) + (o) + 1) << 8) + (*((m) + (o) + 2) << 16) + (*((m) + (o) + 3) << 24)))) + +#define _S9XCHTDS(s, m, o) \ + ((s) == S9X_8_BITS ? ((int8) (*((m) + (o)))) : \ + (s) == S9X_16_BITS ? ((int16) (*((m) + (o)) + (*((m) + (o) + 1) << 8))) : \ + (s) == S9X_24_BITS ? (((int32) ((*((m) + (o)) + (*((m) + (o) + 1) << 8) + (*((m) + (o) + 2) << 16)) << 8)) >> 8): \ + ((int32) (*((m) + (o)) + (*((m) + (o) + 1) << 8) + (*((m) + (o) + 2) << 16) + (*((m) + (o) + 3) << 24)))) + +static bool8 S9xAllHex (const char *, int); + + +static bool8 S9xAllHex (const char *code, int len) +{ + for (int i = 0; i < len; i++) + if ((code[i] < '0' || code[i] > '9') && (code[i] < 'a' || code[i] > 'f') && (code[i] < 'A' || code[i] > 'F')) + return (FALSE); + + return (TRUE); +} + +const char * S9xProActionReplayToRaw (const char *code, uint32 &address, uint8 &byte) +{ + uint32 data = 0; + + if (strlen(code) != 8 || !S9xAllHex(code, 8) || sscanf(code, "%x", &data) != 1) + return ("Invalid Pro Action Replay code - should be 8 hex digits in length."); + + address = data >> 8; + byte = (uint8) data; + + return (NULL); +} + +const char * S9xGoldFingerToRaw (const char *code, uint32 &address, bool8 &sram, uint8 &num_bytes, uint8 bytes[3]) +{ + char tmp[15]; + int i; + + if (strlen(code) != 14) + return ("Invalid Gold Finger code - should be 14 hex digits in length."); + + strncpy(tmp, code, 5); + tmp[5] = 0; + if (sscanf(tmp, "%x", &address) != 1) + return ("Invalid Gold Finger code."); + + for (i = 0; i < 3; i++) + { + unsigned int byte; + + strncpy(tmp, code + 5 + i * 2, 2); + tmp[2] = 0; + if (sscanf(tmp, "%x", &byte) != 1) + break; + bytes[i] = (uint8) byte; + } + + num_bytes = i; + sram = code[13] == '1'; + + return (NULL); +} + +const char * S9xGameGenieToRaw (const char *code, uint32 &address, uint8 &byte) +{ + char new_code[12]; + + if (strlen(code) != 9 || *(code + 4) != '-' || !S9xAllHex(code, 4) || !S9xAllHex(code + 5, 4)) + return ("Invalid Game Genie(tm) code - should be 'xxxx-xxxx'."); + + strcpy(new_code, "0x"); + strncpy(new_code + 2, code, 4); + strcpy(new_code + 6, code + 5); + + static const char *real_hex = "0123456789ABCDEF"; + static const char *genie_hex = "DF4709156BC8A23E"; + + for (int i = 2; i < 10; i++) + { + if (islower(new_code[i])) + new_code[i] = toupper(new_code[i]); + + int j; + for (j = 0; j < 16; j++) + { + if (new_code[i] == genie_hex[j]) + { + new_code[i] = real_hex[j]; + break; + } + } + + if (j == 16) + return ("Invalid hex-character in Game Genie(tm) code."); + } + + uint32 data = 0; + sscanf(new_code, "%x", &data); + byte = (uint8) (data >> 24); + address = data & 0xffffff; + address = ((address & 0x003c00) << 10) + + ((address & 0x00003c) << 14) + + ((address & 0xf00000) >> 8) + + ((address & 0x000003) << 10) + + ((address & 0x00c000) >> 6) + + ((address & 0x0f0000) >> 12) + + ((address & 0x0003c0) >> 6); + + return (NULL); +} + +void S9xStartCheatSearch (SCheatData *d) +{ + memmove(d->CWRAM, d->RAM, 0x20000); + memmove(d->CSRAM, d->SRAM, 0x10000); + memmove(d->CIRAM, &d->FillRAM[0x3000], 0x2000); + memset((char *) d->ALL_BITS, 0xff, 0x32000 >> 3); +} + +void S9xSearchForChange (SCheatData *d, S9xCheatComparisonType cmp, S9xCheatDataSize size, bool8 is_signed, bool8 update) +{ + int l, i; + + switch (size) + { + case S9X_8_BITS: l = 0; break; + case S9X_16_BITS: l = 1; break; + case S9X_24_BITS: l = 2; break; + default: + case S9X_32_BITS: l = 3; break; + } + + if (is_signed) + { + for (i = 0; i < 0x20000 - l; i++) + { + if (TEST_BIT(d->WRAM_BITS, i) && _S9XCHTC(cmp, _S9XCHTDS(size, d->RAM, i), _S9XCHTDS(size, d->CWRAM, i))) + { + if (update) + d->CWRAM[i] = d->RAM[i]; + } + else + BIT_CLEAR(d->WRAM_BITS, i); + } + + for (i = 0; i < 0x10000 - l; i++) + { + if (TEST_BIT(d->SRAM_BITS, i) && _S9XCHTC(cmp, _S9XCHTDS(size, d->SRAM, i), _S9XCHTDS(size, d->CSRAM, i))) + { + if (update) + d->CSRAM[i] = d->SRAM[i]; + } + else + BIT_CLEAR(d->SRAM_BITS, i); + } + + for (i = 0; i < 0x2000 - l; i++) + { + if (TEST_BIT(d->IRAM_BITS, i) && _S9XCHTC(cmp, _S9XCHTDS(size, d->FillRAM + 0x3000, i), _S9XCHTDS(size, d->CIRAM, i))) + { + if (update) + d->CIRAM[i] = d->FillRAM[i + 0x3000]; + } + else + BIT_CLEAR(d->IRAM_BITS, i); + } + } + else + { + for (i = 0; i < 0x20000 - l; i++) + { + if (TEST_BIT(d->WRAM_BITS, i) && _S9XCHTC(cmp, _S9XCHTD(size, d->RAM, i), _S9XCHTD(size, d->CWRAM, i))) + { + if (update) + d->CWRAM[i] = d->RAM[i]; + } + else + BIT_CLEAR(d->WRAM_BITS, i); + } + + for (i = 0; i < 0x10000 - l; i++) + { + if (TEST_BIT(d->SRAM_BITS, i) && _S9XCHTC(cmp, _S9XCHTD(size, d->SRAM, i), _S9XCHTD(size, d->CSRAM, i))) + { + if (update) + d->CSRAM[i] = d->SRAM[i]; + } + else + BIT_CLEAR(d->SRAM_BITS, i); + } + + for (i = 0; i < 0x2000 - l; i++) + { + if (TEST_BIT(d->IRAM_BITS, i) && _S9XCHTC(cmp, _S9XCHTD(size, d->FillRAM + 0x3000, i), _S9XCHTD(size, d->CIRAM, i))) + { + if (update) + d->CIRAM[i] = d->FillRAM[i + 0x3000]; + } + else + BIT_CLEAR(d->IRAM_BITS, i); + } + } + + for (i = 0x20000 - l; i < 0x20000; i++) + BIT_CLEAR(d->WRAM_BITS, i); + + for (i = 0x10000 - l; i < 0x10000; i++) + BIT_CLEAR(d->SRAM_BITS, i); +} + +void S9xSearchForValue (SCheatData *d, S9xCheatComparisonType cmp, S9xCheatDataSize size, uint32 value, bool8 is_signed, bool8 update) +{ + int l, i; + + switch (size) + { + case S9X_8_BITS: l = 0; break; + case S9X_16_BITS: l = 1; break; + case S9X_24_BITS: l = 2; break; + default: + case S9X_32_BITS: l = 3; break; + } + + if (is_signed) + { + for (i = 0; i < 0x20000 - l; i++) + { + if (TEST_BIT(d->WRAM_BITS, i) && _S9XCHTC(cmp, _S9XCHTDS(size, d->RAM, i), (int32) value)) + { + if (update) + d->CWRAM[i] = d->RAM[i]; + } + else + BIT_CLEAR(d->WRAM_BITS, i); + } + + for (i = 0; i < 0x10000 - l; i++) + { + if (TEST_BIT(d->SRAM_BITS, i) && _S9XCHTC(cmp, _S9XCHTDS(size, d->SRAM, i), (int32) value)) + { + if (update) + d->CSRAM[i] = d->SRAM[i]; + } + else + BIT_CLEAR(d->SRAM_BITS, i); + } + + for (i = 0; i < 0x2000 - l; i++) + { + if (TEST_BIT(d->IRAM_BITS, i) && _S9XCHTC(cmp, _S9XCHTDS(size, d->FillRAM + 0x3000, i), (int32) value)) + { + if (update) + d->CIRAM[i] = d->FillRAM[i + 0x3000]; + } + else + BIT_CLEAR(d->IRAM_BITS, i); + } + } + else + { + for (i = 0; i < 0x20000 - l; i++) + { + if (TEST_BIT(d->WRAM_BITS, i) && _S9XCHTC(cmp, _S9XCHTD(size, d->RAM, i), value)) + { + if (update) + d->CWRAM[i] = d->RAM[i]; + } + else + BIT_CLEAR(d->WRAM_BITS, i); + } + + for (i = 0; i < 0x10000 - l; i++) + { + if (TEST_BIT(d->SRAM_BITS, i) && _S9XCHTC(cmp, _S9XCHTD(size, d->SRAM, i), value)) + { + if (update) + d->CSRAM[i] = d->SRAM[i]; + } + else + BIT_CLEAR(d->SRAM_BITS, i); + } + + for (i = 0; i < 0x2000 - l; i++) + { + if (TEST_BIT(d->IRAM_BITS, i) && _S9XCHTC(cmp, _S9XCHTD(size, d->FillRAM + 0x3000, i), value)) + { + if (update) + d->CIRAM[i] = d->FillRAM[i + 0x3000]; + } + else + BIT_CLEAR(d->IRAM_BITS, i); + } + } + + for (i = 0x20000 - l; i < 0x20000; i++) + BIT_CLEAR(d->WRAM_BITS, i); + + for (i = 0x10000 - l; i < 0x10000; i++) + BIT_CLEAR(d->SRAM_BITS, i); +} + +void S9xSearchForAddress (SCheatData *d, S9xCheatComparisonType cmp, S9xCheatDataSize size, uint32 value, bool8 update) +{ + int l, i; + + switch (size) + { + case S9X_8_BITS: l = 0; break; + case S9X_16_BITS: l = 1; break; + case S9X_24_BITS: l = 2; break; + default: + case S9X_32_BITS: l = 3; break; + } + + for (i = 0; i < 0x20000 - l; i++) + { + if (TEST_BIT(d->WRAM_BITS, i) && _S9XCHTC(cmp, i, (int32) value)) + { + if (update) + d->CWRAM[i] = d->RAM[i]; + } + else + BIT_CLEAR(d->WRAM_BITS, i); + } + + for (i = 0; i < 0x10000 - l; i++) + { + if (TEST_BIT(d->SRAM_BITS, i) && _S9XCHTC(cmp, i + 0x20000, (int32) value)) + { + if (update) + d->CSRAM[i] = d->SRAM[i]; + } + else + BIT_CLEAR(d->SRAM_BITS, i); + } + + for (i = 0; i < 0x2000 - l; i++) + { + if (TEST_BIT(d->IRAM_BITS, i) && _S9XCHTC(cmp, i + 0x30000, (int32) value)) + { + if (update) + d->CIRAM[i] = d->FillRAM[i + 0x3000]; + } + else + BIT_CLEAR(d->IRAM_BITS, i); + } + + for (i = 0x20000 - l; i < 0x20000; i++) + BIT_CLEAR(d->WRAM_BITS, i); + + for (i = 0x10000 - l; i < 0x10000; i++) + BIT_CLEAR(d->SRAM_BITS, i); +} + +void S9xOutputCheatSearchResults (SCheatData *d) +{ + int i; + + for (i = 0; i < 0x20000; i++) + { + if (TEST_BIT(d->WRAM_BITS, i)) + printf("WRAM: %05x: %02x\n", i, d->RAM[i]); + } + + for (i = 0; i < 0x10000; i++) + { + if (TEST_BIT(d->SRAM_BITS, i)) + printf("SRAM: %04x: %02x\n", i, d->SRAM[i]); + } + + for (i = 0; i < 0x2000; i++) + { + if (TEST_BIT(d->IRAM_BITS, i)) + printf("IRAM: %05x: %02x\n", i, d->FillRAM[i + 0x3000]); + } +} diff --git a/plugins/snes9x_gx/source/snes9x/cheats.h b/plugins/snes9x_gx/source/snes9x/cheats.h new file mode 100644 index 00000000..51ed71fb --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/cheats.h @@ -0,0 +1,262 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _CHEATS_H_ +#define _CHEATS_H_ + +#define MAX_CHEATS 150 + +struct SCheat +{ + uint32 address; + uint8 byte; + uint8 saved_byte; + bool8 enabled; + bool8 saved; + char name[22]; +}; + +struct SCheatData +{ + struct SCheat c[MAX_CHEATS]; + uint32 num_cheats; + uint8 CWRAM[0x20000]; + uint8 CSRAM[0x10000]; + uint8 CIRAM[0x2000]; + uint8 *RAM; + uint8 *FillRAM; + uint8 *SRAM; + uint32 ALL_BITS[0x32000 >> 5]; + uint8 CWatchRAM[0x32000]; +}; + +struct Watch +{ + bool on; + int size; + int format; + uint32 address; + char buf[12]; + char desc[32]; +}; + +typedef enum +{ + S9X_LESS_THAN, + S9X_GREATER_THAN, + S9X_LESS_THAN_OR_EQUAL, + S9X_GREATER_THAN_OR_EQUAL, + S9X_EQUAL, + S9X_NOT_EQUAL +} S9xCheatComparisonType; + +typedef enum +{ + S9X_8_BITS, + S9X_16_BITS, + S9X_24_BITS, + S9X_32_BITS +} S9xCheatDataSize; + +extern SCheatData Cheat; +extern Watch watches[16]; + +void S9xApplyCheat (uint32); +void S9xApplyCheats (void); +void S9xRemoveCheat (uint32); +void S9xRemoveCheats (void); +void S9xDeleteCheat (uint32); +void S9xDeleteCheats (void); +void S9xEnableCheat (uint32); +void S9xDisableCheat (uint32); +void S9xAddCheat (bool8, bool8, uint32, uint8); +void S9xInitCheatData (void); +void S9xInitWatchedAddress (void); +bool8 S9xLoadCheatFile (const char *); +bool8 S9xSaveCheatFile (const char *); + +void S9xStartCheatSearch (SCheatData *); +void S9xSearchForChange (SCheatData *, S9xCheatComparisonType, S9xCheatDataSize, bool8, bool8); +void S9xSearchForValue (SCheatData *, S9xCheatComparisonType, S9xCheatDataSize, uint32, bool8, bool8); +void S9xSearchForAddress (SCheatData *, S9xCheatComparisonType, S9xCheatDataSize, uint32, bool8); +void S9xOutputCheatSearchResults (SCheatData *); + +const char * S9xGameGenieToRaw (const char *, uint32 &, uint8 &); +const char * S9xProActionReplayToRaw (const char *, uint32 &, uint8 &); +const char * S9xGoldFingerToRaw (const char *, uint32 &, bool8 &, uint8 &, uint8 bytes[3]); + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/cheats2.cpp b/plugins/snes9x_gx/source/snes9x/cheats2.cpp new file mode 100644 index 00000000..d174c5cf --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/cheats2.cpp @@ -0,0 +1,406 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#include "snes9x.h" +#include "memmap.h" +#include "cheats.h" + +static uint8 S9xGetByteFree (uint32); +static void S9xSetByteFree (uint8, uint32); + + +static uint8 S9xGetByteFree (uint32 address) +{ + uint32 Cycles = CPU.Cycles; + uint32 WaitAddress = CPU.WaitAddress; + uint8 byte; + + byte = S9xGetByte(address); + + CPU.WaitAddress = WaitAddress; + CPU.Cycles = Cycles; + + return (byte); +} + +static void S9xSetByteFree (uint8 byte, uint32 address) +{ + uint32 Cycles = CPU.Cycles; + uint32 WaitAddress = CPU.WaitAddress; + + S9xSetByte(byte, address); + + CPU.WaitAddress = WaitAddress; + CPU.Cycles = Cycles; +} + +void S9xInitWatchedAddress (void) +{ + for (unsigned int i = 0; i < sizeof(watches) / sizeof(watches[0]); i++) + watches[i].on = false; + +} + +void S9xInitCheatData (void) +{ + Cheat.RAM = Memory.RAM; + Cheat.SRAM = Memory.SRAM; + Cheat.FillRAM = Memory.FillRAM; +} + +void S9xAddCheat (bool8 enable, bool8 save_current_value, uint32 address, uint8 byte) +{ + if (Cheat.num_cheats < sizeof(Cheat.c) / sizeof(Cheat.c[0])) + { + Cheat.c[Cheat.num_cheats].address = address; + Cheat.c[Cheat.num_cheats].byte = byte; + Cheat.c[Cheat.num_cheats].enabled = enable; + + if (save_current_value) + { + Cheat.c[Cheat.num_cheats].saved_byte = S9xGetByteFree(address); + Cheat.c[Cheat.num_cheats].saved = TRUE; + } + + Cheat.num_cheats++; + } +} + +void S9xDeleteCheat (uint32 which1) +{ + if (which1 < Cheat.num_cheats) + { + if (Cheat.c[which1].enabled) + S9xRemoveCheat(which1); + + memmove(&Cheat.c[which1], &Cheat.c[which1 + 1], sizeof(Cheat.c[0]) * (Cheat.num_cheats - which1 - 1)); + + Cheat.num_cheats--; + } +} + +void S9xDeleteCheats (void) +{ + S9xRemoveCheats(); + Cheat.num_cheats = 0; +} + +void S9xRemoveCheat (uint32 which1) +{ + if (Cheat.c[which1].saved) + { + uint32 address = Cheat.c[which1].address; + + int block = (address & 0xffffff) >> MEMMAP_SHIFT; + uint8 *ptr = Memory.Map[block]; + + if (ptr >= (uint8 *) CMemory::MAP_LAST) + *(ptr + (address & 0xffff)) = Cheat.c[which1].saved_byte; + else + S9xSetByteFree(Cheat.c[which1].saved_byte, address); + } +} + +void S9xRemoveCheats (void) +{ + for (uint32 i = 0; i < Cheat.num_cheats; i++) + if (Cheat.c[i].enabled) + S9xRemoveCheat(i); +} + +void S9xEnableCheat (uint32 which1) +{ + if (which1 < Cheat.num_cheats && !Cheat.c[which1].enabled) + { + Cheat.c[which1].enabled = TRUE; + S9xApplyCheat(which1); + } +} + +void S9xDisableCheat (uint32 which1) +{ + if (which1 < Cheat.num_cheats && Cheat.c[which1].enabled) + { + S9xRemoveCheat(which1); + Cheat.c[which1].enabled = FALSE; + } +} + +void S9xApplyCheat (uint32 which1) +{ + uint32 address = Cheat.c[which1].address; + + if (!Cheat.c[which1].saved) + { + Cheat.c[which1].saved_byte = S9xGetByteFree(address); + Cheat.c[which1].saved = TRUE; + } + + int block = (address & 0xffffff) >> MEMMAP_SHIFT; + uint8 *ptr = Memory.Map[block]; + + if (ptr >= (uint8 *) CMemory::MAP_LAST) + *(ptr + (address & 0xffff)) = Cheat.c[which1].byte; + else + S9xSetByteFree(Cheat.c[which1].byte, address); +} + +void S9xApplyCheats (void) +{ + if (Settings.ApplyCheats) + { + for (uint32 i = 0; i < Cheat.num_cheats; i++) + if (Cheat.c[i].enabled) + S9xApplyCheat(i); + } +} + +bool8 S9xLoadCheatFile (const char *filename) +{ + FILE *fs; + uint8 data[28]; + + Cheat.num_cheats = 0; + + fs = fopen(filename, "rb"); + if (!fs) + return (FALSE); + + while (fread((void *) data, 1, 28, fs) == 28) + { + Cheat.c[Cheat.num_cheats].enabled = (data[0] & 4) == 0; + Cheat.c[Cheat.num_cheats].byte = data[1]; + Cheat.c[Cheat.num_cheats].address = data[2] | (data[3] << 8) | (data[4] << 16); + Cheat.c[Cheat.num_cheats].saved_byte = data[5]; + Cheat.c[Cheat.num_cheats].saved = (data[0] & 8) != 0; + memmove(Cheat.c[Cheat.num_cheats].name, &data[8], 20); + Cheat.c[Cheat.num_cheats++].name[20] = 0; + } + + fclose(fs); + + return (TRUE); +} + +bool8 S9xSaveCheatFile (const char *filename) +{ + if (Cheat.num_cheats == 0) + { + remove(filename); + return (TRUE); + } + + FILE *fs; + uint8 data[28]; + + fs = fopen(filename, "wb"); + if (!fs) + return (FALSE); + + for (uint32 i = 0; i < Cheat.num_cheats; i++) + { + ZeroMemory(data, 28); + + if (i == 0) + { + data[6] = 254; + data[7] = 252; + } + + if (!Cheat.c[i].enabled) + data[0] |= 4; + + if (Cheat.c[i].saved) + data[0] |= 8; + + data[1] = Cheat.c[i].byte; + data[2] = (uint8) (Cheat.c[i].address >> 0); + data[3] = (uint8) (Cheat.c[i].address >> 8); + data[4] = (uint8) (Cheat.c[i].address >> 16); + data[5] = Cheat.c[i].saved_byte; + + memmove(&data[8], Cheat.c[i].name, 19); + + if (fwrite(data, 28, 1, fs) != 1) + { + fclose(fs); + return (FALSE); + } + } + + return (fclose(fs) == 0); +} diff --git a/plugins/snes9x_gx/source/snes9x/clip.cpp b/plugins/snes9x_gx/source/snes9x/clip.cpp new file mode 100644 index 00000000..8e6baa35 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/clip.cpp @@ -0,0 +1,405 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#include "snes9x.h" +#include "memmap.h" + +static uint8 region_map[6][6] = +{ + { 0, 0x01, 0x03, 0x07, 0x0f, 0x1f }, + { 0, 0, 0x02, 0x06, 0x0e, 0x1e }, + { 0, 0, 0, 0x04, 0x0c, 0x1c }, + { 0, 0, 0, 0, 0x08, 0x18 }, + { 0, 0, 0, 0, 0, 0x10 } +}; + +static inline uint8 CalcWindowMask (int, uint8, uint8); +static inline void StoreWindowRegions (uint8, struct ClipData *, int, int16 *, uint8 *, bool8, bool8 s = FALSE); + + +static inline uint8 CalcWindowMask (int i, uint8 W1, uint8 W2) +{ + if (!PPU.ClipWindow1Enable[i]) + { + if (!PPU.ClipWindow2Enable[i]) + return (0); + else + { + if (!PPU.ClipWindow2Inside[i]) + return (~W2); + return (W2); + } + } + else + { + if (!PPU.ClipWindow2Enable[i]) + { + if (!PPU.ClipWindow1Inside[i]) + return (~W1); + return (W1); + } + else + { + if (!PPU.ClipWindow1Inside[i]) + W1 = ~W1; + if (!PPU.ClipWindow2Inside[i]) + W2 = ~W2; + + switch (PPU.ClipWindowOverlapLogic[i]) + { + case 0: // OR + return (W1 | W2); + + case 1: // AND + return (W1 & W2); + + case 2: // XOR + return (W1 ^ W2); + + case 3: // XNOR + return (~(W1 ^ W2)); + } + } + } + + // Never get here + return (0); +} + +static inline void StoreWindowRegions (uint8 Mask, struct ClipData *Clip, int n_regions, int16 *windows, uint8 *drawing_modes, bool8 sub, bool8 StoreMode0) +{ + int ct = 0; + + for (int j = 0; j < n_regions; j++) + { + int DrawMode = drawing_modes[j]; + if (sub) + DrawMode |= 1; + if (Mask & (1 << j)) + DrawMode = 0; + + if (!StoreMode0 && !DrawMode) + continue; + + if (ct > 0 && Clip->Right[ct - 1] == windows[j] && Clip->DrawMode[ct - 1] == DrawMode) + Clip->Right[ct - 1] = windows[j + 1]; // This region borders with and has the same drawing mode as the previous region: merge them. + else + { + // Add a new region to the BG + Clip->Left[ct] = windows[j]; + Clip->Right[ct] = windows[j + 1]; + Clip->DrawMode[ct] = DrawMode; + ct++; + } + } + + Clip->Count = ct; +} + +void S9xComputeClipWindows (void) +{ + int16 windows[6] = { 0, 256, 256, 256, 256, 256 }; + uint8 drawing_modes[5] = { 0, 0, 0, 0, 0 }; + int n_regions = 1; + int i, j; + + // Calculate window regions. We have at most 5 regions, because we have 6 control points + // (screen edges, window 1 left & right, and window 2 left & right). + + if (PPU.Window1Left <= PPU.Window1Right) + { + if (PPU.Window1Left > 0) + { + windows[2] = 256; + windows[1] = PPU.Window1Left; + n_regions = 2; + } + + if (PPU.Window1Right < 255) + { + windows[n_regions + 1] = 256; + windows[n_regions] = PPU.Window1Right + 1; + n_regions++; + } + } + + if (PPU.Window2Left <= PPU.Window2Right) + { + for (i = 0; i <= n_regions; i++) + { + if (PPU.Window2Left == windows[i]) + break; + + if (PPU.Window2Left < windows[i]) + { + for (j = n_regions; j >= i; j--) + windows[j + 1] = windows[j]; + + windows[i] = PPU.Window2Left; + n_regions++; + break; + } + } + + for (; i <= n_regions; i++) + { + if (PPU.Window2Right + 1 == windows[i]) + break; + + if (PPU.Window2Right + 1 < windows[i]) + { + for (j = n_regions; j >= i; j--) + windows[j + 1] = windows[j]; + + windows[i] = PPU.Window2Right + 1; + n_regions++; + break; + } + } + } + + // Get a bitmap of which regions correspond to each window. + + uint8 W1, W2; + + if (PPU.Window1Left <= PPU.Window1Right) + { + for (i = 0; windows[i] != PPU.Window1Left; i++) ; + for (j = i; windows[j] != PPU.Window1Right + 1; j++) ; + W1 = region_map[i][j]; + } + else + W1 = 0; + + if (PPU.Window2Left <= PPU.Window2Right) + { + for (i = 0; windows[i] != PPU.Window2Left; i++) ; + for (j = i; windows[j] != PPU.Window2Right + 1; j++) ; + W2 = region_map[i][j]; + } + else + W2 = 0; + + // Color Window affects the drawing mode for each region. + // Modes are: 3=Draw as normal, 2=clip color (math only), 1=no math (draw only), 0=nothing. + + uint8 CW_color = 0, CW_math = 0; + uint8 CW = CalcWindowMask(5, W1, W2); + + switch (Memory.FillRAM[0x2130] & 0xc0) + { + case 0x00: CW_color = 0; break; + case 0x40: CW_color = ~CW; break; + case 0x80: CW_color = CW; break; + case 0xc0: CW_color = 0xff; break; + } + + switch (Memory.FillRAM[0x2130] & 0x30) + { + case 0x00: CW_math = 0; break; + case 0x10: CW_math = ~CW; break; + case 0x20: CW_math = CW; break; + case 0x30: CW_math = 0xff; break; + } + + for (i = 0; i < n_regions; i++) + { + if (!(CW_color & (1 << i))) + drawing_modes[i] |= 1; + if (!(CW_math & (1 << i))) + drawing_modes[i] |= 2; + } + + // Store backdrop clip window (draw everywhere color window allows) + + StoreWindowRegions(0, &IPPU.Clip[0][5], n_regions, windows, drawing_modes, FALSE, TRUE); + StoreWindowRegions(0, &IPPU.Clip[1][5], n_regions, windows, drawing_modes, TRUE, TRUE); + + // Store per-BG and OBJ clip windows + + for (j = 0; j < 5; j++) + { + uint8 W = Settings.DisableGraphicWindows ? 0 : CalcWindowMask(j, W1, W2); + for (int sub = 0; sub < 2; sub++) + { + if (Memory.FillRAM[sub + 0x212e] & (1 << j)) + StoreWindowRegions(W, &IPPU.Clip[sub][j], n_regions, windows, drawing_modes, sub); + else + StoreWindowRegions(0, &IPPU.Clip[sub][j], n_regions, windows, drawing_modes, sub); + } + } +} diff --git a/plugins/snes9x_gx/source/snes9x/controls.cpp b/plugins/snes9x_gx/source/snes9x/controls.cpp new file mode 100644 index 00000000..b94a4021 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/controls.cpp @@ -0,0 +1,3710 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#include <map> +#include <set> +#include <vector> +#include <string> +#include <algorithm> +#include <assert.h> + +#include "snes9x.h" +#include "memmap.h" +#include "apu/apu.h" +#include "snapshot.h" +#include "controls.h" +#include "crosshairs.h" +#include "movie.h" +#include "display.h" +#ifdef NETPLAY_SUPPORT +#include "netplay.h" +#endif + +#ifdef GEKKO +#include "../snes9xgx.h" +#endif + +using namespace std; + +#define NONE (-2) +#define MP5 (-1) +#define JOYPAD0 0 +#define JOYPAD1 1 +#define JOYPAD2 2 +#define JOYPAD3 3 +#define JOYPAD4 4 +#define JOYPAD5 5 +#define JOYPAD6 6 +#define JOYPAD7 7 +#define MOUSE0 8 +#define MOUSE1 9 +#define SUPERSCOPE 10 +#define ONE_JUSTIFIER 11 +#define TWO_JUSTIFIERS 12 +#define NUMCTLS 13 // This must be LAST + +#define POLL_ALL NUMCTLS + +#define SUPERSCOPE_FIRE 0x80 +#define SUPERSCOPE_CURSOR 0x40 +#define SUPERSCOPE_TURBO 0x20 +#define SUPERSCOPE_PAUSE 0x10 +#define SUPERSCOPE_OFFSCREEN 0x02 + +#define JUSTIFIER_TRIGGER 0x80 +#define JUSTIFIER_START 0x20 +#define JUSTIFIER_SELECT 0x08 + +#define MAP_UNKNOWN (-1) +#define MAP_NONE 0 +#define MAP_BUTTON 1 +#define MAP_AXIS 2 +#define MAP_POINTER 3 + +#define FLAG_IOBIT0 (Memory.FillRAM[0x4213] & 0x40) +#define FLAG_IOBIT1 (Memory.FillRAM[0x4213] & 0x80) +#define FLAG_IOBIT(n) ((n) ? (FLAG_IOBIT1) : (FLAG_IOBIT0)) + +bool8 pad_read = 0, pad_read_last = 0; +uint8 read_idx[2 /* ports */][2 /* per port */]; + +struct exemulti +{ + int32 pos; + bool8 data1; + s9xcommand_t *script; +}; + +struct crosshair +{ + uint8 set; + uint8 img; + uint8 fg, bg; +}; + +static struct +{ + int16 x, y; + int16 V_adj; + bool8 V_var; + int16 H_adj; + bool8 H_var; + bool8 mapped; +} pseudopointer[8]; + +static struct +{ + uint16 buttons; + uint16 turbos; + uint16 toggleturbo; + uint16 togglestick; + uint8 turbo_ct; +} joypad[8]; + +static struct +{ + uint8 delta_x, delta_y; + int16 old_x, old_y; + int16 cur_x, cur_y; + uint8 buttons; + uint32 ID; + struct crosshair crosshair; +} mouse[2]; + +static struct +{ + int16 x, y; + uint8 phys_buttons; + uint8 next_buttons; + uint8 read_buttons; + uint32 ID; + struct crosshair crosshair; +} superscope; + +static struct +{ + int16 x[2], y[2]; + uint8 buttons; + bool8 offscreen[2]; + uint32 ID[2]; + struct crosshair crosshair[2]; +} justifier; + +static struct +{ + int8 pads[4]; +} mp5[2]; + +static set<struct exemulti *> exemultis; +static set<uint32> pollmap[NUMCTLS + 1]; +static map<uint32, s9xcommand_t> keymap; +static vector<s9xcommand_t *> multis; +static uint8 turbo_time; +static uint8 pseudobuttons[256]; +static bool8 FLAG_LATCH = FALSE; +static int32 curcontrollers[2] = { NONE, NONE }; +static int32 newcontrollers[2] = { JOYPAD0, NONE }; +static char buf[256]; + +static const char *color_names[32] = +{ + "Trans", + "Black", + "25Grey", + "50Grey", + "75Grey", + "White", + "Red", + "Orange", + "Yellow", + "Green", + "Cyan", + "Sky", + "Blue", + "Violet", + "MagicPink", + "Purple", + NULL, + "tBlack", + "t25Grey", + "t50Grey", + "t75Grey", + "tWhite", + "tRed", + "tOrange", + "tYellow", + "tGreen", + "tCyan", + "tSky", + "tBlue", + "tViolet", + "tMagicPink", + "tPurple" +}; + +static const char *speed_names[4] = +{ + "Var", + "Slow", + "Med", + "Fast" +}; + +static const int ptrspeeds[4] = { 1, 1, 4, 8 }; + +// Note: these should be in asciibetical order! +#define THE_COMMANDS \ + S(BeginRecordingMovie), \ + S(ClipWindows), \ + S(Debugger), \ + S(DecEmuTurbo), \ + S(DecFrameRate), \ + S(DecFrameTime), \ + S(DecTurboSpeed), \ + S(EmuTurbo), \ + S(EndRecordingMovie), \ + S(ExitEmu), \ + S(IncEmuTurbo), \ + S(IncFrameRate), \ + S(IncFrameTime), \ + S(IncTurboSpeed), \ + S(LoadFreezeFile), \ + S(LoadMovie), \ + S(LoadOopsFile), \ + S(Pause), \ + S(QuickLoad000), \ + S(QuickLoad001), \ + S(QuickLoad002), \ + S(QuickLoad003), \ + S(QuickLoad004), \ + S(QuickLoad005), \ + S(QuickLoad006), \ + S(QuickLoad007), \ + S(QuickLoad008), \ + S(QuickLoad009), \ + S(QuickLoad010), \ + S(QuickSave000), \ + S(QuickSave001), \ + S(QuickSave002), \ + S(QuickSave003), \ + S(QuickSave004), \ + S(QuickSave005), \ + S(QuickSave006), \ + S(QuickSave007), \ + S(QuickSave008), \ + S(QuickSave009), \ + S(QuickSave010), \ + S(Reset), \ + S(SaveFreezeFile), \ + S(SaveSPC), \ + S(Screenshot), \ + S(SeekToFrame), \ + S(SoftReset), \ + S(SoundChannel0), \ + S(SoundChannel1), \ + S(SoundChannel2), \ + S(SoundChannel3), \ + S(SoundChannel4), \ + S(SoundChannel5), \ + S(SoundChannel6), \ + S(SoundChannel7), \ + S(SoundChannelsOn), \ + S(SwapJoypads), \ + S(ToggleBG0), \ + S(ToggleBG1), \ + S(ToggleBG2), \ + S(ToggleBG3), \ + S(ToggleEmuTurbo), \ + S(ToggleHDMA), \ + S(ToggleSprites), \ + S(ToggleTransparency) \ + +#define S(x) x + +enum command_numbers +{ + THE_COMMANDS, + LAST_COMMAND +}; + +#undef S +#define S(x) #x + +static const char *command_names[LAST_COMMAND + 1] = +{ + THE_COMMANDS, + NULL +}; + +#undef S +#undef THE_COMMANDS + +static void DisplayStateChange (const char *, bool8); +static void DoGunLatch (int, int); +static int maptype (int); +static bool strless (const char *, const char *); +static int findstr (const char *, const char **, int); +static int get_threshold (const char **); +static const char * maptypename (int); +static int32 ApplyMulti (s9xcommand_t *, int32, int16); +static void do_polling (int); +static void UpdatePolledMouse (int); + + +static string& operator += (string &s, int i) +{ + snprintf(buf, sizeof(buf), "%d", i); + s.append(buf); + return (s); +} + +static string& operator += (string &s, double d) +{ + snprintf(buf, sizeof(buf), "%g", d); + s.append(buf); + return (s); +} + +static void DisplayStateChange (const char *str, bool8 on) +{ + snprintf(buf, sizeof(buf), "%s: %s", str, on ? "on":"off"); + S9xSetInfoString(buf); +} + +static void DoGunLatch (int x, int y) +{ + x += 40; + + if (x > 295) + x = 295; + else + if (x < 40) + x = 40; + + if (y > PPU.ScreenHeight - 1) + y = PPU.ScreenHeight - 1; + else + if (y < 0) + y = 0; + + PPU.GunVLatch = (uint16) (y + 1); + PPU.GunHLatch = (uint16) x; +} + +static int maptype (int t) +{ + switch (t) + { + case S9xNoMapping: + return (MAP_NONE); + + case S9xButtonJoypad: + case S9xButtonMouse: + case S9xButtonSuperscope: + case S9xButtonJustifier: + case S9xButtonCommand: + case S9xButtonPseudopointer: + case S9xButtonPort: + case S9xButtonMulti: + return (MAP_BUTTON); + + case S9xAxisJoypad: + case S9xAxisPseudopointer: + case S9xAxisPseudobuttons: + case S9xAxisPort: + return (MAP_AXIS); + + case S9xPointer: + case S9xPointerPort: + return (MAP_POINTER); + + default: + return (MAP_UNKNOWN); + } +} + +void S9xControlsReset (void) +{ + S9xControlsSoftReset(); + mouse[0].buttons &= ~0x30; + mouse[1].buttons &= ~0x30; + justifier.buttons &= ~JUSTIFIER_SELECT; +} + +void S9xControlsSoftReset (void) +{ + for (set<struct exemulti *>::iterator it = exemultis.begin(); it != exemultis.end(); it++) + delete *it; + exemultis.clear(); + + for (int i = 0; i < 2; i++) + for (int j = 0; j < 2; j++) + read_idx[i][j]=0; + + FLAG_LATCH = FALSE; +} + +void S9xUnmapAllControls (void) +{ + S9xControlsReset(); + + keymap.clear(); + + for (int i = 0; i < (int) multis.size(); i++) + free(multis[i]); + multis.clear(); + + for (int i = 0; i < NUMCTLS + 1; i++) + pollmap[i].clear(); + + for (int i = 0; i < 8; i++) + { + pseudopointer[i].x = 0; + pseudopointer[i].y = 0; + pseudopointer[i].H_adj = 0; + pseudopointer[i].V_adj = 0; + pseudopointer[i].H_var = 0; + pseudopointer[i].V_var = 0; + pseudopointer[i].mapped = false; + + joypad[i].buttons = 0; + joypad[i].turbos = 0; + joypad[i].turbo_ct = 0; + } + + for (int i = 0; i < 2; i++) + { + mouse[i].old_x = mouse[i].old_y = 0; + mouse[i].cur_x = mouse[i].cur_y = 0; + mouse[i].buttons = 1; + mouse[i].ID = InvalidControlID; + + if (!(mouse[i].crosshair.set & 1)) + mouse[i].crosshair.img = 0; // no image for mouse because its only logical position is game-specific, not known by the emulator + if (!(mouse[i].crosshair.set & 2)) + mouse[i].crosshair.fg = 5; + if (!(mouse[i].crosshair.set & 4)) + mouse[i].crosshair.bg = 1; + + justifier.x[i] = justifier.y[i] = 0; + justifier.offscreen[i] = 0; + justifier.ID[i] = InvalidControlID; + + if (!(justifier.crosshair[i].set & 1)) + justifier.crosshair[i].img = 4; + if (!(justifier.crosshair[i].set & 2)) + justifier.crosshair[i].fg = i ? 14 : 12; + if (!(justifier.crosshair[i].set & 4)) + justifier.crosshair[i].bg = 1; + } + + justifier.buttons = 0; + + superscope.x = superscope.y = 0; + superscope.phys_buttons = 0; + superscope.next_buttons = 0; + superscope.read_buttons = 0; + superscope.ID = InvalidControlID; + + if (!(superscope.crosshair.set & 1)) + superscope.crosshair.img = 2; + if (!(superscope.crosshair.set & 2)) + superscope.crosshair.fg = 5; + if (!(superscope.crosshair.set & 4)) + superscope.crosshair.bg = 1; + + ZeroMemory(pseudobuttons, sizeof(pseudobuttons)); + + turbo_time = 1; +} + +void S9xSetController (int port, enum controllers controller, int8 id1, int8 id2, int8 id3, int8 id4) +{ + if (port < 0 || port > 1) + return; + + switch (controller) + { + case CTL_NONE: + break; + + case CTL_JOYPAD: + if (id1 < 0 || id1 > 7) + break; + + newcontrollers[port] = JOYPAD0 + id1; + return; + + case CTL_MOUSE: + if (id1 < 0 || id1 > 1) + break; + if (!Settings.MouseMaster) + { + S9xMessage(S9X_CONFIG_INFO, S9X_ERROR, "Cannot select SNES Mouse: MouseMaster disabled"); + break; + } + + newcontrollers[port] = MOUSE0 + id1; + return; + + case CTL_SUPERSCOPE: + if (!Settings.SuperScopeMaster) + { + S9xMessage(S9X_CONFIG_INFO, S9X_ERROR, "Cannot select SNES Superscope: SuperScopeMaster disabled"); + break; + } + + newcontrollers[port] = SUPERSCOPE; + return; + + case CTL_JUSTIFIER: + if (id1 < 0 || id1 > 1) + break; + if (!Settings.JustifierMaster) + { + S9xMessage(S9X_CONFIG_INFO, S9X_ERROR, "Cannot select Konami Justifier: JustifierMaster disabled"); + break; + } + + newcontrollers[port] = ONE_JUSTIFIER + id1; + return; + + case CTL_MP5: + if (id1 < -1 || id1 > 7) + break; + if (id2 < -1 || id2 > 7) + break; + if (id3 < -1 || id3 > 7) + break; + if (id4 < -1 || id4 > 7) + break; + if (!Settings.MultiPlayer5Master) + { + S9xMessage(S9X_CONFIG_INFO, S9X_ERROR, "Cannot select MP5: MultiPlayer5Master disabled"); + break; + } + + newcontrollers[port] = MP5; + mp5[port].pads[0] = (id1 < 0) ? NONE : JOYPAD0 + id1; + mp5[port].pads[1] = (id2 < 0) ? NONE : JOYPAD0 + id2; + mp5[port].pads[2] = (id3 < 0) ? NONE : JOYPAD0 + id3; + mp5[port].pads[3] = (id4 < 0) ? NONE : JOYPAD0 + id4; + return; + + default: + fprintf(stderr, "Unknown controller type %d\n", controller); + break; + } + + newcontrollers[port] = NONE; +} + +bool S9xVerifyControllers (void) +{ + bool ret = false; + int port, i, used[NUMCTLS]; + + for (i = 0; i < NUMCTLS; used[i++] = 0) ; + + for (port = 0; port < 2; port++) + { + switch (i = newcontrollers[port]) + { + case MOUSE0: + case MOUSE1: + if (!Settings.MouseMaster) + { + S9xMessage(S9X_CONFIG_INFO, S9X_ERROR, "Cannot select SNES Mouse: MouseMaster disabled"); + newcontrollers[port] = NONE; + ret = true; + break; + } + + if (used[i]++ > 0) + { + snprintf(buf, sizeof(buf), "Mouse%d used more than once! Disabling extra instances", i - MOUSE0 + 1); + S9xMessage(S9X_CONFIG_INFO, S9X_ERROR, buf); + newcontrollers[port] = NONE; + ret = true; + break; + } + + break; + + case SUPERSCOPE: + if (!Settings.SuperScopeMaster) + { + S9xMessage(S9X_CONFIG_INFO, S9X_ERROR, "Cannot select SNES Superscope: SuperScopeMaster disabled"); + newcontrollers[port] = NONE; + ret = true; + break; + } + + if (used[i]++ > 0) + { + snprintf(buf, sizeof(buf), "Superscope used more than once! Disabling extra instances"); + S9xMessage(S9X_CONFIG_INFO, S9X_ERROR, buf); + newcontrollers[port] = NONE; + ret = true; + break; + } + + break; + + case ONE_JUSTIFIER: + case TWO_JUSTIFIERS: + if (!Settings.JustifierMaster) + { + S9xMessage(S9X_CONFIG_INFO, S9X_ERROR, "Cannot select Konami Justifier: JustifierMaster disabled"); + newcontrollers[port] = NONE; + ret = true; + break; + } + + if (used[ONE_JUSTIFIER]++ > 0) + { + snprintf(buf, sizeof(buf), "Justifier used more than once! Disabling extra instances"); + S9xMessage(S9X_CONFIG_INFO, S9X_ERROR, buf); + newcontrollers[port] = NONE; + ret = true; + break; + } + + break; + + case MP5: + if (!Settings.MultiPlayer5Master) + { + S9xMessage(S9X_CONFIG_INFO, S9X_ERROR, "Cannot select MP5: MultiPlayer5Master disabled"); + newcontrollers[port] = NONE; + ret = true; + break; + } + + for (i = 0; i < 4; i++) + { + if (mp5[port].pads[i] != NONE) + { + if (used[mp5[port].pads[i] - JOYPAD0]++ > 0) + { + snprintf(buf, sizeof(buf), "Joypad%d used more than once! Disabling extra instances", mp5[port].pads[i] - JOYPAD0 + 1); + S9xMessage(S9X_CONFIG_INFO, S9X_ERROR, buf); + mp5[port].pads[i] = NONE; + ret = true; + break; + } + } + } + + break; + + case JOYPAD0: + case JOYPAD1: + case JOYPAD2: + case JOYPAD3: + case JOYPAD4: + case JOYPAD5: + case JOYPAD6: + case JOYPAD7: + if (used[i - JOYPAD0]++ > 0) + { + snprintf(buf, sizeof(buf), "Joypad%d used more than once! Disabling extra instances", i - JOYPAD0 + 1); + S9xMessage(S9X_CONFIG_INFO, S9X_ERROR, buf); + newcontrollers[port] = NONE; + ret = true; + break; + } + + break; + + default: + break; + } + } + + return (ret); +} + +void S9xGetController (int port, enum controllers *controller, int8 *id1, int8 *id2, int8 *id3, int8 *id4) +{ + int i; + + *controller = CTL_NONE; + *id1 = *id2 = *id3 = *id4 = -1; + + if (port < 0 || port > 1) + return; + + switch (i = newcontrollers[port]) + { + case MP5: + *controller = CTL_MP5; + *id1 = (mp5[port].pads[0] == NONE) ? -1 : mp5[port].pads[0] - JOYPAD0; + *id2 = (mp5[port].pads[1] == NONE) ? -1 : mp5[port].pads[1] - JOYPAD0; + *id3 = (mp5[port].pads[2] == NONE) ? -1 : mp5[port].pads[2] - JOYPAD0; + *id4 = (mp5[port].pads[3] == NONE) ? -1 : mp5[port].pads[3] - JOYPAD0; + return; + + case JOYPAD0: + case JOYPAD1: + case JOYPAD2: + case JOYPAD3: + case JOYPAD4: + case JOYPAD5: + case JOYPAD6: + case JOYPAD7: + *controller = CTL_JOYPAD; + *id1 = i - JOYPAD0; + return; + + case MOUSE0: + case MOUSE1: + *controller = CTL_MOUSE; + *id1 = i - MOUSE0; + return; + + case SUPERSCOPE: + *controller = CTL_SUPERSCOPE; + *id1 = 1; + return; + + case ONE_JUSTIFIER: + case TWO_JUSTIFIERS: + *controller = CTL_JUSTIFIER; + *id1 = i - ONE_JUSTIFIER; + return; + } +} + +void S9xReportControllers (void) +{ + static char mes[128]; + char *c = mes; + + S9xVerifyControllers(); + + for (int port = 0; port < 2; port++) + { + c += sprintf(c, "Port %d: ", port + 1); + + switch (newcontrollers[port]) + { + case NONE: + c += sprintf(c, "<none>. "); + break; + + case MP5: + c += sprintf(c, "MP5 with pads"); + for (int i = 0; i < 4; i++) + { + if (mp5[port].pads[i] == NONE) + c += sprintf(c, " <none>. "); + else + c += sprintf(c, " #%d. ", mp5[port].pads[i] + 1 - JOYPAD0); + } + + break; + + case JOYPAD0: + case JOYPAD1: + case JOYPAD2: + case JOYPAD3: + case JOYPAD4: + case JOYPAD5: + case JOYPAD6: + case JOYPAD7: + c += sprintf(c, "Pad #%d. ", (int) (newcontrollers[port] - JOYPAD0 + 1)); + break; + + case MOUSE0: + case MOUSE1: + c += sprintf(c, "Mouse #%d. ", (int) (newcontrollers[port] - MOUSE0 + 1)); + break; + + case SUPERSCOPE: + if (port == 0) + c += sprintf(c, "Superscope (cannot fire). "); + else + c += sprintf(c, "Superscope. "); + break; + + case ONE_JUSTIFIER: + if (port == 0) + c += sprintf(c, "Blue Justifier (cannot fire). "); + else + c += sprintf(c, "Blue Justifier. "); + break; + + case TWO_JUSTIFIERS: + if (port == 0) + c += sprintf(c, "Blue and Pink Justifiers (cannot fire). "); + else + c += sprintf(c, "Blue and Pink Justifiers. "); + break; + } + } + + S9xMessage(S9X_INFO, S9X_CONFIG_INFO, mes); +} + +char * S9xGetCommandName (s9xcommand_t command) +{ + string s; + char c; + + switch (command.type) + { + case S9xButtonJoypad: + if (command.button.joypad.buttons == 0) + return (strdup("None")); + if (command.button.joypad.buttons & 0x000f) + return (strdup("None")); + + s = "Joypad"; + s += command.button.joypad.idx + 1; + + c = ' '; + if (command.button.joypad.toggle) { if (c) s += c; s += "Toggle"; c = 0; } + if (command.button.joypad.sticky) { if (c) s += c; s += "Sticky"; c = 0; } + if (command.button.joypad.turbo ) { if (c) s += c; s += "Turbo"; c = 0; } + + c = ' '; + if (command.button.joypad.buttons & SNES_UP_MASK ) { s += c; s += "Up"; c = '+'; } + if (command.button.joypad.buttons & SNES_DOWN_MASK ) { s += c; s += "Down"; c = '+'; } + if (command.button.joypad.buttons & SNES_LEFT_MASK ) { s += c; s += "Left"; c = '+'; } + if (command.button.joypad.buttons & SNES_RIGHT_MASK ) { s += c; s += "Right"; c = '+'; } + if (command.button.joypad.buttons & SNES_A_MASK ) { s += c; s += "A"; c = '+'; } + if (command.button.joypad.buttons & SNES_B_MASK ) { s += c; s += "B"; c = '+'; } + if (command.button.joypad.buttons & SNES_X_MASK ) { s += c; s += "X"; c = '+'; } + if (command.button.joypad.buttons & SNES_Y_MASK ) { s += c; s += "Y"; c = '+'; } + if (command.button.joypad.buttons & SNES_TL_MASK ) { s += c; s += "L"; c = '+'; } + if (command.button.joypad.buttons & SNES_TR_MASK ) { s += c; s += "R"; c = '+'; } + if (command.button.joypad.buttons & SNES_START_MASK ) { s += c; s += "Start"; c = '+'; } + if (command.button.joypad.buttons & SNES_SELECT_MASK) { s += c; s += "Select"; c = '+'; } + + break; + + case S9xButtonMouse: + if (!command.button.mouse.left && !command.button.mouse.right) + return (strdup("None")); + + s = "Mouse"; + s += command.button.mouse.idx + 1; + s += " "; + + if (command.button.mouse.left ) s += "L"; + if (command.button.mouse.right) s += "R"; + + break; + + case S9xButtonSuperscope: + if (!command.button.scope.fire && !command.button.scope.cursor && !command.button.scope.turbo && !command.button.scope.pause && !command.button.scope.aim_offscreen) + return (strdup("None")); + + s = "Superscope"; + + if (command.button.scope.aim_offscreen) s += " AimOffscreen"; + + c = ' '; + if (command.button.scope.fire ) { s += c; s += "Fire"; c = '+'; } + if (command.button.scope.cursor) { s += c; s += "Cursor"; c = '+'; } + if (command.button.scope.turbo ) { s += c; s += "ToggleTurbo"; c = '+'; } + if (command.button.scope.pause ) { s += c; s += "Pause"; c = '+'; } + + break; + + case S9xButtonJustifier: + if (!command.button.justifier.trigger && !command.button.justifier.start && !command.button.justifier.aim_offscreen) + return (strdup("None")); + + s = "Justifier"; + s += command.button.justifier.idx + 1; + + if (command.button.justifier.aim_offscreen) s += " AimOffscreen"; + + c = ' '; + if (command.button.justifier.trigger) { s += c; s += "Trigger"; c = '+'; } + if (command.button.justifier.start ) { s += c; s += "Start"; c = '+'; } + + break; + + case S9xButtonCommand: + if (command.button.command >= LAST_COMMAND) + return (strdup("None")); + + return (strdup(command_names[command.button.command])); + + case S9xPointer: + if (!command.pointer.aim_mouse0 && !command.pointer.aim_mouse1 && !command.pointer.aim_scope && !command.pointer.aim_justifier0 && !command.pointer.aim_justifier1) + return (strdup("None")); + + s = "Pointer"; + + c = ' '; + if (command.pointer.aim_mouse0 ) { s += c; s += "Mouse1"; c = '+'; } + if (command.pointer.aim_mouse1 ) { s += c; s += "Mouse2"; c = '+'; } + if (command.pointer.aim_scope ) { s += c; s += "Superscope"; c = '+'; } + if (command.pointer.aim_justifier0) { s += c; s += "Justifier1"; c = '+'; } + if (command.pointer.aim_justifier1) { s += c; s += "Justifier2"; c = '+'; } + + break; + + case S9xButtonPseudopointer: + if (!command.button.pointer.UD && !command.button.pointer.LR) + return (strdup("None")); + if (command.button.pointer.UD == -2 || command.button.pointer.LR == -2) + return (strdup("None")); + + s = "ButtonToPointer "; + s += command.button.pointer.idx + 1; + + if (command.button.pointer.UD) s += (command.button.pointer.UD == 1) ? 'd' : 'u'; + if (command.button.pointer.LR) s += (command.button.pointer.LR == 1) ? 'r' : 'l'; + + s += " "; + s += speed_names[command.button.pointer.speed_type]; + + break; + + case S9xAxisJoypad: + s = "Joypad"; + s += command.axis.joypad.idx + 1; + s += " Axis "; + + switch (command.axis.joypad.axis) + { + case 0: s += (command.axis.joypad.invert ? "Right/Left" : "Left/Right"); break; + case 1: s += (command.axis.joypad.invert ? "Down/Up" : "Up/Down" ); break; + case 2: s += (command.axis.joypad.invert ? "A/Y" : "Y/A" ); break; + case 3: s += (command.axis.joypad.invert ? "B/X" : "X/B" ); break; + case 4: s += (command.axis.joypad.invert ? "R/L" : "L/R" ); break; + default: return (strdup("None")); + } + + s += " T="; + s += int((command.axis.joypad.threshold + 1) * 1000 / 256) / 10.0; + s += "%"; + + break; + + case S9xAxisPseudopointer: + s = "AxisToPointer "; + s += command.axis.pointer.idx + 1; + s += command.axis.pointer.HV ? 'v' : 'h'; + s += " "; + + if (command.axis.pointer.invert) s += "-"; + + s += speed_names[command.axis.pointer.speed_type]; + + break; + + case S9xAxisPseudobuttons: + s = "AxisToButtons "; + s += command.axis.button.negbutton; + s += "/"; + s += command.axis.button.posbutton; + s += " T="; + s += int((command.axis.button.threshold + 1) * 1000 / 256) / 10.0; + s += "%"; + + break; + + case S9xButtonPort: + case S9xAxisPort: + case S9xPointerPort: + return (strdup("BUG: Port should have handled this instead of calling S9xGetCommandName()")); + + case S9xNoMapping: + return (strdup("None")); + + case S9xButtonMulti: + { + if (command.button.multi_idx >= (int) multis.size()) + return (strdup("None")); + + s = "{"; + if (multis[command.button.multi_idx]->multi_press) s = "+{"; + + bool sep = false; + + for (s9xcommand_t *m = multis[command.button.multi_idx]; m->multi_press != 3; m++) + { + if (m->type == S9xNoMapping) + { + s += ";"; + sep = false; + } + else + { + if (sep) s += ","; + if (m->multi_press == 1) s += "+"; + if (m->multi_press == 2) s += "-"; + + s += S9xGetCommandName(*m); + sep = true; + } + } + + s += "}"; + + break; + } + + default: + return (strdup("BUG: Unknown command type")); + } + + return (strdup(s.c_str())); +} + +static bool strless (const char *a, const char *b) +{ + return (strcmp(a, b) < 0); +} + +static int findstr (const char *needle, const char **haystack, int numstr) +{ + const char **r; + + r = lower_bound(haystack, haystack + numstr, needle, strless); + if (r >= haystack + numstr || strcmp(needle, *r)) + return (-1); + + return (r - haystack); +} + +static int get_threshold (const char **ss) +{ + const char *s = *ss; + int i; + + if (s[0] != 'T' || s[1] != '=') + return (-1); + + s += 2; + i = 0; + + if (s[0] == '0') + { + if (s[1] != '.') + return (-1); + + s++; + } + else + { + do + { + if (*s < '0' || *s > '9') + return (-1); + + i = i * 10 + 10 * (*s - '0'); + if (i > 1000) + return (-1); + + s++; + } + while (*s != '.' && *s != '%'); + } + + if (*s == '.') + { + if (s[1] < '0' || s[1] > '9' || s[2] != '%') + return (-1); + + i += s[1] - '0'; + } + + if (i > 1000) + return (-1); + + *ss = s; + + return (i); +} + +s9xcommand_t S9xGetCommandT (const char *name) +{ + s9xcommand_t cmd; + int i, j; + const char *s; + + ZeroMemory(&cmd, sizeof(cmd)); + cmd.type = S9xBadMapping; + cmd.multi_press = 0; + cmd.button_norpt = 0; + + if (!strcmp(name, "None")) + cmd.type = S9xNoMapping; + else + if (!strncmp(name, "Joypad", 6)) + { + if (name[6] < '1' || name[6] > '8' || name[7] != ' ') + return (cmd); + + if (!strncmp(name + 8, "Axis ", 5)) + { + cmd.axis.joypad.idx = name[6] - '1'; + s = name + 13; + + if (!strncmp(s, "Left/Right ", 11)) { j = 0; i = 0; s += 11; } + else + if (!strncmp(s, "Right/Left ", 11)) { j = 0; i = 1; s += 11; } + else + if (!strncmp(s, "Up/Down ", 8)) { j = 1; i = 0; s += 8; } + else + if (!strncmp(s, "Down/Up ", 8)) { j = 1; i = 1; s += 8; } + else + if (!strncmp(s, "Y/A ", 4)) { j = 2; i = 0; s += 4; } + else + if (!strncmp(s, "A/Y ", 4)) { j = 2; i = 1; s += 4; } + else + if (!strncmp(s, "X/B ", 4)) { j = 3; i = 0; s += 4; } + else + if (!strncmp(s, "B/X ", 4)) { j = 3; i = 1; s += 4; } + else + if (!strncmp(s, "L/R ", 4)) { j = 4; i = 0; s += 4; } + else + if (!strncmp(s, "R/L ", 4)) { j = 4; i = 1; s += 4; } + else + return (cmd); + + cmd.axis.joypad.axis = j; + cmd.axis.joypad.invert = i; + i = get_threshold(&s); + if (i < 0) + return (cmd); + cmd.axis.joypad.threshold = (i - 1) * 256 / 1000; + + cmd.type = S9xAxisJoypad; + } + else + { + cmd.button.joypad.idx = name[6] - '1'; + s = name + 8; + i = 0; + + if ((cmd.button.joypad.toggle = strncmp(s, "Toggle", 6) ? 0 : 1)) s += i = 6; + if ((cmd.button.joypad.sticky = strncmp(s, "Sticky", 6) ? 0 : 1)) s += i = 6; + if ((cmd.button.joypad.turbo = strncmp(s, "Turbo", 5) ? 0 : 1)) s += i = 5; + + if (cmd.button.joypad.toggle && !(cmd.button.joypad.sticky || cmd.button.joypad.turbo)) + return (cmd); + + if (i) + { + if (*s != ' ') + return (cmd); + s++; + } + + i = 0; + + if (!strncmp(s, "Up", 2)) { i |= SNES_UP_MASK; s += 2; if (*s == '+') s++; } + if (!strncmp(s, "Down", 4)) { i |= SNES_DOWN_MASK; s += 4; if (*s == '+') s++; } + if (!strncmp(s, "Left", 4)) { i |= SNES_LEFT_MASK; s += 4; if (*s == '+') s++; } + if (!strncmp(s, "Right", 5)) { i |= SNES_RIGHT_MASK; s += 5; if (*s == '+') s++; } + + if (*s == 'A') { i |= SNES_A_MASK; s++; if (*s == '+') s++; } + if (*s == 'B') { i |= SNES_B_MASK; s++; if (*s == '+') s++; } + if (*s == 'X') { i |= SNES_X_MASK; s++; if (*s == '+') s++; } + if (*s == 'Y') { i |= SNES_Y_MASK; s++; if (*s == '+') s++; } + if (*s == 'L') { i |= SNES_TL_MASK; s++; if (*s == '+') s++; } + if (*s == 'R') { i |= SNES_TR_MASK; s++; if (*s == '+') s++; } + + if (!strncmp(s, "Start", 5)) { i |= SNES_START_MASK; s += 5; if (*s == '+') s++; } + if (!strncmp(s, "Select", 6)) { i |= SNES_SELECT_MASK; s += 6; } + + if (i == 0 || *s != 0 || *(s - 1) == '+') + return (cmd); + + cmd.button.joypad.buttons = i; + + cmd.type = S9xButtonJoypad; + } + } + else + if (!strncmp(name, "Mouse", 5)) + { + if (name[5] < '1' || name[5] > '2' || name[6] != ' ') + return (cmd); + + cmd.button.mouse.idx = name[5] - '1'; + s = name + 7; + i = 0; + + if ((cmd.button.mouse.left = (*s == 'L'))) s += i = 1; + if ((cmd.button.mouse.right = (*s == 'R'))) s += i = 1; + + if (i == 0 || *s != 0) + return (cmd); + + cmd.type = S9xButtonMouse; + } + else + if (!strncmp(name, "Superscope ", 11)) + { + s = name + 11; + i = 0; + + if ((cmd.button.scope.aim_offscreen = strncmp(s, "AimOffscreen", 12) ? 0 : 1)) { s += i = 12; if (*s == ' ') s++; else if (*s != 0) return (cmd); } + if ((cmd.button.scope.fire = strncmp(s, "Fire", 4) ? 0 : 1)) { s += i = 4; if (*s == '+') s++; } + if ((cmd.button.scope.cursor = strncmp(s, "Cursor", 6) ? 0 : 1)) { s += i = 6; if (*s == '+') s++; } + if ((cmd.button.scope.turbo = strncmp(s, "ToggleTurbo", 11) ? 0 : 1)) { s += i = 11; if (*s == '+') s++; } + if ((cmd.button.scope.pause = strncmp(s, "Pause", 5) ? 0 : 1)) { s += i = 5; } + + if (i == 0 || *s != 0 || *(s - 1) == '+') + return (cmd); + + cmd.type = S9xButtonSuperscope; + } + else + if (!strncmp(name, "Justifier", 9)) + { + if (name[9] < '1' || name[9] > '2' || name[10] != ' ') + return (cmd); + + cmd.button.justifier.idx = name[9] - '1'; + s = name + 11; + i = 0; + + if ((cmd.button.justifier.aim_offscreen = strncmp(s, "AimOffscreen", 12) ? 0 : 1)) { s += i = 12; if (*s == ' ') s++; else if (*s != 0) return (cmd); } + if ((cmd.button.justifier.trigger = strncmp(s, "Trigger", 7) ? 0 : 1)) { s += i = 7; if (*s == '+') s++; } + if ((cmd.button.justifier.start = strncmp(s, "Start", 5) ? 0 : 1)) { s += i = 5; } + + if (i == 0 || *s != 0 || *(s - 1) == '+') + return (cmd); + + cmd.type = S9xButtonJustifier; + } + else + if (!strncmp(name, "Pointer ", 8)) + { + s = name + 8; + i = 0; + + if ((cmd.pointer.aim_mouse0 = strncmp(s, "Mouse1", 6) ? 0 : 1)) { s += i = 6; if (*s == '+') s++; } + if ((cmd.pointer.aim_mouse1 = strncmp(s, "Mouse2", 6) ? 0 : 1)) { s += i = 6; if (*s == '+') s++; } + if ((cmd.pointer.aim_scope = strncmp(s, "Superscope", 10) ? 0 : 1)) { s += i = 10; if (*s == '+') s++; } + if ((cmd.pointer.aim_justifier0 = strncmp(s, "Justifier1", 10) ? 0 : 1)) { s += i = 10; if (*s == '+') s++; } + if ((cmd.pointer.aim_justifier1 = strncmp(s, "Justifier2", 10) ? 0 : 1)) { s += i = 10; } + + if (i == 0 || *s != 0 || *(s - 1) == '+') + return (cmd); + + cmd.type = S9xPointer; + } + else + if (!strncmp(name, "ButtonToPointer ", 16)) + { + if (name[16] < '1' || name[16] > '8') + return (cmd); + + cmd.button.pointer.idx = name[16] - '1'; + s = name + 17; + i = 0; + + if ((cmd.button.pointer.UD = (*s == 'u' ? -1 : (*s == 'd' ? 1 : 0)))) s += i = 1; + if ((cmd.button.pointer.LR = (*s == 'l' ? -1 : (*s == 'r' ? 1 : 0)))) s += i = 1; + + if (i == 0 || *(s++) != ' ') + return (cmd); + + for (i = 0; i < 4; i++) + if (!strcmp(s, speed_names[i])) + break; + if (i > 3) + return (cmd); + + cmd.button.pointer.speed_type = i; + + cmd.type = S9xButtonPseudopointer; + } + else + if (!strncmp(name, "AxisToPointer ", 14)) + { + if (name[14] < '1' || name[14] > '8') + return (cmd); + + cmd.axis.pointer.idx = name[14] - '1'; + s= name + 15; + i = 0; + + if (*s == 'h') + cmd.axis.pointer.HV = 0; + else + if (*s == 'v') + cmd.axis.pointer.HV = 1; + else + return (cmd); + + if (s[1] != ' ') + return (cmd); + + s += 2; + if ((cmd.axis.pointer.invert = *s == '-')) + s++; + + for (i = 0; i < 4; i++) + if (!strcmp(s, speed_names[i])) + break; + if (i > 3) + return (cmd); + + cmd.axis.pointer.speed_type = i; + + cmd.type = S9xAxisPseudopointer; + } + else + if (!strncmp(name, "AxisToButtons ", 14)) + { + s = name + 14; + + if (s[0] == '0') + { + if (s[1] != '/') + return (cmd); + + cmd.axis.button.negbutton = 0; + s += 2; + } + else + { + i = 0; + do + { + if (*s < '0' || *s > '9') + return (cmd); + + i = i * 10 + *s - '0'; + if (i > 255) + return (cmd); + } + while (*++s != '/'); + + cmd.axis.button.negbutton = i; + s++; + } + + if (s[0] == '0') + { + if (s[1] != ' ') + return (cmd); + + cmd.axis.button.posbutton = 0; + s += 2; + } + else + { + i = 0; + do + { + if (*s < '0' || *s > '9') + return (cmd); + + i = i * 10 + *s - '0'; + if (i > 255) + return (cmd); + } + while (*++s != ' '); + + cmd.axis.button.posbutton = i; + s++; + } + + i = get_threshold(&s); + if (i < 0) + return (cmd); + cmd.axis.button.threshold = (i - 1) * 256 / 1000; + + cmd.type = S9xAxisPseudobuttons; + } + else + if (!strncmp(name, "MULTI#", 6)) + { + i = strtol(name + 6, (char **) &s, 10); + if (s != NULL && *s != '\0') + return (cmd); + if (i >= (int) multis.size()) + return (cmd); + + cmd.button.multi_idx = i; + cmd.type = S9xButtonMulti; + } + else + if (((name[0] == '+' && name[1] == '{') || name[0] == '{') && name[strlen(name) - 1] == '}') + { + if (multis.size() > 2147483640) + { + fprintf(stderr, "Too many multis!"); + return (cmd); + } + + string x; + int n; + + j = 2; + for (i = (name[0] == '+') ? 2 : 1; name[i] != '\0'; i++) + { + if (name[i] == ',' || name[i] == ';') + { + if (name[i] == ';') + j++; + if (++j > 2147483640) + { + fprintf(stderr, "Multi too long!"); + return (cmd); + } + } + + if (name[i] == '{') + return (cmd); + } + + s9xcommand_t *c = (s9xcommand_t *) calloc(j, sizeof(s9xcommand_t)); + if (c == NULL) + { + perror("malloc error while parsing multi"); + return (cmd); + } + + n = 0; + i = (name[0] == '+') ? 2 : 1; + + do + { + if (name[i] == ';') + { + c[n].type = S9xNoMapping; + c[n].multi_press = 0; + c[n].button_norpt = 0; + + j = i; + } + else + if (name[i] == ',') + { + free(c); + return (cmd); + } + else + { + uint8 press = 0; + + if (name[0] == '+') + { + if (name[i] == '+') + press = 1; + else + if (name[i] == '-') + press = 2; + else + { + free(c); + return (cmd); + } + + i++; + } + + for (j = i; name[j] != ';' && name[j] != ',' && name[j] != '}'; j++) ; + + x.assign(name + i, j - i); + c[n] = S9xGetCommandT(x.c_str()); + c[n].multi_press = press; + + if (maptype(c[n].type) != MAP_BUTTON) + { + free(c); + return (cmd); + } + + if (name[j] == ';') + j--; + } + + i = j + 1; + n++; + } + while (name[i] != '\0'); + + c[n].type = S9xNoMapping; + c[n].multi_press = 3; + + multis.push_back(c); + + cmd.button.multi_idx = multis.size() - 1; + cmd.type = S9xButtonMulti; + } + else + { + i = findstr(name, command_names, LAST_COMMAND); + if (i < 0) + return (cmd); + + cmd.type = S9xButtonCommand; + cmd.button.command = i; + } + + return (cmd); +} + +const char ** S9xGetAllSnes9xCommands (void) +{ + return (command_names); +} + +s9xcommand_t S9xGetMapping (uint32 id) +{ + if (keymap.count(id) == 0) + { + s9xcommand_t cmd; + cmd.type = S9xNoMapping; + return (cmd); + } + else + return (keymap[id]); +} + +static const char * maptypename (int t) +{ + switch (t) + { + case MAP_NONE: return ("unmapped"); + case MAP_BUTTON: return ("button"); + case MAP_AXIS: return ("axis"); + case MAP_POINTER: return ("pointer"); + default: return ("unknown"); + } +} + +void S9xUnmapID (uint32 id) +{ + for (int i = 0; i < NUMCTLS + 1; i++) + pollmap[i].erase(id); + + if (mouse[0].ID == id) mouse[0].ID = InvalidControlID; + if (mouse[1].ID == id) mouse[1].ID = InvalidControlID; + if (superscope.ID == id) superscope.ID = InvalidControlID; + if (justifier.ID[0] == id) justifier.ID[0] = InvalidControlID; + if (justifier.ID[1] == id) justifier.ID[1] = InvalidControlID; + + if (id >= PseudoPointerBase) + pseudopointer[id - PseudoPointerBase].mapped = false; + + keymap.erase(id); +} + +bool S9xMapButton (uint32 id, s9xcommand_t mapping, bool poll) +{ + int t; + + if (id == InvalidControlID) + { + fprintf(stderr, "Cannot map InvalidControlID\n"); + return (false); + } + + t = maptype(mapping.type); + + if (t == MAP_NONE) + { + S9xUnmapID(id); + return (true); + } + + if (t != MAP_BUTTON) + return (false); + + t = maptype(S9xGetMapping(id).type); + + if (t != MAP_NONE && t != MAP_BUTTON) + fprintf(stderr, "WARNING: Remapping ID 0x%08x from %s to button\n", id, maptypename(t)); + + if (id >= PseudoPointerBase) + { + fprintf(stderr, "ERROR: Refusing to map pseudo-pointer #%d as a button\n", id - PseudoPointerBase); + return (false); + } + + t = -1; + + if (poll) + { + if (id >= PseudoButtonBase) + fprintf(stderr, "INFO: Ignoring attempt to set pseudo-button #%d to polling\n", id - PseudoButtonBase); + else + { + switch (mapping.type) + { + case S9xButtonJoypad: + t = JOYPAD0 + mapping.button.joypad.idx; + break; + + case S9xButtonMouse: + t = MOUSE0 + mapping.button.mouse.idx; + break; + + case S9xButtonSuperscope: + t = SUPERSCOPE; + break; + + case S9xButtonJustifier: + t = ONE_JUSTIFIER + mapping.button.justifier.idx; + break; + + case S9xButtonCommand: + case S9xButtonPseudopointer: + case S9xButtonPort: + case S9xButtonMulti: + t = POLL_ALL; + break; + } + } + } + + S9xUnmapID(id); + + keymap[id] = mapping; + + if (t >= 0) + pollmap[t].insert(id); + + return (true); +} + +void S9xReportButton (uint32 id, bool pressed) +{ + if (keymap.count(id) == 0) + return; + + if (keymap[id].type == S9xNoMapping) + return; + + if (maptype(keymap[id].type) != MAP_BUTTON) + { + fprintf(stderr, "ERROR: S9xReportButton called on %s ID 0x%08x\n", maptypename(maptype(keymap[id].type)), id); + return; + } + + if (keymap[id].type == S9xButtonCommand) // skips the "already-pressed check" unless it's a command, as a hack to work around the following problem: + if (keymap[id].button_norpt == pressed) // FIXME: this makes the controls "stick" after loading a savestate while recording a movie and holding any button + return; + + keymap[id].button_norpt = pressed; + + S9xApplyCommand(keymap[id], pressed, 0); +} + +bool S9xMapPointer (uint32 id, s9xcommand_t mapping, bool poll) +{ + int t; + + if (id == InvalidControlID) + { + fprintf(stderr, "Cannot map InvalidControlID\n"); + return (false); + } + + t = maptype(mapping.type); + + if (t == MAP_NONE) + { + S9xUnmapID(id); + return (true); + } + + if (t != MAP_POINTER) + return (false); + + t = maptype(S9xGetMapping(id).type); + + if (t != MAP_NONE && t != MAP_POINTER) + fprintf(stderr, "WARNING: Remapping ID 0x%08x from %s to pointer\n", id, maptypename(t)); + + if (id < PseudoPointerBase && id >= PseudoButtonBase) + { + fprintf(stderr, "ERROR: Refusing to map pseudo-button #%d as a pointer\n", id - PseudoButtonBase); + return (false); + } + + if (mapping.type == S9xPointer) + { + if (mapping.pointer.aim_mouse0 && mouse[0].ID != InvalidControlID && mouse[0].ID != id) + { + fprintf(stderr, "ERROR: Rejecting attempt to control Mouse1 with two pointers\n"); + return (false); + } + + if (mapping.pointer.aim_mouse1 && mouse[1].ID != InvalidControlID && mouse[1].ID != id) + { + fprintf(stderr, "ERROR: Rejecting attempt to control Mouse2 with two pointers\n"); + return (false); + } + + if (mapping.pointer.aim_scope && superscope.ID != InvalidControlID && superscope.ID != id) + { + fprintf(stderr, "ERROR: Rejecting attempt to control SuperScope with two pointers\n"); + return (false); + } + + if (mapping.pointer.aim_justifier0 && justifier.ID[0] != InvalidControlID && justifier.ID[0] != id) + { + fprintf(stderr, "ERROR: Rejecting attempt to control Justifier1 with two pointers\n"); + return (false); + } + + if (mapping.pointer.aim_justifier1 && justifier.ID[1] != InvalidControlID && justifier.ID[1] != id) + { + fprintf(stderr, "ERROR: Rejecting attempt to control Justifier2 with two pointers\n"); + return (false); + } + } + + S9xUnmapID(id); + + if (poll) + { + if (id >= PseudoPointerBase) + fprintf(stderr, "INFO: Ignoring attempt to set pseudo-pointer #%d to polling\n", id - PseudoPointerBase); + else + { + switch (mapping.type) + { + case S9xPointer: + if (mapping.pointer.aim_mouse0 ) pollmap[MOUSE0 ].insert(id); + if (mapping.pointer.aim_mouse1 ) pollmap[MOUSE1 ].insert(id); + if (mapping.pointer.aim_scope ) pollmap[SUPERSCOPE ].insert(id); + if (mapping.pointer.aim_justifier0) pollmap[ONE_JUSTIFIER ].insert(id); + if (mapping.pointer.aim_justifier1) pollmap[TWO_JUSTIFIERS].insert(id); + break; + + case S9xPointerPort: + pollmap[POLL_ALL].insert(id); + break; + } + } + } + + if (id >= PseudoPointerBase) + pseudopointer[id - PseudoPointerBase].mapped = true; + + keymap[id] = mapping; + + if (mapping.pointer.aim_mouse0 ) mouse[0].ID = id; + if (mapping.pointer.aim_mouse1 ) mouse[1].ID = id; + if (mapping.pointer.aim_scope ) superscope.ID = id; + if (mapping.pointer.aim_justifier0) justifier.ID[0] = id; + if (mapping.pointer.aim_justifier1) justifier.ID[1] = id; + + return (true); +} + +void S9xReportPointer (uint32 id, int16 x, int16 y) +{ + if (keymap.count(id) == 0) + return; + + if (keymap[id].type == S9xNoMapping) + return; + + if (maptype(keymap[id].type) != MAP_POINTER) + { + fprintf(stderr, "ERROR: S9xReportPointer called on %s ID 0x%08x\n", maptypename(maptype(keymap[id].type)), id); + return; + } + + S9xApplyCommand(keymap[id], x, y); +} + +bool S9xMapAxis (uint32 id, s9xcommand_t mapping, bool poll) +{ + int t; + + if (id == InvalidControlID) + { + fprintf(stderr, "Cannot map InvalidControlID\n"); + return (false); + } + + t = maptype(mapping.type); + + if (t == MAP_NONE) + { + S9xUnmapID(id); + return (true); + } + + if (t != MAP_AXIS) + return (false); + + t = maptype(S9xGetMapping(id).type); + + if (t != MAP_NONE && t != MAP_AXIS) + fprintf(stderr, "WARNING: Remapping ID 0x%08x from %s to axis\n", id, maptypename(t)); + + if (id >= PseudoPointerBase) + { + fprintf(stderr, "ERROR: Refusing to map pseudo-pointer #%d as an axis\n", id - PseudoPointerBase); + return (false); + } + + t = -1; + + if (poll) + { + switch (mapping.type) + { + case S9xAxisJoypad: + t = JOYPAD0 + mapping.axis.joypad.idx; + break; + + case S9xAxisPseudopointer: + case S9xAxisPseudobuttons: + case S9xAxisPort: + t=POLL_ALL; + break; + } + } + + S9xUnmapID(id); + + keymap[id] = mapping; + + if (t >= 0) + pollmap[t].insert(id); + + return (true); +} + +void S9xReportAxis (uint32 id, int16 value) +{ + if (keymap.count(id) == 0) + return; + + if (keymap[id].type == S9xNoMapping) + return; + + if (maptype(keymap[id].type) != MAP_AXIS) + { + fprintf(stderr, "ERROR: S9xReportAxis called on %s ID 0x%08x\n", maptypename(maptype(keymap[id].type)), id); + return; + } + + S9xApplyCommand(keymap[id], value, 0); +} + +static int32 ApplyMulti (s9xcommand_t *multi, int32 pos, int16 data1) +{ + while (1) + { + if (multi[pos].multi_press == 3) + return (-1); + + if (multi[pos].type == S9xNoMapping) + break; + + if (multi[pos].multi_press) + S9xApplyCommand(multi[pos], multi[pos].multi_press == 1, 0); + else + S9xApplyCommand(multi[pos], data1, 0); + + pos++; + } + + return (pos + 1); +} + +void S9xApplyCommand (s9xcommand_t cmd, int16 data1, int16 data2) +{ + int i; + + switch (cmd.type) + { + case S9xNoMapping: + return; + + case S9xButtonJoypad: + if (cmd.button.joypad.toggle) + { + if (!data1) + return; + + uint16 r = cmd.button.joypad.buttons; + + if (cmd.button.joypad.turbo) joypad[cmd.button.joypad.idx].toggleturbo ^= r; + if (cmd.button.joypad.sticky) joypad[cmd.button.joypad.idx].togglestick ^= r; + } + else + { + uint16 r, s, t, st; + + s = t = st = 0; + r = cmd.button.joypad.buttons; + st = r & joypad[cmd.button.joypad.idx].togglestick & joypad[cmd.button.joypad.idx].toggleturbo; + r ^= st; + t = r & joypad[cmd.button.joypad.idx].toggleturbo; + r ^= t; + s = r & joypad[cmd.button.joypad.idx].togglestick; + r ^= s; + + if (cmd.button.joypad.turbo && cmd.button.joypad.sticky) + { + uint16 x = r; r = st; st = x; + x = s; s = t; t = x; + } + else + if (cmd.button.joypad.turbo) + { + uint16 x = r; r = t; t = x; + x = s; s = st; st = x; + } + else + if (cmd.button.joypad.sticky) + { + uint16 x = r; r = s; s = x; + x = t; t = st; st = x; + } + + if (data1) + { + if (!Settings.UpAndDown && !S9xMoviePlaying()) // if up+down isn't allowed AND we are NOT playing a movie, + { + if (cmd.button.joypad.buttons & (SNES_LEFT_MASK | SNES_RIGHT_MASK)) + { + // if we're pressing left or right, then unpress and unturbo them both first + // so we don't end up hittnig left AND right accidentally. + // Note though that the user can still do it on purpose, if Settings.UpAndDown = true. + // This is a feature, look up glitches in tLoZ:aLttP to find out why. + joypad[cmd.button.joypad.idx].buttons &= ~(SNES_LEFT_MASK | SNES_RIGHT_MASK); + joypad[cmd.button.joypad.idx].turbos &= ~(SNES_LEFT_MASK | SNES_RIGHT_MASK); + } + + if (cmd.button.joypad.buttons & (SNES_UP_MASK | SNES_DOWN_MASK)) + { + // and ditto for up/down + joypad[cmd.button.joypad.idx].buttons &= ~(SNES_UP_MASK | SNES_DOWN_MASK); + joypad[cmd.button.joypad.idx].turbos &= ~(SNES_UP_MASK | SNES_DOWN_MASK); + } + } + + joypad[cmd.button.joypad.idx].buttons |= r; + joypad[cmd.button.joypad.idx].turbos |= t; + joypad[cmd.button.joypad.idx].buttons ^= s; + joypad[cmd.button.joypad.idx].buttons &= ~(joypad[cmd.button.joypad.idx].turbos & st); + joypad[cmd.button.joypad.idx].turbos ^= st; + } + else + { + joypad[cmd.button.joypad.idx].buttons &= ~r; + joypad[cmd.button.joypad.idx].buttons &= ~(joypad[cmd.button.joypad.idx].turbos & t); + joypad[cmd.button.joypad.idx].turbos &= ~t; + } + } + + return; + + case S9xButtonMouse: + i = 0; + if (cmd.button.mouse.left ) i |= 0x40; + if (cmd.button.mouse.right) i |= 0x80; + + if (data1) + mouse[cmd.button.mouse.idx].buttons |= i; + else + mouse[cmd.button.mouse.idx].buttons &= ~i; + + return; + + case S9xButtonSuperscope: + i = 0; + if (cmd.button.scope.fire ) i |= SUPERSCOPE_FIRE; + if (cmd.button.scope.cursor ) i |= SUPERSCOPE_CURSOR; + if (cmd.button.scope.pause ) i |= SUPERSCOPE_PAUSE; + if (cmd.button.scope.aim_offscreen) i |= SUPERSCOPE_OFFSCREEN; + + if (data1) + { + superscope.phys_buttons |= i; + + if (cmd.button.scope.turbo) + { + superscope.phys_buttons ^= SUPERSCOPE_TURBO; + + if (superscope.phys_buttons & SUPERSCOPE_TURBO) + superscope.next_buttons |= superscope.phys_buttons & (SUPERSCOPE_FIRE | SUPERSCOPE_CURSOR); + else + superscope.next_buttons &= ~(SUPERSCOPE_FIRE | SUPERSCOPE_CURSOR); + } + + superscope.next_buttons |= i & (SUPERSCOPE_FIRE | SUPERSCOPE_CURSOR | SUPERSCOPE_PAUSE); + + if (!S9xMovieActive()) // PPU modification during non-recordable command screws up movie synchronization + if ((superscope.next_buttons & (SUPERSCOPE_FIRE | SUPERSCOPE_CURSOR)) && curcontrollers[1] == SUPERSCOPE && !(superscope.phys_buttons & SUPERSCOPE_OFFSCREEN)) + DoGunLatch(superscope.x, superscope.y); + } + else + { + superscope.phys_buttons &= ~i; + superscope.next_buttons &= SUPERSCOPE_OFFSCREEN | ~i; + } + + return; + + case S9xButtonJustifier: + i = 0; + if (cmd.button.justifier.trigger) i |= JUSTIFIER_TRIGGER; + if (cmd.button.justifier.start ) i |= JUSTIFIER_START; + if (cmd.button.justifier.aim_offscreen) justifier.offscreen[cmd.button.justifier.idx] = data1 ? 1 : 0; + i >>= cmd.button.justifier.idx; + + if (data1) + justifier.buttons |= i; + else + justifier.buttons &= ~i; + + return; + + case S9xButtonCommand: + if (((enum command_numbers) cmd.button.command) >= LAST_COMMAND) + { + fprintf(stderr, "Unknown command %04x\n", cmd.button.command); + return; + } + + if (!data1) + { + switch (i = cmd.button.command) + { + case EmuTurbo: + Settings.TurboMode = FALSE; + break; + } + } + else + { + switch ((enum command_numbers) (i = cmd.button.command)) + { + case ExitEmu: + S9xExit(); + break; + + case Reset: + S9xReset(); + break; + + case SoftReset: + S9xMovieUpdateOnReset(); + if (S9xMoviePlaying()) + S9xMovieStop(TRUE); + S9xSoftReset(); + break; + + case EmuTurbo: + Settings.TurboMode = TRUE; + break; + + case ToggleEmuTurbo: + Settings.TurboMode = !Settings.TurboMode; + DisplayStateChange("Turbo mode", Settings.TurboMode); + break; + + case ClipWindows: + Settings.DisableGraphicWindows = !Settings.DisableGraphicWindows; + DisplayStateChange("Graphic clip windows", !Settings.DisableGraphicWindows); + break; + + case Debugger: + #ifdef DEBUGGER + CPU.Flags |= DEBUG_MODE_FLAG; + #endif + break; + + case IncFrameRate: + if (Settings.SkipFrames == AUTO_FRAMERATE) + Settings.SkipFrames = 1; + else + if (Settings.SkipFrames < 10) + Settings.SkipFrames++; + + if (Settings.SkipFrames == AUTO_FRAMERATE) + S9xSetInfoString("Auto frame skip"); + else + { + sprintf(buf, "Frame skip: %d", Settings.SkipFrames - 1); + S9xSetInfoString(buf); + } + + break; + + case DecFrameRate: + if (Settings.SkipFrames <= 1) + Settings.SkipFrames = AUTO_FRAMERATE; + else + if (Settings.SkipFrames != AUTO_FRAMERATE) + Settings.SkipFrames--; + + if (Settings.SkipFrames == AUTO_FRAMERATE) + S9xSetInfoString("Auto frame skip"); + else + { + sprintf(buf, "Frame skip: %d", Settings.SkipFrames - 1); + S9xSetInfoString(buf); + } + + break; + + case IncEmuTurbo: + if (Settings.TurboSkipFrames < 20) + Settings.TurboSkipFrames += 1; + else + if (Settings.TurboSkipFrames < 200) + Settings.TurboSkipFrames += 5; + sprintf(buf, "Turbo frame skip: %d", Settings.TurboSkipFrames); + S9xSetInfoString(buf); + break; + + case DecEmuTurbo: + if (Settings.TurboSkipFrames > 20) + Settings.TurboSkipFrames -= 5; + else + if (Settings.TurboSkipFrames > 0) + Settings.TurboSkipFrames -= 1; + sprintf(buf, "Turbo frame skip: %d", Settings.TurboSkipFrames); + S9xSetInfoString(buf); + break; + + case IncFrameTime: // Increase emulated frame time by 1ms + Settings.FrameTime += 1000; + sprintf(buf, "Emulated frame time: %dms", Settings.FrameTime / 1000); + S9xSetInfoString(buf); + break; + + case DecFrameTime: // Decrease emulated frame time by 1ms + if (Settings.FrameTime >= 1000) + Settings.FrameTime -= 1000; + sprintf(buf, "Emulated frame time: %dms", Settings.FrameTime / 1000); + S9xSetInfoString(buf); + break; + + case IncTurboSpeed: + if (turbo_time >= 120) + break; + turbo_time++; + sprintf(buf, "Turbo speed: %d", turbo_time); + S9xSetInfoString(buf); + break; + + case DecTurboSpeed: + if (turbo_time <= 1) + break; + turbo_time--; + sprintf(buf, "Turbo speed: %d", turbo_time); + S9xSetInfoString(buf); + break; + + case LoadFreezeFile: + S9xUnfreezeGame(S9xChooseFilename(TRUE)); + break; + + case SaveFreezeFile: + S9xFreezeGame(S9xChooseFilename(FALSE)); + break; + + case LoadOopsFile: + { + char filename[PATH_MAX + 1]; + char drive[_MAX_DRIVE + 1], dir[_MAX_DIR + 1], def[_MAX_FNAME + 1], ext[_MAX_EXT + 1]; + + _splitpath(Memory.ROMFilename, drive, dir, def, ext); + snprintf(filename, PATH_MAX + 1, "%s%s%s.%.*s", S9xGetDirectory(SNAPSHOT_DIR), SLASH_STR, def, _MAX_EXT - 1, "oops"); + + if (S9xUnfreezeGame(filename)) + { + sprintf(buf, "%s.%.*s loaded", def, _MAX_EXT - 1, "oops"); + S9xSetInfoString (buf); + } + else + S9xMessage(S9X_ERROR, S9X_FREEZE_FILE_NOT_FOUND, "Oops file not found"); + + break; + } + + case Pause: + Settings.Paused = !Settings.Paused; + DisplayStateChange("Pause", Settings.Paused); + #if defined(NETPLAY_SUPPORT) && !defined(__WIN32__) + S9xNPSendPause(Settings.Paused); + #endif + break; + + case QuickLoad000: + case QuickLoad001: + case QuickLoad002: + case QuickLoad003: + case QuickLoad004: + case QuickLoad005: + case QuickLoad006: + case QuickLoad007: + case QuickLoad008: + case QuickLoad009: + case QuickLoad010: + { + char filename[PATH_MAX + 1]; + char drive[_MAX_DRIVE + 1], dir[_MAX_DIR + 1], def[_MAX_FNAME + 1], ext[_MAX_EXT + 1]; + + _splitpath(Memory.ROMFilename, drive, dir, def, ext); + snprintf(filename, PATH_MAX + 1, "%s%s%s.%03d", S9xGetDirectory(SNAPSHOT_DIR), SLASH_STR, def, i - QuickLoad000); + + if (S9xUnfreezeGame(filename)) + { + sprintf(buf, "%s.%03d loaded", def, i - QuickLoad000); + S9xSetInfoString(buf); + } + else + S9xMessage(S9X_ERROR, S9X_FREEZE_FILE_NOT_FOUND, "Freeze file not found"); + + break; + } + + case QuickSave000: + case QuickSave001: + case QuickSave002: + case QuickSave003: + case QuickSave004: + case QuickSave005: + case QuickSave006: + case QuickSave007: + case QuickSave008: + case QuickSave009: + case QuickSave010: + { + char filename[PATH_MAX + 1]; + char drive[_MAX_DRIVE + 1], dir[_MAX_DIR + 1], def[_MAX_FNAME + 1], ext[_MAX_EXT + 1]; + + _splitpath(Memory.ROMFilename, drive, dir, def, ext); + snprintf(filename, PATH_MAX + 1, "%s%s%s.%03d", S9xGetDirectory(SNAPSHOT_DIR), SLASH_STR, def, i - QuickSave000); + + sprintf(buf, "%s.%03d saved", def, i - QuickSave000); + S9xSetInfoString(buf); + + S9xFreezeGame(filename); + break; + } + + case SaveSPC: + S9xDumpSPCSnapshot(); + break; + + case Screenshot: + Settings.TakeScreenshot = TRUE; + break; + + case SoundChannel0: + case SoundChannel1: + case SoundChannel2: + case SoundChannel3: + case SoundChannel4: + case SoundChannel5: + case SoundChannel6: + case SoundChannel7: + S9xToggleSoundChannel(i - SoundChannel0); + sprintf(buf, "Sound channel %d toggled", i - SoundChannel0); + S9xSetInfoString(buf); + break; + + case SoundChannelsOn: + S9xToggleSoundChannel(8); + S9xSetInfoString("All sound channels on"); + break; + + case ToggleBG0: + Settings.BG_Forced ^= 1; + DisplayStateChange("BG#0", !(Settings.BG_Forced & 1)); + break; + + case ToggleBG1: + Settings.BG_Forced ^= 2; + DisplayStateChange("BG#1", !(Settings.BG_Forced & 2)); + break; + + case ToggleBG2: + Settings.BG_Forced ^= 4; + DisplayStateChange("BG#2", !(Settings.BG_Forced & 4)); + break; + + case ToggleBG3: + Settings.BG_Forced ^= 8; + DisplayStateChange("BG#3", !(Settings.BG_Forced & 8)); + break; + + case ToggleSprites: + Settings.BG_Forced ^= 16; + DisplayStateChange("Sprites", !(Settings.BG_Forced & 16)); + break; + + case ToggleHDMA: + Settings.DisableHDMA = !Settings.DisableHDMA; + DisplayStateChange("HDMA emulation", !Settings.DisableHDMA); + break; + + case ToggleTransparency: + Settings.Transparency = !Settings.Transparency; + DisplayStateChange("Transparency effects", Settings.Transparency); + break; + + case BeginRecordingMovie: + if (S9xMovieActive()) + S9xMovieStop(FALSE); + S9xMovieCreate(S9xChooseMovieFilename(FALSE), 0xFF, MOVIE_OPT_FROM_RESET, NULL, 0); + break; + + case LoadMovie: + if (S9xMovieActive()) + S9xMovieStop(FALSE); + S9xMovieOpen(S9xChooseMovieFilename(TRUE), FALSE); + break; + + case EndRecordingMovie: + if (S9xMovieActive()) + S9xMovieStop(FALSE); + break; + + case SwapJoypads: + if ((curcontrollers[0] != NONE && !(curcontrollers[0] >= JOYPAD0 && curcontrollers[0] <= JOYPAD7))) + { + S9xSetInfoString("Cannot swap pads: port 1 is not a joypad"); + break; + } + + if ((curcontrollers[1] != NONE && !(curcontrollers[1] >= JOYPAD0 && curcontrollers[1] <= JOYPAD7))) + { + S9xSetInfoString("Cannot swap pads: port 2 is not a joypad"); + break; + } + + newcontrollers[1] = curcontrollers[0]; + newcontrollers[0] = curcontrollers[1]; + + strcpy(buf, "Swap pads: P1="); + i = 14; + if (newcontrollers[0] == NONE) + { + strcpy(buf + i, "<none>"); + i += 6; + } + else + { + sprintf(buf + i, "Joypad%d", newcontrollers[0] - JOYPAD0 + 1); + i += 7; + } + + strcpy(buf + i, " P2="); + i += 4; + if (newcontrollers[1] == NONE) + strcpy(buf + i, "<none>"); + else + sprintf(buf + i, "Joypad%d", newcontrollers[1] - JOYPAD0 + 1); + + S9xSetInfoString(buf); + break; + + case SeekToFrame: + if (S9xMovieActive()) + { + sprintf(buf, "Select frame number (current: %d)", S9xMovieGetFrameCounter()); + const char *frameno = S9xStringInput(buf); + if (!frameno) + return; + + int frameDest = atoi(frameno); + if (frameDest > 0 && frameDest > (int) S9xMovieGetFrameCounter()) + { + int distance = frameDest - S9xMovieGetFrameCounter(); + Settings.HighSpeedSeek = distance; + } + } + + break; + + case LAST_COMMAND: + break; + } + } + + return; + + case S9xPointer: + if (cmd.pointer.aim_mouse0) + { + mouse[0].cur_x = data1; + mouse[0].cur_y = data2; + } + + if (cmd.pointer.aim_mouse1) + { + mouse[1].cur_x = data1; + mouse[1].cur_y = data2; + } + + if (cmd.pointer.aim_scope) + { + superscope.x = data1; + superscope.y = data2; + } + + if (cmd.pointer.aim_justifier0) + { + justifier.x[0] = data1; + justifier.y[0] = data2; + } + + if (cmd.pointer.aim_justifier1) + { + justifier.x[1] = data1; + justifier.y[1] = data2; + } + + return; + + case S9xButtonPseudopointer: + if (data1) + { + if (cmd.button.pointer.UD) + { + if (!pseudopointer[cmd.button.pointer.idx].V_adj) + pseudopointer[cmd.button.pointer.idx].V_adj = cmd.button.pointer.UD * ptrspeeds[cmd.button.pointer.speed_type]; + pseudopointer[cmd.button.pointer.idx].V_var = (cmd.button.pointer.speed_type == 0); + } + + if (cmd.button.pointer.LR) + { + if (!pseudopointer[cmd.button.pointer.idx].H_adj) + pseudopointer[cmd.button.pointer.idx].H_adj = cmd.button.pointer.LR * ptrspeeds[cmd.button.pointer.speed_type]; + pseudopointer[cmd.button.pointer.idx].H_var = (cmd.button.pointer.speed_type == 0); + } + } + else + { + if (cmd.button.pointer.UD) + { + pseudopointer[cmd.button.pointer.idx].V_adj = 0; + pseudopointer[cmd.button.pointer.idx].V_var = false; + } + + if (cmd.button.pointer.LR) + { + pseudopointer[cmd.button.pointer.idx].H_adj = 0; + pseudopointer[cmd.button.pointer.idx].H_var = false; + } + } + + return; + + case S9xAxisJoypad: + { + uint16 pos, neg; + + switch (cmd.axis.joypad.axis) + { + case 0: neg = SNES_LEFT_MASK; pos = SNES_RIGHT_MASK; break; + case 1: neg = SNES_UP_MASK; pos = SNES_DOWN_MASK; break; + case 2: neg = SNES_Y_MASK; pos = SNES_A_MASK; break; + case 3: neg = SNES_X_MASK; pos = SNES_B_MASK; break; + case 4: neg = SNES_TL_MASK; pos = SNES_TR_MASK; break; + default: return; + } + + if (cmd.axis.joypad.invert) + data1 = -data1; + + uint16 p, r; + + p = r = 0; + if (data1 > ((cmd.axis.joypad.threshold + 1) * 127)) + p |= pos; + else + r |= pos; + + if (data1 <= ((cmd.axis.joypad.threshold + 1) * -127)) + p |= neg; + else + r |= neg; + + joypad[cmd.axis.joypad.idx].buttons |= p; + joypad[cmd.axis.joypad.idx].buttons &= ~r; + joypad[cmd.axis.joypad.idx].turbos &= ~(p | r); + + return; + } + + case S9xAxisPseudopointer: + if (data1 == 0) + { + if (cmd.axis.pointer.HV) + { + pseudopointer[cmd.axis.pointer.idx].V_adj = 0; + pseudopointer[cmd.axis.pointer.idx].V_var = false; + } + else + { + pseudopointer[cmd.axis.pointer.idx].H_adj = 0; + pseudopointer[cmd.axis.pointer.idx].H_var = false; + } + } + else + { + if (cmd.axis.pointer.invert) + data1 = -data1; + + if (cmd.axis.pointer.HV) + { + if (!pseudopointer[cmd.axis.pointer.idx].V_adj) + pseudopointer[cmd.axis.pointer.idx].V_adj = (int16) ((int32) data1 * ptrspeeds[cmd.axis.pointer.speed_type] / 32767); + pseudopointer[cmd.axis.pointer.idx].V_var = (cmd.axis.pointer.speed_type == 0); + } + else + { + if (!pseudopointer[cmd.axis.pointer.idx].H_adj) + pseudopointer[cmd.axis.pointer.idx].H_adj = (int16) ((int32) data1 * ptrspeeds[cmd.axis.pointer.speed_type] / 32767); + pseudopointer[cmd.axis.pointer.idx].H_var = (cmd.axis.pointer.speed_type == 0); + } + } + + return; + + case S9xAxisPseudobuttons: + if (data1 > ((cmd.axis.button.threshold + 1) * 127)) + { + if (!pseudobuttons[cmd.axis.button.posbutton]) + { + pseudobuttons[cmd.axis.button.posbutton] = 1; + S9xReportButton(PseudoButtonBase + cmd.axis.button.posbutton, true); + } + } + else + { + if (pseudobuttons[cmd.axis.button.posbutton]) + { + pseudobuttons[cmd.axis.button.posbutton] = 0; + S9xReportButton(PseudoButtonBase + cmd.axis.button.posbutton, false); + } + } + + if (data1 <= ((cmd.axis.button.threshold + 1) * -127)) + { + if (!pseudobuttons[cmd.axis.button.negbutton]) + { + pseudobuttons[cmd.axis.button.negbutton] = 1; + S9xReportButton(PseudoButtonBase + cmd.axis.button.negbutton, true); + } + } + else + { + if (pseudobuttons[cmd.axis.button.negbutton]) + { + pseudobuttons[cmd.axis.button.negbutton] = 0; + S9xReportButton(PseudoButtonBase + cmd.axis.button.negbutton, false); + } + } + + return; + + case S9xButtonPort: + case S9xAxisPort: + case S9xPointerPort: + S9xHandlePortCommand(cmd, data1, data2); + return; + + case S9xButtonMulti: + if (cmd.button.multi_idx >= (int) multis.size()) + return; + + if (multis[cmd.button.multi_idx]->multi_press && !data1) + return; + + i = ApplyMulti(multis[cmd.button.multi_idx], 0, data1); + if (i >= 0) + { + struct exemulti *e = new struct exemulti; + e->pos = i; + e->data1 = data1 != 0; + e->script = multis[cmd.button.multi_idx]; + exemultis.insert(e); + } + + return; + + default: + fprintf(stderr, "WARNING: Unknown command type %d\n", cmd.type); + return; + } +} + +static void do_polling (int mp) +{ + set<uint32>::iterator itr; + + if (S9xMoviePlaying()) + return; + + if (pollmap[mp].empty()) + return; + + for (itr = pollmap[mp].begin(); itr != pollmap[mp].end(); itr++) + { + switch (maptype(keymap[*itr].type)) + { + case MAP_BUTTON: + { + bool pressed; + if (S9xPollButton(*itr, &pressed)) + S9xReportButton(*itr, pressed); + break; + } + + case MAP_AXIS: + { + int16 value; + if (S9xPollAxis(*itr, &value)) + S9xReportAxis(*itr, value); + break; + } + + case MAP_POINTER: + { + int16 x, y; + if (S9xPollPointer(*itr, &x, &y)) + S9xReportPointer(*itr, x, y); + break; + } + + default: + break; + } + } +} + +static void UpdatePolledMouse (int i) +{ + int16 j; + + j = mouse[i - MOUSE0].cur_x - mouse[i - MOUSE0].old_x; + + if (j < -127) + { + mouse[i - MOUSE0].delta_x = 0xff; + mouse[i - MOUSE0].old_x -= 127; + } + else + if (j < 0) + { + mouse[i - MOUSE0].delta_x = 0x80 | -j; + mouse[i - MOUSE0].old_x = mouse[i - MOUSE0].cur_x; + } + else + if (j > 127) + { + mouse[i - MOUSE0].delta_x = 0x7f; + mouse[i - MOUSE0].old_x += 127; + } + else + { + mouse[i - MOUSE0].delta_x = (uint8) j; + mouse[i - MOUSE0].old_x = mouse[i - MOUSE0].cur_x; + } + + j = mouse[i - MOUSE0].cur_y - mouse[i - MOUSE0].old_y; + + if (j < -127) + { + mouse[i - MOUSE0].delta_y = 0xff; + mouse[i - MOUSE0].old_y -= 127; + } + else + if (j < 0) + { + mouse[i - MOUSE0].delta_y = 0x80 | -j; + mouse[i - MOUSE0].old_y = mouse[i - MOUSE0].cur_y; + } + else + if (j > 127) + { + mouse[i - MOUSE0].delta_y = 0x7f; + mouse[i - MOUSE0].old_y += 127; + } + else + { + mouse[i - MOUSE0].delta_y = (uint8) j; + mouse[i - MOUSE0].old_y = mouse[i - MOUSE0].cur_y; + } +} + +void S9xSetJoypadLatch (bool latch) +{ + if (!latch && FLAG_LATCH) + { + // 1 written, 'plug in' new controllers now + curcontrollers[0] = newcontrollers[0]; + curcontrollers[1] = newcontrollers[1]; + } + + if (latch && !FLAG_LATCH) + { + int i; + + for (int n = 0; n < 2; n++) + { + for (int j = 0; j < 2; j++) + read_idx[n][j] = 0; + + switch (i = curcontrollers[n]) + { + case MP5: + for (int j = 0, k = mp5[n].pads[j]; j < 4; k = mp5[n].pads[++j]) + { + if (k == NONE) + continue; + do_polling(k); + } + + break; + + case JOYPAD0: + case JOYPAD1: + case JOYPAD2: + case JOYPAD3: + case JOYPAD4: + case JOYPAD5: + case JOYPAD6: + case JOYPAD7: + do_polling(i); + break; + + case MOUSE0: + case MOUSE1: + do_polling(i); + if (!S9xMoviePlaying()) + UpdatePolledMouse(i); + break; + + case SUPERSCOPE: + if (superscope.next_buttons & SUPERSCOPE_FIRE) + { + superscope.next_buttons &= ~SUPERSCOPE_TURBO; + superscope.next_buttons |= superscope.phys_buttons & SUPERSCOPE_TURBO; + } + + if (superscope.next_buttons & (SUPERSCOPE_FIRE | SUPERSCOPE_CURSOR)) + { + superscope.next_buttons &= ~SUPERSCOPE_OFFSCREEN; + superscope.next_buttons |= superscope.phys_buttons & SUPERSCOPE_OFFSCREEN; + } + + superscope.read_buttons = superscope.next_buttons; + + superscope.next_buttons &= ~SUPERSCOPE_PAUSE; + if (!(superscope.phys_buttons & SUPERSCOPE_TURBO)) + superscope.next_buttons &= ~(SUPERSCOPE_CURSOR | SUPERSCOPE_FIRE); + + do_polling(i); + break; + + case TWO_JUSTIFIERS: + do_polling(TWO_JUSTIFIERS); + // fall through + + case ONE_JUSTIFIER: + justifier.buttons ^= JUSTIFIER_SELECT; + do_polling(ONE_JUSTIFIER); + break; + + default: + break; + } + } + } + + FLAG_LATCH = latch; +} + +uint8 S9xReadJOYSERn (int n) +{ + int i, j, r; + + if (n > 1) + n -= 0x4016; + assert(n == 0 || n == 1); + + uint8 bits = (OpenBus & ~3) | ((n == 1) ? 0x1c : 0); + + if (FLAG_LATCH) + { + switch (i = curcontrollers[n]) + { + case MP5: + return (bits | 2); + + case JOYPAD0: + case JOYPAD1: + case JOYPAD2: + case JOYPAD3: + case JOYPAD4: + case JOYPAD5: + case JOYPAD6: + case JOYPAD7: + return (bits | ((joypad[i - JOYPAD0].buttons & 0x8000) ? 1 : 0)); + + case MOUSE0: + case MOUSE1: + mouse[i - MOUSE0].buttons += 0x10; + if ((mouse[i - MOUSE0].buttons & 0x30) == 0x30) + mouse[i - MOUSE0].buttons &= 0xcf; + return (bits); + + case SUPERSCOPE: + return (bits | ((superscope.read_buttons & 0x80) ? 1 : 0)); + + case ONE_JUSTIFIER: + case TWO_JUSTIFIERS: + return (bits); + + default: + return (bits); + } + } + else + { + switch (i = curcontrollers[n]) + { + case MP5: + r = read_idx[n][FLAG_IOBIT(n) ? 0 : 1]++; + j = FLAG_IOBIT(n) ? 0 : 2; + + for (i = 0; i < 2; i++, j++) + { + if (mp5[n].pads[j] == NONE) + continue; + if (r >= 16) + bits |= 1 << i; + else + bits |= ((joypad[mp5[n].pads[j] - JOYPAD0].buttons & (0x8000 >> r)) ? 1 : 0) << i; + } + + return (bits); + + case JOYPAD0: + case JOYPAD1: + case JOYPAD2: + case JOYPAD3: + case JOYPAD4: + case JOYPAD5: + case JOYPAD6: + case JOYPAD7: + if (read_idx[n][0] >= 16) + { + read_idx[n][0]++; + return (bits | 1); + } + else + return (bits | ((joypad[i - JOYPAD0].buttons & (0x8000 >> read_idx[n][0]++)) ? 1 : 0)); + + case MOUSE0: + case MOUSE1: + if (read_idx[n][0] < 8) + { + read_idx[n][0]++; + return (bits); + } + else + if (read_idx[n][0] < 16) + return (bits | ((mouse[i - MOUSE0].buttons & (0x8000 >> read_idx[n][0]++)) ? 1 : 0)); + else + if (read_idx[n][0] < 24) + return (bits | ((mouse[i - MOUSE0].delta_y & (0x800000 >> read_idx[n][0]++)) ? 1 : 0)); + else + if (read_idx[n][0] < 32) + return (bits | ((mouse[i - MOUSE0].delta_x & (0x80000000 >> read_idx[n][0]++)) ? 1 : 0)); + else + { + read_idx[n][0]++; + return (bits | 1); + } + + case SUPERSCOPE: + if (read_idx[n][0] < 8) + return (bits | ((superscope.read_buttons & (0x80 >> read_idx[n][0]++)) ? 1 : 0)); + else + { + read_idx[n][0]++; + return (bits | 1); + } + + case ONE_JUSTIFIER: + if (read_idx[n][0] < 24) + return (bits | ((0xaa7000 >> read_idx[n][0]++) & 1)); + else + if (read_idx[n][0] < 32) + return (bits | ((justifier.buttons & (JUSTIFIER_TRIGGER | JUSTIFIER_START | JUSTIFIER_SELECT) & (0x80000000 >> read_idx[n][0]++)) ? 1 : 0)); + else + { + read_idx[n][0]++; + return (bits | 1); + } + + case TWO_JUSTIFIERS: + if (read_idx[n][0] < 24) + return (bits | ((0xaa7000 >> read_idx[n][0]++) & 1)); + else + if (read_idx[n][0] < 32) + return (bits | ((justifier.buttons & (0x80000000 >> read_idx[n][0]++)) ? 1 : 0)); + else + { + read_idx[n][0]++; + return (bits | 1); + } + + default: + read_idx[n][0]++; + return (bits); + } + } +} + +void S9xDoAutoJoypad (void) +{ + int i, j; + + S9xSetJoypadLatch(1); + S9xSetJoypadLatch(0); + + S9xMovieUpdate(false); + + for (int n = 0; n < 2; n++) + { + switch (i = curcontrollers[n]) + { + case MP5: + j = FLAG_IOBIT(n) ? 0 : 2; + for (i = 0; i < 2; i++, j++) + { + if (mp5[n].pads[j] == NONE) + WRITE_WORD(Memory.FillRAM + 0x4218 + n * 2 + i * 4, 0); + else + WRITE_WORD(Memory.FillRAM + 0x4218 + n * 2 + i * 4, joypad[mp5[n].pads[j] - JOYPAD0].buttons); + } + + read_idx[n][FLAG_IOBIT(n) ? 0 : 1] = 16; + break; + + case JOYPAD0: + case JOYPAD1: + case JOYPAD2: + case JOYPAD3: + case JOYPAD4: + case JOYPAD5: + case JOYPAD6: + case JOYPAD7: + read_idx[n][0] = 16; + WRITE_WORD(Memory.FillRAM + 0x4218 + n * 2, joypad[i - JOYPAD0].buttons); + WRITE_WORD(Memory.FillRAM + 0x421c + n * 2, 0); + break; + + case MOUSE0: + case MOUSE1: + read_idx[n][0] = 16; + WRITE_WORD(Memory.FillRAM + 0x4218 + n * 2, mouse[i - MOUSE0].buttons); + WRITE_WORD(Memory.FillRAM + 0x421c + n * 2, 0); + break; + + case SUPERSCOPE: + read_idx[n][0] = 16; + Memory.FillRAM[0x4218 + n * 2] = 0xff; + Memory.FillRAM[0x4219 + n * 2] = superscope.read_buttons; + WRITE_WORD(Memory.FillRAM + 0x421c + n * 2, 0); + break; + + case ONE_JUSTIFIER: + case TWO_JUSTIFIERS: + read_idx[n][0] = 16; + WRITE_WORD(Memory.FillRAM + 0x4218 + n * 2, 0x000e); + WRITE_WORD(Memory.FillRAM + 0x421c + n * 2, 0); + break; + + default: + WRITE_WORD(Memory.FillRAM + 0x4218 + n * 2, 0); + WRITE_WORD(Memory.FillRAM + 0x421c + n * 2, 0); + break; + } + } +} + +void S9xControlEOF (void) +{ + struct crosshair *c; + int i, j; + + PPU.GunVLatch = 1000; // i.e., never latch + PPU.GunHLatch = 0; + + for (int n = 0; n < 2; n++) + { + switch (i = curcontrollers[n]) + { + case MP5: + for (j = 0, i = mp5[n].pads[j]; j < 4; i = mp5[n].pads[++j]) + { + if (i == NONE) + continue; + + if (++joypad[i - JOYPAD0].turbo_ct >= turbo_time) + { + joypad[i - JOYPAD0].turbo_ct = 0; + joypad[i - JOYPAD0].buttons ^= joypad[i - JOYPAD0].turbos; + } + } + + break; + + case JOYPAD0: + case JOYPAD1: + case JOYPAD2: + case JOYPAD3: + case JOYPAD4: + case JOYPAD5: + case JOYPAD6: + case JOYPAD7: + if (++joypad[i - JOYPAD0].turbo_ct >= turbo_time) + { + joypad[i - JOYPAD0].turbo_ct = 0; + joypad[i - JOYPAD0].buttons ^= joypad[i - JOYPAD0].turbos; + } + + break; + + case MOUSE0: + case MOUSE1: + c = &mouse[i - MOUSE0].crosshair; + if (IPPU.RenderThisFrame) + S9xDrawCrosshair(S9xGetCrosshair(c->img), c->fg, c->bg, mouse[i - MOUSE0].cur_x, mouse[i - MOUSE0].cur_y); + break; + + case SUPERSCOPE: + if (n == 1 && !(superscope.phys_buttons & SUPERSCOPE_OFFSCREEN)) + { + if (superscope.next_buttons & (SUPERSCOPE_FIRE | SUPERSCOPE_CURSOR)) + DoGunLatch(superscope.x, superscope.y); + + c = &superscope.crosshair; + #ifdef GEKKO + if(GCSettings.crosshair) + #endif + if (IPPU.RenderThisFrame) + S9xDrawCrosshair(S9xGetCrosshair(c->img), c->fg, c->bg, superscope.x, superscope.y); + } + + break; + + case TWO_JUSTIFIERS: + if (n == 1 && !justifier.offscreen[1]) + { + c = &justifier.crosshair[1]; + #ifdef GEKKO + if(GCSettings.crosshair) + #endif + if (IPPU.RenderThisFrame) + S9xDrawCrosshair(S9xGetCrosshair(c->img), c->fg, c->bg, justifier.x[1], justifier.y[1]); + } + + i = (justifier.buttons & JUSTIFIER_SELECT) ? 1 : 0; + goto do_justifier; + + case ONE_JUSTIFIER: + i = (justifier.buttons & JUSTIFIER_SELECT) ? -1 : 0; + + do_justifier: + if (n == 1) + { + if (i >= 0 && !justifier.offscreen[i]) + DoGunLatch(justifier.x[i], justifier.y[i]); + + if (!justifier.offscreen[0]) + { + c = &justifier.crosshair[0]; + #ifdef GEKKO + if(GCSettings.crosshair) + #endif + if (IPPU.RenderThisFrame) + S9xDrawCrosshair(S9xGetCrosshair(c->img), c->fg, c->bg, justifier.x[0], justifier.y[0]); + } + } + + break; + + default: + break; + } + } + + for (int n = 0; n < 8; n++) + { + if (!pseudopointer[n].mapped) + continue; + + if (pseudopointer[n].H_adj) + { + pseudopointer[n].x += pseudopointer[n].H_adj; + if (pseudopointer[n].x < 0) + pseudopointer[n].x = 0; + else + if (pseudopointer[n].x > 255) + pseudopointer[n].x = 255; + + if (pseudopointer[n].H_var) + { + if (pseudopointer[n].H_adj < 0) + { + if (pseudopointer[n].H_adj > -ptrspeeds[3]) + pseudopointer[n].H_adj--; + } + else + { + if (pseudopointer[n].H_adj < ptrspeeds[3]) + pseudopointer[n].H_adj++; + } + } + } + + if (pseudopointer[n].V_adj) + { + pseudopointer[n].y += pseudopointer[n].V_adj; + if (pseudopointer[n].y < 0) + pseudopointer[n].y = 0; + else + if (pseudopointer[n].y > PPU.ScreenHeight - 1) + pseudopointer[n].y = PPU.ScreenHeight - 1; + + if (pseudopointer[n].V_var) + { + if (pseudopointer[n].V_adj < 0) + { + if (pseudopointer[n].V_adj > -ptrspeeds[3]) + pseudopointer[n].V_adj--; + } + else + { + if (pseudopointer[n].V_adj < ptrspeeds[3]) + pseudopointer[n].V_adj++; + } + } + } + + S9xReportPointer(PseudoPointerBase + n, pseudopointer[n].x, pseudopointer[n].y); + } + + set<struct exemulti *>::iterator it, jt; + + for (it = exemultis.begin(); it != exemultis.end(); it++) + { + i = ApplyMulti((*it)->script, (*it)->pos, (*it)->data1); + + if (i >= 0) + (*it)->pos = i; + else + { + jt = it; + it--; + delete *jt; + exemultis.erase(jt); + } + } + + do_polling(POLL_ALL); + + S9xMovieUpdate(); + + pad_read_last = pad_read; + pad_read = false; +} + +void S9xSetControllerCrosshair (enum crosscontrols ctl, int8 idx, const char *fg, const char *bg) +{ + struct crosshair *c; + int8 fgcolor = -1, bgcolor = -1; + int i, j; + + if (idx < -1 || idx > 31) + { + fprintf(stderr, "S9xSetControllerCrosshair() called with invalid index\n"); + return; + } + + switch (ctl) + { + case X_MOUSE1: c = &mouse[0].crosshair; break; + case X_MOUSE2: c = &mouse[1].crosshair; break; + case X_SUPERSCOPE: c = &superscope.crosshair; break; + case X_JUSTIFIER1: c = &justifier.crosshair[0]; break; + case X_JUSTIFIER2: c = &justifier.crosshair[1]; break; + default: + fprintf(stderr, "S9xSetControllerCrosshair() called with an invalid controller ID %d\n", ctl); + return; + } + + if (fg) + { + fgcolor = 0; + if (*fg == 't') + { + fg++; + fgcolor = 16; + } + + for (i = 0; i < 16; i++) + { + for (j = 0; color_names[i][j] && fg[j] == color_names[i][j]; j++) ; + if (isalnum(fg[j])) + continue; + + if (!color_names[i][j]) + break; + } + + fgcolor |= i; + if (i > 15 || fgcolor == 16) + { + fprintf(stderr, "S9xSetControllerCrosshair() called with invalid fgcolor\n"); + return; + } + } + + if (bg) + { + bgcolor = 0; + if (*bg == 't') + { + bg++; + bgcolor = 16; + } + + for (i = 0; i < 16; i++) + { + for (j = 0; color_names[i][j] && bg[j] == color_names[i][j]; j++) ; + if (isalnum(bg[j])) + continue; + + if (!color_names[i][j]) + break; + } + + bgcolor |= i; + if (i > 15 || bgcolor == 16) + { + fprintf(stderr, "S9xSetControllerCrosshair() called with invalid bgcolor\n"); + return; + } + } + + if (idx != -1) + { + c->set |= 1; + c->img = idx; + } + + if (fgcolor != -1) + { + c->set |= 2; + c->fg = fgcolor; + } + + if (bgcolor != -1) + { + c->set |= 4; + c->bg = bgcolor; + } +} + +void S9xGetControllerCrosshair (enum crosscontrols ctl, int8 *idx, const char **fg, const char **bg) +{ + struct crosshair *c; + + switch (ctl) + { + case X_MOUSE1: c = &mouse[0].crosshair; break; + case X_MOUSE2: c = &mouse[1].crosshair; break; + case X_SUPERSCOPE: c = &superscope.crosshair; break; + case X_JUSTIFIER1: c = &justifier.crosshair[0]; break; + case X_JUSTIFIER2: c = &justifier.crosshair[1]; break; + default: + fprintf(stderr, "S9xGetControllerCrosshair() called with an invalid controller ID %d\n", ctl); + return; + } + + if (idx) + *idx = c->img; + + if (fg) + *fg = color_names[c->fg]; + + if (bg) + *bg = color_names[c->bg]; +} + +void S9xControlPreSaveState (struct SControlSnapshot *s) +{ + ZeroMemory(s, sizeof(*s)); + s->ver = 3; + + for (int j = 0; j < 2; j++) + { + s->port1_read_idx[j] = read_idx[0][j]; + s->port2_read_idx[j] = read_idx[1][j]; + } + + for (int j = 0; j < 2; j++) + s->mouse_speed[j] = (mouse[j].buttons & 0x30) >> 4; + + s->justifier_select = ((justifier.buttons & JUSTIFIER_SELECT) ? 1 : 0); + +#define COPY(x) { memcpy((char *) s->internal + i, &(x), sizeof(x)); i += sizeof(x); } + + int i = 0; + + for (int j = 0; j < 8; j++) + COPY(joypad[j].buttons); + + for (int j = 0; j < 2; j++) + { + COPY(mouse[j].delta_x); + COPY(mouse[j].delta_y); + COPY(mouse[j].old_x); + COPY(mouse[j].old_y); + COPY(mouse[j].cur_x); + COPY(mouse[j].cur_y); + COPY(mouse[j].buttons); + } + + COPY(superscope.x); + COPY(superscope.y); + COPY(superscope.phys_buttons); + COPY(superscope.next_buttons); + COPY(superscope.read_buttons); + + for (int j = 0; j < 2; j++) + COPY(justifier.x[j]); + for (int j = 0; j < 2; j++) + COPY(justifier.y[j]); + COPY(justifier.buttons); + for (int j = 0; j < 2; j++) + COPY(justifier.offscreen[j]); + + for (int j = 0; j < 2; j++) + for (int k = 0; k < 2; k++) + COPY(mp5[j].pads[k]); + + assert(i == sizeof(s->internal)); + +#undef COPY + + s->pad_read = pad_read; + s->pad_read_last = pad_read_last; +} + +void S9xControlPostLoadState (struct SControlSnapshot *s) +{ + if (curcontrollers[0] == MP5 && s->ver < 1) + { + // Crap. Old snes9x didn't support this. + S9xMessage(S9X_WARNING, S9X_FREEZE_FILE_INFO, "Old savestate has no support for MP5 in port 1."); + newcontrollers[0] = curcontrollers[0]; + curcontrollers[0] = mp5[0].pads[0]; + } + + for (int j = 0; j < 2; j++) + { + read_idx[0][j] = s->port1_read_idx[j]; + read_idx[1][j] = s->port2_read_idx[j]; + } + + for (int j = 0; j < 2; j++) + mouse[j].buttons |= (s->mouse_speed[j] & 3) << 4; + + if (s->justifier_select & 1) + justifier.buttons |= JUSTIFIER_SELECT; + else + justifier.buttons &= ~JUSTIFIER_SELECT; + + FLAG_LATCH = (Memory.FillRAM[0x4016] & 1) == 1; + + if (s->ver > 1) + { + #define COPY(x) { memcpy(&(x), (char *) s->internal + i, sizeof(x)); i += sizeof(x); } + + int i = 0; + + for (int j = 0; j < 8; j++) + COPY(joypad[j].buttons); + + for (int j = 0; j < 2; j++) + { + COPY(mouse[j].delta_x); + COPY(mouse[j].delta_y); + COPY(mouse[j].old_x); + COPY(mouse[j].old_y); + COPY(mouse[j].cur_x); + COPY(mouse[j].cur_y); + COPY(mouse[j].buttons); + } + + COPY(superscope.x); + COPY(superscope.y); + COPY(superscope.phys_buttons); + COPY(superscope.next_buttons); + COPY(superscope.read_buttons); + + for (int j = 0; j < 2; j++) + COPY(justifier.x[j]); + for (int j = 0; j < 2; j++) + COPY(justifier.y[j]); + COPY(justifier.buttons); + for (int j = 0; j < 2; j++) + COPY(justifier.offscreen[j]); + for (int j = 0; j < 2; j++) + for (int k = 0; k < 2; k++) + COPY(mp5[j].pads[k]); + + assert(i == sizeof(s->internal)); + + #undef COPY + } + + if (s->ver > 2) + { + pad_read = s->pad_read; + pad_read_last = s->pad_read_last; + } +} + +uint16 MovieGetJoypad (int i) +{ + if (i < 0 || i > 7) + return (0); + + return (joypad[i].buttons); +} + +void MovieSetJoypad (int i, uint16 buttons) +{ + if (i < 0 || i > 7) + return; + + joypad[i].buttons = buttons; +} + +bool MovieGetMouse (int i, uint8 out[5]) +{ + if (i < 0 || i > 1 || (curcontrollers[i] != MOUSE0 && curcontrollers[i] != MOUSE1)) + return (false); + + int n = curcontrollers[i] - MOUSE0; + uint8 *ptr = out; + + WRITE_WORD(ptr, mouse[n].cur_x); ptr += 2; + WRITE_WORD(ptr, mouse[n].cur_y); ptr += 2; + *ptr = mouse[n].buttons; + + return (true); +} + +void MovieSetMouse (int i, uint8 in[5], bool inPolling) +{ + if (i < 0 || i > 1 || (curcontrollers[i] != MOUSE0 && curcontrollers[i] != MOUSE1)) + return; + + int n = curcontrollers[i] - MOUSE0; + uint8 *ptr = in; + + mouse[n].cur_x = READ_WORD(ptr); ptr += 2; + mouse[n].cur_y = READ_WORD(ptr); ptr += 2; + mouse[n].buttons = *ptr; + + if (inPolling) + UpdatePolledMouse(curcontrollers[i]); +} + +bool MovieGetScope (int i, uint8 out[6]) +{ + if (i < 0 || i > 1 || curcontrollers[i] != SUPERSCOPE) + return (false); + + uint8 *ptr = out; + + WRITE_WORD(ptr, superscope.x); ptr += 2; + WRITE_WORD(ptr, superscope.y); ptr += 2; + *ptr++ = superscope.phys_buttons; + *ptr = superscope.next_buttons; + + return (true); +} + +void MovieSetScope (int i, uint8 in[6]) +{ + if (i < 0 || i > 1 || curcontrollers[i] != SUPERSCOPE) + return; + + uint8 *ptr = in; + + superscope.x = READ_WORD(ptr); ptr += 2; + superscope.y = READ_WORD(ptr); ptr += 2; + superscope.phys_buttons = *ptr++; + superscope.next_buttons = *ptr; +} + +bool MovieGetJustifier (int i, uint8 out[11]) +{ + if (i < 0 || i > 1 || (curcontrollers[i] != ONE_JUSTIFIER && curcontrollers[i] != TWO_JUSTIFIERS)) + return (false); + + uint8 *ptr = out; + + WRITE_WORD(ptr, justifier.x[0]); ptr += 2; + WRITE_WORD(ptr, justifier.x[1]); ptr += 2; + WRITE_WORD(ptr, justifier.y[0]); ptr += 2; + WRITE_WORD(ptr, justifier.y[1]); ptr += 2; + *ptr++ = justifier.buttons; + *ptr++ = justifier.offscreen[0]; + *ptr = justifier.offscreen[1]; + + return (true); +} + +void MovieSetJustifier (int i, uint8 in[11]) +{ + if (i < 0 || i > 1 || (curcontrollers[i] != ONE_JUSTIFIER && curcontrollers[i] != TWO_JUSTIFIERS)) + return; + + uint8 *ptr = in; + + justifier.x[0] = READ_WORD(ptr); ptr += 2; + justifier.x[1] = READ_WORD(ptr); ptr += 2; + justifier.y[0] = READ_WORD(ptr); ptr += 2; + justifier.y[1] = READ_WORD(ptr); ptr += 2; + justifier.buttons = *ptr++; + justifier.offscreen[0] = *ptr++; + justifier.offscreen[1] = *ptr; +} diff --git a/plugins/snes9x_gx/source/snes9x/controls.h b/plugins/snes9x_gx/source/snes9x/controls.h new file mode 100644 index 00000000..8772f62c --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/controls.h @@ -0,0 +1,453 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _CONTROLS_H_ +#define _CONTROLS_H_ + +#define S9xNoMapping 0 +#define S9xButtonJoypad 1 +#define S9xButtonMouse 2 +#define S9xButtonSuperscope 3 +#define S9xButtonJustifier 4 +#define S9xButtonCommand 5 +#define S9xButtonMulti 6 +#define S9xAxisJoypad 7 +#define S9xPointer 8 + +#define S9xButtonPseudopointer 254 +#define S9xAxisPseudopointer 253 +#define S9xAxisPseudobuttons 252 + +// These are automatically kicked out to the S9xHandlePortCommand function. +// If your port wants to define port-specific commands or whatever, use these values for the s9xcommand_t type field. + +#define S9xButtonPort 251 +#define S9xAxisPort 250 +#define S9xPointerPort 249 + +#define S9xBadMapping 255 +#define InvalidControlID ((uint32) -1) + +// S9xButtonPseudopointer and S9xAxisPseudopointer will report pointer motion using IDs PseudoPointerBase through PseudoPointerBase+7. +// S9xAxisPseudopointer command types. S9xAxisPseudobuttons will report buttons with IDs PseudoButtonBase to PseudoButtonBase+255. + +#define PseudoPointerBase (InvalidControlID - 8) +#define PseudoButtonBase (PseudoPointerBase - 256) + +typedef struct +{ + uint8 type; + uint8 multi_press:2; + uint8 button_norpt:1; + + union + { + union + { + struct + { + uint8 idx:3; // Pad number 0-7 + uint8 toggle:1; // If set, toggle turbo/sticky for the button + uint8 turbo:1; // If set, be a 'turbo' button + uint8 sticky:1; // If set, toggle button state (on/turbo or off) when pressed and do nothing on release + uint16 buttons; // Which buttons to actuate. Use SNES_*_MASK constants from snes9x.h + } joypad; + + struct + { + uint8 idx:1; // Mouse number 0-1 + uint8 left:1; // buttons + uint8 right:1; + } mouse; + + struct + { + uint8 fire:1; + uint8 cursor:1; + uint8 turbo:1; + uint8 pause:1; + uint8 aim_offscreen:1; // Pretend we're pointing the gun offscreen (ignore the pointer) + } scope; + + struct + { + uint8 idx:3; // Pseudo-pointer number 0-7 + uint8 speed_type:2; // 0=variable, 1=slow, 2=med, 3=fast + int8 UD:2; // -1=up, 1=down, 0=no vertical motion + int8 LR:2; // -1=left, 1=right, 0=no horizontal motion + } pointer; + + struct + { + uint8 idx:1; // Justifier number 0-1 + uint8 trigger:1; // buttons + uint8 start:1; + uint8 aim_offscreen:1; // Pretend we're pointing the gun offscreen (ignore the pointer) + } justifier; + + int32 multi_idx; + uint16 command; + } button; + + union + { + struct + { + uint8 idx:3; // Pad number 0-7 + uint8 invert:1; // 1 = positive is Left/Up/Y/X/L + uint8 axis:3; // 0=Left/Right, 1=Up/Down, 2=Y/A, 3=X/B, 4=L/R + uint8 threshold; // (threshold+1)/256% deflection is a button press + } joypad; + + struct + { + uint8 idx:3; // Pseudo-pointer number 0-7 + uint8 speed_type:2; // 0=variable, 1=slow, 2=med, 3=fast + uint8 invert:1; // 1 = invert axis, so positive is up/left + uint8 HV:1; // 0=horizontal, 1=vertical + } pointer; + + struct + { + uint8 threshold; // (threshold+1)/256% deflection is a button press + uint8 negbutton; // Button ID for negative deflection + uint8 posbutton; // Button ID for positive deflection + } button; + } axis; + + struct // Which SNES-pointers to control with this pointer + { + uint16 aim_mouse0:1; + uint16 aim_mouse1:1; + uint16 aim_scope:1; + uint16 aim_justifier0:1; + uint16 aim_justifier1:1; + } pointer; + + uint8 port[4]; + }; +} s9xcommand_t; + +// Starting out... + +void S9xUnmapAllControls (void); + +// Setting which controllers are plugged in. + +enum controllers +{ + CTL_NONE, // all ids ignored + CTL_JOYPAD, // use id1 to specify 0-7 + CTL_MOUSE, // use id1 to specify 0-1 + CTL_SUPERSCOPE, + CTL_JUSTIFIER, // use id1: 0=one justifier, 1=two justifiers + CTL_MP5 // use id1-id4 to specify pad 0-7 (or -1) +}; + +void S9xSetController (int port, enum controllers controller, int8 id1, int8 id2, int8 id3, int8 id4); // port=0-1 +void S9xGetController (int port, enum controllers *controller, int8 *id1, int8 *id2, int8 *id3, int8 *id4); +void S9xReportControllers (void); + +// Call this when you're done with S9xSetController, or if you change any of the controller Settings.*Master flags. +// Returns true if something was disabled. + +bool S9xVerifyControllers (void); + +// Functions for translation s9xcommand_t's into strings, and vice versa. +// free() the returned string after you're done with it. + +char * S9xGetCommandName (s9xcommand_t command); +s9xcommand_t S9xGetCommandT (const char *name); + +// Returns an array of strings naming all the snes9x commands. +// Note that this is only the strings for S9xButtonCommand! +// The idea is that this would be used for a pull-down list in a config GUI. DO NOT free() the returned value. + +const char ** S9xGetAllSnes9xCommands (void); + +// Generic mapping functions + +s9xcommand_t S9xGetMapping (uint32 id); +void S9xUnmapID (uint32 id); + +// Button mapping functions. +// If a button is mapped with poll=TRUE, then S9xPollButton will be called whenever snes9x feels a need for that mapping. +// Otherwise, snes9x will assume you will call S9xReportButton() whenever the button state changes. +// S9xMapButton() will fail and return FALSE if mapping.type isn't an S9xButton* type. + +bool S9xMapButton (uint32 id, s9xcommand_t mapping, bool poll); +void S9xReportButton (uint32 id, bool pressed); + +// Pointer mapping functions. +// If a pointer is mapped with poll=TRUE, then S9xPollPointer will be called whenever snes9x feels a need for that mapping. +// Otherwise, snes9x will assume you will call S9xReportPointer() whenever the pointer position changes. +// S9xMapPointer() will fail and return FALSE if mapping.type isn't an S9xPointer* type. + +// Note that position [0,0] is considered the upper-left corner of the 'screen', +// and either [255,223] or [255,239] is the lower-right. +// Note that the SNES mouse doesn't aim at a particular point, +// so the SNES's idea of where the mouse pointer is will probably differ from your OS's idea. + +bool S9xMapPointer (uint32 id, s9xcommand_t mapping, bool poll); +void S9xReportPointer (uint32 id, int16 x, int16 y); + +// Axis mapping functions. +// If an axis is mapped with poll=TRUE, then S9xPollAxis will be called whenever snes9x feels a need for that mapping. +// Otherwise, snes9x will assume you will call S9xReportAxis() whenever the axis deflection changes. +// S9xMapAxis() will fail and return FALSE if mapping.type isn't an S9xAxis* type. + +// Note that value is linear -32767 through 32767 with 0 being no deflection. +// If your axis reports differently you should transform the value before passing it to S9xReportAxis(). + +bool S9xMapAxis (uint32 id, s9xcommand_t mapping, bool poll); +void S9xReportAxis (uint32 id, int16 value); + +// Do whatever the s9xcommand_t says to do. +// If cmd.type is a button type, data1 should be TRUE (non-0) or FALSE (0) to indicate whether the 'button' is pressed or released. +// If cmd.type is an axis, data1 holds the deflection value. +// If cmd.type is a pointer, data1 and data2 are the positions of the pointer. + +void S9xApplyCommand (s9xcommand_t cmd, int16 data1, int16 data2); + +////////// +// These functions are called by snes9x into your port, so each port should implement them. + +// If something was mapped with poll=TRUE, these functions will be called when snes9x needs the button/axis/pointer state. +// Fill in the reference options as appropriate. + +bool S9xPollButton (uint32 id, bool *pressed); +bool S9xPollPointer (uint32 id, int16 *x, int16 *y); +bool S9xPollAxis (uint32 id, int16 *value); + +// These are called when snes9x tries to apply a command with a S9x*Port type. +// data1 and data2 are filled in like S9xApplyCommand. + +void S9xHandlePortCommand (s9xcommand_t cmd, int16 data1, int16 data2); + +// Called before already-read SNES joypad data is being used by the game if your port defines SNES_JOY_READ_CALLBACKS. + +#ifdef SNES_JOY_READ_CALLBACKS +void S9xOnSNESPadRead (void); +#endif + +// These are for your use. + +s9xcommand_t S9xGetPortCommandT (const char *name); +char * S9xGetPortCommandName (s9xcommand_t command); +void S9xSetupDefaultKeymap (void); +bool8 S9xMapInput (const char *name, s9xcommand_t *cmd); + +////////// +// These functions are called from snes9x into this subsystem. No need to use them from a port. + +// Use when resetting snes9x. + +void S9xControlsReset (void); +void S9xControlsSoftReset (void); + +// Use when writing to $4016. + +void S9xSetJoypadLatch (bool latch); + +// Use when reading $4016/7 (JOYSER0 and JOYSER1). + +uint8 S9xReadJOYSERn (int n); + +// End-Of-Frame processing. Sets gun latch variables and tries to draw crosshairs + +void S9xControlEOF (void); + +// Functions and a structure for snapshot. + +struct SControlSnapshot +{ + uint8 ver; + uint8 port1_read_idx[2]; + uint8 dummy1[4]; // for future expansion + uint8 port2_read_idx[2]; + uint8 dummy2[4]; + uint8 mouse_speed[2]; + uint8 justifier_select; + uint8 dummy3[8]; + bool8 pad_read, pad_read_last; + uint8 internal[60]; // yes, we need to save this! +}; + +void S9xControlPreSaveState (struct SControlSnapshot *s); +void S9xControlPostLoadState (struct SControlSnapshot *s); + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/cpu.cpp b/plugins/snes9x_gx/source/snes9x/cpu.cpp new file mode 100644 index 00000000..f2efb4ce --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/cpu.cpp @@ -0,0 +1,338 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#include "snes9x.h" +#include "memmap.h" +#include "dma.h" +#include "apu/apu.h" +#include "fxemu.h" +#include "sdd1.h" +#include "srtc.h" +#include "snapshot.h" +#include "cheats.h" +#include "logger.h" +#ifdef DEBUGGER +#include "debug.h" +#endif + +static void S9xResetCPU (void); +static void S9xSoftResetCPU (void); + + +static void S9xResetCPU (void) +{ + S9xSoftResetCPU(); + Registers.SL = 0xff; + Registers.P.W = 0; + Registers.A.W = 0; + Registers.X.W = 0; + Registers.Y.W = 0; + SetFlags(MemoryFlag | IndexFlag | IRQ | Emulation); + ClearFlags(Decimal); +} + +static void S9xSoftResetCPU (void) +{ + CPU.Cycles = 182; // Or 188. This is the cycle count just after the jump to the Reset Vector. + CPU.PrevCycles = -1; + CPU.V_Counter = 0; + CPU.Flags = CPU.Flags & (DEBUG_MODE_FLAG | TRACE_FLAG); + CPU.PCBase = NULL; + CPU.IRQActive = FALSE; + CPU.IRQPending = 0; + CPU.MemSpeed = SLOW_ONE_CYCLE; + CPU.MemSpeedx2 = SLOW_ONE_CYCLE * 2; + CPU.FastROMSpeed = SLOW_ONE_CYCLE; + CPU.InDMA = FALSE; + CPU.InHDMA = FALSE; + CPU.InDMAorHDMA = FALSE; + CPU.InWRAMDMAorHDMA = FALSE; + CPU.HDMARanInDMA = 0; + CPU.CurrentDMAorHDMAChannel = -1; + CPU.WhichEvent = HC_RENDER_EVENT; + CPU.NextEvent = Timings.RenderPos; + CPU.WaitingForInterrupt = FALSE; + CPU.WaitAddress = 0xffffffff; + CPU.WaitCounter = 0; + CPU.PBPCAtOpcodeStart = 0xffffffff; + CPU.AutoSaveTimer = 0; + CPU.SRAMModified = FALSE; + + Registers.PBPC = 0; + Registers.PB = 0; + Registers.PCw = S9xGetWord(0xfffc); + OpenBus = Registers.PCh; + Registers.D.W = 0; + Registers.DB = 0; + Registers.SH = 1; + Registers.SL -= 3; + Registers.XH = 0; + Registers.YH = 0; + + ICPU.ShiftedPB = 0; + ICPU.ShiftedDB = 0; + SetFlags(MemoryFlag | IndexFlag | IRQ | Emulation); + ClearFlags(Decimal); + + Timings.InterlaceField = FALSE; + Timings.H_Max = Timings.H_Max_Master; + Timings.V_Max = Timings.V_Max_Master; + Timings.NMITriggerPos = 0xffff; + if (Model->_5A22 == 2) + Timings.WRAMRefreshPos = SNES_WRAM_REFRESH_HC_v2; + else + Timings.WRAMRefreshPos = SNES_WRAM_REFRESH_HC_v1; + + S9xSetPCBase(Registers.PBPC); + + ICPU.S9xOpcodes = S9xOpcodesE1; + ICPU.S9xOpLengths = S9xOpLengthsM1X1; + ICPU.CPUExecuting = TRUE; + + S9xUnpackStatus(); +} + +void S9xReset (void) +{ + S9xResetSaveTimer(FALSE); + S9xResetLogger(); + + memset(Memory.RAM, 0x55, 0x20000); + memset(Memory.VRAM, 0x00, 0x10000); + ZeroMemory(Memory.FillRAM, 0x8000); + + if (Settings.BS) + S9xResetBSX(); + + S9xResetCPU(); + S9xResetPPU(); + S9xResetDMA(); + S9xResetAPU(); + + if (Settings.DSP) + S9xResetDSP(); + if (Settings.SuperFX) + S9xResetSuperFX(); + if (Settings.SA1) + S9xSA1Init(); + if (Settings.SDD1) + S9xResetSDD1(); + if (Settings.SPC7110) + S9xResetSPC7110(); + if (Settings.C4) + S9xInitC4(); + if (Settings.OBC1) + S9xResetOBC1(); + if (Settings.SRTC) + S9xResetSRTC(); + + S9xInitCheatData(); +} + +void S9xSoftReset (void) +{ + S9xResetSaveTimer(FALSE); + + ZeroMemory(Memory.FillRAM, 0x8000); + + if (Settings.BS) + S9xResetBSX(); + + S9xSoftResetCPU(); + S9xSoftResetPPU(); + S9xResetDMA(); + S9xSoftResetAPU(); + + if (Settings.DSP) + S9xResetDSP(); + if (Settings.SuperFX) + S9xResetSuperFX(); + if (Settings.SA1) + S9xSA1Init(); + if (Settings.SDD1) + S9xResetSDD1(); + if (Settings.SPC7110) + S9xResetSPC7110(); + if (Settings.C4) + S9xInitC4(); + if (Settings.OBC1) + S9xResetOBC1(); + if (Settings.SRTC) + S9xResetSRTC(); + + S9xInitCheatData(); +} diff --git a/plugins/snes9x_gx/source/snes9x/cpuaddr.h b/plugins/snes9x_gx/source/snes9x/cpuaddr.h new file mode 100644 index 00000000..3ae55c41 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/cpuaddr.h @@ -0,0 +1,690 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _CPUADDR_H_ +#define _CPUADDR_H_ + +typedef enum +{ + NONE = 0, + READ = 1, + WRITE = 2, + MODIFY = 3, + JUMP = 5, + JSR = 8 +} AccessMode; + +static inline uint8 Immediate8Slow (AccessMode a) +{ + uint8 val = S9xGetByte(Registers.PBPC); + if (a & READ) + OpenBus = val; + Registers.PCw++; + + return (val); +} + +static inline uint8 Immediate8 (AccessMode a) +{ + uint8 val = CPU.PCBase[Registers.PCw]; + if (a & READ) + OpenBus = val; + AddCycles(CPU.MemSpeed); + Registers.PCw++; + + return (val); +} + +static inline uint16 Immediate16Slow (AccessMode a) +{ + uint16 val = S9xGetWord(Registers.PBPC, WRAP_BANK); + if (a & READ) + OpenBus = (uint8) (val >> 8); + Registers.PCw += 2; + + return (val); +} + +static inline uint16 Immediate16 (AccessMode a) +{ + uint16 val = READ_WORD(CPU.PCBase + Registers.PCw); + if (a & READ) + OpenBus = (uint8) (val >> 8); + AddCycles(CPU.MemSpeedx2); + Registers.PCw += 2; + + return (val); +} + +static inline uint32 RelativeSlow (AccessMode a) // branch $xx +{ + int8 offset = Immediate8Slow(a); + + return ((int16) Registers.PCw + offset) & 0xffff; +} + +static inline uint32 Relative (AccessMode a) // branch $xx +{ + int8 offset = Immediate8(a); + + return ((int16) Registers.PCw + offset) & 0xffff; +} + +static inline uint32 RelativeLongSlow (AccessMode a) // BRL $xxxx +{ + int16 offset = Immediate16Slow(a); + + return ((int32) Registers.PCw + offset) & 0xffff; +} + +static inline uint32 RelativeLong (AccessMode a) // BRL $xxxx +{ + int16 offset = Immediate16(a); + + return ((int32) Registers.PCw + offset) & 0xffff; +} + +static inline uint32 AbsoluteIndexedIndirectSlow (AccessMode a) // (a,X) +{ + uint16 addr; + + if (a & JSR) + { + // JSR (a,X) pushes the old address in the middle of loading the new. + // OpenBus needs to be set to account for this. + addr = Immediate8Slow(READ); + if (a == JSR) + OpenBus = Registers.PCl; + addr |= Immediate8Slow(READ) << 8; + } + else + addr = Immediate16Slow(READ); + + AddCycles(ONE_CYCLE); + addr += Registers.X.W; + + // Address load wraps within the bank + uint16 addr2 = S9xGetWord(ICPU.ShiftedPB | addr, WRAP_BANK); + OpenBus = addr2 >> 8; + + return (addr2); +} + +static inline uint32 AbsoluteIndexedIndirect (AccessMode a) // (a,X) +{ + uint16 addr = Immediate16Slow(READ); + addr += Registers.X.W; + + // Address load wraps within the bank + uint16 addr2 = S9xGetWord(ICPU.ShiftedPB | addr, WRAP_BANK); + OpenBus = addr2 >> 8; + + return (addr2); +} + +static inline uint32 AbsoluteIndirectLongSlow (AccessMode a) // [a] +{ + uint16 addr = Immediate16Slow(READ); + + // No info on wrapping, but it doesn't matter anyway due to mirroring + uint32 addr2 = S9xGetWord(addr); + OpenBus = addr2 >> 8; + addr2 |= (OpenBus = S9xGetByte(addr + 2)) << 16; + + return (addr2); +} + +static inline uint32 AbsoluteIndirectLong (AccessMode a) // [a] +{ + uint16 addr = Immediate16(READ); + + // No info on wrapping, but it doesn't matter anyway due to mirroring + uint32 addr2 = S9xGetWord(addr); + OpenBus = addr2 >> 8; + addr2 |= (OpenBus = S9xGetByte(addr + 2)) << 16; + + return (addr2); +} + +static inline uint32 AbsoluteIndirectSlow (AccessMode a) // (a) +{ + // No info on wrapping, but it doesn't matter anyway due to mirroring + uint16 addr2 = S9xGetWord(Immediate16Slow(READ)); + OpenBus = addr2 >> 8; + + return (addr2); +} + +static inline uint32 AbsoluteIndirect (AccessMode a) // (a) +{ + // No info on wrapping, but it doesn't matter anyway due to mirroring + uint16 addr2 = S9xGetWord(Immediate16(READ)); + OpenBus = addr2 >> 8; + + return (addr2); +} + +static inline uint32 AbsoluteSlow (AccessMode a) // a +{ + return (ICPU.ShiftedDB | Immediate16Slow(a)); +} + +static inline uint32 Absolute (AccessMode a) // a +{ + return (ICPU.ShiftedDB | Immediate16(a)); +} + +static inline uint32 AbsoluteLongSlow (AccessMode a) // l +{ + uint32 addr = Immediate16Slow(READ); + + // JSR l pushes the old bank in the middle of loading the new. + // OpenBus needs to be set to account for this. + if (a == JSR) + OpenBus = Registers.PB; + + addr |= Immediate8Slow(a) << 16; + + return (addr); +} + +static inline uint32 AbsoluteLong (AccessMode a) // l +{ + uint32 addr = READ_3WORD(CPU.PCBase + Registers.PCw); + AddCycles(CPU.MemSpeedx2 + CPU.MemSpeed); + if (a & READ) + OpenBus = addr >> 16; + Registers.PCw += 3; + + return (addr); +} + +static inline uint32 DirectSlow (AccessMode a) // d +{ + uint16 addr = Immediate8Slow(a) + Registers.D.W; + if (Registers.DL != 0) + AddCycles(ONE_CYCLE); + + return (addr); +} + +static inline uint32 Direct (AccessMode a) // d +{ + uint16 addr = Immediate8(a) + Registers.D.W; + if (Registers.DL != 0) + AddCycles(ONE_CYCLE); + + return (addr); +} + +static inline uint32 DirectIndirectSlow (AccessMode a) // (d) +{ + uint32 addr = S9xGetWord(DirectSlow(READ), (!CheckEmulation() || Registers.DL) ? WRAP_BANK : WRAP_PAGE); + if (a & READ) + OpenBus = (uint8) (addr >> 8); + addr |= ICPU.ShiftedDB; + + return (addr); +} + +static inline uint32 DirectIndirectE0 (AccessMode a) // (d) +{ + uint32 addr = S9xGetWord(Direct(READ)); + if (a & READ) + OpenBus = (uint8) (addr >> 8); + addr |= ICPU.ShiftedDB; + + return (addr); +} + +static inline uint32 DirectIndirectE1 (AccessMode a) // (d) +{ + uint32 addr = S9xGetWord(DirectSlow(READ), Registers.DL ? WRAP_BANK : WRAP_PAGE); + if (a & READ) + OpenBus = (uint8) (addr >> 8); + addr |= ICPU.ShiftedDB; + + return (addr); +} + +static inline uint32 DirectIndirectIndexedSlow (AccessMode a) // (d),Y +{ + uint32 addr = DirectIndirectSlow(a); + if (a & WRITE || !CheckIndex() || (addr & 0xff) + Registers.YL >= 0x100) + AddCycles(ONE_CYCLE); + + return (addr + Registers.Y.W); +} + +static inline uint32 DirectIndirectIndexedE0X0 (AccessMode a) // (d),Y +{ + uint32 addr = DirectIndirectE0(a); + AddCycles(ONE_CYCLE); + + return (addr + Registers.Y.W); +} + +static inline uint32 DirectIndirectIndexedE0X1 (AccessMode a) // (d),Y +{ + uint32 addr = DirectIndirectE0(a); + if (a & WRITE || (addr & 0xff) + Registers.YL >= 0x100) + AddCycles(ONE_CYCLE); + + return (addr + Registers.Y.W); +} + +static inline uint32 DirectIndirectIndexedE1 (AccessMode a) // (d),Y +{ + uint32 addr = DirectIndirectE1(a); + if (a & WRITE || (addr & 0xff) + Registers.YL >= 0x100) + AddCycles(ONE_CYCLE); + + return (addr + Registers.Y.W); +} + +static inline uint32 DirectIndirectLongSlow (AccessMode a) // [d] +{ + uint16 addr = DirectSlow(READ); + uint32 addr2 = S9xGetWord(addr); + OpenBus = addr2 >> 8; + addr2 |= (OpenBus = S9xGetByte(addr + 2)) << 16; + + return (addr2); +} + +static inline uint32 DirectIndirectLong (AccessMode a) // [d] +{ + uint16 addr = Direct(READ); + uint32 addr2 = S9xGetWord(addr); + OpenBus = addr2 >> 8; + addr2 |= (OpenBus = S9xGetByte(addr + 2)) << 16; + + return (addr2); +} + +static inline uint32 DirectIndirectIndexedLongSlow (AccessMode a) // [d],Y +{ + return (DirectIndirectLongSlow(a) + Registers.Y.W); +} + +static inline uint32 DirectIndirectIndexedLong (AccessMode a) // [d],Y +{ + return (DirectIndirectLong(a) + Registers.Y.W); +} + +static inline uint32 DirectIndexedXSlow (AccessMode a) // d,X +{ + pair addr; + addr.W = DirectSlow(a); + if (!CheckEmulation() || Registers.DL) + addr.W += Registers.X.W; + else + addr.B.l += Registers.XL; + + AddCycles(ONE_CYCLE); + + return (addr.W); +} + +static inline uint32 DirectIndexedXE0 (AccessMode a) // d,X +{ + uint16 addr = Direct(a) + Registers.X.W; + AddCycles(ONE_CYCLE); + + return (addr); +} + +static inline uint32 DirectIndexedXE1 (AccessMode a) // d,X +{ + if (Registers.DL) + return (DirectIndexedXE0(a)); + else + { + pair addr; + addr.W = Direct(a); + addr.B.l += Registers.XL; + AddCycles(ONE_CYCLE); + + return (addr.W); + } +} + +static inline uint32 DirectIndexedYSlow (AccessMode a) // d,Y +{ + pair addr; + addr.W = DirectSlow(a); + if (!CheckEmulation() || Registers.DL) + addr.W += Registers.Y.W; + else + addr.B.l += Registers.YL; + + AddCycles(ONE_CYCLE); + + return (addr.W); +} + +static inline uint32 DirectIndexedYE0 (AccessMode a) // d,Y +{ + uint16 addr = Direct(a) + Registers.Y.W; + AddCycles(ONE_CYCLE); + + return (addr); +} + +static inline uint32 DirectIndexedYE1 (AccessMode a) // d,Y +{ + if (Registers.DL) + return (DirectIndexedYE0(a)); + else + { + pair addr; + addr.W = Direct(a); + addr.B.l += Registers.YL; + AddCycles(ONE_CYCLE); + + return (addr.W); + } +} + +static inline uint32 DirectIndexedIndirectSlow (AccessMode a) // (d,X) +{ + uint32 addr = S9xGetWord(DirectIndexedXSlow(READ), (!CheckEmulation() || Registers.DL) ? WRAP_BANK : WRAP_PAGE); + if (a & READ) + OpenBus = (uint8) (addr >> 8); + + return (ICPU.ShiftedDB | addr); +} + +static inline uint32 DirectIndexedIndirectE0 (AccessMode a) // (d,X) +{ + uint32 addr = S9xGetWord(DirectIndexedXE0(READ)); + if (a & READ) + OpenBus = (uint8) (addr >> 8); + + return (ICPU.ShiftedDB | addr); +} + +static inline uint32 DirectIndexedIndirectE1 (AccessMode a) // (d,X) +{ + uint32 addr = S9xGetWord(DirectIndexedXE1(READ), Registers.DL ? WRAP_BANK : WRAP_PAGE); + if (a & READ) + OpenBus = (uint8) (addr >> 8); + + return (ICPU.ShiftedDB | addr); +} + +static inline uint32 AbsoluteIndexedXSlow (AccessMode a) // a,X +{ + uint32 addr = AbsoluteSlow(a); + if (a & WRITE || !CheckIndex() || (addr & 0xff) + Registers.XL >= 0x100) + AddCycles(ONE_CYCLE); + + return (addr + Registers.X.W); +} + +static inline uint32 AbsoluteIndexedXX0 (AccessMode a) // a,X +{ + uint32 addr = Absolute(a); + AddCycles(ONE_CYCLE); + + return (addr + Registers.X.W); +} + +static inline uint32 AbsoluteIndexedXX1 (AccessMode a) // a,X +{ + uint32 addr = Absolute(a); + if (a & WRITE || (addr & 0xff) + Registers.XL >= 0x100) + AddCycles(ONE_CYCLE); + + return (addr + Registers.X.W); +} + +static inline uint32 AbsoluteIndexedYSlow (AccessMode a) // a,Y +{ + uint32 addr = AbsoluteSlow(a); + if (a & WRITE || !CheckIndex() || (addr & 0xff) + Registers.YL >= 0x100) + AddCycles(ONE_CYCLE); + + return (addr + Registers.Y.W); +} + +static inline uint32 AbsoluteIndexedYX0 (AccessMode a) // a,Y +{ + uint32 addr = Absolute(a); + AddCycles(ONE_CYCLE); + + return (addr + Registers.Y.W); +} + +static inline uint32 AbsoluteIndexedYX1 (AccessMode a) // a,Y +{ + uint32 addr = Absolute(a); + if (a & WRITE || (addr & 0xff) + Registers.YL >= 0x100) + AddCycles(ONE_CYCLE); + + return (addr + Registers.Y.W); +} + +static inline uint32 AbsoluteLongIndexedXSlow (AccessMode a) // l,X +{ + return (AbsoluteLongSlow(a) + Registers.X.W); +} + +static inline uint32 AbsoluteLongIndexedX (AccessMode a) // l,X +{ + return (AbsoluteLong(a) + Registers.X.W); +} + +static inline uint32 StackRelativeSlow (AccessMode a) // d,S +{ + uint16 addr = Immediate8Slow(a) + Registers.S.W; + AddCycles(ONE_CYCLE); + + return (addr); +} + +static inline uint32 StackRelative (AccessMode a) // d,S +{ + uint16 addr = Immediate8(a) + Registers.S.W; + AddCycles(ONE_CYCLE); + + return (addr); +} + +static inline uint32 StackRelativeIndirectIndexedSlow (AccessMode a) // (d,S),Y +{ + uint32 addr = S9xGetWord(StackRelativeSlow(READ)); + if (a & READ) + OpenBus = (uint8) (addr >> 8); + addr = (addr + Registers.Y.W + ICPU.ShiftedDB) & 0xffffff; + AddCycles(ONE_CYCLE); + + return (addr); +} + +static inline uint32 StackRelativeIndirectIndexed (AccessMode a) // (d,S),Y +{ + uint32 addr = S9xGetWord(StackRelative(READ)); + if (a & READ) + OpenBus = (uint8) (addr >> 8); + addr = (addr + Registers.Y.W + ICPU.ShiftedDB) & 0xffffff; + AddCycles(ONE_CYCLE); + + return (addr); +} + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/cpuexec.cpp b/plugins/snes9x_gx/source/snes9x/cpuexec.cpp new file mode 100644 index 00000000..4bd4c256 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/cpuexec.cpp @@ -0,0 +1,594 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#include "snes9x.h" +#include "memmap.h" +#include "cpuops.h" +#include "dma.h" +#include "apu/apu.h" +#include "fxemu.h" +#include "snapshot.h" +#ifdef DEBUGGER +#include "debug.h" +#include "missing.h" +#endif + + +void S9xMainLoop (void) +{ + for (;;) + { + if (CPU.Flags) + { + if (CPU.Flags & NMI_FLAG) + { + if (Timings.NMITriggerPos <= CPU.Cycles) + { + CPU.Flags &= ~NMI_FLAG; + Timings.NMITriggerPos = 0xffff; + if (CPU.WaitingForInterrupt) + { + CPU.WaitingForInterrupt = FALSE; + Registers.PCw++; + } + + S9xOpcode_NMI(); + } + } + + #ifdef DEBUGGER + if ((CPU.Flags & BREAK_FLAG) && !(CPU.Flags & SINGLE_STEP_FLAG)) + { + for (int Break = 0; Break != 6; Break++) + { + if (S9xBreakpoint[Break].Enabled && + S9xBreakpoint[Break].Bank == Registers.PB && + S9xBreakpoint[Break].Address == Registers.PCw) + { + if (S9xBreakpoint[Break].Enabled == 2) + S9xBreakpoint[Break].Enabled = TRUE; + else + CPU.Flags |= DEBUG_MODE_FLAG; + } + } + } + #endif + + if (CPU.Flags & IRQ_FLAG) + { + if (CPU.IRQPending) + // FIXME: In case of IRQ during WRAM refresh + CPU.IRQPending--; + else + { + if (CPU.WaitingForInterrupt) + { + CPU.WaitingForInterrupt = FALSE; + Registers.PCw++; + } + + if (CPU.IRQActive && !Settings.DisableIRQ) + { + if (!CheckFlag(IRQ)) + // in IRQ handler $4211 is supposed to be read, so IRQ_FLAG should be cleared. + S9xOpcode_IRQ(); + } + else + CPU.Flags &= ~IRQ_FLAG; + } + } + + if (CPU.Flags & SCAN_KEYS_FLAG) + break; + + #ifdef DEBUGGER + if (CPU.Flags & DEBUG_MODE_FLAG) + break; + + if (CPU.Flags & TRACE_FLAG) + S9xTrace(); + + if (CPU.Flags & SINGLE_STEP_FLAG) + { + CPU.Flags &= ~SINGLE_STEP_FLAG; + CPU.Flags |= DEBUG_MODE_FLAG; + } + #endif + } + + #ifdef CPU_SHUTDOWN + CPU.PBPCAtOpcodeStart = Registers.PBPC; + #endif + + register uint8 Op; + register struct SOpcodes *Opcodes; + + CPU.PrevCycles = CPU.Cycles; + + if (CPU.PCBase) + { + Op = CPU.PCBase[Registers.PCw]; + CPU.Cycles += CPU.MemSpeed; + Opcodes = ICPU.S9xOpcodes; + } + else + { + Op = S9xGetByte(Registers.PBPC); + OpenBus = Op; + Opcodes = S9xOpcodesSlow; + } + + if ((Registers.PCw & MEMMAP_MASK) + ICPU.S9xOpLengths[Op] >= MEMMAP_BLOCK_SIZE) + { + uint8 *oldPCBase = CPU.PCBase; + + CPU.PCBase = S9xGetBasePointer(ICPU.ShiftedPB + ((uint16) (Registers.PCw + 4))); + if (oldPCBase != CPU.PCBase || (Registers.PCw & ~MEMMAP_MASK) == (0xffff & ~MEMMAP_MASK)) + Opcodes = S9xOpcodesSlow; + } + + Registers.PCw++; + (*Opcodes[Op].S9xOpcode)(); + + if (SA1.Executing) + S9xSA1MainLoop(); + + #if (S9X_ACCURACY_LEVEL <= 2) + while (CPU.Cycles >= CPU.NextEvent) + S9xDoHEventProcessing(); + #endif + } + + S9xPackStatus(); + + if (CPU.Flags & SCAN_KEYS_FLAG) + { + #ifdef DEBUGGER + if (!(CPU.Flags & FRAME_ADVANCE_FLAG)) + #endif + S9xSyncSpeed(); + CPU.Flags &= ~SCAN_KEYS_FLAG; + } +} + +void S9xSetIRQ (uint32 source) +{ + CPU.IRQActive |= source; + CPU.IRQPending = Timings.IRQPendCount; + CPU.Flags |= IRQ_FLAG; + + if (CPU.WaitingForInterrupt) + { + // Force IRQ to trigger immediately after WAI - + // Final Fantasy Mystic Quest crashes without this. + CPU.WaitingForInterrupt = FALSE; + Registers.PCw++; + } + +#ifdef DEBUGGER + S9xTraceMessage("--- /IRQ low"); +#endif +} + +void S9xClearIRQ (uint32 source) +{ + CPU.IRQActive &= ~source; + if (!CPU.IRQActive) + CPU.Flags &= ~IRQ_FLAG; + +#ifdef DEBUGGER + S9xTraceMessage("--- /IRQ high"); +#endif +} + +void S9xDoHEventProcessing (void) +{ +#ifdef DEBUGGER + static char eventname[13][32] = + { + "", + "HC_HBLANK_START_EVENT", + "HC_IRQ_1_3_EVENT ", + "HC_HDMA_START_EVENT ", + "HC_IRQ_3_5_EVENT ", + "HC_HCOUNTER_MAX_EVENT", + "HC_IRQ_5_7_EVENT ", + "HC_HDMA_INIT_EVENT ", + "HC_IRQ_7_9_EVENT ", + "HC_RENDER_EVENT ", + "HC_IRQ_9_A_EVENT ", + "HC_WRAM_REFRESH_EVENT", + "HC_IRQ_A_1_EVENT " + }; +#endif + +#ifdef DEBUGGER + if (Settings.TraceHCEvent) + S9xTraceFormattedMessage("--- HC event processing (%s) expected HC:%04d executed HC:%04d", + eventname[CPU.WhichEvent], CPU.NextEvent, CPU.Cycles); +#endif + +#ifdef CPU_SHUTDOWN + CPU.WaitCounter++; +#endif + + switch (CPU.WhichEvent) + { + case HC_HBLANK_START_EVENT: + S9xCheckMissingHTimerPosition(Timings.HBlankStart); + S9xReschedule(); + break; + + case HC_HDMA_START_EVENT: + S9xCheckMissingHTimerPosition(Timings.HDMAStart); + S9xReschedule(); + + if (PPU.HDMA && CPU.V_Counter <= PPU.ScreenHeight) + { + #ifdef DEBUGGER + S9xTraceFormattedMessage("*** HDMA Transfer HC:%04d, Channel:%02x", CPU.Cycles, PPU.HDMA); + #endif + PPU.HDMA = S9xDoHDMA(PPU.HDMA); + } + + break; + + case HC_HCOUNTER_MAX_EVENT: + if (Settings.SuperFX) + { + if (!SuperFX.oneLineDone) + S9xSuperFXExec(); + SuperFX.oneLineDone = FALSE; + } + + S9xAPUEndScanline(); + CPU.Cycles -= Timings.H_Max; + S9xAPUSetReferenceTime(CPU.Cycles); + + if ((Timings.NMITriggerPos != 0xffff) && (Timings.NMITriggerPos >= Timings.H_Max)) + Timings.NMITriggerPos -= Timings.H_Max; + + CPU.V_Counter++; + if (CPU.V_Counter >= Timings.V_Max) // V ranges from 0 to Timings.V_Max - 1 + { + CPU.V_Counter = 0; + Timings.InterlaceField ^= 1; + + // From byuu: + // [NTSC] + // interlace mode has 525 scanlines: 263 on the even frame, and 262 on the odd. + // non-interlace mode has 524 scanlines: 262 scanlines on both even and odd frames. + // [PAL] <PAL info is unverified on hardware> + // interlace mode has 625 scanlines: 313 on the even frame, and 312 on the odd. + // non-interlace mode has 624 scanlines: 312 scanlines on both even and odd frames. + if (IPPU.Interlace && !Timings.InterlaceField) + Timings.V_Max = Timings.V_Max_Master + 1; // 263 (NTSC), 313?(PAL) + else + Timings.V_Max = Timings.V_Max_Master; // 262 (NTSC), 312?(PAL) + + Memory.FillRAM[0x213F] ^= 0x80; + PPU.RangeTimeOver = 0; + + // FIXME: reading $4210 will wait 2 cycles, then perform reading, then wait 4 more cycles. + Memory.FillRAM[0x4210] = Model->_5A22; + CPU.Flags &= ~NMI_FLAG; + Timings.NMITriggerPos = 0xffff; + + ICPU.Frame++; + PPU.HVBeamCounterLatched = 0; + CPU.Flags |= SCAN_KEYS_FLAG; + } + + // From byuu: + // In non-interlace mode, there are 341 dots per scanline, and 262 scanlines per frame. + // On odd frames, scanline 240 is one dot short. + // In interlace mode, there are always 341 dots per scanline. Even frames have 263 scanlines, + // and odd frames have 262 scanlines. + // Interlace mode scanline 240 on odd frames is not missing a dot. + if (CPU.V_Counter == 240 && !IPPU.Interlace && Timings.InterlaceField) // V=240 + Timings.H_Max = Timings.H_Max_Master - ONE_DOT_CYCLE; // HC=1360 + else + Timings.H_Max = Timings.H_Max_Master; // HC=1364 + + if (Model->_5A22 == 2) + { + if (CPU.V_Counter != 240 || IPPU.Interlace || !Timings.InterlaceField) // V=240 + { + if (Timings.WRAMRefreshPos == SNES_WRAM_REFRESH_HC_v2 - ONE_DOT_CYCLE) // HC=534 + Timings.WRAMRefreshPos = SNES_WRAM_REFRESH_HC_v2; // HC=538 + else + Timings.WRAMRefreshPos = SNES_WRAM_REFRESH_HC_v2 - ONE_DOT_CYCLE; // HC=534 + } + } + else + Timings.WRAMRefreshPos = SNES_WRAM_REFRESH_HC_v1; + + S9xCheckMissingHTimerPosition(0); + + if (CPU.V_Counter == PPU.ScreenHeight + FIRST_VISIBLE_LINE) // VBlank starts from V=225(240). + { + S9xEndScreenRefresh(); + PPU.HDMA = 0; + // Bits 7 and 6 of $4212 are computed when read in S9xGetPPU. + #ifdef DEBUGGER + missing.dma_this_frame = 0; + #endif + IPPU.MaxBrightness = PPU.Brightness; + PPU.ForcedBlanking = (Memory.FillRAM[0x2100] >> 7) & 1; + + if (!PPU.ForcedBlanking) + { + PPU.OAMAddr = PPU.SavedOAMAddr; + + uint8 tmp = 0; + + if (PPU.OAMPriorityRotation) + tmp = (PPU.OAMAddr & 0xFE) >> 1; + if ((PPU.OAMFlip & 1) || PPU.FirstSprite != tmp) + { + PPU.FirstSprite = tmp; + IPPU.OBJChanged = TRUE; + } + + PPU.OAMFlip = 0; + } + + // FIXME: writing to $4210 will wait 6 cycles. + Memory.FillRAM[0x4210] = 0x80 | Model->_5A22; + if (Memory.FillRAM[0x4200] & 0x80) + { + // FIXME: triggered at HC=6, checked just before the final CPU cycle, + // then, when to call S9xOpcode_NMI()? + CPU.Flags |= NMI_FLAG; + Timings.NMITriggerPos = 6 + 6; + } + + } + + if (CPU.V_Counter == PPU.ScreenHeight + 3) // FIXME: not true + { + if (Memory.FillRAM[0x4200] & 1) + S9xDoAutoJoypad(); + } + + if (CPU.V_Counter == FIRST_VISIBLE_LINE) // V=1 + S9xStartScreenRefresh(); + + CPU.NextEvent = -1; + S9xReschedule(); + + break; + + case HC_HDMA_INIT_EVENT: + S9xCheckMissingHTimerPosition(Timings.HDMAInit); + S9xReschedule(); + + if (CPU.V_Counter == 0) + { + #ifdef DEBUGGER + S9xTraceFormattedMessage("*** HDMA Init HC:%04d, Channel:%02x", CPU.Cycles, PPU.HDMA); + #endif + S9xStartHDMA(); + } + + break; + + case HC_RENDER_EVENT: + if (CPU.V_Counter >= FIRST_VISIBLE_LINE && CPU.V_Counter <= PPU.ScreenHeight) + RenderLine((uint8) (CPU.V_Counter - FIRST_VISIBLE_LINE)); + + S9xCheckMissingHTimerPosition(Timings.RenderPos); + S9xReschedule(); + + break; + + case HC_WRAM_REFRESH_EVENT: + #ifdef DEBUGGER + S9xTraceFormattedMessage("*** WRAM Refresh HC:%04d", CPU.Cycles); + #endif + + S9xCheckMissingHTimerHalt(Timings.WRAMRefreshPos, SNES_WRAM_REFRESH_CYCLES); + CPU.Cycles += SNES_WRAM_REFRESH_CYCLES; + + S9xCheckMissingHTimerPosition(Timings.WRAMRefreshPos); + S9xReschedule(); + + break; + + case HC_IRQ_1_3_EVENT: + case HC_IRQ_3_5_EVENT: + case HC_IRQ_5_7_EVENT: + case HC_IRQ_7_9_EVENT: + case HC_IRQ_9_A_EVENT: + case HC_IRQ_A_1_EVENT: + if (PPU.HTimerEnabled && (!PPU.VTimerEnabled || (CPU.V_Counter == PPU.VTimerPosition))) + S9xSetIRQ(PPU_IRQ_SOURCE); + else + if (PPU.VTimerEnabled && (CPU.V_Counter == PPU.VTimerPosition)) + S9xSetIRQ(PPU_IRQ_SOURCE); + + S9xReschedule(); + break; + } + +#ifdef DEBUGGER + if (Settings.TraceHCEvent) + S9xTraceFormattedMessage("--- HC event rescheduled (%s) expected HC:%04d current HC:%04d", + eventname[CPU.WhichEvent], CPU.NextEvent, CPU.Cycles); +#endif +} + diff --git a/plugins/snes9x_gx/source/snes9x/cpuexec.h b/plugins/snes9x_gx/source/snes9x/cpuexec.h new file mode 100644 index 00000000..b11cff61 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/cpuexec.h @@ -0,0 +1,353 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _CPUEXEC_H_ +#define _CPUEXEC_H_ + +#include "ppu.h" + +struct SOpcodes +{ + void (*S9xOpcode) (void); +}; + +struct SICPU +{ + struct SOpcodes *S9xOpcodes; + uint8 *S9xOpLengths; + uint8 _Carry; + uint8 _Zero; + uint8 _Negative; + uint8 _Overflow; + bool8 CPUExecuting; + uint32 ShiftedPB; + uint32 ShiftedDB; + uint32 Frame; + uint32 FrameAdvanceCount; +}; + +extern struct SICPU ICPU; + +extern struct SOpcodes S9xOpcodesE1[256]; +extern struct SOpcodes S9xOpcodesM1X1[256]; +extern struct SOpcodes S9xOpcodesM1X0[256]; +extern struct SOpcodes S9xOpcodesM0X1[256]; +extern struct SOpcodes S9xOpcodesM0X0[256]; +extern struct SOpcodes S9xOpcodesSlow[256]; +extern uint8 S9xOpLengthsM1X1[256]; +extern uint8 S9xOpLengthsM1X0[256]; +extern uint8 S9xOpLengthsM0X1[256]; +extern uint8 S9xOpLengthsM0X0[256]; + +void S9xMainLoop (void); +void S9xReset (void); +void S9xSoftReset (void); +void S9xDoHEventProcessing (void); +void S9xClearIRQ (uint32); +void S9xSetIRQ (uint32); + +static inline void S9xUnpackStatus (void) +{ + ICPU._Zero = (Registers.PL & Zero) == 0; + ICPU._Negative = (Registers.PL & Negative); + ICPU._Carry = (Registers.PL & Carry); + ICPU._Overflow = (Registers.PL & Overflow) >> 6; +} + +static inline void S9xPackStatus (void) +{ + Registers.PL &= ~(Zero | Negative | Carry | Overflow); + Registers.PL |= ICPU._Carry | ((ICPU._Zero == 0) << 1) | (ICPU._Negative & 0x80) | (ICPU._Overflow << 6); +} + +static inline void S9xFixCycles (void) +{ + if (CheckEmulation()) + { + ICPU.S9xOpcodes = S9xOpcodesE1; + ICPU.S9xOpLengths = S9xOpLengthsM1X1; + } + else + if (CheckMemory()) + { + if (CheckIndex()) + { + ICPU.S9xOpcodes = S9xOpcodesM1X1; + ICPU.S9xOpLengths = S9xOpLengthsM1X1; + } + else + { + ICPU.S9xOpcodes = S9xOpcodesM1X0; + ICPU.S9xOpLengths = S9xOpLengthsM1X0; + } + } + else + { + if (CheckIndex()) + { + ICPU.S9xOpcodes = S9xOpcodesM0X1; + ICPU.S9xOpLengths = S9xOpLengthsM0X1; + } + else + { + ICPU.S9xOpcodes = S9xOpcodesM0X0; + ICPU.S9xOpLengths = S9xOpLengthsM0X0; + } + } +} + +static inline void S9xReschedule (void) +{ + uint8 next = 0; + int32 hpos = 0; + + switch (CPU.WhichEvent) + { + case HC_HBLANK_START_EVENT: + case HC_IRQ_1_3_EVENT: + next = HC_HDMA_START_EVENT; + hpos = Timings.HDMAStart; + break; + + case HC_HDMA_START_EVENT: + case HC_IRQ_3_5_EVENT: + next = HC_HCOUNTER_MAX_EVENT; + hpos = Timings.H_Max; + break; + + case HC_HCOUNTER_MAX_EVENT: + case HC_IRQ_5_7_EVENT: + next = HC_HDMA_INIT_EVENT; + hpos = Timings.HDMAInit; + break; + + case HC_HDMA_INIT_EVENT: + case HC_IRQ_7_9_EVENT: + next = HC_RENDER_EVENT; + hpos = Timings.RenderPos; + break; + + case HC_RENDER_EVENT: + case HC_IRQ_9_A_EVENT: + next = HC_WRAM_REFRESH_EVENT; + hpos = Timings.WRAMRefreshPos; + break; + + case HC_WRAM_REFRESH_EVENT: + case HC_IRQ_A_1_EVENT: + next = HC_HBLANK_START_EVENT; + hpos = Timings.HBlankStart; + break; + } + + if (((int32) PPU.HTimerPosition > CPU.NextEvent) && ((int32) PPU.HTimerPosition < hpos)) + { + hpos = (int32) PPU.HTimerPosition; + + switch (next) + { + case HC_HDMA_START_EVENT: + next = HC_IRQ_1_3_EVENT; + break; + + case HC_HCOUNTER_MAX_EVENT: + next = HC_IRQ_3_5_EVENT; + break; + + case HC_HDMA_INIT_EVENT: + next = HC_IRQ_5_7_EVENT; + break; + + case HC_RENDER_EVENT: + next = HC_IRQ_7_9_EVENT; + break; + + case HC_WRAM_REFRESH_EVENT: + next = HC_IRQ_9_A_EVENT; + break; + + case HC_HBLANK_START_EVENT: + next = HC_IRQ_A_1_EVENT; + break; + } + } + + CPU.NextEvent = hpos; + CPU.WhichEvent = next; +} + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/cpumacro.h b/plugins/snes9x_gx/source/snes9x/cpumacro.h new file mode 100644 index 00000000..9b1fc4cb --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/cpumacro.h @@ -0,0 +1,904 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _CPUMACRO_H_ +#define _CPUMACRO_H_ + +#define rOP8(OP, ADDR, WRAP, FUNC) \ +static void Op##OP (void) \ +{ \ + uint8 val = OpenBus = S9xGetByte(ADDR(READ)); \ + FUNC(val); \ +} + +#define rOP16(OP, ADDR, WRAP, FUNC) \ +static void Op##OP (void) \ +{ \ + uint16 val = S9xGetWord(ADDR(READ), WRAP); \ + OpenBus = (uint8) (val >> 8); \ + FUNC(val); \ +} + +#define rOPC(OP, COND, ADDR, WRAP, FUNC) \ +static void Op##OP (void) \ +{ \ + if (Check##COND()) \ + { \ + uint8 val = OpenBus = S9xGetByte(ADDR(READ)); \ + FUNC(val); \ + } \ + else \ + { \ + uint16 val = S9xGetWord(ADDR(READ), WRAP); \ + OpenBus = (uint8) (val >> 8); \ + FUNC(val); \ + } \ +} + +#define rOPM(OP, ADDR, WRAP, FUNC) \ +rOPC(OP, Memory, ADDR, WRAP, FUNC) + +#define rOPX(OP, ADDR, WRAP, FUNC) \ +rOPC(OP, Index, ADDR, WRAP, FUNC) + +#define wOP8(OP, ADDR, WRAP, FUNC) \ +static void Op##OP (void) \ +{ \ + FUNC##8(ADDR(WRITE)); \ +} + +#define wOP16(OP, ADDR, WRAP, FUNC) \ +static void Op##OP (void) \ +{ \ + FUNC##16(ADDR(WRITE), WRAP); \ +} + +#define wOPC(OP, COND, ADDR, WRAP, FUNC) \ +static void Op##OP (void) \ +{ \ + if (Check##COND()) \ + FUNC##8(ADDR(WRITE)); \ + else \ + FUNC##16(ADDR(WRITE), WRAP); \ +} + +#define wOPM(OP, ADDR, WRAP, FUNC) \ +wOPC(OP, Memory, ADDR, WRAP, FUNC) + +#define wOPX(OP, ADDR, WRAP, FUNC) \ +wOPC(OP, Index, ADDR, WRAP, FUNC) + +#define mOP8(OP, ADDR, WRAP, FUNC) \ +static void Op##OP (void) \ +{ \ + FUNC##8(ADDR(MODIFY)); \ +} + +#define mOP16(OP, ADDR, WRAP, FUNC) \ +static void Op##OP (void) \ +{ \ + FUNC##16(ADDR(MODIFY), WRAP); \ +} + +#define mOPC(OP, COND, ADDR, WRAP, FUNC) \ +static void Op##OP (void) \ +{ \ + if (Check##COND()) \ + FUNC##8(ADDR(MODIFY)); \ + else \ + FUNC##16(ADDR(MODIFY), WRAP); \ +} + +#define mOPM(OP, ADDR, WRAP, FUNC) \ +mOPC(OP, Memory, ADDR, WRAP, FUNC) + +#define bOP(OP, REL, COND, CHK, E) \ +static void Op##OP (void) \ +{ \ + pair newPC; \ + newPC.W = REL(JUMP); \ + if (COND) \ + { \ + AddCycles(ONE_CYCLE); \ + if (E && Registers.PCh != newPC.B.h) \ + AddCycles(ONE_CYCLE); \ + if ((Registers.PCw & ~MEMMAP_MASK) != (newPC.W & ~MEMMAP_MASK)) \ + S9xSetPCBase(ICPU.ShiftedPB + newPC.W); \ + else \ + Registers.PCw = newPC.W; \ + CPUShutdown(); \ + } \ +} + + +static inline void SetZN (uint16 Work16) +{ + ICPU._Zero = Work16 != 0; + ICPU._Negative = (uint8) (Work16 >> 8); +} + +static inline void SetZN (uint8 Work8) +{ + ICPU._Zero = Work8; + ICPU._Negative = Work8; +} + +static inline void ADC (uint16 Work16) +{ + if (CheckDecimal()) + { + uint16 A1 = Registers.A.W & 0x000F; + uint16 A2 = Registers.A.W & 0x00F0; + uint16 A3 = Registers.A.W & 0x0F00; + uint32 A4 = Registers.A.W & 0xF000; + uint16 W1 = Work16 & 0x000F; + uint16 W2 = Work16 & 0x00F0; + uint16 W3 = Work16 & 0x0F00; + uint16 W4 = Work16 & 0xF000; + + A1 += W1 + CheckCarry(); + if (A1 > 0x0009) + { + A1 -= 0x000A; + A1 &= 0x000F; + A2 += 0x0010; + } + + A2 += W2; + if (A2 > 0x0090) + { + A2 -= 0x00A0; + A2 &= 0x00F0; + A3 += 0x0100; + } + + A3 += W3; + if (A3 > 0x0900) + { + A3 -= 0x0A00; + A3 &= 0x0F00; + A4 += 0x1000; + } + + A4 += W4; + if (A4 > 0x9000) + { + A4 -= 0xA000; + A4 &= 0xF000; + SetCarry(); + } + else + ClearCarry(); + + uint16 Ans16 = A4 | A3 | A2 | A1; + + if (~(Registers.A.W ^ Work16) & (Work16 ^ Ans16) & 0x8000) + SetOverflow(); + else + ClearOverflow(); + + Registers.A.W = Ans16; + SetZN(Registers.A.W); + } + else + { + uint32 Ans32 = Registers.A.W + Work16 + CheckCarry(); + + ICPU._Carry = Ans32 >= 0x10000; + + if (~(Registers.A.W ^ Work16) & (Work16 ^ (uint16) Ans32) & 0x8000) + SetOverflow(); + else + ClearOverflow(); + + Registers.A.W = (uint16) Ans32; + SetZN(Registers.A.W); + } +} + +static inline void ADC (uint8 Work8) +{ + if (CheckDecimal()) + { + uint8 A1 = Registers.A.W & 0x0F; + uint16 A2 = Registers.A.W & 0xF0; + uint8 W1 = Work8 & 0x0F; + uint8 W2 = Work8 & 0xF0; + + A1 += W1 + CheckCarry(); + if (A1 > 0x09) + { + A1 -= 0x0A; + A1 &= 0x0F; + A2 += 0x10; + } + + A2 += W2; + if (A2 > 0x90) + { + A2 -= 0xA0; + A2 &= 0xF0; + SetCarry(); + } + else + ClearCarry(); + + uint8 Ans8 = A2 | A1; + + if (~(Registers.AL ^ Work8) & (Work8 ^ Ans8) & 0x80) + SetOverflow(); + else + ClearOverflow(); + + Registers.AL = Ans8; + SetZN(Registers.AL); + } + else + { + uint16 Ans16 = Registers.AL + Work8 + CheckCarry(); + + ICPU._Carry = Ans16 >= 0x100; + + if (~(Registers.AL ^ Work8) & (Work8 ^ (uint8) Ans16) & 0x80) + SetOverflow(); + else + ClearOverflow(); + + Registers.AL = (uint8) Ans16; + SetZN(Registers.AL); + } +} + +static inline void AND (uint16 Work16) +{ + Registers.A.W &= Work16; + SetZN(Registers.A.W); +} + +static inline void AND (uint8 Work8) +{ + Registers.AL &= Work8; + SetZN(Registers.AL); +} + +static inline void ASL16 (uint32 OpAddress, s9xwrap_t w) +{ + uint16 Work16 = S9xGetWord(OpAddress, w); + ICPU._Carry = (Work16 & 0x8000) != 0; + Work16 <<= 1; + AddCycles(ONE_CYCLE); + S9xSetWord(Work16, OpAddress, w, WRITE_10); + OpenBus = Work16 & 0xff; + SetZN(Work16); +} + +static inline void ASL8 (uint32 OpAddress) +{ + uint8 Work8 = S9xGetByte(OpAddress); + ICPU._Carry = (Work8 & 0x80) != 0; + Work8 <<= 1; + AddCycles(ONE_CYCLE); + S9xSetByte(Work8, OpAddress); + OpenBus = Work8; + SetZN(Work8); +} + +static inline void BIT (uint16 Work16) +{ + ICPU._Overflow = (Work16 & 0x4000) != 0; + ICPU._Negative = (uint8) (Work16 >> 8); + ICPU._Zero = (Work16 & Registers.A.W) != 0; +} + +static inline void BIT (uint8 Work8) +{ + ICPU._Overflow = (Work8 & 0x40) != 0; + ICPU._Negative = Work8; + ICPU._Zero = Work8 & Registers.AL; +} + +static inline void CMP (uint16 val) +{ + int32 Int32 = (int32) Registers.A.W - (int32) val; + ICPU._Carry = Int32 >= 0; + SetZN((uint16) Int32); +} + +static inline void CMP (uint8 val) +{ + int16 Int16 = (int16) Registers.AL - (int16) val; + ICPU._Carry = Int16 >= 0; + SetZN((uint8) Int16); +} + +static inline void CPX (uint16 val) +{ + int32 Int32 = (int32) Registers.X.W - (int32) val; + ICPU._Carry = Int32 >= 0; + SetZN((uint16) Int32); +} + +static inline void CPX (uint8 val) +{ + int16 Int16 = (int16) Registers.XL - (int16) val; + ICPU._Carry = Int16 >= 0; + SetZN((uint8) Int16); +} + +static inline void CPY (uint16 val) +{ + int32 Int32 = (int32) Registers.Y.W - (int32) val; + ICPU._Carry = Int32 >= 0; + SetZN((uint16) Int32); +} + +static inline void CPY (uint8 val) +{ + int16 Int16 = (int16) Registers.YL - (int16) val; + ICPU._Carry = Int16 >= 0; + SetZN((uint8) Int16); +} + +static inline void DEC16 (uint32 OpAddress, s9xwrap_t w) +{ +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = 0xffffffff; +#endif + uint16 Work16 = S9xGetWord(OpAddress, w) - 1; + AddCycles(ONE_CYCLE); + S9xSetWord(Work16, OpAddress, w, WRITE_10); + OpenBus = Work16 & 0xff; + SetZN(Work16); +} + +static inline void DEC8 (uint32 OpAddress) +{ +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = 0xffffffff; +#endif + uint8 Work8 = S9xGetByte(OpAddress) - 1; + AddCycles(ONE_CYCLE); + S9xSetByte(Work8, OpAddress); + OpenBus = Work8; + SetZN(Work8); +} + +static inline void EOR (uint16 val) +{ + Registers.A.W ^= val; + SetZN(Registers.A.W); +} + +static inline void EOR (uint8 val) +{ + Registers.AL ^= val; + SetZN(Registers.AL); +} + +static inline void INC16 (uint32 OpAddress, s9xwrap_t w) +{ +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = 0xffffffff; +#endif + uint16 Work16 = S9xGetWord(OpAddress, w) + 1; + AddCycles(ONE_CYCLE); + S9xSetWord(Work16, OpAddress, w, WRITE_10); + OpenBus = Work16 & 0xff; + SetZN(Work16); +} + +static inline void INC8 (uint32 OpAddress) +{ +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = 0xffffffff; +#endif + uint8 Work8 = S9xGetByte(OpAddress) + 1; + AddCycles(ONE_CYCLE); + S9xSetByte(Work8, OpAddress); + OpenBus = Work8; + SetZN(Work8); +} + +static inline void LDA (uint16 val) +{ + Registers.A.W = val; + SetZN(Registers.A.W); +} + +static inline void LDA (uint8 val) +{ + Registers.AL = val; + SetZN(Registers.AL); +} + +static inline void LDX (uint16 val) +{ + Registers.X.W = val; + SetZN(Registers.X.W); +} + +static inline void LDX (uint8 val) +{ + Registers.XL = val; + SetZN(Registers.XL); +} + +static inline void LDY (uint16 val) +{ + Registers.Y.W = val; + SetZN(Registers.Y.W); +} + +static inline void LDY (uint8 val) +{ + Registers.YL = val; + SetZN(Registers.YL); +} + +static inline void LSR16 (uint32 OpAddress, s9xwrap_t w) +{ + uint16 Work16 = S9xGetWord(OpAddress, w); + ICPU._Carry = Work16 & 1; + Work16 >>= 1; + AddCycles(ONE_CYCLE); + S9xSetWord(Work16, OpAddress, w, WRITE_10); + OpenBus = Work16 & 0xff; + SetZN(Work16); +} + +static inline void LSR8 (uint32 OpAddress) +{ + uint8 Work8 = S9xGetByte(OpAddress); + ICPU._Carry = Work8 & 1; + Work8 >>= 1; + AddCycles(ONE_CYCLE); + S9xSetByte(Work8, OpAddress); + OpenBus = Work8; + SetZN(Work8); +} + +static inline void ORA (uint16 val) +{ + Registers.A.W |= val; + SetZN(Registers.A.W); +} + +static inline void ORA (uint8 val) +{ + Registers.AL |= val; + SetZN(Registers.AL); +} + +static inline void ROL16 (uint32 OpAddress, s9xwrap_t w) +{ + uint32 Work32 = (((uint32) S9xGetWord(OpAddress, w)) << 1) | CheckCarry(); + ICPU._Carry = Work32 >= 0x10000; + AddCycles(ONE_CYCLE); + S9xSetWord((uint16) Work32, OpAddress, w, WRITE_10); + OpenBus = Work32 & 0xff; + SetZN((uint16) Work32); +} + +static inline void ROL8 (uint32 OpAddress) +{ + uint16 Work16 = (((uint16) S9xGetByte(OpAddress)) << 1) | CheckCarry(); + ICPU._Carry = Work16 >= 0x100; + AddCycles(ONE_CYCLE); + S9xSetByte((uint8) Work16, OpAddress); + OpenBus = Work16 & 0xff; + SetZN((uint8) Work16); +} + +static inline void ROR16 (uint32 OpAddress, s9xwrap_t w) +{ + uint32 Work32 = ((uint32) S9xGetWord(OpAddress, w)) | (((uint32) CheckCarry()) << 16); + ICPU._Carry = Work32 & 1; + Work32 >>= 1; + AddCycles(ONE_CYCLE); + S9xSetWord((uint16) Work32, OpAddress, w, WRITE_10); + OpenBus = Work32 & 0xff; + SetZN((uint16) Work32); +} + +static inline void ROR8 (uint32 OpAddress) +{ + uint16 Work16 = ((uint16) S9xGetByte(OpAddress)) | (((uint16) CheckCarry()) << 8); + ICPU._Carry = Work16 & 1; + Work16 >>= 1; + AddCycles(ONE_CYCLE); + S9xSetByte((uint8) Work16, OpAddress); + OpenBus = Work16 & 0xff; + SetZN((uint8) Work16); +} + +static inline void SBC (uint16 Work16) +{ + if (CheckDecimal()) + { + uint16 A1 = Registers.A.W & 0x000F; + uint16 A2 = Registers.A.W & 0x00F0; + uint16 A3 = Registers.A.W & 0x0F00; + uint32 A4 = Registers.A.W & 0xF000; + uint16 W1 = Work16 & 0x000F; + uint16 W2 = Work16 & 0x00F0; + uint16 W3 = Work16 & 0x0F00; + uint16 W4 = Work16 & 0xF000; + + A1 -= W1 + !CheckCarry(); + A2 -= W2; + A3 -= W3; + A4 -= W4; + + if (A1 > 0x000F) + { + A1 += 0x000A; + A1 &= 0x000F; + A2 -= 0x0010; + } + + if (A2 > 0x00F0) + { + A2 += 0x00A0; + A2 &= 0x00F0; + A3 -= 0x0100; + } + + if (A3 > 0x0F00) + { + A3 += 0x0A00; + A3 &= 0x0F00; + A4 -= 0x1000; + } + + if (A4 > 0xF000) + { + A4 += 0xA000; + A4 &= 0xF000; + ClearCarry(); + } + else + SetCarry(); + + uint16 Ans16 = A4 | A3 | A2 | A1; + + if ((Registers.A.W ^ Work16) & (Registers.A.W ^ Ans16) & 0x8000) + SetOverflow(); + else + ClearOverflow(); + + Registers.A.W = Ans16; + SetZN(Registers.A.W); + } + else + { + int32 Int32 = (int32) Registers.A.W - (int32) Work16 + (int32) CheckCarry() - 1; + + ICPU._Carry = Int32 >= 0; + + if ((Registers.A.W ^ Work16) & (Registers.A.W ^ (uint16) Int32) & 0x8000) + SetOverflow(); + else + ClearOverflow(); + + Registers.A.W = (uint16) Int32; + SetZN(Registers.A.W); + } +} + +static inline void SBC (uint8 Work8) +{ + if (CheckDecimal()) + { + uint8 A1 = Registers.A.W & 0x0F; + uint16 A2 = Registers.A.W & 0xF0; + uint8 W1 = Work8 & 0x0F; + uint8 W2 = Work8 & 0xF0; + + A1 -= W1 + !CheckCarry(); + A2 -= W2; + + if (A1 > 0x0F) + { + A1 += 0x0A; + A1 &= 0x0F; + A2 -= 0x10; + } + + if (A2 > 0xF0) + { + A2 += 0xA0; + A2 &= 0xF0; + ClearCarry(); + } + else + SetCarry(); + + uint8 Ans8 = A2 | A1; + + if ((Registers.AL ^ Work8) & (Registers.AL ^ Ans8) & 0x80) + SetOverflow(); + else + ClearOverflow(); + + Registers.AL = Ans8; + SetZN(Registers.AL); + } + else + { + int16 Int16 = (int16) Registers.AL - (int16) Work8 + (int16) CheckCarry() - 1; + + ICPU._Carry = Int16 >= 0; + + if ((Registers.AL ^ Work8) & (Registers.AL ^ (uint8) Int16) & 0x80) + SetOverflow(); + else + ClearOverflow(); + + Registers.AL = (uint8) Int16; + SetZN(Registers.AL); + } +} + +static inline void STA16 (uint32 OpAddress, enum s9xwrap_t w) +{ + S9xSetWord(Registers.A.W, OpAddress, w); + OpenBus = Registers.AH; +} + +static inline void STA8 (uint32 OpAddress) +{ + S9xSetByte(Registers.AL, OpAddress); + OpenBus = Registers.AL; +} + +static inline void STX16 (uint32 OpAddress, enum s9xwrap_t w) +{ + S9xSetWord(Registers.X.W, OpAddress, w); + OpenBus = Registers.XH; +} + +static inline void STX8 (uint32 OpAddress) +{ + S9xSetByte(Registers.XL, OpAddress); + OpenBus = Registers.XL; +} + +static inline void STY16 (uint32 OpAddress, enum s9xwrap_t w) +{ + S9xSetWord(Registers.Y.W, OpAddress, w); + OpenBus = Registers.YH; +} + +static inline void STY8 (uint32 OpAddress) +{ + S9xSetByte(Registers.YL, OpAddress); + OpenBus = Registers.YL; +} + +static inline void STZ16 (uint32 OpAddress, enum s9xwrap_t w) +{ + S9xSetWord(0, OpAddress, w); + OpenBus = 0; +} + +static inline void STZ8 (uint32 OpAddress) +{ + S9xSetByte(0, OpAddress); + OpenBus = 0; +} + +static inline void TSB16 (uint32 OpAddress, enum s9xwrap_t w) +{ + uint16 Work16 = S9xGetWord(OpAddress, w); + ICPU._Zero = (Work16 & Registers.A.W) != 0; + Work16 |= Registers.A.W; + AddCycles(ONE_CYCLE); + S9xSetWord(Work16, OpAddress, w, WRITE_10); + OpenBus = Work16 & 0xff; +} + +static inline void TSB8 (uint32 OpAddress) +{ + uint8 Work8 = S9xGetByte(OpAddress); + ICPU._Zero = Work8 & Registers.AL; + Work8 |= Registers.AL; + AddCycles(ONE_CYCLE); + S9xSetByte(Work8, OpAddress); + OpenBus = Work8; +} + +static inline void TRB16 (uint32 OpAddress, enum s9xwrap_t w) +{ + uint16 Work16 = S9xGetWord(OpAddress, w); + ICPU._Zero = (Work16 & Registers.A.W) != 0; + Work16 &= ~Registers.A.W; + AddCycles(ONE_CYCLE); + S9xSetWord(Work16, OpAddress, w, WRITE_10); + OpenBus = Work16 & 0xff; +} + +static inline void TRB8 (uint32 OpAddress) +{ + uint8 Work8 = S9xGetByte(OpAddress); + ICPU._Zero = Work8 & Registers.AL; + Work8 &= ~Registers.AL; + AddCycles(ONE_CYCLE); + S9xSetByte(Work8, OpAddress); + OpenBus = Work8; +} + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/cpuops.cpp b/plugins/snes9x_gx/source/snes9x/cpuops.cpp new file mode 100644 index 00000000..5d1cee24 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/cpuops.cpp @@ -0,0 +1,4027 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#include "snes9x.h" +#include "memmap.h" +#include "apu/apu.h" + +// for "Magic WDM" features +#ifdef DEBUGGER +#include "snapshot.h" +#include "display.h" +#include "debug.h" +#include "missing.h" +#endif + +#ifdef SA1_OPCODES +#define AddCycles(n) { } +#else +#if (S9X_ACCURACY_LEVEL >= 3) +#define AddCycles(n) { CPU.Cycles += (n); while (CPU.Cycles >= CPU.NextEvent) S9xDoHEventProcessing(); } +#else +#define AddCycles(n) { CPU.Cycles += (n); } +#endif +#endif + +#include "cpuaddr.h" +#include "cpuops.h" +#include "cpumacro.h" + + +/* ADC ********************************************************************* */ + +static void Op69M1 (void) +{ + ADC(Immediate8(READ)); +} + +static void Op69M0 (void) +{ + ADC(Immediate16(READ)); +} + +static void Op69Slow (void) +{ + if (CheckMemory()) + ADC(Immediate8Slow(READ)); + else + ADC(Immediate16Slow(READ)); +} + +rOP8 (65M1, Direct, WRAP_BANK, ADC) +rOP16(65M0, Direct, WRAP_BANK, ADC) +rOPM (65Slow, DirectSlow, WRAP_BANK, ADC) + +rOP8 (75E1, DirectIndexedXE1, WRAP_BANK, ADC) +rOP8 (75E0M1, DirectIndexedXE0, WRAP_BANK, ADC) +rOP16(75E0M0, DirectIndexedXE0, WRAP_BANK, ADC) +rOPM (75Slow, DirectIndexedXSlow, WRAP_BANK, ADC) + +rOP8 (72E1, DirectIndirectE1, WRAP_NONE, ADC) +rOP8 (72E0M1, DirectIndirectE0, WRAP_NONE, ADC) +rOP16(72E0M0, DirectIndirectE0, WRAP_NONE, ADC) +rOPM (72Slow, DirectIndirectSlow, WRAP_NONE, ADC) + +rOP8 (61E1, DirectIndexedIndirectE1, WRAP_NONE, ADC) +rOP8 (61E0M1, DirectIndexedIndirectE0, WRAP_NONE, ADC) +rOP16(61E0M0, DirectIndexedIndirectE0, WRAP_NONE, ADC) +rOPM (61Slow, DirectIndexedIndirectSlow, WRAP_NONE, ADC) + +rOP8 (71E1, DirectIndirectIndexedE1, WRAP_NONE, ADC) +rOP8 (71E0M1X1, DirectIndirectIndexedE0X1, WRAP_NONE, ADC) +rOP16(71E0M0X1, DirectIndirectIndexedE0X1, WRAP_NONE, ADC) +rOP8 (71E0M1X0, DirectIndirectIndexedE0X0, WRAP_NONE, ADC) +rOP16(71E0M0X0, DirectIndirectIndexedE0X0, WRAP_NONE, ADC) +rOPM (71Slow, DirectIndirectIndexedSlow, WRAP_NONE, ADC) + +rOP8 (67M1, DirectIndirectLong, WRAP_NONE, ADC) +rOP16(67M0, DirectIndirectLong, WRAP_NONE, ADC) +rOPM (67Slow, DirectIndirectLongSlow, WRAP_NONE, ADC) + +rOP8 (77M1, DirectIndirectIndexedLong, WRAP_NONE, ADC) +rOP16(77M0, DirectIndirectIndexedLong, WRAP_NONE, ADC) +rOPM (77Slow, DirectIndirectIndexedLongSlow, WRAP_NONE, ADC) + +rOP8 (6DM1, Absolute, WRAP_NONE, ADC) +rOP16(6DM0, Absolute, WRAP_NONE, ADC) +rOPM (6DSlow, AbsoluteSlow, WRAP_NONE, ADC) + +rOP8 (7DM1X1, AbsoluteIndexedXX1, WRAP_NONE, ADC) +rOP16(7DM0X1, AbsoluteIndexedXX1, WRAP_NONE, ADC) +rOP8 (7DM1X0, AbsoluteIndexedXX0, WRAP_NONE, ADC) +rOP16(7DM0X0, AbsoluteIndexedXX0, WRAP_NONE, ADC) +rOPM (7DSlow, AbsoluteIndexedXSlow, WRAP_NONE, ADC) + +rOP8 (79M1X1, AbsoluteIndexedYX1, WRAP_NONE, ADC) +rOP16(79M0X1, AbsoluteIndexedYX1, WRAP_NONE, ADC) +rOP8 (79M1X0, AbsoluteIndexedYX0, WRAP_NONE, ADC) +rOP16(79M0X0, AbsoluteIndexedYX0, WRAP_NONE, ADC) +rOPM (79Slow, AbsoluteIndexedYSlow, WRAP_NONE, ADC) + +rOP8 (6FM1, AbsoluteLong, WRAP_NONE, ADC) +rOP16(6FM0, AbsoluteLong, WRAP_NONE, ADC) +rOPM (6FSlow, AbsoluteLongSlow, WRAP_NONE, ADC) + +rOP8 (7FM1, AbsoluteLongIndexedX, WRAP_NONE, ADC) +rOP16(7FM0, AbsoluteLongIndexedX, WRAP_NONE, ADC) +rOPM (7FSlow, AbsoluteLongIndexedXSlow, WRAP_NONE, ADC) + +rOP8 (63M1, StackRelative, WRAP_NONE, ADC) +rOP16(63M0, StackRelative, WRAP_NONE, ADC) +rOPM (63Slow, StackRelativeSlow, WRAP_NONE, ADC) + +rOP8 (73M1, StackRelativeIndirectIndexed, WRAP_NONE, ADC) +rOP16(73M0, StackRelativeIndirectIndexed, WRAP_NONE, ADC) +rOPM (73Slow, StackRelativeIndirectIndexedSlow, WRAP_NONE, ADC) + +/* AND ********************************************************************* */ + +static void Op29M1 (void) +{ + Registers.AL &= Immediate8(READ); + SetZN(Registers.AL); +} + +static void Op29M0 (void) +{ + Registers.A.W &= Immediate16(READ); + SetZN(Registers.A.W); +} + +static void Op29Slow (void) +{ + if (CheckMemory()) + { + Registers.AL &= Immediate8Slow(READ); + SetZN(Registers.AL); + } + else + { + Registers.A.W &= Immediate16Slow(READ); + SetZN(Registers.A.W); + } +} + +rOP8 (25M1, Direct, WRAP_BANK, AND) +rOP16(25M0, Direct, WRAP_BANK, AND) +rOPM (25Slow, DirectSlow, WRAP_BANK, AND) + +rOP8 (35E1, DirectIndexedXE1, WRAP_BANK, AND) +rOP8 (35E0M1, DirectIndexedXE0, WRAP_BANK, AND) +rOP16(35E0M0, DirectIndexedXE0, WRAP_BANK, AND) +rOPM (35Slow, DirectIndexedXSlow, WRAP_BANK, AND) + +rOP8 (32E1, DirectIndirectE1, WRAP_NONE, AND) +rOP8 (32E0M1, DirectIndirectE0, WRAP_NONE, AND) +rOP16(32E0M0, DirectIndirectE0, WRAP_NONE, AND) +rOPM (32Slow, DirectIndirectSlow, WRAP_NONE, AND) + +rOP8 (21E1, DirectIndexedIndirectE1, WRAP_NONE, AND) +rOP8 (21E0M1, DirectIndexedIndirectE0, WRAP_NONE, AND) +rOP16(21E0M0, DirectIndexedIndirectE0, WRAP_NONE, AND) +rOPM (21Slow, DirectIndexedIndirectSlow, WRAP_NONE, AND) + +rOP8 (31E1, DirectIndirectIndexedE1, WRAP_NONE, AND) +rOP8 (31E0M1X1, DirectIndirectIndexedE0X1, WRAP_NONE, AND) +rOP16(31E0M0X1, DirectIndirectIndexedE0X1, WRAP_NONE, AND) +rOP8 (31E0M1X0, DirectIndirectIndexedE0X0, WRAP_NONE, AND) +rOP16(31E0M0X0, DirectIndirectIndexedE0X0, WRAP_NONE, AND) +rOPM (31Slow, DirectIndirectIndexedSlow, WRAP_NONE, AND) + +rOP8 (27M1, DirectIndirectLong, WRAP_NONE, AND) +rOP16(27M0, DirectIndirectLong, WRAP_NONE, AND) +rOPM (27Slow, DirectIndirectLongSlow, WRAP_NONE, AND) + +rOP8 (37M1, DirectIndirectIndexedLong, WRAP_NONE, AND) +rOP16(37M0, DirectIndirectIndexedLong, WRAP_NONE, AND) +rOPM (37Slow, DirectIndirectIndexedLongSlow, WRAP_NONE, AND) + +rOP8 (2DM1, Absolute, WRAP_NONE, AND) +rOP16(2DM0, Absolute, WRAP_NONE, AND) +rOPM (2DSlow, AbsoluteSlow, WRAP_NONE, AND) + +rOP8 (3DM1X1, AbsoluteIndexedXX1, WRAP_NONE, AND) +rOP16(3DM0X1, AbsoluteIndexedXX1, WRAP_NONE, AND) +rOP8 (3DM1X0, AbsoluteIndexedXX0, WRAP_NONE, AND) +rOP16(3DM0X0, AbsoluteIndexedXX0, WRAP_NONE, AND) +rOPM (3DSlow, AbsoluteIndexedXSlow, WRAP_NONE, AND) + +rOP8 (39M1X1, AbsoluteIndexedYX1, WRAP_NONE, AND) +rOP16(39M0X1, AbsoluteIndexedYX1, WRAP_NONE, AND) +rOP8 (39M1X0, AbsoluteIndexedYX0, WRAP_NONE, AND) +rOP16(39M0X0, AbsoluteIndexedYX0, WRAP_NONE, AND) +rOPM (39Slow, AbsoluteIndexedYSlow, WRAP_NONE, AND) + +rOP8 (2FM1, AbsoluteLong, WRAP_NONE, AND) +rOP16(2FM0, AbsoluteLong, WRAP_NONE, AND) +rOPM (2FSlow, AbsoluteLongSlow, WRAP_NONE, AND) + +rOP8 (3FM1, AbsoluteLongIndexedX, WRAP_NONE, AND) +rOP16(3FM0, AbsoluteLongIndexedX, WRAP_NONE, AND) +rOPM (3FSlow, AbsoluteLongIndexedXSlow, WRAP_NONE, AND) + +rOP8 (23M1, StackRelative, WRAP_NONE, AND) +rOP16(23M0, StackRelative, WRAP_NONE, AND) +rOPM (23Slow, StackRelativeSlow, WRAP_NONE, AND) + +rOP8 (33M1, StackRelativeIndirectIndexed, WRAP_NONE, AND) +rOP16(33M0, StackRelativeIndirectIndexed, WRAP_NONE, AND) +rOPM (33Slow, StackRelativeIndirectIndexedSlow, WRAP_NONE, AND) + +/* ASL ********************************************************************* */ + +static void Op0AM1 (void) +{ + AddCycles(ONE_CYCLE); + ICPU._Carry = (Registers.AL & 0x80) != 0; + Registers.AL <<= 1; + SetZN(Registers.AL); +} + +static void Op0AM0 (void) +{ + AddCycles(ONE_CYCLE); + ICPU._Carry = (Registers.AH & 0x80) != 0; + Registers.A.W <<= 1; + SetZN(Registers.A.W); +} + +static void Op0ASlow (void) +{ + AddCycles(ONE_CYCLE); + + if (CheckMemory()) + { + ICPU._Carry = (Registers.AL & 0x80) != 0; + Registers.AL <<= 1; + SetZN(Registers.AL); + } + else + { + ICPU._Carry = (Registers.AH & 0x80) != 0; + Registers.A.W <<= 1; + SetZN(Registers.A.W); + } +} + +mOP8 (06M1, Direct, WRAP_BANK, ASL) +mOP16(06M0, Direct, WRAP_BANK, ASL) +mOPM (06Slow, DirectSlow, WRAP_BANK, ASL) + +mOP8 (16E1, DirectIndexedXE1, WRAP_BANK, ASL) +mOP8 (16E0M1, DirectIndexedXE0, WRAP_BANK, ASL) +mOP16(16E0M0, DirectIndexedXE0, WRAP_BANK, ASL) +mOPM (16Slow, DirectIndexedXSlow, WRAP_BANK, ASL) + +mOP8 (0EM1, Absolute, WRAP_NONE, ASL) +mOP16(0EM0, Absolute, WRAP_NONE, ASL) +mOPM (0ESlow, AbsoluteSlow, WRAP_NONE, ASL) + +mOP8 (1EM1X1, AbsoluteIndexedXX1, WRAP_NONE, ASL) +mOP16(1EM0X1, AbsoluteIndexedXX1, WRAP_NONE, ASL) +mOP8 (1EM1X0, AbsoluteIndexedXX0, WRAP_NONE, ASL) +mOP16(1EM0X0, AbsoluteIndexedXX0, WRAP_NONE, ASL) +mOPM (1ESlow, AbsoluteIndexedXSlow, WRAP_NONE, ASL) + +/* BIT ********************************************************************* */ + +static void Op89M1 (void) +{ + ICPU._Zero = Registers.AL & Immediate8(READ); +} + +static void Op89M0 (void) +{ + ICPU._Zero = (Registers.A.W & Immediate16(READ)) != 0; +} + +static void Op89Slow (void) +{ + if (CheckMemory()) + ICPU._Zero = Registers.AL & Immediate8Slow(READ); + else + ICPU._Zero = (Registers.A.W & Immediate16Slow(READ)) != 0; +} + +rOP8 (24M1, Direct, WRAP_BANK, BIT) +rOP16(24M0, Direct, WRAP_BANK, BIT) +rOPM (24Slow, DirectSlow, WRAP_BANK, BIT) + +rOP8 (34E1, DirectIndexedXE1, WRAP_BANK, BIT) +rOP8 (34E0M1, DirectIndexedXE0, WRAP_BANK, BIT) +rOP16(34E0M0, DirectIndexedXE0, WRAP_BANK, BIT) +rOPM (34Slow, DirectIndexedXSlow, WRAP_BANK, BIT) + +rOP8 (2CM1, Absolute, WRAP_NONE, BIT) +rOP16(2CM0, Absolute, WRAP_NONE, BIT) +rOPM (2CSlow, AbsoluteSlow, WRAP_NONE, BIT) + +rOP8 (3CM1X1, AbsoluteIndexedXX1, WRAP_NONE, BIT) +rOP16(3CM0X1, AbsoluteIndexedXX1, WRAP_NONE, BIT) +rOP8 (3CM1X0, AbsoluteIndexedXX0, WRAP_NONE, BIT) +rOP16(3CM0X0, AbsoluteIndexedXX0, WRAP_NONE, BIT) +rOPM (3CSlow, AbsoluteIndexedXSlow, WRAP_NONE, BIT) + +/* CMP ********************************************************************* */ + +static void OpC9M1 (void) +{ + int16 Int16 = (int16) Registers.AL - (int16) Immediate8(READ); + ICPU._Carry = Int16 >= 0; + SetZN((uint8) Int16); +} + +static void OpC9M0 (void) +{ + int32 Int32 = (int32) Registers.A.W - (int32) Immediate16(READ); + ICPU._Carry = Int32 >= 0; + SetZN((uint16) Int32); +} + +static void OpC9Slow (void) +{ + if (CheckMemory()) + { + int16 Int16 = (int16) Registers.AL - (int16) Immediate8Slow(READ); + ICPU._Carry = Int16 >= 0; + SetZN((uint8) Int16); + } + else + { + int32 Int32 = (int32) Registers.A.W - (int32) Immediate16Slow(READ); + ICPU._Carry = Int32 >= 0; + SetZN((uint16) Int32); + } +} + +rOP8 (C5M1, Direct, WRAP_BANK, CMP) +rOP16(C5M0, Direct, WRAP_BANK, CMP) +rOPM (C5Slow, DirectSlow, WRAP_BANK, CMP) + +rOP8 (D5E1, DirectIndexedXE1, WRAP_BANK, CMP) +rOP8 (D5E0M1, DirectIndexedXE0, WRAP_BANK, CMP) +rOP16(D5E0M0, DirectIndexedXE0, WRAP_BANK, CMP) +rOPM (D5Slow, DirectIndexedXSlow, WRAP_BANK, CMP) + +rOP8 (D2E1, DirectIndirectE1, WRAP_NONE, CMP) +rOP8 (D2E0M1, DirectIndirectE0, WRAP_NONE, CMP) +rOP16(D2E0M0, DirectIndirectE0, WRAP_NONE, CMP) +rOPM (D2Slow, DirectIndirectSlow, WRAP_NONE, CMP) + +rOP8 (C1E1, DirectIndexedIndirectE1, WRAP_NONE, CMP) +rOP8 (C1E0M1, DirectIndexedIndirectE0, WRAP_NONE, CMP) +rOP16(C1E0M0, DirectIndexedIndirectE0, WRAP_NONE, CMP) +rOPM (C1Slow, DirectIndexedIndirectSlow, WRAP_NONE, CMP) + +rOP8 (D1E1, DirectIndirectIndexedE1, WRAP_NONE, CMP) +rOP8 (D1E0M1X1, DirectIndirectIndexedE0X1, WRAP_NONE, CMP) +rOP16(D1E0M0X1, DirectIndirectIndexedE0X1, WRAP_NONE, CMP) +rOP8 (D1E0M1X0, DirectIndirectIndexedE0X0, WRAP_NONE, CMP) +rOP16(D1E0M0X0, DirectIndirectIndexedE0X0, WRAP_NONE, CMP) +rOPM (D1Slow, DirectIndirectIndexedSlow, WRAP_NONE, CMP) + +rOP8 (C7M1, DirectIndirectLong, WRAP_NONE, CMP) +rOP16(C7M0, DirectIndirectLong, WRAP_NONE, CMP) +rOPM (C7Slow, DirectIndirectLongSlow, WRAP_NONE, CMP) + +rOP8 (D7M1, DirectIndirectIndexedLong, WRAP_NONE, CMP) +rOP16(D7M0, DirectIndirectIndexedLong, WRAP_NONE, CMP) +rOPM (D7Slow, DirectIndirectIndexedLongSlow, WRAP_NONE, CMP) + +rOP8 (CDM1, Absolute, WRAP_NONE, CMP) +rOP16(CDM0, Absolute, WRAP_NONE, CMP) +rOPM (CDSlow, AbsoluteSlow, WRAP_NONE, CMP) + +rOP8 (DDM1X1, AbsoluteIndexedXX1, WRAP_NONE, CMP) +rOP16(DDM0X1, AbsoluteIndexedXX1, WRAP_NONE, CMP) +rOP8 (DDM1X0, AbsoluteIndexedXX0, WRAP_NONE, CMP) +rOP16(DDM0X0, AbsoluteIndexedXX0, WRAP_NONE, CMP) +rOPM (DDSlow, AbsoluteIndexedXSlow, WRAP_NONE, CMP) + +rOP8 (D9M1X1, AbsoluteIndexedYX1, WRAP_NONE, CMP) +rOP16(D9M0X1, AbsoluteIndexedYX1, WRAP_NONE, CMP) +rOP8 (D9M1X0, AbsoluteIndexedYX0, WRAP_NONE, CMP) +rOP16(D9M0X0, AbsoluteIndexedYX0, WRAP_NONE, CMP) +rOPM (D9Slow, AbsoluteIndexedYSlow, WRAP_NONE, CMP) + +rOP8 (CFM1, AbsoluteLong, WRAP_NONE, CMP) +rOP16(CFM0, AbsoluteLong, WRAP_NONE, CMP) +rOPM (CFSlow, AbsoluteLongSlow, WRAP_NONE, CMP) + +rOP8 (DFM1, AbsoluteLongIndexedX, WRAP_NONE, CMP) +rOP16(DFM0, AbsoluteLongIndexedX, WRAP_NONE, CMP) +rOPM (DFSlow, AbsoluteLongIndexedXSlow, WRAP_NONE, CMP) + +rOP8 (C3M1, StackRelative, WRAP_NONE, CMP) +rOP16(C3M0, StackRelative, WRAP_NONE, CMP) +rOPM (C3Slow, StackRelativeSlow, WRAP_NONE, CMP) + +rOP8 (D3M1, StackRelativeIndirectIndexed, WRAP_NONE, CMP) +rOP16(D3M0, StackRelativeIndirectIndexed, WRAP_NONE, CMP) +rOPM (D3Slow, StackRelativeIndirectIndexedSlow, WRAP_NONE, CMP) + +/* CPX ********************************************************************* */ + +static void OpE0X1 (void) +{ + int16 Int16 = (int16) Registers.XL - (int16) Immediate8(READ); + ICPU._Carry = Int16 >= 0; + SetZN((uint8) Int16); +} + +static void OpE0X0 (void) +{ + int32 Int32 = (int32) Registers.X.W - (int32) Immediate16(READ); + ICPU._Carry = Int32 >= 0; + SetZN((uint16) Int32); +} + +static void OpE0Slow (void) +{ + if (CheckIndex()) + { + int16 Int16 = (int16) Registers.XL - (int16) Immediate8Slow(READ); + ICPU._Carry = Int16 >= 0; + SetZN((uint8) Int16); + } + else + { + int32 Int32 = (int32) Registers.X.W - (int32) Immediate16Slow(READ); + ICPU._Carry = Int32 >= 0; + SetZN((uint16) Int32); + } +} + +rOP8 (E4X1, Direct, WRAP_BANK, CPX) +rOP16(E4X0, Direct, WRAP_BANK, CPX) +rOPX (E4Slow, DirectSlow, WRAP_BANK, CPX) + +rOP8 (ECX1, Absolute, WRAP_NONE, CPX) +rOP16(ECX0, Absolute, WRAP_NONE, CPX) +rOPX (ECSlow, AbsoluteSlow, WRAP_NONE, CPX) + +/* CPY ********************************************************************* */ + +static void OpC0X1 (void) +{ + int16 Int16 = (int16) Registers.YL - (int16) Immediate8(READ); + ICPU._Carry = Int16 >= 0; + SetZN((uint8) Int16); +} + +static void OpC0X0 (void) +{ + int32 Int32 = (int32) Registers.Y.W - (int32) Immediate16(READ); + ICPU._Carry = Int32 >= 0; + SetZN((uint16) Int32); +} + +static void OpC0Slow (void) +{ + if (CheckIndex()) + { + int16 Int16 = (int16) Registers.YL - (int16) Immediate8Slow(READ); + ICPU._Carry = Int16 >= 0; + SetZN((uint8) Int16); + } + else + { + int32 Int32 = (int32) Registers.Y.W - (int32) Immediate16Slow(READ); + ICPU._Carry = Int32 >= 0; + SetZN((uint16) Int32); + } +} + +rOP8 (C4X1, Direct, WRAP_BANK, CPY) +rOP16(C4X0, Direct, WRAP_BANK, CPY) +rOPX (C4Slow, DirectSlow, WRAP_BANK, CPY) + +rOP8 (CCX1, Absolute, WRAP_NONE, CPY) +rOP16(CCX0, Absolute, WRAP_NONE, CPY) +rOPX (CCSlow, AbsoluteSlow, WRAP_NONE, CPY) + +/* DEC ********************************************************************* */ + +static void Op3AM1 (void) +{ + AddCycles(ONE_CYCLE); +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = 0xffffffff; +#endif + Registers.AL--; + SetZN(Registers.AL); +} + +static void Op3AM0 (void) +{ + AddCycles(ONE_CYCLE); +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = 0xffffffff; +#endif + Registers.A.W--; + SetZN(Registers.A.W); +} + +static void Op3ASlow (void) +{ + AddCycles(ONE_CYCLE); +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = 0xffffffff; +#endif + + if (CheckMemory()) + { + Registers.AL--; + SetZN(Registers.AL); + } + else + { + Registers.A.W--; + SetZN(Registers.A.W); + } +} + +mOP8 (C6M1, Direct, WRAP_BANK, DEC) +mOP16(C6M0, Direct, WRAP_BANK, DEC) +mOPM (C6Slow, DirectSlow, WRAP_BANK, DEC) + +mOP8 (D6E1, DirectIndexedXE1, WRAP_BANK, DEC) +mOP8 (D6E0M1, DirectIndexedXE0, WRAP_BANK, DEC) +mOP16(D6E0M0, DirectIndexedXE0, WRAP_BANK, DEC) +mOPM (D6Slow, DirectIndexedXSlow, WRAP_BANK, DEC) + +mOP8 (CEM1, Absolute, WRAP_NONE, DEC) +mOP16(CEM0, Absolute, WRAP_NONE, DEC) +mOPM (CESlow, AbsoluteSlow, WRAP_NONE, DEC) + +mOP8 (DEM1X1, AbsoluteIndexedXX1, WRAP_NONE, DEC) +mOP16(DEM0X1, AbsoluteIndexedXX1, WRAP_NONE, DEC) +mOP8 (DEM1X0, AbsoluteIndexedXX0, WRAP_NONE, DEC) +mOP16(DEM0X0, AbsoluteIndexedXX0, WRAP_NONE, DEC) +mOPM (DESlow, AbsoluteIndexedXSlow, WRAP_NONE, DEC) + +/* EOR ********************************************************************* */ + +static void Op49M1 (void) +{ + Registers.AL ^= Immediate8(READ); + SetZN(Registers.AL); +} + +static void Op49M0 (void) +{ + Registers.A.W ^= Immediate16(READ); + SetZN(Registers.A.W); +} + +static void Op49Slow (void) +{ + if (CheckMemory()) + { + Registers.AL ^= Immediate8Slow(READ); + SetZN(Registers.AL); + } + else + { + Registers.A.W ^= Immediate16Slow(READ); + SetZN(Registers.A.W); + } +} + +rOP8 (45M1, Direct, WRAP_BANK, EOR) +rOP16(45M0, Direct, WRAP_BANK, EOR) +rOPM (45Slow, DirectSlow, WRAP_BANK, EOR) + +rOP8 (55E1, DirectIndexedXE1, WRAP_BANK, EOR) +rOP8 (55E0M1, DirectIndexedXE0, WRAP_BANK, EOR) +rOP16(55E0M0, DirectIndexedXE0, WRAP_BANK, EOR) +rOPM (55Slow, DirectIndexedXSlow, WRAP_BANK, EOR) + +rOP8 (52E1, DirectIndirectE1, WRAP_NONE, EOR) +rOP8 (52E0M1, DirectIndirectE0, WRAP_NONE, EOR) +rOP16(52E0M0, DirectIndirectE0, WRAP_NONE, EOR) +rOPM (52Slow, DirectIndirectSlow, WRAP_NONE, EOR) + +rOP8 (41E1, DirectIndexedIndirectE1, WRAP_NONE, EOR) +rOP8 (41E0M1, DirectIndexedIndirectE0, WRAP_NONE, EOR) +rOP16(41E0M0, DirectIndexedIndirectE0, WRAP_NONE, EOR) +rOPM (41Slow, DirectIndexedIndirectSlow, WRAP_NONE, EOR) + +rOP8 (51E1, DirectIndirectIndexedE1, WRAP_NONE, EOR) +rOP8 (51E0M1X1, DirectIndirectIndexedE0X1, WRAP_NONE, EOR) +rOP16(51E0M0X1, DirectIndirectIndexedE0X1, WRAP_NONE, EOR) +rOP8 (51E0M1X0, DirectIndirectIndexedE0X0, WRAP_NONE, EOR) +rOP16(51E0M0X0, DirectIndirectIndexedE0X0, WRAP_NONE, EOR) +rOPM (51Slow, DirectIndirectIndexedSlow, WRAP_NONE, EOR) + +rOP8 (47M1, DirectIndirectLong, WRAP_NONE, EOR) +rOP16(47M0, DirectIndirectLong, WRAP_NONE, EOR) +rOPM (47Slow, DirectIndirectLongSlow, WRAP_NONE, EOR) + +rOP8 (57M1, DirectIndirectIndexedLong, WRAP_NONE, EOR) +rOP16(57M0, DirectIndirectIndexedLong, WRAP_NONE, EOR) +rOPM (57Slow, DirectIndirectIndexedLongSlow, WRAP_NONE, EOR) + +rOP8 (4DM1, Absolute, WRAP_NONE, EOR) +rOP16(4DM0, Absolute, WRAP_NONE, EOR) +rOPM (4DSlow, AbsoluteSlow, WRAP_NONE, EOR) + +rOP8 (5DM1X1, AbsoluteIndexedXX1, WRAP_NONE, EOR) +rOP16(5DM0X1, AbsoluteIndexedXX1, WRAP_NONE, EOR) +rOP8 (5DM1X0, AbsoluteIndexedXX0, WRAP_NONE, EOR) +rOP16(5DM0X0, AbsoluteIndexedXX0, WRAP_NONE, EOR) +rOPM (5DSlow, AbsoluteIndexedXSlow, WRAP_NONE, EOR) + +rOP8 (59M1X1, AbsoluteIndexedYX1, WRAP_NONE, EOR) +rOP16(59M0X1, AbsoluteIndexedYX1, WRAP_NONE, EOR) +rOP8 (59M1X0, AbsoluteIndexedYX0, WRAP_NONE, EOR) +rOP16(59M0X0, AbsoluteIndexedYX0, WRAP_NONE, EOR) +rOPM (59Slow, AbsoluteIndexedYSlow, WRAP_NONE, EOR) + +rOP8 (4FM1, AbsoluteLong, WRAP_NONE, EOR) +rOP16(4FM0, AbsoluteLong, WRAP_NONE, EOR) +rOPM (4FSlow, AbsoluteLongSlow, WRAP_NONE, EOR) + +rOP8 (5FM1, AbsoluteLongIndexedX, WRAP_NONE, EOR) +rOP16(5FM0, AbsoluteLongIndexedX, WRAP_NONE, EOR) +rOPM (5FSlow, AbsoluteLongIndexedXSlow, WRAP_NONE, EOR) + +rOP8 (43M1, StackRelative, WRAP_NONE, EOR) +rOP16(43M0, StackRelative, WRAP_NONE, EOR) +rOPM (43Slow, StackRelativeSlow, WRAP_NONE, EOR) + +rOP8 (53M1, StackRelativeIndirectIndexed, WRAP_NONE, EOR) +rOP16(53M0, StackRelativeIndirectIndexed, WRAP_NONE, EOR) +rOPM (53Slow, StackRelativeIndirectIndexedSlow, WRAP_NONE, EOR) + +/* INC ********************************************************************* */ + +static void Op1AM1 (void) +{ + AddCycles(ONE_CYCLE); +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = 0xffffffff; +#endif + Registers.AL++; + SetZN(Registers.AL); +} + +static void Op1AM0 (void) +{ + AddCycles(ONE_CYCLE); +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = 0xffffffff; +#endif + Registers.A.W++; + SetZN(Registers.A.W); +} + +static void Op1ASlow (void) +{ + AddCycles(ONE_CYCLE); +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = 0xffffffff; +#endif + + if (CheckMemory()) + { + Registers.AL++; + SetZN(Registers.AL); + } + else + { + Registers.A.W++; + SetZN(Registers.A.W); + } +} + +mOP8 (E6M1, Direct, WRAP_BANK, INC) +mOP16(E6M0, Direct, WRAP_BANK, INC) +mOPM (E6Slow, DirectSlow, WRAP_BANK, INC) + +mOP8 (F6E1, DirectIndexedXE1, WRAP_BANK, INC) +mOP8 (F6E0M1, DirectIndexedXE0, WRAP_BANK, INC) +mOP16(F6E0M0, DirectIndexedXE0, WRAP_BANK, INC) +mOPM (F6Slow, DirectIndexedXSlow, WRAP_BANK, INC) + +mOP8 (EEM1, Absolute, WRAP_NONE, INC) +mOP16(EEM0, Absolute, WRAP_NONE, INC) +mOPM (EESlow, AbsoluteSlow, WRAP_NONE, INC) + +mOP8 (FEM1X1, AbsoluteIndexedXX1, WRAP_NONE, INC) +mOP16(FEM0X1, AbsoluteIndexedXX1, WRAP_NONE, INC) +mOP8 (FEM1X0, AbsoluteIndexedXX0, WRAP_NONE, INC) +mOP16(FEM0X0, AbsoluteIndexedXX0, WRAP_NONE, INC) +mOPM (FESlow, AbsoluteIndexedXSlow, WRAP_NONE, INC) + +/* LDA ********************************************************************* */ + +static void OpA9M1 (void) +{ + Registers.AL = Immediate8(READ); + SetZN(Registers.AL); +} + +static void OpA9M0 (void) +{ + Registers.A.W = Immediate16(READ); + SetZN(Registers.A.W); +} + +static void OpA9Slow (void) +{ + if (CheckMemory()) + { + Registers.AL = Immediate8Slow(READ); + SetZN(Registers.AL); + } + else + { + Registers.A.W = Immediate16Slow(READ); + SetZN(Registers.A.W); + } +} + +rOP8 (A5M1, Direct, WRAP_BANK, LDA) +rOP16(A5M0, Direct, WRAP_BANK, LDA) +rOPM (A5Slow, DirectSlow, WRAP_BANK, LDA) + +rOP8 (B5E1, DirectIndexedXE1, WRAP_BANK, LDA) +rOP8 (B5E0M1, DirectIndexedXE0, WRAP_BANK, LDA) +rOP16(B5E0M0, DirectIndexedXE0, WRAP_BANK, LDA) +rOPM (B5Slow, DirectIndexedXSlow, WRAP_BANK, LDA) + +rOP8 (B2E1, DirectIndirectE1, WRAP_NONE, LDA) +rOP8 (B2E0M1, DirectIndirectE0, WRAP_NONE, LDA) +rOP16(B2E0M0, DirectIndirectE0, WRAP_NONE, LDA) +rOPM (B2Slow, DirectIndirectSlow, WRAP_NONE, LDA) + +rOP8 (A1E1, DirectIndexedIndirectE1, WRAP_NONE, LDA) +rOP8 (A1E0M1, DirectIndexedIndirectE0, WRAP_NONE, LDA) +rOP16(A1E0M0, DirectIndexedIndirectE0, WRAP_NONE, LDA) +rOPM (A1Slow, DirectIndexedIndirectSlow, WRAP_NONE, LDA) + +rOP8 (B1E1, DirectIndirectIndexedE1, WRAP_NONE, LDA) +rOP8 (B1E0M1X1, DirectIndirectIndexedE0X1, WRAP_NONE, LDA) +rOP16(B1E0M0X1, DirectIndirectIndexedE0X1, WRAP_NONE, LDA) +rOP8 (B1E0M1X0, DirectIndirectIndexedE0X0, WRAP_NONE, LDA) +rOP16(B1E0M0X0, DirectIndirectIndexedE0X0, WRAP_NONE, LDA) +rOPM (B1Slow, DirectIndirectIndexedSlow, WRAP_NONE, LDA) + +rOP8 (A7M1, DirectIndirectLong, WRAP_NONE, LDA) +rOP16(A7M0, DirectIndirectLong, WRAP_NONE, LDA) +rOPM (A7Slow, DirectIndirectLongSlow, WRAP_NONE, LDA) + +rOP8 (B7M1, DirectIndirectIndexedLong, WRAP_NONE, LDA) +rOP16(B7M0, DirectIndirectIndexedLong, WRAP_NONE, LDA) +rOPM (B7Slow, DirectIndirectIndexedLongSlow, WRAP_NONE, LDA) + +rOP8 (ADM1, Absolute, WRAP_NONE, LDA) +rOP16(ADM0, Absolute, WRAP_NONE, LDA) +rOPM (ADSlow, AbsoluteSlow, WRAP_NONE, LDA) + +rOP8 (BDM1X1, AbsoluteIndexedXX1, WRAP_NONE, LDA) +rOP16(BDM0X1, AbsoluteIndexedXX1, WRAP_NONE, LDA) +rOP8 (BDM1X0, AbsoluteIndexedXX0, WRAP_NONE, LDA) +rOP16(BDM0X0, AbsoluteIndexedXX0, WRAP_NONE, LDA) +rOPM (BDSlow, AbsoluteIndexedXSlow, WRAP_NONE, LDA) + +rOP8 (B9M1X1, AbsoluteIndexedYX1, WRAP_NONE, LDA) +rOP16(B9M0X1, AbsoluteIndexedYX1, WRAP_NONE, LDA) +rOP8 (B9M1X0, AbsoluteIndexedYX0, WRAP_NONE, LDA) +rOP16(B9M0X0, AbsoluteIndexedYX0, WRAP_NONE, LDA) +rOPM (B9Slow, AbsoluteIndexedYSlow, WRAP_NONE, LDA) + +rOP8 (AFM1, AbsoluteLong, WRAP_NONE, LDA) +rOP16(AFM0, AbsoluteLong, WRAP_NONE, LDA) +rOPM (AFSlow, AbsoluteLongSlow, WRAP_NONE, LDA) + +rOP8 (BFM1, AbsoluteLongIndexedX, WRAP_NONE, LDA) +rOP16(BFM0, AbsoluteLongIndexedX, WRAP_NONE, LDA) +rOPM (BFSlow, AbsoluteLongIndexedXSlow, WRAP_NONE, LDA) + +rOP8 (A3M1, StackRelative, WRAP_NONE, LDA) +rOP16(A3M0, StackRelative, WRAP_NONE, LDA) +rOPM (A3Slow, StackRelativeSlow, WRAP_NONE, LDA) + +rOP8 (B3M1, StackRelativeIndirectIndexed, WRAP_NONE, LDA) +rOP16(B3M0, StackRelativeIndirectIndexed, WRAP_NONE, LDA) +rOPM (B3Slow, StackRelativeIndirectIndexedSlow, WRAP_NONE, LDA) + +/* LDX ********************************************************************* */ + +static void OpA2X1 (void) +{ + Registers.XL = Immediate8(READ); + SetZN(Registers.XL); +} + +static void OpA2X0 (void) +{ + Registers.X.W = Immediate16(READ); + SetZN(Registers.X.W); +} + +static void OpA2Slow (void) +{ + if (CheckIndex()) + { + Registers.XL = Immediate8Slow(READ); + SetZN(Registers.XL); + } + else + { + Registers.X.W = Immediate16Slow(READ); + SetZN(Registers.X.W); + } +} + +rOP8 (A6X1, Direct, WRAP_BANK, LDX) +rOP16(A6X0, Direct, WRAP_BANK, LDX) +rOPX (A6Slow, DirectSlow, WRAP_BANK, LDX) + +rOP8 (B6E1, DirectIndexedYE1, WRAP_BANK, LDX) +rOP8 (B6E0X1, DirectIndexedYE0, WRAP_BANK, LDX) +rOP16(B6E0X0, DirectIndexedYE0, WRAP_BANK, LDX) +rOPX (B6Slow, DirectIndexedYSlow, WRAP_BANK, LDX) + +rOP8 (AEX1, Absolute, WRAP_BANK, LDX) +rOP16(AEX0, Absolute, WRAP_BANK, LDX) +rOPX (AESlow, AbsoluteSlow, WRAP_BANK, LDX) + +rOP8 (BEX1, AbsoluteIndexedYX1, WRAP_BANK, LDX) +rOP16(BEX0, AbsoluteIndexedYX0, WRAP_BANK, LDX) +rOPX (BESlow, AbsoluteIndexedYSlow, WRAP_BANK, LDX) + +/* LDY ********************************************************************* */ + +static void OpA0X1 (void) +{ + Registers.YL = Immediate8(READ); + SetZN(Registers.YL); +} + +static void OpA0X0 (void) +{ + Registers.Y.W = Immediate16(READ); + SetZN(Registers.Y.W); +} + +static void OpA0Slow (void) +{ + if (CheckIndex()) + { + Registers.YL = Immediate8Slow(READ); + SetZN(Registers.YL); + } + else + { + Registers.Y.W = Immediate16Slow(READ); + SetZN(Registers.Y.W); + } +} + +rOP8 (A4X1, Direct, WRAP_BANK, LDY) +rOP16(A4X0, Direct, WRAP_BANK, LDY) +rOPX (A4Slow, DirectSlow, WRAP_BANK, LDY) + +rOP8 (B4E1, DirectIndexedXE1, WRAP_BANK, LDY) +rOP8 (B4E0X1, DirectIndexedXE0, WRAP_BANK, LDY) +rOP16(B4E0X0, DirectIndexedXE0, WRAP_BANK, LDY) +rOPX (B4Slow, DirectIndexedXSlow, WRAP_BANK, LDY) + +rOP8 (ACX1, Absolute, WRAP_BANK, LDY) +rOP16(ACX0, Absolute, WRAP_BANK, LDY) +rOPX (ACSlow, AbsoluteSlow, WRAP_BANK, LDY) + +rOP8 (BCX1, AbsoluteIndexedXX1, WRAP_BANK, LDY) +rOP16(BCX0, AbsoluteIndexedXX0, WRAP_BANK, LDY) +rOPX (BCSlow, AbsoluteIndexedXSlow, WRAP_BANK, LDY) + +/* LSR ********************************************************************* */ + +static void Op4AM1 (void) +{ + AddCycles(ONE_CYCLE); + ICPU._Carry = Registers.AL & 1; + Registers.AL >>= 1; + SetZN(Registers.AL); +} + +static void Op4AM0 (void) +{ + AddCycles(ONE_CYCLE); + ICPU._Carry = Registers.A.W & 1; + Registers.A.W >>= 1; + SetZN(Registers.A.W); +} + +static void Op4ASlow (void) +{ + AddCycles(ONE_CYCLE); + + if (CheckMemory()) + { + ICPU._Carry = Registers.AL & 1; + Registers.AL >>= 1; + SetZN(Registers.AL); + } + else + { + ICPU._Carry = Registers.A.W & 1; + Registers.A.W >>= 1; + SetZN(Registers.A.W); + } +} + +mOP8 (46M1, Direct, WRAP_BANK, LSR) +mOP16(46M0, Direct, WRAP_BANK, LSR) +mOPM (46Slow, DirectSlow, WRAP_BANK, LSR) + +mOP8 (56E1, DirectIndexedXE1, WRAP_BANK, LSR) +mOP8 (56E0M1, DirectIndexedXE0, WRAP_BANK, LSR) +mOP16(56E0M0, DirectIndexedXE0, WRAP_BANK, LSR) +mOPM (56Slow, DirectIndexedXSlow, WRAP_BANK, LSR) + +mOP8 (4EM1, Absolute, WRAP_NONE, LSR) +mOP16(4EM0, Absolute, WRAP_NONE, LSR) +mOPM (4ESlow, AbsoluteSlow, WRAP_NONE, LSR) + +mOP8 (5EM1X1, AbsoluteIndexedXX1, WRAP_NONE, LSR) +mOP16(5EM0X1, AbsoluteIndexedXX1, WRAP_NONE, LSR) +mOP8 (5EM1X0, AbsoluteIndexedXX0, WRAP_NONE, LSR) +mOP16(5EM0X0, AbsoluteIndexedXX0, WRAP_NONE, LSR) +mOPM (5ESlow, AbsoluteIndexedXSlow, WRAP_NONE, LSR) + +/* ORA ********************************************************************* */ + +static void Op09M1 (void) +{ + Registers.AL |= Immediate8(READ); + SetZN(Registers.AL); +} + +static void Op09M0 (void) +{ + Registers.A.W |= Immediate16(READ); + SetZN(Registers.A.W); +} + +static void Op09Slow (void) +{ + if (CheckMemory()) + { + Registers.AL |= Immediate8Slow(READ); + SetZN(Registers.AL); + } + else + { + Registers.A.W |= Immediate16Slow(READ); + SetZN(Registers.A.W); + } +} + +rOP8 (05M1, Direct, WRAP_BANK, ORA) +rOP16(05M0, Direct, WRAP_BANK, ORA) +rOPM (05Slow, DirectSlow, WRAP_BANK, ORA) + +rOP8 (15E1, DirectIndexedXE1, WRAP_BANK, ORA) +rOP8 (15E0M1, DirectIndexedXE0, WRAP_BANK, ORA) +rOP16(15E0M0, DirectIndexedXE0, WRAP_BANK, ORA) +rOPM (15Slow, DirectIndexedXSlow, WRAP_BANK, ORA) + +rOP8 (12E1, DirectIndirectE1, WRAP_NONE, ORA) +rOP8 (12E0M1, DirectIndirectE0, WRAP_NONE, ORA) +rOP16(12E0M0, DirectIndirectE0, WRAP_NONE, ORA) +rOPM (12Slow, DirectIndirectSlow, WRAP_NONE, ORA) + +rOP8 (01E1, DirectIndexedIndirectE1, WRAP_NONE, ORA) +rOP8 (01E0M1, DirectIndexedIndirectE0, WRAP_NONE, ORA) +rOP16(01E0M0, DirectIndexedIndirectE0, WRAP_NONE, ORA) +rOPM (01Slow, DirectIndexedIndirectSlow, WRAP_NONE, ORA) + +rOP8 (11E1, DirectIndirectIndexedE1, WRAP_NONE, ORA) +rOP8 (11E0M1X1, DirectIndirectIndexedE0X1, WRAP_NONE, ORA) +rOP16(11E0M0X1, DirectIndirectIndexedE0X1, WRAP_NONE, ORA) +rOP8 (11E0M1X0, DirectIndirectIndexedE0X0, WRAP_NONE, ORA) +rOP16(11E0M0X0, DirectIndirectIndexedE0X0, WRAP_NONE, ORA) +rOPM (11Slow, DirectIndirectIndexedSlow, WRAP_NONE, ORA) + +rOP8 (07M1, DirectIndirectLong, WRAP_NONE, ORA) +rOP16(07M0, DirectIndirectLong, WRAP_NONE, ORA) +rOPM (07Slow, DirectIndirectLongSlow, WRAP_NONE, ORA) + +rOP8 (17M1, DirectIndirectIndexedLong, WRAP_NONE, ORA) +rOP16(17M0, DirectIndirectIndexedLong, WRAP_NONE, ORA) +rOPM (17Slow, DirectIndirectIndexedLongSlow, WRAP_NONE, ORA) + +rOP8 (0DM1, Absolute, WRAP_NONE, ORA) +rOP16(0DM0, Absolute, WRAP_NONE, ORA) +rOPM (0DSlow, AbsoluteSlow, WRAP_NONE, ORA) + +rOP8 (1DM1X1, AbsoluteIndexedXX1, WRAP_NONE, ORA) +rOP16(1DM0X1, AbsoluteIndexedXX1, WRAP_NONE, ORA) +rOP8 (1DM1X0, AbsoluteIndexedXX0, WRAP_NONE, ORA) +rOP16(1DM0X0, AbsoluteIndexedXX0, WRAP_NONE, ORA) +rOPM (1DSlow, AbsoluteIndexedXSlow, WRAP_NONE, ORA) + +rOP8 (19M1X1, AbsoluteIndexedYX1, WRAP_NONE, ORA) +rOP16(19M0X1, AbsoluteIndexedYX1, WRAP_NONE, ORA) +rOP8 (19M1X0, AbsoluteIndexedYX0, WRAP_NONE, ORA) +rOP16(19M0X0, AbsoluteIndexedYX0, WRAP_NONE, ORA) +rOPM (19Slow, AbsoluteIndexedYSlow, WRAP_NONE, ORA) + +rOP8 (0FM1, AbsoluteLong, WRAP_NONE, ORA) +rOP16(0FM0, AbsoluteLong, WRAP_NONE, ORA) +rOPM (0FSlow, AbsoluteLongSlow, WRAP_NONE, ORA) + +rOP8 (1FM1, AbsoluteLongIndexedX, WRAP_NONE, ORA) +rOP16(1FM0, AbsoluteLongIndexedX, WRAP_NONE, ORA) +rOPM (1FSlow, AbsoluteLongIndexedXSlow, WRAP_NONE, ORA) + +rOP8 (03M1, StackRelative, WRAP_NONE, ORA) +rOP16(03M0, StackRelative, WRAP_NONE, ORA) +rOPM (03Slow, StackRelativeSlow, WRAP_NONE, ORA) + +rOP8 (13M1, StackRelativeIndirectIndexed, WRAP_NONE, ORA) +rOP16(13M0, StackRelativeIndirectIndexed, WRAP_NONE, ORA) +rOPM (13Slow, StackRelativeIndirectIndexedSlow, WRAP_NONE, ORA) + +/* ROL ********************************************************************* */ + +static void Op2AM1 (void) +{ + AddCycles(ONE_CYCLE); + uint16 w = (((uint16) Registers.AL) << 1) | CheckCarry(); + ICPU._Carry = w >= 0x100; + Registers.AL = (uint8) w; + SetZN(Registers.AL); +} + +static void Op2AM0 (void) +{ + AddCycles(ONE_CYCLE); + uint32 w = (((uint32) Registers.A.W) << 1) | CheckCarry(); + ICPU._Carry = w >= 0x10000; + Registers.A.W = (uint16) w; + SetZN(Registers.A.W); +} + +static void Op2ASlow (void) +{ + AddCycles(ONE_CYCLE); + + if (CheckMemory()) + { + uint16 w = (((uint16) Registers.AL) << 1) | CheckCarry(); + ICPU._Carry = w >= 0x100; + Registers.AL = (uint8) w; + SetZN(Registers.AL); + } + else + { + uint32 w = (((uint32) Registers.A.W) << 1) | CheckCarry(); + ICPU._Carry = w >= 0x10000; + Registers.A.W = (uint16) w; + SetZN(Registers.A.W); + } +} + +mOP8 (26M1, Direct, WRAP_BANK, ROL) +mOP16(26M0, Direct, WRAP_BANK, ROL) +mOPM (26Slow, DirectSlow, WRAP_BANK, ROL) + +mOP8 (36E1, DirectIndexedXE1, WRAP_BANK, ROL) +mOP8 (36E0M1, DirectIndexedXE0, WRAP_BANK, ROL) +mOP16(36E0M0, DirectIndexedXE0, WRAP_BANK, ROL) +mOPM (36Slow, DirectIndexedXSlow, WRAP_BANK, ROL) + +mOP8 (2EM1, Absolute, WRAP_NONE, ROL) +mOP16(2EM0, Absolute, WRAP_NONE, ROL) +mOPM (2ESlow, AbsoluteSlow, WRAP_NONE, ROL) + +mOP8 (3EM1X1, AbsoluteIndexedXX1, WRAP_NONE, ROL) +mOP16(3EM0X1, AbsoluteIndexedXX1, WRAP_NONE, ROL) +mOP8 (3EM1X0, AbsoluteIndexedXX0, WRAP_NONE, ROL) +mOP16(3EM0X0, AbsoluteIndexedXX0, WRAP_NONE, ROL) +mOPM (3ESlow, AbsoluteIndexedXSlow, WRAP_NONE, ROL) + +/* ROR ********************************************************************* */ + +static void Op6AM1 (void) +{ + AddCycles(ONE_CYCLE); + uint16 w = ((uint16) Registers.AL) | (((uint16) CheckCarry()) << 8); + ICPU._Carry = w & 1; + w >>= 1; + Registers.AL = (uint8) w; + SetZN(Registers.AL); +} + +static void Op6AM0 (void) +{ + AddCycles(ONE_CYCLE); + uint32 w = ((uint32) Registers.A.W) | (((uint32) CheckCarry()) << 16); + ICPU._Carry = w & 1; + w >>= 1; + Registers.A.W = (uint16) w; + SetZN(Registers.A.W); +} + +static void Op6ASlow (void) +{ + AddCycles(ONE_CYCLE); + + if (CheckMemory()) + { + uint16 w = ((uint16) Registers.AL) | (((uint16) CheckCarry()) << 8); + ICPU._Carry = w & 1; + w >>= 1; + Registers.AL = (uint8) w; + SetZN(Registers.AL); + } + else + { + uint32 w = ((uint32) Registers.A.W) | (((uint32) CheckCarry()) << 16); + ICPU._Carry = w & 1; + w >>= 1; + Registers.A.W = (uint16) w; + SetZN(Registers.A.W); + } +} + +mOP8 (66M1, Direct, WRAP_BANK, ROR) +mOP16(66M0, Direct, WRAP_BANK, ROR) +mOPM (66Slow, DirectSlow, WRAP_BANK, ROR) + +mOP8 (76E1, DirectIndexedXE1, WRAP_BANK, ROR) +mOP8 (76E0M1, DirectIndexedXE0, WRAP_BANK, ROR) +mOP16(76E0M0, DirectIndexedXE0, WRAP_BANK, ROR) +mOPM (76Slow, DirectIndexedXSlow, WRAP_BANK, ROR) + +mOP8 (6EM1, Absolute, WRAP_NONE, ROR) +mOP16(6EM0, Absolute, WRAP_NONE, ROR) +mOPM (6ESlow, AbsoluteSlow, WRAP_NONE, ROR) + +mOP8 (7EM1X1, AbsoluteIndexedXX1, WRAP_NONE, ROR) +mOP16(7EM0X1, AbsoluteIndexedXX1, WRAP_NONE, ROR) +mOP8 (7EM1X0, AbsoluteIndexedXX0, WRAP_NONE, ROR) +mOP16(7EM0X0, AbsoluteIndexedXX0, WRAP_NONE, ROR) +mOPM (7ESlow, AbsoluteIndexedXSlow, WRAP_NONE, ROR) + +/* SBC ********************************************************************* */ + +static void OpE9M1 (void) +{ + SBC(Immediate8(READ)); +} + +static void OpE9M0 (void) +{ + SBC(Immediate16(READ)); +} + +static void OpE9Slow (void) +{ + if (CheckMemory()) + SBC(Immediate8Slow(READ)); + else + SBC(Immediate16Slow(READ)); +} + +rOP8 (E5M1, Direct, WRAP_BANK, SBC) +rOP16(E5M0, Direct, WRAP_BANK, SBC) +rOPM (E5Slow, DirectSlow, WRAP_BANK, SBC) + +rOP8 (F5E1, DirectIndexedXE1, WRAP_BANK, SBC) +rOP8 (F5E0M1, DirectIndexedXE0, WRAP_BANK, SBC) +rOP16(F5E0M0, DirectIndexedXE0, WRAP_BANK, SBC) +rOPM (F5Slow, DirectIndexedXSlow, WRAP_BANK, SBC) + +rOP8 (F2E1, DirectIndirectE1, WRAP_NONE, SBC) +rOP8 (F2E0M1, DirectIndirectE0, WRAP_NONE, SBC) +rOP16(F2E0M0, DirectIndirectE0, WRAP_NONE, SBC) +rOPM (F2Slow, DirectIndirectSlow, WRAP_NONE, SBC) + +rOP8 (E1E1, DirectIndexedIndirectE1, WRAP_NONE, SBC) +rOP8 (E1E0M1, DirectIndexedIndirectE0, WRAP_NONE, SBC) +rOP16(E1E0M0, DirectIndexedIndirectE0, WRAP_NONE, SBC) +rOPM (E1Slow, DirectIndexedIndirectSlow, WRAP_NONE, SBC) + +rOP8 (F1E1, DirectIndirectIndexedE1, WRAP_NONE, SBC) +rOP8 (F1E0M1X1, DirectIndirectIndexedE0X1, WRAP_NONE, SBC) +rOP16(F1E0M0X1, DirectIndirectIndexedE0X1, WRAP_NONE, SBC) +rOP8 (F1E0M1X0, DirectIndirectIndexedE0X0, WRAP_NONE, SBC) +rOP16(F1E0M0X0, DirectIndirectIndexedE0X0, WRAP_NONE, SBC) +rOPM (F1Slow, DirectIndirectIndexedSlow, WRAP_NONE, SBC) + +rOP8 (E7M1, DirectIndirectLong, WRAP_NONE, SBC) +rOP16(E7M0, DirectIndirectLong, WRAP_NONE, SBC) +rOPM (E7Slow, DirectIndirectLongSlow, WRAP_NONE, SBC) + +rOP8 (F7M1, DirectIndirectIndexedLong, WRAP_NONE, SBC) +rOP16(F7M0, DirectIndirectIndexedLong, WRAP_NONE, SBC) +rOPM (F7Slow, DirectIndirectIndexedLongSlow, WRAP_NONE, SBC) + +rOP8 (EDM1, Absolute, WRAP_NONE, SBC) +rOP16(EDM0, Absolute, WRAP_NONE, SBC) +rOPM (EDSlow, AbsoluteSlow, WRAP_NONE, SBC) + +rOP8 (FDM1X1, AbsoluteIndexedXX1, WRAP_NONE, SBC) +rOP16(FDM0X1, AbsoluteIndexedXX1, WRAP_NONE, SBC) +rOP8 (FDM1X0, AbsoluteIndexedXX0, WRAP_NONE, SBC) +rOP16(FDM0X0, AbsoluteIndexedXX0, WRAP_NONE, SBC) +rOPM (FDSlow, AbsoluteIndexedXSlow, WRAP_NONE, SBC) + +rOP8 (F9M1X1, AbsoluteIndexedYX1, WRAP_NONE, SBC) +rOP16(F9M0X1, AbsoluteIndexedYX1, WRAP_NONE, SBC) +rOP8 (F9M1X0, AbsoluteIndexedYX0, WRAP_NONE, SBC) +rOP16(F9M0X0, AbsoluteIndexedYX0, WRAP_NONE, SBC) +rOPM (F9Slow, AbsoluteIndexedYSlow, WRAP_NONE, SBC) + +rOP8 (EFM1, AbsoluteLong, WRAP_NONE, SBC) +rOP16(EFM0, AbsoluteLong, WRAP_NONE, SBC) +rOPM (EFSlow, AbsoluteLongSlow, WRAP_NONE, SBC) + +rOP8 (FFM1, AbsoluteLongIndexedX, WRAP_NONE, SBC) +rOP16(FFM0, AbsoluteLongIndexedX, WRAP_NONE, SBC) +rOPM (FFSlow, AbsoluteLongIndexedXSlow, WRAP_NONE, SBC) + +rOP8 (E3M1, StackRelative, WRAP_NONE, SBC) +rOP16(E3M0, StackRelative, WRAP_NONE, SBC) +rOPM (E3Slow, StackRelativeSlow, WRAP_NONE, SBC) + +rOP8 (F3M1, StackRelativeIndirectIndexed, WRAP_NONE, SBC) +rOP16(F3M0, StackRelativeIndirectIndexed, WRAP_NONE, SBC) +rOPM (F3Slow, StackRelativeIndirectIndexedSlow, WRAP_NONE, SBC) + +/* STA ********************************************************************* */ + +wOP8 (85M1, Direct, WRAP_BANK, STA) +wOP16(85M0, Direct, WRAP_BANK, STA) +wOPM (85Slow, DirectSlow, WRAP_BANK, STA) + +wOP8 (95E1, DirectIndexedXE1, WRAP_BANK, STA) +wOP8 (95E0M1, DirectIndexedXE0, WRAP_BANK, STA) +wOP16(95E0M0, DirectIndexedXE0, WRAP_BANK, STA) +wOPM (95Slow, DirectIndexedXSlow, WRAP_BANK, STA) + +wOP8 (92E1, DirectIndirectE1, WRAP_NONE, STA) +wOP8 (92E0M1, DirectIndirectE0, WRAP_NONE, STA) +wOP16(92E0M0, DirectIndirectE0, WRAP_NONE, STA) +wOPM (92Slow, DirectIndirectSlow, WRAP_NONE, STA) + +wOP8 (81E1, DirectIndexedIndirectE1, WRAP_NONE, STA) +wOP8 (81E0M1, DirectIndexedIndirectE0, WRAP_NONE, STA) +wOP16(81E0M0, DirectIndexedIndirectE0, WRAP_NONE, STA) +wOPM (81Slow, DirectIndexedIndirectSlow, WRAP_NONE, STA) + +wOP8 (91E1, DirectIndirectIndexedE1, WRAP_NONE, STA) +wOP8 (91E0M1X1, DirectIndirectIndexedE0X1, WRAP_NONE, STA) +wOP16(91E0M0X1, DirectIndirectIndexedE0X1, WRAP_NONE, STA) +wOP8 (91E0M1X0, DirectIndirectIndexedE0X0, WRAP_NONE, STA) +wOP16(91E0M0X0, DirectIndirectIndexedE0X0, WRAP_NONE, STA) +wOPM (91Slow, DirectIndirectIndexedSlow, WRAP_NONE, STA) + +wOP8 (87M1, DirectIndirectLong, WRAP_NONE, STA) +wOP16(87M0, DirectIndirectLong, WRAP_NONE, STA) +wOPM (87Slow, DirectIndirectLongSlow, WRAP_NONE, STA) + +wOP8 (97M1, DirectIndirectIndexedLong, WRAP_NONE, STA) +wOP16(97M0, DirectIndirectIndexedLong, WRAP_NONE, STA) +wOPM (97Slow, DirectIndirectIndexedLongSlow, WRAP_NONE, STA) + +wOP8 (8DM1, Absolute, WRAP_NONE, STA) +wOP16(8DM0, Absolute, WRAP_NONE, STA) +wOPM (8DSlow, AbsoluteSlow, WRAP_NONE, STA) + +wOP8 (9DM1X1, AbsoluteIndexedXX1, WRAP_NONE, STA) +wOP16(9DM0X1, AbsoluteIndexedXX1, WRAP_NONE, STA) +wOP8 (9DM1X0, AbsoluteIndexedXX0, WRAP_NONE, STA) +wOP16(9DM0X0, AbsoluteIndexedXX0, WRAP_NONE, STA) +wOPM (9DSlow, AbsoluteIndexedXSlow, WRAP_NONE, STA) + +wOP8 (99M1X1, AbsoluteIndexedYX1, WRAP_NONE, STA) +wOP16(99M0X1, AbsoluteIndexedYX1, WRAP_NONE, STA) +wOP8 (99M1X0, AbsoluteIndexedYX0, WRAP_NONE, STA) +wOP16(99M0X0, AbsoluteIndexedYX0, WRAP_NONE, STA) +wOPM (99Slow, AbsoluteIndexedYSlow, WRAP_NONE, STA) + +wOP8 (8FM1, AbsoluteLong, WRAP_NONE, STA) +wOP16(8FM0, AbsoluteLong, WRAP_NONE, STA) +wOPM (8FSlow, AbsoluteLongSlow, WRAP_NONE, STA) + +wOP8 (9FM1, AbsoluteLongIndexedX, WRAP_NONE, STA) +wOP16(9FM0, AbsoluteLongIndexedX, WRAP_NONE, STA) +wOPM (9FSlow, AbsoluteLongIndexedXSlow, WRAP_NONE, STA) + +wOP8 (83M1, StackRelative, WRAP_NONE, STA) +wOP16(83M0, StackRelative, WRAP_NONE, STA) +wOPM (83Slow, StackRelativeSlow, WRAP_NONE, STA) + +wOP8 (93M1, StackRelativeIndirectIndexed, WRAP_NONE, STA) +wOP16(93M0, StackRelativeIndirectIndexed, WRAP_NONE, STA) +wOPM (93Slow, StackRelativeIndirectIndexedSlow, WRAP_NONE, STA) + +/* STX ********************************************************************* */ + +wOP8 (86X1, Direct, WRAP_BANK, STX) +wOP16(86X0, Direct, WRAP_BANK, STX) +wOPX (86Slow, DirectSlow, WRAP_BANK, STX) + +wOP8 (96E1, DirectIndexedYE1, WRAP_BANK, STX) +wOP8 (96E0X1, DirectIndexedYE0, WRAP_BANK, STX) +wOP16(96E0X0, DirectIndexedYE0, WRAP_BANK, STX) +wOPX (96Slow, DirectIndexedYSlow, WRAP_BANK, STX) + +wOP8 (8EX1, Absolute, WRAP_BANK, STX) +wOP16(8EX0, Absolute, WRAP_BANK, STX) +wOPX (8ESlow, AbsoluteSlow, WRAP_BANK, STX) + +/* STY ********************************************************************* */ + +wOP8 (84X1, Direct, WRAP_BANK, STY) +wOP16(84X0, Direct, WRAP_BANK, STY) +wOPX (84Slow, DirectSlow, WRAP_BANK, STY) + +wOP8 (94E1, DirectIndexedXE1, WRAP_BANK, STY) +wOP8 (94E0X1, DirectIndexedXE0, WRAP_BANK, STY) +wOP16(94E0X0, DirectIndexedXE0, WRAP_BANK, STY) +wOPX (94Slow, DirectIndexedXSlow, WRAP_BANK, STY) + +wOP8 (8CX1, Absolute, WRAP_BANK, STY) +wOP16(8CX0, Absolute, WRAP_BANK, STY) +wOPX (8CSlow, AbsoluteSlow, WRAP_BANK, STY) + +/* STZ ********************************************************************* */ + +wOP8 (64M1, Direct, WRAP_BANK, STZ) +wOP16(64M0, Direct, WRAP_BANK, STZ) +wOPM (64Slow, DirectSlow, WRAP_BANK, STZ) + +wOP8 (74E1, DirectIndexedXE1, WRAP_BANK, STZ) +wOP8 (74E0M1, DirectIndexedXE0, WRAP_BANK, STZ) +wOP16(74E0M0, DirectIndexedXE0, WRAP_BANK, STZ) +wOPM (74Slow, DirectIndexedXSlow, WRAP_BANK, STZ) + +wOP8 (9CM1, Absolute, WRAP_NONE, STZ) +wOP16(9CM0, Absolute, WRAP_NONE, STZ) +wOPM (9CSlow, AbsoluteSlow, WRAP_NONE, STZ) + +wOP8 (9EM1X1, AbsoluteIndexedXX1, WRAP_NONE, STZ) +wOP16(9EM0X1, AbsoluteIndexedXX1, WRAP_NONE, STZ) +wOP8 (9EM1X0, AbsoluteIndexedXX0, WRAP_NONE, STZ) +wOP16(9EM0X0, AbsoluteIndexedXX0, WRAP_NONE, STZ) +wOPM (9ESlow, AbsoluteIndexedXSlow, WRAP_NONE, STZ) + +/* TRB ********************************************************************* */ + +mOP8 (14M1, Direct, WRAP_BANK, TRB) +mOP16(14M0, Direct, WRAP_BANK, TRB) +mOPM (14Slow, DirectSlow, WRAP_BANK, TRB) + +mOP8 (1CM1, Absolute, WRAP_BANK, TRB) +mOP16(1CM0, Absolute, WRAP_BANK, TRB) +mOPM (1CSlow, AbsoluteSlow, WRAP_BANK, TRB) + +/* TSB ********************************************************************* */ + +mOP8 (04M1, Direct, WRAP_BANK, TSB) +mOP16(04M0, Direct, WRAP_BANK, TSB) +mOPM (04Slow, DirectSlow, WRAP_BANK, TSB) + +mOP8 (0CM1, Absolute, WRAP_BANK, TSB) +mOP16(0CM0, Absolute, WRAP_BANK, TSB) +mOPM (0CSlow, AbsoluteSlow, WRAP_BANK, TSB) + +/* Branch Instructions ***************************************************** */ + +#ifdef CPU_SHUTDOWN + +#ifndef SA1_OPCODES + +inline void CPUShutdown (void) +{ + if (Settings.Shutdown && Registers.PBPC == CPU.WaitAddress) + { + // Don't skip cycles with a pending NMI or IRQ - could cause delayed interrupt. + if (CPU.WaitCounter == 0 && !(CPU.Flags & (IRQ_FLAG | NMI_FLAG))) + { + CPU.WaitAddress = 0xffffffff; + if (Settings.SA1) + S9xSA1ExecuteDuringSleep(); + CPU.Cycles = CPU.NextEvent; + ICPU.CPUExecuting = FALSE; + S9xAPUExecute(); + ICPU.CPUExecuting = TRUE; + } + else + if (CPU.WaitCounter >= 2) + CPU.WaitCounter = 1; + else + CPU.WaitCounter--; + } +} + +#else + +inline void CPUShutdown (void) +{ + if (Settings.Shutdown && Registers.PBPC == CPU.WaitAddress) + { + if (CPU.WaitCounter >= 1) + SA1.Executing = FALSE; + else + CPU.WaitCounter++; + } +} + +#endif + +#else + +#define CPUShutdown() + +#endif + +// BCC +bOP(90E0, Relative, !CheckCarry(), 0, 0) +bOP(90E1, Relative, !CheckCarry(), 0, 1) +bOP(90Slow, RelativeSlow, !CheckCarry(), 0, CheckEmulation()) + +// BCS +bOP(B0E0, Relative, CheckCarry(), 0, 0) +bOP(B0E1, Relative, CheckCarry(), 0, 1) +bOP(B0Slow, RelativeSlow, CheckCarry(), 0, CheckEmulation()) + +// BEQ +bOP(F0E0, Relative, CheckZero(), 2, 0) +bOP(F0E1, Relative, CheckZero(), 2, 1) +bOP(F0Slow, RelativeSlow, CheckZero(), 2, CheckEmulation()) + +// BMI +bOP(30E0, Relative, CheckNegative(), 1, 0) +bOP(30E1, Relative, CheckNegative(), 1, 1) +bOP(30Slow, RelativeSlow, CheckNegative(), 1, CheckEmulation()) + +// BNE +bOP(D0E0, Relative, !CheckZero(), 1, 0) +bOP(D0E1, Relative, !CheckZero(), 1, 1) +bOP(D0Slow, RelativeSlow, !CheckZero(), 1, CheckEmulation()) + +// BPL +bOP(10E0, Relative, !CheckNegative(), 1, 0) +bOP(10E1, Relative, !CheckNegative(), 1, 1) +bOP(10Slow, RelativeSlow, !CheckNegative(), 1, CheckEmulation()) + +// BRA +bOP(80E0, Relative, 1, X, 0) +bOP(80E1, Relative, 1, X, 1) +bOP(80Slow, RelativeSlow, 1, X, CheckEmulation()) + +// BVC +bOP(50E0, Relative, !CheckOverflow(), 0, 0) +bOP(50E1, Relative, !CheckOverflow(), 0, 1) +bOP(50Slow, RelativeSlow, !CheckOverflow(), 0, CheckEmulation()) + +// BVS +bOP(70E0, Relative, CheckOverflow(), 0, 0) +bOP(70E1, Relative, CheckOverflow(), 0, 1) +bOP(70Slow, RelativeSlow, CheckOverflow(), 0, CheckEmulation()) + +// BRL +static void Op82 (void) +{ + S9xSetPCBase(ICPU.ShiftedPB + RelativeLong(JUMP)); +} + +static void Op82Slow (void) +{ + S9xSetPCBase(ICPU.ShiftedPB + RelativeLongSlow(JUMP)); +} + +/* Flag Instructions ******************************************************* */ + +// CLC +static void Op18 (void) +{ + ClearCarry(); + AddCycles(ONE_CYCLE); +} + +// SEC +static void Op38 (void) +{ + SetCarry(); + AddCycles(ONE_CYCLE); +} + +// CLD +static void OpD8 (void) +{ + ClearDecimal(); + AddCycles(ONE_CYCLE); +} + +// SED +static void OpF8 (void) +{ + SetDecimal(); + AddCycles(ONE_CYCLE); +#ifdef DEBUGGER + missing.decimal_mode = 1; +#endif +} + +// CLI +static void Op58 (void) +{ + ClearIRQ(); + AddCycles(ONE_CYCLE); + //CHECK_FOR_IRQ(); +} + +// SEI +static void Op78 (void) +{ + SetIRQ(); + AddCycles(ONE_CYCLE); +} + +// CLV +static void OpB8 (void) +{ + ClearOverflow(); + AddCycles(ONE_CYCLE); +} + +/* DEX/DEY ***************************************************************** */ + +static void OpCAX1 (void) +{ + AddCycles(ONE_CYCLE); +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = 0xffffffff; +#endif + Registers.XL--; + SetZN(Registers.XL); +} + +static void OpCAX0 (void) +{ + AddCycles(ONE_CYCLE); +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = 0xffffffff; +#endif + Registers.X.W--; + SetZN(Registers.X.W); +} + +static void OpCASlow (void) +{ + AddCycles(ONE_CYCLE); +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = 0xffffffff; +#endif + + if (CheckIndex()) + { + Registers.XL--; + SetZN(Registers.XL); + } + else + { + Registers.X.W--; + SetZN(Registers.X.W); + } +} + +static void Op88X1 (void) +{ + AddCycles(ONE_CYCLE); +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = 0xffffffff; +#endif + Registers.YL--; + SetZN(Registers.YL); +} + +static void Op88X0 (void) +{ + AddCycles(ONE_CYCLE); +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = 0xffffffff; +#endif + Registers.Y.W--; + SetZN(Registers.Y.W); +} + +static void Op88Slow (void) +{ + AddCycles(ONE_CYCLE); +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = 0xffffffff; +#endif + + if (CheckIndex()) + { + Registers.YL--; + SetZN(Registers.YL); + } + else + { + Registers.Y.W--; + SetZN(Registers.Y.W); + } +} + +/* INX/INY ***************************************************************** */ + +static void OpE8X1 (void) +{ + AddCycles(ONE_CYCLE); +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = 0xffffffff; +#endif + Registers.XL++; + SetZN(Registers.XL); +} + +static void OpE8X0 (void) +{ + AddCycles(ONE_CYCLE); +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = 0xffffffff; +#endif + Registers.X.W++; + SetZN(Registers.X.W); +} + +static void OpE8Slow (void) +{ + AddCycles(ONE_CYCLE); +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = 0xffffffff; +#endif + + if (CheckIndex()) + { + Registers.XL++; + SetZN(Registers.XL); + } + else + { + Registers.X.W++; + SetZN(Registers.X.W); + } +} + +static void OpC8X1 (void) +{ + AddCycles(ONE_CYCLE); +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = 0xffffffff; +#endif + Registers.YL++; + SetZN(Registers.YL); +} + +static void OpC8X0 (void) +{ + AddCycles(ONE_CYCLE); +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = 0xffffffff; +#endif + Registers.Y.W++; + SetZN(Registers.Y.W); +} + +static void OpC8Slow (void) +{ + AddCycles(ONE_CYCLE); +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = 0xffffffff; +#endif + + if (CheckIndex()) + { + Registers.YL--; + SetZN(Registers.YL); + } + else + { + Registers.Y.W--; + SetZN(Registers.Y.W); + } +} + +/* NOP ********************************************************************* */ + +static void OpEA (void) +{ + AddCycles(ONE_CYCLE); +} + +/* PUSH Instructions ******************************************************* */ + +#define PushW(w) \ + S9xSetWord(w, Registers.S.W - 1, WRAP_BANK, WRITE_10); \ + Registers.S.W -= 2; + +#define PushWE(w) \ + Registers.SL--; \ + S9xSetWord(w, Registers.S.W, WRAP_PAGE, WRITE_10); \ + Registers.SL--; + +#define PushB(b) \ + S9xSetByte(b, Registers.S.W--); + +#define PushBE(b) \ + S9xSetByte(b, Registers.S.W); \ + Registers.SL--; + +// PEA +static void OpF4E0 (void) +{ + uint16 val = (uint16) Absolute(NONE); + PushW(val); + OpenBus = val & 0xff; +} + +static void OpF4E1 (void) +{ + // Note: PEA is a new instruction, + // and so doesn't respect the emu-mode stack bounds. + uint16 val = (uint16) Absolute(NONE); + PushW(val); + OpenBus = val & 0xff; + Registers.SH = 1; +} + +static void OpF4Slow (void) +{ + uint16 val = (uint16) AbsoluteSlow(NONE); + PushW(val); + OpenBus = val & 0xff; + if (CheckEmulation()) + Registers.SH = 1; +} + +// PEI +static void OpD4E0 (void) +{ + uint16 val = (uint16) DirectIndirectE0(NONE); + PushW(val); + OpenBus = val & 0xff; +} + +static void OpD4E1 (void) +{ + // Note: PEI is a new instruction, + // and so doesn't respect the emu-mode stack bounds. + uint16 val = (uint16) DirectIndirectE1(NONE); + PushW(val); + OpenBus = val & 0xff; + Registers.SH = 1; +} + +static void OpD4Slow (void) +{ + uint16 val = (uint16) DirectIndirectSlow(NONE); + PushW(val); + OpenBus = val & 0xff; + if (CheckEmulation()) + Registers.SH = 1; +} + +// PER +static void Op62E0 (void) +{ + uint16 val = (uint16) RelativeLong(NONE); + PushW(val); + OpenBus = val & 0xff; +} + +static void Op62E1 (void) +{ + // Note: PER is a new instruction, + // and so doesn't respect the emu-mode stack bounds. + uint16 val = (uint16) RelativeLong(NONE); + PushW(val); + OpenBus = val & 0xff; + Registers.SH = 1; +} + +static void Op62Slow (void) +{ + uint16 val = (uint16) RelativeLongSlow(NONE); + PushW(val); + OpenBus = val & 0xff; + if (CheckEmulation()) + Registers.SH = 1; +} + +// PHA +static void Op48E1 (void) +{ + AddCycles(ONE_CYCLE); + PushBE(Registers.AL); + OpenBus = Registers.AL; +} + +static void Op48E0M1 (void) +{ + AddCycles(ONE_CYCLE); + PushB(Registers.AL); + OpenBus = Registers.AL; +} + +static void Op48E0M0 (void) +{ + AddCycles(ONE_CYCLE); + PushW(Registers.A.W); + OpenBus = Registers.AL; +} + +static void Op48Slow (void) +{ + AddCycles(ONE_CYCLE); + + if (CheckEmulation()) + { + PushBE(Registers.AL); + } + else + if (CheckMemory()) + { + PushB(Registers.AL); + } + else + { + PushW(Registers.A.W); + } + + OpenBus = Registers.AL; +} + +// PHB +static void Op8BE1 (void) +{ + AddCycles(ONE_CYCLE); + PushBE(Registers.DB); + OpenBus = Registers.DB; +} + +static void Op8BE0 (void) +{ + AddCycles(ONE_CYCLE); + PushB(Registers.DB); + OpenBus = Registers.DB; +} + +static void Op8BSlow (void) +{ + AddCycles(ONE_CYCLE); + + if (CheckEmulation()) + { + PushBE(Registers.DB); + } + else + { + PushB(Registers.DB); + } + + OpenBus = Registers.DB; +} + +// PHD +static void Op0BE0 (void) +{ + AddCycles(ONE_CYCLE); + PushW(Registers.D.W); + OpenBus = Registers.DL; +} + +static void Op0BE1 (void) +{ + // Note: PHD is a new instruction, + // and so doesn't respect the emu-mode stack bounds. + AddCycles(ONE_CYCLE); + PushW(Registers.D.W); + OpenBus = Registers.DL; + Registers.SH = 1; +} + +static void Op0BSlow (void) +{ + AddCycles(ONE_CYCLE); + PushW(Registers.D.W); + OpenBus = Registers.DL; + if (CheckEmulation()) + Registers.SH = 1; +} + +// PHK +static void Op4BE1 (void) +{ + AddCycles(ONE_CYCLE); + PushBE(Registers.PB); + OpenBus = Registers.PB; +} + +static void Op4BE0 (void) +{ + AddCycles(ONE_CYCLE); + PushB(Registers.PB); + OpenBus = Registers.PB; +} + +static void Op4BSlow (void) +{ + AddCycles(ONE_CYCLE); + + if (CheckEmulation()) + { + PushBE(Registers.PB); + } + else + { + PushB(Registers.PB); + } + + OpenBus = Registers.PB; +} + +// PHP +static void Op08E0 (void) +{ + S9xPackStatus(); + AddCycles(ONE_CYCLE); + PushB(Registers.PL); + OpenBus = Registers.PL; +} + +static void Op08E1 (void) +{ + S9xPackStatus(); + AddCycles(ONE_CYCLE); + PushBE(Registers.PL); + OpenBus = Registers.PL; +} + +static void Op08Slow (void) +{ + S9xPackStatus(); + AddCycles(ONE_CYCLE); + + if (CheckEmulation()) + { + PushBE(Registers.PL); + } + else + { + PushB(Registers.PL); + } + + OpenBus = Registers.PL; +} + +// PHX +static void OpDAE1 (void) +{ + AddCycles(ONE_CYCLE); + PushBE(Registers.XL); + OpenBus = Registers.XL; +} + +static void OpDAE0X1 (void) +{ + AddCycles(ONE_CYCLE); + PushB(Registers.XL); + OpenBus = Registers.XL; +} + +static void OpDAE0X0 (void) +{ + AddCycles(ONE_CYCLE); + PushW(Registers.X.W); + OpenBus = Registers.XL; +} + +static void OpDASlow (void) +{ + AddCycles(ONE_CYCLE); + + if (CheckEmulation()) + { + PushBE(Registers.XL); + } + else + if (CheckIndex()) + { + PushB(Registers.XL); + } + else + { + PushW(Registers.X.W); + } + + OpenBus = Registers.XL; +} + +// PHY +static void Op5AE1 (void) +{ + AddCycles(ONE_CYCLE); + PushBE(Registers.YL); + OpenBus = Registers.YL; +} + +static void Op5AE0X1 (void) +{ + AddCycles(ONE_CYCLE); + PushB(Registers.YL); + OpenBus = Registers.YL; +} + +static void Op5AE0X0 (void) +{ + AddCycles(ONE_CYCLE); + PushW(Registers.Y.W); + OpenBus = Registers.YL; +} + +static void Op5ASlow (void) +{ + AddCycles(ONE_CYCLE); + + if (CheckEmulation()) + { + PushBE(Registers.YL); + } + else + if (CheckIndex()) + { + PushB(Registers.YL); + } + else + { + PushW(Registers.Y.W); + } + + OpenBus = Registers.YL; +} + +/* PULL Instructions ******************************************************* */ + +#define PullW(w) \ + w = S9xGetWord(Registers.S.W + 1, WRAP_BANK); \ + Registers.S.W += 2; + +#define PullWE(w) \ + Registers.SL++; \ + w = S9xGetWord(Registers.S.W, WRAP_PAGE); \ + Registers.SL++; + +#define PullB(b) \ + b = S9xGetByte(++Registers.S.W); + +#define PullBE(b) \ + Registers.SL++; \ + b = S9xGetByte(Registers.S.W); + +// PLA +static void Op68E1 (void) +{ + AddCycles(TWO_CYCLES); + PullBE(Registers.AL); + SetZN(Registers.AL); + OpenBus = Registers.AL; +} + +static void Op68E0M1 (void) +{ + AddCycles(TWO_CYCLES); + PullB(Registers.AL); + SetZN(Registers.AL); + OpenBus = Registers.AL; +} + +static void Op68E0M0 (void) +{ + AddCycles(TWO_CYCLES); + PullW(Registers.A.W); + SetZN(Registers.A.W); + OpenBus = Registers.AH; +} + +static void Op68Slow (void) +{ + AddCycles(TWO_CYCLES); + + if (CheckEmulation()) + { + PullBE(Registers.AL); + SetZN(Registers.AL); + OpenBus = Registers.AL; + } + else + if (CheckMemory()) + { + PullB(Registers.AL); + SetZN(Registers.AL); + OpenBus = Registers.AL; + } + else + { + PullW(Registers.A.W); + SetZN(Registers.A.W); + OpenBus = Registers.AH; + } +} + +// PLB +static void OpABE1 (void) +{ + AddCycles(TWO_CYCLES); + PullBE(Registers.DB); + SetZN(Registers.DB); + ICPU.ShiftedDB = Registers.DB << 16; + OpenBus = Registers.DB; +} + +static void OpABE0 (void) +{ + AddCycles(TWO_CYCLES); + PullB(Registers.DB); + SetZN(Registers.DB); + ICPU.ShiftedDB = Registers.DB << 16; + OpenBus = Registers.DB; +} + +static void OpABSlow (void) +{ + AddCycles(TWO_CYCLES); + + if (CheckEmulation()) + { + PullBE(Registers.DB); + } + else + { + PullB(Registers.DB); + } + + SetZN(Registers.DB); + ICPU.ShiftedDB = Registers.DB << 16; + OpenBus = Registers.DB; +} + +// PLD +static void Op2BE0 (void) +{ + AddCycles(TWO_CYCLES); + PullW(Registers.D.W); + SetZN(Registers.D.W); + OpenBus = Registers.DH; +} + +static void Op2BE1 (void) +{ + // Note: PLD is a new instruction, + // and so doesn't respect the emu-mode stack bounds. + AddCycles(TWO_CYCLES); + PullW(Registers.D.W); + SetZN(Registers.D.W); + OpenBus = Registers.DH; + Registers.SH = 1; +} + +static void Op2BSlow (void) +{ + AddCycles(TWO_CYCLES); + PullW(Registers.D.W); + SetZN(Registers.D.W); + OpenBus = Registers.DH; + if (CheckEmulation()) + Registers.SH = 1; +} + +// PLP +static void Op28E1 (void) +{ + AddCycles(TWO_CYCLES); + PullBE(Registers.PL); + OpenBus = Registers.PL; + SetFlags(MemoryFlag | IndexFlag); + S9xUnpackStatus(); + S9xFixCycles(); + //CHECK_FOR_IRQ(); +} + +static void Op28E0 (void) +{ + AddCycles(TWO_CYCLES); + PullB(Registers.PL); + OpenBus = Registers.PL; + S9xUnpackStatus(); + + if (CheckIndex()) + { + Registers.XH = 0; + Registers.YH = 0; + } + + S9xFixCycles(); + //CHECK_FOR_IRQ(); +} + +static void Op28Slow (void) +{ + AddCycles(TWO_CYCLES); + + if (CheckEmulation()) + { + PullBE(Registers.PL); + OpenBus = Registers.PL; + SetFlags(MemoryFlag | IndexFlag); + } + else + { + PullB(Registers.PL); + OpenBus = Registers.PL; + } + + S9xUnpackStatus(); + + if (CheckIndex()) + { + Registers.XH = 0; + Registers.YH = 0; + } + + S9xFixCycles(); + //CHECK_FOR_IRQ(); +} + +// PLX +static void OpFAE1 (void) +{ + AddCycles(TWO_CYCLES); + PullBE(Registers.XL); + SetZN(Registers.XL); + OpenBus = Registers.XL; +} + +static void OpFAE0X1 (void) +{ + AddCycles(TWO_CYCLES); + PullB(Registers.XL); + SetZN(Registers.XL); + OpenBus = Registers.XL; +} + +static void OpFAE0X0 (void) +{ + AddCycles(TWO_CYCLES); + PullW(Registers.X.W); + SetZN(Registers.X.W); + OpenBus = Registers.XH; +} + +static void OpFASlow (void) +{ + AddCycles(TWO_CYCLES); + + if (CheckEmulation()) + { + PullBE(Registers.XL); + SetZN(Registers.XL); + OpenBus = Registers.XL; + } + else + if (CheckIndex()) + { + PullB(Registers.XL); + SetZN(Registers.XL); + OpenBus = Registers.XL; + } + else + { + PullW(Registers.X.W); + SetZN(Registers.X.W); + OpenBus = Registers.XH; + } +} + +// PLY +static void Op7AE1 (void) +{ + AddCycles(TWO_CYCLES); + PullBE(Registers.YL); + SetZN(Registers.YL); + OpenBus = Registers.YL; +} + +static void Op7AE0X1 (void) +{ + AddCycles(TWO_CYCLES); + PullB(Registers.YL); + SetZN(Registers.YL); + OpenBus = Registers.YL; +} + +static void Op7AE0X0 (void) +{ + AddCycles(TWO_CYCLES); + PullW(Registers.Y.W); + SetZN(Registers.Y.W); + OpenBus = Registers.YH; +} + +static void Op7ASlow (void) +{ + AddCycles(TWO_CYCLES); + + if (CheckEmulation()) + { + PullBE(Registers.YL); + SetZN(Registers.YL); + OpenBus = Registers.YL; + } + else + if (CheckIndex()) + { + PullB(Registers.YL); + SetZN(Registers.YL); + OpenBus = Registers.YL; + } + else + { + PullW(Registers.Y.W); + SetZN(Registers.Y.W); + OpenBus = Registers.YH; + } +} + +/* Transfer Instructions *************************************************** */ + +// TAX +static void OpAAX1 (void) +{ + AddCycles(ONE_CYCLE); + Registers.XL = Registers.AL; + SetZN(Registers.XL); +} + +static void OpAAX0 (void) +{ + AddCycles(ONE_CYCLE); + Registers.X.W = Registers.A.W; + SetZN(Registers.X.W); +} + +static void OpAASlow (void) +{ + AddCycles(ONE_CYCLE); + + if (CheckIndex()) + { + Registers.XL = Registers.AL; + SetZN(Registers.XL); + } + else + { + Registers.X.W = Registers.A.W; + SetZN(Registers.X.W); + } +} + +// TAY +static void OpA8X1 (void) +{ + AddCycles(ONE_CYCLE); + Registers.YL = Registers.AL; + SetZN(Registers.YL); +} + +static void OpA8X0 (void) +{ + AddCycles(ONE_CYCLE); + Registers.Y.W = Registers.A.W; + SetZN(Registers.Y.W); +} + +static void OpA8Slow (void) +{ + AddCycles(ONE_CYCLE); + + if (CheckIndex()) + { + Registers.YL = Registers.AL; + SetZN(Registers.YL); + } + else + { + Registers.Y.W = Registers.A.W; + SetZN(Registers.Y.W); + } +} + +// TCD +static void Op5B (void) +{ + AddCycles(ONE_CYCLE); + Registers.D.W = Registers.A.W; + SetZN(Registers.D.W); +} + +// TCS +static void Op1B (void) +{ + AddCycles(ONE_CYCLE); + Registers.S.W = Registers.A.W; + if (CheckEmulation()) + Registers.SH = 1; +} + +// TDC +static void Op7B (void) +{ + AddCycles(ONE_CYCLE); + Registers.A.W = Registers.D.W; + SetZN(Registers.A.W); +} + +// TSC +static void Op3B (void) +{ + AddCycles(ONE_CYCLE); + Registers.A.W = Registers.S.W; + SetZN(Registers.A.W); +} + +// TSX +static void OpBAX1 (void) +{ + AddCycles(ONE_CYCLE); + Registers.XL = Registers.SL; + SetZN(Registers.XL); +} + +static void OpBAX0 (void) +{ + AddCycles(ONE_CYCLE); + Registers.X.W = Registers.S.W; + SetZN(Registers.X.W); +} + +static void OpBASlow (void) +{ + AddCycles(ONE_CYCLE); + + if (CheckIndex()) + { + Registers.XL = Registers.SL; + SetZN(Registers.XL); + } + else + { + Registers.X.W = Registers.S.W; + SetZN(Registers.X.W); + } +} + +// TXA +static void Op8AM1 (void) +{ + AddCycles(ONE_CYCLE); + Registers.AL = Registers.XL; + SetZN(Registers.AL); +} + +static void Op8AM0 (void) +{ + AddCycles(ONE_CYCLE); + Registers.A.W = Registers.X.W; + SetZN(Registers.A.W); +} + +static void Op8ASlow (void) +{ + AddCycles(ONE_CYCLE); + + if (CheckMemory()) + { + Registers.AL = Registers.XL; + SetZN(Registers.AL); + } + else + { + Registers.A.W = Registers.X.W; + SetZN(Registers.A.W); + } +} + +// TXS +static void Op9A (void) +{ + AddCycles(ONE_CYCLE); + Registers.S.W = Registers.X.W; + if (CheckEmulation()) + Registers.SH = 1; +} + +// TXY +static void Op9BX1 (void) +{ + AddCycles(ONE_CYCLE); + Registers.YL = Registers.XL; + SetZN(Registers.YL); +} + +static void Op9BX0 (void) +{ + AddCycles(ONE_CYCLE); + Registers.Y.W = Registers.X.W; + SetZN(Registers.Y.W); +} + +static void Op9BSlow (void) +{ + AddCycles(ONE_CYCLE); + + if (CheckIndex()) + { + Registers.YL = Registers.XL; + SetZN(Registers.YL); + } + else + { + Registers.Y.W = Registers.X.W; + SetZN(Registers.Y.W); + } +} + +// TYA +static void Op98M1 (void) +{ + AddCycles(ONE_CYCLE); + Registers.AL = Registers.YL; + SetZN(Registers.AL); +} + +static void Op98M0 (void) +{ + AddCycles(ONE_CYCLE); + Registers.A.W = Registers.Y.W; + SetZN(Registers.A.W); +} + +static void Op98Slow (void) +{ + AddCycles(ONE_CYCLE); + + if (CheckMemory()) + { + Registers.AL = Registers.YL; + SetZN(Registers.AL); + } + else + { + Registers.A.W = Registers.Y.W; + SetZN(Registers.A.W); + } +} + +// TYX +static void OpBBX1 (void) +{ + AddCycles(ONE_CYCLE); + Registers.XL = Registers.YL; + SetZN(Registers.XL); +} + +static void OpBBX0 (void) +{ + AddCycles(ONE_CYCLE); + Registers.X.W = Registers.Y.W; + SetZN(Registers.X.W); +} + +static void OpBBSlow (void) +{ + AddCycles(ONE_CYCLE); + + if (CheckIndex()) + { + Registers.XL = Registers.YL; + SetZN(Registers.XL); + } + else + { + Registers.X.W = Registers.Y.W; + SetZN(Registers.X.W); + } +} + +/* XCE ********************************************************************* */ + +static void OpFB (void) +{ + AddCycles(ONE_CYCLE); + + uint8 A1 = ICPU._Carry; + uint8 A2 = Registers.PH; + + ICPU._Carry = A2 & 1; + Registers.PH = A1; + + if (CheckEmulation()) + { + SetFlags(MemoryFlag | IndexFlag); + Registers.SH = 1; + #ifdef DEBUGGER + missing.emulate6502 = 1; + #endif + } + + if (CheckIndex()) + { + Registers.XH = 0; + Registers.YH = 0; + } + + S9xFixCycles(); +} + +/* BRK ********************************************************************* */ + +static void Op00 (void) +{ +#ifdef DEBUGGER + if (CPU.Flags & TRACE_FLAG) + S9xTraceMessage("*** BRK"); +#endif + + AddCycles(CPU.MemSpeed); + + uint16 addr; + + if (!CheckEmulation()) + { + PushB(Registers.PB); + PushW(Registers.PCw + 1); + S9xPackStatus(); + PushB(Registers.PL); + OpenBus = Registers.PL; + ClearDecimal(); + SetIRQ(); + + addr = S9xGetWord(0xFFE6); + } + else + { + PushWE(Registers.PCw + 1); + S9xPackStatus(); + PushBE(Registers.PL); + OpenBus = Registers.PL; + ClearDecimal(); + SetIRQ(); + + addr = S9xGetWord(0xFFFE); + } + + S9xSetPCBase(addr); + OpenBus = addr >> 8; +} + +/* IRQ ********************************************************************* */ + +void S9xOpcode_IRQ (void) +{ +#ifdef DEBUGGER + if (CPU.Flags & TRACE_FLAG) + #ifdef SA1_OPCODES + S9xTraceMessage("*** SA1 IRQ"); + #else + S9xTraceMessage("*** IRQ"); + #endif +#endif + + // IRQ and NMI do an opcode fetch as their first "IO" cycle. + AddCycles(CPU.MemSpeed + ONE_CYCLE); + + if (!CheckEmulation()) + { + PushB(Registers.PB); + PushW(Registers.PCw); + S9xPackStatus(); + PushB(Registers.PL); + OpenBus = Registers.PL; + ClearDecimal(); + SetIRQ(); + + #ifdef SA1_OPCODES + OpenBus = Memory.FillRAM[0x2208]; + AddCycles(2 * SLOW_ONE_CYCLE); + S9xSA1SetPCBase(Memory.FillRAM[0x2207] | (Memory.FillRAM[0x2208] << 8)); + #else + if (Settings.SA1 && (Memory.FillRAM[0x2209] & 0x40)) + { + OpenBus = Memory.FillRAM[0x220f]; + AddCycles(2 * SLOW_ONE_CYCLE); + S9xSetPCBase(Memory.FillRAM[0x220e] | (Memory.FillRAM[0x220f] << 8)); + } + else + { + uint16 addr = S9xGetWord(0xFFEE); + OpenBus = addr >> 8; + S9xSetPCBase(addr); + } + #endif + } + else + { + PushWE(Registers.PCw); + S9xPackStatus(); + PushBE(Registers.PL); + OpenBus = Registers.PL; + ClearDecimal(); + SetIRQ(); + + #ifdef SA1_OPCODES + OpenBus = Memory.FillRAM[0x2208]; + AddCycles(2 * SLOW_ONE_CYCLE); + S9xSA1SetPCBase(Memory.FillRAM[0x2207] | (Memory.FillRAM[0x2208] << 8)); + #else + if (Settings.SA1 && (Memory.FillRAM[0x2209] & 0x40)) + { + OpenBus = Memory.FillRAM[0x220f]; + AddCycles(2 * SLOW_ONE_CYCLE); + S9xSetPCBase(Memory.FillRAM[0x220e] | (Memory.FillRAM[0x220f] << 8)); + } + else + { + uint16 addr = S9xGetWord(0xFFFE); + OpenBus = addr >> 8; + S9xSetPCBase(addr); + } + #endif + } +} + +/* NMI ********************************************************************* */ + +void S9xOpcode_NMI (void) +{ +#ifdef DEBUGGER + if (CPU.Flags & TRACE_FLAG) + #ifdef SA1_OPCODES + S9xTraceMessage("*** SA1 NMI"); + #else + S9xTraceMessage("*** NMI"); + #endif +#endif + + // IRQ and NMI do an opcode fetch as their first "IO" cycle. + AddCycles(CPU.MemSpeed + ONE_CYCLE); + + if (!CheckEmulation()) + { + PushB(Registers.PB); + PushW(Registers.PCw); + S9xPackStatus(); + PushB(Registers.PL); + OpenBus = Registers.PL; + ClearDecimal(); + SetIRQ(); + + #ifdef SA1_OPCODES + OpenBus = Memory.FillRAM[0x2206]; + AddCycles(2 * SLOW_ONE_CYCLE); + S9xSA1SetPCBase(Memory.FillRAM[0x2205] | (Memory.FillRAM[0x2206] << 8)); + #else + if (Settings.SA1 && (Memory.FillRAM[0x2209] & 0x10)) + { + OpenBus = Memory.FillRAM[0x220d]; + AddCycles(2 * SLOW_ONE_CYCLE); + S9xSetPCBase(Memory.FillRAM[0x220c] | (Memory.FillRAM[0x220d] << 8)); + } + else + { + uint16 addr = S9xGetWord(0xFFEA); + OpenBus = addr >> 8; + S9xSetPCBase(addr); + } + #endif + } + else + { + PushWE(Registers.PCw); + S9xPackStatus(); + PushBE(Registers.PL); + OpenBus = Registers.PL; + ClearDecimal(); + SetIRQ(); + + #ifdef SA1_OPCODES + OpenBus = Memory.FillRAM[0x2206]; + AddCycles(2 * SLOW_ONE_CYCLE); + S9xSA1SetPCBase(Memory.FillRAM[0x2205] | (Memory.FillRAM[0x2206] << 8)); + #else + if (Settings.SA1 && (Memory.FillRAM[0x2209] & 0x20)) + { + OpenBus = Memory.FillRAM[0x220d]; + AddCycles(2 * SLOW_ONE_CYCLE); + S9xSetPCBase(Memory.FillRAM[0x220c] | (Memory.FillRAM[0x220d] << 8)); + } + else + { + uint16 addr = S9xGetWord(0xFFFA); + OpenBus = addr >> 8; + S9xSetPCBase(addr); + } + #endif + } +} + +/* COP ********************************************************************* */ + +static void Op02 (void) +{ +#ifdef DEBUGGER + if (CPU.Flags & TRACE_FLAG) + S9xTraceMessage("*** COP"); +#endif + + AddCycles(CPU.MemSpeed); + + uint16 addr; + + if (!CheckEmulation()) + { + PushB(Registers.PB); + PushW(Registers.PCw + 1); + S9xPackStatus(); + PushB(Registers.PL); + OpenBus = Registers.PL; + ClearDecimal(); + SetIRQ(); + + addr = S9xGetWord(0xFFE4); + } + else + { + PushWE(Registers.PCw + 1); + S9xPackStatus(); + PushBE(Registers.PL); + OpenBus = Registers.PL; + ClearDecimal(); + SetIRQ(); + + addr = S9xGetWord(0xFFF4); + } + + S9xSetPCBase(addr); + OpenBus = addr >> 8; +} + +/* JML ********************************************************************* */ + +static void OpDC (void) +{ + S9xSetPCBase(AbsoluteIndirectLong(JUMP)); +} + +static void OpDCSlow (void) +{ + S9xSetPCBase(AbsoluteIndirectLongSlow(JUMP)); +} + +static void Op5C (void) +{ + S9xSetPCBase(AbsoluteLong(JUMP)); +} + +static void Op5CSlow (void) +{ + S9xSetPCBase(AbsoluteLongSlow(JUMP)); +} + +/* JMP ********************************************************************* */ + +static void Op4C (void) +{ + S9xSetPCBase(ICPU.ShiftedPB + ((uint16) Absolute(JUMP))); +#if defined(CPU_SHUTDOWN) && defined(SA1_OPCODES) + CPUShutdown(); +#endif +} + +static void Op4CSlow (void) +{ + S9xSetPCBase(ICPU.ShiftedPB + ((uint16) AbsoluteSlow(JUMP))); +#if defined(CPU_SHUTDOWN) && defined(SA1_OPCODES) + CPUShutdown(); +#endif +} + +static void Op6C (void) +{ + S9xSetPCBase(ICPU.ShiftedPB + ((uint16) AbsoluteIndirect(JUMP))); +} + +static void Op6CSlow (void) +{ + S9xSetPCBase(ICPU.ShiftedPB + ((uint16) AbsoluteIndirectSlow(JUMP))); +} + +static void Op7C (void) +{ + S9xSetPCBase(ICPU.ShiftedPB + ((uint16) AbsoluteIndexedIndirect(JUMP))); +} + +static void Op7CSlow (void) +{ + S9xSetPCBase(ICPU.ShiftedPB + ((uint16) AbsoluteIndexedIndirectSlow(JUMP))); +} + +/* JSL/RTL ***************************************************************** */ + +static void Op22E1 (void) +{ + // Note: JSL is a new instruction, + // and so doesn't respect the emu-mode stack bounds. + uint32 addr = AbsoluteLong(JSR); + PushB(Registers.PB); + PushW(Registers.PCw - 1); + Registers.SH = 1; + S9xSetPCBase(addr); +} + +static void Op22E0 (void) +{ + uint32 addr = AbsoluteLong(JSR); + PushB(Registers.PB); + PushW(Registers.PCw - 1); + S9xSetPCBase(addr); +} + +static void Op22Slow (void) +{ + uint32 addr = AbsoluteLongSlow(JSR); + PushB(Registers.PB); + PushW(Registers.PCw - 1); + if (CheckEmulation()) + Registers.SH = 1; + S9xSetPCBase(addr); +} + +static void Op6BE1 (void) +{ + // Note: RTL is a new instruction, + // and so doesn't respect the emu-mode stack bounds. + AddCycles(TWO_CYCLES); + PullW(Registers.PCw); + PullB(Registers.PB); + Registers.SH = 1; + Registers.PCw++; + S9xSetPCBase(Registers.PBPC); +} + +static void Op6BE0 (void) +{ + AddCycles(TWO_CYCLES); + PullW(Registers.PCw); + PullB(Registers.PB); + Registers.PCw++; + S9xSetPCBase(Registers.PBPC); +} + +static void Op6BSlow (void) +{ + AddCycles(TWO_CYCLES); + PullW(Registers.PCw); + PullB(Registers.PB); + if (CheckEmulation()) + Registers.SH = 1; + Registers.PCw++; + S9xSetPCBase(Registers.PBPC); +} + +/* JSR/RTS ***************************************************************** */ + +static void Op20E1 (void) +{ + uint16 addr = Absolute(JSR); + AddCycles(ONE_CYCLE); + PushWE(Registers.PCw - 1); + S9xSetPCBase(ICPU.ShiftedPB + addr); +} + +static void Op20E0 (void) +{ + uint16 addr = Absolute(JSR); + AddCycles(ONE_CYCLE); + PushW(Registers.PCw - 1); + S9xSetPCBase(ICPU.ShiftedPB + addr); +} + +static void Op20Slow (void) +{ + uint16 addr = AbsoluteSlow(JSR); + + AddCycles(ONE_CYCLE); + + if (CheckEmulation()) + { + PushWE(Registers.PCw - 1); + } + else + { + PushW(Registers.PCw - 1); + } + + S9xSetPCBase(ICPU.ShiftedPB + addr); +} + +static void OpFCE1 (void) +{ + // Note: JSR (a,X) is a new instruction, + // and so doesn't respect the emu-mode stack bounds. + uint16 addr = AbsoluteIndexedIndirect(JSR); + PushW(Registers.PCw - 1); + Registers.SH = 1; + S9xSetPCBase(ICPU.ShiftedPB + addr); +} + +static void OpFCE0 (void) +{ + uint16 addr = AbsoluteIndexedIndirect(JSR); + PushW(Registers.PCw - 1); + S9xSetPCBase(ICPU.ShiftedPB + addr); +} + +static void OpFCSlow (void) +{ + uint16 addr = AbsoluteIndexedIndirectSlow(JSR); + PushW(Registers.PCw - 1); + if (CheckEmulation()) + Registers.SH = 1; + S9xSetPCBase(ICPU.ShiftedPB + addr); +} + +static void Op60E1 (void) +{ + AddCycles(TWO_CYCLES); + PullWE(Registers.PCw); + AddCycles(ONE_CYCLE); + Registers.PCw++; + S9xSetPCBase(Registers.PBPC); +} + +static void Op60E0 (void) +{ + AddCycles(TWO_CYCLES); + PullW(Registers.PCw); + AddCycles(ONE_CYCLE); + Registers.PCw++; + S9xSetPCBase(Registers.PBPC); +} + +static void Op60Slow (void) +{ + AddCycles(TWO_CYCLES); + + if (CheckEmulation()) + { + PullWE(Registers.PCw); + } + else + { + PullW(Registers.PCw); + } + + AddCycles(ONE_CYCLE); + Registers.PCw++; + S9xSetPCBase(Registers.PBPC); +} + +/* MVN/MVP ***************************************************************** */ + +static void Op54X1 (void) +{ + uint32 SrcBank; + + Registers.DB = Immediate8(NONE); + ICPU.ShiftedDB = Registers.DB << 16; + OpenBus = SrcBank = Immediate8(NONE); + + S9xSetByte(OpenBus = S9xGetByte((SrcBank << 16) + Registers.X.W), ICPU.ShiftedDB + Registers.Y.W); + + Registers.XL++; + Registers.YL++; + Registers.A.W--; + if (Registers.A.W != 0xffff) + Registers.PCw -= 3; + + AddCycles(TWO_CYCLES); +} + +static void Op54X0 (void) +{ + uint32 SrcBank; + + Registers.DB = Immediate8(NONE); + ICPU.ShiftedDB = Registers.DB << 16; + OpenBus = SrcBank = Immediate8(NONE); + + S9xSetByte(OpenBus = S9xGetByte((SrcBank << 16) + Registers.X.W), ICPU.ShiftedDB + Registers.Y.W); + + Registers.X.W++; + Registers.Y.W++; + Registers.A.W--; + if (Registers.A.W != 0xffff) + Registers.PCw -= 3; + + AddCycles(TWO_CYCLES); +} + +static void Op54Slow (void) +{ + uint32 SrcBank; + + OpenBus = Registers.DB = Immediate8Slow(NONE); + ICPU.ShiftedDB = Registers.DB << 16; + OpenBus = SrcBank = Immediate8Slow(NONE); + + S9xSetByte(OpenBus = S9xGetByte((SrcBank << 16) + Registers.X.W), ICPU.ShiftedDB + Registers.Y.W); + + if (CheckIndex()) + { + Registers.XL++; + Registers.YL++; + } + else + { + Registers.X.W++; + Registers.Y.W++; + } + + Registers.A.W--; + if (Registers.A.W != 0xffff) + Registers.PCw -= 3; + + AddCycles(TWO_CYCLES); +} + +static void Op44X1 (void) +{ + uint32 SrcBank; + + Registers.DB = Immediate8(NONE); + ICPU.ShiftedDB = Registers.DB << 16; + OpenBus = SrcBank = Immediate8(NONE); + + S9xSetByte(OpenBus = S9xGetByte((SrcBank << 16) + Registers.X.W), ICPU.ShiftedDB + Registers.Y.W); + + Registers.XL--; + Registers.YL--; + Registers.A.W--; + if (Registers.A.W != 0xffff) + Registers.PCw -= 3; + + AddCycles(TWO_CYCLES); +} + +static void Op44X0 (void) +{ + uint32 SrcBank; + + Registers.DB = Immediate8(NONE); + ICPU.ShiftedDB = Registers.DB << 16; + OpenBus = SrcBank = Immediate8(NONE); + + S9xSetByte(OpenBus = S9xGetByte((SrcBank << 16) + Registers.X.W), ICPU.ShiftedDB + Registers.Y.W); + + Registers.X.W--; + Registers.Y.W--; + Registers.A.W--; + if (Registers.A.W != 0xffff) + Registers.PCw -= 3; + + AddCycles(TWO_CYCLES); +} + +static void Op44Slow (void) +{ + uint32 SrcBank; + + OpenBus = Registers.DB = Immediate8Slow(NONE); + ICPU.ShiftedDB = Registers.DB << 16; + OpenBus = SrcBank = Immediate8Slow(NONE); + + S9xSetByte(OpenBus = S9xGetByte((SrcBank << 16) + Registers.X.W), ICPU.ShiftedDB + Registers.Y.W); + + if (CheckIndex()) + { + Registers.XL--; + Registers.YL--; + } + else + { + Registers.X.W--; + Registers.Y.W--; + } + + Registers.A.W--; + if (Registers.A.W != 0xffff) + Registers.PCw -= 3; + + AddCycles(TWO_CYCLES); +} + +/* REP/SEP ***************************************************************** */ + +static void OpC2 (void) +{ + uint8 Work8 = ~Immediate8(READ); + Registers.PL &= Work8; + ICPU._Carry &= Work8; + ICPU._Overflow &= (Work8 >> 6); + ICPU._Negative &= Work8; + ICPU._Zero |= ~Work8 & Zero; + + AddCycles(ONE_CYCLE); + + if (CheckEmulation()) + { + SetFlags(MemoryFlag | IndexFlag); + #ifdef DEBUGGER + missing.emulate6502 = 1; + #endif + } + + if (CheckIndex()) + { + Registers.XH = 0; + Registers.YH = 0; + } + + S9xFixCycles(); + //CHECK_FOR_IRQ(); +} + +static void OpC2Slow (void) +{ + uint8 Work8 = ~Immediate8Slow(READ); + Registers.PL &= Work8; + ICPU._Carry &= Work8; + ICPU._Overflow &= (Work8 >> 6); + ICPU._Negative &= Work8; + ICPU._Zero |= ~Work8 & Zero; + + AddCycles(ONE_CYCLE); + + if (CheckEmulation()) + { + SetFlags(MemoryFlag | IndexFlag); + #ifdef DEBUGGER + missing.emulate6502 = 1; + #endif + } + + if (CheckIndex()) + { + Registers.XH = 0; + Registers.YH = 0; + } + + S9xFixCycles(); + //CHECK_FOR_IRQ(); +} + +static void OpE2 (void) +{ + uint8 Work8 = Immediate8(READ); + Registers.PL |= Work8; + ICPU._Carry |= Work8 & 1; + ICPU._Overflow |= (Work8 >> 6) & 1; + ICPU._Negative |= Work8; + if (Work8 & Zero) + ICPU._Zero = 0; + + AddCycles(ONE_CYCLE); + + if (CheckEmulation()) + { + SetFlags(MemoryFlag | IndexFlag); + #ifdef DEBUGGER + missing.emulate6502 = 1; + #endif + } + + if (CheckIndex()) + { + Registers.XH = 0; + Registers.YH = 0; + } + + S9xFixCycles(); +} + +static void OpE2Slow (void) +{ + uint8 Work8 = Immediate8Slow(READ); + Registers.PL |= Work8; + ICPU._Carry |= Work8 & 1; + ICPU._Overflow |= (Work8 >> 6) & 1; + ICPU._Negative |= Work8; + if (Work8 & Zero) + ICPU._Zero = 0; + + AddCycles(ONE_CYCLE); + + if (CheckEmulation()) + { + SetFlags(MemoryFlag | IndexFlag); + #ifdef DEBUGGER + missing.emulate6502 = 1; + #endif + } + + if (CheckIndex()) + { + Registers.XH = 0; + Registers.YH = 0; + } + + S9xFixCycles(); +} + +/* XBA ********************************************************************* */ + +static void OpEB (void) +{ + uint8 Work8 = Registers.AL; + Registers.AL = Registers.AH; + Registers.AH = Work8; + SetZN(Registers.AL); + AddCycles(TWO_CYCLES); +} + +/* RTI ********************************************************************* */ + +static void Op40Slow (void) +{ + AddCycles(TWO_CYCLES); + + if (!CheckEmulation()) + { + PullB(Registers.PL); + S9xUnpackStatus(); + PullW(Registers.PCw); + PullB(Registers.PB); + OpenBus = Registers.PB; + ICPU.ShiftedPB = Registers.PB << 16; + } + else + { + PullBE(Registers.PL); + S9xUnpackStatus(); + PullWE(Registers.PCw); + OpenBus = Registers.PCh; + SetFlags(MemoryFlag | IndexFlag); + #ifdef DEBUGGER + missing.emulate6502 = 1; + #endif + } + + S9xSetPCBase(Registers.PBPC); + + if (CheckIndex()) + { + Registers.XH = 0; + Registers.YH = 0; + } + + S9xFixCycles(); + //CHECK_FOR_IRQ(); +} + +/* STP/WAI ***************************************************************** */ + +// WAI +static void OpCB (void) +{ + // Ok, let's just C-ify the ASM versions separately. +#ifdef SA1_OPCODES + SA1.WaitingForInterrupt = TRUE; + Registers.PCw--; +#if 0 + // XXX: FIXME + if (Settings.Shutdown) + { + SA1.Cycles = SA1.NextEvent; + SA1.Executing = FALSE; + //S9xAPUExecute(); // FIXME + SA1.Executing = TRUE; + } +#endif +#else // SA1_OPCODES +#if 0 + if (CPU.IRQActive) + AddCycles(TWO_CYCLES); + else +#endif + { + CPU.WaitingForInterrupt = TRUE; + Registers.PCw--; + #ifdef CPU_SHUTDOWN + if (Settings.Shutdown) + { + CPU.Cycles = CPU.NextEvent; + ICPU.CPUExecuting = FALSE; + S9xAPUExecute(); + ICPU.CPUExecuting = TRUE; + } + else + AddCycles(TWO_CYCLES); + #else + AddCycles(TWO_CYCLES); +#endif + } +#endif // SA1_OPCODES +} + +// STP +static void OpDB (void) +{ + Registers.PCw--; + CPU.Flags |= DEBUG_MODE_FLAG | HALTED_FLAG; +} + +/* WDM (Reserved S9xOpcode) ************************************************ */ + +#ifdef DEBUGGER +extern FILE *trace, *trace2; +#endif + +static void Op42 (void) +{ +#ifdef DEBUGGER + uint8 byte = (uint8) S9xGetWord(Registers.PBPC); +#else + S9xGetWord(Registers.PBPC); +#endif + Registers.PCw++; + +#ifdef DEBUGGER + // Hey, let's use this to trigger debug modes. + switch (byte) + { + case 0xdb: // "STP" = Enter debug mode + CPU.Flags |= DEBUG_MODE_FLAG; + break; + + #ifndef SA1_OPCODES + case 0xe2: // "SEP" = Trace on + if (!(CPU.Flags & TRACE_FLAG)) + { + char buf[25]; + CPU.Flags |= TRACE_FLAG; + snprintf(buf, 25, "WDM trace on at $%02X:%04X", Registers.PB, Registers.PCw); + S9xMessage(S9X_DEBUG, S9X_DEBUG_OUTPUT, buf); + if (trace != NULL) + fclose(trace); + trace = fopen("WDMtrace.log", "ab"); + } + + break; + + case 0xc2: // "REP" = Trace off + if (CPU.Flags & TRACE_FLAG) + { + char buf[26]; + CPU.Flags &= ~TRACE_FLAG; + snprintf(buf, 26, "WDM trace off at $%02X:%04X", Registers.PB, Registers.PCw); + S9xMessage(S9X_DEBUG, S9X_DEBUG_OUTPUT, buf); + if (trace != NULL) + fclose(trace); + trace = NULL; + } + + break; + #endif + + case 0x42: // "WDM" = Snapshot + char filename[PATH_MAX + 1], drive[_MAX_DRIVE + 1], dir[_MAX_DIR + 1], def[PATH_MAX + 1], ext[_MAX_EXT + 1]; + + _splitpath(Memory.ROMFilename, drive, dir, def, ext); + snprintf(filename, PATH_MAX, "%s%s%s-%06X.wdm", S9xGetDirectory(SNAPSHOT_DIR), SLASH_STR, def, Registers.PBPC & 0xffffff); + sprintf(def, "WDM Snapshot at $%02X:%04X: %s", Registers.PB, Registers.PCw, filename); + S9xMessage(S9X_DEBUG, S9X_DEBUG_OUTPUT, def); + S9xFreezeGame(filename); + + break; + + default: + break; + } +#endif +} + +/* CPU-S9xOpcodes Definitions ************************************************/ + +struct SOpcodes S9xOpcodesM1X1[256] = +{ + { Op00 }, { Op01E0M1 }, { Op02 }, { Op03M1 }, { Op04M1 }, + { Op05M1 }, { Op06M1 }, { Op07M1 }, { Op08E0 }, { Op09M1 }, + { Op0AM1 }, { Op0BE0 }, { Op0CM1 }, { Op0DM1 }, { Op0EM1 }, + { Op0FM1 }, { Op10E0 }, { Op11E0M1X1 }, { Op12E0M1 }, { Op13M1 }, + { Op14M1 }, { Op15E0M1 }, { Op16E0M1 }, { Op17M1 }, { Op18 }, + { Op19M1X1 }, { Op1AM1 }, { Op1B }, { Op1CM1 }, { Op1DM1X1 }, + { Op1EM1X1 }, { Op1FM1 }, { Op20E0 }, { Op21E0M1 }, { Op22E0 }, + { Op23M1 }, { Op24M1 }, { Op25M1 }, { Op26M1 }, { Op27M1 }, + { Op28E0 }, { Op29M1 }, { Op2AM1 }, { Op2BE0 }, { Op2CM1 }, + { Op2DM1 }, { Op2EM1 }, { Op2FM1 }, { Op30E0 }, { Op31E0M1X1 }, + { Op32E0M1 }, { Op33M1 }, { Op34E0M1 }, { Op35E0M1 }, { Op36E0M1 }, + { Op37M1 }, { Op38 }, { Op39M1X1 }, { Op3AM1 }, { Op3B }, + { Op3CM1X1 }, { Op3DM1X1 }, { Op3EM1X1 }, { Op3FM1 }, { Op40Slow }, + { Op41E0M1 }, { Op42 }, { Op43M1 }, { Op44X1 }, { Op45M1 }, + { Op46M1 }, { Op47M1 }, { Op48E0M1 }, { Op49M1 }, { Op4AM1 }, + { Op4BE0 }, { Op4C }, { Op4DM1 }, { Op4EM1 }, { Op4FM1 }, + { Op50E0 }, { Op51E0M1X1 }, { Op52E0M1 }, { Op53M1 }, { Op54X1 }, + { Op55E0M1 }, { Op56E0M1 }, { Op57M1 }, { Op58 }, { Op59M1X1 }, + { Op5AE0X1 }, { Op5B }, { Op5C }, { Op5DM1X1 }, { Op5EM1X1 }, + { Op5FM1 }, { Op60E0 }, { Op61E0M1 }, { Op62E0 }, { Op63M1 }, + { Op64M1 }, { Op65M1 }, { Op66M1 }, { Op67M1 }, { Op68E0M1 }, + { Op69M1 }, { Op6AM1 }, { Op6BE0 }, { Op6C }, { Op6DM1 }, + { Op6EM1 }, { Op6FM1 }, { Op70E0 }, { Op71E0M1X1 }, { Op72E0M1 }, + { Op73M1 }, { Op74E0M1 }, { Op75E0M1 }, { Op76E0M1 }, { Op77M1 }, + { Op78 }, { Op79M1X1 }, { Op7AE0X1 }, { Op7B }, { Op7C }, + { Op7DM1X1 }, { Op7EM1X1 }, { Op7FM1 }, { Op80E0 }, { Op81E0M1 }, + { Op82 }, { Op83M1 }, { Op84X1 }, { Op85M1 }, { Op86X1 }, + { Op87M1 }, { Op88X1 }, { Op89M1 }, { Op8AM1 }, { Op8BE0 }, + { Op8CX1 }, { Op8DM1 }, { Op8EX1 }, { Op8FM1 }, { Op90E0 }, + { Op91E0M1X1 }, { Op92E0M1 }, { Op93M1 }, { Op94E0X1 }, { Op95E0M1 }, + { Op96E0X1 }, { Op97M1 }, { Op98M1 }, { Op99M1X1 }, { Op9A }, + { Op9BX1 }, { Op9CM1 }, { Op9DM1X1 }, { Op9EM1X1 }, { Op9FM1 }, + { OpA0X1 }, { OpA1E0M1 }, { OpA2X1 }, { OpA3M1 }, { OpA4X1 }, + { OpA5M1 }, { OpA6X1 }, { OpA7M1 }, { OpA8X1 }, { OpA9M1 }, + { OpAAX1 }, { OpABE0 }, { OpACX1 }, { OpADM1 }, { OpAEX1 }, + { OpAFM1 }, { OpB0E0 }, { OpB1E0M1X1 }, { OpB2E0M1 }, { OpB3M1 }, + { OpB4E0X1 }, { OpB5E0M1 }, { OpB6E0X1 }, { OpB7M1 }, { OpB8 }, + { OpB9M1X1 }, { OpBAX1 }, { OpBBX1 }, { OpBCX1 }, { OpBDM1X1 }, + { OpBEX1 }, { OpBFM1 }, { OpC0X1 }, { OpC1E0M1 }, { OpC2 }, + { OpC3M1 }, { OpC4X1 }, { OpC5M1 }, { OpC6M1 }, { OpC7M1 }, + { OpC8X1 }, { OpC9M1 }, { OpCAX1 }, { OpCB }, { OpCCX1 }, + { OpCDM1 }, { OpCEM1 }, { OpCFM1 }, { OpD0E0 }, { OpD1E0M1X1 }, + { OpD2E0M1 }, { OpD3M1 }, { OpD4E0 }, { OpD5E0M1 }, { OpD6E0M1 }, + { OpD7M1 }, { OpD8 }, { OpD9M1X1 }, { OpDAE0X1 }, { OpDB }, + { OpDC }, { OpDDM1X1 }, { OpDEM1X1 }, { OpDFM1 }, { OpE0X1 }, + { OpE1E0M1 }, { OpE2 }, { OpE3M1 }, { OpE4X1 }, { OpE5M1 }, + { OpE6M1 }, { OpE7M1 }, { OpE8X1 }, { OpE9M1 }, { OpEA }, + { OpEB }, { OpECX1 }, { OpEDM1 }, { OpEEM1 }, { OpEFM1 }, + { OpF0E0 }, { OpF1E0M1X1 }, { OpF2E0M1 }, { OpF3M1 }, { OpF4E0 }, + { OpF5E0M1 }, { OpF6E0M1 }, { OpF7M1 }, { OpF8 }, { OpF9M1X1 }, + { OpFAE0X1 }, { OpFB }, { OpFCE0 }, { OpFDM1X1 }, { OpFEM1X1 }, + { OpFFM1 } +}; + +struct SOpcodes S9xOpcodesE1[256] = +{ + { Op00 }, { Op01E1 }, { Op02 }, { Op03M1 }, { Op04M1 }, + { Op05M1 }, { Op06M1 }, { Op07M1 }, { Op08E1 }, { Op09M1 }, + { Op0AM1 }, { Op0BE1 }, { Op0CM1 }, { Op0DM1 }, { Op0EM1 }, + { Op0FM1 }, { Op10E1 }, { Op11E1 }, { Op12E1 }, { Op13M1 }, + { Op14M1 }, { Op15E1 }, { Op16E1 }, { Op17M1 }, { Op18 }, + { Op19M1X1 }, { Op1AM1 }, { Op1B }, { Op1CM1 }, { Op1DM1X1 }, + { Op1EM1X1 }, { Op1FM1 }, { Op20E1 }, { Op21E1 }, { Op22E1 }, + { Op23M1 }, { Op24M1 }, { Op25M1 }, { Op26M1 }, { Op27M1 }, + { Op28E1 }, { Op29M1 }, { Op2AM1 }, { Op2BE1 }, { Op2CM1 }, + { Op2DM1 }, { Op2EM1 }, { Op2FM1 }, { Op30E1 }, { Op31E1 }, + { Op32E1 }, { Op33M1 }, { Op34E1 }, { Op35E1 }, { Op36E1 }, + { Op37M1 }, { Op38 }, { Op39M1X1 }, { Op3AM1 }, { Op3B }, + { Op3CM1X1 }, { Op3DM1X1 }, { Op3EM1X1 }, { Op3FM1 }, { Op40Slow }, + { Op41E1 }, { Op42 }, { Op43M1 }, { Op44X1 }, { Op45M1 }, + { Op46M1 }, { Op47M1 }, { Op48E1 }, { Op49M1 }, { Op4AM1 }, + { Op4BE1 }, { Op4C }, { Op4DM1 }, { Op4EM1 }, { Op4FM1 }, + { Op50E1 }, { Op51E1 }, { Op52E1 }, { Op53M1 }, { Op54X1 }, + { Op55E1 }, { Op56E1 }, { Op57M1 }, { Op58 }, { Op59M1X1 }, + { Op5AE1 }, { Op5B }, { Op5C }, { Op5DM1X1 }, { Op5EM1X1 }, + { Op5FM1 }, { Op60E1 }, { Op61E1 }, { Op62E1 }, { Op63M1 }, + { Op64M1 }, { Op65M1 }, { Op66M1 }, { Op67M1 }, { Op68E1 }, + { Op69M1 }, { Op6AM1 }, { Op6BE1 }, { Op6C }, { Op6DM1 }, + { Op6EM1 }, { Op6FM1 }, { Op70E1 }, { Op71E1 }, { Op72E1 }, + { Op73M1 }, { Op74E1 }, { Op75E1 }, { Op76E1 }, { Op77M1 }, + { Op78 }, { Op79M1X1 }, { Op7AE1 }, { Op7B }, { Op7C }, + { Op7DM1X1 }, { Op7EM1X1 }, { Op7FM1 }, { Op80E1 }, { Op81E1 }, + { Op82 }, { Op83M1 }, { Op84X1 }, { Op85M1 }, { Op86X1 }, + { Op87M1 }, { Op88X1 }, { Op89M1 }, { Op8AM1 }, { Op8BE1 }, + { Op8CX1 }, { Op8DM1 }, { Op8EX1 }, { Op8FM1 }, { Op90E1 }, + { Op91E1 }, { Op92E1 }, { Op93M1 }, { Op94E1 }, { Op95E1 }, + { Op96E1 }, { Op97M1 }, { Op98M1 }, { Op99M1X1 }, { Op9A }, + { Op9BX1 }, { Op9CM1 }, { Op9DM1X1 }, { Op9EM1X1 }, { Op9FM1 }, + { OpA0X1 }, { OpA1E1 }, { OpA2X1 }, { OpA3M1 }, { OpA4X1 }, + { OpA5M1 }, { OpA6X1 }, { OpA7M1 }, { OpA8X1 }, { OpA9M1 }, + { OpAAX1 }, { OpABE1 }, { OpACX1 }, { OpADM1 }, { OpAEX1 }, + { OpAFM1 }, { OpB0E1 }, { OpB1E1 }, { OpB2E1 }, { OpB3M1 }, + { OpB4E1 }, { OpB5E1 }, { OpB6E1 }, { OpB7M1 }, { OpB8 }, + { OpB9M1X1 }, { OpBAX1 }, { OpBBX1 }, { OpBCX1 }, { OpBDM1X1 }, + { OpBEX1 }, { OpBFM1 }, { OpC0X1 }, { OpC1E1 }, { OpC2 }, + { OpC3M1 }, { OpC4X1 }, { OpC5M1 }, { OpC6M1 }, { OpC7M1 }, + { OpC8X1 }, { OpC9M1 }, { OpCAX1 }, { OpCB }, { OpCCX1 }, + { OpCDM1 }, { OpCEM1 }, { OpCFM1 }, { OpD0E1 }, { OpD1E1 }, + { OpD2E1 }, { OpD3M1 }, { OpD4E1 }, { OpD5E1 }, { OpD6E1 }, + { OpD7M1 }, { OpD8 }, { OpD9M1X1 }, { OpDAE1 }, { OpDB }, + { OpDC }, { OpDDM1X1 }, { OpDEM1X1 }, { OpDFM1 }, { OpE0X1 }, + { OpE1E1 }, { OpE2 }, { OpE3M1 }, { OpE4X1 }, { OpE5M1 }, + { OpE6M1 }, { OpE7M1 }, { OpE8X1 }, { OpE9M1 }, { OpEA }, + { OpEB }, { OpECX1 }, { OpEDM1 }, { OpEEM1 }, { OpEFM1 }, + { OpF0E1 }, { OpF1E1 }, { OpF2E1 }, { OpF3M1 }, { OpF4E1 }, + { OpF5E1 }, { OpF6E1 }, { OpF7M1 }, { OpF8 }, { OpF9M1X1 }, + { OpFAE1 }, { OpFB }, { OpFCE1 }, { OpFDM1X1 }, { OpFEM1X1 }, + { OpFFM1 } +}; + +struct SOpcodes S9xOpcodesM1X0[256] = +{ + { Op00 }, { Op01E0M1 }, { Op02 }, { Op03M1 }, { Op04M1 }, + { Op05M1 }, { Op06M1 }, { Op07M1 }, { Op08E0 }, { Op09M1 }, + { Op0AM1 }, { Op0BE0 }, { Op0CM1 }, { Op0DM1 }, { Op0EM1 }, + { Op0FM1 }, { Op10E0 }, { Op11E0M1X0 }, { Op12E0M1 }, { Op13M1 }, + { Op14M1 }, { Op15E0M1 }, { Op16E0M1 }, { Op17M1 }, { Op18 }, + { Op19M1X0 }, { Op1AM1 }, { Op1B }, { Op1CM1 }, { Op1DM1X0 }, + { Op1EM1X0 }, { Op1FM1 }, { Op20E0 }, { Op21E0M1 }, { Op22E0 }, + { Op23M1 }, { Op24M1 }, { Op25M1 }, { Op26M1 }, { Op27M1 }, + { Op28E0 }, { Op29M1 }, { Op2AM1 }, { Op2BE0 }, { Op2CM1 }, + { Op2DM1 }, { Op2EM1 }, { Op2FM1 }, { Op30E0 }, { Op31E0M1X0 }, + { Op32E0M1 }, { Op33M1 }, { Op34E0M1 }, { Op35E0M1 }, { Op36E0M1 }, + { Op37M1 }, { Op38 }, { Op39M1X0 }, { Op3AM1 }, { Op3B }, + { Op3CM1X0 }, { Op3DM1X0 }, { Op3EM1X0 }, { Op3FM1 }, { Op40Slow }, + { Op41E0M1 }, { Op42 }, { Op43M1 }, { Op44X0 }, { Op45M1 }, + { Op46M1 }, { Op47M1 }, { Op48E0M1 }, { Op49M1 }, { Op4AM1 }, + { Op4BE0 }, { Op4C }, { Op4DM1 }, { Op4EM1 }, { Op4FM1 }, + { Op50E0 }, { Op51E0M1X0 }, { Op52E0M1 }, { Op53M1 }, { Op54X0 }, + { Op55E0M1 }, { Op56E0M1 }, { Op57M1 }, { Op58 }, { Op59M1X0 }, + { Op5AE0X0 }, { Op5B }, { Op5C }, { Op5DM1X0 }, { Op5EM1X0 }, + { Op5FM1 }, { Op60E0 }, { Op61E0M1 }, { Op62E0 }, { Op63M1 }, + { Op64M1 }, { Op65M1 }, { Op66M1 }, { Op67M1 }, { Op68E0M1 }, + { Op69M1 }, { Op6AM1 }, { Op6BE0 }, { Op6C }, { Op6DM1 }, + { Op6EM1 }, { Op6FM1 }, { Op70E0 }, { Op71E0M1X0 }, { Op72E0M1 }, + { Op73M1 }, { Op74E0M1 }, { Op75E0M1 }, { Op76E0M1 }, { Op77M1 }, + { Op78 }, { Op79M1X0 }, { Op7AE0X0 }, { Op7B }, { Op7C }, + { Op7DM1X0 }, { Op7EM1X0 }, { Op7FM1 }, { Op80E0 }, { Op81E0M1 }, + { Op82 }, { Op83M1 }, { Op84X0 }, { Op85M1 }, { Op86X0 }, + { Op87M1 }, { Op88X0 }, { Op89M1 }, { Op8AM1 }, { Op8BE0 }, + { Op8CX0 }, { Op8DM1 }, { Op8EX0 }, { Op8FM1 }, { Op90E0 }, + { Op91E0M1X0 }, { Op92E0M1 }, { Op93M1 }, { Op94E0X0 }, { Op95E0M1 }, + { Op96E0X0 }, { Op97M1 }, { Op98M1 }, { Op99M1X0 }, { Op9A }, + { Op9BX0 }, { Op9CM1 }, { Op9DM1X0 }, { Op9EM1X0 }, { Op9FM1 }, + { OpA0X0 }, { OpA1E0M1 }, { OpA2X0 }, { OpA3M1 }, { OpA4X0 }, + { OpA5M1 }, { OpA6X0 }, { OpA7M1 }, { OpA8X0 }, { OpA9M1 }, + { OpAAX0 }, { OpABE0 }, { OpACX0 }, { OpADM1 }, { OpAEX0 }, + { OpAFM1 }, { OpB0E0 }, { OpB1E0M1X0 }, { OpB2E0M1 }, { OpB3M1 }, + { OpB4E0X0 }, { OpB5E0M1 }, { OpB6E0X0 }, { OpB7M1 }, { OpB8 }, + { OpB9M1X0 }, { OpBAX0 }, { OpBBX0 }, { OpBCX0 }, { OpBDM1X0 }, + { OpBEX0 }, { OpBFM1 }, { OpC0X0 }, { OpC1E0M1 }, { OpC2 }, + { OpC3M1 }, { OpC4X0 }, { OpC5M1 }, { OpC6M1 }, { OpC7M1 }, + { OpC8X0 }, { OpC9M1 }, { OpCAX0 }, { OpCB }, { OpCCX0 }, + { OpCDM1 }, { OpCEM1 }, { OpCFM1 }, { OpD0E0 }, { OpD1E0M1X0 }, + { OpD2E0M1 }, { OpD3M1 }, { OpD4E0 }, { OpD5E0M1 }, { OpD6E0M1 }, + { OpD7M1 }, { OpD8 }, { OpD9M1X0 }, { OpDAE0X0 }, { OpDB }, + { OpDC }, { OpDDM1X0 }, { OpDEM1X0 }, { OpDFM1 }, { OpE0X0 }, + { OpE1E0M1 }, { OpE2 }, { OpE3M1 }, { OpE4X0 }, { OpE5M1 }, + { OpE6M1 }, { OpE7M1 }, { OpE8X0 }, { OpE9M1 }, { OpEA }, + { OpEB }, { OpECX0 }, { OpEDM1 }, { OpEEM1 }, { OpEFM1 }, + { OpF0E0 }, { OpF1E0M1X0 }, { OpF2E0M1 }, { OpF3M1 }, { OpF4E0 }, + { OpF5E0M1 }, { OpF6E0M1 }, { OpF7M1 }, { OpF8 }, { OpF9M1X0 }, + { OpFAE0X0 }, { OpFB }, { OpFCE0 }, { OpFDM1X0 }, { OpFEM1X0 }, + { OpFFM1 } +}; + +struct SOpcodes S9xOpcodesM0X0[256] = +{ + { Op00 }, { Op01E0M0 }, { Op02 }, { Op03M0 }, { Op04M0 }, + { Op05M0 }, { Op06M0 }, { Op07M0 }, { Op08E0 }, { Op09M0 }, + { Op0AM0 }, { Op0BE0 }, { Op0CM0 }, { Op0DM0 }, { Op0EM0 }, + { Op0FM0 }, { Op10E0 }, { Op11E0M0X0 }, { Op12E0M0 }, { Op13M0 }, + { Op14M0 }, { Op15E0M0 }, { Op16E0M0 }, { Op17M0 }, { Op18 }, + { Op19M0X0 }, { Op1AM0 }, { Op1B }, { Op1CM0 }, { Op1DM0X0 }, + { Op1EM0X0 }, { Op1FM0 }, { Op20E0 }, { Op21E0M0 }, { Op22E0 }, + { Op23M0 }, { Op24M0 }, { Op25M0 }, { Op26M0 }, { Op27M0 }, + { Op28E0 }, { Op29M0 }, { Op2AM0 }, { Op2BE0 }, { Op2CM0 }, + { Op2DM0 }, { Op2EM0 }, { Op2FM0 }, { Op30E0 }, { Op31E0M0X0 }, + { Op32E0M0 }, { Op33M0 }, { Op34E0M0 }, { Op35E0M0 }, { Op36E0M0 }, + { Op37M0 }, { Op38 }, { Op39M0X0 }, { Op3AM0 }, { Op3B }, + { Op3CM0X0 }, { Op3DM0X0 }, { Op3EM0X0 }, { Op3FM0 }, { Op40Slow }, + { Op41E0M0 }, { Op42 }, { Op43M0 }, { Op44X0 }, { Op45M0 }, + { Op46M0 }, { Op47M0 }, { Op48E0M0 }, { Op49M0 }, { Op4AM0 }, + { Op4BE0 }, { Op4C }, { Op4DM0 }, { Op4EM0 }, { Op4FM0 }, + { Op50E0 }, { Op51E0M0X0 }, { Op52E0M0 }, { Op53M0 }, { Op54X0 }, + { Op55E0M0 }, { Op56E0M0 }, { Op57M0 }, { Op58 }, { Op59M0X0 }, + { Op5AE0X0 }, { Op5B }, { Op5C }, { Op5DM0X0 }, { Op5EM0X0 }, + { Op5FM0 }, { Op60E0 }, { Op61E0M0 }, { Op62E0 }, { Op63M0 }, + { Op64M0 }, { Op65M0 }, { Op66M0 }, { Op67M0 }, { Op68E0M0 }, + { Op69M0 }, { Op6AM0 }, { Op6BE0 }, { Op6C }, { Op6DM0 }, + { Op6EM0 }, { Op6FM0 }, { Op70E0 }, { Op71E0M0X0 }, { Op72E0M0 }, + { Op73M0 }, { Op74E0M0 }, { Op75E0M0 }, { Op76E0M0 }, { Op77M0 }, + { Op78 }, { Op79M0X0 }, { Op7AE0X0 }, { Op7B }, { Op7C }, + { Op7DM0X0 }, { Op7EM0X0 }, { Op7FM0 }, { Op80E0 }, { Op81E0M0 }, + { Op82 }, { Op83M0 }, { Op84X0 }, { Op85M0 }, { Op86X0 }, + { Op87M0 }, { Op88X0 }, { Op89M0 }, { Op8AM0 }, { Op8BE0 }, + { Op8CX0 }, { Op8DM0 }, { Op8EX0 }, { Op8FM0 }, { Op90E0 }, + { Op91E0M0X0 }, { Op92E0M0 }, { Op93M0 }, { Op94E0X0 }, { Op95E0M0 }, + { Op96E0X0 }, { Op97M0 }, { Op98M0 }, { Op99M0X0 }, { Op9A }, + { Op9BX0 }, { Op9CM0 }, { Op9DM0X0 }, { Op9EM0X0 }, { Op9FM0 }, + { OpA0X0 }, { OpA1E0M0 }, { OpA2X0 }, { OpA3M0 }, { OpA4X0 }, + { OpA5M0 }, { OpA6X0 }, { OpA7M0 }, { OpA8X0 }, { OpA9M0 }, + { OpAAX0 }, { OpABE0 }, { OpACX0 }, { OpADM0 }, { OpAEX0 }, + { OpAFM0 }, { OpB0E0 }, { OpB1E0M0X0 }, { OpB2E0M0 }, { OpB3M0 }, + { OpB4E0X0 }, { OpB5E0M0 }, { OpB6E0X0 }, { OpB7M0 }, { OpB8 }, + { OpB9M0X0 }, { OpBAX0 }, { OpBBX0 }, { OpBCX0 }, { OpBDM0X0 }, + { OpBEX0 }, { OpBFM0 }, { OpC0X0 }, { OpC1E0M0 }, { OpC2 }, + { OpC3M0 }, { OpC4X0 }, { OpC5M0 }, { OpC6M0 }, { OpC7M0 }, + { OpC8X0 }, { OpC9M0 }, { OpCAX0 }, { OpCB }, { OpCCX0 }, + { OpCDM0 }, { OpCEM0 }, { OpCFM0 }, { OpD0E0 }, { OpD1E0M0X0 }, + { OpD2E0M0 }, { OpD3M0 }, { OpD4E0 }, { OpD5E0M0 }, { OpD6E0M0 }, + { OpD7M0 }, { OpD8 }, { OpD9M0X0 }, { OpDAE0X0 }, { OpDB }, + { OpDC }, { OpDDM0X0 }, { OpDEM0X0 }, { OpDFM0 }, { OpE0X0 }, + { OpE1E0M0 }, { OpE2 }, { OpE3M0 }, { OpE4X0 }, { OpE5M0 }, + { OpE6M0 }, { OpE7M0 }, { OpE8X0 }, { OpE9M0 }, { OpEA }, + { OpEB }, { OpECX0 }, { OpEDM0 }, { OpEEM0 }, { OpEFM0 }, + { OpF0E0 }, { OpF1E0M0X0 }, { OpF2E0M0 }, { OpF3M0 }, { OpF4E0 }, + { OpF5E0M0 }, { OpF6E0M0 }, { OpF7M0 }, { OpF8 }, { OpF9M0X0 }, + { OpFAE0X0 }, { OpFB }, { OpFCE0 }, { OpFDM0X0 }, { OpFEM0X0 }, + { OpFFM0 } +}; + +struct SOpcodes S9xOpcodesM0X1[256] = +{ + { Op00 }, { Op01E0M0 }, { Op02 }, { Op03M0 }, { Op04M0 }, + { Op05M0 }, { Op06M0 }, { Op07M0 }, { Op08E0 }, { Op09M0 }, + { Op0AM0 }, { Op0BE0 }, { Op0CM0 }, { Op0DM0 }, { Op0EM0 }, + { Op0FM0 }, { Op10E0 }, { Op11E0M0X1 }, { Op12E0M0 }, { Op13M0 }, + { Op14M0 }, { Op15E0M0 }, { Op16E0M0 }, { Op17M0 }, { Op18 }, + { Op19M0X1 }, { Op1AM0 }, { Op1B }, { Op1CM0 }, { Op1DM0X1 }, + { Op1EM0X1 }, { Op1FM0 }, { Op20E0 }, { Op21E0M0 }, { Op22E0 }, + { Op23M0 }, { Op24M0 }, { Op25M0 }, { Op26M0 }, { Op27M0 }, + { Op28E0 }, { Op29M0 }, { Op2AM0 }, { Op2BE0 }, { Op2CM0 }, + { Op2DM0 }, { Op2EM0 }, { Op2FM0 }, { Op30E0 }, { Op31E0M0X1 }, + { Op32E0M0 }, { Op33M0 }, { Op34E0M0 }, { Op35E0M0 }, { Op36E0M0 }, + { Op37M0 }, { Op38 }, { Op39M0X1 }, { Op3AM0 }, { Op3B }, + { Op3CM0X1 }, { Op3DM0X1 }, { Op3EM0X1 }, { Op3FM0 }, { Op40Slow }, + { Op41E0M0 }, { Op42 }, { Op43M0 }, { Op44X1 }, { Op45M0 }, + { Op46M0 }, { Op47M0 }, { Op48E0M0 }, { Op49M0 }, { Op4AM0 }, + { Op4BE0 }, { Op4C }, { Op4DM0 }, { Op4EM0 }, { Op4FM0 }, + { Op50E0 }, { Op51E0M0X1 }, { Op52E0M0 }, { Op53M0 }, { Op54X1 }, + { Op55E0M0 }, { Op56E0M0 }, { Op57M0 }, { Op58 }, { Op59M0X1 }, + { Op5AE0X1 }, { Op5B }, { Op5C }, { Op5DM0X1 }, { Op5EM0X1 }, + { Op5FM0 }, { Op60E0 }, { Op61E0M0 }, { Op62E0 }, { Op63M0 }, + { Op64M0 }, { Op65M0 }, { Op66M0 }, { Op67M0 }, { Op68E0M0 }, + { Op69M0 }, { Op6AM0 }, { Op6BE0 }, { Op6C }, { Op6DM0 }, + { Op6EM0 }, { Op6FM0 }, { Op70E0 }, { Op71E0M0X1 }, { Op72E0M0 }, + { Op73M0 }, { Op74E0M0 }, { Op75E0M0 }, { Op76E0M0 }, { Op77M0 }, + { Op78 }, { Op79M0X1 }, { Op7AE0X1 }, { Op7B }, { Op7C }, + { Op7DM0X1 }, { Op7EM0X1 }, { Op7FM0 }, { Op80E0 }, { Op81E0M0 }, + { Op82 }, { Op83M0 }, { Op84X1 }, { Op85M0 }, { Op86X1 }, + { Op87M0 }, { Op88X1 }, { Op89M0 }, { Op8AM0 }, { Op8BE0 }, + { Op8CX1 }, { Op8DM0 }, { Op8EX1 }, { Op8FM0 }, { Op90E0 }, + { Op91E0M0X1 }, { Op92E0M0 }, { Op93M0 }, { Op94E0X1 }, { Op95E0M0 }, + { Op96E0X1 }, { Op97M0 }, { Op98M0 }, { Op99M0X1 }, { Op9A }, + { Op9BX1 }, { Op9CM0 }, { Op9DM0X1 }, { Op9EM0X1 }, { Op9FM0 }, + { OpA0X1 }, { OpA1E0M0 }, { OpA2X1 }, { OpA3M0 }, { OpA4X1 }, + { OpA5M0 }, { OpA6X1 }, { OpA7M0 }, { OpA8X1 }, { OpA9M0 }, + { OpAAX1 }, { OpABE0 }, { OpACX1 }, { OpADM0 }, { OpAEX1 }, + { OpAFM0 }, { OpB0E0 }, { OpB1E0M0X1 }, { OpB2E0M0 }, { OpB3M0 }, + { OpB4E0X1 }, { OpB5E0M0 }, { OpB6E0X1 }, { OpB7M0 }, { OpB8 }, + { OpB9M0X1 }, { OpBAX1 }, { OpBBX1 }, { OpBCX1 }, { OpBDM0X1 }, + { OpBEX1 }, { OpBFM0 }, { OpC0X1 }, { OpC1E0M0 }, { OpC2 }, + { OpC3M0 }, { OpC4X1 }, { OpC5M0 }, { OpC6M0 }, { OpC7M0 }, + { OpC8X1 }, { OpC9M0 }, { OpCAX1 }, { OpCB }, { OpCCX1 }, + { OpCDM0 }, { OpCEM0 }, { OpCFM0 }, { OpD0E0 }, { OpD1E0M0X1 }, + { OpD2E0M0 }, { OpD3M0 }, { OpD4E0 }, { OpD5E0M0 }, { OpD6E0M0 }, + { OpD7M0 }, { OpD8 }, { OpD9M0X1 }, { OpDAE0X1 }, { OpDB }, + { OpDC }, { OpDDM0X1 }, { OpDEM0X1 }, { OpDFM0 }, { OpE0X1 }, + { OpE1E0M0 }, { OpE2 }, { OpE3M0 }, { OpE4X1 }, { OpE5M0 }, + { OpE6M0 }, { OpE7M0 }, { OpE8X1 }, { OpE9M0 }, { OpEA }, + { OpEB }, { OpECX1 }, { OpEDM0 }, { OpEEM0 }, { OpEFM0 }, + { OpF0E0 }, { OpF1E0M0X1 }, { OpF2E0M0 }, { OpF3M0 }, { OpF4E0 }, + { OpF5E0M0 }, { OpF6E0M0 }, { OpF7M0 }, { OpF8 }, { OpF9M0X1 }, + { OpFAE0X1 }, { OpFB }, { OpFCE0 }, { OpFDM0X1 }, { OpFEM0X1 }, + { OpFFM0 } +}; + +struct SOpcodes S9xOpcodesSlow[256] = +{ + { Op00 }, { Op01Slow }, { Op02 }, { Op03Slow }, { Op04Slow }, + { Op05Slow }, { Op06Slow }, { Op07Slow }, { Op08Slow }, { Op09Slow }, + { Op0ASlow }, { Op0BSlow }, { Op0CSlow }, { Op0DSlow }, { Op0ESlow }, + { Op0FSlow }, { Op10Slow }, { Op11Slow }, { Op12Slow }, { Op13Slow }, + { Op14Slow }, { Op15Slow }, { Op16Slow }, { Op17Slow }, { Op18 }, + { Op19Slow }, { Op1ASlow }, { Op1B }, { Op1CSlow }, { Op1DSlow }, + { Op1ESlow }, { Op1FSlow }, { Op20Slow }, { Op21Slow }, { Op22Slow }, + { Op23Slow }, { Op24Slow }, { Op25Slow }, { Op26Slow }, { Op27Slow }, + { Op28Slow }, { Op29Slow }, { Op2ASlow }, { Op2BSlow }, { Op2CSlow }, + { Op2DSlow }, { Op2ESlow }, { Op2FSlow }, { Op30Slow }, { Op31Slow }, + { Op32Slow }, { Op33Slow }, { Op34Slow }, { Op35Slow }, { Op36Slow }, + { Op37Slow }, { Op38 }, { Op39Slow }, { Op3ASlow }, { Op3B }, + { Op3CSlow }, { Op3DSlow }, { Op3ESlow }, { Op3FSlow }, { Op40Slow }, + { Op41Slow }, { Op42 }, { Op43Slow }, { Op44Slow }, { Op45Slow }, + { Op46Slow }, { Op47Slow }, { Op48Slow }, { Op49Slow }, { Op4ASlow }, + { Op4BSlow }, { Op4CSlow }, { Op4DSlow }, { Op4ESlow }, { Op4FSlow }, + { Op50Slow }, { Op51Slow }, { Op52Slow }, { Op53Slow }, { Op54Slow }, + { Op55Slow }, { Op56Slow }, { Op57Slow }, { Op58 }, { Op59Slow }, + { Op5ASlow }, { Op5B }, { Op5CSlow }, { Op5DSlow }, { Op5ESlow }, + { Op5FSlow }, { Op60Slow }, { Op61Slow }, { Op62Slow }, { Op63Slow }, + { Op64Slow }, { Op65Slow }, { Op66Slow }, { Op67Slow }, { Op68Slow }, + { Op69Slow }, { Op6ASlow }, { Op6BSlow }, { Op6CSlow }, { Op6DSlow }, + { Op6ESlow }, { Op6FSlow }, { Op70Slow }, { Op71Slow }, { Op72Slow }, + { Op73Slow }, { Op74Slow }, { Op75Slow }, { Op76Slow }, { Op77Slow }, + { Op78 }, { Op79Slow }, { Op7ASlow }, { Op7B }, { Op7CSlow }, + { Op7DSlow }, { Op7ESlow }, { Op7FSlow }, { Op80Slow }, { Op81Slow }, + { Op82Slow }, { Op83Slow }, { Op84Slow }, { Op85Slow }, { Op86Slow }, + { Op87Slow }, { Op88Slow }, { Op89Slow }, { Op8ASlow }, { Op8BSlow }, + { Op8CSlow }, { Op8DSlow }, { Op8ESlow }, { Op8FSlow }, { Op90Slow }, + { Op91Slow }, { Op92Slow }, { Op93Slow }, { Op94Slow }, { Op95Slow }, + { Op96Slow }, { Op97Slow }, { Op98Slow }, { Op99Slow }, { Op9A }, + { Op9BSlow }, { Op9CSlow }, { Op9DSlow }, { Op9ESlow }, { Op9FSlow }, + { OpA0Slow }, { OpA1Slow }, { OpA2Slow }, { OpA3Slow }, { OpA4Slow }, + { OpA5Slow }, { OpA6Slow }, { OpA7Slow }, { OpA8Slow }, { OpA9Slow }, + { OpAASlow }, { OpABSlow }, { OpACSlow }, { OpADSlow }, { OpAESlow }, + { OpAFSlow }, { OpB0Slow }, { OpB1Slow }, { OpB2Slow }, { OpB3Slow }, + { OpB4Slow }, { OpB5Slow }, { OpB6Slow }, { OpB7Slow }, { OpB8 }, + { OpB9Slow }, { OpBASlow }, { OpBBSlow }, { OpBCSlow }, { OpBDSlow }, + { OpBESlow }, { OpBFSlow }, { OpC0Slow }, { OpC1Slow }, { OpC2Slow }, + { OpC3Slow }, { OpC4Slow }, { OpC5Slow }, { OpC6Slow }, { OpC7Slow }, + { OpC8Slow }, { OpC9Slow }, { OpCASlow }, { OpCB }, { OpCCSlow }, + { OpCDSlow }, { OpCESlow }, { OpCFSlow }, { OpD0Slow }, { OpD1Slow }, + { OpD2Slow }, { OpD3Slow }, { OpD4Slow }, { OpD5Slow }, { OpD6Slow }, + { OpD7Slow }, { OpD8 }, { OpD9Slow }, { OpDASlow }, { OpDB }, + { OpDCSlow }, { OpDDSlow }, { OpDESlow }, { OpDFSlow }, { OpE0Slow }, + { OpE1Slow }, { OpE2Slow }, { OpE3Slow }, { OpE4Slow }, { OpE5Slow }, + { OpE6Slow }, { OpE7Slow }, { OpE8Slow }, { OpE9Slow }, { OpEA }, + { OpEB }, { OpECSlow }, { OpEDSlow }, { OpEESlow }, { OpEFSlow }, + { OpF0Slow }, { OpF1Slow }, { OpF2Slow }, { OpF3Slow }, { OpF4Slow }, + { OpF5Slow }, { OpF6Slow }, { OpF7Slow }, { OpF8 }, { OpF9Slow }, + { OpFASlow }, { OpFB }, { OpFCSlow }, { OpFDSlow }, { OpFESlow }, + { OpFFSlow } +}; + diff --git a/plugins/snes9x_gx/source/snes9x/cpuops.h b/plugins/snes9x_gx/source/snes9x/cpuops.h new file mode 100644 index 00000000..acb34060 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/cpuops.h @@ -0,0 +1,188 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _CPUOPS_H_ +#define _CPUOPS_H_ + +void S9xOpcode_NMI (void); +void S9xOpcode_IRQ (void); + +#define CHECK_FOR_IRQ() \ +if (CPU.IRQActive && !CheckFlag(IRQ) && !Settings.DisableIRQ) \ + S9xOpcode_IRQ() + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/crosshairs.cpp b/plugins/snes9x_gx/source/snes9x/crosshairs.cpp new file mode 100644 index 00000000..7c3f3851 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/crosshairs.cpp @@ -0,0 +1,682 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifdef HAVE_LIBPNG +#include <png.h> +#endif +#include "port.h" +#include "crosshairs.h" + +static const char *crosshairs[32] = +{ + "` " // Crosshair 0 (no image) + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " ", + + "` " // Crosshair 1 (the classic small dot) + " " + " " + " " + " " + " " + " " + " #. " + " " + " " + " " + " " + " " + " " + " ", + + "` " // Crosshair 2 (a standard cross) + " " + " " + " " + " .#. " + " .#. " + " ...#... " + " ####### " + " ...#... " + " .#. " + " .#. " + " " + " " + " " + " ", + + "` .#. " // Crosshair 3 (a standard cross) + " .#. " + " .#. " + " .#. " + " .#. " + " .#. " + ".......#......." + "###############" + ".......#......." + " .#. " + " .#. " + " .#. " + " .#. " + " .#. " + " .#. ", + + "` " // Crosshair 4 (an X) + " " + " " + " . . " + " .#. .#. " + " .#. .#. " + " .#.#. " + " .#. " + " .#.#. " + " .#. .#. " + " .#. .#. " + " . . " + " " + " " + " ", + + "`. . " // Crosshair 5 (an X) + ".#. .#." + " .#. .#. " + " .#. .#. " + " .#. .#. " + " .#. .#. " + " .#.#. " + " .#. " + " .#.#. " + " .#. .#. " + " .#. .#. " + " .#. .#. " + " .#. .#. " + ".#. .#." + " . . ", + + "` " // Crosshair 6 (a combo) + " " + " " + " " + " # . # " + " # . # " + " #.# " + " ...#... " + " #.# " + " # . # " + " # . # " + " " + " " + " " + " ", + + "` . " // Crosshair 7 (a combo) + " # . # " + " # . # " + " # . # " + " # . # " + " # . # " + " #.# " + ".......#......." + " #.# " + " # . # " + " # . # " + " # . # " + " # . # " + " # . # " + " . ", + + "` # " // Crosshair 8 (a diamond cross) + " #.# " + " # . # " + " # . # " + " # . # " + " # . # " + " # . # " + "#......#......#" + " # . # " + " # . # " + " # . # " + " # . # " + " # . # " + " #.# " + " # ", + + "` ### " // Crosshair 9 (a circle cross) + " ## . ## " + " # . # " + " # . # " + " # . # " + " # . # " + "# . #" + "#......#......#" + "# . #" + " # . # " + " # . # " + " # . # " + " # . # " + " ## . ## " + " ### ", + + "` .#. " // Crosshair 10 (a square cross) + " .#. " + " .#. " + " ....#.... " + " .#######. " + " .# #. " + "....# #...." + "##### #####" + "....# #...." + " .# #. " + " .#######. " + " ....#.... " + " .#. " + " .#. " + " .#. ", + + "` .#. " // Crosshair 11 (an interrupted cross) + " .#. " + " .#. " + " .#. " + " .#. " + " " + "..... ....." + "##### #####" + "..... ....." + " " + " .#. " + " .#. " + " .#. " + " .#. " + " .#. ", + + "`. . " // Crosshair 12 (an interrupted X) + ".#. .#." + " .#. .#. " + " .#. .#. " + " .#. .#. " + " " + " " + " " + " " + " " + " .#. .#. " + " .#. .#. " + " .#. .#. " + ".#. .#." + " . . ", + + "` . " // Crosshair 13 (an interrupted combo) + " # . # " + " # . # " + " # . # " + " # . # " + " " + " " + "..... ....." + " " + " " + " # . # " + " # . # " + " # . # " + " # . # " + " . ", + + "`#### #### " // Crosshair 14 + "#.... ....#" + "#. .#" + "#. .#" + "#. .#" + " # " + " # " + " ##### " + " # " + " # " + "#. .#" + "#. .#" + "#. .#" + "#.... ....#" + " #### #### ", + + "` .# #. " // Crosshair 15 + " .# #. " + " .# #. " + "....# #...." + "##### #####" + " " + " " + " " + " " + " " + "##### #####" + "....# #...." + " .# #. " + " .# #. " + " .# #. ", + + "` # " // Crosshair 16 + " # " + " # " + " ....#.... " + " . # . " + " . # . " + " . # . " + "###############" + " . # . " + " . # . " + " . # . " + " ....#.... " + " # " + " # " + " # ", + + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL +}; + + +bool S9xLoadCrosshairFile (int idx, const char *filename) +{ + if (idx < 1 || idx > 31) + return (false); + + char *s = (char *) calloc(15 * 15 + 1, sizeof(char)); + if (s == NULL) + { + fprintf(stderr, "S9xLoadCrosshairFile: malloc error while reading "); + perror(filename); + return (false); + } + + FILE *fp = fopen(filename, "rb"); + if (fp == NULL) + { + fprintf(stderr, "S9xLoadCrosshairFile: Couldn't open "); + perror(filename); + free(s); + return (false); + } + + size_t l = fread(s, 1, 8, fp); + if (l != 8) + { + fprintf(stderr, "S9xLoadCrosshairFile: File is too short!\n"); + free(s); + fclose(fp); + return (false); + } + +#ifdef HAVE_LIBPNG + png_structp png_ptr; + png_infop info_ptr; + + if (!png_sig_cmp((png_byte *) s, 0, 8)) + { + png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if (!png_ptr) + { + free(s); + fclose(fp); + return (false); + } + + info_ptr = png_create_info_struct(png_ptr); + if (!info_ptr) + { + png_destroy_read_struct(&png_ptr, (png_infopp) NULL, (png_infopp) NULL); + free(s); + fclose(fp); + return (false); + } + + png_init_io(png_ptr, fp); + png_set_sig_bytes(png_ptr, 8); + png_read_info(png_ptr, info_ptr); + + png_uint_32 width, height; + int bit_depth, color_type; + + png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, NULL, NULL, NULL); + if (color_type != PNG_COLOR_TYPE_PALETTE) + { + fprintf(stderr, "S9xLoadCrosshairFile: Input PNG is not a palettized image!\n"); + png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp) NULL); + free(s); + fclose(fp); + return (false); + } + + if (bit_depth == 16) + png_set_strip_16(png_ptr); + + if (width != 15 || height != 15) + { + fprintf(stderr, "S9xLoadCrosshairFile: Expecting a 15x15 PNG\n"); + png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp) NULL); + free(s); + fclose(fp); + return (false); + } + + png_color *pngpal; + png_byte *trans; + int num_palette = 0, num_trans = 0; + int transcol = -1, fgcol = -1, bgcol = -1; + + png_get_PLTE(png_ptr, info_ptr, &pngpal, &num_palette); + png_get_tRNS(png_ptr, info_ptr, &trans, &num_trans, NULL); + + if (num_palette != 3 || num_trans != 1) + { + fprintf(stderr, "S9xLoadCrosshairFile: Expecting a 3-color PNG with 1 trasnparent color\n"); + png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp) NULL); + free(s); + fclose(fp); + return (false); + } + + for (int i = 0; i < 3; i++) + { + if (trans[0] == i) + transcol = i; + else + if (pngpal[i].red == 0 && pngpal[i].green == 0 && pngpal[i].blue == 0) + bgcol = i; + else + if (pngpal[i].red == 255 && pngpal[i].green == 255 && pngpal[i].blue == 255) + fgcol = i; + } + + if (transcol < 0 || fgcol < 0 || bgcol < 0) + { + fprintf(stderr, "S9xLoadCrosshairFile: PNG must have 3 colors: white (fg), black (bg), and transparent.\n"); + png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp) NULL); + free(s); + fclose(fp); + return (false); + } + + png_set_packing(png_ptr); + png_read_update_info(png_ptr, info_ptr); + png_byte *row_pointer = new png_byte[png_get_rowbytes(png_ptr, info_ptr)]; + + for (int r = 0; r < 15 * 15; r += 15) + { + png_read_row(png_ptr, row_pointer, NULL); + + for (int i = 0; i < 15; i++) + { + if (row_pointer[i] == transcol) + s[r + i] = ' '; + else + if (row_pointer[i] == fgcol) + s[r + i] = '#'; + else + if (row_pointer[i] == bgcol) + s[r + i] = '.'; + else + { + fprintf(stderr, "S9xLoadCrosshairFile: WTF? This was supposed to be a 3-color PNG!\n"); + png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp) NULL); + free(s); + fclose(fp); + return (false); + } + } + } + + s[15 * 15] = 0; + png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp) NULL); + } + else +#endif + { + l = fread(s + 8, 1, 15 - 8, fp); + if (l != 15 - 8) + { + fprintf(stderr, "S9xLoadCrosshairFile: File is too short!\n"); + free(s); + fclose(fp); + return (false); + } + + if (getc(fp) != '\n') + { + fprintf(stderr, "S9xLoadCrosshairFile: Invalid file format! (note: PNG support is not available)\n"); + free(s); + fclose(fp); + return (false); + } + + for (int r = 1; r < 15; r++) + { + l = fread(s + r * 15, 1, 15, fp); + if (l != 15) + { + fprintf(stderr, "S9xLoadCrosshairFile: File is too short! (note: PNG support is not available)\n"); + free(s); + fclose(fp); + return (false); + } + + if (getc(fp) != '\n') + { + fprintf(stderr, "S9xLoadCrosshairFile: Invalid file format! (note: PNG support is not available)\n"); + free(s); + fclose(fp); + return (false); + } + } + + for (int i = 0; i < 15 * 15; i++) + { + if (s[i] != ' ' && s[i] != '#' && s[i] != '.') + { + fprintf(stderr, "S9xLoadCrosshairFile: Invalid file format! (note: PNG support is not available)\n"); + free(s); + fclose(fp); + return (false); + } + } + } + + fclose(fp); + + if (crosshairs[idx] != NULL && crosshairs[idx][0] != '`') + free((void *) crosshairs[idx]); + crosshairs[idx] = s; + + return (true); +} + +const char * S9xGetCrosshair (int idx) +{ + if (idx < 0 || idx > 31) + return (NULL); + + return (crosshairs[idx]); +} diff --git a/plugins/snes9x_gx/source/snes9x/crosshairs.h b/plugins/snes9x_gx/source/snes9x/crosshairs.h new file mode 100644 index 00000000..16c3811d --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/crosshairs.h @@ -0,0 +1,233 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _CROSSHAIRS_H_ +#define _CROSSHAIRS_H_ + +// Read in the specified crosshair file, replacing whatever data might be in that slot. +// Available slots are 1-31. +// The input file must be a PNG or a text file. +// PNG: 15x15 pixels, palettized, with 3 colors (white, black, and transparent). +// text: 15 lines of 16 characters (counting the \n), consisting of ' ', '#', or '.'. + +bool S9xLoadCrosshairFile (int idx, const char *filename); + +// Return the specified crosshair. Woo-hoo. +// char * to a 225-byte string, with '#' marking foreground, '.' marking background, +// and anything else transparent. + +const char * S9xGetCrosshair (int idx); + +// In controls.cpp. Sets the crosshair for the specified device. Defaults are: +// cross fgcolor bgcolor +// Mouse 1: 1 White Black +// Mouse 2: 1 Purple White +// Superscope: 2 White Black +// Justifier 1: 4 Blue Black +// Justifier 2: 4 MagicPink Black +// +// Available colors are: Trans, Black, 25Grey, 50Grey, 75Grey, White, Red, Orange, +// Yellow, Green, Cyan, Sky, Blue, Violet, MagicPink, and Purple. +// You may also prefix a 't' (e.g. tBlue) for a 50%-transparent version. +// Use idx = -1 or fg/bg = NULL to keep the current setting. + +enum crosscontrols +{ + X_MOUSE1, + X_MOUSE2, + X_SUPERSCOPE, + X_JUSTIFIER1, + X_JUSTIFIER2 +}; + +void S9xSetControllerCrosshair (enum crosscontrols ctl, int8 idx, const char *fg, const char *bg); +void S9xGetControllerCrosshair (enum crosscontrols ctl, int8 *idx, const char **fg, const char **bg); + +// In gfx.cpp, much like S9xDisplayChar() except it takes the parameters +// listed and looks up GFX.Screen. +// The 'crosshair' arg is a 15x15 image, with '#' meaning fgcolor, +// '.' meaning bgcolor, and anything else meaning transparent. +// Color values should be (RGB): +// 0 = transparent 4 = 23 23 23 8 = 31 31 0 12 = 0 0 31 +// 1 = 0 0 0 5 = 31 31 31 9 = 0 31 0 13 = 23 0 31 +// 2 = 8 8 8 6 = 31 0 0 10 = 0 31 31 14 = 31 0 31 +// 3 = 16 16 16 7 = 31 16 0 11 = 0 23 31 15 = 31 0 16 +// 16-31 are 50% transparent versions of 0-15. + +void S9xDrawCrosshair (const char *crosshair, uint8 fgcolor, uint8 bgcolor, int16 x, int16 y); + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/display.h b/plugins/snes9x_gx/source/snes9x/display.h new file mode 100644 index 00000000..fa784088 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/display.h @@ -0,0 +1,235 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _DISPLAY_H_ +#define _DISPLAY_H_ + +enum s9x_getdirtype +{ + DEFAULT_DIR = 0, + HOME_DIR, + ROMFILENAME_DIR, + ROM_DIR, + SRAM_DIR, + SNAPSHOT_DIR, + SCREENSHOT_DIR, + SPC_DIR, + CHEAT_DIR, + IPS_DIR, + BIOS_DIR, + LOG_DIR, + LAST_DIR +}; + +void S9xUsage (void); +char * S9xParseArgs (char **, int); +void S9xLoadConfigFiles (char **, int); +void S9xSetInfoString (const char *); + +// Routines the port has to implement even if it doesn't use them + +void S9xPutImage (int, int); +void S9xInitDisplay (int, char **); +void S9xDeinitDisplay (void); +void S9xTextMode (void); +void S9xGraphicsMode (void); +void S9xSetPalette (void); +void S9xToggleSoundChannel (int); +bool8 S9xOpenSnapshotFile (const char *, bool8, STREAM *); +void S9xCloseSnapshotFile (STREAM); +const char * S9xStringInput (const char *); +const char * S9xGetDirectory (enum s9x_getdirtype); +const char * S9xGetFilename (const char *, enum s9x_getdirtype); +const char * S9xGetFilenameInc (const char *, enum s9x_getdirtype); +const char * S9xChooseFilename (bool8); +const char * S9xBasename (const char *); + +// Routines the port has to implement if it uses command-line + +void S9xExtraUsage (void); +void S9xParseArg (char **, int &, int); + +// Routines the port may implement as needed + +void S9xExtraDisplayUsage (void); +void S9xParseDisplayArg (char **, int &, int); +void S9xSetTitle (const char *); +void S9xInitInputDevices (void); +void S9xProcessEvents (bool8); +const char * S9xSelectFilename (const char *, const char *, const char *, const char *); + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/dma.cpp b/plugins/snes9x_gx/source/snes9x/dma.cpp new file mode 100644 index 00000000..bd2c6f22 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/dma.cpp @@ -0,0 +1,1808 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#include "snes9x.h" +#include "memmap.h" +#include "dma.h" +#include "apu/apu.h" +#include "sdd1emu.h" +#include "spc7110emu.h" +#ifdef DEBUGGER +#include "missing.h" +#endif + +#define ADD_CYCLES(n) CPU.Cycles += (n) + +extern uint8 *HDMAMemPointers[8]; +extern int HDMA_ModeByteCounts[8]; +extern SPC7110 s7emu; + +static uint8 sdd1_decode_buffer[0x10000]; + +static inline bool8 addCyclesInDMA (uint8); +static inline bool8 HDMAReadLineCount (int); + + +static inline bool8 addCyclesInDMA (uint8 dma_channel) +{ + // Add 8 cycles per byte, sync APU, and do HC related events. + // If HDMA was done in S9xDoHEventProcessing(), check if it used the same channel as DMA. + ADD_CYCLES(SLOW_ONE_CYCLE); + while (CPU.Cycles >= CPU.NextEvent) + S9xDoHEventProcessing(); + + if (CPU.HDMARanInDMA & (1 << dma_channel)) + { + CPU.HDMARanInDMA = 0; + #ifdef DEBUGGER + printf("HDMA and DMA use the same channel %d!\n", dma_channel); + #endif + // If HDMA triggers in the middle of DMA transfer and it uses the same channel, + // it kills the DMA transfer immediately. $43x2 and $43x5 stop updating. + return (FALSE); + } + + CPU.HDMARanInDMA = 0; + return (TRUE); +} + +bool8 S9xDoDMA (uint8 Channel) +{ + CPU.InDMA = TRUE; + CPU.InDMAorHDMA = TRUE; + CPU.CurrentDMAorHDMAChannel = Channel; + + SDMA *d = &DMA[Channel]; + + // Check invalid DMA first + if ((d->ABank == 0x7E || d->ABank == 0x7F) && d->BAddress == 0x80 && !d->ReverseTransfer) + { + // Attempting a DMA from WRAM to $2180 will not work, WRAM will not be written. + // Attempting a DMA from $2180 to WRAM will similarly not work, + // the value written is (initially) the OpenBus value. + // In either case, the address in $2181-3 is not incremented. + + // Does an invalid DMA actually take time? + // I'd say yes, since 'invalid' is probably just the WRAM chip + // not being able to read and write itself at the same time + // And no, PPU.WRAM should not be updated. + + int32 c = d->TransferBytes; + // Writing $0000 to $43x5 actually results in a transfer of $10000 bytes, not 0. + if (c == 0) + c = 0x10000; + + // 8 cycles per channel + ADD_CYCLES(SLOW_ONE_CYCLE); + // 8 cycles per byte + while (c) + { + d->TransferBytes--; + d->AAddress++; + c--; + if (!addCyclesInDMA(Channel)) + { + CPU.InDMA = FALSE; + CPU.InDMAorHDMA = FALSE; + CPU.CurrentDMAorHDMAChannel = -1; + return (FALSE); + } + } + + #ifdef DEBUGGER + if (Settings.TraceDMA) + { + sprintf(String, "DMA[%d]: WRAM Bank:%02X->$2180", Channel, d->ABank); + S9xMessage(S9X_TRACE, S9X_DMA_TRACE, String); + } + #endif + + CPU.InDMA = FALSE; + CPU.InDMAorHDMA = FALSE; + CPU.CurrentDMAorHDMAChannel = -1; + return (TRUE); + } + + // Prepare for accessing $2118-2119 + switch (d->BAddress) + { + case 0x18: + case 0x19: + if (IPPU.RenderThisFrame) + FLUSH_REDRAW(); + break; + } + + int32 inc = d->AAddressFixed ? 0 : (!d->AAddressDecrement ? 1 : -1); + int32 count = d->TransferBytes; + // Writing $0000 to $43x5 actually results in a transfer of $10000 bytes, not 0. + if (count == 0) + count = 0x10000; + + // Prepare for custom chip DMA + + // S-DD1 + + uint8 *in_sdd1_dma = NULL; + + if (Settings.SDD1) + { + if (d->AAddressFixed && Memory.FillRAM[0x4801] > 0) + { + // XXX: Should probably verify that we're DMAing from ROM? + // And somewhere we should make sure we're not running across a mapping boundary too. + // Hacky support for pre-decompressed S-DD1 data + inc = !d->AAddressDecrement ? 1 : -1; + + uint8 *in_ptr = S9xGetBasePointer(((d->ABank << 16) | d->AAddress)); + if (in_ptr) + { + in_ptr += d->AAddress; + SDD1_decompress(sdd1_decode_buffer, in_ptr, d->TransferBytes); + } + #ifdef DEBUGGER + else + { + sprintf(String, "S-DD1: DMA from non-block address $%02X:%04X", d->ABank, d->AAddress); + S9xMessage(S9X_WARNING, S9X_DMA_TRACE, String); + } + #endif + + in_sdd1_dma = sdd1_decode_buffer; + } + + Memory.FillRAM[0x4801] = 0; + } + + // SPC7110 + + uint8 *spc7110_dma = NULL; + + if (Settings.SPC7110) + { + if (d->AAddress == 0x4800 || d->ABank == 0x50) + { + spc7110_dma = new uint8[d->TransferBytes]; + for (int i = 0; i < d->TransferBytes; i++) + spc7110_dma[i] = s7emu.decomp.read(); + + int32 icount = s7emu.r4809 | (s7emu.r480a << 8); + icount -= d->TransferBytes; + s7emu.r4809 = icount & 0x00ff; + s7emu.r480a = (icount & 0xff00) >> 8; + + inc = 1; + d->AAddress -= count; + } + } + + // SA-1 + + bool8 in_sa1_dma = FALSE; + + if (Settings.SA1) + { + if (SA1.in_char_dma && d->BAddress == 0x18 && (d->ABank & 0xf0) == 0x40) + { + // Perform packed bitmap to PPU character format conversion on the data + // before transmitting it to V-RAM via-DMA. + int32 num_chars = 1 << ((Memory.FillRAM[0x2231] >> 2) & 7); + int32 depth = (Memory.FillRAM[0x2231] & 3) == 0 ? 8 : (Memory.FillRAM[0x2231] & 3) == 1 ? 4 : 2; + int32 bytes_per_char = 8 * depth; + int32 bytes_per_line = depth * num_chars; + int32 char_line_bytes = bytes_per_char * num_chars; + uint32 addr = (d->AAddress / char_line_bytes) * char_line_bytes; + + uint8 *base = S9xGetBasePointer((d->ABank << 16) + addr); + if (!base) + { + sprintf(String, "SA-1: DMA from non-block address $%02X:%04X", d->ABank, addr); + S9xMessage(S9X_WARNING, S9X_DMA_TRACE, String); + base = Memory.ROM; + } + + base += addr; + + uint8 *buffer = &Memory.ROM[CMemory::MAX_ROM_SIZE - 0x10000]; + uint8 *p = buffer; + uint32 inc_sa1 = char_line_bytes - (d->AAddress % char_line_bytes); + uint32 char_count = inc_sa1 / bytes_per_char; + + in_sa1_dma = TRUE; + + #if 0 + printf("SA-1 DMA: %08x,", base); + printf("depth = %d, count = %d, bytes_per_char = %d, bytes_per_line = %d, num_chars = %d, char_line_bytes = %d\n", + depth, count, bytes_per_char, bytes_per_line, num_chars, char_line_bytes); + #endif + + switch (depth) + { + case 2: + for (int32 i = 0; i < count; i += inc_sa1, base += char_line_bytes, inc_sa1 = char_line_bytes, char_count = num_chars) + { + uint8 *line = base + (num_chars - char_count) * 2; + for (uint32 j = 0; j < char_count && p - buffer < count; j++, line += 2) + { + uint8 *q = line; + for (int32 l = 0; l < 8; l++, q += bytes_per_line) + { + for (int32 b = 0; b < 2; b++) + { + uint8 r = *(q + b); + *(p + 0) = (*(p + 0) << 1) | ((r >> 0) & 1); + *(p + 1) = (*(p + 1) << 1) | ((r >> 1) & 1); + *(p + 0) = (*(p + 0) << 1) | ((r >> 2) & 1); + *(p + 1) = (*(p + 1) << 1) | ((r >> 3) & 1); + *(p + 0) = (*(p + 0) << 1) | ((r >> 4) & 1); + *(p + 1) = (*(p + 1) << 1) | ((r >> 5) & 1); + *(p + 0) = (*(p + 0) << 1) | ((r >> 6) & 1); + *(p + 1) = (*(p + 1) << 1) | ((r >> 7) & 1); + } + + p += 2; + } + } + } + + break; + + case 4: + for (int32 i = 0; i < count; i += inc_sa1, base += char_line_bytes, inc_sa1 = char_line_bytes, char_count = num_chars) + { + uint8 *line = base + (num_chars - char_count) * 4; + for (uint32 j = 0; j < char_count && p - buffer < count; j++, line += 4) + { + uint8 *q = line; + for (int32 l = 0; l < 8; l++, q += bytes_per_line) + { + for (int32 b = 0; b < 4; b++) + { + uint8 r = *(q + b); + *(p + 0) = (*(p + 0) << 1) | ((r >> 0) & 1); + *(p + 1) = (*(p + 1) << 1) | ((r >> 1) & 1); + *(p + 16) = (*(p + 16) << 1) | ((r >> 2) & 1); + *(p + 17) = (*(p + 17) << 1) | ((r >> 3) & 1); + *(p + 0) = (*(p + 0) << 1) | ((r >> 4) & 1); + *(p + 1) = (*(p + 1) << 1) | ((r >> 5) & 1); + *(p + 16) = (*(p + 16) << 1) | ((r >> 6) & 1); + *(p + 17) = (*(p + 17) << 1) | ((r >> 7) & 1); + } + + p += 2; + } + + p += 32 - 16; + } + } + + break; + + case 8: + for (int32 i = 0; i < count; i += inc_sa1, base += char_line_bytes, inc_sa1 = char_line_bytes, char_count = num_chars) + { + uint8 *line = base + (num_chars - char_count) * 8; + for (uint32 j = 0; j < char_count && p - buffer < count; j++, line += 8) + { + uint8 *q = line; + for (int32 l = 0; l < 8; l++, q += bytes_per_line) + { + for (int32 b = 0; b < 8; b++) + { + uint8 r = *(q + b); + *(p + 0) = (*(p + 0) << 1) | ((r >> 0) & 1); + *(p + 1) = (*(p + 1) << 1) | ((r >> 1) & 1); + *(p + 16) = (*(p + 16) << 1) | ((r >> 2) & 1); + *(p + 17) = (*(p + 17) << 1) | ((r >> 3) & 1); + *(p + 32) = (*(p + 32) << 1) | ((r >> 4) & 1); + *(p + 33) = (*(p + 33) << 1) | ((r >> 5) & 1); + *(p + 48) = (*(p + 48) << 1) | ((r >> 6) & 1); + *(p + 49) = (*(p + 49) << 1) | ((r >> 7) & 1); + } + + p += 2; + } + + p += 64 - 16; + } + } + + break; + } + } + } + +#ifdef DEBUGGER + if (Settings.TraceDMA) + { + sprintf(String, "DMA[%d]: %s Mode:%d 0x%02X%04X->0x21%02X Bytes:%d (%s) V:%03d", + Channel, d->ReverseTransfer ? "PPU->CPU" : "CPU->PPU", d->TransferMode, d->ABank, d->AAddress, d->BAddress, + d->TransferBytes, d->AAddressFixed ? "fixed" : (d->AAddressDecrement ? "dec" : "inc"), CPU.V_Counter); + + if (d->BAddress == 0x18 || d->BAddress == 0x19 || d->BAddress == 0x39 || d->BAddress == 0x3a) + sprintf(String, "%s VRAM: %04X (%d,%d) %s", String, + PPU.VMA.Address, PPU.VMA.Increment, PPU.VMA.FullGraphicCount, PPU.VMA.High ? "word" : "byte"); + else + if (d->BAddress == 0x22 || d->BAddress == 0x3b) + sprintf(String, "%s CGRAM: %02X (%x)", String, PPU.CGADD, PPU.CGFLIP); + else + if (d->BAddress == 0x04 || d->BAddress == 0x38) + sprintf(String, "%s OBJADDR: %04X", String, PPU.OAMAddr); + + S9xMessage(S9X_TRACE, S9X_DMA_TRACE, String); + } +#endif + + // Do Transfer + + uint8 Work; + + // 8 cycles per channel + ADD_CYCLES(SLOW_ONE_CYCLE); + + if (!d->ReverseTransfer) + { + // CPU -> PPU + int32 b = 0; + uint16 p = d->AAddress; + uint8 *base = S9xGetBasePointer((d->ABank << 16) + d->AAddress); + bool8 inWRAM_DMA; + + int32 rem = count; + // Transfer per block if d->AAdressFixed is FALSE + count = d->AAddressFixed ? rem : (d->AAddressDecrement ? ((p & MEMMAP_MASK) + 1) : (MEMMAP_BLOCK_SIZE - (p & MEMMAP_MASK))); + + // Settings for custom chip DMA + if (in_sa1_dma) + { + base = &Memory.ROM[CMemory::MAX_ROM_SIZE - 0x10000]; + p = 0; + count = rem; + } + else + if (in_sdd1_dma) + { + base = in_sdd1_dma; + p = 0; + count = rem; + } + else + if (spc7110_dma) + { + base = spc7110_dma; + p = 0; + count = rem; + } + + inWRAM_DMA = ((!in_sa1_dma && !in_sdd1_dma && !spc7110_dma) && + (d->ABank == 0x7e || d->ABank == 0x7f || (!(d->ABank & 0x40) && d->AAddress < 0x2000))); + + // 8 cycles per byte + #define UPDATE_COUNTERS \ + d->TransferBytes--; \ + d->AAddress += inc; \ + p += inc; \ + if (!addCyclesInDMA(Channel)) \ + { \ + CPU.InDMA = FALSE; \ + CPU.InDMAorHDMA = FALSE; \ + CPU.InWRAMDMAorHDMA = FALSE; \ + CPU.CurrentDMAorHDMAChannel = -1; \ + return (FALSE); \ + } + + while (1) + { + if (count > rem) + count = rem; + rem -= count; + + CPU.InWRAMDMAorHDMA = inWRAM_DMA; + + if (!base) + { + // DMA SLOW PATH + if (d->TransferMode == 0 || d->TransferMode == 2 || d->TransferMode == 6) + { + do + { + Work = S9xGetByte((d->ABank << 16) + p); + S9xSetPPU(Work, 0x2100 + d->BAddress); + UPDATE_COUNTERS; + } while (--count > 0); + } + else + if (d->TransferMode == 1 || d->TransferMode == 5) + { + // This is a variation on Duff's Device. It is legal C/C++. + switch (b) + { + default: + while (count > 1) + { + Work = S9xGetByte((d->ABank << 16) + p); + S9xSetPPU(Work, 0x2100 + d->BAddress); + UPDATE_COUNTERS; + count--; + + case 1: + Work = S9xGetByte((d->ABank << 16) + p); + S9xSetPPU(Work, 0x2101 + d->BAddress); + UPDATE_COUNTERS; + count--; + } + } + + if (count == 1) + { + Work = S9xGetByte((d->ABank << 16) + p); + S9xSetPPU(Work, 0x2100 + d->BAddress); + UPDATE_COUNTERS; + b = 1; + } + else + b = 0; + } + else + if (d->TransferMode == 3 || d->TransferMode == 7) + { + switch (b) + { + default: + do + { + Work = S9xGetByte((d->ABank << 16) + p); + S9xSetPPU(Work, 0x2100 + d->BAddress); + UPDATE_COUNTERS; + if (--count <= 0) + { + b = 1; + break; + } + + case 1: + Work = S9xGetByte((d->ABank << 16) + p); + S9xSetPPU(Work, 0x2100 + d->BAddress); + UPDATE_COUNTERS; + if (--count <= 0) + { + b = 2; + break; + } + + case 2: + Work = S9xGetByte((d->ABank << 16) + p); + S9xSetPPU(Work, 0x2101 + d->BAddress); + UPDATE_COUNTERS; + if (--count <= 0) + { + b = 3; + break; + } + + case 3: + Work = S9xGetByte((d->ABank << 16) + p); + S9xSetPPU(Work, 0x2101 + d->BAddress); + UPDATE_COUNTERS; + if (--count <= 0) + { + b = 0; + break; + } + } while (1); + } + } + else + if (d->TransferMode == 4) + { + switch (b) + { + default: + do + { + Work = S9xGetByte((d->ABank << 16) + p); + S9xSetPPU(Work, 0x2100 + d->BAddress); + UPDATE_COUNTERS; + if (--count <= 0) + { + b = 1; + break; + } + + case 1: + Work = S9xGetByte((d->ABank << 16) + p); + S9xSetPPU(Work, 0x2101 + d->BAddress); + UPDATE_COUNTERS; + if (--count <= 0) + { + b = 2; + break; + } + + case 2: + Work = S9xGetByte((d->ABank << 16) + p); + S9xSetPPU(Work, 0x2102 + d->BAddress); + UPDATE_COUNTERS; + if (--count <= 0) + { + b = 3; + break; + } + + case 3: + Work = S9xGetByte((d->ABank << 16) + p); + S9xSetPPU(Work, 0x2103 + d->BAddress); + UPDATE_COUNTERS; + if (--count <= 0) + { + b = 0; + break; + } + } while (1); + } + } + #ifdef DEBUGGER + else + { + sprintf(String, "Unknown DMA transfer mode: %d on channel %d\n", d->TransferMode, Channel); + S9xMessage(S9X_TRACE, S9X_DMA_TRACE, String); + } + #endif + } + else + { + // DMA FAST PATH + if (d->TransferMode == 0 || d->TransferMode == 2 || d->TransferMode == 6) + { + switch (d->BAddress) + { + case 0x04: // OAMDATA + do + { + Work = *(base + p); + REGISTER_2104(Work); + UPDATE_COUNTERS; + } while (--count > 0); + + break; + + case 0x18: // VMDATAL + #ifndef CORRECT_VRAM_READS + IPPU.FirstVRAMRead = TRUE; + #endif + if (!PPU.VMA.FullGraphicCount) + { + do + { + Work = *(base + p); + REGISTER_2118_linear(Work); + UPDATE_COUNTERS; + } while (--count > 0); + } + else + { + do + { + Work = *(base + p); + REGISTER_2118_tile(Work); + UPDATE_COUNTERS; + } while (--count > 0); + } + + break; + + case 0x19: // VMDATAH + #ifndef CORRECT_VRAM_READS + IPPU.FirstVRAMRead = TRUE; + #endif + if (!PPU.VMA.FullGraphicCount) + { + do + { + Work = *(base + p); + REGISTER_2119_linear(Work); + UPDATE_COUNTERS; + } while (--count > 0); + } + else + { + do + { + Work = *(base + p); + REGISTER_2119_tile(Work); + UPDATE_COUNTERS; + } while (--count > 0); + } + + break; + + case 0x22: // CGDATA + do + { + Work = *(base + p); + REGISTER_2122(Work); + UPDATE_COUNTERS; + } while (--count > 0); + + break; + + case 0x80: // WMDATA + if (!CPU.InWRAMDMAorHDMA) + { + do + { + Work = *(base + p); + REGISTER_2180(Work); + UPDATE_COUNTERS; + } while (--count > 0); + } + else + { + do + { + UPDATE_COUNTERS; + } while (--count > 0); + } + + break; + + default: + do + { + Work = *(base + p); + S9xSetPPU(Work, 0x2100 + d->BAddress); + UPDATE_COUNTERS; + } while (--count > 0); + + break; + } + } + else + if (d->TransferMode == 1 || d->TransferMode == 5) + { + if (d->BAddress == 0x18) + { + // VMDATAL + #ifndef CORRECT_VRAM_READS + IPPU.FirstVRAMRead = TRUE; + #endif + if (!PPU.VMA.FullGraphicCount) + { + switch (b) + { + default: + while (count > 1) + { + Work = *(base + p); + REGISTER_2118_linear(Work); + UPDATE_COUNTERS; + count--; + + case 1: + Work = *(base + p); + REGISTER_2119_linear(Work); + UPDATE_COUNTERS; + count--; + } + } + + if (count == 1) + { + Work = *(base + p); + REGISTER_2118_linear(Work); + UPDATE_COUNTERS; + b = 1; + } + else + b = 0; + } + else + { + switch (b) + { + default: + while (count > 1) + { + Work = *(base + p); + REGISTER_2118_tile(Work); + UPDATE_COUNTERS; + count--; + + case 1: + Work = *(base + p); + REGISTER_2119_tile(Work); + UPDATE_COUNTERS; + count--; + } + } + + if (count == 1) + { + Work = *(base + p); + REGISTER_2118_tile(Work); + UPDATE_COUNTERS; + b = 1; + } + else + b = 0; + } + } + else + { + // DMA mode 1 general case + switch (b) + { + default: + while (count > 1) + { + Work = *(base + p); + S9xSetPPU(Work, 0x2100 + d->BAddress); + UPDATE_COUNTERS; + count--; + + case 1: + Work = *(base + p); + S9xSetPPU(Work, 0x2101 + d->BAddress); + UPDATE_COUNTERS; + count--; + } + } + + if (count == 1) + { + Work = *(base + p); + S9xSetPPU(Work, 0x2100 + d->BAddress); + UPDATE_COUNTERS; + b = 1; + } + else + b = 0; + } + } + else + if (d->TransferMode == 3 || d->TransferMode == 7) + { + switch (b) + { + default: + do + { + Work = *(base + p); + S9xSetPPU(Work, 0x2100 + d->BAddress); + UPDATE_COUNTERS; + if (--count <= 0) + { + b = 1; + break; + } + + case 1: + Work = *(base + p); + S9xSetPPU(Work, 0x2100 + d->BAddress); + UPDATE_COUNTERS; + if (--count <= 0) + { + b = 2; + break; + } + + case 2: + Work = *(base + p); + S9xSetPPU(Work, 0x2101 + d->BAddress); + UPDATE_COUNTERS; + if (--count <= 0) + { + b = 3; + break; + } + + case 3: + Work = *(base + p); + S9xSetPPU(Work, 0x2101 + d->BAddress); + UPDATE_COUNTERS; + if (--count <= 0) + { + b = 0; + break; + } + } while (1); + } + } + else + if (d->TransferMode == 4) + { + switch (b) + { + default: + do + { + Work = *(base + p); + S9xSetPPU(Work, 0x2100 + d->BAddress); + UPDATE_COUNTERS; + if (--count <= 0) + { + b = 1; + break; + } + + case 1: + Work = *(base + p); + S9xSetPPU(Work, 0x2101 + d->BAddress); + UPDATE_COUNTERS; + if (--count <= 0) + { + b = 2; + break; + } + + case 2: + Work = *(base + p); + S9xSetPPU(Work, 0x2102 + d->BAddress); + UPDATE_COUNTERS; + if (--count <= 0) + { + b = 3; + break; + } + + case 3: + Work = *(base + p); + S9xSetPPU(Work, 0x2103 + d->BAddress); + UPDATE_COUNTERS; + if (--count <= 0) + { + b = 0; + break; + } + } while (1); + } + } + #ifdef DEBUGGER + else + { + sprintf(String, "Unknown DMA transfer mode: %d on channel %d\n", d->TransferMode, Channel); + S9xMessage(S9X_TRACE, S9X_DMA_TRACE, String); + } + #endif + } + + if (rem <= 0) + break; + + base = S9xGetBasePointer((d->ABank << 16) + d->AAddress); + count = MEMMAP_BLOCK_SIZE; + inWRAM_DMA = ((!in_sa1_dma && !in_sdd1_dma && !spc7110_dma) && + (d->ABank == 0x7e || d->ABank == 0x7f || (!(d->ABank & 0x40) && d->AAddress < 0x2000))); + } + + #undef UPDATE_COUNTERS + } + else + { + // PPU -> CPU + + // 8 cycles per byte + #define UPDATE_COUNTERS \ + d->TransferBytes--; \ + d->AAddress += inc; \ + if (!addCyclesInDMA(Channel)) \ + { \ + CPU.InDMA = FALSE; \ + CPU.InDMAorHDMA = FALSE; \ + CPU.InWRAMDMAorHDMA = FALSE; \ + CPU.CurrentDMAorHDMAChannel = -1; \ + return (FALSE); \ + } + + if (d->BAddress > 0x80 - 4 && d->BAddress <= 0x83 && !(d->ABank & 0x40)) + { + // REVERSE-DMA REALLY-SLOW PATH + do + { + switch (d->TransferMode) + { + case 0: + case 2: + case 6: + CPU.InWRAMDMAorHDMA = (d->AAddress < 0x2000); + Work = S9xGetPPU(0x2100 + d->BAddress); + S9xSetByte(Work, (d->ABank << 16) + d->AAddress); + UPDATE_COUNTERS; + count--; + + break; + + case 1: + case 5: + CPU.InWRAMDMAorHDMA = (d->AAddress < 0x2000); + Work = S9xGetPPU(0x2100 + d->BAddress); + S9xSetByte(Work, (d->ABank << 16) + d->AAddress); + UPDATE_COUNTERS; + if (!--count) + break; + + CPU.InWRAMDMAorHDMA = (d->AAddress < 0x2000); + Work = S9xGetPPU(0x2101 + d->BAddress); + S9xSetByte(Work, (d->ABank << 16) + d->AAddress); + UPDATE_COUNTERS; + count--; + + break; + + case 3: + case 7: + CPU.InWRAMDMAorHDMA = (d->AAddress < 0x2000); + Work = S9xGetPPU(0x2100 + d->BAddress); + S9xSetByte(Work, (d->ABank << 16) + d->AAddress); + UPDATE_COUNTERS; + if (!--count) + break; + + CPU.InWRAMDMAorHDMA = (d->AAddress < 0x2000); + Work = S9xGetPPU(0x2100 + d->BAddress); + S9xSetByte(Work, (d->ABank << 16) + d->AAddress); + UPDATE_COUNTERS; + if (!--count) + break; + + CPU.InWRAMDMAorHDMA = (d->AAddress < 0x2000); + Work = S9xGetPPU(0x2101 + d->BAddress); + S9xSetByte(Work, (d->ABank << 16) + d->AAddress); + UPDATE_COUNTERS; + if (!--count) + break; + + CPU.InWRAMDMAorHDMA = (d->AAddress < 0x2000); + Work = S9xGetPPU(0x2101 + d->BAddress); + S9xSetByte(Work, (d->ABank << 16) + d->AAddress); + UPDATE_COUNTERS; + count--; + + break; + + case 4: + CPU.InWRAMDMAorHDMA = (d->AAddress < 0x2000); + Work = S9xGetPPU(0x2100 + d->BAddress); + S9xSetByte(Work, (d->ABank << 16) + d->AAddress); + UPDATE_COUNTERS; + if (!--count) + break; + + CPU.InWRAMDMAorHDMA = (d->AAddress < 0x2000); + Work = S9xGetPPU(0x2101 + d->BAddress); + S9xSetByte(Work, (d->ABank << 16) + d->AAddress); + UPDATE_COUNTERS; + if (!--count) + break; + + CPU.InWRAMDMAorHDMA = (d->AAddress < 0x2000); + Work = S9xGetPPU(0x2102 + d->BAddress); + S9xSetByte(Work, (d->ABank << 16) + d->AAddress); + UPDATE_COUNTERS; + if (!--count) + break; + + CPU.InWRAMDMAorHDMA = (d->AAddress < 0x2000); + Work = S9xGetPPU(0x2103 + d->BAddress); + S9xSetByte(Work, (d->ABank << 16) + d->AAddress); + UPDATE_COUNTERS; + count--; + + break; + + default: + #ifdef DEBUGGER + sprintf(String, "Unknown DMA transfer mode: %d on channel %d\n", d->TransferMode, Channel); + S9xMessage(S9X_TRACE, S9X_DMA_TRACE, String); + #endif + while (count) + { + UPDATE_COUNTERS; + count--; + } + + break; + } + } while (count); + } + else + { + // REVERSE-DMA FASTER PATH + CPU.InWRAMDMAorHDMA = (d->ABank == 0x7e || d->ABank == 0x7f); + do + { + switch (d->TransferMode) + { + case 0: + case 2: + case 6: + Work = S9xGetPPU(0x2100 + d->BAddress); + S9xSetByte(Work, (d->ABank << 16) + d->AAddress); + UPDATE_COUNTERS; + count--; + + break; + + case 1: + case 5: + Work = S9xGetPPU(0x2100 + d->BAddress); + S9xSetByte(Work, (d->ABank << 16) + d->AAddress); + UPDATE_COUNTERS; + if (!--count) + break; + + Work = S9xGetPPU(0x2101 + d->BAddress); + S9xSetByte(Work, (d->ABank << 16) + d->AAddress); + UPDATE_COUNTERS; + count--; + + break; + + case 3: + case 7: + Work = S9xGetPPU(0x2100 + d->BAddress); + S9xSetByte(Work, (d->ABank << 16) + d->AAddress); + UPDATE_COUNTERS; + if (!--count) + break; + + Work = S9xGetPPU(0x2100 + d->BAddress); + S9xSetByte(Work, (d->ABank << 16) + d->AAddress); + UPDATE_COUNTERS; + if (!--count) + break; + + Work = S9xGetPPU(0x2101 + d->BAddress); + S9xSetByte(Work, (d->ABank << 16) + d->AAddress); + UPDATE_COUNTERS; + if (!--count) + break; + + Work = S9xGetPPU(0x2101 + d->BAddress); + S9xSetByte(Work, (d->ABank << 16) + d->AAddress); + UPDATE_COUNTERS; + count--; + + break; + + case 4: + Work = S9xGetPPU(0x2100 + d->BAddress); + S9xSetByte(Work, (d->ABank << 16) + d->AAddress); + UPDATE_COUNTERS; + if (!--count) + break; + + Work = S9xGetPPU(0x2101 + d->BAddress); + S9xSetByte(Work, (d->ABank << 16) + d->AAddress); + UPDATE_COUNTERS; + if (!--count) + break; + + Work = S9xGetPPU(0x2102 + d->BAddress); + S9xSetByte(Work, (d->ABank << 16) + d->AAddress); + UPDATE_COUNTERS; + if (!--count) + break; + + Work = S9xGetPPU(0x2103 + d->BAddress); + S9xSetByte(Work, (d->ABank << 16) + d->AAddress); + UPDATE_COUNTERS; + count--; + + break; + + default: + #ifdef DEBUGGER + sprintf(String, "Unknown DMA transfer mode: %d on channel %d\n", d->TransferMode, Channel); + S9xMessage(S9X_TRACE, S9X_DMA_TRACE, String); + #endif + while (count) + { + UPDATE_COUNTERS; + count--; + } + + break; + } + } while (count); + } + } + + if ((CPU.Flags & NMI_FLAG) && (Timings.NMITriggerPos != 0xffff)) + { + Timings.NMITriggerPos = CPU.Cycles + Timings.NMIDMADelay; + if (Timings.NMITriggerPos >= Timings.H_Max) + Timings.NMITriggerPos -= Timings.H_Max; + } + + // Release the memory used in SPC7110 DMA + if (Settings.SPC7110) + { + if (spc7110_dma) + delete [] spc7110_dma; + } + +#if 0 + // sanity check + if (d->TransferBytes != 0) + fprintf(stderr,"DMA[%d] TransferBytes not 0! $21%02x Reverse:%d %04x\n", Channel, d->BAddress, d->ReverseTransfer, d->TransferBytes); +#endif + + CPU.InDMA = FALSE; + CPU.InDMAorHDMA = FALSE; + CPU.InWRAMDMAorHDMA = FALSE; + CPU.CurrentDMAorHDMAChannel = -1; + + return (TRUE); +} + +static inline bool8 HDMAReadLineCount (int d) +{ + // CPU.InDMA is set, so S9xGetXXX() / S9xSetXXX() incur no charges. + + uint8 line; + + line = S9xGetByte((DMA[d].ABank << 16) + DMA[d].Address); + ADD_CYCLES(SLOW_ONE_CYCLE); + + if (!line) + { + DMA[d].Repeat = FALSE; + DMA[d].LineCount = 128; + + if (DMA[d].HDMAIndirectAddressing) + { + if (PPU.HDMA & (0xfe << d)) + { + DMA[d].Address++; + ADD_CYCLES(SLOW_ONE_CYCLE << 1); + } + else + ADD_CYCLES(SLOW_ONE_CYCLE); + + DMA[d].IndirectAddress = S9xGetWord((DMA[d].ABank << 16) + DMA[d].Address); + DMA[d].Address++; + } + + DMA[d].Address++; + HDMAMemPointers[d] = NULL; + + return (FALSE); + } + else + if (line == 0x80) + { + DMA[d].Repeat = TRUE; + DMA[d].LineCount = 128; + } + else + { + DMA[d].Repeat = !(line & 0x80); + DMA[d].LineCount = line & 0x7f; + } + + DMA[d].Address++; + DMA[d].DoTransfer = TRUE; + + if (DMA[d].HDMAIndirectAddressing) + { + ADD_CYCLES(SLOW_ONE_CYCLE << 1); + DMA[d].IndirectAddress = S9xGetWord((DMA[d].ABank << 16) + DMA[d].Address); + DMA[d].Address += 2; + HDMAMemPointers[d] = S9xGetMemPointer((DMA[d].IndirectBank << 16) + DMA[d].IndirectAddress); + } + else + HDMAMemPointers[d] = S9xGetMemPointer((DMA[d].ABank << 16) + DMA[d].Address); + + return (TRUE); +} + +void S9xStartHDMA (void) +{ + if (Settings.DisableHDMA) + PPU.HDMA = 0; + else + PPU.HDMA = Memory.FillRAM[0x420c]; + +#ifdef DEBUGGER + missing.hdma_this_frame = PPU.HDMA; +#endif + + PPU.HDMAEnded = 0; + + int32 tmpch; + + CPU.InHDMA = TRUE; + CPU.InDMAorHDMA = TRUE; + tmpch = CPU.CurrentDMAorHDMAChannel; + + // XXX: Not quite right... + if (PPU.HDMA != 0) + ADD_CYCLES(Timings.DMACPUSync); + + for (uint8 i = 0; i < 8; i++) + { + if (PPU.HDMA & (1 << i)) + { + CPU.CurrentDMAorHDMAChannel = i; + + DMA[i].Address = DMA[i].AAddress; + + if (!HDMAReadLineCount(i)) + { + PPU.HDMA &= ~(1 << i); + PPU.HDMAEnded |= (1 << i); + } + } + else + DMA[i].DoTransfer = FALSE; + } + + CPU.InHDMA = FALSE; + CPU.InDMAorHDMA = CPU.InDMA; + CPU.HDMARanInDMA = CPU.InDMA ? PPU.HDMA : 0; + CPU.CurrentDMAorHDMAChannel = tmpch; +} + +uint8 S9xDoHDMA (uint8 byte) +{ + struct SDMA *p = &DMA[0]; + + uint32 ShiftedIBank; + uint16 IAddr; + bool8 temp; + int32 tmpch; + int d = 0; + + CPU.InHDMA = TRUE; + CPU.InDMAorHDMA = TRUE; + CPU.HDMARanInDMA = CPU.InDMA ? byte : 0; + temp = CPU.InWRAMDMAorHDMA; + tmpch = CPU.CurrentDMAorHDMAChannel; + + // XXX: Not quite right... + ADD_CYCLES(Timings.DMACPUSync); + + for (uint8 mask = 1; mask; mask <<= 1, p++, d++) + { + if (byte & mask) + { + CPU.InWRAMDMAorHDMA = FALSE; + CPU.CurrentDMAorHDMAChannel = d; + + if (p->HDMAIndirectAddressing) + { + ShiftedIBank = (p->IndirectBank << 16); + IAddr = p->IndirectAddress; + } + else + { + ShiftedIBank = (p->ABank << 16); + IAddr = p->Address; + } + + if (!HDMAMemPointers[d]) + HDMAMemPointers[d] = S9xGetMemPointer(ShiftedIBank + IAddr); + + if (p->DoTransfer) + { + // XXX: Hack for Uniracers, because we don't understand + // OAM Address Invalidation + if (p->BAddress == 0x04) + { + if (SNESGameFixes.Uniracers) + { + PPU.OAMAddr = 0x10c; + PPU.OAMFlip = 0; + } + } + + #ifdef DEBUGGER + if (Settings.TraceHDMA && p->DoTransfer) + { + sprintf(String, "H-DMA[%d] %s (%d) 0x%06X->0x21%02X %s, Count: %3d, Rep: %s, V-LINE: %3ld %02X%04X", + p-DMA, p->ReverseTransfer? "read" : "write", + p->TransferMode, ShiftedIBank+IAddr, p->BAddress, + p->HDMAIndirectAddressing ? "ind" : "abs", + p->LineCount, + p->Repeat ? "yes" : "no ", (long) CPU.V_Counter, + p->ABank, p->Address); + S9xMessage(S9X_TRACE, S9X_HDMA_TRACE, String); + } + #endif + + if (!p->ReverseTransfer) + { + if ((IAddr & MEMMAP_MASK) + HDMA_ModeByteCounts[p->TransferMode] >= MEMMAP_BLOCK_SIZE) + { + // HDMA REALLY-SLOW PATH + HDMAMemPointers[d] = NULL; + + #define DOBYTE(Addr, RegOff) \ + CPU.InWRAMDMAorHDMA = (ShiftedIBank == 0x7e0000 || ShiftedIBank == 0x7f0000 || \ + (!(ShiftedIBank & 0x400000) && ((uint16) (Addr)) < 0x2000)); \ + S9xSetPPU(S9xGetByte(ShiftedIBank + ((uint16) (Addr))), 0x2100 + p->BAddress + (RegOff)); + + switch (p->TransferMode) + { + case 0: + DOBYTE(IAddr, 0); + ADD_CYCLES(SLOW_ONE_CYCLE); + break; + + case 5: + DOBYTE(IAddr + 0, 0); + ADD_CYCLES(SLOW_ONE_CYCLE); + DOBYTE(IAddr + 1, 1); + ADD_CYCLES(SLOW_ONE_CYCLE); + DOBYTE(IAddr + 2, 0); + ADD_CYCLES(SLOW_ONE_CYCLE); + DOBYTE(IAddr + 3, 1); + ADD_CYCLES(SLOW_ONE_CYCLE); + break; + + case 1: + DOBYTE(IAddr + 0, 0); + ADD_CYCLES(SLOW_ONE_CYCLE); + DOBYTE(IAddr + 1, 1); + ADD_CYCLES(SLOW_ONE_CYCLE); + break; + + case 2: + case 6: + DOBYTE(IAddr + 0, 0); + ADD_CYCLES(SLOW_ONE_CYCLE); + DOBYTE(IAddr + 1, 0); + ADD_CYCLES(SLOW_ONE_CYCLE); + break; + + case 3: + case 7: + DOBYTE(IAddr + 0, 0); + ADD_CYCLES(SLOW_ONE_CYCLE); + DOBYTE(IAddr + 1, 0); + ADD_CYCLES(SLOW_ONE_CYCLE); + DOBYTE(IAddr + 2, 1); + ADD_CYCLES(SLOW_ONE_CYCLE); + DOBYTE(IAddr + 3, 1); + ADD_CYCLES(SLOW_ONE_CYCLE); + break; + + case 4: + DOBYTE(IAddr + 0, 0); + ADD_CYCLES(SLOW_ONE_CYCLE); + DOBYTE(IAddr + 1, 1); + ADD_CYCLES(SLOW_ONE_CYCLE); + DOBYTE(IAddr + 2, 2); + ADD_CYCLES(SLOW_ONE_CYCLE); + DOBYTE(IAddr + 3, 3); + ADD_CYCLES(SLOW_ONE_CYCLE); + break; + } + + #undef DOBYTE + } + else + { + CPU.InWRAMDMAorHDMA = (ShiftedIBank == 0x7e0000 || ShiftedIBank == 0x7f0000 || + (!(ShiftedIBank & 0x400000) && IAddr < 0x2000)); + + if (!HDMAMemPointers[d]) + { + // HDMA SLOW PATH + uint32 Addr = ShiftedIBank + IAddr; + + switch (p->TransferMode) + { + case 0: + S9xSetPPU(S9xGetByte(Addr), 0x2100 + p->BAddress); + ADD_CYCLES(SLOW_ONE_CYCLE); + break; + + case 5: + S9xSetPPU(S9xGetByte(Addr + 0), 0x2100 + p->BAddress); + ADD_CYCLES(SLOW_ONE_CYCLE); + S9xSetPPU(S9xGetByte(Addr + 1), 0x2101 + p->BAddress); + ADD_CYCLES(SLOW_ONE_CYCLE); + Addr += 2; + /* fall through */ + case 1: + S9xSetPPU(S9xGetByte(Addr + 0), 0x2100 + p->BAddress); + ADD_CYCLES(SLOW_ONE_CYCLE); + S9xSetPPU(S9xGetByte(Addr + 1), 0x2101 + p->BAddress); + ADD_CYCLES(SLOW_ONE_CYCLE); + break; + + case 2: + case 6: + S9xSetPPU(S9xGetByte(Addr + 0), 0x2100 + p->BAddress); + ADD_CYCLES(SLOW_ONE_CYCLE); + S9xSetPPU(S9xGetByte(Addr + 1), 0x2100 + p->BAddress); + ADD_CYCLES(SLOW_ONE_CYCLE); + break; + + case 3: + case 7: + S9xSetPPU(S9xGetByte(Addr + 0), 0x2100 + p->BAddress); + ADD_CYCLES(SLOW_ONE_CYCLE); + S9xSetPPU(S9xGetByte(Addr + 1), 0x2100 + p->BAddress); + ADD_CYCLES(SLOW_ONE_CYCLE); + S9xSetPPU(S9xGetByte(Addr + 2), 0x2101 + p->BAddress); + ADD_CYCLES(SLOW_ONE_CYCLE); + S9xSetPPU(S9xGetByte(Addr + 3), 0x2101 + p->BAddress); + ADD_CYCLES(SLOW_ONE_CYCLE); + break; + + case 4: + S9xSetPPU(S9xGetByte(Addr + 0), 0x2100 + p->BAddress); + ADD_CYCLES(SLOW_ONE_CYCLE); + S9xSetPPU(S9xGetByte(Addr + 1), 0x2101 + p->BAddress); + ADD_CYCLES(SLOW_ONE_CYCLE); + S9xSetPPU(S9xGetByte(Addr + 2), 0x2102 + p->BAddress); + ADD_CYCLES(SLOW_ONE_CYCLE); + S9xSetPPU(S9xGetByte(Addr + 3), 0x2103 + p->BAddress); + ADD_CYCLES(SLOW_ONE_CYCLE); + break; + } + } + else + { + // HDMA FAST PATH + switch (p->TransferMode) + { + case 0: + S9xSetPPU(*HDMAMemPointers[d]++, 0x2100 + p->BAddress); + ADD_CYCLES(SLOW_ONE_CYCLE); + break; + + case 5: + S9xSetPPU(*(HDMAMemPointers[d] + 0), 0x2100 + p->BAddress); + ADD_CYCLES(SLOW_ONE_CYCLE); + S9xSetPPU(*(HDMAMemPointers[d] + 1), 0x2101 + p->BAddress); + ADD_CYCLES(SLOW_ONE_CYCLE); + HDMAMemPointers[d] += 2; + /* fall through */ + case 1: + S9xSetPPU(*(HDMAMemPointers[d] + 0), 0x2100 + p->BAddress); + ADD_CYCLES(SLOW_ONE_CYCLE); + S9xSetPPU(*(HDMAMemPointers[d] + 1), 0x2101 + p->BAddress); + ADD_CYCLES(SLOW_ONE_CYCLE); + HDMAMemPointers[d] += 2; + break; + + case 2: + case 6: + S9xSetPPU(*(HDMAMemPointers[d] + 0), 0x2100 + p->BAddress); + ADD_CYCLES(SLOW_ONE_CYCLE); + S9xSetPPU(*(HDMAMemPointers[d] + 1), 0x2100 + p->BAddress); + ADD_CYCLES(SLOW_ONE_CYCLE); + HDMAMemPointers[d] += 2; + break; + + case 3: + case 7: + S9xSetPPU(*(HDMAMemPointers[d] + 0), 0x2100 + p->BAddress); + ADD_CYCLES(SLOW_ONE_CYCLE); + S9xSetPPU(*(HDMAMemPointers[d] + 1), 0x2100 + p->BAddress); + ADD_CYCLES(SLOW_ONE_CYCLE); + S9xSetPPU(*(HDMAMemPointers[d] + 2), 0x2101 + p->BAddress); + ADD_CYCLES(SLOW_ONE_CYCLE); + S9xSetPPU(*(HDMAMemPointers[d] + 3), 0x2101 + p->BAddress); + ADD_CYCLES(SLOW_ONE_CYCLE); + HDMAMemPointers[d] += 4; + break; + + case 4: + S9xSetPPU(*(HDMAMemPointers[d] + 0), 0x2100 + p->BAddress); + ADD_CYCLES(SLOW_ONE_CYCLE); + S9xSetPPU(*(HDMAMemPointers[d] + 1), 0x2101 + p->BAddress); + ADD_CYCLES(SLOW_ONE_CYCLE); + S9xSetPPU(*(HDMAMemPointers[d] + 2), 0x2102 + p->BAddress); + ADD_CYCLES(SLOW_ONE_CYCLE); + S9xSetPPU(*(HDMAMemPointers[d] + 3), 0x2103 + p->BAddress); + ADD_CYCLES(SLOW_ONE_CYCLE); + HDMAMemPointers[d] += 4; + break; + } + } + } + } + else + { + // REVERSE HDMA REALLY-SLOW PATH + // anomie says: Since this is apparently never used + // (otherwise we would have noticed before now), let's not bother with faster paths. + HDMAMemPointers[d] = NULL; + + #define DOBYTE(Addr, RegOff) \ + CPU.InWRAMDMAorHDMA = (ShiftedIBank == 0x7e0000 || ShiftedIBank == 0x7f0000 || \ + (!(ShiftedIBank & 0x400000) && ((uint16) (Addr)) < 0x2000)); \ + S9xSetByte(S9xGetPPU(0x2100 + p->BAddress + (RegOff)), ShiftedIBank + ((uint16) (Addr))); + + switch (p->TransferMode) + { + case 0: + DOBYTE(IAddr, 0); + ADD_CYCLES(SLOW_ONE_CYCLE); + break; + + case 5: + DOBYTE(IAddr + 0, 0); + ADD_CYCLES(SLOW_ONE_CYCLE); + DOBYTE(IAddr + 1, 1); + ADD_CYCLES(SLOW_ONE_CYCLE); + DOBYTE(IAddr + 2, 0); + ADD_CYCLES(SLOW_ONE_CYCLE); + DOBYTE(IAddr + 3, 1); + ADD_CYCLES(SLOW_ONE_CYCLE); + break; + + case 1: + DOBYTE(IAddr + 0, 0); + ADD_CYCLES(SLOW_ONE_CYCLE); + DOBYTE(IAddr + 1, 1); + ADD_CYCLES(SLOW_ONE_CYCLE); + break; + + case 2: + case 6: + DOBYTE(IAddr + 0, 0); + ADD_CYCLES(SLOW_ONE_CYCLE); + DOBYTE(IAddr + 1, 0); + ADD_CYCLES(SLOW_ONE_CYCLE); + break; + + case 3: + case 7: + DOBYTE(IAddr + 0, 0); + ADD_CYCLES(SLOW_ONE_CYCLE); + DOBYTE(IAddr + 1, 0); + ADD_CYCLES(SLOW_ONE_CYCLE); + DOBYTE(IAddr + 2, 1); + ADD_CYCLES(SLOW_ONE_CYCLE); + DOBYTE(IAddr + 3, 1); + ADD_CYCLES(SLOW_ONE_CYCLE); + break; + + case 4: + DOBYTE(IAddr + 0, 0); + ADD_CYCLES(SLOW_ONE_CYCLE); + DOBYTE(IAddr + 1, 1); + ADD_CYCLES(SLOW_ONE_CYCLE); + DOBYTE(IAddr + 2, 2); + ADD_CYCLES(SLOW_ONE_CYCLE); + DOBYTE(IAddr + 3, 3); + ADD_CYCLES(SLOW_ONE_CYCLE); + break; + } + + #undef DOBYTE + } + + if (p->HDMAIndirectAddressing) + p->IndirectAddress += HDMA_ModeByteCounts[p->TransferMode]; + else + p->Address += HDMA_ModeByteCounts[p->TransferMode]; + } + + p->DoTransfer = !p->Repeat; + + if (!--p->LineCount) + { + if (!HDMAReadLineCount(d)) + { + byte &= ~mask; + PPU.HDMAEnded |= mask; + p->DoTransfer = FALSE; + continue; + } + } + else + ADD_CYCLES(SLOW_ONE_CYCLE); + } + } + + CPU.InHDMA = FALSE; + CPU.InDMAorHDMA = CPU.InDMA; + CPU.InWRAMDMAorHDMA = temp; + CPU.CurrentDMAorHDMAChannel = tmpch; + + return (byte); +} + +void S9xResetDMA (void) +{ + for (int d = 0; d < 8; d++) + { + DMA[d].ReverseTransfer = TRUE; + DMA[d].HDMAIndirectAddressing = TRUE; + DMA[d].AAddressFixed = TRUE; + DMA[d].AAddressDecrement = TRUE; + DMA[d].TransferMode = 7; + DMA[d].BAddress = 0xff; + DMA[d].AAddress = 0xffff; + DMA[d].ABank = 0xff; + DMA[d].DMACount_Or_HDMAIndirectAddress = 0xffff; + DMA[d].IndirectBank = 0xff; + DMA[d].Address = 0xffff; + DMA[d].Repeat = FALSE; + DMA[d].LineCount = 0x7f; + DMA[d].UnknownByte = 0xff; + DMA[d].DoTransfer = FALSE; + DMA[d].UnusedBit43x0 = 1; + } +} diff --git a/plugins/snes9x_gx/source/snes9x/dma.h b/plugins/snes9x_gx/source/snes9x/dma.h new file mode 100644 index 00000000..c779a798 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/dma.h @@ -0,0 +1,211 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _DMA_H_ +#define _DMA_H_ + +struct SDMA +{ + bool8 ReverseTransfer; + bool8 HDMAIndirectAddressing; + bool8 UnusedBit43x0; + bool8 AAddressFixed; + bool8 AAddressDecrement; + uint8 TransferMode; + uint8 BAddress; + uint16 AAddress; + uint8 ABank; + uint16 DMACount_Or_HDMAIndirectAddress; + uint8 IndirectBank; + uint16 Address; + uint8 Repeat; + uint8 LineCount; + uint8 UnknownByte; + uint8 DoTransfer; +}; + +#define TransferBytes DMACount_Or_HDMAIndirectAddress +#define IndirectAddress DMACount_Or_HDMAIndirectAddress + +extern struct SDMA DMA[8]; + +bool8 S9xDoDMA (uint8); +void S9xStartHDMA (void); +uint8 S9xDoHDMA (uint8); +void S9xResetDMA (void); + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/dsp.cpp b/plugins/snes9x_gx/source/snes9x/dsp.cpp new file mode 100644 index 00000000..b6e23ff1 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/dsp.cpp @@ -0,0 +1,229 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#include "snes9x.h" +#include "memmap.h" +#ifdef DEBUGGER +#include "missing.h" +#endif + +uint8 (*GetDSP) (uint16) = NULL; +void (*SetDSP) (uint8, uint16) = NULL; + + +void S9xResetDSP (void) +{ + memset(&DSP1, 0, sizeof(DSP1)); + DSP1.waiting4command = TRUE; + DSP1.first_parameter = TRUE; + + memset(&DSP2, 0, sizeof(DSP2)); + DSP2.waiting4command = TRUE; + + memset(&DSP3, 0, sizeof(DSP3)); + DSP3_Reset(); + + memset(&DSP4, 0, sizeof(DSP4)); + DSP4.waiting4command = TRUE; +} + +uint8 S9xGetDSP (uint16 address) +{ +#ifdef DEBUGGER + if (Settings.TraceDSP) + { + sprintf(String, "DSP read: 0x%04X", address); + S9xMessage(S9X_TRACE, S9X_TRACE_DSP1, String); + } +#endif + + return ((*GetDSP)(address)); +} + +void S9xSetDSP (uint8 byte, uint16 address) +{ +#ifdef DEBUGGER + missing.unknowndsp_write = address; + if (Settings.TraceDSP) + { + sprintf(String, "DSP write: 0x%04X=0x%02X", address, byte); + S9xMessage(S9X_TRACE, S9X_TRACE_DSP1, String); + } +#endif + + (*SetDSP)(byte, address); +} diff --git a/plugins/snes9x_gx/source/snes9x/dsp.h b/plugins/snes9x_gx/source/snes9x/dsp.h new file mode 100644 index 00000000..be4d073f --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/dsp.h @@ -0,0 +1,618 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _DSP1_H_ +#define _DSP1_H_ + +enum +{ + M_DSP1_LOROM_S, + M_DSP1_LOROM_L, + M_DSP1_HIROM, + M_DSP2_LOROM, + M_DSP3_LOROM, + M_DSP4_LOROM +}; + +struct SDSP0 +{ + uint32 maptype; + uint32 boundary; +}; + +struct SDSP1 +{ + bool8 waiting4command; + bool8 first_parameter; + uint8 command; + uint32 in_count; + uint32 in_index; + uint32 out_count; + uint32 out_index; + uint8 parameters[512]; + uint8 output[512]; + + int16 CentreX; + int16 CentreY; + int16 VOffset; + + int16 VPlane_C; + int16 VPlane_E; + + // Azimuth and Zenith angles + int16 SinAas; + int16 CosAas; + int16 SinAzs; + int16 CosAzs; + + // Clipped Zenith angle + int16 SinAZS; + int16 CosAZS; + int16 SecAZS_C1; + int16 SecAZS_E1; + int16 SecAZS_C2; + int16 SecAZS_E2; + + int16 Nx; + int16 Ny; + int16 Nz; + int16 Gx; + int16 Gy; + int16 Gz; + int16 C_Les; + int16 E_Les; + int16 G_Les; + + int16 matrixA[3][3]; + int16 matrixB[3][3]; + int16 matrixC[3][3]; + + int16 Op00Multiplicand; + int16 Op00Multiplier; + int16 Op00Result; + + int16 Op20Multiplicand; + int16 Op20Multiplier; + int16 Op20Result; + + int16 Op10Coefficient; + int16 Op10Exponent; + int16 Op10CoefficientR; + int16 Op10ExponentR; + + int16 Op04Angle; + int16 Op04Radius; + int16 Op04Sin; + int16 Op04Cos; + + int16 Op0CA; + int16 Op0CX1; + int16 Op0CY1; + int16 Op0CX2; + int16 Op0CY2; + + int16 Op02FX; + int16 Op02FY; + int16 Op02FZ; + int16 Op02LFE; + int16 Op02LES; + int16 Op02AAS; + int16 Op02AZS; + int16 Op02VOF; + int16 Op02VVA; + int16 Op02CX; + int16 Op02CY; + + int16 Op0AVS; + int16 Op0AA; + int16 Op0AB; + int16 Op0AC; + int16 Op0AD; + + int16 Op06X; + int16 Op06Y; + int16 Op06Z; + int16 Op06H; + int16 Op06V; + int16 Op06M; + + int16 Op01m; + int16 Op01Zr; + int16 Op01Xr; + int16 Op01Yr; + + int16 Op11m; + int16 Op11Zr; + int16 Op11Xr; + int16 Op11Yr; + + int16 Op21m; + int16 Op21Zr; + int16 Op21Xr; + int16 Op21Yr; + + int16 Op0DX; + int16 Op0DY; + int16 Op0DZ; + int16 Op0DF; + int16 Op0DL; + int16 Op0DU; + + int16 Op1DX; + int16 Op1DY; + int16 Op1DZ; + int16 Op1DF; + int16 Op1DL; + int16 Op1DU; + + int16 Op2DX; + int16 Op2DY; + int16 Op2DZ; + int16 Op2DF; + int16 Op2DL; + int16 Op2DU; + + int16 Op03F; + int16 Op03L; + int16 Op03U; + int16 Op03X; + int16 Op03Y; + int16 Op03Z; + + int16 Op13F; + int16 Op13L; + int16 Op13U; + int16 Op13X; + int16 Op13Y; + int16 Op13Z; + + int16 Op23F; + int16 Op23L; + int16 Op23U; + int16 Op23X; + int16 Op23Y; + int16 Op23Z; + + int16 Op14Zr; + int16 Op14Xr; + int16 Op14Yr; + int16 Op14U; + int16 Op14F; + int16 Op14L; + int16 Op14Zrr; + int16 Op14Xrr; + int16 Op14Yrr; + + int16 Op0EH; + int16 Op0EV; + int16 Op0EX; + int16 Op0EY; + + int16 Op0BX; + int16 Op0BY; + int16 Op0BZ; + int16 Op0BS; + + int16 Op1BX; + int16 Op1BY; + int16 Op1BZ; + int16 Op1BS; + + int16 Op2BX; + int16 Op2BY; + int16 Op2BZ; + int16 Op2BS; + + int16 Op28X; + int16 Op28Y; + int16 Op28Z; + int16 Op28R; + + int16 Op1CX; + int16 Op1CY; + int16 Op1CZ; + int16 Op1CXBR; + int16 Op1CYBR; + int16 Op1CZBR; + int16 Op1CXAR; + int16 Op1CYAR; + int16 Op1CZAR; + int16 Op1CX1; + int16 Op1CY1; + int16 Op1CZ1; + int16 Op1CX2; + int16 Op1CY2; + int16 Op1CZ2; + + uint16 Op0FRamsize; + uint16 Op0FPass; + + int16 Op2FUnknown; + int16 Op2FSize; + + int16 Op08X; + int16 Op08Y; + int16 Op08Z; + int16 Op08Ll; + int16 Op08Lh; + + int16 Op18X; + int16 Op18Y; + int16 Op18Z; + int16 Op18R; + int16 Op18D; + + int16 Op38X; + int16 Op38Y; + int16 Op38Z; + int16 Op38R; + int16 Op38D; +}; + +struct SDSP2 +{ + bool8 waiting4command; + uint8 command; + uint32 in_count; + uint32 in_index; + uint32 out_count; + uint32 out_index; + uint8 parameters[512]; + uint8 output[512]; + + bool8 Op05HasLen; + int32 Op05Len; + uint8 Op05Transparent; + + bool8 Op06HasLen; + int32 Op06Len; + + uint16 Op09Word1; + uint16 Op09Word2; + + bool8 Op0DHasLen; + int32 Op0DOutLen; + int32 Op0DInLen; +}; + +struct SDSP3 +{ + uint16 DR; + uint16 SR; + uint16 MemoryIndex; + + int16 WinLo; + int16 WinHi; + int16 AddLo; + int16 AddHi; + + uint16 Codewords; + uint16 Outwords; + uint16 Symbol; + uint16 BitCount; + uint16 Index; + uint16 Codes[512]; + uint16 BitsLeft; + uint16 ReqBits; + uint16 ReqData; + uint16 BitCommand; + uint8 BaseLength; + uint16 BaseCodes; + uint16 BaseCode; + uint8 CodeLengths[8]; + uint16 CodeOffsets[8]; + uint16 LZCode; + uint8 LZLength; + + uint16 X; + uint16 Y; + + uint8 Bitmap[8]; + uint8 Bitplane[8]; + uint16 BMIndex; + uint16 BPIndex; + uint16 Count; + + int16 op3e_x; + int16 op3e_y; + + int16 op1e_terrain[0x2000]; + int16 op1e_cost[0x2000]; + int16 op1e_weight[0x2000]; + + int16 op1e_cell; + int16 op1e_turn; + int16 op1e_search; + + int16 op1e_x; + int16 op1e_y; + + int16 op1e_min_radius; + int16 op1e_max_radius; + + int16 op1e_max_search_radius; + int16 op1e_max_path_radius; + + int16 op1e_lcv_radius; + int16 op1e_lcv_steps; + int16 op1e_lcv_turns; +}; + +struct SDSP4 +{ + bool8 waiting4command; + bool8 half_command; + uint16 command; + uint32 in_count; + uint32 in_index; + uint32 out_count; + uint32 out_index; + uint8 parameters[512]; + uint8 output[512]; + uint8 byte; + uint16 address; + + // op control + int8 Logic; // controls op flow + + // projection format + int16 lcv; // loop-control variable + int16 distance; // z-position into virtual world + int16 raster; // current raster line + int16 segments; // number of raster lines drawn + + // 1.15.16 or 1.15.0 [sign, integer, fraction] + int32 world_x; // line of x-projection in world + int32 world_y; // line of y-projection in world + int32 world_dx; // projection line x-delta + int32 world_dy; // projection line y-delta + int16 world_ddx; // x-delta increment + int16 world_ddy; // y-delta increment + int32 world_xenv; // world x-shaping factor + int16 world_yofs; // world y-vertical scroll + int16 view_x1; // current viewer-x + int16 view_y1; // current viewer-y + int16 view_x2; // future viewer-x + int16 view_y2; // future viewer-y + int16 view_dx; // view x-delta factor + int16 view_dy; // view y-delta factor + int16 view_xofs1; // current viewer x-vertical scroll + int16 view_yofs1; // current viewer y-vertical scroll + int16 view_xofs2; // future viewer x-vertical scroll + int16 view_yofs2; // future viewer y-vertical scroll + int16 view_yofsenv; // y-scroll shaping factor + int16 view_turnoff_x; // road turnoff data + int16 view_turnoff_dx; // road turnoff delta factor + + // drawing area + int16 viewport_cx; // x-center of viewport window + int16 viewport_cy; // y-center of render window + int16 viewport_left; // x-left of viewport + int16 viewport_right; // x-right of viewport + int16 viewport_top; // y-top of viewport + int16 viewport_bottom; // y-bottom of viewport + + // sprite structure + int16 sprite_x; // projected x-pos of sprite + int16 sprite_y; // projected y-pos of sprite + int16 sprite_attr; // obj attributes + bool8 sprite_size; // sprite size: 8x8 or 16x16 + int16 sprite_clipy; // visible line to clip pixels off + int16 sprite_count; + + // generic projection variables designed for two solid polygons + two polygon sides + int16 poly_clipLf[2][2]; // left clip boundary + int16 poly_clipRt[2][2]; // right clip boundary + int16 poly_ptr[2][2]; // HDMA structure pointers + int16 poly_raster[2][2]; // current raster line below horizon + int16 poly_top[2][2]; // top clip boundary + int16 poly_bottom[2][2]; // bottom clip boundary + int16 poly_cx[2][2]; // center for left/right points + int16 poly_start[2]; // current projection points + int16 poly_plane[2]; // previous z-plane distance + + // OAM + int16 OAM_attr[16]; // OAM (size, MSB) data + int16 OAM_index; // index into OAM table + int16 OAM_bits; // offset into OAM table + int16 OAM_RowMax; // maximum number of tiles per 8 aligned pixels (row) + int16 OAM_Row[32]; // current number of tiles per row +}; + +extern struct SDSP0 DSP0; +extern struct SDSP1 DSP1; +extern struct SDSP2 DSP2; +extern struct SDSP3 DSP3; +extern struct SDSP4 DSP4; + +uint8 S9xGetDSP (uint16); +void S9xSetDSP (uint8, uint16); +void S9xResetDSP (void); +uint8 DSP1GetByte (uint16); +void DSP1SetByte (uint8, uint16); +uint8 DSP2GetByte (uint16); +void DSP2SetByte (uint8, uint16); +uint8 DSP3GetByte (uint16); +void DSP3SetByte (uint8, uint16); +uint8 DSP4GetByte (uint16); +void DSP4SetByte (uint8, uint16); +void DSP3_Reset (void); + +extern uint8 (*GetDSP) (uint16); +extern void (*SetDSP) (uint8, uint16); + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/dsp1.cpp b/plugins/snes9x_gx/source/snes9x/dsp1.cpp new file mode 100644 index 00000000..85f95123 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/dsp1.cpp @@ -0,0 +1,1894 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + +/* +Copyright (C) 1997-2006 ZSNES Team ( zsKnight, _Demo_, pagefault, Nach ) + +http://www.zsnes.com +http://sourceforge.net/projects/zsnes + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + + +#include "snes9x.h" +#include "memmap.h" + +#ifdef DEBUGGER +//#define DebugDSP1 +#endif + +#ifdef DebugDSP1 +#include <stdarg.h> +static FILE *LogFile = NULL; +#endif + +static const uint16 DSP1ROM[1024] = +{ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, + 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, + 0x4000, 0x7fff, 0x4000, 0x2000, 0x1000, 0x0800, 0x0400, 0x0200, + 0x0100, 0x0080, 0x0040, 0x0020, 0x0001, 0x0008, 0x0004, 0x0002, + 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8000, 0xffe5, 0x0100, 0x7fff, 0x7f02, 0x7e08, + 0x7d12, 0x7c1f, 0x7b30, 0x7a45, 0x795d, 0x7878, 0x7797, 0x76ba, + 0x75df, 0x7507, 0x7433, 0x7361, 0x7293, 0x71c7, 0x70fe, 0x7038, + 0x6f75, 0x6eb4, 0x6df6, 0x6d3a, 0x6c81, 0x6bca, 0x6b16, 0x6a64, + 0x69b4, 0x6907, 0x685b, 0x67b2, 0x670b, 0x6666, 0x65c4, 0x6523, + 0x6484, 0x63e7, 0x634c, 0x62b3, 0x621c, 0x6186, 0x60f2, 0x6060, + 0x5fd0, 0x5f41, 0x5eb5, 0x5e29, 0x5d9f, 0x5d17, 0x5c91, 0x5c0c, + 0x5b88, 0x5b06, 0x5a85, 0x5a06, 0x5988, 0x590b, 0x5890, 0x5816, + 0x579d, 0x5726, 0x56b0, 0x563b, 0x55c8, 0x5555, 0x54e4, 0x5474, + 0x5405, 0x5398, 0x532b, 0x52bf, 0x5255, 0x51ec, 0x5183, 0x511c, + 0x50b6, 0x5050, 0x4fec, 0x4f89, 0x4f26, 0x4ec5, 0x4e64, 0x4e05, + 0x4da6, 0x4d48, 0x4cec, 0x4c90, 0x4c34, 0x4bda, 0x4b81, 0x4b28, + 0x4ad0, 0x4a79, 0x4a23, 0x49cd, 0x4979, 0x4925, 0x48d1, 0x487f, + 0x482d, 0x47dc, 0x478c, 0x473c, 0x46ed, 0x469f, 0x4651, 0x4604, + 0x45b8, 0x456c, 0x4521, 0x44d7, 0x448d, 0x4444, 0x43fc, 0x43b4, + 0x436d, 0x4326, 0x42e0, 0x429a, 0x4255, 0x4211, 0x41cd, 0x4189, + 0x4146, 0x4104, 0x40c2, 0x4081, 0x4040, 0x3fff, 0x41f7, 0x43e1, + 0x45bd, 0x478d, 0x4951, 0x4b0b, 0x4cbb, 0x4e61, 0x4fff, 0x5194, + 0x5322, 0x54a9, 0x5628, 0x57a2, 0x5914, 0x5a81, 0x5be9, 0x5d4a, + 0x5ea7, 0x5fff, 0x6152, 0x62a0, 0x63ea, 0x6530, 0x6672, 0x67b0, + 0x68ea, 0x6a20, 0x6b53, 0x6c83, 0x6daf, 0x6ed9, 0x6fff, 0x7122, + 0x7242, 0x735f, 0x747a, 0x7592, 0x76a7, 0x77ba, 0x78cb, 0x79d9, + 0x7ae5, 0x7bee, 0x7cf5, 0x7dfa, 0x7efe, 0x7fff, 0x0000, 0x0324, + 0x0647, 0x096a, 0x0c8b, 0x0fab, 0x12c8, 0x15e2, 0x18f8, 0x1c0b, + 0x1f19, 0x2223, 0x2528, 0x2826, 0x2b1f, 0x2e11, 0x30fb, 0x33de, + 0x36ba, 0x398c, 0x3c56, 0x3f17, 0x41ce, 0x447a, 0x471c, 0x49b4, + 0x4c3f, 0x4ebf, 0x5133, 0x539b, 0x55f5, 0x5842, 0x5a82, 0x5cb4, + 0x5ed7, 0x60ec, 0x62f2, 0x64e8, 0x66cf, 0x68a6, 0x6a6d, 0x6c24, + 0x6dca, 0x6f5f, 0x70e2, 0x7255, 0x73b5, 0x7504, 0x7641, 0x776c, + 0x7884, 0x798a, 0x7a7d, 0x7b5d, 0x7c29, 0x7ce3, 0x7d8a, 0x7e1d, + 0x7e9d, 0x7f09, 0x7f62, 0x7fa7, 0x7fd8, 0x7ff6, 0x7fff, 0x7ff6, + 0x7fd8, 0x7fa7, 0x7f62, 0x7f09, 0x7e9d, 0x7e1d, 0x7d8a, 0x7ce3, + 0x7c29, 0x7b5d, 0x7a7d, 0x798a, 0x7884, 0x776c, 0x7641, 0x7504, + 0x73b5, 0x7255, 0x70e2, 0x6f5f, 0x6dca, 0x6c24, 0x6a6d, 0x68a6, + 0x66cf, 0x64e8, 0x62f2, 0x60ec, 0x5ed7, 0x5cb4, 0x5a82, 0x5842, + 0x55f5, 0x539b, 0x5133, 0x4ebf, 0x4c3f, 0x49b4, 0x471c, 0x447a, + 0x41ce, 0x3f17, 0x3c56, 0x398c, 0x36ba, 0x33de, 0x30fb, 0x2e11, + 0x2b1f, 0x2826, 0x2528, 0x2223, 0x1f19, 0x1c0b, 0x18f8, 0x15e2, + 0x12c8, 0x0fab, 0x0c8b, 0x096a, 0x0647, 0x0324, 0x7fff, 0x7ff6, + 0x7fd8, 0x7fa7, 0x7f62, 0x7f09, 0x7e9d, 0x7e1d, 0x7d8a, 0x7ce3, + 0x7c29, 0x7b5d, 0x7a7d, 0x798a, 0x7884, 0x776c, 0x7641, 0x7504, + 0x73b5, 0x7255, 0x70e2, 0x6f5f, 0x6dca, 0x6c24, 0x6a6d, 0x68a6, + 0x66cf, 0x64e8, 0x62f2, 0x60ec, 0x5ed7, 0x5cb4, 0x5a82, 0x5842, + 0x55f5, 0x539b, 0x5133, 0x4ebf, 0x4c3f, 0x49b4, 0x471c, 0x447a, + 0x41ce, 0x3f17, 0x3c56, 0x398c, 0x36ba, 0x33de, 0x30fb, 0x2e11, + 0x2b1f, 0x2826, 0x2528, 0x2223, 0x1f19, 0x1c0b, 0x18f8, 0x15e2, + 0x12c8, 0x0fab, 0x0c8b, 0x096a, 0x0647, 0x0324, 0x0000, 0xfcdc, + 0xf9b9, 0xf696, 0xf375, 0xf055, 0xed38, 0xea1e, 0xe708, 0xe3f5, + 0xe0e7, 0xdddd, 0xdad8, 0xd7da, 0xd4e1, 0xd1ef, 0xcf05, 0xcc22, + 0xc946, 0xc674, 0xc3aa, 0xc0e9, 0xbe32, 0xbb86, 0xb8e4, 0xb64c, + 0xb3c1, 0xb141, 0xaecd, 0xac65, 0xaa0b, 0xa7be, 0xa57e, 0xa34c, + 0xa129, 0x9f14, 0x9d0e, 0x9b18, 0x9931, 0x975a, 0x9593, 0x93dc, + 0x9236, 0x90a1, 0x8f1e, 0x8dab, 0x8c4b, 0x8afc, 0x89bf, 0x8894, + 0x877c, 0x8676, 0x8583, 0x84a3, 0x83d7, 0x831d, 0x8276, 0x81e3, + 0x8163, 0x80f7, 0x809e, 0x8059, 0x8028, 0x800a, 0x6488, 0x0080, + 0x03ff, 0x0116, 0x0002, 0x0080, 0x4000, 0x3fd7, 0x3faf, 0x3f86, + 0x3f5d, 0x3f34, 0x3f0c, 0x3ee3, 0x3eba, 0x3e91, 0x3e68, 0x3e40, + 0x3e17, 0x3dee, 0x3dc5, 0x3d9c, 0x3d74, 0x3d4b, 0x3d22, 0x3cf9, + 0x3cd0, 0x3ca7, 0x3c7f, 0x3c56, 0x3c2d, 0x3c04, 0x3bdb, 0x3bb2, + 0x3b89, 0x3b60, 0x3b37, 0x3b0e, 0x3ae5, 0x3abc, 0x3a93, 0x3a69, + 0x3a40, 0x3a17, 0x39ee, 0x39c5, 0x399c, 0x3972, 0x3949, 0x3920, + 0x38f6, 0x38cd, 0x38a4, 0x387a, 0x3851, 0x3827, 0x37fe, 0x37d4, + 0x37aa, 0x3781, 0x3757, 0x372d, 0x3704, 0x36da, 0x36b0, 0x3686, + 0x365c, 0x3632, 0x3609, 0x35df, 0x35b4, 0x358a, 0x3560, 0x3536, + 0x350c, 0x34e1, 0x34b7, 0x348d, 0x3462, 0x3438, 0x340d, 0x33e3, + 0x33b8, 0x338d, 0x3363, 0x3338, 0x330d, 0x32e2, 0x32b7, 0x328c, + 0x3261, 0x3236, 0x320b, 0x31df, 0x31b4, 0x3188, 0x315d, 0x3131, + 0x3106, 0x30da, 0x30ae, 0x3083, 0x3057, 0x302b, 0x2fff, 0x2fd2, + 0x2fa6, 0x2f7a, 0x2f4d, 0x2f21, 0x2ef4, 0x2ec8, 0x2e9b, 0x2e6e, + 0x2e41, 0x2e14, 0x2de7, 0x2dba, 0x2d8d, 0x2d60, 0x2d32, 0x2d05, + 0x2cd7, 0x2ca9, 0x2c7b, 0x2c4d, 0x2c1f, 0x2bf1, 0x2bc3, 0x2b94, + 0x2b66, 0x2b37, 0x2b09, 0x2ada, 0x2aab, 0x2a7c, 0x2a4c, 0x2a1d, + 0x29ed, 0x29be, 0x298e, 0x295e, 0x292e, 0x28fe, 0x28ce, 0x289d, + 0x286d, 0x283c, 0x280b, 0x27da, 0x27a9, 0x2777, 0x2746, 0x2714, + 0x26e2, 0x26b0, 0x267e, 0x264c, 0x2619, 0x25e7, 0x25b4, 0x2581, + 0x254d, 0x251a, 0x24e6, 0x24b2, 0x247e, 0x244a, 0x2415, 0x23e1, + 0x23ac, 0x2376, 0x2341, 0x230b, 0x22d6, 0x229f, 0x2269, 0x2232, + 0x21fc, 0x21c4, 0x218d, 0x2155, 0x211d, 0x20e5, 0x20ad, 0x2074, + 0x203b, 0x2001, 0x1fc7, 0x1f8d, 0x1f53, 0x1f18, 0x1edd, 0x1ea1, + 0x1e66, 0x1e29, 0x1ded, 0x1db0, 0x1d72, 0x1d35, 0x1cf6, 0x1cb8, + 0x1c79, 0x1c39, 0x1bf9, 0x1bb8, 0x1b77, 0x1b36, 0x1af4, 0x1ab1, + 0x1a6e, 0x1a2a, 0x19e6, 0x19a1, 0x195c, 0x1915, 0x18ce, 0x1887, + 0x183f, 0x17f5, 0x17ac, 0x1761, 0x1715, 0x16c9, 0x167c, 0x162e, + 0x15df, 0x158e, 0x153d, 0x14eb, 0x1497, 0x1442, 0x13ec, 0x1395, + 0x133c, 0x12e2, 0x1286, 0x1228, 0x11c9, 0x1167, 0x1104, 0x109e, + 0x1036, 0x0fcc, 0x0f5f, 0x0eef, 0x0e7b, 0x0e04, 0x0d89, 0x0d0a, + 0x0c86, 0x0bfd, 0x0b6d, 0x0ad6, 0x0a36, 0x098d, 0x08d7, 0x0811, + 0x0736, 0x063e, 0x0519, 0x039a, 0x0000, 0x7fff, 0x0100, 0x0080, + 0x021d, 0x00c8, 0x00ce, 0x0048, 0x0a26, 0x277a, 0x00ce, 0x6488, + 0x14ac, 0x0001, 0x00f9, 0x00fc, 0x00ff, 0x00fc, 0x00f9, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff +}; + +static const int16 DSP1_MulTable[256] = +{ + 0x0000, 0x0003, 0x0006, 0x0009, 0x000c, 0x000f, 0x0012, 0x0015, + 0x0019, 0x001c, 0x001f, 0x0022, 0x0025, 0x0028, 0x002b, 0x002f, + 0x0032, 0x0035, 0x0038, 0x003b, 0x003e, 0x0041, 0x0045, 0x0048, + 0x004b, 0x004e, 0x0051, 0x0054, 0x0057, 0x005b, 0x005e, 0x0061, + 0x0064, 0x0067, 0x006a, 0x006d, 0x0071, 0x0074, 0x0077, 0x007a, + 0x007d, 0x0080, 0x0083, 0x0087, 0x008a, 0x008d, 0x0090, 0x0093, + 0x0096, 0x0099, 0x009d, 0x00a0, 0x00a3, 0x00a6, 0x00a9, 0x00ac, + 0x00af, 0x00b3, 0x00b6, 0x00b9, 0x00bc, 0x00bf, 0x00c2, 0x00c5, + 0x00c9, 0x00cc, 0x00cf, 0x00d2, 0x00d5, 0x00d8, 0x00db, 0x00df, + 0x00e2, 0x00e5, 0x00e8, 0x00eb, 0x00ee, 0x00f1, 0x00f5, 0x00f8, + 0x00fb, 0x00fe, 0x0101, 0x0104, 0x0107, 0x010b, 0x010e, 0x0111, + 0x0114, 0x0117, 0x011a, 0x011d, 0x0121, 0x0124, 0x0127, 0x012a, + 0x012d, 0x0130, 0x0133, 0x0137, 0x013a, 0x013d, 0x0140, 0x0143, + 0x0146, 0x0149, 0x014d, 0x0150, 0x0153, 0x0156, 0x0159, 0x015c, + 0x015f, 0x0163, 0x0166, 0x0169, 0x016c, 0x016f, 0x0172, 0x0175, + 0x0178, 0x017c, 0x017f, 0x0182, 0x0185, 0x0188, 0x018b, 0x018e, + 0x0192, 0x0195, 0x0198, 0x019b, 0x019e, 0x01a1, 0x01a4, 0x01a8, + 0x01ab, 0x01ae, 0x01b1, 0x01b4, 0x01b7, 0x01ba, 0x01be, 0x01c1, + 0x01c4, 0x01c7, 0x01ca, 0x01cd, 0x01d0, 0x01d4, 0x01d7, 0x01da, + 0x01dd, 0x01e0, 0x01e3, 0x01e6, 0x01ea, 0x01ed, 0x01f0, 0x01f3, + 0x01f6, 0x01f9, 0x01fc, 0x0200, 0x0203, 0x0206, 0x0209, 0x020c, + 0x020f, 0x0212, 0x0216, 0x0219, 0x021c, 0x021f, 0x0222, 0x0225, + 0x0228, 0x022c, 0x022f, 0x0232, 0x0235, 0x0238, 0x023b, 0x023e, + 0x0242, 0x0245, 0x0248, 0x024b, 0x024e, 0x0251, 0x0254, 0x0258, + 0x025b, 0x025e, 0x0261, 0x0264, 0x0267, 0x026a, 0x026e, 0x0271, + 0x0274, 0x0277, 0x027a, 0x027d, 0x0280, 0x0284, 0x0287, 0x028a, + 0x028d, 0x0290, 0x0293, 0x0296, 0x029a, 0x029d, 0x02a0, 0x02a3, + 0x02a6, 0x02a9, 0x02ac, 0x02b0, 0x02b3, 0x02b6, 0x02b9, 0x02bc, + 0x02bf, 0x02c2, 0x02c6, 0x02c9, 0x02cc, 0x02cf, 0x02d2, 0x02d5, + 0x02d8, 0x02db, 0x02df, 0x02e2, 0x02e5, 0x02e8, 0x02eb, 0x02ee, + 0x02f1, 0x02f5, 0x02f8, 0x02fb, 0x02fe, 0x0301, 0x0304, 0x0307, + 0x030b, 0x030e, 0x0311, 0x0314, 0x0317, 0x031a, 0x031d, 0x0321 +}; + +static const int16 DSP1_SinTable[256] = +{ + 0x0000, 0x0324, 0x0647, 0x096a, 0x0c8b, 0x0fab, 0x12c8, 0x15e2, + 0x18f8, 0x1c0b, 0x1f19, 0x2223, 0x2528, 0x2826, 0x2b1f, 0x2e11, + 0x30fb, 0x33de, 0x36ba, 0x398c, 0x3c56, 0x3f17, 0x41ce, 0x447a, + 0x471c, 0x49b4, 0x4c3f, 0x4ebf, 0x5133, 0x539b, 0x55f5, 0x5842, + 0x5a82, 0x5cb4, 0x5ed7, 0x60ec, 0x62f2, 0x64e8, 0x66cf, 0x68a6, + 0x6a6d, 0x6c24, 0x6dca, 0x6f5f, 0x70e2, 0x7255, 0x73b5, 0x7504, + 0x7641, 0x776c, 0x7884, 0x798a, 0x7a7d, 0x7b5d, 0x7c29, 0x7ce3, + 0x7d8a, 0x7e1d, 0x7e9d, 0x7f09, 0x7f62, 0x7fa7, 0x7fd8, 0x7ff6, + 0x7fff, 0x7ff6, 0x7fd8, 0x7fa7, 0x7f62, 0x7f09, 0x7e9d, 0x7e1d, + 0x7d8a, 0x7ce3, 0x7c29, 0x7b5d, 0x7a7d, 0x798a, 0x7884, 0x776c, + 0x7641, 0x7504, 0x73b5, 0x7255, 0x70e2, 0x6f5f, 0x6dca, 0x6c24, + 0x6a6d, 0x68a6, 0x66cf, 0x64e8, 0x62f2, 0x60ec, 0x5ed7, 0x5cb4, + 0x5a82, 0x5842, 0x55f5, 0x539b, 0x5133, 0x4ebf, 0x4c3f, 0x49b4, + 0x471c, 0x447a, 0x41ce, 0x3f17, 0x3c56, 0x398c, 0x36ba, 0x33de, + 0x30fb, 0x2e11, 0x2b1f, 0x2826, 0x2528, 0x2223, 0x1f19, 0x1c0b, + 0x18f8, 0x15e2, 0x12c8, 0x0fab, 0x0c8b, 0x096a, 0x0647, 0x0324, + -0x0000, -0x0324, -0x0647, -0x096a, -0x0c8b, -0x0fab, -0x12c8, -0x15e2, + -0x18f8, -0x1c0b, -0x1f19, -0x2223, -0x2528, -0x2826, -0x2b1f, -0x2e11, + -0x30fb, -0x33de, -0x36ba, -0x398c, -0x3c56, -0x3f17, -0x41ce, -0x447a, + -0x471c, -0x49b4, -0x4c3f, -0x4ebf, -0x5133, -0x539b, -0x55f5, -0x5842, + -0x5a82, -0x5cb4, -0x5ed7, -0x60ec, -0x62f2, -0x64e8, -0x66cf, -0x68a6, + -0x6a6d, -0x6c24, -0x6dca, -0x6f5f, -0x70e2, -0x7255, -0x73b5, -0x7504, + -0x7641, -0x776c, -0x7884, -0x798a, -0x7a7d, -0x7b5d, -0x7c29, -0x7ce3, + -0x7d8a, -0x7e1d, -0x7e9d, -0x7f09, -0x7f62, -0x7fa7, -0x7fd8, -0x7ff6, + -0x7fff, -0x7ff6, -0x7fd8, -0x7fa7, -0x7f62, -0x7f09, -0x7e9d, -0x7e1d, + -0x7d8a, -0x7ce3, -0x7c29, -0x7b5d, -0x7a7d, -0x798a, -0x7884, -0x776c, + -0x7641, -0x7504, -0x73b5, -0x7255, -0x70e2, -0x6f5f, -0x6dca, -0x6c24, + -0x6a6d, -0x68a6, -0x66cf, -0x64e8, -0x62f2, -0x60ec, -0x5ed7, -0x5cb4, + -0x5a82, -0x5842, -0x55f5, -0x539b, -0x5133, -0x4ebf, -0x4c3f, -0x49b4, + -0x471c, -0x447a, -0x41ce, -0x3f17, -0x3c56, -0x398c, -0x36ba, -0x33de, + -0x30fb, -0x2e11, -0x2b1f, -0x2826, -0x2528, -0x2223, -0x1f19, -0x1c0b, + -0x18f8, -0x15e2, -0x12c8, -0x0fab, -0x0c8b, -0x096a, -0x0647, -0x0324 +}; + + +#ifdef DebugDSP1 + +static void Log_Message (const char *Message, ...) +{ + char Msg[400]; + va_list ap; + size_t ignore; + + va_start(ap, Message); + vsprintf(Msg, Message, ap); + va_end(ap); + + strcat(Msg, "\r\n\0"); + ignore = fwrite(Msg, strlen(Msg), 1, LogFile); + fflush(LogFile); +} + +static void Start_Log (void) +{ + LogFile = fopen("dsp1emu.log", "wb"); +} + +static void Stop_Log (void) +{ + if (LogFile) + { + fclose(LogFile); + LogFile = NULL; + } +} + +#endif + +static void DSP1_Op00 (void) +{ + DSP1.Op00Result = DSP1.Op00Multiplicand * DSP1.Op00Multiplier >> 15; + +#ifdef DebugDSP1 + Log_Message("OP00 MULT %d*%d/32768=%d", DSP1.Op00Multiplicand, DSP1.Op00Multiplier, DSP1.Op00Result); +#endif +} + +static void DSP1_Op20 (void) +{ + DSP1.Op20Result = DSP1.Op20Multiplicand * DSP1.Op20Multiplier >> 15; + DSP1.Op20Result++; + +#ifdef DebugDSP1 + Log_Message("OP20 MULT %d*%d/32768=%d", DSP1.Op20Multiplicand, DSP1.Op20Multiplier, DSP1.Op20Result); +#endif +} + +static void DSP1_Inverse (int16 Coefficient, int16 Exponent, int16 *iCoefficient, int16 *iExponent) +{ + // Step One: Division by Zero + if (Coefficient == 0x0000) + { + *iCoefficient = 0x7fff; + *iExponent = 0x002f; + } + else + { + int16 Sign = 1; + + // Step Two: Remove Sign + if (Coefficient < 0) + { + if (Coefficient < -32767) + Coefficient = -32767; + Coefficient = -Coefficient; + Sign = -1; + } + + // Step Three: Normalize + while (Coefficient < 0x4000) + { + Coefficient <<= 1; + Exponent--; + } + + // Step Four: Special Case + if (Coefficient == 0x4000) + { + if (Sign == 1) + *iCoefficient = 0x7fff; + else + { + *iCoefficient = -0x4000; + Exponent--; + } + } + else + { + // Step Five: Initial Guess + int16 i = DSP1ROM[((Coefficient - 0x4000) >> 7) + 0x0065]; + + // Step Six: Iterate "estimated" Newton's Method + i = (i + (-i * (Coefficient * i >> 15) >> 15)) << 1; + i = (i + (-i * (Coefficient * i >> 15) >> 15)) << 1; + + *iCoefficient = i * Sign; + } + + *iExponent = 1 - Exponent; + } +} + +static void DSP1_Op10 (void) +{ + DSP1_Inverse(DSP1.Op10Coefficient, DSP1.Op10Exponent, &DSP1.Op10CoefficientR, &DSP1.Op10ExponentR); + +#ifdef DebugDSP1 + Log_Message("OP10 INV %d*2^%d = %d*2^%d", DSP1.Op10Coefficient, DSP1.Op10Exponent, DSP1.Op10CoefficientR, DSP1.Op10ExponentR); +#endif +} + +static int16 DSP1_Sin (int16 Angle) +{ + int32 S; + + if (Angle < 0) + { + if (Angle == -32768) + return (0); + + return (-DSP1_Sin(-Angle)); + } + + S = DSP1_SinTable[Angle >> 8] + (DSP1_MulTable[Angle & 0xff] * DSP1_SinTable[0x40 + (Angle >> 8)] >> 15); + if (S > 32767) + S = 32767; + + return ((int16) S); +} + +static int16 DSP1_Cos (int16 Angle) +{ + int32 S; + + if (Angle < 0) + { + if (Angle == -32768) + return (-32768); + + Angle = -Angle; + } + + S = DSP1_SinTable[0x40 + (Angle >> 8)] - (DSP1_MulTable[Angle & 0xff] * DSP1_SinTable[Angle >> 8] >> 15); + if (S < -32768) + S = -32767; + + return ((int16) S); +} + +static void DSP1_Normalize (int16 m, int16 *Coefficient, int16 *Exponent) +{ + int16 i = 0x4000; + int16 e = 0; + + if (m < 0) + { + while ((m & i) && i) + { + i >>= 1; + e++; + } + } + else + { + while (!(m & i) && i) + { + i >>= 1; + e++; + } + } + + if (e > 0) + *Coefficient = m * DSP1ROM[0x21 + e] << 1; + else + *Coefficient = m; + + *Exponent -= e; +} + +static void DSP1_NormalizeDouble (int32 Product, int16 *Coefficient, int16 *Exponent) +{ + int16 n = Product & 0x7fff; + int16 m = Product >> 15; + int16 i = 0x4000; + int16 e = 0; + + if (m < 0) + { + while ((m & i) && i) + { + i >>= 1; + e++; + } + } + else + { + while (!(m & i) && i) + { + i >>= 1; + e++; + } + } + + if (e > 0) + { + *Coefficient = m * DSP1ROM[0x0021 + e] << 1; + + if (e < 15) + *Coefficient += n * DSP1ROM[0x0040 - e] >> 15; + else + { + i = 0x4000; + + if (m < 0) + { + while ((n & i) && i) + { + i >>= 1; + e++; + } + } + else + { + while (!(n & i) && i) + { + i >>= 1; + e++; + } + } + + if (e > 15) + *Coefficient = n * DSP1ROM[0x0012 + e] << 1; + else + *Coefficient += n; + } + } + else + *Coefficient = m; + + *Exponent = e; +} + +static int16 DSP1_Truncate (int16 C, int16 E) +{ + if (E > 0) + { + if (C > 0) + return (32767); + else + if (C < 0) + return (-32767); + } + else + { + if (E < 0) + return (C * DSP1ROM[0x0031 + E] >> 15); + } + + return (C); +} + +static void DSP1_Op04 (void) +{ + DSP1.Op04Sin = DSP1_Sin(DSP1.Op04Angle) * DSP1.Op04Radius >> 15; + DSP1.Op04Cos = DSP1_Cos(DSP1.Op04Angle) * DSP1.Op04Radius >> 15; +} + +static void DSP1_Op0C (void) +{ + DSP1.Op0CX2 = (DSP1.Op0CY1 * DSP1_Sin(DSP1.Op0CA) >> 15) + (DSP1.Op0CX1 * DSP1_Cos(DSP1.Op0CA) >> 15); + DSP1.Op0CY2 = (DSP1.Op0CY1 * DSP1_Cos(DSP1.Op0CA) >> 15) - (DSP1.Op0CX1 * DSP1_Sin(DSP1.Op0CA) >> 15); +} + +static void DSP1_Parameter (int16 Fx, int16 Fy, int16 Fz, int16 Lfe, int16 Les, int16 Aas, int16 Azs, int16 *Vof, int16 *Vva, int16 *Cx, int16 *Cy) +{ + const int16 MaxAZS_Exp[16] = + { + 0x38b4, 0x38b7, 0x38ba, 0x38be, 0x38c0, 0x38c4, 0x38c7, 0x38ca, + 0x38ce, 0x38d0, 0x38d4, 0x38d7, 0x38da, 0x38dd, 0x38e0, 0x38e4 + }; + + int16 CSec, C, E, MaxAZS, Aux; + int16 LfeNx, LfeNy, LfeNz; + int16 LesNx, LesNy, LesNz; + int16 CentreZ; + + // Copy Zenith angle for clipping + int16 AZS = Azs; + + // Store Sine and Cosine of Azimuth and Zenith angle + DSP1.SinAas = DSP1_Sin(Aas); + DSP1.CosAas = DSP1_Cos(Aas); + DSP1.SinAzs = DSP1_Sin(Azs); + DSP1.CosAzs = DSP1_Cos(Azs); + + DSP1.Nx = DSP1.SinAzs * -DSP1.SinAas >> 15; + DSP1.Ny = DSP1.SinAzs * DSP1.CosAas >> 15; + DSP1.Nz = DSP1.CosAzs * 0x7fff >> 15; + + LfeNx = Lfe * DSP1.Nx >> 15; + LfeNy = Lfe * DSP1.Ny >> 15; + LfeNz = Lfe * DSP1.Nz >> 15; + + // Center of Projection + DSP1.CentreX = Fx + LfeNx; + DSP1.CentreY = Fy + LfeNy; + CentreZ = Fz + LfeNz; + + LesNx = Les * DSP1.Nx >> 15; + LesNy = Les * DSP1.Ny >> 15; + LesNz = Les * DSP1.Nz >> 15; + + DSP1.Gx = DSP1.CentreX - LesNx; + DSP1.Gy = DSP1.CentreY - LesNy; + DSP1.Gz = CentreZ - LesNz; + + DSP1.E_Les = 0; + DSP1_Normalize(Les, &DSP1.C_Les, &DSP1.E_Les); + DSP1.G_Les = Les; + + E = 0; + DSP1_Normalize(CentreZ, &C, &E); + + DSP1.VPlane_C = C; + DSP1.VPlane_E = E; + + // Determine clip boundary and clip Zenith angle if necessary + MaxAZS = MaxAZS_Exp[-E]; + + if (AZS < 0) + { + MaxAZS = -MaxAZS; + if (AZS < MaxAZS + 1) + AZS = MaxAZS + 1; + } + else + { + if (AZS > MaxAZS) + AZS = MaxAZS; + } + + // Store Sine and Cosine of clipped Zenith angle + DSP1.SinAZS = DSP1_Sin(AZS); + DSP1.CosAZS = DSP1_Cos(AZS); + + DSP1_Inverse(DSP1.CosAZS, 0, &DSP1.SecAZS_C1, &DSP1.SecAZS_E1); + DSP1_Normalize(C * DSP1.SecAZS_C1 >> 15, &C, &E); + E += DSP1.SecAZS_E1; + + C = DSP1_Truncate(C, E) * DSP1.SinAZS >> 15; + + DSP1.CentreX += C * DSP1.SinAas >> 15; + DSP1.CentreY -= C * DSP1.CosAas >> 15; + + *Cx = DSP1.CentreX; + *Cy = DSP1.CentreY; + + // Raster number of imaginary center and horizontal line + *Vof = 0; + + if ((Azs != AZS) || (Azs == MaxAZS)) + { + if (Azs == -32768) + Azs = -32767; + + C = Azs - MaxAZS; + if (C >= 0) + C--; + Aux = ~(C << 2); + + C = Aux * DSP1ROM[0x0328] >> 15; + C = (C * Aux >> 15) + DSP1ROM[0x0327]; + *Vof -= (C * Aux >> 15) * Les >> 15; + + C = Aux * Aux >> 15; + Aux = (C * DSP1ROM[0x0324] >> 15) + DSP1ROM[0x0325]; + DSP1.CosAZS += (C * Aux >> 15) * DSP1.CosAZS >> 15; + } + + DSP1.VOffset = Les * DSP1.CosAZS >> 15; + + DSP1_Inverse(DSP1.SinAZS, 0, &CSec, &E); + DSP1_Normalize(DSP1.VOffset, &C, &E); + DSP1_Normalize(C * CSec >> 15, &C, &E); + + if (C == -32768) + { + C >>= 1; + E++; + } + + *Vva = DSP1_Truncate(-C, E); + + // Store Secant of clipped Zenith angle + DSP1_Inverse(DSP1.CosAZS, 0, &DSP1.SecAZS_C2, &DSP1.SecAZS_E2); +} + +static void DSP1_Raster (int16 Vs, int16 *An, int16 *Bn, int16 *Cn, int16 *Dn) +{ + int16 C, E, C1, E1; + + DSP1_Inverse((Vs * DSP1.SinAzs >> 15) + DSP1.VOffset, 7, &C, &E); + E += DSP1.VPlane_E; + + C1 = C * DSP1.VPlane_C >> 15; + E1 = E + DSP1.SecAZS_E2; + + DSP1_Normalize(C1, &C, &E); + + C = DSP1_Truncate(C, E); + + *An = C * DSP1.CosAas >> 15; + *Cn = C * DSP1.SinAas >> 15; + + DSP1_Normalize(C1 * DSP1.SecAZS_C2 >> 15, &C, &E1); + + C = DSP1_Truncate(C, E1); + + *Bn = C * -DSP1.SinAas >> 15; + *Dn = C * DSP1.CosAas >> 15; +} + +static void DSP1_Op02 (void) +{ + DSP1_Parameter(DSP1.Op02FX, DSP1.Op02FY, DSP1.Op02FZ, DSP1.Op02LFE, DSP1.Op02LES, DSP1.Op02AAS, DSP1.Op02AZS, &DSP1.Op02VOF, &DSP1.Op02VVA, &DSP1.Op02CX, &DSP1.Op02CY); +} + +static void DSP1_Op0A (void) +{ + DSP1_Raster(DSP1.Op0AVS, &DSP1.Op0AA, &DSP1.Op0AB, &DSP1.Op0AC, &DSP1.Op0AD); + DSP1.Op0AVS++; +} + +static int16 DSP1_ShiftR (int16 C, int16 E) +{ + return (C * DSP1ROM[0x0031 + E] >> 15); +} + +static void DSP1_Project (int16 X, int16 Y, int16 Z, int16 *H, int16 *V, int16 *M) +{ + int32 aux, aux4; + int16 E, E2, E3, E4, E5, refE, E6, E7; + int16 C2, C4, C6, C8, C9, C10, C11, C12, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25, C26; + int16 Px, Py, Pz; + + E4 = E3 = E2 = E = E5 = 0; + + DSP1_NormalizeDouble((int32) X - DSP1.Gx, &Px, &E4); + DSP1_NormalizeDouble((int32) Y - DSP1.Gy, &Py, &E ); + DSP1_NormalizeDouble((int32) Z - DSP1.Gz, &Pz, &E3); + Px >>= 1; // to avoid overflows when calculating the scalar products + E4--; + Py >>= 1; + E--; + Pz >>= 1; + E3--; + + refE = (E < E3) ? E : E3; + refE = (refE < E4) ? refE : E4; + + Px = DSP1_ShiftR(Px, E4 - refE); // normalize them to the same exponent + Py = DSP1_ShiftR(Py, E - refE); + Pz = DSP1_ShiftR(Pz, E3 - refE); + + C11 =- (Px * DSP1.Nx >> 15); + C8 =- (Py * DSP1.Ny >> 15); + C9 =- (Pz * DSP1.Nz >> 15); + C12 = C11 + C8 + C9; // this cannot overflow! + + aux4 = C12; // de-normalization with 32-bits arithmetic + refE = 16 - refE; // refE can be up to 3 + if (refE >= 0) + aux4 <<= (refE); + else + aux4 >>= -(refE); + if (aux4 == -1) + aux4 = 0; // why? + aux4 >>= 1; + + aux = ((uint16) DSP1.G_Les) + aux4; // Les - the scalar product of P with the normal vector of the screen + DSP1_NormalizeDouble(aux, &C10, &E2); + E2 = 15 - E2; + + DSP1_Inverse(C10, 0, &C4, &E4); + C2 = C4 * DSP1.C_Les >> 15; // scale factor + + // H + E7 = 0; + C16 = Px * ( DSP1.CosAas * 0x7fff >> 15) >> 15; + C20 = Py * ( DSP1.SinAas * 0x7fff >> 15) >> 15; + C17 = C16 + C20; // scalar product of P with the normalized horizontal vector of the screen... + + C18 = C17 * C2 >> 15; // ... multiplied by the scale factor + DSP1_Normalize(C18, &C19, &E7); + *H = DSP1_Truncate(C19, DSP1.E_Les - E2 + refE + E7); + + // V + E6 = 0; + C21 = Px * ( DSP1.CosAzs * -DSP1.SinAas >> 15) >> 15; + C22 = Py * ( DSP1.CosAzs * DSP1.CosAas >> 15) >> 15; + C23 = Pz * (-DSP1.SinAzs * 0x7fff >> 15) >> 15; + C24 = C21 + C22 + C23; // scalar product of P with the normalized vertical vector of the screen... + + C26 = C24 * C2 >> 15; // ... multiplied by the scale factor + DSP1_Normalize(C26, &C25, &E6); + *V = DSP1_Truncate(C25, DSP1.E_Les - E2 + refE + E6); + + // M + DSP1_Normalize(C2, &C6, &E4); + *M = DSP1_Truncate(C6, E4 + DSP1.E_Les - E2 - 7); // M is the scale factor divided by 2^7 +} + +static void DSP1_Op06 (void) +{ + DSP1_Project(DSP1.Op06X, DSP1.Op06Y, DSP1.Op06Z, &DSP1.Op06H, &DSP1.Op06V, &DSP1.Op06M); +} + +static void DSP1_Op01 (void) +{ + int16 SinAz = DSP1_Sin(DSP1.Op01Zr); + int16 CosAz = DSP1_Cos(DSP1.Op01Zr); + int16 SinAy = DSP1_Sin(DSP1.Op01Yr); + int16 CosAy = DSP1_Cos(DSP1.Op01Yr); + int16 SinAx = DSP1_Sin(DSP1.Op01Xr); + int16 CosAx = DSP1_Cos(DSP1.Op01Xr); + + DSP1.Op01m >>= 1; + + DSP1.matrixA[0][0] = (DSP1.Op01m * CosAz >> 15) * CosAy >> 15; + DSP1.matrixA[0][1] = -((DSP1.Op01m * SinAz >> 15) * CosAy >> 15); + DSP1.matrixA[0][2] = DSP1.Op01m * SinAy >> 15; + + DSP1.matrixA[1][0] = ((DSP1.Op01m * SinAz >> 15) * CosAx >> 15) + (((DSP1.Op01m * CosAz >> 15) * SinAx >> 15) * SinAy >> 15); + DSP1.matrixA[1][1] = ((DSP1.Op01m * CosAz >> 15) * CosAx >> 15) - (((DSP1.Op01m * SinAz >> 15) * SinAx >> 15) * SinAy >> 15); + DSP1.matrixA[1][2] = -((DSP1.Op01m * SinAx >> 15) * CosAy >> 15); + + DSP1.matrixA[2][0] = ((DSP1.Op01m * SinAz >> 15) * SinAx >> 15) - (((DSP1.Op01m * CosAz >> 15) * CosAx >> 15) * SinAy >> 15); + DSP1.matrixA[2][1] = ((DSP1.Op01m * CosAz >> 15) * SinAx >> 15) + (((DSP1.Op01m * SinAz >> 15) * CosAx >> 15) * SinAy >> 15); + DSP1.matrixA[2][2] = (DSP1.Op01m * CosAx >> 15) * CosAy >> 15; +} + +static void DSP1_Op11 (void) +{ + int16 SinAz = DSP1_Sin(DSP1.Op11Zr); + int16 CosAz = DSP1_Cos(DSP1.Op11Zr); + int16 SinAy = DSP1_Sin(DSP1.Op11Yr); + int16 CosAy = DSP1_Cos(DSP1.Op11Yr); + int16 SinAx = DSP1_Sin(DSP1.Op11Xr); + int16 CosAx = DSP1_Cos(DSP1.Op11Xr); + + DSP1.Op11m >>= 1; + + DSP1.matrixB[0][0] = (DSP1.Op11m * CosAz >> 15) * CosAy >> 15; + DSP1.matrixB[0][1] = -((DSP1.Op11m * SinAz >> 15) * CosAy >> 15); + DSP1.matrixB[0][2] = DSP1.Op11m * SinAy >> 15; + + DSP1.matrixB[1][0] = ((DSP1.Op11m * SinAz >> 15) * CosAx >> 15) + (((DSP1.Op11m * CosAz >> 15) * SinAx >> 15) * SinAy >> 15); + DSP1.matrixB[1][1] = ((DSP1.Op11m * CosAz >> 15) * CosAx >> 15) - (((DSP1.Op11m * SinAz >> 15) * SinAx >> 15) * SinAy >> 15); + DSP1.matrixB[1][2] = -((DSP1.Op11m * SinAx >> 15) * CosAy >> 15); + + DSP1.matrixB[2][0] = ((DSP1.Op11m * SinAz >> 15) * SinAx >> 15) - (((DSP1.Op11m * CosAz >> 15) * CosAx >> 15) * SinAy >> 15); + DSP1.matrixB[2][1] = ((DSP1.Op11m * CosAz >> 15) * SinAx >> 15) + (((DSP1.Op11m * SinAz >> 15) * CosAx >> 15) * SinAy >> 15); + DSP1.matrixB[2][2] = (DSP1.Op11m * CosAx >> 15) * CosAy >> 15; +} + +static void DSP1_Op21 (void) +{ + int16 SinAz = DSP1_Sin(DSP1.Op21Zr); + int16 CosAz = DSP1_Cos(DSP1.Op21Zr); + int16 SinAy = DSP1_Sin(DSP1.Op21Yr); + int16 CosAy = DSP1_Cos(DSP1.Op21Yr); + int16 SinAx = DSP1_Sin(DSP1.Op21Xr); + int16 CosAx = DSP1_Cos(DSP1.Op21Xr); + + DSP1.Op21m >>= 1; + + DSP1.matrixC[0][0] = (DSP1.Op21m * CosAz >> 15) * CosAy >> 15; + DSP1.matrixC[0][1] = -((DSP1.Op21m * SinAz >> 15) * CosAy >> 15); + DSP1.matrixC[0][2] = DSP1.Op21m * SinAy >> 15; + + DSP1.matrixC[1][0] = ((DSP1.Op21m * SinAz >> 15) * CosAx >> 15) + (((DSP1.Op21m * CosAz >> 15) * SinAx >> 15) * SinAy >> 15); + DSP1.matrixC[1][1] = ((DSP1.Op21m * CosAz >> 15) * CosAx >> 15) - (((DSP1.Op21m * SinAz >> 15) * SinAx >> 15) * SinAy >> 15); + DSP1.matrixC[1][2] = -((DSP1.Op21m * SinAx >> 15) * CosAy >> 15); + + DSP1.matrixC[2][0] = ((DSP1.Op21m * SinAz >> 15) * SinAx >> 15) - (((DSP1.Op21m * CosAz >> 15) * CosAx >> 15) * SinAy >> 15); + DSP1.matrixC[2][1] = ((DSP1.Op21m * CosAz >> 15) * SinAx >> 15) + (((DSP1.Op21m * SinAz >> 15) * CosAx >> 15) * SinAy >> 15); + DSP1.matrixC[2][2] = (DSP1.Op21m * CosAx >> 15) * CosAy >> 15; +} + +static void DSP1_Op0D (void) +{ + DSP1.Op0DF = (DSP1.Op0DX * DSP1.matrixA[0][0] >> 15) + (DSP1.Op0DY * DSP1.matrixA[0][1] >> 15) + (DSP1.Op0DZ * DSP1.matrixA[0][2] >> 15); + DSP1.Op0DL = (DSP1.Op0DX * DSP1.matrixA[1][0] >> 15) + (DSP1.Op0DY * DSP1.matrixA[1][1] >> 15) + (DSP1.Op0DZ * DSP1.matrixA[1][2] >> 15); + DSP1.Op0DU = (DSP1.Op0DX * DSP1.matrixA[2][0] >> 15) + (DSP1.Op0DY * DSP1.matrixA[2][1] >> 15) + (DSP1.Op0DZ * DSP1.matrixA[2][2] >> 15); + +#ifdef DebugDSP1 + Log_Message("OP0D X: %d Y: %d Z: %d / F: %d L: %d U: %d", DSP1.Op0DX, DSP1.Op0DY, DSP1.Op0DZ, DSP1.Op0DF, DSP1.Op0DL, DSP1.Op0DU); +#endif +} + +static void DSP1_Op1D (void) +{ + DSP1.Op1DF = (DSP1.Op1DX * DSP1.matrixB[0][0] >> 15) + (DSP1.Op1DY * DSP1.matrixB[0][1] >> 15) + (DSP1.Op1DZ * DSP1.matrixB[0][2] >> 15); + DSP1.Op1DL = (DSP1.Op1DX * DSP1.matrixB[1][0] >> 15) + (DSP1.Op1DY * DSP1.matrixB[1][1] >> 15) + (DSP1.Op1DZ * DSP1.matrixB[1][2] >> 15); + DSP1.Op1DU = (DSP1.Op1DX * DSP1.matrixB[2][0] >> 15) + (DSP1.Op1DY * DSP1.matrixB[2][1] >> 15) + (DSP1.Op1DZ * DSP1.matrixB[2][2] >> 15); + +#ifdef DebugDSP1 + Log_Message("OP1D X: %d Y: %d Z: %d / F: %d L: %d U: %d", DSP1.Op1DX, DSP1.Op1DY, DSP1.Op1DZ, DSP1.Op1DF, DSP1.Op1DL, DSP1.Op1DU); +#endif +} + +static void DSP1_Op2D (void) +{ + DSP1.Op2DF = (DSP1.Op2DX * DSP1.matrixC[0][0] >> 15) + (DSP1.Op2DY * DSP1.matrixC[0][1] >> 15) + (DSP1.Op2DZ * DSP1.matrixC[0][2] >> 15); + DSP1.Op2DL = (DSP1.Op2DX * DSP1.matrixC[1][0] >> 15) + (DSP1.Op2DY * DSP1.matrixC[1][1] >> 15) + (DSP1.Op2DZ * DSP1.matrixC[1][2] >> 15); + DSP1.Op2DU = (DSP1.Op2DX * DSP1.matrixC[2][0] >> 15) + (DSP1.Op2DY * DSP1.matrixC[2][1] >> 15) + (DSP1.Op2DZ * DSP1.matrixC[2][2] >> 15); + +#ifdef DebugDSP1 + Log_Message("OP2D X: %d Y: %d Z: %d / F: %d L: %d U: %d", DSP1.Op2DX, DSP1.Op2DY, DSP1.Op2DZ, DSP1.Op2DF, DSP1.Op2DL, DSP1.Op2DU); +#endif +} + +static void DSP1_Op03 (void) +{ + DSP1.Op03X = (DSP1.Op03F * DSP1.matrixA[0][0] >> 15) + (DSP1.Op03L * DSP1.matrixA[1][0] >> 15) + (DSP1.Op03U * DSP1.matrixA[2][0] >> 15); + DSP1.Op03Y = (DSP1.Op03F * DSP1.matrixA[0][1] >> 15) + (DSP1.Op03L * DSP1.matrixA[1][1] >> 15) + (DSP1.Op03U * DSP1.matrixA[2][1] >> 15); + DSP1.Op03Z = (DSP1.Op03F * DSP1.matrixA[0][2] >> 15) + (DSP1.Op03L * DSP1.matrixA[1][2] >> 15) + (DSP1.Op03U * DSP1.matrixA[2][2] >> 15); + +#ifdef DebugDSP1 + Log_Message("OP03 F: %d L: %d U: %d / X: %d Y: %d Z: %d", DSP1.Op03F, DSP1.Op03L, DSP1.Op03U, DSP1.Op03X, DSP1.Op03Y, DSP1.Op03Z); +#endif +} + +static void DSP1_Op13 (void) +{ + DSP1.Op13X = (DSP1.Op13F * DSP1.matrixB[0][0] >> 15) + (DSP1.Op13L * DSP1.matrixB[1][0] >> 15) + (DSP1.Op13U * DSP1.matrixB[2][0] >> 15); + DSP1.Op13Y = (DSP1.Op13F * DSP1.matrixB[0][1] >> 15) + (DSP1.Op13L * DSP1.matrixB[1][1] >> 15) + (DSP1.Op13U * DSP1.matrixB[2][1] >> 15); + DSP1.Op13Z = (DSP1.Op13F * DSP1.matrixB[0][2] >> 15) + (DSP1.Op13L * DSP1.matrixB[1][2] >> 15) + (DSP1.Op13U * DSP1.matrixB[2][2] >> 15); + +#ifdef DebugDSP1 + Log_Message("OP13 F: %d L: %d U: %d / X: %d Y: %d Z: %d", DSP1.Op13F, DSP1.Op13L, DSP1.Op13U, DSP1.Op13X, DSP1.Op13Y, DSP1.Op13Z); +#endif +} + +static void DSP1_Op23 (void) +{ + DSP1.Op23X = (DSP1.Op23F * DSP1.matrixC[0][0] >> 15) + (DSP1.Op23L * DSP1.matrixC[1][0] >> 15) + (DSP1.Op23U * DSP1.matrixC[2][0] >> 15); + DSP1.Op23Y = (DSP1.Op23F * DSP1.matrixC[0][1] >> 15) + (DSP1.Op23L * DSP1.matrixC[1][1] >> 15) + (DSP1.Op23U * DSP1.matrixC[2][1] >> 15); + DSP1.Op23Z = (DSP1.Op23F * DSP1.matrixC[0][2] >> 15) + (DSP1.Op23L * DSP1.matrixC[1][2] >> 15) + (DSP1.Op23U * DSP1.matrixC[2][2] >> 15); + +#ifdef DebugDSP1 + Log_Message("OP23 F: %d L: %d U: %d / X: %d Y: %d Z: %d", DSP1.Op23F, DSP1.Op23L, DSP1.Op23U, DSP1.Op23X, DSP1.Op23Y, DSP1.Op23Z); +#endif +} + +static void DSP1_Op14 (void) +{ + int16 CSec, ESec, CTan, CSin, C, E; + + DSP1_Inverse(DSP1_Cos(DSP1.Op14Xr), 0, &CSec, &ESec); + + // Rotation Around Z + DSP1_NormalizeDouble(DSP1.Op14U * DSP1_Cos(DSP1.Op14Yr) - DSP1.Op14F * DSP1_Sin(DSP1.Op14Yr), &C, &E); + + E = ESec - E; + + DSP1_Normalize(C * CSec >> 15, &C, &E); + + DSP1.Op14Zrr = DSP1.Op14Zr + DSP1_Truncate(C, E); + + // Rotation Around X + DSP1.Op14Xrr = DSP1.Op14Xr + (DSP1.Op14U * DSP1_Sin(DSP1.Op14Yr) >> 15) + (DSP1.Op14F * DSP1_Cos(DSP1.Op14Yr) >> 15); + + // Rotation Around Y + DSP1_NormalizeDouble(DSP1.Op14U * DSP1_Cos(DSP1.Op14Yr) + DSP1.Op14F * DSP1_Sin(DSP1.Op14Yr), &C, &E); + + E = ESec - E; + + DSP1_Normalize(DSP1_Sin(DSP1.Op14Xr), &CSin, &E); + + CTan = CSec * CSin >> 15; + + DSP1_Normalize(-(C * CTan >> 15), &C, &E); + + DSP1.Op14Yrr = DSP1.Op14Yr + DSP1_Truncate(C, E) + DSP1.Op14L; +} + +static void DSP1_Target (int16 H, int16 V, int16 *X, int16 *Y) +{ + int16 C, E, C1, E1; + + DSP1_Inverse((V * DSP1.SinAzs >> 15) + DSP1.VOffset, 8, &C, &E); + E += DSP1.VPlane_E; + + C1 = C * DSP1.VPlane_C >> 15; + E1 = E + DSP1.SecAZS_E1; + + H <<= 8; + + DSP1_Normalize(C1, &C, &E); + + C = DSP1_Truncate(C, E) * H >> 15; + + *X = DSP1.CentreX + (C * DSP1.CosAas >> 15); + *Y = DSP1.CentreY - (C * DSP1.SinAas >> 15); + + V <<= 8; + + DSP1_Normalize(C1 * DSP1.SecAZS_C1 >> 15, &C, &E1); + + C = DSP1_Truncate(C, E1) * V >> 15; + + *X += C * -DSP1.SinAas >> 15; + *Y += C * DSP1.CosAas >> 15; +} + +static void DSP1_Op0E (void) +{ + DSP1_Target(DSP1.Op0EH, DSP1.Op0EV, &DSP1.Op0EX, &DSP1.Op0EY); +} + +static void DSP1_Op0B (void) +{ + DSP1.Op0BS = (DSP1.Op0BX * DSP1.matrixA[0][0] + DSP1.Op0BY * DSP1.matrixA[0][1] + DSP1.Op0BZ * DSP1.matrixA[0][2]) >> 15; + +#ifdef DebugDSP1 + Log_Message("OP0B"); +#endif +} + +static void DSP1_Op1B (void) +{ + DSP1.Op1BS = (DSP1.Op1BX * DSP1.matrixB[0][0] + DSP1.Op1BY * DSP1.matrixB[0][1] + DSP1.Op1BZ * DSP1.matrixB[0][2]) >> 15; + +#ifdef DebugDSP1 + Log_Message("OP1B X: %d Y: %d Z: %d S: %d", DSP1.Op1BX, DSP1.Op1BY, DSP1.Op1BZ, DSP1.Op1BS); + Log_Message(" MX: %d MY: %d MZ: %d Scale: %d", (int16) (DSP1.matrixB[0][0] * 100), (int16) (DSP1.matrixB[0][1] * 100), (int16) (DSP1.matrixB[0][2] * 100), (int16) (DSP1.Op1BS * 100)); +#endif +} + +static void DSP1_Op2B (void) +{ + DSP1.Op2BS = (DSP1.Op2BX * DSP1.matrixC[0][0] + DSP1.Op2BY * DSP1.matrixC[0][1] + DSP1.Op2BZ * DSP1.matrixC[0][2]) >> 15; + +#ifdef DebugDSP1 + Log_Message("OP2B"); +#endif +} + +static void DSP1_Op08 (void) +{ + int32 op08Size = (DSP1.Op08X * DSP1.Op08X + DSP1.Op08Y * DSP1.Op08Y + DSP1.Op08Z * DSP1.Op08Z) << 1; + DSP1.Op08Ll = op08Size & 0xffff; + DSP1.Op08Lh = (op08Size >> 16) & 0xffff; + +#ifdef DebugDSP1 + Log_Message("OP08 %d,%d,%d", DSP1.Op08X, DSP1.Op08Y, DSP1.Op08Z); + Log_Message("OP08 ((OP08X^2)+(OP08Y^2)+(OP08Z^2))=%x", op08Size); +#endif +} + +static void DSP1_Op18 (void) +{ + DSP1.Op18D = (DSP1.Op18X * DSP1.Op18X + DSP1.Op18Y * DSP1.Op18Y + DSP1.Op18Z * DSP1.Op18Z - DSP1.Op18R * DSP1.Op18R) >> 15; + +#ifdef DebugDSP1 + Log_Message("OP18 X: %d Y: %d Z: %d R: %D DIFF %d", DSP1.Op18X, DSP1.Op18Y, DSP1.Op38Z, DSP1.Op18D); +#endif +} + +static void DSP1_Op38 (void) +{ + DSP1.Op38D = (DSP1.Op38X * DSP1.Op38X + DSP1.Op38Y * DSP1.Op38Y + DSP1.Op38Z * DSP1.Op38Z - DSP1.Op38R * DSP1.Op38R) >> 15; + DSP1.Op38D++; + +#ifdef DebugDSP1 + Log_Message("OP38 X: %d Y: %d Z: %d R: %D DIFF %d", DSP1.Op38X, DSP1.Op38Y, DSP1.Op38Z, DSP1.Op38D); +#endif +} + +static void DSP1_Op28 (void) +{ + int32 Radius = DSP1.Op28X * DSP1.Op28X + DSP1.Op28Y * DSP1.Op28Y + DSP1.Op28Z * DSP1.Op28Z; + + if (Radius == 0) + DSP1.Op28R = 0; + else + { + int16 C, E, Pos, Node1, Node2; + + DSP1_NormalizeDouble(Radius, &C, &E); + if (E & 1) + C = C * 0x4000 >> 15; + + Pos = C * 0x0040 >> 15; + + Node1 = DSP1ROM[0x00d5 + Pos]; + Node2 = DSP1ROM[0x00d6 + Pos]; + + DSP1.Op28R = ((Node2 - Node1) * (C & 0x1ff) >> 9) + Node1; + DSP1.Op28R >>= (E >> 1); + } + +#ifdef DebugDSP1 + Log_Message("OP28 X:%d Y:%d Z:%d", DSP1.Op28X, DSP1.Op28Y, DSP1.Op28Z); + Log_Message("OP28 Vector Length %d", DSP1.Op28R); +#endif +} + +static void DSP1_Op1C (void) +{ + // Rotate Around Op1CZ1 + DSP1.Op1CX1 = (DSP1.Op1CYBR * DSP1_Sin(DSP1.Op1CZ) >> 15) + (DSP1.Op1CXBR * DSP1_Cos(DSP1.Op1CZ) >> 15); + DSP1.Op1CY1 = (DSP1.Op1CYBR * DSP1_Cos(DSP1.Op1CZ) >> 15) - (DSP1.Op1CXBR * DSP1_Sin(DSP1.Op1CZ) >> 15); + DSP1.Op1CXBR = DSP1.Op1CX1; + DSP1.Op1CYBR = DSP1.Op1CY1; + + // Rotate Around Op1CY1 + DSP1.Op1CZ1 = (DSP1.Op1CXBR * DSP1_Sin(DSP1.Op1CY) >> 15) + (DSP1.Op1CZBR * DSP1_Cos(DSP1.Op1CY) >> 15); + DSP1.Op1CX1 = (DSP1.Op1CXBR * DSP1_Cos(DSP1.Op1CY) >> 15) - (DSP1.Op1CZBR * DSP1_Sin(DSP1.Op1CY) >> 15); + DSP1.Op1CXAR = DSP1.Op1CX1; + DSP1.Op1CZBR = DSP1.Op1CZ1; + + // Rotate Around Op1CX1 + DSP1.Op1CY1 = (DSP1.Op1CZBR * DSP1_Sin(DSP1.Op1CX) >> 15) + (DSP1.Op1CYBR * DSP1_Cos(DSP1.Op1CX) >> 15); + DSP1.Op1CZ1 = (DSP1.Op1CZBR * DSP1_Cos(DSP1.Op1CX) >> 15) - (DSP1.Op1CYBR * DSP1_Sin(DSP1.Op1CX) >> 15); + DSP1.Op1CYAR = DSP1.Op1CY1; + DSP1.Op1CZAR = DSP1.Op1CZ1; + +#ifdef DebugDSP1 + Log_Message("OP1C Apply Matrix CX:%d CY:%d CZ", DSP1.Op1CXAR, DSP1.Op1CYAR, DSP1.Op1CZAR); +#endif +} + +static void DSP1_Op0F (void) +{ + DSP1.Op0FPass = 0x0000; + +#ifdef DebugDSP1 + Log_Message("OP0F RAM Test Pass:%d", DSP1.Op0FPass); +#endif +} + +static void DSP1_Op2F (void) +{ + DSP1.Op2FSize = 0x100; +} + +void DSP1SetByte (uint8 byte, uint16 address) +{ + if (address < DSP0.boundary) + { + if ((DSP1.command == 0x0A || DSP1.command == 0x1A) && DSP1.out_count != 0) + { + DSP1.out_count--; + DSP1.out_index++; + return; + } + else + if (DSP1.waiting4command) + { + DSP1.command = byte; + DSP1.in_index = 0; + DSP1.waiting4command = FALSE; + DSP1.first_parameter = TRUE; + #ifdef DEBUGGER + //printf("OP%02X\n",byte); + #endif + + switch (byte) + { + case 0x00: DSP1.in_count = 2; break; + case 0x30: + case 0x10: DSP1.in_count = 2; break; + case 0x20: DSP1.in_count = 2; break; + case 0x24: + case 0x04: DSP1.in_count = 2; break; + case 0x08: DSP1.in_count = 3; break; + case 0x18: DSP1.in_count = 4; break; + case 0x28: DSP1.in_count = 3; break; + case 0x38: DSP1.in_count = 4; break; + case 0x2c: + case 0x0c: DSP1.in_count = 3; break; + case 0x3c: + case 0x1c: DSP1.in_count = 6; break; + case 0x32: + case 0x22: + case 0x12: + case 0x02: DSP1.in_count = 7; break; + case 0x0a: DSP1.in_count = 1; break; + case 0x3a: + case 0x2a: + case 0x1a: + DSP1.command = 0x1a; + DSP1.in_count = 1; + break; + case 0x16: + case 0x26: + case 0x36: + case 0x06: DSP1.in_count = 3; break; + case 0x1e: + case 0x2e: + case 0x3e: + case 0x0e: DSP1.in_count = 2; break; + case 0x05: + case 0x35: + case 0x31: + case 0x01: DSP1.in_count = 4; break; + case 0x15: + case 0x11: DSP1.in_count = 4; break; + case 0x25: + case 0x21: DSP1.in_count = 4; break; + case 0x09: + case 0x39: + case 0x3d: + case 0x0d: DSP1.in_count = 3; break; + case 0x19: + case 0x1d: DSP1.in_count = 3; break; + case 0x29: + case 0x2d: DSP1.in_count = 3; break; + case 0x33: + case 0x03: DSP1.in_count = 3; break; + case 0x13: DSP1.in_count = 3; break; + case 0x23: DSP1.in_count = 3; break; + case 0x3b: + case 0x0b: DSP1.in_count = 3; break; + case 0x1b: DSP1.in_count = 3; break; + case 0x2b: DSP1.in_count = 3; break; + case 0x34: + case 0x14: DSP1.in_count = 6; break; + case 0x07: + case 0x0f: DSP1.in_count = 1; break; + case 0x27: + case 0x2F: DSP1.in_count = 1; break; + case 0x17: + case 0x37: + case 0x3F: + DSP1.command = 0x1f; + case 0x1f: DSP1.in_count = 1; break; + default: + #ifdef DEBUGGER + //printf("OP%02X\n", byte); + #endif + case 0x80: + DSP1.in_count = 0; + DSP1.waiting4command = TRUE; + DSP1.first_parameter = TRUE; + break; + } + + DSP1.in_count <<= 1; + } + else + { + DSP1.parameters[DSP1.in_index] = byte; + DSP1.first_parameter = FALSE; + DSP1.in_index++; + } + + if (DSP1.waiting4command || (DSP1.first_parameter && byte == 0x80)) + { + DSP1.waiting4command = TRUE; + DSP1.first_parameter = FALSE; + } + else + if (DSP1.first_parameter && (DSP1.in_count != 0 || (DSP1.in_count == 0 && DSP1.in_index == 0))) + ; + else + { + if (DSP1.in_count) + { + if (--DSP1.in_count == 0) + { + // Actually execute the command + DSP1.waiting4command = TRUE; + DSP1.out_index = 0; + + switch (DSP1.command) + { + case 0x1f: + DSP1.out_count = 2048; + break; + + case 0x00: // Multiple + DSP1.Op00Multiplicand = (int16) (DSP1.parameters[0] | (DSP1.parameters[1] << 8)); + DSP1.Op00Multiplier = (int16) (DSP1.parameters[2] | (DSP1.parameters[3] << 8)); + + DSP1_Op00(); + + DSP1.out_count = 2; + DSP1.output[0] = DSP1.Op00Result & 0xFF; + DSP1.output[1] = (DSP1.Op00Result >> 8) & 0xFF; + break; + + case 0x20: // Multiple + DSP1.Op20Multiplicand = (int16) (DSP1.parameters[0] | (DSP1.parameters[1] << 8)); + DSP1.Op20Multiplier = (int16) (DSP1.parameters[2] | (DSP1.parameters[3] << 8)); + + DSP1_Op20(); + + DSP1.out_count = 2; + DSP1.output[0] = DSP1.Op20Result & 0xFF; + DSP1.output[1] = (DSP1.Op20Result >> 8) & 0xFF; + break; + + case 0x30: + case 0x10: // Inverse + DSP1.Op10Coefficient = (int16) (DSP1.parameters[0] | (DSP1.parameters[1] << 8)); + DSP1.Op10Exponent = (int16) (DSP1.parameters[2] | (DSP1.parameters[3] << 8)); + + DSP1_Op10(); + + DSP1.out_count = 4; + DSP1.output[0] = (uint8) ( ((int16) DSP1.Op10CoefficientR) & 0xFF); + DSP1.output[1] = (uint8) ((((int16) DSP1.Op10CoefficientR) >> 8) & 0xFF); + DSP1.output[2] = (uint8) ( ((int16) DSP1.Op10ExponentR ) & 0xFF); + DSP1.output[3] = (uint8) ((((int16) DSP1.Op10ExponentR ) >> 8) & 0xFF); + break; + + case 0x24: + case 0x04: // Sin and Cos of angle + DSP1.Op04Angle = (int16) (DSP1.parameters[0] | (DSP1.parameters[1] << 8)); + DSP1.Op04Radius = (uint16) (DSP1.parameters[2] | (DSP1.parameters[3] << 8)); + + DSP1_Op04(); + + DSP1.out_count = 4; + DSP1.output[0] = (uint8) (DSP1.Op04Sin & 0xFF); + DSP1.output[1] = (uint8) ((DSP1.Op04Sin >> 8) & 0xFF); + DSP1.output[2] = (uint8) (DSP1.Op04Cos & 0xFF); + DSP1.output[3] = (uint8) ((DSP1.Op04Cos >> 8) & 0xFF); + break; + + case 0x08: // Radius + DSP1.Op08X = (int16) (DSP1.parameters[0] | (DSP1.parameters[1] << 8)); + DSP1.Op08Y = (int16) (DSP1.parameters[2] | (DSP1.parameters[3] << 8)); + DSP1.Op08Z = (int16) (DSP1.parameters[4] | (DSP1.parameters[5] << 8)); + + DSP1_Op08(); + + DSP1.out_count = 4; + DSP1.output[0] = (uint8) ( ((int16) DSP1.Op08Ll) & 0xFF); + DSP1.output[1] = (uint8) ((((int16) DSP1.Op08Ll) >> 8) & 0xFF); + DSP1.output[2] = (uint8) ( ((int16) DSP1.Op08Lh) & 0xFF); + DSP1.output[3] = (uint8) ((((int16) DSP1.Op08Lh) >> 8) & 0xFF); + break; + + case 0x18: // Range + + DSP1.Op18X = (int16) (DSP1.parameters[0] | (DSP1.parameters[1] << 8)); + DSP1.Op18Y = (int16) (DSP1.parameters[2] | (DSP1.parameters[3] << 8)); + DSP1.Op18Z = (int16) (DSP1.parameters[4] | (DSP1.parameters[5] << 8)); + DSP1.Op18R = (int16) (DSP1.parameters[6] | (DSP1.parameters[7] << 8)); + + DSP1_Op18(); + + DSP1.out_count = 2; + DSP1.output[0] = (uint8) (DSP1.Op18D & 0xFF); + DSP1.output[1] = (uint8) ((DSP1.Op18D >> 8) & 0xFF); + break; + + case 0x38: // Range + + DSP1.Op38X = (int16) (DSP1.parameters[0] | (DSP1.parameters[1] << 8)); + DSP1.Op38Y = (int16) (DSP1.parameters[2] | (DSP1.parameters[3] << 8)); + DSP1.Op38Z = (int16) (DSP1.parameters[4] | (DSP1.parameters[5] << 8)); + DSP1.Op38R = (int16) (DSP1.parameters[6] | (DSP1.parameters[7] << 8)); + + DSP1_Op38(); + + DSP1.out_count = 2; + DSP1.output[0] = (uint8) (DSP1.Op38D & 0xFF); + DSP1.output[1] = (uint8) ((DSP1.Op38D >> 8) & 0xFF); + break; + + case 0x28: // Distance (vector length) + DSP1.Op28X = (int16) (DSP1.parameters[0] | (DSP1.parameters[1] << 8)); + DSP1.Op28Y = (int16) (DSP1.parameters[2] | (DSP1.parameters[3] << 8)); + DSP1.Op28Z = (int16) (DSP1.parameters[4] | (DSP1.parameters[5] << 8)); + + DSP1_Op28(); + + DSP1.out_count = 2; + DSP1.output[0] = (uint8) (DSP1.Op28R & 0xFF); + DSP1.output[1] = (uint8) ((DSP1.Op28R >> 8) & 0xFF); + break; + + case 0x2c: + case 0x0c: // Rotate (2D rotate) + DSP1.Op0CA = (int16) (DSP1.parameters[0] | (DSP1.parameters[1] << 8)); + DSP1.Op0CX1 = (int16) (DSP1.parameters[2] | (DSP1.parameters[3] << 8)); + DSP1.Op0CY1 = (int16) (DSP1.parameters[4] | (DSP1.parameters[5] << 8)); + + DSP1_Op0C(); + + DSP1.out_count = 4; + DSP1.output[0] = (uint8) (DSP1.Op0CX2 & 0xFF); + DSP1.output[1] = (uint8) ((DSP1.Op0CX2 >> 8) & 0xFF); + DSP1.output[2] = (uint8) (DSP1.Op0CY2 & 0xFF); + DSP1.output[3] = (uint8) ((DSP1.Op0CY2 >> 8) & 0xFF); + break; + + case 0x3c: + case 0x1c: // Polar (3D rotate) + DSP1.Op1CZ = (DSP1.parameters[ 0] | (DSP1.parameters[ 1] << 8)); + //MK: reversed X and Y on neviksti and John's advice. + DSP1.Op1CY = (DSP1.parameters[ 2] | (DSP1.parameters[ 3] << 8)); + DSP1.Op1CX = (DSP1.parameters[ 4] | (DSP1.parameters[ 5] << 8)); + DSP1.Op1CXBR = (DSP1.parameters[ 6] | (DSP1.parameters[ 7] << 8)); + DSP1.Op1CYBR = (DSP1.parameters[ 8] | (DSP1.parameters[ 9] << 8)); + DSP1.Op1CZBR = (DSP1.parameters[10] | (DSP1.parameters[11] << 8)); + + DSP1_Op1C(); + + DSP1.out_count = 6; + DSP1.output[0] = (uint8) (DSP1.Op1CXAR & 0xFF); + DSP1.output[1] = (uint8) ((DSP1.Op1CXAR >> 8) & 0xFF); + DSP1.output[2] = (uint8) (DSP1.Op1CYAR & 0xFF); + DSP1.output[3] = (uint8) ((DSP1.Op1CYAR >> 8) & 0xFF); + DSP1.output[4] = (uint8) (DSP1.Op1CZAR & 0xFF); + DSP1.output[5] = (uint8) ((DSP1.Op1CZAR >> 8) & 0xFF); + break; + + case 0x32: + case 0x22: + case 0x12: + case 0x02: // Parameter (Projection) + DSP1.Op02FX = (int16) (DSP1.parameters[ 0] | (DSP1.parameters[ 1] << 8)); + DSP1.Op02FY = (int16) (DSP1.parameters[ 2] | (DSP1.parameters[ 3] << 8)); + DSP1.Op02FZ = (int16) (DSP1.parameters[ 4] | (DSP1.parameters[ 5] << 8)); + DSP1.Op02LFE = (int16) (DSP1.parameters[ 6] | (DSP1.parameters[ 7] << 8)); + DSP1.Op02LES = (int16) (DSP1.parameters[ 8] | (DSP1.parameters[ 9] << 8)); + DSP1.Op02AAS = (uint16) (DSP1.parameters[10] | (DSP1.parameters[11] << 8)); + DSP1.Op02AZS = (uint16) (DSP1.parameters[12] | (DSP1.parameters[13] << 8)); + + DSP1_Op02(); + + DSP1.out_count = 8; + DSP1.output[0] = (uint8) (DSP1.Op02VOF & 0xFF); + DSP1.output[1] = (uint8) ((DSP1.Op02VOF >> 8) & 0xFF); + DSP1.output[2] = (uint8) (DSP1.Op02VVA & 0xFF); + DSP1.output[3] = (uint8) ((DSP1.Op02VVA >> 8) & 0xFF); + DSP1.output[4] = (uint8) (DSP1.Op02CX & 0xFF); + DSP1.output[5] = (uint8) ((DSP1.Op02CX >> 8) & 0xFF); + DSP1.output[6] = (uint8) (DSP1.Op02CY & 0xFF); + DSP1.output[7] = (uint8) ((DSP1.Op02CY >> 8) & 0xFF); + break; + + case 0x3a: + case 0x2a: + case 0x1a: // Raster mode 7 matrix data + case 0x0a: + DSP1.Op0AVS = (int16) (DSP1.parameters[0] | (DSP1.parameters[1] << 8)); + + DSP1_Op0A(); + + DSP1.out_count = 8; + DSP1.output[0] = (uint8) (DSP1.Op0AA & 0xFF); + DSP1.output[1] = (uint8) ((DSP1.Op0AA >> 8) & 0xFF); + DSP1.output[2] = (uint8) (DSP1.Op0AB & 0xFF); + DSP1.output[3] = (uint8) ((DSP1.Op0AB >> 8) & 0xFF); + DSP1.output[4] = (uint8) (DSP1.Op0AC & 0xFF); + DSP1.output[5] = (uint8) ((DSP1.Op0AC >> 8) & 0xFF); + DSP1.output[6] = (uint8) (DSP1.Op0AD & 0xFF); + DSP1.output[7] = (uint8) ((DSP1.Op0AD >> 8) & 0xFF); + DSP1.in_index = 0; + break; + + case 0x16: + case 0x26: + case 0x36: + case 0x06: // Project object + DSP1.Op06X = (int16) (DSP1.parameters[0] | (DSP1.parameters[1] << 8)); + DSP1.Op06Y = (int16) (DSP1.parameters[2] | (DSP1.parameters[3] << 8)); + DSP1.Op06Z = (int16) (DSP1.parameters[4] | (DSP1.parameters[5] << 8)); + + DSP1_Op06(); + + DSP1.out_count = 6; + DSP1.output[0] = (uint8) (DSP1.Op06H & 0xFF); + DSP1.output[1] = (uint8) ((DSP1.Op06H >> 8) & 0xFF); + DSP1.output[2] = (uint8) (DSP1.Op06V & 0xFF); + DSP1.output[3] = (uint8) ((DSP1.Op06V >> 8) & 0xFF); + DSP1.output[4] = (uint8) (DSP1.Op06M & 0xFF); + DSP1.output[5] = (uint8) ((DSP1.Op06M >> 8) & 0xFF); + break; + + case 0x1e: + case 0x2e: + case 0x3e: + case 0x0e: // Target + DSP1.Op0EH = (int16) (DSP1.parameters[0] | (DSP1.parameters[1] << 8)); + DSP1.Op0EV = (int16) (DSP1.parameters[2] | (DSP1.parameters[3] << 8)); + + DSP1_Op0E(); + + DSP1.out_count = 4; + DSP1.output[0] = (uint8) (DSP1.Op0EX & 0xFF); + DSP1.output[1] = (uint8) ((DSP1.Op0EX >> 8) & 0xFF); + DSP1.output[2] = (uint8) (DSP1.Op0EY & 0xFF); + DSP1.output[3] = (uint8) ((DSP1.Op0EY >> 8) & 0xFF); + break; + + // Extra commands used by Pilot Wings + case 0x05: + case 0x35: + case 0x31: + case 0x01: // Set attitude matrix A + DSP1.Op01m = (int16) (DSP1.parameters[0] | (DSP1.parameters[1] << 8)); + DSP1.Op01Zr = (int16) (DSP1.parameters[2] | (DSP1.parameters[3] << 8)); + DSP1.Op01Yr = (int16) (DSP1.parameters[4] | (DSP1.parameters[5] << 8)); + DSP1.Op01Xr = (int16) (DSP1.parameters[6] | (DSP1.parameters[7] << 8)); + + DSP1_Op01(); + break; + + case 0x15: + case 0x11: // Set attitude matrix B + DSP1.Op11m = (int16) (DSP1.parameters[0] | (DSP1.parameters[1] << 8)); + DSP1.Op11Zr = (int16) (DSP1.parameters[2] | (DSP1.parameters[3] << 8)); + DSP1.Op11Yr = (int16) (DSP1.parameters[4] | (DSP1.parameters[5] << 8)); + DSP1.Op11Xr = (int16) (DSP1.parameters[7] | (DSP1.parameters[7] << 8)); + + DSP1_Op11(); + break; + + case 0x25: + case 0x21: // Set attitude matrix C + DSP1.Op21m = (int16) (DSP1.parameters[0] | (DSP1.parameters[1] << 8)); + DSP1.Op21Zr = (int16) (DSP1.parameters[2] | (DSP1.parameters[3] << 8)); + DSP1.Op21Yr = (int16) (DSP1.parameters[4] | (DSP1.parameters[5] << 8)); + DSP1.Op21Xr = (int16) (DSP1.parameters[6] | (DSP1.parameters[7] << 8)); + + DSP1_Op21(); + break; + + case 0x09: + case 0x39: + case 0x3d: + case 0x0d: // Objective matrix A + DSP1.Op0DX = (int16) (DSP1.parameters[0] | (DSP1.parameters[1] << 8)); + DSP1.Op0DY = (int16) (DSP1.parameters[2] | (DSP1.parameters[3] << 8)); + DSP1.Op0DZ = (int16) (DSP1.parameters[4] | (DSP1.parameters[5] << 8)); + + DSP1_Op0D(); + + DSP1.out_count = 6; + DSP1.output [0] = (uint8) (DSP1.Op0DF & 0xFF); + DSP1.output [1] = (uint8) ((DSP1.Op0DF >> 8) & 0xFF); + DSP1.output [2] = (uint8) (DSP1.Op0DL & 0xFF); + DSP1.output [3] = (uint8) ((DSP1.Op0DL >> 8) & 0xFF); + DSP1.output [4] = (uint8) (DSP1.Op0DU & 0xFF); + DSP1.output [5] = (uint8) ((DSP1.Op0DU >> 8) & 0xFF); + break; + + case 0x19: + case 0x1d: // Objective matrix B + DSP1.Op1DX = (int16) (DSP1.parameters[0] | (DSP1.parameters[1] << 8)); + DSP1.Op1DY = (int16) (DSP1.parameters[2] | (DSP1.parameters[3] << 8)); + DSP1.Op1DZ = (int16) (DSP1.parameters[4] | (DSP1.parameters[5] << 8)); + + DSP1_Op1D(); + + DSP1.out_count = 6; + DSP1.output[0] = (uint8) (DSP1.Op1DF & 0xFF); + DSP1.output[1] = (uint8) ((DSP1.Op1DF >> 8) & 0xFF); + DSP1.output[2] = (uint8) (DSP1.Op1DL & 0xFF); + DSP1.output[3] = (uint8) ((DSP1.Op1DL >> 8) & 0xFF); + DSP1.output[4] = (uint8) (DSP1.Op1DU & 0xFF); + DSP1.output[5] = (uint8) ((DSP1.Op1DU >> 8) & 0xFF); + break; + + case 0x29: + case 0x2d: // Objective matrix C + DSP1.Op2DX = (int16) (DSP1.parameters[0] | (DSP1.parameters[1] << 8)); + DSP1.Op2DY = (int16) (DSP1.parameters[2] | (DSP1.parameters[3] << 8)); + DSP1.Op2DZ = (int16) (DSP1.parameters[4] | (DSP1.parameters[5] << 8)); + + DSP1_Op2D(); + + DSP1.out_count = 6; + DSP1.output[0] = (uint8) (DSP1.Op2DF & 0xFF); + DSP1.output[1] = (uint8) ((DSP1.Op2DF >> 8) & 0xFF); + DSP1.output[2] = (uint8) (DSP1.Op2DL & 0xFF); + DSP1.output[3] = (uint8) ((DSP1.Op2DL >> 8) & 0xFF); + DSP1.output[4] = (uint8) (DSP1.Op2DU & 0xFF); + DSP1.output[5] = (uint8) ((DSP1.Op2DU >> 8) & 0xFF); + break; + + case 0x33: + case 0x03: // Subjective matrix A + DSP1.Op03F = (int16) (DSP1.parameters[0] | (DSP1.parameters[1] << 8)); + DSP1.Op03L = (int16) (DSP1.parameters[2] | (DSP1.parameters[3] << 8)); + DSP1.Op03U = (int16) (DSP1.parameters[4] | (DSP1.parameters[5] << 8)); + + DSP1_Op03(); + + DSP1.out_count = 6; + DSP1.output[0] = (uint8) (DSP1.Op03X & 0xFF); + DSP1.output[1] = (uint8) ((DSP1.Op03X >> 8) & 0xFF); + DSP1.output[2] = (uint8) (DSP1.Op03Y & 0xFF); + DSP1.output[3] = (uint8) ((DSP1.Op03Y >> 8) & 0xFF); + DSP1.output[4] = (uint8) (DSP1.Op03Z & 0xFF); + DSP1.output[5] = (uint8) ((DSP1.Op03Z >> 8) & 0xFF); + break; + + case 0x13: // Subjective matrix B + DSP1.Op13F = (int16) (DSP1.parameters[0] | (DSP1.parameters[1] << 8)); + DSP1.Op13L = (int16) (DSP1.parameters[2] | (DSP1.parameters[3] << 8)); + DSP1.Op13U = (int16) (DSP1.parameters[4] | (DSP1.parameters[5] << 8)); + + DSP1_Op13(); + + DSP1.out_count = 6; + DSP1.output[0] = (uint8) (DSP1.Op13X & 0xFF); + DSP1.output[1] = (uint8) ((DSP1.Op13X >> 8) & 0xFF); + DSP1.output[2] = (uint8) (DSP1.Op13Y & 0xFF); + DSP1.output[3] = (uint8) ((DSP1.Op13Y >> 8) & 0xFF); + DSP1.output[4] = (uint8) (DSP1.Op13Z & 0xFF); + DSP1.output[5] = (uint8) ((DSP1.Op13Z >> 8) & 0xFF); + break; + + case 0x23: // Subjective matrix C + DSP1.Op23F = (int16) (DSP1.parameters[0] | (DSP1.parameters[1] << 8)); + DSP1.Op23L = (int16) (DSP1.parameters[2] | (DSP1.parameters[3] << 8)); + DSP1.Op23U = (int16) (DSP1.parameters[4] | (DSP1.parameters[5] << 8)); + + DSP1_Op23(); + + DSP1.out_count = 6; + DSP1.output[0] = (uint8) (DSP1.Op23X & 0xFF); + DSP1.output[1] = (uint8) ((DSP1.Op23X >> 8) & 0xFF); + DSP1.output[2] = (uint8) (DSP1.Op23Y & 0xFF); + DSP1.output[3] = (uint8) ((DSP1.Op23Y >> 8) & 0xFF); + DSP1.output[4] = (uint8) (DSP1.Op23Z & 0xFF); + DSP1.output[5] = (uint8) ((DSP1.Op23Z >> 8) & 0xFF); + break; + + case 0x3b: + case 0x0b: + DSP1.Op0BX = (int16) (DSP1.parameters[0] | (DSP1.parameters[1] << 8)); + DSP1.Op0BY = (int16) (DSP1.parameters[2] | (DSP1.parameters[3] << 8)); + DSP1.Op0BZ = (int16) (DSP1.parameters[4] | (DSP1.parameters[5] << 8)); + + DSP1_Op0B(); + + DSP1.out_count = 2; + DSP1.output[0] = (uint8) (DSP1.Op0BS & 0xFF); + DSP1.output[1] = (uint8) ((DSP1.Op0BS >> 8) & 0xFF); + break; + + case 0x1b: + DSP1.Op1BX = (int16) (DSP1.parameters[0] | (DSP1.parameters[1] << 8)); + DSP1.Op1BY = (int16) (DSP1.parameters[2] | (DSP1.parameters[3] << 8)); + DSP1.Op1BZ = (int16) (DSP1.parameters[4] | (DSP1.parameters[5] << 8)); + + DSP1_Op1B(); + + DSP1.out_count = 2; + DSP1.output[0] = (uint8) (DSP1.Op1BS & 0xFF); + DSP1.output[1] = (uint8) ((DSP1.Op1BS >> 8) & 0xFF); + break; + + case 0x2b: + DSP1.Op2BX = (int16) (DSP1.parameters[0] | (DSP1.parameters[1] << 8)); + DSP1.Op2BY = (int16) (DSP1.parameters[2] | (DSP1.parameters[3] << 8)); + DSP1.Op2BZ = (int16) (DSP1.parameters[4] | (DSP1.parameters[5] << 8)); + + DSP1_Op2B(); + + DSP1.out_count = 2; + DSP1.output[0] = (uint8) (DSP1.Op2BS & 0xFF); + DSP1.output[1] = (uint8) ((DSP1.Op2BS >> 8) & 0xFF); + break; + + case 0x34: + case 0x14: + DSP1.Op14Zr = (int16) (DSP1.parameters[ 0] | (DSP1.parameters[ 1] << 8)); + DSP1.Op14Xr = (int16) (DSP1.parameters[ 2] | (DSP1.parameters[ 3] << 8)); + DSP1.Op14Yr = (int16) (DSP1.parameters[ 4] | (DSP1.parameters[ 5] << 8)); + DSP1.Op14U = (int16) (DSP1.parameters[ 6] | (DSP1.parameters[ 7] << 8)); + DSP1.Op14F = (int16) (DSP1.parameters[ 8] | (DSP1.parameters[ 9] << 8)); + DSP1.Op14L = (int16) (DSP1.parameters[10] | (DSP1.parameters[11] << 8)); + + DSP1_Op14(); + + DSP1.out_count = 6; + DSP1.output[0] = (uint8) (DSP1.Op14Zrr & 0xFF); + DSP1.output[1] = (uint8) ((DSP1.Op14Zrr >> 8) & 0xFF); + DSP1.output[2] = (uint8) (DSP1.Op14Xrr & 0xFF); + DSP1.output[3] = (uint8) ((DSP1.Op14Xrr >> 8) & 0xFF); + DSP1.output[4] = (uint8) (DSP1.Op14Yrr & 0xFF); + DSP1.output[5] = (uint8) ((DSP1.Op14Yrr >> 8) & 0xFF); + break; + + case 0x27: + case 0x2F: + DSP1.Op2FUnknown = (int16) (DSP1.parameters[0] | (DSP1.parameters[1] << 8)); + + DSP1_Op2F(); + + DSP1.out_count = 2; + DSP1.output[0] = (uint8) (DSP1.Op2FSize & 0xFF); + DSP1.output[1] = (uint8) ((DSP1.Op2FSize >> 8) & 0xFF); + break; + + + case 0x07: + case 0x0F: + DSP1.Op0FRamsize = (int16) (DSP1.parameters[0] | (DSP1.parameters[1] << 8)); + + DSP1_Op0F(); + + DSP1.out_count = 2; + DSP1.output[0] = (uint8) (DSP1.Op0FPass & 0xFF); + DSP1.output[1] = (uint8) ((DSP1.Op0FPass >> 8) & 0xFF); + break; + + default: + break; + } + } + } + } + } +} + +uint8 DSP1GetByte (uint16 address) +{ + uint8 t; + + if (address < DSP0.boundary) + { + if (DSP1.out_count) + { + t = (uint8) DSP1.output[DSP1.out_index]; + + DSP1.out_index++; + + if (--DSP1.out_count == 0) + { + if (DSP1.command == 0x1a || DSP1.command == 0x0a) + { + DSP1_Op0A(); + DSP1.out_count = 8; + DSP1.out_index = 0; + DSP1.output[0] = DSP1.Op0AA & 0xFF; + DSP1.output[1] = (DSP1.Op0AA >> 8) & 0xFF; + DSP1.output[2] = DSP1.Op0AB & 0xFF; + DSP1.output[3] = (DSP1.Op0AB >> 8) & 0xFF; + DSP1.output[4] = DSP1.Op0AC & 0xFF; + DSP1.output[5] = (DSP1.Op0AC >> 8) & 0xFF; + DSP1.output[6] = DSP1.Op0AD & 0xFF; + DSP1.output[7] = (DSP1.Op0AD >> 8) & 0xFF; + } + + if (DSP1.command == 0x1f) + { + if ((DSP1.out_index % 2) != 0) + t = (uint8) DSP1ROM[DSP1.out_index >> 1]; + else + t = DSP1ROM[DSP1.out_index >> 1] >> 8; + } + } + + DSP1.waiting4command = TRUE; + } + else + t = 0xff; + } + else + t = 0x80; + + return (t); +} diff --git a/plugins/snes9x_gx/source/snes9x/dsp2.cpp b/plugins/snes9x_gx/source/snes9x/dsp2.cpp new file mode 100644 index 00000000..477209b4 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/dsp2.cpp @@ -0,0 +1,532 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#include "snes9x.h" +#include "memmap.h" + +static void DSP2_Op01 (void); +static void DSP2_Op03 (void); +static void DSP2_Op05 (void); +static void DSP2_Op06 (void); +static void DSP2_Op09 (void); +static void DSP2_Op0D (void); + + +// convert bitmap to bitplane tile +static void DSP2_Op01 (void) +{ + // Op01 size is always 32 bytes input and output + // The hardware does strange things if you vary the size + + uint8 c0, c1, c2, c3; + uint8 *p1 = DSP2.parameters; + uint8 *p2a = DSP2.output; + uint8 *p2b = DSP2.output + 16; // halfway + + // Process 8 blocks of 4 bytes each + + for (int j = 0; j < 8; j++) + { + c0 = *p1++; + c1 = *p1++; + c2 = *p1++; + c3 = *p1++; + + *p2a++ = (c0 & 0x10) << 3 | + (c0 & 0x01) << 6 | + (c1 & 0x10) << 1 | + (c1 & 0x01) << 4 | + (c2 & 0x10) >> 1 | + (c2 & 0x01) << 2 | + (c3 & 0x10) >> 3 | + (c3 & 0x01); + + *p2a++ = (c0 & 0x20) << 2 | + (c0 & 0x02) << 5 | + (c1 & 0x20) | + (c1 & 0x02) << 3 | + (c2 & 0x20) >> 2 | + (c2 & 0x02) << 1 | + (c3 & 0x20) >> 4 | + (c3 & 0x02) >> 1; + + *p2b++ = (c0 & 0x40) << 1 | + (c0 & 0x04) << 4 | + (c1 & 0x40) >> 1 | + (c1 & 0x04) << 2 | + (c2 & 0x40) >> 3 | + (c2 & 0x04) | + (c3 & 0x40) >> 5 | + (c3 & 0x04) >> 2; + + *p2b++ = (c0 & 0x80) | + (c0 & 0x08) << 3 | + (c1 & 0x80) >> 2 | + (c1 & 0x08) << 1 | + (c2 & 0x80) >> 4 | + (c2 & 0x08) >> 1 | + (c3 & 0x80) >> 6 | + (c3 & 0x08) >> 3; + } +} + +// set transparent color +static void DSP2_Op03 (void) +{ + DSP2.Op05Transparent = DSP2.parameters[0]; +} + +// replace bitmap using transparent color +static void DSP2_Op05 (void) +{ + // Overlay bitmap with transparency. + // Input: + // + // Bitmap 1: i[0] <=> i[size-1] + // Bitmap 2: i[size] <=> i[2*size-1] + // + // Output: + // + // Bitmap 3: o[0] <=> o[size-1] + // + // Processing: + // + // Process all 4-bit pixels (nibbles) in the bitmap + // + // if ( BM2_pixel == transparent_color ) + // pixelout = BM1_pixel + // else + // pixelout = BM2_pixel + + // The max size bitmap is limited to 255 because the size parameter is a byte + // I think size=0 is an error. The behavior of the chip on size=0 is to + // return the last value written to DR if you read DR on Op05 with + // size = 0. I don't think it's worth implementing this quirk unless it's + // proven necessary. + + uint8 color; + uint8 c1, c2; + uint8 *p1 = DSP2.parameters; + uint8 *p2 = DSP2.parameters + DSP2.Op05Len; + uint8 *p3 = DSP2.output; + + color = DSP2.Op05Transparent & 0x0f; + + for (int32 n = 0; n < DSP2.Op05Len; n++) + { + c1 = *p1++; + c2 = *p2++; + *p3++ = (((c2 >> 4) == color) ? c1 & 0xf0: c2 & 0xf0) | (((c2 & 0x0f) == color) ? c1 & 0x0f: c2 & 0x0f); + } +} + +// reverse bitmap +static void DSP2_Op06 (void) +{ + // Input: + // size + // bitmap + + for (int32 i = 0, j = DSP2.Op06Len - 1; i < DSP2.Op06Len; i++, j--) + DSP2.output[j] = (DSP2.parameters[i] << 4) | (DSP2.parameters[i] >> 4); +} + +// multiply +static void DSP2_Op09 (void) +{ + DSP2.Op09Word1 = DSP2.parameters[0] | (DSP2.parameters[1] << 8); + DSP2.Op09Word2 = DSP2.parameters[2] | (DSP2.parameters[3] << 8); + + uint32 temp = DSP2.Op09Word1 * DSP2.Op09Word2; + DSP2.output[0] = temp & 0xFF; + DSP2.output[1] = (temp >> 8) & 0xFF; + DSP2.output[2] = (temp >> 16) & 0xFF; + DSP2.output[3] = (temp >> 24) & 0xFF; +} + +// scale bitmap +static void DSP2_Op0D (void) +{ + // Bit accurate hardware algorithm - uses fixed point math + // This should match the DSP2 Op0D output exactly + // I wouldn't recommend using this unless you're doing hardware debug. + // In some situations it has small visual artifacts that + // are not readily apparent on a TV screen but show up clearly + // on a monitor. Use Overload's scaling instead. + // This is for hardware verification testing. + // + // One note: the HW can do odd byte scaling but since we divide + // by two to get the count of bytes this won't work well for + // odd byte scaling (in any of the current algorithm implementations). + // So far I haven't seen Dungeon Master use it. + // If it does we can adjust the parameters and code to work with it + + uint32 multiplier; // Any size int >= 32-bits + uint32 pixloc; // match size of multiplier + uint8 pixelarray[512]; + + if (DSP2.Op0DInLen <= DSP2.Op0DOutLen) + multiplier = 0x10000; // In our self defined fixed point 0x10000 == 1 + else + multiplier = (DSP2.Op0DInLen << 17) / ((DSP2.Op0DOutLen << 1) + 1); + + pixloc = 0; + + for (int32 i = 0; i < DSP2.Op0DOutLen * 2; i++) + { + int32 j = pixloc >> 16; + + if (j & 1) + pixelarray[i] = DSP2.parameters[j >> 1] & 0x0f; + else + pixelarray[i] = (DSP2.parameters[j >> 1] & 0xf0) >> 4; + + pixloc += multiplier; + } + + for (int32 i = 0; i < DSP2.Op0DOutLen; i++) + DSP2.output[i] = (pixelarray[i << 1] << 4) | pixelarray[(i << 1) + 1]; +} + +/* +static void DSP2_Op0D (void) +{ + // Overload's algorithm - use this unless doing hardware testing + + // One note: the HW can do odd byte scaling but since we divide + // by two to get the count of bytes this won't work well for + // odd byte scaling (in any of the current algorithm implementations). + // So far I haven't seen Dungeon Master use it. + // If it does we can adjust the parameters and code to work with it + + int32 pixel_offset; + uint8 pixelarray[512]; + + for (int32 i = 0; i < DSP2.Op0DOutLen * 2; i++) + { + pixel_offset = (i * DSP2.Op0DInLen) / DSP2.Op0DOutLen; + + if ((pixel_offset & 1) == 0) + pixelarray[i] = DSP2.parameters[pixel_offset >> 1] >> 4; + else + pixelarray[i] = DSP2.parameters[pixel_offset >> 1] & 0x0f; + } + + for (int32 i = 0; i < DSP2.Op0DOutLen; i++) + DSP2.output[i] = (pixelarray[i << 1] << 4) | pixelarray[(i << 1) + 1]; +} +*/ + +void DSP2SetByte (uint8 byte, uint16 address) +{ + if ((address & 0xf000) == 0x6000 || (address >= 0x8000 && address < 0xc000)) + { + if (DSP2.waiting4command) + { + DSP2.command = byte; + DSP2.in_index = 0; + DSP2.waiting4command = FALSE; + + switch (byte) + { + case 0x01: DSP2.in_count = 32; break; + case 0x03: DSP2.in_count = 1; break; + case 0x05: DSP2.in_count = 1; break; + case 0x06: DSP2.in_count = 1; break; + case 0x09: DSP2.in_count = 4; break; + case 0x0D: DSP2.in_count = 2; break; + default: + #ifdef DEBUGGER + //printf("Op%02X\n", byte); + #endif + case 0x0f: DSP2.in_count = 0; break; + } + } + else + { + DSP2.parameters[DSP2.in_index] = byte; + DSP2.in_index++; + } + + if (DSP2.in_count == DSP2.in_index) + { + DSP2.waiting4command = TRUE; + DSP2.out_index = 0; + + switch (DSP2.command) + { + case 0x01: + DSP2.out_count = 32; + DSP2_Op01(); + break; + + case 0x03: + DSP2_Op03(); + break; + + case 0x05: + if (DSP2.Op05HasLen) + { + DSP2.Op05HasLen = FALSE; + DSP2.out_count = DSP2.Op05Len; + DSP2_Op05(); + } + else + { + DSP2.Op05Len = DSP2.parameters[0]; + DSP2.in_index = 0; + DSP2.in_count = 2 * DSP2.Op05Len; + DSP2.Op05HasLen = TRUE; + if (byte) + DSP2.waiting4command = FALSE; + } + + break; + + case 0x06: + if (DSP2.Op06HasLen) + { + DSP2.Op06HasLen = FALSE; + DSP2.out_count = DSP2.Op06Len; + DSP2_Op06(); + } + else + { + DSP2.Op06Len = DSP2.parameters[0]; + DSP2.in_index = 0; + DSP2.in_count = DSP2.Op06Len; + DSP2.Op06HasLen = TRUE; + if (byte) + DSP2.waiting4command = FALSE; + } + + break; + + case 0x09: + DSP2.out_count = 4; + DSP2_Op09(); + break; + + case 0x0D: + if (DSP2.Op0DHasLen) + { + DSP2.Op0DHasLen = FALSE; + DSP2.out_count = DSP2.Op0DOutLen; + DSP2_Op0D(); + } + else + { + DSP2.Op0DInLen = DSP2.parameters[0]; + DSP2.Op0DOutLen = DSP2.parameters[1]; + DSP2.in_index = 0; + DSP2.in_count = (DSP2.Op0DInLen + 1) >> 1; + DSP2.Op0DHasLen = TRUE; + if (byte) + DSP2.waiting4command = FALSE; + } + + break; + + case 0x0f: + default: + break; + } + } + } +} + +uint8 DSP2GetByte (uint16 address) +{ + uint8 t; + + if ((address & 0xf000) == 0x6000 || (address >= 0x8000 && address < 0xc000)) + { + if (DSP2.out_count) + { + t = (uint8) DSP2.output[DSP2.out_index]; + DSP2.out_index++; + if (DSP2.out_count == DSP2.out_index) + DSP2.out_count = 0; + } + else + t = 0xff; + } + else + t = 0x80; + + return (t); +} diff --git a/plugins/snes9x_gx/source/snes9x/dsp3.cpp b/plugins/snes9x_gx/source/snes9x/dsp3.cpp new file mode 100644 index 00000000..5c792403 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/dsp3.cpp @@ -0,0 +1,1268 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#include "snes9x.h" +#include "memmap.h" + +static void (*SetDSP3) (void); + +static const uint16 DSP3_DataROM[1024] = +{ + 0x8000, 0x4000, 0x2000, 0x1000, 0x0800, 0x0400, 0x0200, 0x0100, + 0x0080, 0x0040, 0x0020, 0x0010, 0x0008, 0x0004, 0x0002, 0x0001, + 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, + 0x0000, 0x000f, 0x0400, 0x0200, 0x0140, 0x0400, 0x0200, 0x0040, + 0x007d, 0x007e, 0x007e, 0x007b, 0x007c, 0x007d, 0x007b, 0x007c, + 0x0002, 0x0020, 0x0030, 0x0000, 0x000d, 0x0019, 0x0026, 0x0032, + 0x003e, 0x004a, 0x0056, 0x0062, 0x006d, 0x0079, 0x0084, 0x008e, + 0x0098, 0x00a2, 0x00ac, 0x00b5, 0x00be, 0x00c6, 0x00ce, 0x00d5, + 0x00dc, 0x00e2, 0x00e7, 0x00ec, 0x00f1, 0x00f5, 0x00f8, 0x00fb, + 0x00fd, 0x00ff, 0x0100, 0x0100, 0x0100, 0x00ff, 0x00fd, 0x00fb, + 0x00f8, 0x00f5, 0x00f1, 0x00ed, 0x00e7, 0x00e2, 0x00dc, 0x00d5, + 0x00ce, 0x00c6, 0x00be, 0x00b5, 0x00ac, 0x00a2, 0x0099, 0x008e, + 0x0084, 0x0079, 0x006e, 0x0062, 0x0056, 0x004a, 0x003e, 0x0032, + 0x0026, 0x0019, 0x000d, 0x0000, 0xfff3, 0xffe7, 0xffdb, 0xffce, + 0xffc2, 0xffb6, 0xffaa, 0xff9e, 0xff93, 0xff87, 0xff7d, 0xff72, + 0xff68, 0xff5e, 0xff54, 0xff4b, 0xff42, 0xff3a, 0xff32, 0xff2b, + 0xff25, 0xff1e, 0xff19, 0xff14, 0xff0f, 0xff0b, 0xff08, 0xff05, + 0xff03, 0xff01, 0xff00, 0xff00, 0xff00, 0xff01, 0xff03, 0xff05, + 0xff08, 0xff0b, 0xff0f, 0xff13, 0xff18, 0xff1e, 0xff24, 0xff2b, + 0xff32, 0xff3a, 0xff42, 0xff4b, 0xff54, 0xff5d, 0xff67, 0xff72, + 0xff7c, 0xff87, 0xff92, 0xff9e, 0xffa9, 0xffb5, 0xffc2, 0xffce, + 0xffda, 0xffe7, 0xfff3, 0x002b, 0x007f, 0x0020, 0x00ff, 0xff00, + 0xffbe, 0x0000, 0x0044, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xffc1, 0x0001, 0x0002, 0x0045, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffc5, 0x0003, 0x0004, 0x0005, 0x0047, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xffca, 0x0006, 0x0007, 0x0008, + 0x0009, 0x004a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffd0, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x004e, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xffd7, 0x000f, 0x0010, 0x0011, + 0x0012, 0x0013, 0x0014, 0x0053, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffdf, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, + 0x0059, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xffe8, 0x001c, 0x001d, 0x001e, + 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0060, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xfff2, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, + 0x002b, 0x002c, 0x0068, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xfffd, 0x002d, 0x002e, 0x002f, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0071, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffc7, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, + 0x003e, 0x003f, 0x0040, 0x0041, 0x007b, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xffd4, 0x0000, 0x0001, 0x0002, + 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, + 0x000b, 0x0044, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffe2, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, + 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0050, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xfff1, 0x0019, 0x001a, 0x001b, + 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, + 0x0024, 0x0025, 0x0026, 0x005d, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffcb, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, + 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, + 0x006b, 0x0000, 0x0000, 0x0000, 0xffdc, 0x0000, 0x0001, 0x0002, + 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, + 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0044, 0x0000, 0x0000, + 0xffee, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, + 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, + 0x001f, 0x0020, 0x0054, 0x0000, 0xffee, 0x0021, 0x0022, 0x0023, + 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, + 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0065, + 0xffbe, 0x0000, 0xfeac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xffc1, 0x0001, 0x0002, 0xfead, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffc5, 0x0003, 0x0004, 0x0005, 0xfeaf, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xffca, 0x0006, 0x0007, 0x0008, + 0x0009, 0xfeb2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffd0, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0xfeb6, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xffd7, 0x000f, 0x0010, 0x0011, + 0x0012, 0x0013, 0x0014, 0xfebb, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffdf, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, + 0xfec1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xffe8, 0x001c, 0x001d, 0x001e, + 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0xfec8, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xfff2, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, + 0x002b, 0x002c, 0xfed0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xfffd, 0x002d, 0x002e, 0x002f, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0xfed9, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffc7, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, + 0x003e, 0x003f, 0x0040, 0x0041, 0xfee3, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xffd4, 0x0000, 0x0001, 0x0002, + 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, + 0x000b, 0xfeac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffe2, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, + 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0xfeb8, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xfff1, 0x0019, 0x001a, 0x001b, + 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, + 0x0024, 0x0025, 0x0026, 0xfec5, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffcb, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, + 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, + 0xfed3, 0x0000, 0x0000, 0x0000, 0xffdc, 0x0000, 0x0001, 0x0002, + 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, + 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0xfeac, 0x0000, 0x0000, + 0xffee, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, + 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, + 0x001f, 0x0020, 0xfebc, 0x0000, 0xffee, 0x0021, 0x0022, 0x0023, + 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, + 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0xfecd, + 0x0154, 0x0218, 0x0110, 0x00b0, 0x00cc, 0x00b0, 0x0088, 0x00b0, + 0x0044, 0x00b0, 0x0000, 0x00b0, 0x00fe, 0xff07, 0x0002, 0x00ff, + 0x00f8, 0x0007, 0x00fe, 0x00ee, 0x07ff, 0x0200, 0x00ef, 0xf800, + 0x0700, 0x00ee, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, + 0xffff, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, + 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0x0001, 0x0000, 0x0001, + 0x0001, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, + 0xffff, 0x0001, 0x0000, 0x0001, 0x0001, 0x0000, 0x0000, 0xffff, + 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0044, 0x0088, 0x00cc, + 0x0110, 0x0154, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff +}; + +static bool8 DSP3_GetBits (uint8); +//static void DSP3_MemorySize (void); +static void DSP3_TestMemory (void); +static void DSP3_DumpDataROM (void); +static void DSP3_MemoryDump (void); +static void DSP3_Coordinate (void); +static void DSP3_Command (void); +static void DSP3_Decode_Data (void); +static void DSP3_Decode_Tree (void); +static void DSP3_Decode_Symbols (void); +static void DSP3_Decode (void); +static void DSP3_Decode_A (void); +static void DSP3_Convert (void); +static void DSP3_Convert_A (void); +static void DSP3_OP03 (void); +static void DSP3_OP06 (void); +static void DSP3_OP07 (void); +static void DSP3_OP07_A (void); +static void DSP3_OP07_B (void); +static void DSP3_OP0C (void); +//static void DSP3_OP0C_A (void); +static void DSP3_OP10 (void); +static void DSP3_OP1C (void); +static void DSP3_OP1C_A (void); +static void DSP3_OP1C_B (void); +static void DSP3_OP1C_C (void); +static void DSP3_OP1E (void); +static void DSP3_OP1E_A (void); +static void DSP3_OP1E_A1 (void); +static void DSP3_OP1E_A2 (void); +static void DSP3_OP1E_A3 (void); +static void DSP3_OP1E_B (void); +static void DSP3_OP1E_B1 (void); +static void DSP3_OP1E_B2 (void); +static void DSP3_OP1E_C (void); +static void DSP3_OP1E_C1 (void); +static void DSP3_OP1E_C2 (void); +static void DSP3_OP1E_D (int16, int16 *, int16 *); +static void DSP3_OP1E_D1 (int16, int16 *, int16 *); +static void DSP3_OP3E (void); + + +void DSP3_Reset (void) +{ + DSP3.DR = 0x0080; + DSP3.SR = 0x0084; + SetDSP3 = &DSP3_Command; +} + +/* +static void DSP3_MemorySize (void) +{ + DSP3.DR = 0x0300; + SetDSP3 = &DSP3_Reset; +} +*/ + +static void DSP3_TestMemory (void) +{ + DSP3.DR = 0x0000; + SetDSP3 = &DSP3_Reset; +} + +static void DSP3_DumpDataROM (void) +{ + DSP3.DR = DSP3_DataROM[DSP3.MemoryIndex++]; + if (DSP3.MemoryIndex == 1024) + SetDSP3 = &DSP3_Reset; +} + +static void DSP3_MemoryDump (void) +{ + DSP3.MemoryIndex = 0; + SetDSP3 = &DSP3_DumpDataROM; + DSP3_DumpDataROM(); +} + +static void DSP3_OP06 (void) +{ + DSP3.WinLo = (uint8) (DSP3.DR); + DSP3.WinHi = (uint8) (DSP3.DR >> 8); + DSP3_Reset(); +} + +static void DSP3_OP03 (void) +{ + int16 Lo = (uint8) (DSP3.DR); + int16 Hi = (uint8) (DSP3.DR >> 8); + int16 Ofs = (DSP3.WinLo * Hi << 1) + (Lo << 1); + + DSP3.DR = Ofs >> 1; + SetDSP3 = &DSP3_Reset; +} + +static void DSP3_OP07_B (void) +{ + int16 Ofs = (DSP3.WinLo * DSP3.AddHi << 1) + (DSP3.AddLo << 1); + + DSP3.DR = Ofs >> 1; + SetDSP3 = &DSP3_Reset; +} + +static void DSP3_OP07_A (void) +{ + int16 Lo = (uint8) (DSP3.DR); + int16 Hi = (uint8) (DSP3.DR >> 8); + + if (Lo & 1) + Hi += (DSP3.AddLo & 1); + + DSP3.AddLo += Lo; + DSP3.AddHi += Hi; + + if (DSP3.AddLo < 0) + DSP3.AddLo += DSP3.WinLo; + else + if (DSP3.AddLo >= DSP3.WinLo) + DSP3.AddLo -= DSP3.WinLo; + + if (DSP3.AddHi < 0) + DSP3.AddHi += DSP3.WinHi; + else + if (DSP3.AddHi >= DSP3.WinHi) + DSP3.AddHi -= DSP3.WinHi; + + DSP3.DR = DSP3.AddLo | (DSP3.AddHi << 8) | ((DSP3.AddHi >> 8) & 0xff); + SetDSP3 = &DSP3_OP07_B; +} + +static void DSP3_OP07 (void) +{ + uint32 dataOfs = ((DSP3.DR << 1) + 0x03b2) & 0x03ff; + + DSP3.AddHi = DSP3_DataROM[dataOfs]; + DSP3.AddLo = DSP3_DataROM[dataOfs + 1]; + + SetDSP3 = &DSP3_OP07_A; + DSP3.SR = 0x0080; +} + +static void DSP3_Coordinate (void) +{ + DSP3.Index++; + + switch (DSP3.Index) + { + case 3: + if (DSP3.DR == 0xffff) + DSP3_Reset(); + break; + + case 4: + DSP3.X = DSP3.DR; + break; + + case 5: + DSP3.Y = DSP3.DR; + DSP3.DR = 1; + break; + + case 6: + DSP3.DR = DSP3.X; + break; + + case 7: + DSP3.DR = DSP3.Y; + DSP3.Index = 0; + break; + } +} + +static void DSP3_Convert_A (void) +{ + if (DSP3.BMIndex < 8) + { + DSP3.Bitmap[DSP3.BMIndex++] = (uint8) (DSP3.DR); + DSP3.Bitmap[DSP3.BMIndex++] = (uint8) (DSP3.DR >> 8); + + if (DSP3.BMIndex == 8) + { + for (int i = 0; i < 8; i++) + { + for (int j = 0; j < 8; j++) + { + DSP3.Bitplane[j] <<= 1; + DSP3.Bitplane[j] |= (DSP3.Bitmap[i] >> j) & 1; + } + } + + DSP3.BPIndex = 0; + DSP3.Count--; + } + } + + if (DSP3.BMIndex == 8) + { + if (DSP3.BPIndex == 8) + { + if (!DSP3.Count) + DSP3_Reset(); + + DSP3.BMIndex = 0; + } + else + { + DSP3.DR = DSP3.Bitplane[DSP3.BPIndex++]; + DSP3.DR |= DSP3.Bitplane[DSP3.BPIndex++] << 8; + } + } +} + +static void DSP3_Convert (void) +{ + DSP3.Count = DSP3.DR; + DSP3.BMIndex = 0; + SetDSP3 = &DSP3_Convert_A; +} + +static bool8 DSP3_GetBits (uint8 Count) +{ + if (!DSP3.BitsLeft) + { + DSP3.BitsLeft = Count; + DSP3.ReqBits = 0; + } + + do + { + if (!DSP3.BitCount) + { + DSP3.SR = 0xC0; + return (FALSE); + } + + DSP3.ReqBits <<= 1; + if (DSP3.ReqData & 0x8000) + DSP3.ReqBits++; + DSP3.ReqData <<= 1; + + DSP3.BitCount--; + DSP3.BitsLeft--; + + } + while (DSP3.BitsLeft); + + return (TRUE); +} + +static void DSP3_Decode_Data (void) +{ + if (!DSP3.BitCount) + { + if (DSP3.SR & 0x40) + { + DSP3.ReqData = DSP3.DR; + DSP3.BitCount += 16; + } + else + { + DSP3.SR = 0xC0; + return; + } + } + + if (DSP3.LZCode == 1) + { + if (!DSP3_GetBits(1)) + return; + + if (DSP3.ReqBits) + DSP3.LZLength = 12; + else + DSP3.LZLength = 8; + + DSP3.LZCode++; + } + + if (DSP3.LZCode == 2) + { + if (!DSP3_GetBits(DSP3.LZLength)) + return; + + DSP3.LZCode = 0; + DSP3.Outwords--; + if (!DSP3.Outwords) + SetDSP3 = &DSP3_Reset; + + DSP3.SR = 0x80; + DSP3.DR = DSP3.ReqBits; + return; + } + + if (DSP3.BaseCode == 0xffff) + { + if (!DSP3_GetBits(DSP3.BaseLength)) + return; + + DSP3.BaseCode = DSP3.ReqBits; + } + + if (!DSP3_GetBits(DSP3.CodeLengths[DSP3.BaseCode])) + return; + + DSP3.Symbol = DSP3.Codes[DSP3.CodeOffsets[DSP3.BaseCode] + DSP3.ReqBits]; + DSP3.BaseCode = 0xffff; + + if (DSP3.Symbol & 0xff00) + { + DSP3.Symbol += 0x7f02; + DSP3.LZCode++; + } + else + { + DSP3.Outwords--; + if (!DSP3.Outwords) + SetDSP3 = &DSP3_Reset; + } + + DSP3.SR = 0x80; + DSP3.DR = DSP3.Symbol; +} + +static void DSP3_Decode_Tree (void) +{ + if (!DSP3.BitCount) + { + DSP3.ReqData = DSP3.DR; + DSP3.BitCount += 16; + } + + if (!DSP3.BaseCodes) + { + DSP3_GetBits(1); + + if (DSP3.ReqBits) + { + DSP3.BaseLength = 3; + DSP3.BaseCodes = 8; + } + else + { + DSP3.BaseLength = 2; + DSP3.BaseCodes = 4; + } + } + + while (DSP3.BaseCodes) + { + if (!DSP3_GetBits(3)) + return; + + DSP3.ReqBits++; + + DSP3.CodeLengths[DSP3.Index] = (uint8) DSP3.ReqBits; + DSP3.CodeOffsets[DSP3.Index] = DSP3.Symbol; + DSP3.Index++; + + DSP3.Symbol += 1 << DSP3.ReqBits; + DSP3.BaseCodes--; + } + + DSP3.BaseCode = 0xffff; + DSP3.LZCode = 0; + + SetDSP3 = &DSP3_Decode_Data; + if (DSP3.BitCount) + DSP3_Decode_Data(); +} + +static void DSP3_Decode_Symbols (void) +{ + DSP3.ReqData = DSP3.DR; + DSP3.BitCount += 16; + + do + { + if (DSP3.BitCommand == 0xffff) + { + if (!DSP3_GetBits(2)) + return; + + DSP3.BitCommand = DSP3.ReqBits; + } + + switch (DSP3.BitCommand) + { + case 0: + if (!DSP3_GetBits(9)) + return; + DSP3.Symbol = DSP3.ReqBits; + break; + + case 1: + DSP3.Symbol++; + break; + + case 2: + if (!DSP3_GetBits(1)) + return; + DSP3.Symbol += 2 + DSP3.ReqBits; + break; + + case 3: + if (!DSP3_GetBits(4)) + return; + DSP3.Symbol += 4 + DSP3.ReqBits; + break; + } + + DSP3.BitCommand = 0xffff; + + DSP3.Codes[DSP3.Index++] = DSP3.Symbol; + DSP3.Codewords--; + + } + while (DSP3.Codewords); + + DSP3.Index = 0; + DSP3.Symbol = 0; + DSP3.BaseCodes = 0; + + SetDSP3 = &DSP3_Decode_Tree; + if (DSP3.BitCount) + DSP3_Decode_Tree(); +} + +static void DSP3_Decode_A (void) +{ + DSP3.Outwords = DSP3.DR; + SetDSP3 = &DSP3_Decode_Symbols; + DSP3.BitCount = 0; + DSP3.BitsLeft = 0; + DSP3.Symbol = 0; + DSP3.Index = 0; + DSP3.BitCommand = 0xffff; + DSP3.SR = 0xC0; +} + +static void DSP3_Decode (void) +{ + DSP3.Codewords = DSP3.DR; + SetDSP3 = &DSP3_Decode_A; +} + +// Opcodes 1E/3E bit-perfect to 'dsp3-intro' log +// src: adapted from SD Gundam X/G-Next + +static void DSP3_OP3E (void) +{ + DSP3. op3e_x = (uint8) (DSP3.DR & 0x00ff); + DSP3. op3e_y = (uint8) ((DSP3.DR & 0xff00) >> 8); + + DSP3_OP03(); + + DSP3.op1e_terrain[DSP3.DR] = 0x00; + DSP3.op1e_cost[DSP3.DR] = 0xff; + DSP3.op1e_weight[DSP3.DR] = 0; + + DSP3.op1e_max_search_radius = 0; + DSP3.op1e_max_path_radius = 0; +} + +static void DSP3_OP1E (void) +{ + DSP3.op1e_min_radius = (uint8) (DSP3.DR & 0x00ff); + DSP3.op1e_max_radius = (uint8) ((DSP3.DR & 0xff00) >> 8); + + if (DSP3.op1e_min_radius == 0) + DSP3.op1e_min_radius++; + + if (DSP3.op1e_max_search_radius >= DSP3.op1e_min_radius) + DSP3.op1e_min_radius = DSP3.op1e_max_search_radius + 1; + + if (DSP3.op1e_max_radius > DSP3.op1e_max_search_radius) + DSP3.op1e_max_search_radius = DSP3.op1e_max_radius; + + DSP3.op1e_lcv_radius = DSP3.op1e_min_radius; + DSP3.op1e_lcv_steps = DSP3.op1e_min_radius; + + DSP3.op1e_lcv_turns = 6; + DSP3.op1e_turn = 0; + + DSP3.op1e_x = DSP3. op3e_x; + DSP3.op1e_y = DSP3. op3e_y; + + for (int lcv = 0; lcv < DSP3.op1e_min_radius; lcv++) + DSP3_OP1E_D(DSP3.op1e_turn, &DSP3.op1e_x, &DSP3.op1e_y); + + DSP3_OP1E_A(); +} + +static void DSP3_OP1E_A (void) +{ + if (DSP3.op1e_lcv_steps == 0) + { + DSP3.op1e_lcv_radius++; + + DSP3.op1e_lcv_steps = DSP3.op1e_lcv_radius; + + DSP3.op1e_x = DSP3. op3e_x; + DSP3.op1e_y = DSP3. op3e_y; + + for (int lcv = 0; lcv < DSP3.op1e_lcv_radius; lcv++) + DSP3_OP1E_D(DSP3.op1e_turn, &DSP3.op1e_x, &DSP3.op1e_y); + } + + if (DSP3.op1e_lcv_radius > DSP3.op1e_max_radius) + { + DSP3.op1e_turn++; + DSP3.op1e_lcv_turns--; + + DSP3.op1e_lcv_radius = DSP3.op1e_min_radius; + DSP3.op1e_lcv_steps = DSP3.op1e_min_radius; + + DSP3.op1e_x = DSP3. op3e_x; + DSP3.op1e_y = DSP3. op3e_y; + + for (int lcv = 0; lcv < DSP3.op1e_min_radius; lcv++) + DSP3_OP1E_D(DSP3.op1e_turn, &DSP3.op1e_x, &DSP3.op1e_y); + } + + if (DSP3.op1e_lcv_turns == 0) + { + DSP3.DR = 0xffff; + DSP3.SR = 0x0080; + SetDSP3 = &DSP3_OP1E_B; + return; + } + + DSP3.DR = (uint8) (DSP3.op1e_x) | ((uint8) (DSP3.op1e_y) << 8); + DSP3_OP03(); + + DSP3.op1e_cell = DSP3.DR; + + DSP3.SR = 0x0080; + SetDSP3 = &DSP3_OP1E_A1; +} + +static void DSP3_OP1E_A1 (void) +{ + DSP3.SR = 0x0084; + SetDSP3 = &DSP3_OP1E_A2; +} + +static void DSP3_OP1E_A2 (void) +{ + DSP3.op1e_terrain[DSP3.op1e_cell] = (uint8) (DSP3.DR & 0x00ff); + + DSP3.SR = 0x0084; + SetDSP3 = &DSP3_OP1E_A3; +} + +static void DSP3_OP1E_A3 (void) +{ + DSP3.op1e_cost[DSP3.op1e_cell] = (uint8) (DSP3.DR & 0x00ff); + + if (DSP3.op1e_lcv_radius == 1) + { + if (DSP3.op1e_terrain[DSP3.op1e_cell] & 1) + DSP3.op1e_weight[DSP3.op1e_cell] = 0xff; + else + DSP3.op1e_weight[DSP3.op1e_cell] = DSP3.op1e_cost[DSP3.op1e_cell]; + } + else + DSP3.op1e_weight[DSP3.op1e_cell] = 0xff; + + DSP3_OP1E_D((int16) (DSP3.op1e_turn + 2), &DSP3.op1e_x, &DSP3.op1e_y); + DSP3.op1e_lcv_steps--; + + DSP3.SR = 0x0080; + DSP3_OP1E_A(); +} + +static void DSP3_OP1E_B (void) +{ + DSP3.op1e_x = DSP3. op3e_x; + DSP3.op1e_y = DSP3. op3e_y; + DSP3.op1e_lcv_radius = 1; + + DSP3.op1e_search = 0; + + DSP3_OP1E_B1(); + + SetDSP3 = &DSP3_OP1E_C; +} + +static void DSP3_OP1E_B1 (void) +{ + while (DSP3.op1e_lcv_radius < DSP3.op1e_max_radius) + { + DSP3.op1e_y--; + + DSP3.op1e_lcv_turns = 6; + DSP3.op1e_turn = 5; + + while (DSP3.op1e_lcv_turns) + { + DSP3.op1e_lcv_steps = DSP3.op1e_lcv_radius; + + while (DSP3.op1e_lcv_steps) + { + DSP3_OP1E_D1(DSP3.op1e_turn, &DSP3.op1e_x, &DSP3.op1e_y); + + if (0 <= DSP3.op1e_y && DSP3.op1e_y < DSP3.WinHi && 0 <= DSP3.op1e_x && DSP3.op1e_x < DSP3.WinLo) + { + DSP3.DR = (uint8) (DSP3.op1e_x) | ((uint8) (DSP3.op1e_y) << 8); + DSP3_OP03(); + + DSP3.op1e_cell = DSP3.DR; + if (DSP3.op1e_cost[DSP3.op1e_cell] < 0x80 && DSP3.op1e_terrain[DSP3.op1e_cell] < 0x40) + DSP3_OP1E_B2(); // end cell perimeter + } + + DSP3.op1e_lcv_steps--; + } // end search line + + DSP3.op1e_turn--; + if (DSP3.op1e_turn == 0) + DSP3.op1e_turn = 6; + + DSP3.op1e_lcv_turns--; + } // end circle search + + DSP3.op1e_lcv_radius++; + } // end radius search +} + +static void DSP3_OP1E_B2 (void) +{ + int16 cell; + int16 path; + int16 x, y; + int16 lcv_turns; + + path = 0xff; + lcv_turns = 6; + + while (lcv_turns) + { + x = DSP3.op1e_x; + y = DSP3.op1e_y; + + DSP3_OP1E_D1(lcv_turns, &x, &y); + + DSP3.DR = (uint8) (x) | ((uint8) (y) << 8); + DSP3_OP03(); + + cell = DSP3.DR; + + if (0 <= y && y < DSP3.WinHi && 0 <= x && x < DSP3.WinLo) + { + if (DSP3.op1e_terrain[cell] < 0x80 || DSP3.op1e_weight[cell] == 0) + { + if (DSP3.op1e_weight[cell] < path) + path = DSP3.op1e_weight[cell]; + } + } // end step travel + + lcv_turns--; + } // end while turns + + if (path != 0xff) + DSP3.op1e_weight[DSP3.op1e_cell] = path + DSP3.op1e_cost[DSP3.op1e_cell]; +} + +static void DSP3_OP1E_C (void) +{ + DSP3.op1e_min_radius = (uint8) (DSP3.DR & 0x00ff); + DSP3.op1e_max_radius = (uint8) ((DSP3.DR & 0xff00) >> 8); + + if (DSP3.op1e_min_radius == 0) + DSP3.op1e_min_radius++; + + if (DSP3.op1e_max_path_radius >= DSP3.op1e_min_radius) + DSP3.op1e_min_radius = DSP3.op1e_max_path_radius + 1; + + if (DSP3.op1e_max_radius > DSP3.op1e_max_path_radius) + DSP3.op1e_max_path_radius = DSP3.op1e_max_radius; + + DSP3.op1e_lcv_radius = DSP3.op1e_min_radius; + DSP3.op1e_lcv_steps = DSP3.op1e_min_radius; + + DSP3.op1e_lcv_turns = 6; + DSP3.op1e_turn = 0; + + DSP3.op1e_x = DSP3. op3e_x; + DSP3.op1e_y = DSP3. op3e_y; + + for (int lcv = 0; lcv < DSP3.op1e_min_radius; lcv++) + DSP3_OP1E_D(DSP3.op1e_turn, &DSP3.op1e_x, &DSP3.op1e_y); + + DSP3_OP1E_C1(); +} + +static void DSP3_OP1E_C1 (void) +{ + if (DSP3.op1e_lcv_steps == 0) + { + DSP3.op1e_lcv_radius++; + + DSP3.op1e_lcv_steps = DSP3.op1e_lcv_radius; + + DSP3.op1e_x = DSP3. op3e_x; + DSP3.op1e_y = DSP3. op3e_y; + + for (int lcv = 0; lcv < DSP3.op1e_lcv_radius; lcv++) + DSP3_OP1E_D(DSP3.op1e_turn, &DSP3.op1e_x, &DSP3.op1e_y); + } + + if (DSP3.op1e_lcv_radius > DSP3.op1e_max_radius) + { + DSP3.op1e_turn++; + DSP3.op1e_lcv_turns--; + + DSP3.op1e_lcv_radius = DSP3.op1e_min_radius; + DSP3.op1e_lcv_steps = DSP3.op1e_min_radius; + + DSP3.op1e_x = DSP3. op3e_x; + DSP3.op1e_y = DSP3. op3e_y; + + for (int lcv = 0; lcv < DSP3.op1e_min_radius; lcv++) + DSP3_OP1E_D(DSP3.op1e_turn, &DSP3.op1e_x, &DSP3.op1e_y); + } + + if (DSP3.op1e_lcv_turns == 0) + { + DSP3.DR = 0xffff; + DSP3.SR = 0x0080; + SetDSP3 = &DSP3_Reset; + return; + } + + DSP3.DR = (uint8) (DSP3.op1e_x) | ((uint8) (DSP3.op1e_y) << 8); + DSP3_OP03(); + + DSP3.op1e_cell = DSP3.DR; + + DSP3.SR = 0x0080; + SetDSP3 = &DSP3_OP1E_C2; +} + +static void DSP3_OP1E_C2 (void) +{ + DSP3.DR = DSP3.op1e_weight[DSP3.op1e_cell]; + + DSP3_OP1E_D((int16) (DSP3.op1e_turn + 2), &DSP3.op1e_x, &DSP3.op1e_y); + DSP3.op1e_lcv_steps--; + + DSP3.SR = 0x0084; + SetDSP3 = &DSP3_OP1E_C1; +} + +static void DSP3_OP1E_D (int16 move, int16 *lo, int16 *hi) +{ + uint32 dataOfs = ((move << 1) + 0x03b2) & 0x03ff; + int16 Lo; + int16 Hi; + + DSP3.AddHi = DSP3_DataROM[dataOfs]; + DSP3.AddLo = DSP3_DataROM[dataOfs + 1]; + + Lo = (uint8) (*lo); + Hi = (uint8) (*hi); + + if (Lo & 1) + Hi += (DSP3.AddLo & 1); + + DSP3.AddLo += Lo; + DSP3.AddHi += Hi; + + if (DSP3.AddLo < 0) + DSP3.AddLo += DSP3.WinLo; + else + if (DSP3.AddLo >= DSP3.WinLo) + DSP3.AddLo -= DSP3.WinLo; + + if (DSP3.AddHi < 0) + DSP3.AddHi += DSP3.WinHi; + else + if (DSP3.AddHi >= DSP3.WinHi) + DSP3.AddHi -= DSP3.WinHi; + + *lo = DSP3.AddLo; + *hi = DSP3.AddHi; +} + +static void DSP3_OP1E_D1 (int16 move, int16 *lo, int16 *hi) +{ + const uint16 HiAdd[] = + { + 0x00, 0xFF, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0xFF, 0x00 + }; + + const uint16 LoAdd[] = + { + 0x00, 0x00, 0x01, 0x01, 0x00, 0xFF, 0xFF, 0x00 + }; + + int16 Lo; + int16 Hi; + + if ((*lo) & 1) + DSP3.AddHi = HiAdd[move + 8]; + else + DSP3.AddHi = HiAdd[move + 0]; + + DSP3.AddLo = LoAdd[move]; + + Lo = (uint8) (*lo); + Hi = (uint8) (*hi); + + if (Lo & 1) + Hi += (DSP3.AddLo & 1); + + DSP3.AddLo += Lo; + DSP3.AddHi += Hi; + + *lo = DSP3.AddLo; + *hi = DSP3.AddHi; +} + +static void DSP3_OP10 (void) +{ + if (DSP3.DR == 0xffff) + DSP3_Reset(); + else + // absorb 2 bytes + DSP3.DR = DSP3.DR; +} + +/* +static void DSP3_OP0C_A (void) +{ + // absorb 2 bytes + DSP3.DR = 0; + SetDSP3 = &DSP3_Reset; +} +*/ + +static void DSP3_OP0C (void) +{ + // absorb 2 bytes + DSP3.DR = 0; + //SetDSP3 = &DSP3_OP0C_A; + SetDSP3 = &DSP3_Reset; +} + +static void DSP3_OP1C_C (void) +{ + // return 2 bytes + DSP3.DR = 0; + SetDSP3 = &DSP3_Reset; +} + +static void DSP3_OP1C_B (void) +{ + // return 2 bytes + DSP3.DR = 0; + SetDSP3 = &DSP3_OP1C_C; +} + +static void DSP3_OP1C_A (void) +{ + // absorb 2 bytes + SetDSP3 = &DSP3_OP1C_B; +} + +static void DSP3_OP1C (void) +{ + // absorb 2 bytes + SetDSP3 = &DSP3_OP1C_A; +} + +static void DSP3_Command (void) +{ + if (DSP3.DR < 0x40) + { + switch (DSP3.DR) + { + case 0x02: SetDSP3 = &DSP3_Coordinate; break; + case 0x03: SetDSP3 = &DSP3_OP03; break; + case 0x06: SetDSP3 = &DSP3_OP06; break; + case 0x07: SetDSP3 = &DSP3_OP07; return; + case 0x0c: SetDSP3 = &DSP3_OP0C; break; + case 0x0f: SetDSP3 = &DSP3_TestMemory; break; + case 0x10: SetDSP3 = &DSP3_OP10; break; + case 0x18: SetDSP3 = &DSP3_Convert; break; + case 0x1c: SetDSP3 = &DSP3_OP1C; break; + case 0x1e: SetDSP3 = &DSP3_OP1E; break; + case 0x1f: SetDSP3 = &DSP3_MemoryDump; break; + case 0x38: SetDSP3 = &DSP3_Decode; break; + case 0x3e: SetDSP3 = &DSP3_OP3E; break; + default: + return; + } + + DSP3.SR = 0x0080; + DSP3.Index = 0; + } +} + +void DSP3SetByte (uint8 byte, uint16 address) +{ + if (address < DSP0.boundary) + { + if (DSP3.SR & 0x04) + { + DSP3.DR = (DSP3.DR & 0xff00) + byte; + (*SetDSP3)(); + } + else + { + DSP3.SR ^= 0x10; + + if (DSP3.SR & 0x10) + DSP3.DR = (DSP3.DR & 0xff00) + byte; + else + { + DSP3.DR = (DSP3.DR & 0x00ff) + (byte << 8); + (*SetDSP3)(); + } + } + } +} + +uint8 DSP3GetByte (uint16 address) +{ + if (address < DSP0.boundary) + { + uint8 byte; + + if (DSP3.SR & 0x04) + { + byte = (uint8) DSP3.DR; + (*SetDSP3)(); + } + else + { + DSP3.SR ^= 0x10; + + if (DSP3.SR & 0x10) + byte = (uint8) (DSP3.DR); + else + { + byte = (uint8) (DSP3.DR >> 8); + (*SetDSP3)(); + } + } + + return (byte); + } + + return (uint8) DSP3.SR; +} diff --git a/plugins/snes9x_gx/source/snes9x/dsp4.cpp b/plugins/snes9x_gx/source/snes9x/dsp4.cpp new file mode 100644 index 00000000..9d6f3fd7 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/dsp4.cpp @@ -0,0 +1,2220 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + +/* + Due recognition and credit are given on Overload's DSP website. + Thank those contributors for their hard work on this chip. + + Fixed-point math reminder: + [sign, integer, fraction] + 1.15.00 * 1.15.00 = 2.30.00 -> 1.30.00 (DSP) -> 1.31.00 (LSB is '0') + 1.15.00 * 1.00.15 = 2.15.15 -> 1.15.15 (DSP) -> 1.15.16 (LSB is '0') +*/ + + +#include "snes9x.h" +#include "memmap.h" + +#define DSP4_CLEAR_OUT() \ + { DSP4.out_count = 0; DSP4.out_index = 0; } + +#define DSP4_WRITE_BYTE(d) \ + { WRITE_WORD(DSP4.output + DSP4.out_count, (d)); DSP4.out_count++; } + +#define DSP4_WRITE_WORD(d) \ + { WRITE_WORD(DSP4.output + DSP4.out_count, (d)); DSP4.out_count += 2; } + +#ifndef MSB_FIRST +#define DSP4_WRITE_16_WORD(d) \ + { memcpy(DSP4.output + DSP4.out_count, (d), 32); DSP4.out_count += 32; } +#else +#define DSP4_WRITE_16_WORD(d) \ + { for (int p = 0; p < 16; p++) DSP4_WRITE_WORD((d)[p]); } +#endif + +// used to wait for dsp i/o +#define DSP4_WAIT(x) \ + DSP4.in_index = 0; DSP4.Logic = (x); return + +// 1.7.8 -> 1.15.16 +#define SEX78(a) (((int32) ((int16) (a))) << 8) + +// 1.15.0 -> 1.15.16 +#define SEX16(a) (((int32) ((int16) (a))) << 16) + +static int16 DSP4_READ_WORD (void); +static int32 DSP4_READ_DWORD (void); +static int16 DSP4_Inverse (int16); +static void DSP4_Multiply (int16, int16, int32 *); +static void DSP4_OP01 (void); +static void DSP4_OP03 (void); +static void DSP4_OP05 (void); +static void DSP4_OP06 (void); +static void DSP4_OP07 (void); +static void DSP4_OP08 (void); +static void DSP4_OP09 (void); +static void DSP4_OP0A (int16, int16 *, int16 *, int16 *, int16 *); +static void DSP4_OP0B (bool8 *, int16, int16, int16, bool8, bool8); +static void DSP4_OP0D (void); +static void DSP4_OP0E (void); +static void DSP4_OP0F (void); +static void DSP4_OP10 (void); +static void DSP4_OP11 (int16, int16, int16, int16, int16 *); +static void DSP4_SetByte (void); +static void DSP4_GetByte (void); + + +static int16 DSP4_READ_WORD (void) +{ + int16 out; + + out = READ_WORD(DSP4.parameters + DSP4.in_index); + DSP4.in_index += 2; + + return (out); +} + +static int32 DSP4_READ_DWORD (void) +{ + int32 out; + + out = READ_DWORD(DSP4.parameters + DSP4.in_index); + DSP4.in_index += 4; + + return (out); +} + +static int16 DSP4_Inverse (int16 value) +{ + // Attention: This lookup table is not verified + const uint16 div_lut[64] = + { + 0x0000, 0x8000, 0x4000, 0x2aaa, 0x2000, 0x1999, 0x1555, 0x1249, + 0x1000, 0x0e38, 0x0ccc, 0x0ba2, 0x0aaa, 0x09d8, 0x0924, 0x0888, + 0x0800, 0x0787, 0x071c, 0x06bc, 0x0666, 0x0618, 0x05d1, 0x0590, + 0x0555, 0x051e, 0x04ec, 0x04bd, 0x0492, 0x0469, 0x0444, 0x0421, + 0x0400, 0x03e0, 0x03c3, 0x03a8, 0x038e, 0x0375, 0x035e, 0x0348, + 0x0333, 0x031f, 0x030c, 0x02fa, 0x02e8, 0x02d8, 0x02c8, 0x02b9, + 0x02aa, 0x029c, 0x028f, 0x0282, 0x0276, 0x026a, 0x025e, 0x0253, + 0x0249, 0x023e, 0x0234, 0x022b, 0x0222, 0x0219, 0x0210, 0x0208 + }; + + // saturate bounds + if (value < 0) + value = 0; + if (value > 63) + value = 63; + + return (div_lut[value]); +} + +static void DSP4_Multiply (int16 Multiplicand, int16 Multiplier, int32 *Product) +{ + *Product = (Multiplicand * Multiplier << 1) >> 1; +} + +static void DSP4_OP01 (void) +{ + DSP4.waiting4command = FALSE; + + // op flow control + switch (DSP4.Logic) + { + case 1: goto resume1; break; + case 2: goto resume2; break; + case 3: goto resume3; break; + } + + //////////////////////////////////////////////////// + // process initial inputs + + // sort inputs + DSP4.world_y = DSP4_READ_DWORD(); + DSP4.poly_bottom[0][0] = DSP4_READ_WORD(); + DSP4.poly_top[0][0] = DSP4_READ_WORD(); + DSP4.poly_cx[1][0] = DSP4_READ_WORD(); + DSP4.viewport_bottom = DSP4_READ_WORD(); + DSP4.world_x = DSP4_READ_DWORD(); + DSP4.poly_cx[0][0] = DSP4_READ_WORD(); + DSP4.poly_ptr[0][0] = DSP4_READ_WORD(); + DSP4.world_yofs = DSP4_READ_WORD(); + DSP4.world_dy = DSP4_READ_DWORD(); + DSP4.world_dx = DSP4_READ_DWORD(); + DSP4.distance = DSP4_READ_WORD(); + DSP4_READ_WORD(); // 0x0000 + DSP4.world_xenv = DSP4_READ_DWORD(); + DSP4.world_ddy = DSP4_READ_WORD(); + DSP4.world_ddx = DSP4_READ_WORD(); + DSP4.view_yofsenv = DSP4_READ_WORD(); + + // initial (x, y, offset) at starting raster line + DSP4.view_x1 = (DSP4.world_x + DSP4.world_xenv) >> 16; + DSP4.view_y1 = DSP4.world_y >> 16; + DSP4.view_xofs1 = DSP4.world_x >> 16; + DSP4.view_yofs1 = DSP4.world_yofs; + DSP4.view_turnoff_x = 0; + DSP4.view_turnoff_dx = 0; + + // first raster line + DSP4.poly_raster[0][0] = DSP4.poly_bottom[0][0]; + + do + { + //////////////////////////////////////////////////// + // process one iteration of projection + + // perspective projection of world (x, y, scroll) points + // based on the current projection lines + DSP4.view_x2 = (((DSP4.world_x + DSP4.world_xenv) >> 16) * DSP4.distance >> 15) + (DSP4.view_turnoff_x * DSP4.distance >> 15); + DSP4.view_y2 = (DSP4.world_y >> 16) * DSP4.distance >> 15; + DSP4.view_xofs2 = DSP4.view_x2; + DSP4.view_yofs2 = (DSP4.world_yofs * DSP4.distance >> 15) + DSP4.poly_bottom[0][0] - DSP4.view_y2; + + // 1. World x-location before transformation + // 2. Viewer x-position at the next + // 3. World y-location before perspective projection + // 4. Viewer y-position below the horizon + // 5. Number of raster lines drawn in this iteration + DSP4_CLEAR_OUT(); + DSP4_WRITE_WORD((DSP4.world_x + DSP4.world_xenv) >> 16); + DSP4_WRITE_WORD(DSP4.view_x2); + DSP4_WRITE_WORD(DSP4.world_y >> 16); + DSP4_WRITE_WORD(DSP4.view_y2); + + ////////////////////////////////////////////////////// + + // SR = 0x00 + + // determine # of raster lines used + DSP4.segments = DSP4.poly_raster[0][0] - DSP4.view_y2; + + // prevent overdraw + if (DSP4.view_y2 >= DSP4.poly_raster[0][0]) + DSP4.segments = 0; + else + DSP4.poly_raster[0][0] = DSP4.view_y2; + + // don't draw outside the window + if (DSP4.view_y2 < DSP4.poly_top[0][0]) + { + DSP4.segments = 0; + + // flush remaining raster lines + if (DSP4.view_y1 >= DSP4.poly_top[0][0]) + DSP4.segments = DSP4.view_y1 - DSP4.poly_top[0][0]; + } + + // SR = 0x80 + + DSP4_WRITE_WORD(DSP4.segments); + + ////////////////////////////////////////////////////// + + // scan next command if no SR check needed + if (DSP4.segments) + { + int32 px_dx, py_dy; + int32 x_scroll, y_scroll; + + // SR = 0x00 + + // linear interpolation (lerp) between projected points + px_dx = (DSP4.view_xofs2 - DSP4.view_xofs1) * DSP4_Inverse(DSP4.segments) << 1; + py_dy = (DSP4.view_yofs2 - DSP4.view_yofs1) * DSP4_Inverse(DSP4.segments) << 1; + + // starting step values + x_scroll = SEX16(DSP4.poly_cx[0][0] + DSP4.view_xofs1); + y_scroll = SEX16(-DSP4.viewport_bottom + DSP4.view_yofs1 + DSP4.view_yofsenv + DSP4.poly_cx[1][0] - DSP4.world_yofs); + + // SR = 0x80 + + // rasterize line + for (DSP4.lcv = 0; DSP4.lcv < DSP4.segments; DSP4.lcv++) + { + // 1. HDMA memory pointer (bg1) + // 2. vertical scroll offset ($210E) + // 3. horizontal scroll offset ($210D) + DSP4_WRITE_WORD(DSP4.poly_ptr[0][0]); + DSP4_WRITE_WORD((y_scroll + 0x8000) >> 16); + DSP4_WRITE_WORD((x_scroll + 0x8000) >> 16); + + // update memory address + DSP4.poly_ptr[0][0] -= 4; + + // update screen values + x_scroll += px_dx; + y_scroll += py_dy; + } + } + + //////////////////////////////////////////////////// + // Post-update + + // update new viewer (x, y, scroll) to last raster line drawn + DSP4.view_x1 = DSP4.view_x2; + DSP4.view_y1 = DSP4.view_y2; + DSP4.view_xofs1 = DSP4.view_xofs2; + DSP4.view_yofs1 = DSP4.view_yofs2; + + // add deltas for projection lines + DSP4.world_dx += SEX78(DSP4.world_ddx); + DSP4.world_dy += SEX78(DSP4.world_ddy); + + // update projection lines + DSP4.world_x += (DSP4.world_dx + DSP4.world_xenv); + DSP4.world_y += DSP4.world_dy; + + // update road turnoff position + DSP4.view_turnoff_x += DSP4.view_turnoff_dx; + + //////////////////////////////////////////////////// + // command check + + // scan next command + DSP4.in_count = 2; + DSP4_WAIT(1); + + resume1: + + // check for termination + DSP4.distance = DSP4_READ_WORD(); + if (DSP4.distance == -0x8000) + break; + + // road turnoff + if ((uint16) DSP4.distance == 0x8001) + { + DSP4.in_count = 6; + DSP4_WAIT(2); + + resume2: + + DSP4.distance = DSP4_READ_WORD(); + DSP4.view_turnoff_x = DSP4_READ_WORD(); + DSP4.view_turnoff_dx = DSP4_READ_WORD(); + + // factor in new changes + DSP4.view_x1 += (DSP4.view_turnoff_x * DSP4.distance >> 15); + DSP4.view_xofs1 += (DSP4.view_turnoff_x * DSP4.distance >> 15); + + // update stepping values + DSP4.view_turnoff_x += DSP4.view_turnoff_dx; + + DSP4.in_count = 2; + DSP4_WAIT(1); + } + + // already have 2 bytes read + DSP4.in_count = 6; + DSP4_WAIT(3); + + resume3: + + // inspect inputs + DSP4.world_ddy = DSP4_READ_WORD(); + DSP4.world_ddx = DSP4_READ_WORD(); + DSP4.view_yofsenv = DSP4_READ_WORD(); + + // no envelope here + DSP4.world_xenv = 0; + } + while (1); + + // terminate op + DSP4.waiting4command = TRUE; +} + +static void DSP4_OP03 (void) +{ + DSP4.OAM_RowMax = 33; + memset(DSP4.OAM_Row, 0, 64); +} + +static void DSP4_OP05 (void) +{ + DSP4.OAM_index = 0; + DSP4.OAM_bits = 0; + memset(DSP4.OAM_attr, 0, 32); + DSP4.sprite_count = 0; +} + +static void DSP4_OP06 (void) +{ + DSP4_CLEAR_OUT(); + DSP4_WRITE_16_WORD(DSP4.OAM_attr); +} + +static void DSP4_OP07 (void) +{ + DSP4.waiting4command = FALSE; + + // op flow control + switch (DSP4.Logic) + { + case 1: goto resume1; break; + case 2: goto resume2; break; + } + + //////////////////////////////////////////////////// + // sort inputs + + DSP4.world_y = DSP4_READ_DWORD(); + DSP4.poly_bottom[0][0] = DSP4_READ_WORD(); + DSP4.poly_top[0][0] = DSP4_READ_WORD(); + DSP4.poly_cx[1][0] = DSP4_READ_WORD(); + DSP4.viewport_bottom = DSP4_READ_WORD(); + DSP4.world_x = DSP4_READ_DWORD(); + DSP4.poly_cx[0][0] = DSP4_READ_WORD(); + DSP4.poly_ptr[0][0] = DSP4_READ_WORD(); + DSP4.world_yofs = DSP4_READ_WORD(); + DSP4.distance = DSP4_READ_WORD(); + DSP4.view_y2 = DSP4_READ_WORD(); + DSP4.view_dy = DSP4_READ_WORD() * DSP4.distance >> 15; + DSP4.view_x2 = DSP4_READ_WORD(); + DSP4.view_dx = DSP4_READ_WORD() * DSP4.distance >> 15; + DSP4.view_yofsenv = DSP4_READ_WORD(); + + // initial (x, y, offset) at starting raster line + DSP4.view_x1 = DSP4.world_x >> 16; + DSP4.view_y1 = DSP4.world_y >> 16; + DSP4.view_xofs1 = DSP4.view_x1; + DSP4.view_yofs1 = DSP4.world_yofs; + + // first raster line + DSP4.poly_raster[0][0] = DSP4.poly_bottom[0][0]; + + do + { + //////////////////////////////////////////////////// + // process one iteration of projection + + // add shaping + DSP4.view_x2 += DSP4.view_dx; + DSP4.view_y2 += DSP4.view_dy; + + // vertical scroll calculation + DSP4.view_xofs2 = DSP4.view_x2; + DSP4.view_yofs2 = (DSP4.world_yofs * DSP4.distance >> 15) + DSP4.poly_bottom[0][0] - DSP4.view_y2; + + // 1. Viewer x-position at the next + // 2. Viewer y-position below the horizon + // 3. Number of raster lines drawn in this iteration + DSP4_CLEAR_OUT(); + DSP4_WRITE_WORD(DSP4.view_x2); + DSP4_WRITE_WORD(DSP4.view_y2); + + ////////////////////////////////////////////////////// + + // SR = 0x00 + + // determine # of raster lines used + DSP4.segments = DSP4.view_y1 - DSP4.view_y2; + + // prevent overdraw + if (DSP4.view_y2 >= DSP4.poly_raster[0][0]) + DSP4.segments = 0; + else + DSP4.poly_raster[0][0] = DSP4.view_y2; + + // don't draw outside the window + if (DSP4.view_y2 < DSP4.poly_top[0][0]) + { + DSP4.segments = 0; + + // flush remaining raster lines + if (DSP4.view_y1 >= DSP4.poly_top[0][0]) + DSP4.segments = DSP4.view_y1 - DSP4.poly_top[0][0]; + } + + // SR = 0x80 + + DSP4_WRITE_WORD(DSP4.segments); + + ////////////////////////////////////////////////////// + + // scan next command if no SR check needed + if (DSP4.segments) + { + int32 px_dx, py_dy; + int32 x_scroll, y_scroll; + + // SR = 0x00 + + // linear interpolation (lerp) between projected points + px_dx = (DSP4.view_xofs2 - DSP4.view_xofs1) * DSP4_Inverse(DSP4.segments) << 1; + py_dy = (DSP4.view_yofs2 - DSP4.view_yofs1) * DSP4_Inverse(DSP4.segments) << 1; + + // starting step values + x_scroll = SEX16(DSP4.poly_cx[0][0] + DSP4.view_xofs1); + y_scroll = SEX16(-DSP4.viewport_bottom + DSP4.view_yofs1 + DSP4.view_yofsenv + DSP4.poly_cx[1][0] - DSP4.world_yofs); + + // SR = 0x80 + + // rasterize line + for (DSP4.lcv = 0; DSP4.lcv < DSP4.segments; DSP4.lcv++) + { + // 1. HDMA memory pointer (bg2) + // 2. vertical scroll offset ($2110) + // 3. horizontal scroll offset ($210F) + DSP4_WRITE_WORD(DSP4.poly_ptr[0][0]); + DSP4_WRITE_WORD((y_scroll + 0x8000) >> 16); + DSP4_WRITE_WORD((x_scroll + 0x8000) >> 16); + + // update memory address + DSP4.poly_ptr[0][0] -= 4; + + // update screen values + x_scroll += px_dx; + y_scroll += py_dy; + } + } + + ///////////////////////////////////////////////////// + // Post-update + + // update new viewer (x, y, scroll) to last raster line drawn + DSP4.view_x1 = DSP4.view_x2; + DSP4.view_y1 = DSP4.view_y2; + DSP4.view_xofs1 = DSP4.view_xofs2; + DSP4.view_yofs1 = DSP4.view_yofs2; + + //////////////////////////////////////////////////// + // command check + + // scan next command + DSP4.in_count = 2; + DSP4_WAIT(1); + + resume1: + + // check for opcode termination + DSP4.distance = DSP4_READ_WORD(); + if (DSP4.distance == -0x8000) + break; + + // already have 2 bytes in queue + DSP4.in_count = 10; + DSP4_WAIT(2); + + resume2: + + // inspect inputs + DSP4.view_y2 = DSP4_READ_WORD(); + DSP4.view_dy = DSP4_READ_WORD() * DSP4.distance >> 15; + DSP4.view_x2 = DSP4_READ_WORD(); + DSP4.view_dx = DSP4_READ_WORD() * DSP4.distance >> 15; + DSP4.view_yofsenv = DSP4_READ_WORD(); + } + while (1); + + DSP4.waiting4command = TRUE; +} + +static void DSP4_OP08 (void) +{ + int16 win_left, win_right; + int16 view_x[2], view_y[2]; + int16 envelope[2][2]; + + DSP4.waiting4command = FALSE; + + // op flow control + switch (DSP4.Logic) + { + case 1: goto resume1; break; + case 2: goto resume2; break; + } + + //////////////////////////////////////////////////// + // process initial inputs for two polygons + + // clip values + DSP4.poly_clipRt[0][0] = DSP4_READ_WORD(); + DSP4.poly_clipRt[0][1] = DSP4_READ_WORD(); + DSP4.poly_clipRt[1][0] = DSP4_READ_WORD(); + DSP4.poly_clipRt[1][1] = DSP4_READ_WORD(); + + DSP4.poly_clipLf[0][0] = DSP4_READ_WORD(); + DSP4.poly_clipLf[0][1] = DSP4_READ_WORD(); + DSP4.poly_clipLf[1][0] = DSP4_READ_WORD(); + DSP4.poly_clipLf[1][1] = DSP4_READ_WORD(); + + // unknown (constant) (ex. 1P/2P = $00A6, $00A6, $00A6, $00A6) + DSP4_READ_WORD(); + DSP4_READ_WORD(); + DSP4_READ_WORD(); + DSP4_READ_WORD(); + + // unknown (constant) (ex. 1P/2P = $00A5, $00A5, $00A7, $00A7) + DSP4_READ_WORD(); + DSP4_READ_WORD(); + DSP4_READ_WORD(); + DSP4_READ_WORD(); + + // polygon centering (left, right) + DSP4.poly_cx[0][0] = DSP4_READ_WORD(); + DSP4.poly_cx[0][1] = DSP4_READ_WORD(); + DSP4.poly_cx[1][0] = DSP4_READ_WORD(); + DSP4.poly_cx[1][1] = DSP4_READ_WORD(); + + // HDMA pointer locations + DSP4.poly_ptr[0][0] = DSP4_READ_WORD(); + DSP4.poly_ptr[0][1] = DSP4_READ_WORD(); + DSP4.poly_ptr[1][0] = DSP4_READ_WORD(); + DSP4.poly_ptr[1][1] = DSP4_READ_WORD(); + + // starting raster line below the horizon + DSP4.poly_bottom[0][0] = DSP4_READ_WORD(); + DSP4.poly_bottom[0][1] = DSP4_READ_WORD(); + DSP4.poly_bottom[1][0] = DSP4_READ_WORD(); + DSP4.poly_bottom[1][1] = DSP4_READ_WORD(); + + // top boundary line to clip + DSP4.poly_top[0][0] = DSP4_READ_WORD(); + DSP4.poly_top[0][1] = DSP4_READ_WORD(); + DSP4.poly_top[1][0] = DSP4_READ_WORD(); + DSP4.poly_top[1][1] = DSP4_READ_WORD(); + + // unknown + // (ex. 1P = $2FC8, $0034, $FF5C, $0035) + // + // (ex. 2P = $3178, $0034, $FFCC, $0035) + // (ex. 2P = $2FC8, $0034, $FFCC, $0035) + DSP4_READ_WORD(); + DSP4_READ_WORD(); + DSP4_READ_WORD(); + DSP4_READ_WORD(); + + // look at guidelines for both polygon shapes + DSP4.distance = DSP4_READ_WORD(); + view_x[0] = DSP4_READ_WORD(); + view_y[0] = DSP4_READ_WORD(); + view_x[1] = DSP4_READ_WORD(); + view_y[1] = DSP4_READ_WORD(); + + // envelope shaping guidelines (one frame only) + envelope[0][0] = DSP4_READ_WORD(); + envelope[0][1] = DSP4_READ_WORD(); + envelope[1][0] = DSP4_READ_WORD(); + envelope[1][1] = DSP4_READ_WORD(); + + // starting base values to project from + DSP4.poly_start[0] = view_x[0]; + DSP4.poly_start[1] = view_x[1]; + + // starting raster lines to begin drawing + DSP4.poly_raster[0][0] = view_y[0]; + DSP4.poly_raster[0][1] = view_y[0]; + DSP4.poly_raster[1][0] = view_y[1]; + DSP4.poly_raster[1][1] = view_y[1]; + + // starting distances + DSP4.poly_plane[0] = DSP4.distance; + DSP4.poly_plane[1] = DSP4.distance; + + // SR = 0x00 + + // re-center coordinates + win_left = DSP4.poly_cx[0][0] - view_x[0] + envelope[0][0]; + win_right = DSP4.poly_cx[0][1] - view_x[0] + envelope[0][1]; + + // saturate offscreen data for polygon #1 + if (win_left < DSP4.poly_clipLf[0][0]) + win_left = DSP4.poly_clipLf[0][0]; + if (win_left > DSP4.poly_clipRt[0][0]) + win_left = DSP4.poly_clipRt[0][0]; + if (win_right < DSP4.poly_clipLf[0][1]) + win_right = DSP4.poly_clipLf[0][1]; + if (win_right > DSP4.poly_clipRt[0][1]) + win_right = DSP4.poly_clipRt[0][1]; + + // SR = 0x80 + + // initial output for polygon #1 + DSP4_CLEAR_OUT(); + DSP4_WRITE_BYTE(win_left & 0xff); + DSP4_WRITE_BYTE(win_right & 0xff); + + do + { + int16 polygon; + + //////////////////////////////////////////////////// + // command check + + // scan next command + DSP4.in_count = 2; + DSP4_WAIT(1); + + resume1: + + // terminate op + DSP4.distance = DSP4_READ_WORD(); + if (DSP4.distance == -0x8000) + break; + + // already have 2 bytes in queue + DSP4.in_count = 16; + DSP4_WAIT(2); + + resume2: + + // look at guidelines for both polygon shapes + view_x[0] = DSP4_READ_WORD(); + view_y[0] = DSP4_READ_WORD(); + view_x[1] = DSP4_READ_WORD(); + view_y[1] = DSP4_READ_WORD(); + + // envelope shaping guidelines (one frame only) + envelope[0][0] = DSP4_READ_WORD(); + envelope[0][1] = DSP4_READ_WORD(); + envelope[1][0] = DSP4_READ_WORD(); + envelope[1][1] = DSP4_READ_WORD(); + + //////////////////////////////////////////////////// + // projection begins + + // init + DSP4_CLEAR_OUT(); + + ////////////////////////////////////////////// + // solid polygon renderer - 2 shapes + + for (polygon = 0; polygon < 2; polygon++) + { + int32 left_inc, right_inc; + int16 x1_final, x2_final; + int16 env[2][2]; + int16 poly; + + // SR = 0x00 + + // # raster lines to draw + DSP4.segments = DSP4.poly_raster[polygon][0] - view_y[polygon]; + + // prevent overdraw + if (DSP4.segments > 0) + { + // bump drawing cursor + DSP4.poly_raster[polygon][0] = view_y[polygon]; + DSP4.poly_raster[polygon][1] = view_y[polygon]; + } + else + DSP4.segments = 0; + + // don't draw outside the window + if (view_y[polygon] < DSP4.poly_top[polygon][0]) + { + DSP4.segments = 0; + + // flush remaining raster lines + if (view_y[polygon] >= DSP4.poly_top[polygon][0]) + DSP4.segments = view_y[polygon] - DSP4.poly_top[polygon][0]; + } + + // SR = 0x80 + + // tell user how many raster structures to read in + DSP4_WRITE_WORD(DSP4.segments); + + // normal parameters + poly = polygon; + + ///////////////////////////////////////////////////// + + // scan next command if no SR check needed + if (DSP4.segments) + { + int32 w_left, w_right; + + // road turnoff selection + if ((uint16) envelope[polygon][0] == (uint16) 0xc001) + poly = 1; + else + if (envelope[polygon][1] == 0x3fff) + poly = 1; + + /////////////////////////////////////////////// + // left side of polygon + + // perspective correction on additional shaping parameters + env[0][0] = envelope[polygon][0] * DSP4.poly_plane[poly] >> 15; + env[0][1] = envelope[polygon][0] * DSP4.distance >> 15; + + // project new shapes (left side) + x1_final = view_x[poly] + env[0][0]; + x2_final = DSP4.poly_start[poly] + env[0][1]; + + // interpolate between projected points with shaping + left_inc = (x2_final - x1_final) * DSP4_Inverse(DSP4.segments) << 1; + if (DSP4.segments == 1) + left_inc = -left_inc; + + /////////////////////////////////////////////// + // right side of polygon + + // perspective correction on additional shaping parameters + env[1][0] = envelope[polygon][1] * DSP4.poly_plane[poly] >> 15; + env[1][1] = envelope[polygon][1] * DSP4.distance >> 15; + + // project new shapes (right side) + x1_final = view_x[poly] + env[1][0]; + x2_final = DSP4.poly_start[poly] + env[1][1]; + + // interpolate between projected points with shaping + right_inc = (x2_final - x1_final) * DSP4_Inverse(DSP4.segments) << 1; + if (DSP4.segments == 1) + right_inc = -right_inc; + + /////////////////////////////////////////////// + // update each point on the line + + w_left = SEX16(DSP4.poly_cx[polygon][0] - DSP4.poly_start[poly] + env[0][0]); + w_right = SEX16(DSP4.poly_cx[polygon][1] - DSP4.poly_start[poly] + env[1][0]); + + // update distance drawn into world + DSP4.poly_plane[polygon] = DSP4.distance; + + // rasterize line + for (DSP4.lcv = 0; DSP4.lcv < DSP4.segments; DSP4.lcv++) + { + int16 x_left, x_right; + + // project new coordinates + w_left += left_inc; + w_right += right_inc; + + // grab integer portion, drop fraction (no rounding) + x_left = w_left >> 16; + x_right = w_right >> 16; + + // saturate offscreen data + if (x_left < DSP4.poly_clipLf[polygon][0]) + x_left = DSP4.poly_clipLf[polygon][0]; + if (x_left > DSP4.poly_clipRt[polygon][0]) + x_left = DSP4.poly_clipRt[polygon][0]; + if (x_right < DSP4.poly_clipLf[polygon][1]) + x_right = DSP4.poly_clipLf[polygon][1]; + if (x_right > DSP4.poly_clipRt[polygon][1]) + x_right = DSP4.poly_clipRt[polygon][1]; + + // 1. HDMA memory pointer + // 2. Left window position ($2126/$2128) + // 3. Right window position ($2127/$2129) + DSP4_WRITE_WORD(DSP4.poly_ptr[polygon][0]); + DSP4_WRITE_BYTE(x_left & 0xff); + DSP4_WRITE_BYTE(x_right & 0xff); + + // update memory pointers + DSP4.poly_ptr[polygon][0] -= 4; + DSP4.poly_ptr[polygon][1] -= 4; + } // end rasterize line + } + + //////////////////////////////////////////////// + // Post-update + + // new projection spot to continue rasterizing from + DSP4.poly_start[polygon] = view_x[poly]; + } // end polygon rasterizer + } + while (1); + + // unknown output + DSP4_CLEAR_OUT(); + DSP4_WRITE_WORD(0); + + DSP4.waiting4command = TRUE; +} + +static void DSP4_OP09 (void) +{ + DSP4.waiting4command = FALSE; + + // op flow control + switch (DSP4.Logic) + { + case 1: goto resume1; break; + case 2: goto resume2; break; + case 3: goto resume3; break; + case 4: goto resume4; break; + case 5: goto resume5; break; + case 6: goto resume6; break; + } + + //////////////////////////////////////////////////// + // process initial inputs + + // grab screen information + DSP4.viewport_cx = DSP4_READ_WORD(); + DSP4.viewport_cy = DSP4_READ_WORD(); + DSP4_READ_WORD(); // 0x0000 + DSP4.viewport_left = DSP4_READ_WORD(); + DSP4.viewport_right = DSP4_READ_WORD(); + DSP4.viewport_top = DSP4_READ_WORD(); + DSP4.viewport_bottom = DSP4_READ_WORD(); + + // starting raster line below the horizon + DSP4.poly_bottom[0][0] = DSP4.viewport_bottom - DSP4.viewport_cy; + DSP4.poly_raster[0][0] = 0x100; + + do + { + //////////////////////////////////////////////////// + // check for new sprites + + DSP4.in_count = 4; + DSP4_WAIT(1); + + resume1: + + //////////////////////////////////////////////// + // raster overdraw check + + DSP4.raster = DSP4_READ_WORD(); + + // continue updating the raster line where overdraw begins + if (DSP4.raster < DSP4.poly_raster[0][0]) + { + DSP4.sprite_clipy = DSP4.viewport_bottom - (DSP4.poly_bottom[0][0] - DSP4.raster); + DSP4.poly_raster[0][0] = DSP4.raster; + } + + ///////////////////////////////////////////////// + // identify sprite + + // op termination + DSP4.distance = DSP4_READ_WORD(); + if (DSP4.distance == -0x8000) + goto terminate; + + // no sprite + if (DSP4.distance == 0x0000) + continue; + + //////////////////////////////////////////////////// + // process projection information + + // vehicle sprite + if ((uint16) DSP4.distance == 0x9000) + { + int16 car_left, car_right, car_back; + int16 impact_left, impact_back; + int16 world_spx, world_spy; + int16 view_spx, view_spy; + uint16 energy; + + // we already have 4 bytes we want + DSP4.in_count = 14; + DSP4_WAIT(2); + + resume2: + + // filter inputs + energy = DSP4_READ_WORD(); + impact_back = DSP4_READ_WORD(); + car_back = DSP4_READ_WORD(); + impact_left = DSP4_READ_WORD(); + car_left = DSP4_READ_WORD(); + DSP4.distance = DSP4_READ_WORD(); + car_right = DSP4_READ_WORD(); + + // calculate car's world (x, y) values + world_spx = car_right - car_left; + world_spy = car_back; + + // add in collision vector [needs bit-twiddling] + world_spx -= energy * (impact_left - car_left) >> 16; + world_spy -= energy * (car_back - impact_back) >> 16; + + // perspective correction for world (x, y) + view_spx = world_spx * DSP4.distance >> 15; + view_spy = world_spy * DSP4.distance >> 15; + + // convert to screen values + DSP4.sprite_x = DSP4.viewport_cx + view_spx; + DSP4.sprite_y = DSP4.viewport_bottom - (DSP4.poly_bottom[0][0] - view_spy); + + // make the car's (x)-coordinate available + DSP4_CLEAR_OUT(); + DSP4_WRITE_WORD(world_spx); + + // grab a few remaining vehicle values + DSP4.in_count = 4; + DSP4_WAIT(3); + + resume3: + + // add vertical lift factor + DSP4.sprite_y += DSP4_READ_WORD(); + } + // terrain sprite + else + { + int16 world_spx, world_spy; + int16 view_spx, view_spy; + + // we already have 4 bytes we want + DSP4.in_count = 10; + DSP4_WAIT(4); + + resume4: + + // sort loop inputs + DSP4.poly_cx[0][0] = DSP4_READ_WORD(); + DSP4.poly_raster[0][1] = DSP4_READ_WORD(); + world_spx = DSP4_READ_WORD(); + world_spy = DSP4_READ_WORD(); + + // compute base raster line from the bottom + DSP4.segments = DSP4.poly_bottom[0][0] - DSP4.raster; + + // perspective correction for world (x, y) + view_spx = world_spx * DSP4.distance >> 15; + view_spy = world_spy * DSP4.distance >> 15; + + // convert to screen values + DSP4.sprite_x = DSP4.viewport_cx + view_spx - DSP4.poly_cx[0][0]; + DSP4.sprite_y = DSP4.viewport_bottom - DSP4.segments + view_spy; + } + + // default sprite size: 16x16 + DSP4.sprite_size = 1; + DSP4.sprite_attr = DSP4_READ_WORD(); + + //////////////////////////////////////////////////// + // convert tile data to SNES OAM format + + do + { + int16 sp_x, sp_y, sp_attr, sp_dattr; + int16 sp_dx, sp_dy; + int16 pixels; + uint16 header; + bool8 draw; + + DSP4.in_count = 2; + DSP4_WAIT(5); + + resume5: + + draw = TRUE; + + // opcode termination + DSP4.raster = DSP4_READ_WORD(); + if (DSP4.raster == -0x8000) + goto terminate; + + // stop code + if (DSP4.raster == 0x0000 && !DSP4.sprite_size) + break; + + // toggle sprite size + if (DSP4.raster == 0x0000) + { + DSP4.sprite_size = !DSP4.sprite_size; + continue; + } + + // check for valid sprite header + header = DSP4.raster; + header >>= 8; + if (header != 0x20 && + header != 0x2e && // This is for attractor sprite + header != 0x40 && + header != 0x60 && + header != 0xa0 && + header != 0xc0 && + header != 0xe0) + break; + + // read in rest of sprite data + DSP4.in_count = 4; + DSP4_WAIT(6); + + resume6: + + draw = TRUE; + + ///////////////////////////////////// + // process tile data + + // sprite deltas + sp_dattr = DSP4.raster; + sp_dy = DSP4_READ_WORD(); + sp_dx = DSP4_READ_WORD(); + + // update coordinates to screen space + sp_x = DSP4.sprite_x + sp_dx; + sp_y = DSP4.sprite_y + sp_dy; + + // update sprite nametable/attribute information + sp_attr = DSP4.sprite_attr + sp_dattr; + + // allow partially visibile tiles + pixels = DSP4.sprite_size ? 15 : 7; + + DSP4_CLEAR_OUT(); + + // transparent tile to clip off parts of a sprite (overdraw) + if (DSP4.sprite_clipy - pixels <= sp_y && sp_y <= DSP4.sprite_clipy && sp_x >= DSP4.viewport_left - pixels && sp_x <= DSP4.viewport_right && DSP4.sprite_clipy >= DSP4.viewport_top - pixels && DSP4.sprite_clipy <= DSP4.viewport_bottom) + DSP4_OP0B(&draw, sp_x, DSP4.sprite_clipy, 0x00EE, DSP4.sprite_size, 0); + + // normal sprite tile + if (sp_x >= DSP4.viewport_left - pixels && sp_x <= DSP4.viewport_right && sp_y >= DSP4.viewport_top - pixels && sp_y <= DSP4.viewport_bottom && sp_y <= DSP4.sprite_clipy) + DSP4_OP0B(&draw, sp_x, sp_y, sp_attr, DSP4.sprite_size, 0); + + // no following OAM data + DSP4_OP0B(&draw, 0, 0x0100, 0, 0, 1); + } + while (1); + } + while (1); + + terminate: + DSP4.waiting4command = TRUE; +} + +static void DSP4_OP0A (int16 n2, int16 *o1, int16 *o2, int16 *o3, int16 *o4) +{ + const uint16 OP0A_Values[16] = + { + 0x0000, 0x0030, 0x0060, 0x0090, 0x00c0, 0x00f0, 0x0120, 0x0150, + 0xfe80, 0xfeb0, 0xfee0, 0xff10, 0xff40, 0xff70, 0xffa0, 0xffd0 + }; + + *o4 = OP0A_Values[(n2 & 0x000f)]; + *o3 = OP0A_Values[(n2 & 0x00f0) >> 4]; + *o2 = OP0A_Values[(n2 & 0x0f00) >> 8]; + *o1 = OP0A_Values[(n2 & 0xf000) >> 12]; +} + +static void DSP4_OP0B (bool8 *draw, int16 sp_x, int16 sp_y, int16 sp_attr, bool8 size, bool8 stop) +{ + int16 Row1, Row2; + + // SR = 0x00 + + // align to nearest 8-pixel row + Row1 = (sp_y >> 3) & 0x1f; + Row2 = (Row1 + 1) & 0x1f; + + // check boundaries + if (!((sp_y < 0) || ((sp_y & 0x01ff) < 0x00eb))) + *draw = 0; + + if (size) + { + if (DSP4.OAM_Row[Row1] + 1 >= DSP4.OAM_RowMax) + *draw = 0; + if (DSP4.OAM_Row[Row2] + 1 >= DSP4.OAM_RowMax) + *draw = 0; + } + else + { + if (DSP4.OAM_Row[Row1] >= DSP4.OAM_RowMax) + *draw = 0; + } + + // emulator fail-safe (unknown if this really exists) + if (DSP4.sprite_count >= 128) + *draw = 0; + + // SR = 0x80 + + if (*draw) + { + // Row tiles + if (size) + { + DSP4.OAM_Row[Row1] += 2; + DSP4.OAM_Row[Row2] += 2; + } + else + DSP4.OAM_Row[Row1]++; + + // yield OAM output + DSP4_WRITE_WORD(1); + + // pack OAM data: x, y, name, attr + DSP4_WRITE_BYTE(sp_x & 0xff); + DSP4_WRITE_BYTE(sp_y & 0xff); + DSP4_WRITE_WORD(sp_attr); + + DSP4.sprite_count++; + + // OAM: size, msb data + // save post-oam table data for future retrieval + DSP4.OAM_attr[DSP4.OAM_index] |= ((sp_x < 0 || sp_x > 255) << DSP4.OAM_bits); + DSP4.OAM_bits++; + + DSP4.OAM_attr[DSP4.OAM_index] |= (size << DSP4.OAM_bits); + DSP4.OAM_bits++; + + // move to next byte in buffer + if (DSP4.OAM_bits == 16) + { + DSP4.OAM_bits = 0; + DSP4.OAM_index++; + } + } + else + if (stop) + // yield no OAM output + DSP4_WRITE_WORD(0); +} + +static void DSP4_OP0D (void) +{ + DSP4.waiting4command = FALSE; + + // op flow control + switch (DSP4.Logic) + { + case 1: goto resume1; break; + case 2: goto resume2; break; + } + + //////////////////////////////////////////////////// + // process initial inputs + + // sort inputs + DSP4.world_y = DSP4_READ_DWORD(); + DSP4.poly_bottom[0][0] = DSP4_READ_WORD(); + DSP4.poly_top[0][0] = DSP4_READ_WORD(); + DSP4.poly_cx[1][0] = DSP4_READ_WORD(); + DSP4.viewport_bottom = DSP4_READ_WORD(); + DSP4.world_x = DSP4_READ_DWORD(); + DSP4.poly_cx[0][0] = DSP4_READ_WORD(); + DSP4.poly_ptr[0][0] = DSP4_READ_WORD(); + DSP4.world_yofs = DSP4_READ_WORD(); + DSP4.world_dy = DSP4_READ_DWORD(); + DSP4.world_dx = DSP4_READ_DWORD(); + DSP4.distance = DSP4_READ_WORD(); + DSP4_READ_WORD(); // 0x0000 + DSP4.world_xenv = SEX78(DSP4_READ_WORD()); + DSP4.world_ddy = DSP4_READ_WORD(); + DSP4.world_ddx = DSP4_READ_WORD(); + DSP4.view_yofsenv = DSP4_READ_WORD(); + + // initial (x, y, offset) at starting raster line + DSP4.view_x1 = (DSP4.world_x + DSP4.world_xenv) >> 16; + DSP4.view_y1 = DSP4.world_y >> 16; + DSP4.view_xofs1 = DSP4.world_x >> 16; + DSP4.view_yofs1 = DSP4.world_yofs; + + // first raster line + DSP4.poly_raster[0][0] = DSP4.poly_bottom[0][0]; + + do + { + //////////////////////////////////////////////////// + // process one iteration of projection + + // perspective projection of world (x, y, scroll) points + // based on the current projection lines + DSP4.view_x2 = (((DSP4.world_x + DSP4.world_xenv) >> 16) * DSP4.distance >> 15) + (DSP4.view_turnoff_x * DSP4.distance >> 15); + DSP4.view_y2 = (DSP4.world_y >> 16) * DSP4.distance >> 15; + DSP4.view_xofs2 = DSP4.view_x2; + DSP4.view_yofs2 = (DSP4.world_yofs * DSP4.distance >> 15) + DSP4.poly_bottom[0][0] - DSP4.view_y2; + + // 1. World x-location before transformation + // 2. Viewer x-position at the current + // 3. World y-location before perspective projection + // 4. Viewer y-position below the horizon + // 5. Number of raster lines drawn in this iteration + DSP4_CLEAR_OUT(); + DSP4_WRITE_WORD((DSP4.world_x + DSP4.world_xenv) >> 16); + DSP4_WRITE_WORD(DSP4.view_x2); + DSP4_WRITE_WORD(DSP4.world_y >> 16); + DSP4_WRITE_WORD(DSP4.view_y2); + + ////////////////////////////////////////////////////////// + + // SR = 0x00 + + // determine # of raster lines used + DSP4.segments = DSP4.view_y1 - DSP4.view_y2; + + // prevent overdraw + if (DSP4.view_y2 >= DSP4.poly_raster[0][0]) + DSP4.segments = 0; + else + DSP4.poly_raster[0][0] = DSP4.view_y2; + + // don't draw outside the window + if (DSP4.view_y2 < DSP4.poly_top[0][0]) + { + DSP4.segments = 0; + + // flush remaining raster lines + if (DSP4.view_y1 >= DSP4.poly_top[0][0]) + DSP4.segments = DSP4.view_y1 - DSP4.poly_top[0][0]; + } + + // SR = 0x80 + + DSP4_WRITE_WORD(DSP4.segments); + + ////////////////////////////////////////////////////////// + + // scan next command if no SR check needed + if (DSP4.segments) + { + int32 px_dx, py_dy; + int32 x_scroll, y_scroll; + + // SR = 0x00 + + // linear interpolation (lerp) between projected points + px_dx = (DSP4.view_xofs2 - DSP4.view_xofs1) * DSP4_Inverse(DSP4.segments) << 1; + py_dy = (DSP4.view_yofs2 - DSP4.view_yofs1) * DSP4_Inverse(DSP4.segments) << 1; + + // starting step values + x_scroll = SEX16(DSP4.poly_cx[0][0] + DSP4.view_xofs1); + y_scroll = SEX16(-DSP4.viewport_bottom + DSP4.view_yofs1 + DSP4.view_yofsenv + DSP4.poly_cx[1][0] - DSP4.world_yofs); + + // SR = 0x80 + + // rasterize line + for (DSP4.lcv = 0; DSP4.lcv < DSP4.segments; DSP4.lcv++) + { + // 1. HDMA memory pointer (bg1) + // 2. vertical scroll offset ($210E) + // 3. horizontal scroll offset ($210D) + DSP4_WRITE_WORD(DSP4.poly_ptr[0][0]); + DSP4_WRITE_WORD((y_scroll + 0x8000) >> 16); + DSP4_WRITE_WORD((x_scroll + 0x8000) >> 16); + + // update memory address + DSP4.poly_ptr[0][0] -= 4; + + // update screen values + x_scroll += px_dx; + y_scroll += py_dy; + } + } + + ///////////////////////////////////////////////////// + // Post-update + + // update new viewer (x, y, scroll) to last raster line drawn + DSP4.view_x1 = DSP4.view_x2; + DSP4.view_y1 = DSP4.view_y2; + DSP4.view_xofs1 = DSP4.view_xofs2; + DSP4.view_yofs1 = DSP4.view_yofs2; + + // add deltas for projection lines + DSP4.world_dx += SEX78(DSP4.world_ddx); + DSP4.world_dy += SEX78(DSP4.world_ddy); + + // update projection lines + DSP4.world_x += (DSP4.world_dx + DSP4.world_xenv); + DSP4.world_y += DSP4.world_dy; + + //////////////////////////////////////////////////// + // command check + + // scan next command + DSP4.in_count = 2; + DSP4_WAIT(1); + + resume1: + + // inspect input + DSP4.distance = DSP4_READ_WORD(); + + // terminate op + if (DSP4.distance == -0x8000) + break; + + // already have 2 bytes in queue + DSP4.in_count = 6; + DSP4_WAIT(2); + + resume2: + + // inspect inputs + DSP4.world_ddy = DSP4_READ_WORD(); + DSP4.world_ddx = DSP4_READ_WORD(); + DSP4.view_yofsenv = DSP4_READ_WORD(); + + // no envelope here + DSP4.world_xenv = 0; + } + while (1); + + DSP4.waiting4command = TRUE; +} + +static void DSP4_OP0E (void) +{ + DSP4.OAM_RowMax = 16; + memset(DSP4.OAM_Row, 0, 64); +} + +static void DSP4_OP0F (void) +{ + DSP4.waiting4command = FALSE; + + // op flow control + switch (DSP4.Logic) + { + case 1: goto resume1; break; + case 2: goto resume2; break; + case 3: goto resume3; break; + case 4: goto resume4; break; + } + + //////////////////////////////////////////////////// + // process initial inputs + + // sort inputs + DSP4_READ_WORD(); // 0x0000 + DSP4.world_y = DSP4_READ_DWORD(); + DSP4.poly_bottom[0][0] = DSP4_READ_WORD(); + DSP4.poly_top[0][0] = DSP4_READ_WORD(); + DSP4.poly_cx[1][0] = DSP4_READ_WORD(); + DSP4.viewport_bottom = DSP4_READ_WORD(); + DSP4.world_x = DSP4_READ_DWORD(); + DSP4.poly_cx[0][0] = DSP4_READ_WORD(); + DSP4.poly_ptr[0][0] = DSP4_READ_WORD(); + DSP4.world_yofs = DSP4_READ_WORD(); + DSP4.world_dy = DSP4_READ_DWORD(); + DSP4.world_dx = DSP4_READ_DWORD(); + DSP4.distance = DSP4_READ_WORD(); + DSP4_READ_WORD(); // 0x0000 + DSP4.world_xenv = DSP4_READ_DWORD(); + DSP4.world_ddy = DSP4_READ_WORD(); + DSP4.world_ddx = DSP4_READ_WORD(); + DSP4.view_yofsenv = DSP4_READ_WORD(); + + // initial (x, y, offset) at starting raster line + DSP4.view_x1 = (DSP4.world_x + DSP4.world_xenv) >> 16; + DSP4.view_y1 = DSP4.world_y >> 16; + DSP4.view_xofs1 = DSP4.world_x >> 16; + DSP4.view_yofs1 = DSP4.world_yofs; + DSP4.view_turnoff_x = 0; + DSP4.view_turnoff_dx = 0; + + // first raster line + DSP4.poly_raster[0][0] = DSP4.poly_bottom[0][0]; + + do + { + //////////////////////////////////////////////////// + // process one iteration of projection + + // perspective projection of world (x, y, scroll) points + // based on the current projection lines + DSP4.view_x2 = ((DSP4.world_x + DSP4.world_xenv) >> 16) * DSP4.distance >> 15; + DSP4.view_y2 = (DSP4.world_y >> 16) * DSP4.distance >> 15; + DSP4.view_xofs2 = DSP4.view_x2; + DSP4.view_yofs2 = (DSP4.world_yofs * DSP4.distance >> 15) + DSP4.poly_bottom[0][0] - DSP4.view_y2; + + // 1. World x-location before transformation + // 2. Viewer x-position at the next + // 3. World y-location before perspective projection + // 4. Viewer y-position below the horizon + // 5. Number of raster lines drawn in this iteration + DSP4_CLEAR_OUT(); + DSP4_WRITE_WORD((DSP4.world_x + DSP4.world_xenv) >> 16); + DSP4_WRITE_WORD(DSP4.view_x2); + DSP4_WRITE_WORD(DSP4.world_y >> 16); + DSP4_WRITE_WORD(DSP4.view_y2); + + ////////////////////////////////////////////////////// + + // SR = 0x00 + + // determine # of raster lines used + DSP4.segments = DSP4.poly_raster[0][0] - DSP4.view_y2; + + // prevent overdraw + if (DSP4.view_y2 >= DSP4.poly_raster[0][0]) + DSP4.segments = 0; + else + DSP4.poly_raster[0][0] = DSP4.view_y2; + + // don't draw outside the window + if (DSP4.view_y2 < DSP4.poly_top[0][0]) + { + DSP4.segments = 0; + + // flush remaining raster lines + if (DSP4.view_y1 >= DSP4.poly_top[0][0]) + DSP4.segments = DSP4.view_y1 - DSP4.poly_top[0][0]; + } + + // SR = 0x80 + + DSP4_WRITE_WORD(DSP4.segments); + + ////////////////////////////////////////////////////// + + // scan next command if no SR check needed + if (DSP4.segments) + { + int32 px_dx, py_dy; + int32 x_scroll, y_scroll; + + for (DSP4.lcv = 0; DSP4.lcv < 4; DSP4.lcv++) + { + // grab inputs + DSP4.in_count = 4; + DSP4_WAIT(1); + + resume1: + + for (;;) + { + int16 dist; + int16 color, red, green, blue; + + dist = DSP4_READ_WORD(); + color = DSP4_READ_WORD(); + + // U1+B5+G5+R5 + red = color & 0x1f; + green = (color >> 5) & 0x1f; + blue = (color >> 10) & 0x1f; + + // dynamic lighting + red = (red * dist >> 15) & 0x1f; + green = (green * dist >> 15) & 0x1f; + blue = (blue * dist >> 15) & 0x1f; + color = red | (green << 5) | (blue << 10); + + DSP4_CLEAR_OUT(); + DSP4_WRITE_WORD(color); + + break; + } + } + + ////////////////////////////////////////////////////// + + // SR = 0x00 + + // linear interpolation (lerp) between projected points + px_dx = (DSP4.view_xofs2 - DSP4.view_xofs1) * DSP4_Inverse(DSP4.segments) << 1; + py_dy = (DSP4.view_yofs2 - DSP4.view_yofs1) * DSP4_Inverse(DSP4.segments) << 1; + + // starting step values + x_scroll = SEX16(DSP4.poly_cx[0][0] + DSP4.view_xofs1); + y_scroll = SEX16(-DSP4.viewport_bottom + DSP4.view_yofs1 + DSP4.view_yofsenv + DSP4.poly_cx[1][0] - DSP4.world_yofs); + + // SR = 0x80 + + // rasterize line + for (DSP4.lcv = 0; DSP4.lcv < DSP4.segments; DSP4.lcv++) + { + // 1. HDMA memory pointer + // 2. vertical scroll offset ($210E) + // 3. horizontal scroll offset ($210D) + DSP4_WRITE_WORD(DSP4.poly_ptr[0][0]); + DSP4_WRITE_WORD((y_scroll + 0x8000) >> 16); + DSP4_WRITE_WORD((x_scroll + 0x8000) >> 16); + + // update memory address + DSP4.poly_ptr[0][0] -= 4; + + // update screen values + x_scroll += px_dx; + y_scroll += py_dy; + } + } + + //////////////////////////////////////////////////// + // Post-update + + // update new viewer (x, y, scroll) to last raster line drawn + DSP4.view_x1 = DSP4.view_x2; + DSP4.view_y1 = DSP4.view_y2; + DSP4.view_xofs1 = DSP4.view_xofs2; + DSP4.view_yofs1 = DSP4.view_yofs2; + + // add deltas for projection lines + DSP4.world_dx += SEX78(DSP4.world_ddx); + DSP4.world_dy += SEX78(DSP4.world_ddy); + + // update projection lines + DSP4.world_x += (DSP4.world_dx + DSP4.world_xenv); + DSP4.world_y += DSP4.world_dy; + + // update road turnoff position + DSP4.view_turnoff_x += DSP4.view_turnoff_dx; + + //////////////////////////////////////////////////// + // command check + + // scan next command + DSP4.in_count = 2; + DSP4_WAIT(2); + + resume2: + + // check for termination + DSP4.distance = DSP4_READ_WORD(); + if (DSP4.distance == -0x8000) + break; + + // road splice + if ((uint16) DSP4.distance == 0x8001) + { + DSP4.in_count = 6; + DSP4_WAIT(3); + + resume3: + + DSP4.distance = DSP4_READ_WORD(); + DSP4.view_turnoff_x = DSP4_READ_WORD(); + DSP4.view_turnoff_dx = DSP4_READ_WORD(); + + // factor in new changes + DSP4.view_x1 += (DSP4.view_turnoff_x * DSP4.distance >> 15); + DSP4.view_xofs1 += (DSP4.view_turnoff_x * DSP4.distance >> 15); + + // update stepping values + DSP4.view_turnoff_x += DSP4.view_turnoff_dx; + + DSP4.in_count = 2; + DSP4_WAIT(2); + } + + // already have 2 bytes in queue + DSP4.in_count = 6; + DSP4_WAIT(4); + + resume4: + + // inspect inputs + DSP4.world_ddy = DSP4_READ_WORD(); + DSP4.world_ddx = DSP4_READ_WORD(); + DSP4.view_yofsenv = DSP4_READ_WORD(); + + // no envelope here + DSP4.world_xenv = 0; + } + while (1); + + // terminate op + DSP4.waiting4command = TRUE; +} + +static void DSP4_OP10 (void) +{ + DSP4.waiting4command = FALSE; + + // op flow control + switch (DSP4.Logic) + { + case 1: goto resume1; break; + case 2: goto resume2; break; + case 3: goto resume3; break; + } + + //////////////////////////////////////////////////// + // sort inputs + + DSP4_READ_WORD(); // 0x0000 + DSP4.world_y = DSP4_READ_DWORD(); + DSP4.poly_bottom[0][0] = DSP4_READ_WORD(); + DSP4.poly_top[0][0] = DSP4_READ_WORD(); + DSP4.poly_cx[1][0] = DSP4_READ_WORD(); + DSP4.viewport_bottom = DSP4_READ_WORD(); + DSP4.world_x = DSP4_READ_DWORD(); + DSP4.poly_cx[0][0] = DSP4_READ_WORD(); + DSP4.poly_ptr[0][0] = DSP4_READ_WORD(); + DSP4.world_yofs = DSP4_READ_WORD(); + DSP4.distance = DSP4_READ_WORD(); + DSP4.view_y2 = DSP4_READ_WORD(); + DSP4.view_dy = DSP4_READ_WORD() * DSP4.distance >> 15; + DSP4.view_x2 = DSP4_READ_WORD(); + DSP4.view_dx = DSP4_READ_WORD() * DSP4.distance >> 15; + DSP4.view_yofsenv = DSP4_READ_WORD(); + + // initial (x, y, offset) at starting raster line + DSP4.view_x1 = DSP4.world_x >> 16; + DSP4.view_y1 = DSP4.world_y >> 16; + DSP4.view_xofs1 = DSP4.view_x1; + DSP4.view_yofs1 = DSP4.world_yofs; + + // first raster line + DSP4.poly_raster[0][0] = DSP4.poly_bottom[0][0]; + + do + { + //////////////////////////////////////////////////// + // process one iteration of projection + + // add shaping + DSP4.view_x2 += DSP4.view_dx; + DSP4.view_y2 += DSP4.view_dy; + + // vertical scroll calculation + DSP4.view_xofs2 = DSP4.view_x2; + DSP4.view_yofs2 = (DSP4.world_yofs * DSP4.distance >> 15) + DSP4.poly_bottom[0][0] - DSP4.view_y2; + + // 1. Viewer x-position at the next + // 2. Viewer y-position below the horizon + // 3. Number of raster lines drawn in this iteration + DSP4_CLEAR_OUT(); + DSP4_WRITE_WORD(DSP4.view_x2); + DSP4_WRITE_WORD(DSP4.view_y2); + + ////////////////////////////////////////////////////// + + // SR = 0x00 + + // determine # of raster lines used + DSP4.segments = DSP4.view_y1 - DSP4.view_y2; + + // prevent overdraw + if (DSP4.view_y2 >= DSP4.poly_raster[0][0]) + DSP4.segments = 0; + else + DSP4.poly_raster[0][0] = DSP4.view_y2; + + // don't draw outside the window + if (DSP4.view_y2 < DSP4.poly_top[0][0]) + { + DSP4.segments = 0; + + // flush remaining raster lines + if (DSP4.view_y1 >= DSP4.poly_top[0][0]) + DSP4.segments = DSP4.view_y1 - DSP4.poly_top[0][0]; + } + + // SR = 0x80 + + DSP4_WRITE_WORD(DSP4.segments); + + ////////////////////////////////////////////////////// + + // scan next command if no SR check needed + if (DSP4.segments) + { + for (DSP4.lcv = 0; DSP4.lcv < 4; DSP4.lcv++) + { + // grab inputs + DSP4.in_count = 4; + DSP4_WAIT(1); + + resume1: + + for (;;) + { + int16 dist; + int16 color, red, green, blue; + + dist = DSP4_READ_WORD(); + color = DSP4_READ_WORD(); + + // U1+B5+G5+R5 + red = color & 0x1f; + green = (color >> 5) & 0x1f; + blue = (color >> 10) & 0x1f; + + // dynamic lighting + red = (red * dist >> 15) & 0x1f; + green = (green * dist >> 15) & 0x1f; + blue = (blue * dist >> 15) & 0x1f; + color = red | (green << 5) | (blue << 10); + + DSP4_CLEAR_OUT(); + DSP4_WRITE_WORD(color); + + break; + } + } + } + + ////////////////////////////////////////////////////// + + // scan next command if no SR check needed + if (DSP4.segments) + { + int32 px_dx, py_dy; + int32 x_scroll, y_scroll; + + // SR = 0x00 + + // linear interpolation (lerp) between projected points + px_dx = (DSP4.view_xofs2 - DSP4.view_xofs1) * DSP4_Inverse(DSP4.segments) << 1; + py_dy = (DSP4.view_yofs2 - DSP4.view_yofs1) * DSP4_Inverse(DSP4.segments) << 1; + + // starting step values + x_scroll = SEX16(DSP4.poly_cx[0][0] + DSP4.view_xofs1); + y_scroll = SEX16(-DSP4.viewport_bottom + DSP4.view_yofs1 + DSP4.view_yofsenv + DSP4.poly_cx[1][0] - DSP4.world_yofs); + + // SR = 0x80 + + // rasterize line + for (DSP4.lcv = 0; DSP4.lcv < DSP4.segments; DSP4.lcv++) + { + // 1. HDMA memory pointer (bg2) + // 2. vertical scroll offset ($2110) + // 3. horizontal scroll offset ($210F) + DSP4_WRITE_WORD(DSP4.poly_ptr[0][0]); + DSP4_WRITE_WORD((y_scroll + 0x8000) >> 16); + DSP4_WRITE_WORD((x_scroll + 0x8000) >> 16); + + // update memory address + DSP4.poly_ptr[0][0] -= 4; + + // update screen values + x_scroll += px_dx; + y_scroll += py_dy; + } + } + + ///////////////////////////////////////////////////// + // Post-update + + // update new viewer (x, y, scroll) to last raster line drawn + DSP4.view_x1 = DSP4.view_x2; + DSP4.view_y1 = DSP4.view_y2; + DSP4.view_xofs1 = DSP4.view_xofs2; + DSP4.view_yofs1 = DSP4.view_yofs2; + + //////////////////////////////////////////////////// + // command check + + // scan next command + DSP4.in_count = 2; + DSP4_WAIT(2); + + resume2: + + // check for opcode termination + DSP4.distance = DSP4_READ_WORD(); + if (DSP4.distance == -0x8000) + break; + + // already have 2 bytes in queue + DSP4.in_count = 10; + DSP4_WAIT(3); + + resume3: + + // inspect inputs + DSP4.view_y2 = DSP4_READ_WORD(); + DSP4.view_dy = DSP4_READ_WORD() * DSP4.distance >> 15; + DSP4.view_x2 = DSP4_READ_WORD(); + DSP4.view_dx = DSP4_READ_WORD() * DSP4.distance >> 15; + } + while (1); + + DSP4.waiting4command = TRUE; +} + +static void DSP4_OP11 (int16 A, int16 B, int16 C, int16 D, int16 *M) +{ + // 0x155 = 341 = Horizontal Width of the Screen + *M = ((A * 0x0155 >> 2) & 0xf000) | ((B * 0x0155 >> 6) & 0x0f00) | ((C * 0x0155 >> 10) & 0x00f0) | ((D * 0x0155 >> 14) & 0x000f); +} + +static void DSP4_SetByte (void) +{ + // clear pending read + if (DSP4.out_index < DSP4.out_count) + { + DSP4.out_index++; + return; + } + + if (DSP4.waiting4command) + { + if (DSP4.half_command) + { + DSP4.command |= (DSP4.byte << 8); + DSP4.in_index = 0; + DSP4.waiting4command = FALSE; + DSP4.half_command = FALSE; + DSP4.out_count = 0; + DSP4.out_index = 0; + + DSP4.Logic = 0; + + switch (DSP4.command) + { + case 0x0000: DSP4.in_count = 4; break; + case 0x0001: DSP4.in_count = 44; break; + case 0x0003: DSP4.in_count = 0; break; + case 0x0005: DSP4.in_count = 0; break; + case 0x0006: DSP4.in_count = 0; break; + case 0x0007: DSP4.in_count = 34; break; + case 0x0008: DSP4.in_count = 90; break; + case 0x0009: DSP4.in_count = 14; break; + case 0x000a: DSP4.in_count = 6; break; + case 0x000b: DSP4.in_count = 6; break; + case 0x000d: DSP4.in_count = 42; break; + case 0x000e: DSP4.in_count = 0; break; + case 0x000f: DSP4.in_count = 46; break; + case 0x0010: DSP4.in_count = 36; break; + case 0x0011: DSP4.in_count = 8; break; + default: + DSP4.waiting4command = TRUE; + break; + } + } + else + { + DSP4.command = DSP4.byte; + DSP4.half_command = TRUE; + } + } + else + { + DSP4.parameters[DSP4.in_index] = DSP4.byte; + DSP4.in_index++; + } + + if (!DSP4.waiting4command && DSP4.in_count == DSP4.in_index) + { + // Actually execute the command + DSP4.waiting4command = TRUE; + DSP4.out_index = 0; + DSP4.in_index = 0; + + switch (DSP4.command) + { + // 16-bit multiplication + case 0x0000: + { + int16 multiplier, multiplicand; + int32 product; + + multiplier = DSP4_READ_WORD(); + multiplicand = DSP4_READ_WORD(); + + DSP4_Multiply(multiplicand, multiplier, &product); + + DSP4_CLEAR_OUT(); + DSP4_WRITE_WORD(product); + DSP4_WRITE_WORD(product >> 16); + + break; + } + + // single-player track projection + case 0x0001: + DSP4_OP01(); + break; + + // single-player selection + case 0x0003: + DSP4_OP03(); + break; + + // clear OAM + case 0x0005: + DSP4_OP05(); + break; + + // transfer OAM + case 0x0006: + DSP4_OP06(); + break; + + // single-player track turnoff projection + case 0x0007: + DSP4_OP07(); + break; + + // solid polygon projection + case 0x0008: + DSP4_OP08(); + break; + + // sprite projection + case 0x0009: + DSP4_OP09(); + break; + + // unknown + case 0x000A: + { + DSP4_READ_WORD(); + int16 in2a = DSP4_READ_WORD(); + DSP4_READ_WORD(); + int16 out1a, out2a, out3a, out4a; + + DSP4_OP0A(in2a, &out2a, &out1a, &out4a, &out3a); + + DSP4_CLEAR_OUT(); + DSP4_WRITE_WORD(out1a); + DSP4_WRITE_WORD(out2a); + DSP4_WRITE_WORD(out3a); + DSP4_WRITE_WORD(out4a); + + break; + } + + // set OAM + case 0x000B: + { + int16 sp_x = DSP4_READ_WORD(); + int16 sp_y = DSP4_READ_WORD(); + int16 sp_attr = DSP4_READ_WORD(); + bool8 draw = TRUE; + + DSP4_CLEAR_OUT(); + DSP4_OP0B(&draw, sp_x, sp_y, sp_attr, 0, 1); + + break; + } + + // multi-player track projection + case 0x000D: + DSP4_OP0D(); + break; + + // multi-player selection + case 0x000E: + DSP4_OP0E(); + break; + + // single-player track projection with lighting + case 0x000F: + DSP4_OP0F(); + break; + + // single-player track turnoff projection with lighting + case 0x0010: + DSP4_OP10(); + break; + + // unknown: horizontal mapping command + case 0x0011: + { + int16 a, b, c, d, m; + + d = DSP4_READ_WORD(); + c = DSP4_READ_WORD(); + b = DSP4_READ_WORD(); + a = DSP4_READ_WORD(); + + DSP4_OP11(a, b, c, d, &m); + + DSP4_CLEAR_OUT(); + DSP4_WRITE_WORD(m); + + break; + } + + default: + break; + } + } +} + +static void DSP4_GetByte (void) +{ + if (DSP4.out_count) + { + DSP4.byte = (uint8) DSP4.output[DSP4.out_index & 0x1FF]; + + DSP4.out_index++; + if (DSP4.out_count == DSP4.out_index) + DSP4.out_count = 0; + } + else + DSP4.byte = 0xff; +} + +void DSP4SetByte (uint8 byte, uint16 address) +{ + if (address < DSP0.boundary) + { + DSP4.byte = byte; + DSP4.address = address; + DSP4_SetByte(); + } +} + +uint8 DSP4GetByte (uint16 address) +{ + if (address < DSP0.boundary) + { + DSP4.address = address; + DSP4_GetByte(); + return (DSP4.byte); + } + + return (0x80); +} diff --git a/plugins/snes9x_gx/source/snes9x/font.h b/plugins/snes9x_gx/source/snes9x/font.h new file mode 100644 index 00000000..27011f6b --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/font.h @@ -0,0 +1,325 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _FONT_H_ +#define _FONT_H_ + +static const char *font[] = +{ + //2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678 + " . . . . .. . . ", + " .#. .#.#. . . ... .#. . . .##. .#. .#. . . . . ", + " .#. .#.#. .#.#. .###. .#..#. .#. .#. .#. .#. .#.#. .#. .#. ", + " .#. .#.#. .#####. .#.#. ..#. .#.#. .#. .#. .#. .#. ..#.. .... .#. ", + " .#. . . .#.#. .###. .#.. .#. . .#. .#. .###. .#####. .. .####. .. .#. ", + " . .#####. .#.#. .#..#. .#.#. .#. .#. .#. ..#.. .##. .... .##. .#. ", + " .#. .#.#. .###. . .#. .#.#. .#. .#. .#.#. .#. .#. .##. . ", + " . . . ... . . . . . . . . .#. .. ", + " . ", + //2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678 + " . . .. .... . .... .. .... .. .. . ", + " .#. .#. .##. .####. .#. .####. .##. .####. .##. .##. .. .. . . .#. ", + ".#.#. .##. .#..#. ...#. .##. .#... .#.. ...#. .#..#. .#..#. .##. .##. .#. .... .#. .#.#. ", + ".#.#. .#. . .#. .##. .#.#. .###. .###. .#. .##. .#..#. .##. .##. .#. .####. .#. ..#. ", + ".#.#. .#. .#. ...#. .####. ...#. .#..#. .#. .#..#. .###. .. .. .#. .... .#. .#. ", + ".#.#. .#. .#.. .#..#. ..#. .#..#. .#..#. .#. .#..#. ..#. .##. .##. .#. .####. .#. . ", + " .#. .###. .####. .##. .#. .##. .##. .#. .##. .##. .##. .#. .#. .... .#. .#. ", + " . ... .... .. . .. .. . .. .. .. .#. . . . ", + " . ", + //2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678 + " .. .. ... .. ... .... .... .. . . ... . . . . . . . . .. ", + " .##. .##. .###. .##. .###. .####. .####. .##. .#..#. .###. .#. .#..#. .#. .#. .#. .#. .#. .##. ", + ".#..#. .#..#. .#..#. .#..#. .#..#. .#... .#... .#..#. .#..#. .#. .#. .#.#. .#. .##.##. .##..#. .#..#. ", + ".#.##. .#..#. .###. .#. . .#..#. .###. .###. .#... .####. .#. .#. .##. .#. .#.#.#. .#.#.#. .#..#. ", + ".#.##. .####. .#..#. .#. . .#..#. .#.. .#.. .#.##. .#..#. .#. . .#. .##. .#. .#...#. .#.#.#. .#..#. ", + ".#... .#..#. .#..#. .#..#. .#..#. .#... .#. .#..#. .#..#. .#. .#..#. .#.#. .#... .#. .#. .#..##. .#..#. ", + " .##. .#..#. .###. .##. .###. .####. .#. .###. .#..#. .###. .##. .#..#. .####. .#. .#. .#. .#. .##. ", + " .. . . ... .. ... .... . ... . . ... .. . . .... . . . . .. ", + " ", + //2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678 + " ... .. ... .. ... . . . . . . . . . . .... ... ... . ", + ".###. .##. .###. .##. .###. .#. .#. .#. .#. .#. .#. .#..#. .#.#. .####. .###. . .###. .#. ", + ".#..#. .#..#. .#..#. .#..#. .#. .#. .#. .#. .#. .#...#. .#..#. .#.#. ...#. .#.. .#. ..#. .#.#. ", + ".#..#. .#..#. .#..#. .#.. .#. .#. .#. .#. .#. .#.#.#. .##. .#.#. .#. .#. .#. .#. . . ", + ".###. .#..#. .###. ..#. .#. .#. .#. .#. .#. .#.#.#. .#..#. .#. .#. .#. .#. .#. ", + ".#.. .##.#. .#.#. .#..#. .#. .#...#. .#.#. .##.##. .#..#. .#. .#... .#.. .#. ..#. .... ", + ".#. .##. .#..#. .##. .#. .###. .#. .#. .#. .#..#. .#. .####. .###. . .###. .####. ", + " . ..#. . . .. . ... . . . . . . .... ... ... .... ", + " . ", + //2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678 + " .. . . . . . . . .. ", + ".##. .#. .#. .#. .#. .#. .#. .#. .##. ", + " .#. ... .#.. .. ..#. .. .#.#. ... .#.. .. . .#.. .#. .. .. ... .. ", + " .#. .###. .###. .##. .###. .##. .#.. .###. .###. .##. .#. .#.#. .#. .##.##. .###. .##. ", + " . .#..#. .#..#. .#.. .#..#. .#.##. .###. .#..#. .#..#. .#. .#. .##. .#. .#.#.#. .#..#. .#..#. ", + " .#.##. .#..#. .#.. .#..#. .##.. .#. .##. .#..#. .#. ..#. .#.#. .#. .#...#. .#..#. .#..#. ", + " .#.#. .###. .##. .###. .##. .#. .#... .#..#. .###. .#.#. .#..#. .###. .#. .#. .#..#. .##. ", + " . . ... .. ... .. . .###. . . ... .#. . . ... . . . . .. ", + " ... . ", + //2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678 + " . . . . . . ", + " .#. .#. .#. .#. .#.#. ", + " ... ... ... ... .#. . . . . . . . . . . .... .#. .#. .#. .#.#. ", + ".###. .###. .###. .###. .###. .#..#. .#.#. .#...#. .#..#. .#..#. .####. .##. .#. .##. . . ", + ".#..#. .#..#. .#..#. .##.. .#. .#..#. .#.#. .#.#.#. .##. .#..#. ..#. .#. .#. .#. ", + ".#..#. .#..#. .#. . ..##. .#.. .#..#. .#.#. .#.#.#. .##. .#.#. .#.. .#. .#. .#. ", + ".###. .###. .#. .###. .##. .###. .#. .#.#. .#..#. .#. .####. .#. .#. .#. ", + ".#.. ..#. . ... .. ... . . . . . .#. .... . . . ", + " . . . ", + //2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678 + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + //2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678 + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + //2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678 + " .. ..... ", + " .##. .#####. ... . . . . .. ", + " .#. . .. ....#. .###. .#. .#. .#. .#.. .##. . . . ", + " .#. .#. .##. .#####. .#. .#. .###. ... .###. .###. .. .#. .#.#.#. ", + " . .#. .#. . .##. ....#. .#. .##. .#.#. .###. .#. .##.#. .##. .##. .#.#.#. ", + " .#. . .#. .#. .. ...#. .#. .#. ..#. .#. .##. .#.. ..#. .#. ...#. ", + " .#.#. .##. .#. .###. .#. .#. .#. .###. .#. .#. .####. .##. .##. ", + " .#. .. .#. ... . . . ... . . .... .. .. ", + " . . ", + //2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678 + " .... . . ... . . . .... . . . .. . ..... . . . ", + " .####. .#. ..#.. .###. ...#. ..#.. ..#.. .####. .#... .... .#.#. .##..#. .#####. .#... .#. .#. ", + " .... ...#. .#. .#####. .#. .#####. .#####. .#####. .#..#. .####. .####. .#####. .. .#. ....#. .#####. .#. .#. ", + ".####. .##. .## .#...#. .#. ...#. ..#.#. ..#.. .# .#. .#..#. ...#. .#.#. .##..#. .#. .#..#. .#..#. ", + " .... .#. .#.# . .#. .#. .##. .#..#. .#####. .#. .#. . .#. .#. ..#. .. .#. .#. .#.#. . .#. ", + " .#. .#. ..#. ..#.. .#.#. .#..#. ..#.. . .#. .#. ...#. .#. ...#. .#.#. .#... ...#. ", + " .#. .#. .##. .#####. .#..#. .#..#. .#. .#. .#. .####. .#. .###. .#. .#. .###. .###. ", + " . . .. ..... . . . . . . . .... . ... . . ... ... ", + " ", + //2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678 + " .... .. . . . ... . . ... .... . . . ..... . . ", + " .####. ..##. .#.#.#. .###. .#. ..#.. .###. .####. ..#.. .#. . . .#. .. .#####. .#. ..#.. ..... ", + " .#..#. .###. .#.#.#. ..... .#. .#####. ... ...#. .#####. .#. .#.#. .#..##. ....#. .#.#. .#####. .#####. ", + " .####. ..#. .#.#.#. .#####. .##. ..#.. .#.#. ....#. .#. .#.#. .###.. .#. .#..#. ..#.. .#. ", + ".#...#. .####. . ..#. ..#.. .#.#. .#. .#. .###. .#. .#. .#. .#.. .#. . .#. .#.#.#. .#.#. ", + " . .#. ..#. ...#. .#. .#.. ..#. ..... .#.#. .#.#.#. .#. .#. .#. .#.... ..#. .#. .#.#.#. .#. ", + " .#. .##. .###. .#. .#. .##. .#####. .#. .#. ..#.. .#. .#. .#. .####. .##. .#. ..#.. .#. ", + " . .. ... . . .. ..... . . . . . . .... .. . . . ", + " ", + //2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678 + " .. . . ... . .... .... . . . . . ..... . . . . ", + " .##. .#. .#. .###. .#... ... .####. .####. .#..#. .#.#. .#. ..... .#####. ....#. .#.#. .#. ", + " ..#. .#. . .#. .#. .#.##. .###. ...#. ..... .#..#. .#.#. .#. .#####. .#...#. .###.#. .#.#. .#.#. ", + " .##. .#. . .#.#. .#####. .##.#. .#. .###. .#####. .#..#. .#.#. .#. . .#...#. . .#. ....#. . . .#. ", + " ..#. .#..#. .##. ..#.. .#.#. ..#. ..#. ....#. . .#. .#.#. .#..#. .#...#. .#. .#. . ", + " .##. .####. ..#.#. .#.. .#. ...#. ...#. ..#. ..#. .#.#. .#.#. .#####. ..#. ...#. ", + " ..#. ...#. .##. . .###. .#. .#####. .####. .##. .##. .#..##. .##. .#...#. .##. .###. ", + " . . .. ... . ..... .... .. ... . .. .. . . .. ... ", + " ", + //2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678 + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + //2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678/2345678 + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " +}; + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/fxdbg.cpp b/plugins/snes9x_gx/source/snes9x/fxdbg.cpp new file mode 100644 index 00000000..ed971234 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/fxdbg.cpp @@ -0,0 +1,1425 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifdef DEBUGGER + +#include "snes9x.h" +#include "fxinst.h" +#include "fxemu.h" + +/* + When printing a line from the pipe, it could look like this: + + 01:8006 f4 fb 86 iwt r4, #$86fb + + The values are: + program bank : 01 + adress : 8006 + values at memory address 8006 : f4 fb 86 + instruction in the pipe : iwt r4, #$86fb + + Note! If the instruction has more than one byte (like in 'iwt') and the instruction is in a delay slot, + the second and third byte displayed will not be the same as those used. + Since the instrction is in a delay slot, + the first byte of the instruction will be taken from the pipe at the address after the branch instruction, + and the next one or two bytes will be taken from the address that the branch points to. + This is a bit complicated, but I've taken this into account, in this debug function. + (See the diffrence of how the values vPipe1 and vPipe2 are read, compared to the values vByte1 and vByte2) +*/ + +/* +static const char *fx_apvMnemonicTable[] = +{ + // ALT0 Table + + // 00 - 0f + "stop", + "nop", + "cache", + "lsr", + "rol", + "bra $%04x", + "blt $%04x", + "bge $%04x", + "bne $%04x", + "beq $%04x", + "bpl $%04x", + "bmi $%04x", + "bcc $%04x", + "bcs $%04x", + "bvc $%04x", + "bvs $%04x", + + // 10 - 1f + "to r0", + "to r1", + "to r2", + "to r3", + "to r4", + "to r5", + "to r6", + "to r7", + "to r8", + "to r9", + "to r10", + "to r11", + "to r12", + "to r13", + "to r14", + "to r15", + + // 20 - 2f + "with r0", + "with r1", + "with r2", + "with r3", + "with r4", + "with r5", + "with r6", + "with r7", + "with r8", + "with r9", + "with r10", + "with r11", + "with r12", + "with r13", + "with r14", + "with r15", + + // 30 - 3f + "stw (r0)", + "stw (r1)", + "stw (r2)", + "stw (r3)", + "stw (r4)", + "stw (r5)", + "stw (r6)", + "stw (r7)", + "stw (r8)", + "stw (r9)", + "stw (r10)", + "stw (r11)", + "loop", + "alt1", + "alt2", + "alt3", + + // 40 - 4f + "ldw (r0)", + "ldw (r1)", + "ldw (r2)", + "ldw (r3)", + "ldw (r4)", + "ldw (r5)", + "ldw (r6)", + "ldw (r7)", + "ldw (r8)", + "ldw (r9)", + "ldw (r10)", + "ldw (r11)", + "plot", + "swap", + "color", + "not", + + // 50 - 5f + "add r0", + "add r1", + "add r2", + "add r3", + "add r4", + "add r5", + "add r6", + "add r7", + "add r8", + "add r9", + "add r10", + "add r11", + "add r12", + "add r13", + "add r14", + "add r15", + + // 60 - 6f + "sub r0", + "sub r1", + "sub r2", + "sub r3", + "sub r4", + "sub r5", + "sub r6", + "sub r7", + "sub r8", + "sub r9", + "sub r10", + "sub r11", + "sub r12", + "sub r13", + "sub r14", + "sub r15", + + // 70 - 7f + "merge", + "and r1", + "and r2", + "and r3", + "and r4", + "and r5", + "and r6", + "and r7", + "and r8", + "and r9", + "and r10", + "and r11", + "and r12", + "and r13", + "and r14", + "and r15", + + // 80 - 8f + "mult r0", + "mult r1", + "mult r2", + "mult r3", + "mult r4", + "mult r5", + "mult r6", + "mult r7", + "mult r8", + "mult r9", + "mult r10", + "mult r11", + "mult r12", + "mult r13", + "mult r14", + "mult r15", + + // 90 - 9f + "sbk", + "link #1", + "link #2", + "link #3", + "link #4", + "sex", + "asr", + "ror", + "jmp (r8)", + "jmp (r9)", + "jmp (r10)", + "jmp (r11)", + "jmp (r12)", + "jmp (r13)", + "lob", + "fmult", + + // a0 - af + "ibt r0, #$%02x", + "ibt r1, #$%02x", + "ibt r2, #$%02x", + "ibt r3, #$%02x", + "ibt r4, #$%02x", + "ibt r5, #$%02x", + "ibt r6, #$%02x", + "ibt r7, #$%02x", + "ibt r8, #$%02x", + "ibt r9, #$%02x", + "ibt r10, #$%02x", + "ibt r11, #$%02x", + "ibt r12, #$%02x", + "ibt r13, #$%02x", + "ibt r14, #$%02x", + "ibt r15, #$%02x", + + // b0 - bf + "from r0", + "from r1", + "from r2", + "from r3", + "from r4", + "from r5", + "from r6", + "from r7", + "from r8", + "from r9", + "from r10", + "from r11", + "from r12", + "from r13", + "from r14", + "from r15", + + // c0 - cf + "hib", + "or r1", + "or r2", + "or r3", + "or r4", + "or r5", + "or r6", + "or r7", + "or r8", + "or r9", + "or r10", + "or r11", + "or r12", + "or r13", + "or r14", + "or r15", + + // d0 - df + "inc r0", + "inc r1", + "inc r2", + "inc r3", + "inc r4", + "inc r5", + "inc r6", + "inc r7", + "inc r8", + "inc r9", + "inc r10", + "inc r11", + "inc r12", + "inc r13", + "inc r14", + "getc", + + // e0 - ef + "dec r0", + "dec r1", + "dec r2", + "dec r3", + "dec r4", + "dec r5", + "dec r6", + "dec r7", + "dec r8", + "dec r9", + "dec r10", + "dec r11", + "dec r12", + "dec r13", + "dec r14", + "getb", + + // f0 - ff + "iwt r0, #$%04x", + "iwt r1, #$%04x", + "iwt r2, #$%04x", + "iwt r3, #$%04x", + "iwt r4, #$%04x", + "iwt r5, #$%04x", + "iwt r6, #$%04x", + "iwt r7, #$%04x", + "iwt r8, #$%04x", + "iwt r9, #$%04x", + "iwt r10, #$%04x", + "iwt r11, #$%04x", + "iwt r12, #$%04x", + "iwt r13, #$%04x", + "iwt r14, #$%04x", + "iwt r15, #$%04x", + + // ALT1 Table + + // 00 - 0f + "stop", + "nop", + "cache", + "lsr", + "rol", + "bra $%04x", + "blt $%04x", + "bge $%04x", + "bne $%04x", + "beq $%04x", + "bpl $%04x", + "bmi $%04x", + "bcc $%04x", + "bcs $%04x", + "bvc $%04x", + "bvs $%04x", + + // 10 - 1f + "to r0", + "to r1", + "to r2", + "to r3", + "to r4", + "to r5", + "to r6", + "to r7", + "to r8", + "to r9", + "to r10", + "to r11", + "to r12", + "to r13", + "to r14", + "to r15", + + // 20 - 2f + "with r0", + "with r1", + "with r2", + "with r3", + "with r4", + "with r5", + "with r6", + "with r7", + "with r8", + "with r9", + "with r10", + "with r11", + "with r12", + "with r13", + "with r14", + "with r15", + + // 30 - 3f + "stb (r0)", + "stb (r1)", + "stb (r2)", + "stb (r3)", + "stb (r4)", + "stb (r5)", + "stb (r6)", + "stb (r7)", + "stb (r8)", + "stb (r9)", + "stb (r10)", + "stb (r11)", + "loop", + "alt1", + "alt2", + "alt3", + + // 40 - 4f + "ldb (r0)", + "ldb (r1)", + "ldb (r2)", + "ldb (r3)", + "ldb (r4)", + "ldb (r5)", + "ldb (r6)", + "ldb (r7)", + "ldb (r8)", + "ldb (r9)", + "ldb (r10)", + "ldb (r11)", + "rpix", + "swap", + "cmode", + "not", + + // 50 - 5f + "adc r0", + "adc r1", + "adc r2", + "adc r3", + "adc r4", + "adc r5", + "adc r6", + "adc r7", + "adc r8", + "adc r9", + "adc r10", + "adc r11", + "adc r12", + "adc r13", + "adc r14", + "adc r15", + + // 60 - 6f + "sbc r0", + "sbc r1", + "sbc r2", + "sbc r3", + "sbc r4", + "sbc r5", + "sbc r6", + "sbc r7", + "sbc r8", + "sbc r9", + "sbc r10", + "sbc r11", + "sbc r12", + "sbc r13", + "sbc r14", + "sbc r15", + + // 70 - 7f + "merge", + "bic r1", + "bic r2", + "bic r3", + "bic r4", + "bic r5", + "bic r6", + "bic r7", + "bic r8", + "bic r9", + "bic r10", + "bic r11", + "bic r12", + "bic r13", + "bic r14", + "bic r15", + + // 80 - 8f + "umult r0", + "umult r1", + "umult r2", + "umult r3", + "umult r4", + "umult r5", + "umult r6", + "umult r7", + "umult r8", + "umult r9", + "umult r10", + "umult r11", + "umult r12", + "umult r13", + "umult r14", + "umult r15", + + // 90 - 9f + "sbk", + "link #1", + "link #2", + "link #3", + "link #4", + "sex", + "div2", + "ror", + "ljmp (r8)", + "ljmp (r9)", + "ljmp (r10)", + "ljmp (r11)", + "ljmp (r12)", + "ljmp (r13)", + "lob", + "lmult", + + // a0 - af + "lms r0, ($%04x)", + "lms r1, ($%04x)", + "lms r2, ($%04x)", + "lms r3, ($%04x)", + "lms r4, ($%04x)", + "lms r5, ($%04x)", + "lms r6, ($%04x)", + "lms r7, ($%04x)", + "lms r8, ($%04x)", + "lms r9, ($%04x)", + "lms r10, ($%04x)", + "lms r11, ($%04x)", + "lms r12, ($%04x)", + "lms r13, ($%04x)", + "lms r14, ($%04x)", + "lms r15, ($%04x)", + + // b0 - bf + "from r0", + "from r1", + "from r2", + "from r3", + "from r4", + "from r5", + "from r6", + "from r7", + "from r8", + "from r9", + "from r10", + "from r11", + "from r12", + "from r13", + "from r14", + "from r15", + + // c0 - cf + "hib", + "xor r1", + "xor r2", + "xor r3", + "xor r4", + "xor r5", + "xor r6", + "xor r7", + "xor r8", + "xor r9", + "xor r10", + "xor r11", + "xor r12", + "xor r13", + "xor r14", + "xor r15", + + // d0 - df + "inc r0", + "inc r1", + "inc r2", + "inc r3", + "inc r4", + "inc r5", + "inc r6", + "inc r7", + "inc r8", + "inc r9", + "inc r10", + "inc r11", + "inc r12", + "inc r13", + "inc r14", + "getc", + + // e0 - ef + "dec r0", + "dec r1", + "dec r2", + "dec r3", + "dec r4", + "dec r5", + "dec r6", + "dec r7", + "dec r8", + "dec r9", + "dec r10", + "dec r11", + "dec r12", + "dec r13", + "dec r14", + "getbh", + + // f0 - ff + "lm r0, ($%04x)", + "lm r1, ($%04x)", + "lm r2, ($%04x)", + "lm r3, ($%04x)", + "lm r4, ($%04x)", + "lm r5, ($%04x)", + "lm r6, ($%04x)", + "lm r7, ($%04x)", + "lm r8, ($%04x)", + "lm r9, ($%04x)", + "lm r10, ($%04x)", + "lm r11, ($%04x)", + "lm r12, ($%04x)", + "lm r13, ($%04x)", + "lm r14, ($%04x)", + "lm r15, ($%04x)", + + // ALT2 Table + + // 00 - 0f + "stop", + "nop", + "cache", + "lsr", + "rol", + "bra $%04x", + "blt $%04x", + "bge $%04x", + "bne $%04x", + "beq $%04x", + "bpl $%04x", + "bmi $%04x", + "bcc $%04x", + "bcs $%04x", + "bvc $%04x", + "bvs $%04x", + + // 10 - 1f + "to r0", + "to r1", + "to r2", + "to r3", + "to r4", + "to r5", + "to r6", + "to r7", + "to r8", + "to r9", + "to r10", + "to r11", + "to r12", + "to r13", + "to r14", + "to r15", + + // 20 - 2f + "with r0", + "with r1", + "with r2", + "with r3", + "with r4", + "with r5", + "with r6", + "with r7", + "with r8", + "with r9", + "with r10", + "with r11", + "with r12", + "with r13", + "with r14", + "with r15", + + // 30 - 3f + "stw (r0)", + "stw (r1)", + "stw (r2)", + "stw (r3)", + "stw (r4)", + "stw (r5)", + "stw (r6)", + "stw (r7)", + "stw (r8)", + "stw (r9)", + "stw (r10)", + "stw (r11)", + "loop", + "alt1", + "alt2", + "alt3", + + // 40 - 4f + "ldw (r0)", + "ldw (r1)", + "ldw (r2)", + "ldw (r3)", + "ldw (r4)", + "ldw (r5)", + "ldw (r6)", + "ldw (r7)", + "ldw (r8)", + "ldw (r9)", + "ldw (r10)", + "ldw (r11)", + "plot", + "swap", + "color", + "not", + + // 50 - 5f + "add #0", + "add #1", + "add #2", + "add #3", + "add #4", + "add #5", + "add #6", + "add #7", + "add #8", + "add #9", + "add #10", + "add #11", + "add #12", + "add #13", + "add #14", + "add #15", + + // 60 - 6f + "sub #0", + "sub #1", + "sub #2", + "sub #3", + "sub #4", + "sub #5", + "sub #6", + "sub #7", + "sub #8", + "sub #9", + "sub #10", + "sub #11", + "sub #12", + "sub #13", + "sub #14", + "sub #15", + + // 70 - 7f + "merge", + "and #1", + "and #2", + "and #3", + "and #4", + "and #5", + "and #6", + "and #7", + "and #8", + "and #9", + "and #10", + "and #11", + "and #12", + "and #13", + "and #14", + "and #15", + + // 80 - 8f + "mult #0", + "mult #1", + "mult #2", + "mult #3", + "mult #4", + "mult #5", + "mult #6", + "mult #7", + "mult #8", + "mult #9", + "mult #10", + "mult #11", + "mult #12", + "mult #13", + "mult #14", + "mult #15", + + // 90 - 9f + "sbk", + "link #1", + "link #2", + "link #3", + "link #4", + "sex", + "asr", + "ror", + "jmp (r8)", + "jmp (r9)", + "jmp (r10)", + "jmp (r11)", + "jmp (r12)", + "jmp (r13)", + "lob", + "fmult", + + // a0 - af + "sms ($%04x), r0", + "sms ($%04x), r1", + "sms ($%04x), r2", + "sms ($%04x), r3", + "sms ($%04x), r4", + "sms ($%04x), r5", + "sms ($%04x), r6", + "sms ($%04x), r7", + "sms ($%04x), r8", + "sms ($%04x), r9", + "sms ($%04x), r10", + "sms ($%04x), r11", + "sms ($%04x), r12", + "sms ($%04x), r13", + "sms ($%04x), r14", + "sms ($%04x), r15", + + // b0 - bf + "from r0", + "from r1", + "from r2", + "from r3", + "from r4", + "from r5", + "from r6", + "from r7", + "from r8", + "from r9", + "from r10", + "from r11", + "from r12", + "from r13", + "from r14", + "from r15", + + // c0 - cf + "hib", + "or #1", + "or #2", + "or #3", + "or #4", + "or #5", + "or #6", + "or #7", + "or #8", + "or #9", + "or #10", + "or #11", + "or #12", + "or #13", + "or #14", + "or #15", + + // d0 - df + "inc r0", + "inc r1", + "inc r2", + "inc r3", + "inc r4", + "inc r5", + "inc r6", + "inc r7", + "inc r8", + "inc r9", + "inc r10", + "inc r11", + "inc r12", + "inc r13", + "inc r14", + "ramb", + + // e0 - ef + "dec r0", + "dec r1", + "dec r2", + "dec r3", + "dec r4", + "dec r5", + "dec r6", + "dec r7", + "dec r8", + "dec r9", + "dec r10", + "dec r11", + "dec r12", + "dec r13", + "dec r14", + "getbl", + + // f0 - ff + "sm ($%04x), r0", + "sm ($%04x), r1", + "sm ($%04x), r2", + "sm ($%04x), r3", + "sm ($%04x), r4", + "sm ($%04x), r5", + "sm ($%04x), r6", + "sm ($%04x), r7", + "sm ($%04x), r8", + "sm ($%04x), r9", + "sm ($%04x), r10", + "sm ($%04x), r11", + "sm ($%04x), r12", + "sm ($%04x), r13", + "sm ($%04x), r14", + "sm ($%04x), r15", + + // ALT3 Table + + // 00 - 0f + "stop", + "nop", + "cache", + "lsr", + "rol", + "bra $%04x", + "blt $%04x", + "bge $%04x", + "bne $%04x", + "beq $%04x", + "bpl $%04x", + "bmi $%04x", + "bcc $%04x", + "bcs $%04x", + "bvc $%04x", + "bvs $%04x", + + // 10 - 1f + "to r0", + "to r1", + "to r2", + "to r3", + "to r4", + "to r5", + "to r6", + "to r7", + "to r8", + "to r9", + "to r10", + "to r11", + "to r12", + "to r13", + "to r14", + "to r15", + + // 20 - 2f + "with r0", + "with r1", + "with r2", + "with r3", + "with r4", + "with r5", + "with r6", + "with r7", + "with r8", + "with r9", + "with r10", + "with r11", + "with r12", + "with r13", + "with r14", + "with r15", + + // 30 - 3f + "stb (r0)", + "stb (r1)", + "stb (r2)", + "stb (r3)", + "stb (r4)", + "stb (r5)", + "stb (r6)", + "stb (r7)", + "stb (r8)", + "stb (r9)", + "stb (r10)", + "stb (r11)", + "loop", + "alt1", + "alt2", + "alt3", + + // 40 - 4f + "ldb (r0)", + "ldb (r1)", + "ldb (r2)", + "ldb (r3)", + "ldb (r4)", + "ldb (r5)", + "ldb (r6)", + "ldb (r7)", + "ldb (r8)", + "ldb (r9)", + "ldb (r10)", + "ldb (r11)", + "rpix", + "swap", + "cmode", + "not", + + // 50 - 5f + "adc #0", + "adc #1", + "adc #2", + "adc #3", + "adc #4", + "adc #5", + "adc #6", + "adc #7", + "adc #8", + "adc #9", + "adc #10", + "adc #11", + "adc #12", + "adc #13", + "adc #14", + "adc #15", + + // 60 - 6f + "cmp r0", + "cmp r1", + "cmp r2", + "cmp r3", + "cmp r4", + "cmp r5", + "cmp r6", + "cmp r7", + "cmp r8", + "cmp r9", + "cmp r10", + "cmp r11", + "cmp r12", + "cmp r13", + "cmp r14", + "cmp r15", + + // 70 - 7f + "merge", + "bic #1", + "bic #2", + "bic #3", + "bic #4", + "bic #5", + "bic #6", + "bic #7", + "bic #8", + "bic #9", + "bic #10", + "bic #11", + "bic #12", + "bic #13", + "bic #14", + "bic #15", + + // 80 - 8f + "umult #0", + "umult #1", + "umult #2", + "umult #3", + "umult #4", + "umult #5", + "umult #6", + "umult #7", + "umult #8", + "umult #9", + "umult #10", + "umult #11", + "umult #12", + "umult #13", + "umult #14", + "umult #15", + + // 90 - 9f + "sbk", + "link #1", + "link #2", + "link #3", + "link #4", + "sex", + "div2", + "ror", + "ljmp (r8)", + "ljmp (r9)", + "ljmp (r10)", + "ljmp (r11)", + "ljmp (r12)", + "ljmp (r13)", + "lob", + "lmult", + + // a0 - af + "lms r0, ($%04x)", + "lms r1, ($%04x)", + "lms r2, ($%04x)", + "lms r3, ($%04x)", + "lms r4, ($%04x)", + "lms r5, ($%04x)", + "lms r6, ($%04x)", + "lms r7, ($%04x)", + "lms r8, ($%04x)", + "lms r9, ($%04x)", + "lms r10, ($%04x)", + "lms r11, ($%04x)", + "lms r12, ($%04x)", + "lms r13, ($%04x)", + "lms r14, ($%04x)", + "lms r15, ($%04x)", + + // b0 - bf + "from r0", + "from r1", + "from r2", + "from r3", + "from r4", + "from r5", + "from r6", + "from r7", + "from r8", + "from r9", + "from r10", + "from r11", + "from r12", + "from r13", + "from r14", + "from r15", + + // c0 - cf + "hib", + "xor #1", + "xor #2", + "xor #3", + "xor #4", + "xor #5", + "xor #6", + "xor #7", + "xor #8", + "xor #9", + "xor #10", + "xor #11", + "xor #12", + "xor #13", + "xor #14", + "xor #15", + + // d0 - df + "inc r0", + "inc r1", + "inc r2", + "inc r3", + "inc r4", + "inc r5", + "inc r6", + "inc r7", + "inc r8", + "inc r9", + "inc r10", + "inc r11", + "inc r12", + "inc r13", + "inc r14", + "romb", + + // e0 - ef + "dec r0", + "dec r1", + "dec r2", + "dec r3", + "dec r4", + "dec r5", + "dec r6", + "dec r7", + "dec r8", + "dec r9", + "dec r10", + "dec r11", + "dec r12", + "dec r13", + "dec r14", + "getbs", + + // f0 - ff + "lm r0, ($%04x)", + "lm r1, ($%04x)", + "lm r2, ($%04x)", + "lm r3, ($%04x)", + "lm r4, ($%04x)", + "lm r5, ($%04x)", + "lm r6, ($%04x)", + "lm r7, ($%04x)", + "lm r8, ($%04x)", + "lm r9, ($%04x)", + "lm r10, ($%04x)", + "lm r11, ($%04x)", + "lm r12, ($%04x)", + "lm r13, ($%04x)", + "lm r14, ($%04x)", + "lm r15, ($%04x)" +}; +*/ + +/* +static void FxPipeString (char *pvString) +{ + uint32 vOpcode = (GSU.vStatusReg & 0x300) | ((uint32) PIPE); + const char *m = fx_apvMnemonicTable[vOpcode]; + uint8 vPipe1, vPipe2, vByte1, vByte2; + uint8 vPipeBank = GSU.vPipeAdr >> 16; + char *p; + + // The next two bytes after the pipe's address + vPipe1 = GSU.apvRomBank[vPipeBank][USEX16(GSU.vPipeAdr + 1)]; + vPipe2 = GSU.apvRomBank[vPipeBank][USEX16(GSU.vPipeAdr + 2)]; + + // The actual next two bytes to be read + vByte1 = PRGBANK(USEX16(R15)); + vByte2 = PRGBANK(USEX16(R15 + 1)); + + // Print ROM address of the pipe + sprintf(pvString, "%02x:%04x %02x ", USEX8(vPipeBank), USEX16(GSU.vPipeAdr), USEX8(PIPE)); + p = &pvString[strlen(pvString)]; + + if (PIPE >= 0x05 && PIPE <= 0x0f) // Check if it's a branch instruction + { + sprintf(&pvString[11], "%02x ", USEX8(vPipe1)); + #ifdef BRANCH_DELAY_RELATIVE + sprintf(p, m, USEX16(R15 + SEX8(vByte1) + 1)); + #else + sprintf(p, m, USEX16(R15 + SEX8(vByte1) - 1)); + #endif + } + else + if (PIPE >= 0x10 && PIPE <= 0x1f && TF(B)) // Check for 'move' instruction + sprintf(p, "move r%d, r%d", USEX8(PIPE & 0x0f), (uint32) (GSU.pvSreg - GSU.avReg)); + else + if (PIPE >= 0xa0 && PIPE <= 0xaf) // Check for 'ibt', 'lms' or 'sms' + { + sprintf(&pvString[11], "%02x ", USEX8(vPipe1)); + if ((GSU.vStatusReg & 0x300) == 0x100 || (GSU.vStatusReg & 0x300) == 0x200) + sprintf(p, m, USEX16(vByte1) << 1); + else + sprintf(p, m, USEX16(vByte1)); + } + else + if (PIPE >= 0xb0 && PIPE <= 0xbf && TF(B)) // Check for 'moves' + sprintf(p, "moves r%d, r%d", (uint32) (GSU.pvDreg - GSU.avReg), USEX8(PIPE & 0x0f)); + else + if (PIPE >= 0xf0) // Check for 'iwt', 'lm' or 'sm' + { + sprintf(&pvString[11], "%02x %02x ", USEX8(vPipe1), USEX8(vPipe2)); + sprintf(p, m, USEX8(vByte1) | (USEX16(vByte2) << 8)); + } + else // Normal instruction + strcpy(p, m); +} +*/ + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/fxemu.cpp b/plugins/snes9x_gx/source/snes9x/fxemu.cpp new file mode 100644 index 00000000..b3237ae6 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/fxemu.cpp @@ -0,0 +1,987 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#include "snes9x.h" +#include "memmap.h" +#include "fxinst.h" +#include "fxemu.h" + +static void FxReset (struct FxInfo_s *); +static void fx_readRegisterSpace (void); +static void fx_writeRegisterSpace (void); +static void fx_updateRamBank (uint8); +static void fx_dirtySCBR (void); +static bool8 fx_checkStartAddress (void); +static uint32 FxEmulate (uint32); +static void FxCacheWriteAccess (uint16); +static void FxFlushCache (void); + + +void S9xInitSuperFX (void) +{ + memset((uint8 *) &GSU, 0, sizeof(struct FxRegs_s)); +} + +void S9xResetSuperFX (void) +{ + // FIXME: Snes9x can't execute CPU and SuperFX at a time. Don't ask me what is 0.417 :P + SuperFX.speedPerLine = (uint32) (0.417 * 10.5e6 * ((1.0 / (float) Memory.ROMFramesPerSecond) / ((float) (Timings.V_Max)))); + SuperFX.oneLineDone = FALSE; + SuperFX.vFlags = 0; + FxReset(&SuperFX); +} + +void S9xSetSuperFX (uint8 byte, uint16 address) +{ + switch (address) + { + case 0x3030: + if ((Memory.FillRAM[0x3030] ^ byte) & FLG_G) + { + Memory.FillRAM[0x3030] = byte; + if (byte & FLG_G) + { + if (!SuperFX.oneLineDone) + { + S9xSuperFXExec(); + SuperFX.oneLineDone = TRUE; + } + } + else + FxFlushCache(); + } + else + Memory.FillRAM[0x3030] = byte; + + break; + + case 0x3031: + Memory.FillRAM[0x3031] = byte; + break; + + case 0x3033: + Memory.FillRAM[0x3033] = byte; + break; + + case 0x3034: + Memory.FillRAM[0x3034] = byte & 0x7f; + break; + + case 0x3036: + Memory.FillRAM[0x3036] = byte & 0x7f; + break; + + case 0x3037: + Memory.FillRAM[0x3037] = byte; + break; + + case 0x3038: + Memory.FillRAM[0x3038] = byte; + fx_dirtySCBR(); + break; + + case 0x3039: + Memory.FillRAM[0x3039] = byte; + break; + + case 0x303a: + Memory.FillRAM[0x303a] = byte; + break; + + case 0x303b: + break; + + case 0x303c: + Memory.FillRAM[0x303c] = byte; + fx_updateRamBank(byte); + break; + + case 0x303f: + Memory.FillRAM[0x303f] = byte; + break; + + case 0x301f: + Memory.FillRAM[0x301f] = byte; + Memory.FillRAM[0x3000 + GSU_SFR] |= FLG_G; + if (!SuperFX.oneLineDone) + { + S9xSuperFXExec(); + SuperFX.oneLineDone = TRUE; + } + + break; + + default: + Memory.FillRAM[address] = byte; + if (address >= 0x3100) + FxCacheWriteAccess(address); + + break; + } +} + +uint8 S9xGetSuperFX (uint16 address) +{ + uint8 byte; + + byte = Memory.FillRAM[address]; +#ifdef CPU_SHUTDOWN + if (address == 0x3030) + CPU.WaitAddress = CPU.PBPCAtOpcodeStart; +#endif + if (address == 0x3031) + { + S9xClearIRQ(GSU_IRQ_SOURCE); + Memory.FillRAM[0x3031] = byte & 0x7f; + } + + return (byte); +} + +void S9xSuperFXExec (void) +{ + if ((Memory.FillRAM[0x3000 + GSU_SFR] & FLG_G) && (Memory.FillRAM[0x3000 + GSU_SCMR] & 0x18) == 0x18) + { + FxEmulate((Memory.FillRAM[0x3000 + GSU_CLSR] & 1) ? SuperFX.speedPerLine * 2 : SuperFX.speedPerLine); + + uint16 GSUStatus = Memory.FillRAM[0x3000 + GSU_SFR] | (Memory.FillRAM[0x3000 + GSU_SFR + 1] << 8); + if ((GSUStatus & (FLG_G | FLG_IRQ)) == FLG_IRQ) + S9xSetIRQ(GSU_IRQ_SOURCE); + } +} + +static void FxReset (struct FxInfo_s *psFxInfo) +{ + // Clear all internal variables + memset((uint8 *) &GSU, 0, sizeof(struct FxRegs_s)); + + // Set default registers + GSU.pvSreg = GSU.pvDreg = &R0; + + // Set RAM and ROM pointers + GSU.pvRegisters = psFxInfo->pvRegisters; + GSU.nRamBanks = psFxInfo->nRamBanks; + GSU.pvRam = psFxInfo->pvRam; + GSU.nRomBanks = psFxInfo->nRomBanks; + GSU.pvRom = psFxInfo->pvRom; + GSU.vPrevScreenHeight = ~0; + GSU.vPrevMode = ~0; + + // The GSU can't access more than 2mb (16mbits) + if (GSU.nRomBanks > 0x20) + GSU.nRomBanks = 0x20; + + // Clear FxChip register space + memset(GSU.pvRegisters, 0, 0x300); + + // Set FxChip version Number + GSU.pvRegisters[0x3b] = 0; + + // Make ROM bank table + for (int i = 0; i < 256; i++) + { + uint32 b = i & 0x7f; + + if (b >= 0x40) + { + if (GSU.nRomBanks > 1) + b %= GSU.nRomBanks; + else + b &= 1; + + GSU.apvRomBank[i] = &GSU.pvRom[b << 16]; + } + else + { + b %= GSU.nRomBanks * 2; + GSU.apvRomBank[i] = &GSU.pvRom[(b << 16) + 0x200000]; + } + } + + // Make RAM bank table + for (int i = 0; i < 4; i++) + { + GSU.apvRamBank[i] = &GSU.pvRam[(i % GSU.nRamBanks) << 16]; + GSU.apvRomBank[0x70 + i] = GSU.apvRamBank[i]; + } + + // Start with a nop in the pipe + GSU.vPipe = 0x01; + + // Set pointer to GSU cache + GSU.pvCache = &GSU.pvRegisters[0x100]; + + fx_readRegisterSpace(); +} + +static void fx_readRegisterSpace (void) +{ + static uint32 avHeight[] = { 128, 160, 192, 256 }; + static uint32 avMult[] = { 16, 32, 32, 64 }; + + uint8 *p; + int n; + + GSU.vErrorCode = 0; + + // Update R0-R15 + p = GSU.pvRegisters; + for (int i = 0; i < 16; i++) + { + GSU.avReg[i] = *p++; + GSU.avReg[i] += ((uint32) (*p++)) << 8; + } + + // Update other registers + p = GSU.pvRegisters; + GSU.vStatusReg = (uint32) p[GSU_SFR]; + GSU.vStatusReg |= ((uint32) p[GSU_SFR + 1]) << 8; + GSU.vPrgBankReg = (uint32) p[GSU_PBR]; + GSU.vRomBankReg = (uint32) p[GSU_ROMBR]; + GSU.vRamBankReg = ((uint32) p[GSU_RAMBR]) & (FX_RAM_BANKS - 1); + GSU.vCacheBaseReg = (uint32) p[GSU_CBR]; + GSU.vCacheBaseReg |= ((uint32) p[GSU_CBR + 1]) << 8; + + // Update status register variables + GSU.vZero = !(GSU.vStatusReg & FLG_Z); + GSU.vSign = (GSU.vStatusReg & FLG_S) << 12; + GSU.vOverflow = (GSU.vStatusReg & FLG_OV) << 16; + GSU.vCarry = (GSU.vStatusReg & FLG_CY) >> 2; + + // Set bank pointers + GSU.pvRamBank = GSU.apvRamBank[GSU.vRamBankReg & 0x3]; + GSU.pvRomBank = GSU.apvRomBank[GSU.vRomBankReg]; + GSU.pvPrgBank = GSU.apvRomBank[GSU.vPrgBankReg]; + + // Set screen pointers + GSU.pvScreenBase = &GSU.pvRam[USEX8(p[GSU_SCBR]) << 10]; + n = (int) (!!(p[GSU_SCMR] & 0x04)); + n |= ((int) (!!(p[GSU_SCMR] & 0x20))) << 1; + GSU.vScreenHeight = GSU.vScreenRealHeight = avHeight[n]; + GSU.vMode = p[GSU_SCMR] & 0x03; + + if (n == 3) + GSU.vScreenSize = (256 / 8) * (256 / 8) * 32; + else + GSU.vScreenSize = (GSU.vScreenHeight / 8) * (256 / 8) * avMult[GSU.vMode]; + + if (GSU.vPlotOptionReg & 0x10) // OBJ Mode (for drawing into sprites) + GSU.vScreenHeight = 256; + + if (GSU.pvScreenBase + GSU.vScreenSize > GSU.pvRam + (GSU.nRamBanks * 65536)) + GSU.pvScreenBase = GSU.pvRam + (GSU.nRamBanks * 65536) - GSU.vScreenSize; + + GSU.pfPlot = fx_PlotTable[GSU.vMode]; + GSU.pfRpix = fx_PlotTable[GSU.vMode + 5]; + + fx_OpcodeTable[0x04c] = GSU.pfPlot; + fx_OpcodeTable[0x14c] = GSU.pfRpix; + fx_OpcodeTable[0x24c] = GSU.pfPlot; + fx_OpcodeTable[0x34c] = GSU.pfRpix; + + fx_computeScreenPointers(); + + //fx_backupCache(); +} + +static void fx_writeRegisterSpace (void) +{ + uint8 *p; + + p = GSU.pvRegisters; + for (int i = 0; i < 16; i++) + { + *p++ = (uint8) GSU.avReg[i]; + *p++ = (uint8) (GSU.avReg[i] >> 8); + } + + // Update status register + if (USEX16(GSU.vZero) == 0) + SF(Z); + else + CF(Z); + + if (GSU.vSign & 0x8000) + SF(S); + else + CF(S); + + if (GSU.vOverflow >= 0x8000 || GSU.vOverflow < -0x8000) + SF(OV); + else + CF(OV); + + if (GSU.vCarry) + SF(CY); + else + CF(CY); + + p = GSU.pvRegisters; + p[GSU_SFR] = (uint8) GSU.vStatusReg; + p[GSU_SFR + 1] = (uint8) (GSU.vStatusReg >> 8); + p[GSU_PBR] = (uint8) GSU.vPrgBankReg; + p[GSU_ROMBR] = (uint8) GSU.vRomBankReg; + p[GSU_RAMBR] = (uint8) GSU.vRamBankReg; + p[GSU_CBR] = (uint8) GSU.vCacheBaseReg; + p[GSU_CBR + 1] = (uint8) (GSU.vCacheBaseReg >> 8); + + //fx_restoreCache(); +} + +// Update RamBankReg and RAM Bank pointer +static void fx_updateRamBank (uint8 byte) +{ + // Update BankReg and Bank pointer + GSU.vRamBankReg = (uint32) byte & (FX_RAM_BANKS - 1); + GSU.pvRamBank = GSU.apvRamBank[byte & 0x3]; +} + +// SCBR write seen. We need to update our cached screen pointers +static void fx_dirtySCBR (void) +{ + GSU.vSCBRDirty = TRUE; +} + +static bool8 fx_checkStartAddress (void) +{ + // Check if we start inside the cache + if (GSU.bCacheActive && R15 >= GSU.vCacheBaseReg && R15 < (GSU.vCacheBaseReg + 512)) + return (TRUE); + + /* + // Check if we're in an unused area + if (GSU.vPrgBankReg < 0x40 && R15 < 0x8000) + return (FALSE); + */ + + if (GSU.vPrgBankReg >= 0x60 && GSU.vPrgBankReg <= 0x6f) + return (FALSE); + + if (GSU.vPrgBankReg >= 0x74) + return (FALSE); + + // Check if we're in RAM and the RAN flag is not set + if (GSU.vPrgBankReg >= 0x70 && GSU.vPrgBankReg <= 0x73 && !(SCMR & (1 << 3))) + return (FALSE); + + // If not, we're in ROM, so check if the RON flag is set + if (!(SCMR & (1 << 4))) + return (FALSE); + + return (TRUE); +} + +// Execute until the next stop instruction +static uint32 FxEmulate (uint32 nInstructions) +{ + uint32 vCount; + + // Read registers and initialize GSU session + fx_readRegisterSpace(); + + // Check if the start address is valid + if (!fx_checkStartAddress()) + { + CF(G); + fx_writeRegisterSpace(); + /* + GSU.vIllegalAddress = (GSU.vPrgBankReg << 24) | R15; + return (FX_ERROR_ILLEGAL_ADDRESS); + */ + + return (0); + } + + // Execute GSU session + CF(IRQ); + + /* + if (GSU.bBreakPoint) + vCount = fx_run_to_breakpoint(nInstructions); + else + */ + vCount = fx_run(nInstructions); + + // Store GSU registers + fx_writeRegisterSpace(); + + // Check for error code + if (GSU.vErrorCode) + return (GSU.vErrorCode); + else + return (vCount); +} + +void fx_computeScreenPointers (void) +{ + if (GSU.vMode != GSU.vPrevMode || GSU.vPrevScreenHeight != GSU.vScreenHeight || GSU.vSCBRDirty) + { + GSU.vSCBRDirty = FALSE; + + // Make a list of pointers to the start of each screen column + switch (GSU.vScreenHeight) + { + case 128: + switch (GSU.vMode) + { + case 0: + for (int i = 0; i < 32; i++) + { + GSU.apvScreen[i] = GSU.pvScreenBase + (i << 4); + GSU.x[i] = i << 8; + } + + break; + + case 1: + for (int i = 0; i < 32; i++) + { + GSU.apvScreen[i] = GSU.pvScreenBase + (i << 5); + GSU.x[i] = i << 9; + } + + break; + + case 2: + case 3: + for (int i = 0; i < 32; i++) + { + GSU.apvScreen[i] = GSU.pvScreenBase + (i << 6); + GSU.x[i] = i << 10; + } + + break; + } + + break; + + case 160: + switch (GSU.vMode) + { + case 0: + for (int i = 0; i < 32; i++) + { + GSU.apvScreen[i] = GSU.pvScreenBase + (i << 4); + GSU.x[i] = (i << 8) + (i << 6); + } + + break; + + case 1: + for (int i = 0; i < 32; i++) + { + GSU.apvScreen[i] = GSU.pvScreenBase + (i << 5); + GSU.x[i] = (i << 9) + (i << 7); + } + + break; + + case 2: + case 3: + for (int i = 0; i < 32; i++) + { + GSU.apvScreen[i] = GSU.pvScreenBase + (i << 6); + GSU.x[i] = (i << 10) + (i << 8); + } + + break; + } + + break; + + case 192: + switch (GSU.vMode) + { + case 0: + for (int i = 0; i < 32; i++) + { + GSU.apvScreen[i] = GSU.pvScreenBase + (i << 4); + GSU.x[i] = (i << 8) + (i << 7); + } + + break; + + case 1: + for (int i = 0; i < 32; i++) + { + GSU.apvScreen[i] = GSU.pvScreenBase + (i << 5); + GSU.x[i] = (i << 9) + (i << 8); + } + + break; + + case 2: + case 3: + for (int i = 0; i < 32; i++) + { + GSU.apvScreen[i] = GSU.pvScreenBase + (i << 6); + GSU.x[i] = (i << 10) + (i << 9); + } + + break; + } + + break; + + case 256: + switch (GSU.vMode) + { + case 0: + for (int i = 0; i < 32; i++) + { + GSU.apvScreen[i] = GSU.pvScreenBase + ((i & 0x10) << 9) + ((i & 0xf) << 8); + GSU.x[i] = ((i & 0x10) << 8) + ((i & 0xf) << 4); + } + + break; + + case 1: + for (int i = 0; i < 32; i++) + { + GSU.apvScreen[i] = GSU.pvScreenBase + ((i & 0x10) << 10) + ((i & 0xf) << 9); + GSU.x[i] = ((i & 0x10) << 9) + ((i & 0xf) << 5); + } + + break; + + case 2: + case 3: + for (int i = 0; i < 32; i++) + { + GSU.apvScreen[i] = GSU.pvScreenBase + ((i & 0x10) << 11) + ((i & 0xf) << 10); + GSU.x[i] = ((i & 0x10) << 10) + ((i & 0xf) << 6); + } + + break; + } + + break; + } + + GSU.vPrevMode = GSU.vMode; + GSU.vPrevScreenHeight = GSU.vScreenHeight; + } +} + +// Write access to the cache +static void FxCacheWriteAccess (uint16 vAddress) +{ + /* + if (!GSU.bCacheActive) + { + uint8 v = GSU.pvCache[GSU.pvCache[vAddress & 0x1ff]; + fx_setCache(); + GSU.pvCache[GSU.pvCache[vAddress & 0x1ff] = v; + } + */ + + if ((vAddress & 0x00f) == 0x00f) + GSU.vCacheFlags |= 1 << ((vAddress & 0x1f0) >> 4); +} + +static void FxFlushCache (void) +{ + GSU.vCacheFlags = 0; + GSU.vCacheBaseReg = 0; + GSU.bCacheActive = FALSE; + //GSU.vPipe = 0x1; +} + +void fx_flushCache (void) +{ + //fx_restoreCache(); + GSU.vCacheFlags = 0; + GSU.bCacheActive = FALSE; +} + +/* +static void fx_setCache (void) +{ + uint32 c; + + GSU.bCacheActive = TRUE; + GSU.pvRegisters[0x3e] &= 0xf0; + + c = (uint32) GSU.pvRegisters[0x3e]; + c |= ((uint32) GSU.pvRegisters[0x3f]) << 8; + if (c == GSU.vCacheBaseReg) + return; + + GSU.vCacheBaseReg = c; + GSU.vCacheFlags = 0; + + if (c < (0x10000 - 512)) + { + const uint8 *t = &ROM(c); + memcpy(GSU.pvCache, t, 512); + } + else + { + const uint8 *t1, *t2; + uint32 i = 0x10000 - c; + + t1 = &ROM(c); + t2 = &ROM(0); + memcpy(GSU.pvCache, t1, i); + memcpy(&GSU.pvCache[i], t2, 512 - i); + } +} +*/ + +/* +static void fx_backupCache (void) +{ + uint32 v = GSU.vCacheFlags; + uint32 c = USEX16(GSU.vCacheBaseReg); + + if (v) + { + for (int i = 0; i < 32; i++) + { + if (v & 1) + { + if (c < (0x10000 - 16)) + { + uint8 *t = &GSU.pvPrgBank[c]; + memcpy(&GSU.avCacheBackup[i << 4], t, 16); + memcpy(t, &GSU.pvCache[i << 4], 16); + } + else + { + uint8 *t1, *t2; + uint32 a = 0x10000 - c; + + t1 = &GSU.pvPrgBank[c]; + t2 = &GSU.pvPrgBank[0]; + memcpy(&GSU.avCacheBackup[i << 4], t1, a); + memcpy(t1, &GSU.pvCache[i << 4], a); + memcpy(&GSU.avCacheBackup[(i << 4) + a], t2, 16 - a); + memcpy(t2, &GSU.pvCache[(i << 4) + a], 16 - a); + } + } + + c = USEX16(c + 16); + v >>= 1; + } + } +} +*/ + +/* +static void fx_restoreCache() +{ + uint32 v = GSU.vCacheFlags; + uint32 c = USEX16(GSU.vCacheBaseReg); + + if (v) + { + for (int i = 0; i < 32; i++) + { + if (v & 1) + { + if (c < (0x10000 - 16)) + { + uint8 *t = &GSU.pvPrgBank[c]; + memcpy(t, &GSU.avCacheBackup[i << 4], 16); + memcpy(&GSU.pvCache[i << 4], t, 16); + } + else + { + uint8 *t1, *t2; + uint32 a = 0x10000 - c; + + t1 = &GSU.pvPrgBank[c]; + t2 = &GSU.pvPrgBank[0]; + memcpy(t1, &GSU.avCacheBackup[i << 4], a); + memcpy(&GSU.pvCache[i << 4], t1, a); + memcpy(t2, &GSU.avCacheBackup[(i << 4) + a], 16 - a); + memcpy(&GSU.pvCache[(i << 4) + a], t2, 16 - a); + } + } + + c = USEX16(c + 16); + v >>= 1; + } + } +} +*/ + +// Breakpoints +/* +static void FxBreakPointSet (uint32 vAddress) +{ + GSU.bBreakPoint = TRUE; + GSU.vBreakPoint = USEX16(vAddress); +} +*/ + +/* +static void FxBreakPointClear (void) +{ + GSU.bBreakPoint = FALSE; +} +*/ + +// Step by step execution +/* +static uint32 FxStepOver (uint32 nInstructions) +{ + uint32 vCount; + + fx_readRegisterSpace(); + + if (!fx_checkStartAddress()) + { + CF(G); + #if 0 + GSU.vIllegalAddress = (GSU.vPrgBankReg << 24) | R15; + return (FX_ERROR_ILLEGAL_ADDRESS); + #else + return (0); + #endif + } + + if (PIPE >= 0xf0) + GSU.vStepPoint = USEX16(R15 + 3); + else + if ((PIPE >= 0x05 && PIPE <= 0x0f) || (PIPE >= 0xa0 && PIPE <= 0xaf)) + GSU.vStepPoint = USEX16(R15 + 2); + else + GSU.vStepPoint = USEX16(R15 + 1); + + vCount = fx_step_over(nInstructions); + + fx_writeRegisterSpace(); + + if (GSU.vErrorCode) + return (GSU.vErrorCode); + else + return (vCount); +} +*/ + +// Errors +/* +static int FxGetErrorCode (void) +{ + return (GSU.vErrorCode); +} +*/ + +/* +static int FxGetIllegalAddress (void) +{ + return (GSU.vIllegalAddress); +} +*/ + +// Access to internal registers +/* +static uint32 FxGetColorRegister (void) +{ + return (GSU.vColorReg & 0xff); +} +*/ + +/* +static uint32 FxGetPlotOptionRegister (void) +{ + return (GSU.vPlotOptionReg & 0x1f); +} +*/ + +/* +static uint32 FxGetSourceRegisterIndex (void) +{ + return (GSU.pvSreg - GSU.avReg); +} +*/ + +/* +static uint32 FxGetDestinationRegisterIndex (void) +{ + return (GSU.pvDreg - GSU.avReg); +} +*/ + +// Get the byte currently in the pipe +/* +static uint8 FxPipe (void) +{ + return (GSU.vPipe); +} +*/ diff --git a/plugins/snes9x_gx/source/snes9x/fxemu.h b/plugins/snes9x_gx/source/snes9x/fxemu.h new file mode 100644 index 00000000..b2ce64e7 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/fxemu.h @@ -0,0 +1,208 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _FXEMU_H_ +#define _FXEMU_H_ + +#define FX_BREAKPOINT (-1) +#define FX_ERROR_ILLEGAL_ADDRESS (-2) + +// The FxInfo_s structure, the link between the FxEmulator and the Snes Emulator +struct FxInfo_s +{ + uint32 vFlags; + uint8 *pvRegisters; // 768 bytes located in the memory at address 0x3000 + uint32 nRamBanks; // Number of 64kb-banks in GSU-RAM/BackupRAM (banks 0x70-0x73) + uint8 *pvRam; // Pointer to GSU-RAM + uint32 nRomBanks; // Number of 32kb-banks in Cart-ROM + uint8 *pvRom; // Pointer to Cart-ROM + uint32 speedPerLine; + bool8 oneLineDone; +}; + +extern struct FxInfo_s SuperFX; + +void S9xInitSuperFX (void); +void S9xResetSuperFX (void); +void S9xSuperFXExec (void); +void S9xSetSuperFX (uint8, uint16); +uint8 S9xGetSuperFX (uint16); +void fx_flushCache (void); +void fx_computeScreenPointers (void); +uint32 fx_run (uint32); + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/fxinst.cpp b/plugins/snes9x_gx/source/snes9x/fxinst.cpp new file mode 100644 index 00000000..5f7df2bf --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/fxinst.cpp @@ -0,0 +1,4424 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#include "snes9x.h" +#include "fxinst.h" +#include "fxemu.h" + +// Set this define if you wish the plot instruction to check for y-pos limits (I don't think it's nessecary) +#define CHECK_LIMITS + + +/* + Codes used: + rn = a GSU register (r0 - r15) + #n = 4 bit immediate value + #pp = 8 bit immediate value + (yy) = 8 bit word address (0x0000 - 0x01fe) + #xx = 16 bit immediate value + (xx) = 16 bit address (0x0000 - 0xffff) +*/ + +// 00 - stop - stop GSU execution (and maybe generate an IRQ) +static void fx_stop (void) +{ + CF(G); + GSU.vCounter = 0; + GSU.vInstCount = GSU.vCounter; + + // Check if we need to generate an IRQ + if (!(GSU.pvRegisters[GSU_CFGR] & 0x80)) + SF(IRQ); + + GSU.vPlotOptionReg = 0; + GSU.vPipe = 1; + CLRFLAGS; + R15++; +} + +// 01 - nop - no operation +static void fx_nop (void) +{ + CLRFLAGS; + R15++; +} + +// 02 - cache - reintialize GSU cache +static void fx_cache (void) +{ + uint32 c = R15 & 0xfff0; + + if (GSU.vCacheBaseReg != c || !GSU.bCacheActive) + { + fx_flushCache(); + GSU.vCacheBaseReg = c; + GSU.bCacheActive = TRUE; + + #if 0 + if (c < (0x10000 - 512)) + { + const uint8 *t = &ROM(c); + memcpy(GSU.pvCache, t, 512); + } + else + { + const uint8 *t1, t2; + uint32 i = 0x10000 - c; + t1 = &ROM(c); + t2 = &ROM(0); + memcpy(GSU.pvCache, t1, i); + memcpy(&GSU.pvCache[i], t2, 512 - i); + } + #endif + } + + CLRFLAGS; + R15++; +} + +// 03 - lsr - logic shift right +static void fx_lsr (void) +{ + uint32 v; + GSU.vCarry = SREG & 1; + v = USEX16(SREG) >> 1; + R15++; + DREG = v; + GSU.vSign = v; + GSU.vZero = v; + TESTR14; + CLRFLAGS; +} + +// 04 - rol - rotate left +static void fx_rol (void) +{ + uint32 v = USEX16((SREG << 1) + GSU.vCarry); + GSU.vCarry = (SREG >> 15) & 1; + R15++; + DREG = v; + GSU.vSign = v; + GSU.vZero = v; + TESTR14; + CLRFLAGS; +} + +// 05 - bra - branch always +static void fx_bra (void) +{ + uint8 v = PIPE; + R15++; + FETCHPIPE; + R15 += SEX8(v); +} + +// Branch on condition +#define BRA_COND(cond) \ + uint8 v = PIPE; \ + R15++; \ + FETCHPIPE; \ + if (cond) \ + R15 += SEX8(v); \ + else \ + R15++ + +#define TEST_S (GSU.vSign & 0x8000) +#define TEST_Z (USEX16(GSU.vZero) == 0) +#define TEST_OV (GSU.vOverflow >= 0x8000 || GSU.vOverflow < -0x8000) +#define TEST_CY (GSU.vCarry & 1) + +// 06 - blt - branch on less than +static void fx_blt (void) +{ + BRA_COND((TEST_S != 0) != (TEST_OV != 0)); +} + +// 07 - bge - branch on greater or equals +static void fx_bge (void) +{ + BRA_COND((TEST_S != 0) == (TEST_OV != 0)); +} + +// 08 - bne - branch on not equal +static void fx_bne (void) +{ + BRA_COND(!TEST_Z); +} + +// 09 - beq - branch on equal +static void fx_beq (void) +{ + BRA_COND(TEST_Z); +} + +// 0a - bpl - branch on plus +static void fx_bpl (void) +{ + BRA_COND(!TEST_S); +} + +// 0b - bmi - branch on minus +static void fx_bmi (void) +{ + BRA_COND(TEST_S); +} + +// 0c - bcc - branch on carry clear +static void fx_bcc (void) +{ + BRA_COND(!TEST_CY); +} + +// 0d - bcs - branch on carry set +static void fx_bcs (void) +{ + BRA_COND(TEST_CY); +} + +// 0e - bvc - branch on overflow clear +static void fx_bvc (void) +{ + BRA_COND(!TEST_OV); +} + +// 0f - bvs - branch on overflow set +static void fx_bvs (void) +{ + BRA_COND(TEST_OV); +} + +// 10-1f - to rn - set register n as destination register +// 10-1f (B) - move rn - move one register to another (if B flag is set) +#define FX_TO(reg) \ + if (TF(B)) \ + { \ + GSU.avReg[(reg)] = SREG; \ + CLRFLAGS; \ + } \ + else \ + GSU.pvDreg = &GSU.avReg[reg]; \ + R15++ + +#define FX_TO_R14(reg) \ + if (TF(B)) \ + { \ + GSU.avReg[(reg)] = SREG; \ + CLRFLAGS; \ + READR14; \ + } \ + else \ + GSU.pvDreg = &GSU.avReg[reg]; \ + R15++ + +#define FX_TO_R15(reg) \ + if (TF(B)) \ + { \ + GSU.avReg[(reg)] = SREG; \ + CLRFLAGS; \ + } \ + else \ + { \ + GSU.pvDreg = &GSU.avReg[reg]; \ + R15++; \ + } + +static void fx_to_r0 (void) +{ + FX_TO(0); +} + +static void fx_to_r1 (void) +{ + FX_TO(1); +} + +static void fx_to_r2 (void) +{ + FX_TO(2); +} + +static void fx_to_r3 (void) +{ + FX_TO(3); +} + +static void fx_to_r4 (void) +{ + FX_TO(4); +} + +static void fx_to_r5 (void) +{ + FX_TO(5); +} + +static void fx_to_r6 (void) +{ + FX_TO(6); +} + +static void fx_to_r7 (void) +{ + FX_TO(7); +} + +static void fx_to_r8 (void) +{ + FX_TO(8); +} + +static void fx_to_r9 (void) +{ + FX_TO(9); +} + +static void fx_to_r10 (void) +{ + FX_TO(10); +} + +static void fx_to_r11 (void) +{ + FX_TO(11); +} + +static void fx_to_r12 (void) +{ + FX_TO(12); +} + +static void fx_to_r13 (void) +{ + FX_TO(13); +} + +static void fx_to_r14 (void) +{ + FX_TO_R14(14); +} + +static void fx_to_r15 (void) +{ + FX_TO_R15(15); +} + +// 20-2f - to rn - set register n as source and destination register +#define FX_WITH(reg) \ + SF(B); \ + GSU.pvSreg = GSU.pvDreg = &GSU.avReg[reg]; \ + R15++ + +static void fx_with_r0 (void) +{ + FX_WITH(0); +} + +static void fx_with_r1 (void) +{ + FX_WITH(1); +} + +static void fx_with_r2 (void) +{ + FX_WITH(2); +} + +static void fx_with_r3 (void) +{ + FX_WITH(3); +} + +static void fx_with_r4 (void) +{ + FX_WITH(4); +} + +static void fx_with_r5 (void) +{ + FX_WITH(5); +} + +static void fx_with_r6 (void) +{ + FX_WITH(6); +} + +static void fx_with_r7 (void) +{ + FX_WITH(7); +} + +static void fx_with_r8 (void) +{ + FX_WITH(8); +} + +static void fx_with_r9 (void) +{ + FX_WITH(9); +} + +static void fx_with_r10 (void) +{ + FX_WITH(10); +} + +static void fx_with_r11 (void) +{ + FX_WITH(11); +} + +static void fx_with_r12 (void) +{ + FX_WITH(12); +} + +static void fx_with_r13 (void) +{ + FX_WITH(13); +} + +static void fx_with_r14 (void) +{ + FX_WITH(14); +} + +static void fx_with_r15 (void) +{ + FX_WITH(15); +} + +// 30-3b - stw (rn) - store word +#define FX_STW(reg) \ + GSU.vLastRamAdr = GSU.avReg[reg]; \ + RAM(GSU.avReg[reg]) = (uint8) SREG; \ + RAM(GSU.avReg[reg] ^ 1) = (uint8) (SREG >> 8); \ + CLRFLAGS; \ + R15++ + +static void fx_stw_r0 (void) +{ + FX_STW(0); +} + +static void fx_stw_r1 (void) +{ + FX_STW(1); +} + +static void fx_stw_r2 (void) +{ + FX_STW(2); +} + +static void fx_stw_r3 (void) +{ + FX_STW(3); +} + +static void fx_stw_r4 (void) +{ + FX_STW(4); +} + +static void fx_stw_r5 (void) +{ + FX_STW(5); +} + +static void fx_stw_r6 (void) +{ + FX_STW(6); +} + +static void fx_stw_r7 (void) +{ + FX_STW(7); +} + +static void fx_stw_r8 (void) +{ + FX_STW(8); +} + +static void fx_stw_r9 (void) +{ + FX_STW(9); +} + +static void fx_stw_r10 (void) +{ + FX_STW(10); +} + +static void fx_stw_r11 (void) +{ + FX_STW(11); +} + +// 30-3b (ALT1) - stb (rn) - store byte +#define FX_STB(reg) \ + GSU.vLastRamAdr = GSU.avReg[reg]; \ + RAM(GSU.avReg[reg]) = (uint8) SREG; \ + CLRFLAGS; \ + R15++ + +static void fx_stb_r0 (void) +{ + FX_STB(0); +} + +static void fx_stb_r1 (void) +{ + FX_STB(1); +} + +static void fx_stb_r2 (void) +{ + FX_STB(2); +} + +static void fx_stb_r3 (void) +{ + FX_STB(3); +} + +static void fx_stb_r4 (void) +{ + FX_STB(4); +} + +static void fx_stb_r5 (void) +{ + FX_STB(5); +} + +static void fx_stb_r6 (void) +{ + FX_STB(6); +} + +static void fx_stb_r7 (void) +{ + FX_STB(7); +} + +static void fx_stb_r8 (void) +{ + FX_STB(8); +} + +static void fx_stb_r9 (void) +{ + FX_STB(9); +} + +static void fx_stb_r10 (void) +{ + FX_STB(10); +} + +static void fx_stb_r11 (void) +{ + FX_STB(11); +} + +// 3c - loop - decrement loop counter, and branch on not zero +static void fx_loop (void) +{ + GSU.vSign = GSU.vZero = --R12; + if ((uint16) R12 != 0) + R15 = R13; + else + R15++; + CLRFLAGS; +} + +// 3d - alt1 - set alt1 mode +static void fx_alt1 (void) +{ + SF(ALT1); + CF(B); + R15++; +} + +// 3e - alt2 - set alt2 mode +static void fx_alt2 (void) +{ + SF(ALT2); + CF(B); + R15++; +} + +// 3f - alt3 - set alt3 mode +static void fx_alt3 (void) +{ + SF(ALT1); + SF(ALT2); + CF(B); + R15++; +} + +// 40-4b - ldw (rn) - load word from RAM +#define FX_LDW(reg) \ + uint32 v; \ + GSU.vLastRamAdr = GSU.avReg[reg]; \ + v = (uint32) RAM(GSU.avReg[reg]); \ + v |= ((uint32) RAM(GSU.avReg[reg] ^ 1)) << 8; \ + R15++; \ + DREG = v; \ + TESTR14; \ + CLRFLAGS + +static void fx_ldw_r0 (void) +{ + FX_LDW(0); +} + +static void fx_ldw_r1 (void) +{ + FX_LDW(1); +} + +static void fx_ldw_r2 (void) +{ + FX_LDW(2); +} + +static void fx_ldw_r3 (void) +{ + FX_LDW(3); +} + +static void fx_ldw_r4 (void) +{ + FX_LDW(4); +} + +static void fx_ldw_r5 (void) +{ + FX_LDW(5); +} + +static void fx_ldw_r6 (void) +{ + FX_LDW(6); +} + +static void fx_ldw_r7 (void) +{ + FX_LDW(7); +} + +static void fx_ldw_r8 (void) +{ + FX_LDW(8); +} + +static void fx_ldw_r9 (void) +{ + FX_LDW(9); +} + +static void fx_ldw_r10 (void) +{ + FX_LDW(10); +} + +static void fx_ldw_r11 (void) +{ + FX_LDW(11); +} + +// 40-4b (ALT1) - ldb (rn) - load byte +#define FX_LDB(reg) \ + uint32 v; \ + GSU.vLastRamAdr = GSU.avReg[reg]; \ + v = (uint32) RAM(GSU.avReg[reg]); \ + R15++; \ + DREG = v; \ + TESTR14; \ + CLRFLAGS + +static void fx_ldb_r0 (void) +{ + FX_LDB(0); +} + +static void fx_ldb_r1 (void) +{ + FX_LDB(1); +} + +static void fx_ldb_r2 (void) +{ + FX_LDB(2); +} + +static void fx_ldb_r3 (void) +{ + FX_LDB(3); +} + +static void fx_ldb_r4 (void) +{ + FX_LDB(4); +} + +static void fx_ldb_r5 (void) +{ + FX_LDB(5); +} + +static void fx_ldb_r6 (void) +{ + FX_LDB(6); +} + +static void fx_ldb_r7 (void) +{ + FX_LDB(7); +} + +static void fx_ldb_r8 (void) +{ + FX_LDB(8); +} + +static void fx_ldb_r9 (void) +{ + FX_LDB(9); +} + +static void fx_ldb_r10 (void) +{ + FX_LDB(10); +} + +static void fx_ldb_r11 (void) +{ + FX_LDB(11); +} + +// 4c - plot - plot pixel with R1, R2 as x, y and the color register as the color +static void fx_plot_2bit (void) +{ + uint32 x = USEX8(R1); + uint32 y = USEX8(R2); + uint8 *a; + uint8 v, c; + + R15++; + CLRFLAGS; + R1++; + +#ifdef CHECK_LIMITS + if (y >= GSU.vScreenHeight) + return; +#endif + + if (GSU.vPlotOptionReg & 0x02) + c = (x ^ y) & 1 ? (uint8) (GSU.vColorReg >> 4) : (uint8) GSU.vColorReg; + else + c = (uint8) GSU.vColorReg; + + if (!(GSU.vPlotOptionReg & 0x01) && !(c & 0xf)) + return; + + a = GSU.apvScreen[y >> 3] + GSU.x[x >> 3] + ((y & 7) << 1); + v = 128 >> (x & 7); + + if (c & 0x01) + a[0] |= v; + else + a[0] &= ~v; + + if (c & 0x02) + a[1] |= v; + else + a[1] &= ~v; +} + +// 4c (ALT1) - rpix - read color of the pixel with R1, R2 as x, y +static void fx_rpix_2bit (void) +{ + uint32 x = USEX8(R1); + uint32 y = USEX8(R2); + uint8 *a; + uint8 v; + + R15++; + CLRFLAGS; + +#ifdef CHECK_LIMITS + if (y >= GSU.vScreenHeight) + return; +#endif + + a = GSU.apvScreen[y >> 3] + GSU.x[x >> 3] + ((y & 7) << 1); + v = 128 >> (x & 7); + + DREG = 0; + DREG |= ((uint32) ((a[0] & v) != 0)) << 0; + DREG |= ((uint32) ((a[1] & v) != 0)) << 1; + TESTR14; +} + +// 4c - plot - plot pixel with R1, R2 as x, y and the color register as the color +static void fx_plot_4bit (void) +{ + uint32 x = USEX8(R1); + uint32 y = USEX8(R2); + uint8 *a; + uint8 v, c; + + R15++; + CLRFLAGS; + R1++; + +#ifdef CHECK_LIMITS + if (y >= GSU.vScreenHeight) + return; +#endif + + if (GSU.vPlotOptionReg & 0x02) + c = (x ^ y) & 1 ? (uint8) (GSU.vColorReg >> 4) : (uint8) GSU.vColorReg; + else + c = (uint8) GSU.vColorReg; + + if (!(GSU.vPlotOptionReg & 0x01) && !(c & 0xf)) + return; + + a = GSU.apvScreen[y >> 3] + GSU.x[x >> 3] + ((y & 7) << 1); + v = 128 >> (x & 7); + + if (c & 0x01) + a[0x00] |= v; + else + a[0x00] &= ~v; + + if (c & 0x02) + a[0x01] |= v; + else + a[0x01] &= ~v; + + if (c & 0x04) + a[0x10] |= v; + else + a[0x10] &= ~v; + + if (c & 0x08) + a[0x11] |= v; + else + a[0x11] &= ~v; +} + +// 4c (ALT1) - rpix - read color of the pixel with R1, R2 as x, y +static void fx_rpix_4bit (void) +{ + uint32 x = USEX8(R1); + uint32 y = USEX8(R2); + uint8 *a; + uint8 v; + + R15++; + CLRFLAGS; + +#ifdef CHECK_LIMITS + if (y >= GSU.vScreenHeight) + return; +#endif + + a = GSU.apvScreen[y >> 3] + GSU.x[x >> 3] + ((y & 7) << 1); + v = 128 >> (x & 7); + + DREG = 0; + DREG |= ((uint32) ((a[0x00] & v) != 0)) << 0; + DREG |= ((uint32) ((a[0x01] & v) != 0)) << 1; + DREG |= ((uint32) ((a[0x10] & v) != 0)) << 2; + DREG |= ((uint32) ((a[0x11] & v) != 0)) << 3; + TESTR14; +} + +// 4c - plot - plot pixel with R1, R2 as x, y and the color register as the color +static void fx_plot_8bit (void) +{ + uint32 x = USEX8(R1); + uint32 y = USEX8(R2); + uint8 *a; + uint8 v, c; + + R15++; + CLRFLAGS; + R1++; + +#ifdef CHECK_LIMITS + if (y >= GSU.vScreenHeight) + return; +#endif + + c = (uint8) GSU.vColorReg; + if (!(GSU.vPlotOptionReg & 0x10)) + { + if (!(GSU.vPlotOptionReg & 0x01) && !(c & 0xf)) + return; + } + else + if (!(GSU.vPlotOptionReg & 0x01) && !c) + return; + + a = GSU.apvScreen[y >> 3] + GSU.x[x >> 3] + ((y & 7) << 1); + v = 128 >> (x & 7); + + if (c & 0x01) + a[0x00] |= v; + else + a[0x00] &= ~v; + + if (c & 0x02) + a[0x01] |= v; + else + a[0x01] &= ~v; + + if (c & 0x04) + a[0x10] |= v; + else + a[0x10] &= ~v; + + if (c & 0x08) + a[0x11] |= v; + else + a[0x11] &= ~v; + + if (c & 0x10) + a[0x20] |= v; + else + a[0x20] &= ~v; + + if (c & 0x20) + a[0x21] |= v; + else + a[0x21] &= ~v; + + if (c & 0x40) + a[0x30] |= v; + else + a[0x30] &= ~v; + + if (c & 0x80) + a[0x31] |= v; + else + a[0x31] &= ~v; +} + +// 4c (ALT1) - rpix - read color of the pixel with R1, R2 as x, y +static void fx_rpix_8bit (void) +{ + uint32 x = USEX8(R1); + uint32 y = USEX8(R2); + uint8 *a; + uint8 v; + + R15++; + CLRFLAGS; + +#ifdef CHECK_LIMITS + if (y >= GSU.vScreenHeight) + return; +#endif + + a = GSU.apvScreen[y >> 3] + GSU.x[x >> 3] + ((y & 7) << 1); + v = 128 >> (x & 7); + + DREG = 0; + DREG |= ((uint32) ((a[0x00] & v) != 0)) << 0; + DREG |= ((uint32) ((a[0x01] & v) != 0)) << 1; + DREG |= ((uint32) ((a[0x10] & v) != 0)) << 2; + DREG |= ((uint32) ((a[0x11] & v) != 0)) << 3; + DREG |= ((uint32) ((a[0x20] & v) != 0)) << 4; + DREG |= ((uint32) ((a[0x21] & v) != 0)) << 5; + DREG |= ((uint32) ((a[0x30] & v) != 0)) << 6; + DREG |= ((uint32) ((a[0x31] & v) != 0)) << 7; + GSU.vZero = DREG; + TESTR14; +} + +// 4c - plot - plot pixel with R1, R2 as x, y and the color register as the color +static void fx_plot_obj (void) +{ +#ifdef DEBUGGER + fprintf(stderr, "ERROR fx_plot_obj called\n"); +#endif +} + +// 4c (ALT1) - rpix - read color of the pixel with R1, R2 as x, y +static void fx_rpix_obj (void) +{ +#ifdef DEBUGGER + fprintf(stderr, "ERROR fx_rpix_obj called\n"); +#endif +} + +// 4d - swap - swap upper and lower byte of a register +static void fx_swap (void) +{ + uint8 c = (uint8) SREG; + uint8 d = (uint8) (SREG >> 8); + uint32 v = (((uint32) c) << 8) | ((uint32) d); + R15++; + DREG = v; + GSU.vSign = v; + GSU.vZero = v; + TESTR14; + CLRFLAGS; +} + +// 4e - color - copy source register to color register +static void fx_color (void) +{ + uint8 c = (uint8) SREG; + + if (GSU.vPlotOptionReg & 0x04) + c = (c & 0xf0) | (c >> 4); + if (GSU.vPlotOptionReg & 0x08) + { + GSU.vColorReg &= 0xf0; + GSU.vColorReg |= c & 0x0f; + } + else + GSU.vColorReg = USEX8(c); + + CLRFLAGS; + R15++; +} + +// 4e (ALT1) - cmode - set plot option register +static void fx_cmode (void) +{ + GSU.vPlotOptionReg = SREG; + + if (GSU.vPlotOptionReg & 0x10) + GSU.vScreenHeight = 256; // OBJ Mode (for drawing into sprites) + else + GSU.vScreenHeight = GSU.vScreenRealHeight; + + fx_computeScreenPointers(); + CLRFLAGS; + R15++; +} + +// 4f - not - perform exclusive exor with 1 on all bits +static void fx_not (void) +{ + uint32 v = ~SREG; + R15++; + DREG = v; + GSU.vSign = v; + GSU.vZero = v; + TESTR14; + CLRFLAGS; +} + +// 50-5f - add rn - add, register + register +#define FX_ADD(reg) \ + int32 s = SUSEX16(SREG) + SUSEX16(GSU.avReg[reg]); \ + GSU.vCarry = s >= 0x10000; \ + GSU.vOverflow = ~(SREG ^ GSU.avReg[reg]) & (GSU.avReg[reg] ^ s) & 0x8000; \ + GSU.vSign = s; \ + GSU.vZero = s; \ + R15++; \ + DREG = s; \ + TESTR14; \ + CLRFLAGS + +static void fx_add_r0 (void) +{ + FX_ADD(0); +} + +static void fx_add_r1 (void) +{ + FX_ADD(1); +} + +static void fx_add_r2 (void) +{ + FX_ADD(2); +} + +static void fx_add_r3 (void) +{ + FX_ADD(3); +} + +static void fx_add_r4 (void) +{ + FX_ADD(4); +} + +static void fx_add_r5 (void) +{ + FX_ADD(5); +} + +static void fx_add_r6 (void) +{ + FX_ADD(6); +} + +static void fx_add_r7 (void) +{ + FX_ADD(7); +} + +static void fx_add_r8 (void) +{ + FX_ADD(8); +} + +static void fx_add_r9 (void) +{ + FX_ADD(9); +} + +static void fx_add_r10 (void) +{ + FX_ADD(10); +} + +static void fx_add_r11 (void) +{ + FX_ADD(11); +} + +static void fx_add_r12 (void) +{ + FX_ADD(12); +} + +static void fx_add_r13 (void) +{ + FX_ADD(13); +} + +static void fx_add_r14 (void) +{ + FX_ADD(14); +} + +static void fx_add_r15 (void) +{ + FX_ADD(15); +} + +// 50-5f (ALT1) - adc rn - add with carry, register + register +#define FX_ADC(reg) \ + int32 s = SUSEX16(SREG) + SUSEX16(GSU.avReg[reg]) + SEX16(GSU.vCarry); \ + GSU.vCarry = s >= 0x10000; \ + GSU.vOverflow = ~(SREG ^ GSU.avReg[reg]) & (GSU.avReg[reg] ^ s) & 0x8000; \ + GSU.vSign = s; \ + GSU.vZero = s; \ + R15++; \ + DREG = s; \ + TESTR14; \ + CLRFLAGS + +static void fx_adc_r0 (void) +{ + FX_ADC(0); +} + +static void fx_adc_r1 (void) +{ + FX_ADC(1); +} + +static void fx_adc_r2 (void) +{ + FX_ADC(2); +} + +static void fx_adc_r3 (void) +{ + FX_ADC(3); +} + +static void fx_adc_r4 (void) +{ + FX_ADC(4); +} + +static void fx_adc_r5 (void) +{ + FX_ADC(5); +} + +static void fx_adc_r6 (void) +{ + FX_ADC(6); +} + +static void fx_adc_r7 (void) +{ + FX_ADC(7); +} + +static void fx_adc_r8 (void) +{ + FX_ADC(8); +} + +static void fx_adc_r9 (void) +{ + FX_ADC(9); +} + +static void fx_adc_r10 (void) +{ + FX_ADC(10); +} + +static void fx_adc_r11 (void) +{ + FX_ADC(11); +} + +static void fx_adc_r12 (void) +{ + FX_ADC(12); +} + +static void fx_adc_r13 (void) +{ + FX_ADC(13); +} + +static void fx_adc_r14 (void) +{ + FX_ADC(14); +} + +static void fx_adc_r15 (void) +{ + FX_ADC(15); +} + +// 50-5f (ALT2) - add #n - add, register + immediate +#define FX_ADD_I(imm) \ + int32 s = SUSEX16(SREG) + imm; \ + GSU.vCarry = s >= 0x10000; \ + GSU.vOverflow = ~(SREG ^ imm) & (imm ^ s) & 0x8000; \ + GSU.vSign = s; \ + GSU.vZero = s; \ + R15++; \ + DREG = s; \ + TESTR14; \ + CLRFLAGS + +static void fx_add_i0 (void) +{ + FX_ADD_I(0); +} + +static void fx_add_i1 (void) +{ + FX_ADD_I(1); +} + +static void fx_add_i2 (void) +{ + FX_ADD_I(2); +} + +static void fx_add_i3 (void) +{ + FX_ADD_I(3); +} + +static void fx_add_i4 (void) +{ + FX_ADD_I(4); +} + +static void fx_add_i5 (void) +{ + FX_ADD_I(5); +} + +static void fx_add_i6 (void) +{ + FX_ADD_I(6); +} + +static void fx_add_i7 (void) +{ + FX_ADD_I(7); +} + +static void fx_add_i8 (void) +{ + FX_ADD_I(8); +} + +static void fx_add_i9 (void) +{ + FX_ADD_I(9); +} + +static void fx_add_i10 (void) +{ + FX_ADD_I(10); +} + +static void fx_add_i11 (void) +{ + FX_ADD_I(11); +} + +static void fx_add_i12 (void) +{ + FX_ADD_I(12); +} + +static void fx_add_i13 (void) +{ + FX_ADD_I(13); +} + +static void fx_add_i14 (void) +{ + FX_ADD_I(14); +} + +static void fx_add_i15 (void) +{ + FX_ADD_I(15); +} + +// 50-5f (ALT3) - adc #n - add with carry, register + immediate +#define FX_ADC_I(imm) \ + int32 s = SUSEX16(SREG) + imm + SUSEX16(GSU.vCarry); \ + GSU.vCarry = s >= 0x10000; \ + GSU.vOverflow = ~(SREG ^ imm) & (imm ^ s) & 0x8000; \ + GSU.vSign = s; \ + GSU.vZero = s; \ + R15++; \ + DREG = s; \ + TESTR14; \ + CLRFLAGS + +static void fx_adc_i0 (void) +{ + FX_ADC_I(0); +} + +static void fx_adc_i1 (void) +{ + FX_ADC_I(1); +} + +static void fx_adc_i2 (void) +{ + FX_ADC_I(2); +} + +static void fx_adc_i3 (void) +{ + FX_ADC_I(3); +} + +static void fx_adc_i4 (void) +{ + FX_ADC_I(4); +} + +static void fx_adc_i5 (void) +{ + FX_ADC_I(5); +} + +static void fx_adc_i6 (void) +{ + FX_ADC_I(6); +} + +static void fx_adc_i7 (void) +{ + FX_ADC_I(7); +} + +static void fx_adc_i8 (void) +{ + FX_ADC_I(8); +} + +static void fx_adc_i9 (void) +{ + FX_ADC_I(9); +} + +static void fx_adc_i10 (void) +{ + FX_ADC_I(10); +} + +static void fx_adc_i11 (void) +{ + FX_ADC_I(11); +} + +static void fx_adc_i12 (void) +{ + FX_ADC_I(12); +} + +static void fx_adc_i13 (void) +{ + FX_ADC_I(13); +} + +static void fx_adc_i14 (void) +{ + FX_ADC_I(14); +} + +static void fx_adc_i15 (void) +{ + FX_ADC_I(15); +} + +// 60-6f - sub rn - subtract, register - register +#define FX_SUB(reg) \ + int32 s = SUSEX16(SREG) - SUSEX16(GSU.avReg[reg]); \ + GSU.vCarry = s >= 0; \ + GSU.vOverflow = (SREG ^ GSU.avReg[reg]) & (SREG ^ s) & 0x8000; \ + GSU.vSign = s; \ + GSU.vZero = s; \ + R15++; \ + DREG = s; \ + TESTR14; \ + CLRFLAGS + +static void fx_sub_r0 (void) +{ + FX_SUB(0); +} + +static void fx_sub_r1 (void) +{ + FX_SUB(1); +} + +static void fx_sub_r2 (void) +{ + FX_SUB(2); +} + +static void fx_sub_r3 (void) +{ + FX_SUB(3); +} + +static void fx_sub_r4 (void) +{ + FX_SUB(4); +} + +static void fx_sub_r5 (void) +{ + FX_SUB(5); +} + +static void fx_sub_r6 (void) +{ + FX_SUB(6); +} + +static void fx_sub_r7 (void) +{ + FX_SUB(7); +} + +static void fx_sub_r8 (void) +{ + FX_SUB(8); +} + +static void fx_sub_r9 (void) +{ + FX_SUB(9); +} + +static void fx_sub_r10 (void) +{ + FX_SUB(10); +} + +static void fx_sub_r11 (void) +{ + FX_SUB(11); +} + +static void fx_sub_r12 (void) +{ + FX_SUB(12); +} + +static void fx_sub_r13 (void) +{ + FX_SUB(13); +} + +static void fx_sub_r14 (void) +{ + FX_SUB(14); +} + +static void fx_sub_r15 (void) +{ + FX_SUB(15); +} + +// 60-6f (ALT1) - sbc rn - subtract with carry, register - register +#define FX_SBC(reg) \ + int32 s = SUSEX16(SREG) - SUSEX16(GSU.avReg[reg]) - (SUSEX16(GSU.vCarry ^ 1)); \ + GSU.vCarry = s >= 0; \ + GSU.vOverflow = (SREG ^ GSU.avReg[reg]) & (SREG ^ s) & 0x8000; \ + GSU.vSign = s; \ + GSU.vZero = s; \ + R15++; \ + DREG = s; \ + TESTR14; \ + CLRFLAGS + +static void fx_sbc_r0 (void) +{ + FX_SBC(0); +} + +static void fx_sbc_r1 (void) +{ + FX_SBC(1); +} + +static void fx_sbc_r2 (void) +{ + FX_SBC(2); +} + +static void fx_sbc_r3 (void) +{ + FX_SBC(3); +} + +static void fx_sbc_r4 (void) +{ + FX_SBC(4); +} + +static void fx_sbc_r5 (void) +{ + FX_SBC(5); +} + +static void fx_sbc_r6 (void) +{ + FX_SBC(6); +} + +static void fx_sbc_r7 (void) +{ + FX_SBC(7); +} + +static void fx_sbc_r8 (void) +{ + FX_SBC(8); +} + +static void fx_sbc_r9 (void) +{ + FX_SBC(9); +} + +static void fx_sbc_r10 (void) +{ + FX_SBC(10); +} + +static void fx_sbc_r11 (void) +{ + FX_SBC(11); +} + +static void fx_sbc_r12 (void) +{ + FX_SBC(12); +} + +static void fx_sbc_r13 (void) +{ + FX_SBC(13); +} + +static void fx_sbc_r14 (void) +{ + FX_SBC(14); +} + +static void fx_sbc_r15 (void) +{ + FX_SBC(15); +} + +// 60-6f (ALT2) - sub #n - subtract, register - immediate +#define FX_SUB_I(imm) \ + int32 s = SUSEX16(SREG) - imm; \ + GSU.vCarry = s >= 0; \ + GSU.vOverflow = (SREG ^ imm) & (SREG ^ s) & 0x8000; \ + GSU.vSign = s; \ + GSU.vZero = s; \ + R15++; \ + DREG = s; \ + TESTR14; \ + CLRFLAGS + +static void fx_sub_i0 (void) +{ + FX_SUB_I(0); +} + +static void fx_sub_i1 (void) +{ + FX_SUB_I(1); +} + +static void fx_sub_i2 (void) +{ + FX_SUB_I(2); +} + +static void fx_sub_i3 (void) +{ + FX_SUB_I(3); +} + +static void fx_sub_i4 (void) +{ + FX_SUB_I(4); +} + +static void fx_sub_i5 (void) +{ + FX_SUB_I(5); +} + +static void fx_sub_i6 (void) +{ + FX_SUB_I(6); +} + +static void fx_sub_i7 (void) +{ + FX_SUB_I(7); +} + +static void fx_sub_i8 (void) +{ + FX_SUB_I(8); +} + +static void fx_sub_i9 (void) +{ + FX_SUB_I(9); +} + +static void fx_sub_i10 (void) +{ + FX_SUB_I(10); +} + +static void fx_sub_i11 (void) +{ + FX_SUB_I(11); +} + +static void fx_sub_i12 (void) +{ + FX_SUB_I(12); +} + +static void fx_sub_i13 (void) +{ + FX_SUB_I(13); +} + +static void fx_sub_i14 (void) +{ + FX_SUB_I(14); +} + +static void fx_sub_i15 (void) +{ + FX_SUB_I(15); +} + +// 60-6f (ALT3) - cmp rn - compare, register, register +#define FX_CMP(reg) \ + int32 s = SUSEX16(SREG) - SUSEX16(GSU.avReg[reg]); \ + GSU.vCarry = s >= 0; \ + GSU.vOverflow = (SREG ^ GSU.avReg[reg]) & (SREG ^ s) & 0x8000; \ + GSU.vSign = s; \ + GSU.vZero = s; \ + R15++; \ + CLRFLAGS + +static void fx_cmp_r0 (void) +{ + FX_CMP(0); +} + +static void fx_cmp_r1 (void) +{ + FX_CMP(1); +} + +static void fx_cmp_r2 (void) +{ + FX_CMP(2); +} + +static void fx_cmp_r3 (void) +{ + FX_CMP(3); +} + +static void fx_cmp_r4 (void) +{ + FX_CMP(4); +} + +static void fx_cmp_r5 (void) +{ + FX_CMP(5); +} + +static void fx_cmp_r6 (void) +{ + FX_CMP(6); +} + +static void fx_cmp_r7 (void) +{ + FX_CMP(7); +} + +static void fx_cmp_r8 (void) +{ + FX_CMP(8); +} + +static void fx_cmp_r9 (void) +{ + FX_CMP(9); +} + +static void fx_cmp_r10 (void) +{ + FX_CMP(10); +} + +static void fx_cmp_r11 (void) +{ + FX_CMP(11); +} + +static void fx_cmp_r12 (void) +{ + FX_CMP(12); +} + +static void fx_cmp_r13 (void) +{ + FX_CMP(13); +} + +static void fx_cmp_r14 (void) +{ + FX_CMP(14); +} + +static void fx_cmp_r15 (void) +{ + FX_CMP(15); +} + +// 70 - merge - R7 as upper byte, R8 as lower byte (used for texture-mapping) +static void fx_merge (void) +{ + uint32 v = (R7 & 0xff00) | ((R8 & 0xff00) >> 8); + R15++; + DREG = v; + GSU.vOverflow = (v & 0xc0c0) << 16; + GSU.vZero = !(v & 0xf0f0); + GSU.vSign = ((v | (v << 8)) & 0x8000); + GSU.vCarry = (v & 0xe0e0) != 0; + TESTR14; + CLRFLAGS; +} + +// 71-7f - and rn - reister & register +#define FX_AND(reg) \ + uint32 v = SREG & GSU.avReg[reg]; \ + R15++; \ + DREG = v; \ + GSU.vSign = v; \ + GSU.vZero = v; \ + TESTR14; \ + CLRFLAGS + +static void fx_and_r1 (void) +{ + FX_AND(1); +} + +static void fx_and_r2 (void) +{ + FX_AND(2); +} + +static void fx_and_r3 (void) +{ + FX_AND(3); +} + +static void fx_and_r4 (void) +{ + FX_AND(4); +} + +static void fx_and_r5 (void) +{ + FX_AND(5); +} + +static void fx_and_r6 (void) +{ + FX_AND(6); +} + +static void fx_and_r7 (void) +{ + FX_AND(7); +} + +static void fx_and_r8 (void) +{ + FX_AND(8); +} + +static void fx_and_r9 (void) +{ + FX_AND(9); +} + +static void fx_and_r10 (void) +{ + FX_AND(10); +} + +static void fx_and_r11 (void) +{ + FX_AND(11); +} + +static void fx_and_r12 (void) +{ + FX_AND(12); +} + +static void fx_and_r13 (void) +{ + FX_AND(13); +} + +static void fx_and_r14 (void) +{ + FX_AND(14); +} + +static void fx_and_r15 (void) +{ + FX_AND(15); +} + +// 71-7f (ALT1) - bic rn - reister & ~register +#define FX_BIC(reg) \ + uint32 v = SREG & ~GSU.avReg[reg]; \ + R15++; \ + DREG = v; \ + GSU.vSign = v; \ + GSU.vZero = v; \ + TESTR14; \ + CLRFLAGS + +static void fx_bic_r1 (void) +{ + FX_BIC(1); +} + +static void fx_bic_r2 (void) +{ + FX_BIC(2); +} + +static void fx_bic_r3 (void) +{ + FX_BIC(3); +} + +static void fx_bic_r4 (void) +{ + FX_BIC(4); +} + +static void fx_bic_r5 (void) +{ + FX_BIC(5); +} + +static void fx_bic_r6 (void) +{ + FX_BIC(6); +} + +static void fx_bic_r7 (void) +{ + FX_BIC(7); +} + +static void fx_bic_r8 (void) +{ + FX_BIC(8); +} + +static void fx_bic_r9 (void) +{ + FX_BIC(9); +} + +static void fx_bic_r10 (void) +{ + FX_BIC(10); +} + +static void fx_bic_r11 (void) +{ + FX_BIC(11); +} + +static void fx_bic_r12 (void) +{ + FX_BIC(12); +} + +static void fx_bic_r13 (void) +{ + FX_BIC(13); +} + +static void fx_bic_r14 (void) +{ + FX_BIC(14); +} + +static void fx_bic_r15 (void) +{ + FX_BIC(15); +} + +// 71-7f (ALT2) - and #n - reister & immediate +#define FX_AND_I(imm) \ + uint32 v = SREG & imm; \ + R15++; \ + DREG = v; \ + GSU.vSign = v; \ + GSU.vZero = v; \ + TESTR14; \ + CLRFLAGS + +static void fx_and_i1 (void) +{ + FX_AND_I(1); +} + +static void fx_and_i2 (void) +{ + FX_AND_I(2); +} + +static void fx_and_i3 (void) +{ + FX_AND_I(3); +} + +static void fx_and_i4 (void) +{ + FX_AND_I(4); +} + +static void fx_and_i5 (void) +{ + FX_AND_I(5); +} + +static void fx_and_i6 (void) +{ + FX_AND_I(6); +} + +static void fx_and_i7 (void) +{ + FX_AND_I(7); +} + +static void fx_and_i8 (void) +{ + FX_AND_I(8); +} + +static void fx_and_i9 (void) +{ + FX_AND_I(9); +} + +static void fx_and_i10 (void) +{ + FX_AND_I(10); +} + +static void fx_and_i11 (void) +{ + FX_AND_I(11); +} + +static void fx_and_i12 (void) +{ + FX_AND_I(12); +} + +static void fx_and_i13 (void) +{ + FX_AND_I(13); +} + +static void fx_and_i14 (void) +{ + FX_AND_I(14); +} + +static void fx_and_i15 (void) +{ + FX_AND_I(15); +} + +// 71-7f (ALT3) - bic #n - reister & ~immediate +#define FX_BIC_I(imm) \ + uint32 v = SREG & ~imm; \ + R15++; \ + DREG = v; \ + GSU.vSign = v; \ + GSU.vZero = v; \ + TESTR14; \ + CLRFLAGS + +static void fx_bic_i1 (void) +{ + FX_BIC_I(1); +} + +static void fx_bic_i2 (void) +{ + FX_BIC_I(2); +} + +static void fx_bic_i3 (void) +{ + FX_BIC_I(3); +} + +static void fx_bic_i4 (void) +{ + FX_BIC_I(4); +} + +static void fx_bic_i5 (void) +{ + FX_BIC_I(5); +} + +static void fx_bic_i6 (void) +{ + FX_BIC_I(6); +} + +static void fx_bic_i7 (void) +{ + FX_BIC_I(7); +} + +static void fx_bic_i8 (void) +{ + FX_BIC_I(8); +} + +static void fx_bic_i9 (void) +{ + FX_BIC_I(9); +} + +static void fx_bic_i10 (void) +{ + FX_BIC_I(10); +} + +static void fx_bic_i11 (void) +{ + FX_BIC_I(11); +} + +static void fx_bic_i12 (void) +{ + FX_BIC_I(12); +} + +static void fx_bic_i13 (void) +{ + FX_BIC_I(13); +} + +static void fx_bic_i14 (void) +{ + FX_BIC_I(14); +} + +static void fx_bic_i15 (void) +{ + FX_BIC_I(15); +} + +// 80-8f - mult rn - 8 bit to 16 bit signed multiply, register * register +#define FX_MULT(reg) \ + uint32 v = (uint32) (SEX8(SREG) * SEX8(GSU.avReg[reg])); \ + R15++; \ + DREG = v; \ + GSU.vSign = v; \ + GSU.vZero = v; \ + TESTR14; \ + CLRFLAGS + +static void fx_mult_r0 (void) +{ + FX_MULT(0); +} + +static void fx_mult_r1 (void) +{ + FX_MULT(1); +} + +static void fx_mult_r2 (void) +{ + FX_MULT(2); +} + +static void fx_mult_r3 (void) +{ + FX_MULT(3); +} + +static void fx_mult_r4 (void) +{ + FX_MULT(4); +} + +static void fx_mult_r5 (void) +{ + FX_MULT(5); +} + +static void fx_mult_r6 (void) +{ + FX_MULT(6); +} + +static void fx_mult_r7 (void) +{ + FX_MULT(7); +} + +static void fx_mult_r8 (void) +{ + FX_MULT(8); +} + +static void fx_mult_r9 (void) +{ + FX_MULT(9); +} + +static void fx_mult_r10 (void) +{ + FX_MULT(10); +} + +static void fx_mult_r11 (void) +{ + FX_MULT(11); +} + +static void fx_mult_r12 (void) +{ + FX_MULT(12); +} + +static void fx_mult_r13 (void) +{ + FX_MULT(13); +} + +static void fx_mult_r14 (void) +{ + FX_MULT(14); +} + +static void fx_mult_r15 (void) +{ + FX_MULT(15); +} + +// 80-8f (ALT1) - umult rn - 8 bit to 16 bit unsigned multiply, register * register +#define FX_UMULT(reg) \ + uint32 v = USEX8(SREG) * USEX8(GSU.avReg[reg]); \ + R15++; \ + DREG = v; \ + GSU.vSign = v; \ + GSU.vZero = v; \ + TESTR14; \ + CLRFLAGS + +static void fx_umult_r0 (void) +{ + FX_UMULT(0); +} + +static void fx_umult_r1 (void) +{ + FX_UMULT(1); +} + +static void fx_umult_r2 (void) +{ + FX_UMULT(2); +} + +static void fx_umult_r3 (void) +{ + FX_UMULT(3); +} + +static void fx_umult_r4 (void) +{ + FX_UMULT(4); +} + +static void fx_umult_r5 (void) +{ + FX_UMULT(5); +} + +static void fx_umult_r6 (void) +{ + FX_UMULT(6); +} + +static void fx_umult_r7 (void) +{ + FX_UMULT(7); +} + +static void fx_umult_r8 (void) +{ + FX_UMULT(8); +} + +static void fx_umult_r9 (void) +{ + FX_UMULT(9); +} + +static void fx_umult_r10 (void) +{ + FX_UMULT(10); +} + +static void fx_umult_r11 (void) +{ + FX_UMULT(11); +} + +static void fx_umult_r12 (void) +{ + FX_UMULT(12); +} + +static void fx_umult_r13 (void) +{ + FX_UMULT(13); +} + +static void fx_umult_r14 (void) +{ + FX_UMULT(14); +} + +static void fx_umult_r15 (void) +{ + FX_UMULT(15); +} + +// 80-8f (ALT2) - mult #n - 8 bit to 16 bit signed multiply, register * immediate +#define FX_MULT_I(imm) \ + uint32 v = (uint32) (SEX8(SREG) * ((int32) imm)); \ + R15++; \ + DREG = v; \ + GSU.vSign = v; \ + GSU.vZero = v; \ + TESTR14; \ + CLRFLAGS + +static void fx_mult_i0 (void) +{ + FX_MULT_I(0); +} + +static void fx_mult_i1 (void) +{ + FX_MULT_I(1); +} + +static void fx_mult_i2 (void) +{ + FX_MULT_I(2); +} + +static void fx_mult_i3 (void) +{ + FX_MULT_I(3); +} + +static void fx_mult_i4 (void) +{ + FX_MULT_I(4); +} + +static void fx_mult_i5 (void) +{ + FX_MULT_I(5); +} + +static void fx_mult_i6 (void) +{ + FX_MULT_I(6); +} + +static void fx_mult_i7 (void) +{ + FX_MULT_I(7); +} + +static void fx_mult_i8 (void) +{ + FX_MULT_I(8); +} + +static void fx_mult_i9 (void) +{ + FX_MULT_I(9); +} + +static void fx_mult_i10 (void) +{ + FX_MULT_I(10); +} + +static void fx_mult_i11 (void) +{ + FX_MULT_I(11); +} + +static void fx_mult_i12 (void) +{ + FX_MULT_I(12); +} + +static void fx_mult_i13 (void) +{ + FX_MULT_I(13); +} + +static void fx_mult_i14 (void) +{ + FX_MULT_I(14); +} + +static void fx_mult_i15 (void) +{ + FX_MULT_I(15); +} + +// 80-8f (ALT3) - umult #n - 8 bit to 16 bit unsigned multiply, register * immediate +#define FX_UMULT_I(imm) \ + uint32 v = USEX8(SREG) * ((uint32) imm); \ + R15++; \ + DREG = v; \ + GSU.vSign = v; \ + GSU.vZero = v; \ + TESTR14; \ + CLRFLAGS + +static void fx_umult_i0 (void) +{ + FX_UMULT_I(0); +} + +static void fx_umult_i1 (void) +{ + FX_UMULT_I(1); +} + +static void fx_umult_i2 (void) +{ + FX_UMULT_I(2); +} + +static void fx_umult_i3 (void) +{ + FX_UMULT_I(3); +} + +static void fx_umult_i4 (void) +{ + FX_UMULT_I(4); +} + +static void fx_umult_i5 (void) +{ + FX_UMULT_I(5); +} + +static void fx_umult_i6 (void) +{ + FX_UMULT_I(6); +} + +static void fx_umult_i7 (void) +{ + FX_UMULT_I(7); +} + +static void fx_umult_i8 (void) +{ + FX_UMULT_I(8); +} + +static void fx_umult_i9 (void) +{ + FX_UMULT_I(9); +} + +static void fx_umult_i10 (void) +{ + FX_UMULT_I(10); +} + +static void fx_umult_i11 (void) +{ + FX_UMULT_I(11); +} + +static void fx_umult_i12 (void) +{ + FX_UMULT_I(12); +} + +static void fx_umult_i13 (void) +{ + FX_UMULT_I(13); +} + +static void fx_umult_i14 (void) +{ + FX_UMULT_I(14); +} + +static void fx_umult_i15 (void) +{ + FX_UMULT_I(15); +} + +// 90 - sbk - store word to last accessed RAM address +static void fx_sbk (void) +{ + RAM(GSU.vLastRamAdr) = (uint8) SREG; + RAM(GSU.vLastRamAdr ^ 1) = (uint8) (SREG >> 8); + CLRFLAGS; + R15++; +} + +// 91-94 - link #n - R11 = R15 + immediate +#define FX_LINK_I(lkn) \ + R11 = R15 + lkn; \ + CLRFLAGS; \ + R15++ + +static void fx_link_i1 (void) +{ + FX_LINK_I(1); +} + +static void fx_link_i2 (void) +{ + FX_LINK_I(2); +} + +static void fx_link_i3 (void) +{ + FX_LINK_I(3); +} + +static void fx_link_i4 (void) +{ + FX_LINK_I(4); +} + +// 95 - sex - sign extend 8 bit to 16 bit +static void fx_sex (void) +{ + uint32 v = (uint32) SEX8(SREG); + R15++; + DREG = v; + GSU.vSign = v; + GSU.vZero = v; + TESTR14; + CLRFLAGS; +} + +// 96 - asr - aritmetric shift right by one +static void fx_asr (void) +{ + uint32 v; + GSU.vCarry = SREG & 1; + v = (uint32) (SEX16(SREG) >> 1); + R15++; + DREG = v; + GSU.vSign = v; + GSU.vZero = v; + TESTR14; + CLRFLAGS; +} + +// 96 (ALT1) - div2 - aritmetric shift right by one +static void fx_div2 (void) +{ + uint32 v; + int32 s = SEX16(SREG); + GSU.vCarry = s & 1; + if (s == -1) + v = 0; + else + v = (uint32) (s >> 1); + R15++; + DREG = v; + GSU.vSign = v; + GSU.vZero = v; + TESTR14; + CLRFLAGS; +} + +// 97 - ror - rotate right by one +static void fx_ror (void) +{ + uint32 v = (USEX16(SREG) >> 1) | (GSU.vCarry << 15); + GSU.vCarry = SREG & 1; + R15++; + DREG = v; + GSU.vSign = v; + GSU.vZero = v; + TESTR14; + CLRFLAGS; +} + +// 98-9d - jmp rn - jump to address of register +#define FX_JMP(reg) \ + R15 = GSU.avReg[reg]; \ + CLRFLAGS + +static void fx_jmp_r8 (void) +{ + FX_JMP(8); +} + +static void fx_jmp_r9 (void) +{ + FX_JMP(9); +} + +static void fx_jmp_r10 (void) +{ + FX_JMP(10); +} + +static void fx_jmp_r11 (void) +{ + FX_JMP(11); +} + +static void fx_jmp_r12 (void) +{ + FX_JMP(12); +} + +static void fx_jmp_r13 (void) +{ + FX_JMP(13); +} + +// 98-9d (ALT1) - ljmp rn - set program bank to source register and jump to address of register +#define FX_LJMP(reg) \ + GSU.vPrgBankReg = GSU.avReg[reg] & 0x7f; \ + GSU.pvPrgBank = GSU.apvRomBank[GSU.vPrgBankReg]; \ + R15 = SREG; \ + GSU.bCacheActive = FALSE; \ + fx_cache(); \ + R15-- + +static void fx_ljmp_r8 (void) +{ + FX_LJMP(8); +} + +static void fx_ljmp_r9 (void) +{ + FX_LJMP(9); +} + +static void fx_ljmp_r10 (void) +{ + FX_LJMP(10); +} + +static void fx_ljmp_r11 (void) +{ + FX_LJMP(11); +} + +static void fx_ljmp_r12 (void) +{ + FX_LJMP(12); +} + +static void fx_ljmp_r13 (void) +{ + FX_LJMP(13); +} + +// 9e - lob - set upper byte to zero (keep low byte) +static void fx_lob (void) +{ + uint32 v = USEX8(SREG); + R15++; + DREG = v; + GSU.vSign = v << 8; + GSU.vZero = v << 8; + TESTR14; + CLRFLAGS; +} + +// 9f - fmult - 16 bit to 32 bit signed multiplication, upper 16 bits only +static void fx_fmult (void) +{ + uint32 v; + uint32 c = (uint32) (SEX16(SREG) * SEX16(R6)); + v = c >> 16; + R15++; + DREG = v; + GSU.vSign = v; + GSU.vZero = v; + GSU.vCarry = (c >> 15) & 1; + TESTR14; + CLRFLAGS; +} + +// 9f (ALT1) - lmult - 16 bit to 32 bit signed multiplication +static void fx_lmult (void) +{ + uint32 v; + uint32 c = (uint32) (SEX16(SREG) * SEX16(R6)); + R4 = c; + v = c >> 16; + R15++; + DREG = v; + GSU.vSign = v; + GSU.vZero = v; + // XXX: R6 or R4? + GSU.vCarry = (R4 >> 15) & 1; // should it be bit 15 of R4 instead ? + TESTR14; + CLRFLAGS; +} + +// a0-af - ibt rn, #pp - immediate byte transfer +#define FX_IBT(reg) \ + uint8 v = PIPE; \ + R15++; \ + FETCHPIPE; \ + R15++; \ + GSU.avReg[reg] = SEX8(v); \ + CLRFLAGS + +static void fx_ibt_r0 (void) +{ + FX_IBT(0); +} + +static void fx_ibt_r1 (void) +{ + FX_IBT(1); +} + +static void fx_ibt_r2 (void) +{ + FX_IBT(2); +} + +static void fx_ibt_r3 (void) +{ + FX_IBT(3); +} + +static void fx_ibt_r4 (void) +{ + FX_IBT(4); +} + +static void fx_ibt_r5 (void) +{ + FX_IBT(5); +} + +static void fx_ibt_r6 (void) +{ + FX_IBT(6); +} + +static void fx_ibt_r7 (void) +{ + FX_IBT(7); +} + +static void fx_ibt_r8 (void) +{ + FX_IBT(8); +} + +static void fx_ibt_r9 (void) +{ + FX_IBT(9); +} + +static void fx_ibt_r10 (void) +{ + FX_IBT(10); +} + +static void fx_ibt_r11 (void) +{ + FX_IBT(11); +} + +static void fx_ibt_r12 (void) +{ + FX_IBT(12); +} + +static void fx_ibt_r13 (void) +{ + FX_IBT(13); +} + +static void fx_ibt_r14 (void) +{ + FX_IBT(14); + READR14; +} + +static void fx_ibt_r15 (void) +{ + FX_IBT(15); +} + +// a0-af (ALT1) - lms rn, (yy) - load word from RAM (short address) +#define FX_LMS(reg) \ + GSU.vLastRamAdr = ((uint32) PIPE) << 1; \ + R15++; \ + FETCHPIPE; \ + R15++; \ + GSU.avReg[reg] = (uint32) RAM(GSU.vLastRamAdr); \ + GSU.avReg[reg] |= ((uint32) RAM(GSU.vLastRamAdr + 1)) << 8; \ + CLRFLAGS + +static void fx_lms_r0 (void) +{ + FX_LMS(0); +} + +static void fx_lms_r1 (void) +{ + FX_LMS(1); +} + +static void fx_lms_r2 (void) +{ + FX_LMS(2); +} + +static void fx_lms_r3 (void) +{ + FX_LMS(3); +} + +static void fx_lms_r4 (void) +{ + FX_LMS(4); +} + +static void fx_lms_r5 (void) +{ + FX_LMS(5); +} + +static void fx_lms_r6 (void) +{ + FX_LMS(6); +} + +static void fx_lms_r7 (void) +{ + FX_LMS(7); +} + +static void fx_lms_r8 (void) +{ + FX_LMS(8); +} + +static void fx_lms_r9 (void) +{ + FX_LMS(9); +} + +static void fx_lms_r10 (void) +{ + FX_LMS(10); +} + +static void fx_lms_r11 (void) +{ + FX_LMS(11); +} + +static void fx_lms_r12 (void) +{ + FX_LMS(12); +} + +static void fx_lms_r13 (void) +{ + FX_LMS(13); +} + +static void fx_lms_r14 (void) +{ + FX_LMS(14); + READR14; +} + +static void fx_lms_r15 (void) +{ + FX_LMS(15); +} + +// a0-af (ALT2) - sms (yy), rn - store word in RAM (short address) +// XXX: If rn == r15, is the value of r15 before or after the extra byte is read ? +#define FX_SMS(reg) \ + uint32 v = GSU.avReg[reg]; \ + GSU.vLastRamAdr = ((uint32) PIPE) << 1; \ + R15++; \ + FETCHPIPE; \ + RAM(GSU.vLastRamAdr) = (uint8) v; \ + RAM(GSU.vLastRamAdr + 1) = (uint8) (v >> 8); \ + CLRFLAGS; \ + R15++ + +static void fx_sms_r0 (void) +{ + FX_SMS(0); +} + +static void fx_sms_r1 (void) +{ + FX_SMS(1); +} + +static void fx_sms_r2 (void) +{ + FX_SMS(2); +} + +static void fx_sms_r3 (void) +{ + FX_SMS(3); +} + +static void fx_sms_r4 (void) +{ + FX_SMS(4); +} + +static void fx_sms_r5 (void) +{ + FX_SMS(5); +} + +static void fx_sms_r6 (void) +{ + FX_SMS(6); +} + +static void fx_sms_r7 (void) +{ + FX_SMS(7); +} + +static void fx_sms_r8 (void) +{ + FX_SMS(8); +} + +static void fx_sms_r9 (void) +{ + FX_SMS(9); +} + +static void fx_sms_r10 (void) +{ + FX_SMS(10); +} + +static void fx_sms_r11 (void) +{ + FX_SMS(11); +} + +static void fx_sms_r12 (void) +{ + FX_SMS(12); +} + +static void fx_sms_r13 (void) +{ + FX_SMS(13); +} + +static void fx_sms_r14 (void) +{ + FX_SMS(14); +} + +static void fx_sms_r15 (void) +{ + FX_SMS(15); +} + +// b0-bf - from rn - set source register +// b0-bf (B) - moves rn - move register to register, and set flags, (if B flag is set) +#define FX_FROM(reg) \ + if (TF(B)) \ + { \ + uint32 v = GSU.avReg[reg]; \ + R15++; \ + DREG = v; \ + GSU.vOverflow = (v & 0x80) << 16; \ + GSU.vSign = v; \ + GSU.vZero = v; \ + TESTR14; \ + CLRFLAGS; \ + } \ + else \ + { \ + GSU.pvSreg = &GSU.avReg[reg]; \ + R15++; \ + } + +static void fx_from_r0 (void) +{ + FX_FROM(0); +} + +static void fx_from_r1 (void) +{ + FX_FROM(1); +} + +static void fx_from_r2 (void) +{ + FX_FROM(2); +} + +static void fx_from_r3 (void) +{ + FX_FROM(3); +} + +static void fx_from_r4 (void) +{ + FX_FROM(4); +} + +static void fx_from_r5 (void) +{ + FX_FROM(5); +} + +static void fx_from_r6 (void) +{ + FX_FROM(6); +} + +static void fx_from_r7 (void) +{ + FX_FROM(7); +} + +static void fx_from_r8 (void) +{ + FX_FROM(8); +} + +static void fx_from_r9 (void) +{ + FX_FROM(9); +} + +static void fx_from_r10 (void) +{ + FX_FROM(10); +} + +static void fx_from_r11 (void) +{ + FX_FROM(11); +} + +static void fx_from_r12 (void) +{ + FX_FROM(12); +} + +static void fx_from_r13 (void) +{ + FX_FROM(13); +} + +static void fx_from_r14 (void) +{ + FX_FROM(14); +} + +static void fx_from_r15 (void) +{ + FX_FROM(15); +} + +// c0 - hib - move high-byte to low-byte +static void fx_hib (void) +{ + uint32 v = USEX8(SREG >> 8); + R15++; + DREG = v; + GSU.vSign = v << 8; + GSU.vZero = v << 8; + TESTR14; + CLRFLAGS; +} + +// c1-cf - or rn +#define FX_OR(reg) \ + uint32 v = SREG | GSU.avReg[reg]; \ + R15++; \ + DREG = v; \ + GSU.vSign = v; \ + GSU.vZero = v; \ + TESTR14; \ + CLRFLAGS + +static void fx_or_r1 (void) +{ + FX_OR(1); +} + +static void fx_or_r2 (void) +{ + FX_OR(2); +} + +static void fx_or_r3 (void) +{ + FX_OR(3); +} + +static void fx_or_r4 (void) +{ + FX_OR(4); +} + +static void fx_or_r5 (void) +{ + FX_OR(5); +} + +static void fx_or_r6 (void) +{ + FX_OR(6); +} + +static void fx_or_r7 (void) +{ + FX_OR(7); +} + +static void fx_or_r8 (void) +{ + FX_OR(8); +} + +static void fx_or_r9 (void) +{ + FX_OR(9); +} + +static void fx_or_r10 (void) +{ + FX_OR(10); +} + +static void fx_or_r11 (void) +{ + FX_OR(11); +} + +static void fx_or_r12 (void) +{ + FX_OR(12); +} + +static void fx_or_r13 (void) +{ + FX_OR(13); +} + +static void fx_or_r14 (void) +{ + FX_OR(14); +} + +static void fx_or_r15 (void) +{ + FX_OR(15); +} + +// c1-cf (ALT1) - xor rn +#define FX_XOR(reg) \ + uint32 v = SREG ^ GSU.avReg[reg]; \ + R15++; \ + DREG = v; \ + GSU.vSign = v; \ + GSU.vZero = v; \ + TESTR14; \ + CLRFLAGS + +static void fx_xor_r1 (void) +{ + FX_XOR(1); +} + +static void fx_xor_r2 (void) +{ + FX_XOR(2); +} + +static void fx_xor_r3 (void) +{ + FX_XOR(3); +} + +static void fx_xor_r4 (void) +{ + FX_XOR(4); +} + +static void fx_xor_r5 (void) +{ + FX_XOR(5); +} + +static void fx_xor_r6 (void) +{ + FX_XOR(6); +} + +static void fx_xor_r7 (void) +{ + FX_XOR(7); +} + +static void fx_xor_r8 (void) +{ + FX_XOR(8); +} + +static void fx_xor_r9 (void) +{ + FX_XOR(9); +} + +static void fx_xor_r10 (void) +{ + FX_XOR(10); +} + +static void fx_xor_r11 (void) +{ + FX_XOR(11); +} + +static void fx_xor_r12 (void) +{ + FX_XOR(12); +} + +static void fx_xor_r13 (void) +{ + FX_XOR(13); +} + +static void fx_xor_r14 (void) +{ + FX_XOR(14); +} + +static void fx_xor_r15 (void) +{ + FX_XOR(15); +} + +// c1-cf (ALT2) - or #n +#define FX_OR_I(imm) \ + uint32 v = SREG | imm; \ + R15++; \ + DREG = v; \ + GSU.vSign = v; \ + GSU.vZero = v; \ + TESTR14; \ + CLRFLAGS + +static void fx_or_i1 (void) +{ + FX_OR_I(1); +} + +static void fx_or_i2 (void) +{ + FX_OR_I(2); +} + +static void fx_or_i3 (void) +{ + FX_OR_I(3); +} + +static void fx_or_i4 (void) +{ + FX_OR_I(4); +} + +static void fx_or_i5 (void) +{ + FX_OR_I(5); +} + +static void fx_or_i6 (void) +{ + FX_OR_I(6); +} + +static void fx_or_i7 (void) +{ + FX_OR_I(7); +} + +static void fx_or_i8 (void) +{ + FX_OR_I(8); +} + +static void fx_or_i9 (void) +{ + FX_OR_I(9); +} + +static void fx_or_i10 (void) +{ + FX_OR_I(10); +} + +static void fx_or_i11 (void) +{ + FX_OR_I(11); +} + +static void fx_or_i12 (void) +{ + FX_OR_I(12); +} + +static void fx_or_i13 (void) +{ + FX_OR_I(13); +} + +static void fx_or_i14 (void) +{ + FX_OR_I(14); +} + +static void fx_or_i15 (void) +{ + FX_OR_I(15); +} + +// c1-cf (ALT3) - xor #n +#define FX_XOR_I(imm) \ + uint32 v = SREG ^ imm; \ + R15++; \ + DREG = v; \ + GSU.vSign = v; \ + GSU.vZero = v; \ + TESTR14; \ + CLRFLAGS + +static void fx_xor_i1 (void) +{ + FX_XOR_I(1); +} + +static void fx_xor_i2 (void) +{ + FX_XOR_I(2); +} + +static void fx_xor_i3 (void) +{ + FX_XOR_I(3); +} + +static void fx_xor_i4 (void) +{ + FX_XOR_I(4); +} + +static void fx_xor_i5 (void) +{ + FX_XOR_I(5); +} + +static void fx_xor_i6 (void) +{ + FX_XOR_I(6); +} + +static void fx_xor_i7 (void) +{ + FX_XOR_I(7); +} + +static void fx_xor_i8 (void) +{ + FX_XOR_I(8); +} + +static void fx_xor_i9 (void) +{ + FX_XOR_I(9); +} + +static void fx_xor_i10 (void) +{ + FX_XOR_I(10); +} + +static void fx_xor_i11 (void) +{ + FX_XOR_I(11); +} + +static void fx_xor_i12 (void) +{ + FX_XOR_I(12); +} + +static void fx_xor_i13 (void) +{ + FX_XOR_I(13); +} + +static void fx_xor_i14 (void) +{ + FX_XOR_I(14); +} + +static void fx_xor_i15 (void) +{ + FX_XOR_I(15); +} + +// d0-de - inc rn - increase by one +#define FX_INC(reg) \ + GSU.avReg[reg] += 1; \ + GSU.vSign = GSU.avReg[reg]; \ + GSU.vZero = GSU.avReg[reg]; \ + CLRFLAGS; \ + R15++ + +static void fx_inc_r0 (void) +{ + FX_INC(0); +} + +static void fx_inc_r1 (void) +{ + FX_INC(1); +} + +static void fx_inc_r2 (void) +{ + FX_INC(2); +} + +static void fx_inc_r3 (void) +{ + FX_INC(3); +} + +static void fx_inc_r4 (void) +{ + FX_INC(4); +} + +static void fx_inc_r5 (void) +{ + FX_INC(5); +} + +static void fx_inc_r6 (void) +{ + FX_INC(6); +} + +static void fx_inc_r7 (void) +{ + FX_INC(7); +} + +static void fx_inc_r8 (void) +{ + FX_INC(8); +} + +static void fx_inc_r9 (void) +{ + FX_INC(9); +} + +static void fx_inc_r10 (void) +{ + FX_INC(10); +} + +static void fx_inc_r11 (void) +{ + FX_INC(11); +} + +static void fx_inc_r12 (void) +{ + FX_INC(12); +} + +static void fx_inc_r13 (void) +{ + FX_INC(13); +} + +static void fx_inc_r14 (void) +{ + FX_INC(14); + READR14; +} + +// df - getc - transfer ROM buffer to color register +static void fx_getc (void) +{ +#ifndef FX_DO_ROMBUFFER + uint8 c = ROM(R14); +#else + uint8 c = GSU.vRomBuffer; +#endif + + if (GSU.vPlotOptionReg & 0x04) + c = (c & 0xf0) | (c >> 4); + + if (GSU.vPlotOptionReg & 0x08) + { + GSU.vColorReg &= 0xf0; + GSU.vColorReg |= c & 0x0f; + } + else + GSU.vColorReg = USEX8(c); + + CLRFLAGS; + R15++; +} + +// df (ALT2) - ramb - set current RAM bank +static void fx_ramb (void) +{ + GSU.vRamBankReg = SREG & (FX_RAM_BANKS - 1); + GSU.pvRamBank = GSU.apvRamBank[GSU.vRamBankReg & 0x3]; + CLRFLAGS; + R15++; +} + +// df (ALT3) - romb - set current ROM bank +static void fx_romb (void) +{ + GSU.vRomBankReg = USEX8(SREG) & 0x7f; + GSU.pvRomBank = GSU.apvRomBank[GSU.vRomBankReg]; + CLRFLAGS; + R15++; +} + +// e0-ee - dec rn - decrement by one +#define FX_DEC(reg) \ + GSU.avReg[reg] -= 1; \ + GSU.vSign = GSU.avReg[reg]; \ + GSU.vZero = GSU.avReg[reg]; \ + CLRFLAGS; \ + R15++ + +static void fx_dec_r0 (void) +{ + FX_DEC(0); +} + +static void fx_dec_r1 (void) +{ + FX_DEC(1); +} + +static void fx_dec_r2 (void) +{ + FX_DEC(2); +} + +static void fx_dec_r3 (void) +{ + FX_DEC(3); +} + +static void fx_dec_r4 (void) +{ + FX_DEC(4); +} + +static void fx_dec_r5 (void) +{ + FX_DEC(5); +} + +static void fx_dec_r6 (void) +{ + FX_DEC(6); +} + +static void fx_dec_r7 (void) +{ + FX_DEC(7); +} + +static void fx_dec_r8 (void) +{ + FX_DEC(8); +} + +static void fx_dec_r9 (void) +{ + FX_DEC(9); +} + +static void fx_dec_r10 (void) +{ + FX_DEC(10); +} + +static void fx_dec_r11 (void) +{ + FX_DEC(11); +} + +static void fx_dec_r12 (void) +{ + FX_DEC(12); +} + +static void fx_dec_r13 (void) +{ + FX_DEC(13); +} + +static void fx_dec_r14 (void) +{ + FX_DEC(14); + READR14; +} + +// ef - getb - get byte from ROM at address R14 +static void fx_getb (void) +{ + uint32 v; +#ifndef FX_DO_ROMBUFFER + v = (uint32) ROM(R14); +#else + v = (uint32) GSU.vRomBuffer; +#endif + R15++; + DREG = v; + TESTR14; + CLRFLAGS; +} + +// ef (ALT1) - getbh - get high-byte from ROM at address R14 +static void fx_getbh (void) +{ + uint32 v; +#ifndef FX_DO_ROMBUFFER + uint32 c = (uint32) ROM(R14); +#else + uint32 c = USEX8(GSU.vRomBuffer); +#endif + v = USEX8(SREG) | (c << 8); + R15++; + DREG = v; + TESTR14; + CLRFLAGS; +} + +// ef (ALT2) - getbl - get low-byte from ROM at address R14 +static void fx_getbl (void) +{ + uint32 v; +#ifndef FX_DO_ROMBUFFER + uint32 c = (uint32) ROM(R14); +#else + uint32 c = USEX8(GSU.vRomBuffer); +#endif + v = (SREG & 0xff00) | c; + R15++; + DREG = v; + TESTR14; + CLRFLAGS; +} + +// ef (ALT3) - getbs - get sign extended byte from ROM at address R14 +static void fx_getbs (void) +{ + uint32 v; +#ifndef FX_DO_ROMBUFFER + int8 c; + c = ROM(R14); + v = SEX8(c); +#else + v = SEX8(GSU.vRomBuffer); +#endif + R15++; + DREG = v; + TESTR14; + CLRFLAGS; +} + +// f0-ff - iwt rn, #xx - immediate word transfer to register +#define FX_IWT(reg) \ + uint32 v = PIPE; \ + R15++; \ + FETCHPIPE; \ + R15++; \ + v |= USEX8(PIPE) << 8; \ + FETCHPIPE; \ + R15++; \ + GSU.avReg[reg] = v; \ + CLRFLAGS + +static void fx_iwt_r0 (void) +{ + FX_IWT(0); +} + +static void fx_iwt_r1 (void) +{ + FX_IWT(1); +} + +static void fx_iwt_r2 (void) +{ + FX_IWT(2); +} + +static void fx_iwt_r3 (void) +{ + FX_IWT(3); +} + +static void fx_iwt_r4 (void) +{ + FX_IWT(4); +} + +static void fx_iwt_r5 (void) +{ + FX_IWT(5); +} + +static void fx_iwt_r6 (void) +{ + FX_IWT(6); +} + +static void fx_iwt_r7 (void) +{ + FX_IWT(7); +} + +static void fx_iwt_r8 (void) +{ + FX_IWT(8); +} + +static void fx_iwt_r9 (void) +{ + FX_IWT(9); +} + +static void fx_iwt_r10 (void) +{ + FX_IWT(10); +} + +static void fx_iwt_r11 (void) +{ + FX_IWT(11); +} + +static void fx_iwt_r12 (void) +{ + FX_IWT(12); +} + +static void fx_iwt_r13 (void) +{ + FX_IWT(13); +} + +static void fx_iwt_r14 (void) +{ + FX_IWT(14); + READR14; +} + +static void fx_iwt_r15 (void) +{ + FX_IWT(15); +} + +// f0-ff (ALT1) - lm rn, (xx) - load word from RAM +#define FX_LM(reg) \ + GSU.vLastRamAdr = PIPE; \ + R15++; \ + FETCHPIPE; \ + R15++; \ + GSU.vLastRamAdr |= USEX8(PIPE) << 8; \ + FETCHPIPE; \ + R15++; \ + GSU.avReg[reg] = RAM(GSU.vLastRamAdr); \ + GSU.avReg[reg] |= USEX8(RAM(GSU.vLastRamAdr ^ 1)) << 8; \ + CLRFLAGS + +static void fx_lm_r0 (void) +{ + FX_LM(0); +} + +static void fx_lm_r1 (void) +{ + FX_LM(1); +} + +static void fx_lm_r2 (void) +{ + FX_LM(2); +} + +static void fx_lm_r3 (void) +{ + FX_LM(3); +} + +static void fx_lm_r4 (void) +{ + FX_LM(4); +} + +static void fx_lm_r5 (void) +{ + FX_LM(5); +} + +static void fx_lm_r6 (void) +{ + FX_LM(6); +} + +static void fx_lm_r7 (void) +{ + FX_LM(7); +} + +static void fx_lm_r8 (void) +{ + FX_LM(8); +} + +static void fx_lm_r9 (void) +{ + FX_LM(9); +} + +static void fx_lm_r10 (void) +{ + FX_LM(10); +} + +static void fx_lm_r11 (void) +{ + FX_LM(11); +} + +static void fx_lm_r12 (void) +{ + FX_LM(12); +} + +static void fx_lm_r13 (void) +{ + FX_LM(13); +} + +static void fx_lm_r14 (void) +{ + FX_LM(14); + READR14; +} + +static void fx_lm_r15 (void) +{ + FX_LM(15); +} + +// f0-ff (ALT2) - sm (xx), rn - store word in RAM +// XXX: If rn == r15, is the value of r15 before or after the extra bytes are read ? +#define FX_SM(reg) \ + uint32 v = GSU.avReg[reg]; \ + GSU.vLastRamAdr = PIPE; \ + R15++; \ + FETCHPIPE; \ + R15++; \ + GSU.vLastRamAdr |= USEX8(PIPE) << 8; \ + FETCHPIPE; \ + RAM(GSU.vLastRamAdr) = (uint8) v; \ + RAM(GSU.vLastRamAdr ^ 1) = (uint8) (v >> 8); \ + CLRFLAGS; \ + R15++ + +static void fx_sm_r0 (void) +{ + FX_SM(0); +} + +static void fx_sm_r1 (void) +{ + FX_SM(1); +} + +static void fx_sm_r2 (void) +{ + FX_SM(2); +} + +static void fx_sm_r3 (void) +{ + FX_SM(3); +} + +static void fx_sm_r4 (void) +{ + FX_SM(4); +} + +static void fx_sm_r5 (void) +{ + FX_SM(5); +} + +static void fx_sm_r6 (void) +{ + FX_SM(6); +} + +static void fx_sm_r7 (void) +{ + FX_SM(7); +} + +static void fx_sm_r8 (void) +{ + FX_SM(8); +} + +static void fx_sm_r9 (void) +{ + FX_SM(9); +} + +static void fx_sm_r10 (void) +{ + FX_SM(10); +} + +static void fx_sm_r11 (void) +{ + FX_SM(11); +} + +static void fx_sm_r12 (void) +{ + FX_SM(12); +} + +static void fx_sm_r13 (void) +{ + FX_SM(13); +} + +static void fx_sm_r14 (void) +{ + FX_SM(14); +} + +static void fx_sm_r15 (void) +{ + FX_SM(15); +} + +// GSU executions functions + +uint32 fx_run (uint32 nInstructions) +{ + GSU.vCounter = nInstructions; + READR14; + while (TF(G) && (GSU.vCounter-- > 0)) + FX_STEP; +#if 0 +#ifndef FX_ADDRESS_CHECK + GSU.vPipeAdr = USEX16(R15 - 1) | (USEX8(GSU.vPrgBankReg) << 16); +#endif +#endif + + return (nInstructions - GSU.vInstCount); +} + +/* +uint32 fx_run_to_breakpoint (uint32 nInstructions) +{ + uint32 vCounter = 0; + + while (TF(G) && vCounter < nInstructions) + { + vCounter++; + FX_STEP; + + if (USEX16(R15) == GSU.vBreakPoint) + { + GSU.vErrorCode = FX_BREAKPOINT; + break; + } + } + +#if 0 +#ifndef FX_ADDRESS_CHECK + GSU.vPipeAdr = USEX16(R15 - 1) | (USEX8(GSU.vPrgBankReg) << 16); +#endif +#endif + + return (vCounter); +} +*/ + +/* +uint32 fx_step_over (uint32 nInstructions) +{ + uint32 vCounter = 0; + + while (TF(G) && vCounter < nInstructions) + { + vCounter++; + FX_STEP; + + if (USEX16(R15) == GSU.vBreakPoint) + { + GSU.vErrorCode = FX_BREAKPOINT; + break; + } + + if (USEX16(R15) == GSU.vStepPoint) + break; + } + +#if 0 +#ifndef FX_ADDRESS_CHECK + GSU.vPipeAdr = USEX16(R15 - 1) | (USEX8(GSU.vPrgBankReg) << 16); +#endif +#endif + + return (vCounter); +} +*/ + +// Special table for the different plot configurations + +void (*fx_PlotTable[]) (void) = +{ + &fx_plot_2bit, &fx_plot_4bit, &fx_plot_4bit, &fx_plot_8bit, &fx_plot_obj, + &fx_rpix_2bit, &fx_rpix_4bit, &fx_rpix_4bit, &fx_rpix_8bit, &fx_rpix_obj +}; + +// Opcode table + +void (*fx_OpcodeTable[]) (void) = +{ + // ALT0 Table + + // 00 - 0f + &fx_stop, &fx_nop, &fx_cache, &fx_lsr, &fx_rol, &fx_bra, &fx_bge, &fx_blt, + &fx_bne, &fx_beq, &fx_bpl, &fx_bmi, &fx_bcc, &fx_bcs, &fx_bvc, &fx_bvs, + // 10 - 1f + &fx_to_r0, &fx_to_r1, &fx_to_r2, &fx_to_r3, &fx_to_r4, &fx_to_r5, &fx_to_r6, &fx_to_r7, + &fx_to_r8, &fx_to_r9, &fx_to_r10, &fx_to_r11, &fx_to_r12, &fx_to_r13, &fx_to_r14, &fx_to_r15, + // 20 - 2f + &fx_with_r0, &fx_with_r1, &fx_with_r2, &fx_with_r3, &fx_with_r4, &fx_with_r5, &fx_with_r6, &fx_with_r7, + &fx_with_r8, &fx_with_r9, &fx_with_r10, &fx_with_r11, &fx_with_r12, &fx_with_r13, &fx_with_r14, &fx_with_r15, + // 30 - 3f + &fx_stw_r0, &fx_stw_r1, &fx_stw_r2, &fx_stw_r3, &fx_stw_r4, &fx_stw_r5, &fx_stw_r6, &fx_stw_r7, + &fx_stw_r8, &fx_stw_r9, &fx_stw_r10, &fx_stw_r11, &fx_loop, &fx_alt1, &fx_alt2, &fx_alt3, + // 40 - 4f + &fx_ldw_r0, &fx_ldw_r1, &fx_ldw_r2, &fx_ldw_r3, &fx_ldw_r4, &fx_ldw_r5, &fx_ldw_r6, &fx_ldw_r7, + &fx_ldw_r8, &fx_ldw_r9, &fx_ldw_r10, &fx_ldw_r11, &fx_plot_2bit, &fx_swap, &fx_color, &fx_not, + // 50 - 5f + &fx_add_r0, &fx_add_r1, &fx_add_r2, &fx_add_r3, &fx_add_r4, &fx_add_r5, &fx_add_r6, &fx_add_r7, + &fx_add_r8, &fx_add_r9, &fx_add_r10, &fx_add_r11, &fx_add_r12, &fx_add_r13, &fx_add_r14, &fx_add_r15, + // 60 - 6f + &fx_sub_r0, &fx_sub_r1, &fx_sub_r2, &fx_sub_r3, &fx_sub_r4, &fx_sub_r5, &fx_sub_r6, &fx_sub_r7, + &fx_sub_r8, &fx_sub_r9, &fx_sub_r10, &fx_sub_r11, &fx_sub_r12, &fx_sub_r13, &fx_sub_r14, &fx_sub_r15, + // 70 - 7f + &fx_merge, &fx_and_r1, &fx_and_r2, &fx_and_r3, &fx_and_r4, &fx_and_r5, &fx_and_r6, &fx_and_r7, + &fx_and_r8, &fx_and_r9, &fx_and_r10, &fx_and_r11, &fx_and_r12, &fx_and_r13, &fx_and_r14, &fx_and_r15, + // 80 - 8f + &fx_mult_r0, &fx_mult_r1, &fx_mult_r2, &fx_mult_r3, &fx_mult_r4, &fx_mult_r5, &fx_mult_r6, &fx_mult_r7, + &fx_mult_r8, &fx_mult_r9, &fx_mult_r10, &fx_mult_r11, &fx_mult_r12, &fx_mult_r13, &fx_mult_r14, &fx_mult_r15, + // 90 - 9f + &fx_sbk, &fx_link_i1, &fx_link_i2, &fx_link_i3, &fx_link_i4, &fx_sex, &fx_asr, &fx_ror, + &fx_jmp_r8, &fx_jmp_r9, &fx_jmp_r10, &fx_jmp_r11, &fx_jmp_r12, &fx_jmp_r13, &fx_lob, &fx_fmult, + // a0 - af + &fx_ibt_r0, &fx_ibt_r1, &fx_ibt_r2, &fx_ibt_r3, &fx_ibt_r4, &fx_ibt_r5, &fx_ibt_r6, &fx_ibt_r7, + &fx_ibt_r8, &fx_ibt_r9, &fx_ibt_r10, &fx_ibt_r11, &fx_ibt_r12, &fx_ibt_r13, &fx_ibt_r14, &fx_ibt_r15, + // b0 - bf + &fx_from_r0, &fx_from_r1, &fx_from_r2, &fx_from_r3, &fx_from_r4, &fx_from_r5, &fx_from_r6, &fx_from_r7, + &fx_from_r8, &fx_from_r9, &fx_from_r10, &fx_from_r11, &fx_from_r12, &fx_from_r13, &fx_from_r14, &fx_from_r15, + // c0 - cf + &fx_hib, &fx_or_r1, &fx_or_r2, &fx_or_r3, &fx_or_r4, &fx_or_r5, &fx_or_r6, &fx_or_r7, + &fx_or_r8, &fx_or_r9, &fx_or_r10, &fx_or_r11, &fx_or_r12, &fx_or_r13, &fx_or_r14, &fx_or_r15, + // d0 - df + &fx_inc_r0, &fx_inc_r1, &fx_inc_r2, &fx_inc_r3, &fx_inc_r4, &fx_inc_r5, &fx_inc_r6, &fx_inc_r7, + &fx_inc_r8, &fx_inc_r9, &fx_inc_r10, &fx_inc_r11, &fx_inc_r12, &fx_inc_r13, &fx_inc_r14, &fx_getc, + // e0 - ef + &fx_dec_r0, &fx_dec_r1, &fx_dec_r2, &fx_dec_r3, &fx_dec_r4, &fx_dec_r5, &fx_dec_r6, &fx_dec_r7, + &fx_dec_r8, &fx_dec_r9, &fx_dec_r10, &fx_dec_r11, &fx_dec_r12, &fx_dec_r13, &fx_dec_r14, &fx_getb, + // f0 - ff + &fx_iwt_r0, &fx_iwt_r1, &fx_iwt_r2, &fx_iwt_r3, &fx_iwt_r4, &fx_iwt_r5, &fx_iwt_r6, &fx_iwt_r7, + &fx_iwt_r8, &fx_iwt_r9, &fx_iwt_r10, &fx_iwt_r11, &fx_iwt_r12, &fx_iwt_r13, &fx_iwt_r14, &fx_iwt_r15, + + // ALT1 Table + + // 00 - 0f + &fx_stop, &fx_nop, &fx_cache, &fx_lsr, &fx_rol, &fx_bra, &fx_bge, &fx_blt, + &fx_bne, &fx_beq, &fx_bpl, &fx_bmi, &fx_bcc, &fx_bcs, &fx_bvc, &fx_bvs, + // 10 - 1f + &fx_to_r0, &fx_to_r1, &fx_to_r2, &fx_to_r3, &fx_to_r4, &fx_to_r5, &fx_to_r6, &fx_to_r7, + &fx_to_r8, &fx_to_r9, &fx_to_r10, &fx_to_r11, &fx_to_r12, &fx_to_r13, &fx_to_r14, &fx_to_r15, + // 20 - 2f + &fx_with_r0, &fx_with_r1, &fx_with_r2, &fx_with_r3, &fx_with_r4, &fx_with_r5, &fx_with_r6, &fx_with_r7, + &fx_with_r8, &fx_with_r9, &fx_with_r10, &fx_with_r11, &fx_with_r12, &fx_with_r13, &fx_with_r14, &fx_with_r15, + // 30 - 3f + &fx_stb_r0, &fx_stb_r1, &fx_stb_r2, &fx_stb_r3, &fx_stb_r4, &fx_stb_r5, &fx_stb_r6, &fx_stb_r7, + &fx_stb_r8, &fx_stb_r9, &fx_stb_r10, &fx_stb_r11, &fx_loop, &fx_alt1, &fx_alt2, &fx_alt3, + // 40 - 4f + &fx_ldb_r0, &fx_ldb_r1, &fx_ldb_r2, &fx_ldb_r3, &fx_ldb_r4, &fx_ldb_r5, &fx_ldb_r6, &fx_ldb_r7, + &fx_ldb_r8, &fx_ldb_r9, &fx_ldb_r10, &fx_ldb_r11, &fx_rpix_2bit, &fx_swap, &fx_cmode, &fx_not, + // 50 - 5f + &fx_adc_r0, &fx_adc_r1, &fx_adc_r2, &fx_adc_r3, &fx_adc_r4, &fx_adc_r5, &fx_adc_r6, &fx_adc_r7, + &fx_adc_r8, &fx_adc_r9, &fx_adc_r10, &fx_adc_r11, &fx_adc_r12, &fx_adc_r13, &fx_adc_r14, &fx_adc_r15, + // 60 - 6f + &fx_sbc_r0, &fx_sbc_r1, &fx_sbc_r2, &fx_sbc_r3, &fx_sbc_r4, &fx_sbc_r5, &fx_sbc_r6, &fx_sbc_r7, + &fx_sbc_r8, &fx_sbc_r9, &fx_sbc_r10, &fx_sbc_r11, &fx_sbc_r12, &fx_sbc_r13, &fx_sbc_r14, &fx_sbc_r15, + // 70 - 7f + &fx_merge, &fx_bic_r1, &fx_bic_r2, &fx_bic_r3, &fx_bic_r4, &fx_bic_r5, &fx_bic_r6, &fx_bic_r7, + &fx_bic_r8, &fx_bic_r9, &fx_bic_r10, &fx_bic_r11, &fx_bic_r12, &fx_bic_r13, &fx_bic_r14, &fx_bic_r15, + // 80 - 8f + &fx_umult_r0, &fx_umult_r1, &fx_umult_r2, &fx_umult_r3, &fx_umult_r4, &fx_umult_r5, &fx_umult_r6, &fx_umult_r7, + &fx_umult_r8, &fx_umult_r9, &fx_umult_r10, &fx_umult_r11, &fx_umult_r12, &fx_umult_r13, &fx_umult_r14, &fx_umult_r15, + // 90 - 9f + &fx_sbk, &fx_link_i1, &fx_link_i2, &fx_link_i3, &fx_link_i4, &fx_sex, &fx_div2, &fx_ror, + &fx_ljmp_r8, &fx_ljmp_r9, &fx_ljmp_r10, &fx_ljmp_r11, &fx_ljmp_r12, &fx_ljmp_r13, &fx_lob, &fx_lmult, + // a0 - af + &fx_lms_r0, &fx_lms_r1, &fx_lms_r2, &fx_lms_r3, &fx_lms_r4, &fx_lms_r5, &fx_lms_r6, &fx_lms_r7, + &fx_lms_r8, &fx_lms_r9, &fx_lms_r10, &fx_lms_r11, &fx_lms_r12, &fx_lms_r13, &fx_lms_r14, &fx_lms_r15, + // b0 - bf + &fx_from_r0, &fx_from_r1, &fx_from_r2, &fx_from_r3, &fx_from_r4, &fx_from_r5, &fx_from_r6, &fx_from_r7, + &fx_from_r8, &fx_from_r9, &fx_from_r10, &fx_from_r11, &fx_from_r12, &fx_from_r13, &fx_from_r14, &fx_from_r15, + // c0 - cf + &fx_hib, &fx_xor_r1, &fx_xor_r2, &fx_xor_r3, &fx_xor_r4, &fx_xor_r5, &fx_xor_r6, &fx_xor_r7, + &fx_xor_r8, &fx_xor_r9, &fx_xor_r10, &fx_xor_r11, &fx_xor_r12, &fx_xor_r13, &fx_xor_r14, &fx_xor_r15, + // d0 - df + &fx_inc_r0, &fx_inc_r1, &fx_inc_r2, &fx_inc_r3, &fx_inc_r4, &fx_inc_r5, &fx_inc_r6, &fx_inc_r7, + &fx_inc_r8, &fx_inc_r9, &fx_inc_r10, &fx_inc_r11, &fx_inc_r12, &fx_inc_r13, &fx_inc_r14, &fx_getc, + // e0 - ef + &fx_dec_r0, &fx_dec_r1, &fx_dec_r2, &fx_dec_r3, &fx_dec_r4, &fx_dec_r5, &fx_dec_r6, &fx_dec_r7, + &fx_dec_r8, &fx_dec_r9, &fx_dec_r10, &fx_dec_r11, &fx_dec_r12, &fx_dec_r13, &fx_dec_r14, &fx_getbh, + // f0 - ff + &fx_lm_r0, &fx_lm_r1, &fx_lm_r2, &fx_lm_r3, &fx_lm_r4, &fx_lm_r5, &fx_lm_r6, &fx_lm_r7, + &fx_lm_r8, &fx_lm_r9, &fx_lm_r10, &fx_lm_r11, &fx_lm_r12, &fx_lm_r13, &fx_lm_r14, &fx_lm_r15, + + // ALT2 Table + + // 00 - 0f + &fx_stop, &fx_nop, &fx_cache, &fx_lsr, &fx_rol, &fx_bra, &fx_bge, &fx_blt, + &fx_bne, &fx_beq, &fx_bpl, &fx_bmi, &fx_bcc, &fx_bcs, &fx_bvc, &fx_bvs, + // 10 - 1f + &fx_to_r0, &fx_to_r1, &fx_to_r2, &fx_to_r3, &fx_to_r4, &fx_to_r5, &fx_to_r6, &fx_to_r7, + &fx_to_r8, &fx_to_r9, &fx_to_r10, &fx_to_r11, &fx_to_r12, &fx_to_r13, &fx_to_r14, &fx_to_r15, + // 20 - 2f + &fx_with_r0, &fx_with_r1, &fx_with_r2, &fx_with_r3, &fx_with_r4, &fx_with_r5, &fx_with_r6, &fx_with_r7, + &fx_with_r8, &fx_with_r9, &fx_with_r10, &fx_with_r11, &fx_with_r12, &fx_with_r13, &fx_with_r14, &fx_with_r15, + // 30 - 3f + &fx_stw_r0, &fx_stw_r1, &fx_stw_r2, &fx_stw_r3, &fx_stw_r4, &fx_stw_r5, &fx_stw_r6, &fx_stw_r7, + &fx_stw_r8, &fx_stw_r9, &fx_stw_r10, &fx_stw_r11, &fx_loop, &fx_alt1, &fx_alt2, &fx_alt3, + // 40 - 4f + &fx_ldw_r0, &fx_ldw_r1, &fx_ldw_r2, &fx_ldw_r3, &fx_ldw_r4, &fx_ldw_r5, &fx_ldw_r6, &fx_ldw_r7, + &fx_ldw_r8, &fx_ldw_r9, &fx_ldw_r10, &fx_ldw_r11, &fx_plot_2bit, &fx_swap, &fx_color, &fx_not, + // 50 - 5f + &fx_add_i0, &fx_add_i1, &fx_add_i2, &fx_add_i3, &fx_add_i4, &fx_add_i5, &fx_add_i6, &fx_add_i7, + &fx_add_i8, &fx_add_i9, &fx_add_i10, &fx_add_i11, &fx_add_i12, &fx_add_i13, &fx_add_i14, &fx_add_i15, + // 60 - 6f + &fx_sub_i0, &fx_sub_i1, &fx_sub_i2, &fx_sub_i3, &fx_sub_i4, &fx_sub_i5, &fx_sub_i6, &fx_sub_i7, + &fx_sub_i8, &fx_sub_i9, &fx_sub_i10, &fx_sub_i11, &fx_sub_i12, &fx_sub_i13, &fx_sub_i14, &fx_sub_i15, + // 70 - 7f + &fx_merge, &fx_and_i1, &fx_and_i2, &fx_and_i3, &fx_and_i4, &fx_and_i5, &fx_and_i6, &fx_and_i7, + &fx_and_i8, &fx_and_i9, &fx_and_i10, &fx_and_i11, &fx_and_i12, &fx_and_i13, &fx_and_i14, &fx_and_i15, + // 80 - 8f + &fx_mult_i0, &fx_mult_i1, &fx_mult_i2, &fx_mult_i3, &fx_mult_i4, &fx_mult_i5, &fx_mult_i6, &fx_mult_i7, + &fx_mult_i8, &fx_mult_i9, &fx_mult_i10, &fx_mult_i11, &fx_mult_i12, &fx_mult_i13, &fx_mult_i14, &fx_mult_i15, + // 90 - 9f + &fx_sbk, &fx_link_i1, &fx_link_i2, &fx_link_i3, &fx_link_i4, &fx_sex, &fx_asr, &fx_ror, + &fx_jmp_r8, &fx_jmp_r9, &fx_jmp_r10, &fx_jmp_r11, &fx_jmp_r12, &fx_jmp_r13, &fx_lob, &fx_fmult, + // a0 - af + &fx_sms_r0, &fx_sms_r1, &fx_sms_r2, &fx_sms_r3, &fx_sms_r4, &fx_sms_r5, &fx_sms_r6, &fx_sms_r7, + &fx_sms_r8, &fx_sms_r9, &fx_sms_r10, &fx_sms_r11, &fx_sms_r12, &fx_sms_r13, &fx_sms_r14, &fx_sms_r15, + // b0 - bf + &fx_from_r0, &fx_from_r1, &fx_from_r2, &fx_from_r3, &fx_from_r4, &fx_from_r5, &fx_from_r6, &fx_from_r7, + &fx_from_r8, &fx_from_r9, &fx_from_r10, &fx_from_r11, &fx_from_r12, &fx_from_r13, &fx_from_r14, &fx_from_r15, + // c0 - cf + &fx_hib, &fx_or_i1, &fx_or_i2, &fx_or_i3, &fx_or_i4, &fx_or_i5, &fx_or_i6, &fx_or_i7, + &fx_or_i8, &fx_or_i9, &fx_or_i10, &fx_or_i11, &fx_or_i12, &fx_or_i13, &fx_or_i14, &fx_or_i15, + // d0 - df + &fx_inc_r0, &fx_inc_r1, &fx_inc_r2, &fx_inc_r3, &fx_inc_r4, &fx_inc_r5, &fx_inc_r6, &fx_inc_r7, + &fx_inc_r8, &fx_inc_r9, &fx_inc_r10, &fx_inc_r11, &fx_inc_r12, &fx_inc_r13, &fx_inc_r14, &fx_ramb, + // e0 - ef + &fx_dec_r0, &fx_dec_r1, &fx_dec_r2, &fx_dec_r3, &fx_dec_r4, &fx_dec_r5, &fx_dec_r6, &fx_dec_r7, + &fx_dec_r8, &fx_dec_r9, &fx_dec_r10, &fx_dec_r11, &fx_dec_r12, &fx_dec_r13, &fx_dec_r14, &fx_getbl, + // f0 - ff + &fx_sm_r0, &fx_sm_r1, &fx_sm_r2, &fx_sm_r3, &fx_sm_r4, &fx_sm_r5, &fx_sm_r6, &fx_sm_r7, + &fx_sm_r8, &fx_sm_r9, &fx_sm_r10, &fx_sm_r11, &fx_sm_r12, &fx_sm_r13, &fx_sm_r14, &fx_sm_r15, + + // ALT3 Table + + // 00 - 0f + &fx_stop, &fx_nop, &fx_cache, &fx_lsr, &fx_rol, &fx_bra, &fx_bge, &fx_blt, + &fx_bne, &fx_beq, &fx_bpl, &fx_bmi, &fx_bcc, &fx_bcs, &fx_bvc, &fx_bvs, + // 10 - 1f + &fx_to_r0, &fx_to_r1, &fx_to_r2, &fx_to_r3, &fx_to_r4, &fx_to_r5, &fx_to_r6, &fx_to_r7, + &fx_to_r8, &fx_to_r9, &fx_to_r10, &fx_to_r11, &fx_to_r12, &fx_to_r13, &fx_to_r14, &fx_to_r15, + // 20 - 2f + &fx_with_r0, &fx_with_r1, &fx_with_r2, &fx_with_r3, &fx_with_r4, &fx_with_r5, &fx_with_r6, &fx_with_r7, + &fx_with_r8, &fx_with_r9, &fx_with_r10, &fx_with_r11, &fx_with_r12, &fx_with_r13, &fx_with_r14, &fx_with_r15, + // 30 - 3f + &fx_stb_r0, &fx_stb_r1, &fx_stb_r2, &fx_stb_r3, &fx_stb_r4, &fx_stb_r5, &fx_stb_r6, &fx_stb_r7, + &fx_stb_r8, &fx_stb_r9, &fx_stb_r10, &fx_stb_r11, &fx_loop, &fx_alt1, &fx_alt2, &fx_alt3, + // 40 - 4f + &fx_ldb_r0, &fx_ldb_r1, &fx_ldb_r2, &fx_ldb_r3, &fx_ldb_r4, &fx_ldb_r5, &fx_ldb_r6, &fx_ldb_r7, + &fx_ldb_r8, &fx_ldb_r9, &fx_ldb_r10, &fx_ldb_r11, &fx_rpix_2bit, &fx_swap, &fx_cmode, &fx_not, + // 50 - 5f + &fx_adc_i0, &fx_adc_i1, &fx_adc_i2, &fx_adc_i3, &fx_adc_i4, &fx_adc_i5, &fx_adc_i6, &fx_adc_i7, + &fx_adc_i8, &fx_adc_i9, &fx_adc_i10, &fx_adc_i11, &fx_adc_i12, &fx_adc_i13, &fx_adc_i14, &fx_adc_i15, + // 60 - 6f + &fx_cmp_r0, &fx_cmp_r1, &fx_cmp_r2, &fx_cmp_r3, &fx_cmp_r4, &fx_cmp_r5, &fx_cmp_r6, &fx_cmp_r7, + &fx_cmp_r8, &fx_cmp_r9, &fx_cmp_r10, &fx_cmp_r11, &fx_cmp_r12, &fx_cmp_r13, &fx_cmp_r14, &fx_cmp_r15, + // 70 - 7f + &fx_merge, &fx_bic_i1, &fx_bic_i2, &fx_bic_i3, &fx_bic_i4, &fx_bic_i5, &fx_bic_i6, &fx_bic_i7, + &fx_bic_i8, &fx_bic_i9, &fx_bic_i10, &fx_bic_i11, &fx_bic_i12, &fx_bic_i13, &fx_bic_i14, &fx_bic_i15, + // 80 - 8f + &fx_umult_i0, &fx_umult_i1, &fx_umult_i2, &fx_umult_i3, &fx_umult_i4, &fx_umult_i5, &fx_umult_i6, &fx_umult_i7, + &fx_umult_i8, &fx_umult_i9, &fx_umult_i10, &fx_umult_i11, &fx_umult_i12, &fx_umult_i13, &fx_umult_i14, &fx_umult_i15, + // 90 - 9f + &fx_sbk, &fx_link_i1, &fx_link_i2, &fx_link_i3, &fx_link_i4, &fx_sex, &fx_div2, &fx_ror, + &fx_ljmp_r8, &fx_ljmp_r9, &fx_ljmp_r10, &fx_ljmp_r11, &fx_ljmp_r12, &fx_ljmp_r13, &fx_lob, &fx_lmult, + // a0 - af + &fx_lms_r0, &fx_lms_r1, &fx_lms_r2, &fx_lms_r3, &fx_lms_r4, &fx_lms_r5, &fx_lms_r6, &fx_lms_r7, + &fx_lms_r8, &fx_lms_r9, &fx_lms_r10, &fx_lms_r11, &fx_lms_r12, &fx_lms_r13, &fx_lms_r14, &fx_lms_r15, + // b0 - bf + &fx_from_r0, &fx_from_r1, &fx_from_r2, &fx_from_r3, &fx_from_r4, &fx_from_r5, &fx_from_r6, &fx_from_r7, + &fx_from_r8, &fx_from_r9, &fx_from_r10, &fx_from_r11, &fx_from_r12, &fx_from_r13, &fx_from_r14, &fx_from_r15, + // c0 - cf + &fx_hib, &fx_xor_i1, &fx_xor_i2, &fx_xor_i3, &fx_xor_i4, &fx_xor_i5, &fx_xor_i6, &fx_xor_i7, + &fx_xor_i8, &fx_xor_i9, &fx_xor_i10, &fx_xor_i11, &fx_xor_i12, &fx_xor_i13, &fx_xor_i14, &fx_xor_i15, + // d0 - df + &fx_inc_r0, &fx_inc_r1, &fx_inc_r2, &fx_inc_r3, &fx_inc_r4, &fx_inc_r5, &fx_inc_r6, &fx_inc_r7, + &fx_inc_r8, &fx_inc_r9, &fx_inc_r10, &fx_inc_r11, &fx_inc_r12, &fx_inc_r13, &fx_inc_r14, &fx_romb, + // e0 - ef + &fx_dec_r0, &fx_dec_r1, &fx_dec_r2, &fx_dec_r3, &fx_dec_r4, &fx_dec_r5, &fx_dec_r6, &fx_dec_r7, + &fx_dec_r8, &fx_dec_r9, &fx_dec_r10, &fx_dec_r11, &fx_dec_r12, &fx_dec_r13, &fx_dec_r14, &fx_getbs, + // f0 - ff + &fx_lm_r0, &fx_lm_r1, &fx_lm_r2, &fx_lm_r3, &fx_lm_r4, &fx_lm_r5, &fx_lm_r6, &fx_lm_r7, + &fx_lm_r8, &fx_lm_r9, &fx_lm_r10, &fx_lm_r11, &fx_lm_r12, &fx_lm_r13, &fx_lm_r14, &fx_lm_r15 +}; diff --git a/plugins/snes9x_gx/source/snes9x/fxinst.h b/plugins/snes9x_gx/source/snes9x/fxinst.h new file mode 100644 index 00000000..dd3736ec --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/fxinst.h @@ -0,0 +1,542 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _FXINST_H_ +#define _FXINST_H_ + +/* + * FxChip(GSU) register space specification + * (Register address space 3000-32ff) + * + * The 16 generic 16 bit registers: + * (Some have a special function in special circumstances) + * 3000 - R0 default source/destination register + * 3002 - R1 pixel plot X position register + * 3004 - R2 pixel plot Y position register + * 3006 - R3 + * 3008 - R4 lower 16 bit result of lmult + * 300a - R5 + * 300c - R6 multiplier for fmult and lmult + * 300e - R7 fixed point texel X position for merge + * 3010 - R8 fixed point texel Y position for merge + * 3012 - R9 + * 3014 - R10 + * 3016 - R11 return address set by link + * 3018 - R12 loop counter + * 301a - R13 loop point address + * 301c - R14 rom address for getb, getbh, getbl, getbs + * 301e - R15 program counter + * + * 3020-302f - unused + * + * Other internal registers + * 3030 - SFR status flag register (16bit) + * 3032 - unused + * 3033 - BRAMR Backup RAM register (8bit) + * 3034 - PBR program bank register (8bit) + * 3035 - unused + * 3036 - ROMBR rom bank register (8bit) + * 3037 - CFGR control flags register (8bit) + * 3038 - SCBR screen base register (8bit) + * 3039 - CLSR clock speed register (8bit) + * 303a - SCMR screen mode register (8bit) + * 303b - VCR version code register (8bit) (read only) + * 303c - RAMBR ram bank register (8bit) + * 303d - unused + * 303e - CBR cache base register (16bit) + * + * 3040-30ff - unused + * + * 3100-32ff - CACHERAM 512 bytes of GSU cache memory + * + * SFR status flag register bits: + * 0 - + * 1 Z Zero flag + * 2 CY Carry flag + * 3 S Sign flag + * 4 OV Overflow flag + * 5 G Go flag (set to 1 when the GSU is running) + * 6 R Set to 1 when reading ROM using R14 address + * 7 - + * 8 ALT1 Mode set-up flag for the next instruction + * 9 ALT2 Mode set-up flag for the next instruction + * 10 IL Immediate lower 8-bit flag + * 11 IH Immediate higher 8-bit flag + * 12 B Set to 1 when the WITH instruction is executed + * 13 - + * 14 - + * 15 IRQ Set to 1 when GSU caused an interrupt + * Set to 0 when read by 658c16 + * + * BRAMR = 0, BackupRAM is disabled + * BRAMR = 1, BackupRAM is enabled + * + * CFGR control flags register bits: + * 0 - + * 1 - + * 2 - + * 3 - + * 4 - + * 5 MS0 Multiplier speed, 0=standard, 1=high speed + * 6 - + * 7 IRQ Set to 1 when GSU interrupt request is masked + * + * CLSR clock speed register bits: + * 0 CLSR clock speed, 0 = 10.7Mhz, 1 = 21.4Mhz + * + * SCMR screen mode register bits: + * 0 MD0 color depth mode bit 0 + * 1 MD1 color depth mode bit 1 + * 2 HT0 screen height bit 1 + * 3 RAN RAM access control + * 4 RON ROM access control + * 5 HT1 screen height bit 2 + * 6 - + * 7 - + * + * RON = 0 SNES CPU has ROM access + * RON = 1 GSU has ROM access + * + * RAN = 0 SNES has game pak RAM access + * RAN = 1 GSU has game pak RAM access + * + * HT1 HT0 Screen height mode + * 0 0 128 pixels high + * 0 1 160 pixels high + * 1 0 192 pixels high + * 1 1 OBJ mode + * + * MD1 MD0 Color depth mode + * 0 0 4 color mode + * 0 1 16 color mode + * 1 0 not used + * 1 1 256 color mode + * + * CBR cache base register bits: + * 15-4 Specify base address for data to cache from ROM or RAM + * 3-0 Are 0 when address is read + * + * Write access to the program counter (301e) from + * the SNES-CPU will start the GSU, and it will not + * stop until it reaches a stop instruction. + * + */ + +// Number of banks in GSU RAM +#define FX_RAM_BANKS 4 + +// Emulate proper R14 ROM access (slower, but safer) +#define FX_DO_ROMBUFFER + +// Address checking (definately slow) +//#define FX_ADDRESS_CHECK + +struct FxRegs_s +{ + // FxChip registers + uint32 avReg[16]; // 16 Generic registers + uint32 vColorReg; // Internal color register + uint32 vPlotOptionReg; // Plot option register + uint32 vStatusReg; // Status register + uint32 vPrgBankReg; // Program bank index register + uint32 vRomBankReg; // Rom bank index register + uint32 vRamBankReg; // Ram bank index register + uint32 vCacheBaseReg; // Cache base address register + uint32 vCacheFlags; // Saying what parts of the cache was written to + uint32 vLastRamAdr; // Last RAM address accessed + uint32 *pvDreg; // Pointer to current destination register + uint32 *pvSreg; // Pointer to current source register + uint8 vRomBuffer; // Current byte read by R14 + uint8 vPipe; // Instructionset pipe + uint32 vPipeAdr; // The address of where the pipe was read from + + // Status register optimization stuff + uint32 vSign; // v & 0x8000 + uint32 vZero; // v == 0 + uint32 vCarry; // a value of 1 or 0 + int32 vOverflow; // (v >= 0x8000 || v < -0x8000) + + // Other emulator variables + int32 vErrorCode; + uint32 vIllegalAddress; + + uint8 bBreakPoint; + uint32 vBreakPoint; + uint32 vStepPoint; + + uint8 *pvRegisters; // 768 bytes located in the memory at address 0x3000 + uint32 nRamBanks; // Number of 64kb-banks in FxRam (Don't confuse it with SNES-Ram!!!) + uint8 *pvRam; // Pointer to FxRam + uint32 nRomBanks; // Number of 32kb-banks in Cart-ROM + uint8 *pvRom; // Pointer to Cart-ROM + + uint32 vMode; // Color depth/mode + uint32 vPrevMode; // Previous depth + uint8 *pvScreenBase; + uint8 *apvScreen[32]; // Pointer to each of the 32 screen colums + int32 x[32]; + uint32 vScreenHeight; // 128, 160, 192 or 256 (could be overriden by cmode) + uint32 vScreenRealHeight; // 128, 160, 192 or 256 + uint32 vPrevScreenHeight; + uint32 vScreenSize; + void (*pfPlot) (void); + void (*pfRpix) (void); + + uint8 *pvRamBank; // Pointer to current RAM-bank + uint8 *pvRomBank; // Pointer to current ROM-bank + uint8 *pvPrgBank; // Pointer to current program ROM-bank + + uint8 *apvRamBank[FX_RAM_BANKS]; // Ram bank table (max 256kb) + uint8 *apvRomBank[256]; // Rom bank table + + uint8 bCacheActive; + uint8 *pvCache; // Pointer to the GSU cache + uint8 avCacheBackup[512]; // Backup of ROM when the cache has replaced it + uint32 vCounter; + uint32 vInstCount; + uint32 vSCBRDirty; // If SCBR is written, our cached screen pointers need updating + + uint8 *avRegAddr; // To reference avReg in snapshot.cpp +}; + +extern struct FxRegs_s GSU; + +// GSU registers +#define GSU_R0 0x000 +#define GSU_R1 0x002 +#define GSU_R2 0x004 +#define GSU_R3 0x006 +#define GSU_R4 0x008 +#define GSU_R5 0x00a +#define GSU_R6 0x00c +#define GSU_R7 0x00e +#define GSU_R8 0x010 +#define GSU_R9 0x012 +#define GSU_R10 0x014 +#define GSU_R11 0x016 +#define GSU_R12 0x018 +#define GSU_R13 0x01a +#define GSU_R14 0x01c +#define GSU_R15 0x01e +#define GSU_SFR 0x030 +#define GSU_BRAMR 0x033 +#define GSU_PBR 0x034 +#define GSU_ROMBR 0x036 +#define GSU_CFGR 0x037 +#define GSU_SCBR 0x038 +#define GSU_CLSR 0x039 +#define GSU_SCMR 0x03a +#define GSU_VCR 0x03b +#define GSU_RAMBR 0x03c +#define GSU_CBR 0x03e +#define GSU_CACHERAM 0x100 + +// SFR flags +#define FLG_Z (1 << 1) +#define FLG_CY (1 << 2) +#define FLG_S (1 << 3) +#define FLG_OV (1 << 4) +#define FLG_G (1 << 5) +#define FLG_R (1 << 6) +#define FLG_ALT1 (1 << 8) +#define FLG_ALT2 (1 << 9) +#define FLG_IL (1 << 10) +#define FLG_IH (1 << 11) +#define FLG_B (1 << 12) +#define FLG_IRQ (1 << 15) + +// Test flag +#define TF(a) (GSU.vStatusReg & FLG_##a) +#define CF(a) (GSU.vStatusReg &= ~FLG_##a) +#define SF(a) (GSU.vStatusReg |= FLG_##a) + +// Test and set flag if condition, clear if not +#define TS(a, b) GSU.vStatusReg = ((GSU.vStatusReg & (~FLG_##a)) | ((!!(##b)) * FLG_##a)) + +// Testing ALT1 & ALT2 bits +#define ALT0 (!TF(ALT1) && !TF(ALT2)) +#define ALT1 ( TF(ALT1) && !TF(ALT2)) +#define ALT2 (!TF(ALT1) && TF(ALT2)) +#define ALT3 ( TF(ALT1) && TF(ALT2)) + +// Sign extend from 8/16 bit to 32 bit +#define SEX8(a) ((int32) ((int8) (a))) +#define SEX16(a) ((int32) ((int16) (a))) + +// Unsign extend from 8/16 bit to 32 bit +#define USEX8(a) ((uint32) ((uint8) (a))) +#define USEX16(a) ((uint32) ((uint16) (a))) +#define SUSEX16(a) ((int32) ((uint16) (a))) + +// Set/Clr Sign and Zero flag +#define TSZ(num) TS(S, ((num) & 0x8000)); TS(Z, (!USEX16(num))) + +// Clear flags +#define CLRFLAGS GSU.vStatusReg &= ~(FLG_ALT1 | FLG_ALT2 | FLG_B); GSU.pvDreg = GSU.pvSreg = &R0 + +// Read current RAM-Bank +#define RAM(adr) GSU.pvRamBank[USEX16(adr)] + +// Read current ROM-Bank +#define ROM(idx) GSU.pvRomBank[USEX16(idx)] + +// Access the current value in the pipe +#define PIPE GSU.vPipe + +// Access data in the current program bank +#define PRGBANK(idx) GSU.pvPrgBank[USEX16(idx)] + +// Update pipe from ROM +#if 0 +#define FETCHPIPE { PIPE = PRGBANK(R15); GSU.vPipeAdr = (GSU.vPrgBankReg << 16) + R15; } +#else +#define FETCHPIPE { PIPE = PRGBANK(R15); } +#endif + +// ABS +#define ABS(x) ((x) < 0 ? -(x) : (x)) + +// Access source register +#define SREG (*GSU.pvSreg) + +// Access destination register +#define DREG (*GSU.pvDreg) + +#ifndef FX_DO_ROMBUFFER + +// Don't read R14 +#define READR14 + +// Don't test and/or read R14 +#define TESTR14 + +#else + +// Read R14 +#define READR14 GSU.vRomBuffer = ROM(R14) + +// Test and/or read R14 +#define TESTR14 if (GSU.pvDreg == &R14) READR14 + +#endif + +// Access to registers +#define R0 GSU.avReg[0] +#define R1 GSU.avReg[1] +#define R2 GSU.avReg[2] +#define R3 GSU.avReg[3] +#define R4 GSU.avReg[4] +#define R5 GSU.avReg[5] +#define R6 GSU.avReg[6] +#define R7 GSU.avReg[7] +#define R8 GSU.avReg[8] +#define R9 GSU.avReg[9] +#define R10 GSU.avReg[10] +#define R11 GSU.avReg[11] +#define R12 GSU.avReg[12] +#define R13 GSU.avReg[13] +#define R14 GSU.avReg[14] +#define R15 GSU.avReg[15] +#define SFR GSU.vStatusReg +#define PBR GSU.vPrgBankReg +#define ROMBR GSU.vRomBankReg +#define RAMBR GSU.vRamBankReg +#define CBR GSU.vCacheBaseReg +#define SCBR USEX8(GSU.pvRegisters[GSU_SCBR]) +#define SCMR USEX8(GSU.pvRegisters[GSU_SCMR]) +#define COLR GSU.vColorReg +#define POR GSU.vPlotOptionReg +#define BRAMR USEX8(GSU.pvRegisters[GSU_BRAMR]) +#define VCR USEX8(GSU.pvRegisters[GSU_VCR]) +#define CFGR USEX8(GSU.pvRegisters[GSU_CFGR]) +#define CLSR USEX8(GSU.pvRegisters[GSU_CLSR]) + +// Execute instruction from the pipe, and fetch next byte to the pipe +#define FX_STEP \ +{ \ + uint32 vOpcode = (uint32) PIPE; \ + FETCHPIPE; \ + (*fx_OpcodeTable[(GSU.vStatusReg & 0x300) | vOpcode])(); \ +} + +extern void (*fx_PlotTable[]) (void); +extern void (*fx_OpcodeTable[]) (void); + +// Set this define if branches are relative to the instruction in the delay slot (I think they are) +#define BRANCH_DELAY_RELATIVE + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/getset.h b/plugins/snes9x_gx/source/snes9x/getset.h new file mode 100644 index 00000000..bf5557b4 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/getset.h @@ -0,0 +1,1089 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _GETSET_H_ +#define _GETSET_H_ + +#include "cpuexec.h" +#include "dsp.h" +#include "sa1.h" +#include "spc7110.h" +#include "c4.h" +#include "obc1.h" +#include "seta.h" +#include "bsx.h" + +#if (S9X_ACCURACY_LEVEL >= 2) + +#define addCyclesInMemoryAccess \ + if (!CPU.InDMAorHDMA) \ + { \ + CPU.Cycles += speed; \ + while (CPU.Cycles >= CPU.NextEvent) \ + S9xDoHEventProcessing(); \ + } + +#define addCyclesInMemoryAccess_x2 \ + if (!CPU.InDMAorHDMA) \ + { \ + CPU.Cycles += speed << 1; \ + while (CPU.Cycles >= CPU.NextEvent) \ + S9xDoHEventProcessing(); \ + } + +#else + +#define addCyclesInMemoryAccess \ + if (!CPU.InDMAorHDMA) \ + CPU.Cycles += speed; + +#define addCyclesInMemoryAccess_x2 \ + if (!CPU.InDMAorHDMA) \ + CPU.Cycles += speed << 1; + +#endif + +extern uint8 OpenBus; + +static inline int32 memory_speed (uint32 address) +{ + if (address & 0x408000) + { + if (address & 0x800000) + return (CPU.FastROMSpeed); + + return (SLOW_ONE_CYCLE); + } + + if ((address + 0x6000) & 0x4000) + return (SLOW_ONE_CYCLE); + + if ((address - 0x4000) & 0x7e00) + return (ONE_CYCLE); + + return (TWO_CYCLES); +} + +inline uint8 S9xGetByte (uint32 Address) +{ + int block = (Address & 0xffffff) >> MEMMAP_SHIFT; + uint8 *GetAddress = Memory.Map[block]; + int32 speed = memory_speed(Address); + uint8 byte; + + if (GetAddress >= (uint8 *) CMemory::MAP_LAST) + { + #ifdef CPU_SHUTDOWN + if (Memory.BlockIsRAM[block]) + CPU.WaitAddress = CPU.PBPCAtOpcodeStart; + #endif + byte = *(GetAddress + (Address & 0xffff)); + addCyclesInMemoryAccess; + return (byte); + } + + switch ((pint) GetAddress) + { + case CMemory::MAP_CPU: + byte = S9xGetCPU(Address & 0xffff); + addCyclesInMemoryAccess; + return (byte); + + case CMemory::MAP_PPU: + if (CPU.InDMAorHDMA && (Address & 0xff00) == 0x2100) + return (OpenBus); + + byte = S9xGetPPU(Address & 0xffff); + addCyclesInMemoryAccess; + return (byte); + + case CMemory::MAP_LOROM_SRAM: + case CMemory::MAP_SA1RAM: + // Address & 0x7fff : offset into bank + // Address & 0xff0000 : bank + // bank >> 1 | offset : SRAM address, unbound + // unbound & SRAMMask : SRAM offset + byte = *(Memory.SRAM + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Memory.SRAMMask)); + addCyclesInMemoryAccess; + return (byte); + + case CMemory::MAP_LOROM_SRAM_B: + byte = *(Multi.sramB + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Multi.sramMaskB)); + addCyclesInMemoryAccess; + return (byte); + + case CMemory::MAP_HIROM_SRAM: + case CMemory::MAP_RONLY_SRAM: + byte = *(Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask)); + addCyclesInMemoryAccess; + return (byte); + + case CMemory::MAP_BWRAM: + byte = *(Memory.BWRAM + ((Address & 0x7fff) - 0x6000)); + addCyclesInMemoryAccess; + return (byte); + + case CMemory::MAP_DSP: + byte = S9xGetDSP(Address & 0xffff); + addCyclesInMemoryAccess; + return (byte); + + case CMemory::MAP_SPC7110_ROM: + byte = S9xGetSPC7110Byte(Address); + addCyclesInMemoryAccess; + return (byte); + + case CMemory::MAP_SPC7110_DRAM: + byte = S9xGetSPC7110(0x4800); + addCyclesInMemoryAccess; + return (byte); + + case CMemory::MAP_C4: + byte = S9xGetC4(Address & 0xffff); + addCyclesInMemoryAccess; + return (byte); + + case CMemory::MAP_OBC_RAM: + byte = S9xGetOBC1(Address & 0xffff); + addCyclesInMemoryAccess; + return (byte); + + case CMemory::MAP_SETA_DSP: + byte = S9xGetSetaDSP(Address); + addCyclesInMemoryAccess; + return (byte); + + case CMemory::MAP_SETA_RISC: + byte = S9xGetST018(Address); + addCyclesInMemoryAccess; + return (byte); + + case CMemory::MAP_BSX: + byte = S9xGetBSX(Address); + addCyclesInMemoryAccess; + return (byte); + + case CMemory::MAP_NONE: + default: + byte = OpenBus; + addCyclesInMemoryAccess; + return (byte); + } +} + +inline uint16 S9xGetWord (uint32 Address, enum s9xwrap_t w = WRAP_NONE) +{ + uint32 mask = MEMMAP_MASK & (w == WRAP_PAGE ? 0xff : (w == WRAP_BANK ? 0xffff : 0xffffff)); + if ((Address & mask) == mask) + { + PC_t a; + + OpenBus = S9xGetByte(Address); + + switch (w) + { + case WRAP_PAGE: + a.xPBPC = Address; + a.B.xPCl++; + return (OpenBus | (S9xGetByte(a.xPBPC) << 8)); + + case WRAP_BANK: + a.xPBPC = Address; + a.W.xPC++; + return (OpenBus | (S9xGetByte(a.xPBPC) << 8)); + + case WRAP_NONE: + default: + return (OpenBus | (S9xGetByte(Address + 1) << 8)); + } + } + + int block = (Address & 0xffffff) >> MEMMAP_SHIFT; + uint8 *GetAddress = Memory.Map[block]; + int32 speed = memory_speed(Address); + uint16 word; + + if (GetAddress >= (uint8 *) CMemory::MAP_LAST) + { + #ifdef CPU_SHUTDOWN + if (Memory.BlockIsRAM[block]) + CPU.WaitAddress = CPU.PBPCAtOpcodeStart; + #endif + word = READ_WORD(GetAddress + (Address & 0xffff)); + addCyclesInMemoryAccess_x2; + return (word); + } + + switch ((pint) GetAddress) + { + case CMemory::MAP_CPU: + word = S9xGetCPU(Address & 0xffff); + addCyclesInMemoryAccess; + word |= S9xGetCPU((Address + 1) & 0xffff) << 8; + addCyclesInMemoryAccess; + return (word); + + case CMemory::MAP_PPU: + if (CPU.InDMAorHDMA) + { + OpenBus = S9xGetByte(Address); + return (OpenBus | (S9xGetByte(Address + 1) << 8)); + } + + word = S9xGetPPU(Address & 0xffff); + addCyclesInMemoryAccess; + word |= S9xGetPPU((Address + 1) & 0xffff) << 8; + addCyclesInMemoryAccess; + return (word); + + case CMemory::MAP_LOROM_SRAM: + case CMemory::MAP_SA1RAM: + if (Memory.SRAMMask >= MEMMAP_MASK) + word = READ_WORD(Memory.SRAM + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Memory.SRAMMask)); + else + word = (*(Memory.SRAM + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Memory.SRAMMask))) | + ((*(Memory.SRAM + (((((Address + 1) & 0xff0000) >> 1) | ((Address + 1) & 0x7fff)) & Memory.SRAMMask))) << 8); + addCyclesInMemoryAccess_x2; + return (word); + + case CMemory::MAP_LOROM_SRAM_B: + if (Multi.sramMaskB >= MEMMAP_MASK) + word = READ_WORD(Multi.sramB + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Multi.sramMaskB)); + else + word = (*(Multi.sramB + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Multi.sramMaskB))) | + ((*(Multi.sramB + (((((Address + 1) & 0xff0000) >> 1) | ((Address + 1) & 0x7fff)) & Multi.sramMaskB))) << 8); + addCyclesInMemoryAccess_x2; + return (word); + + case CMemory::MAP_HIROM_SRAM: + case CMemory::MAP_RONLY_SRAM: + if (Memory.SRAMMask >= MEMMAP_MASK) + word = READ_WORD(Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask)); + else + word = (*(Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask)) | + (*(Memory.SRAM + ((((Address + 1) & 0x7fff) - 0x6000 + (((Address + 1) & 0xf0000) >> 3)) & Memory.SRAMMask)) << 8)); + addCyclesInMemoryAccess_x2; + return (word); + + case CMemory::MAP_BWRAM: + word = READ_WORD(Memory.BWRAM + ((Address & 0x7fff) - 0x6000)); + addCyclesInMemoryAccess_x2; + return (word); + + case CMemory::MAP_DSP: + word = S9xGetDSP(Address & 0xffff); + addCyclesInMemoryAccess; + word |= S9xGetDSP((Address + 1) & 0xffff) << 8; + addCyclesInMemoryAccess; + return (word); + + case CMemory::MAP_SPC7110_ROM: + word = S9xGetSPC7110Byte(Address); + addCyclesInMemoryAccess; + word |= S9xGetSPC7110Byte(Address + 1) << 8; + addCyclesInMemoryAccess; + return (word); + + case CMemory::MAP_SPC7110_DRAM: + word = S9xGetSPC7110(0x4800); + addCyclesInMemoryAccess; + word |= S9xGetSPC7110(0x4800) << 8; + addCyclesInMemoryAccess; + return (word); + + case CMemory::MAP_C4: + word = S9xGetC4(Address & 0xffff); + addCyclesInMemoryAccess; + word |= S9xGetC4((Address + 1) & 0xffff) << 8; + addCyclesInMemoryAccess; + return (word); + + case CMemory::MAP_OBC_RAM: + word = S9xGetOBC1(Address & 0xffff); + addCyclesInMemoryAccess; + word |= S9xGetOBC1((Address + 1) & 0xffff) << 8; + addCyclesInMemoryAccess; + return (word); + + case CMemory::MAP_SETA_DSP: + word = S9xGetSetaDSP(Address); + addCyclesInMemoryAccess; + word |= S9xGetSetaDSP(Address + 1) << 8; + addCyclesInMemoryAccess; + return (word); + + case CMemory::MAP_SETA_RISC: + word = S9xGetST018(Address); + addCyclesInMemoryAccess; + word |= S9xGetST018(Address + 1) << 8; + addCyclesInMemoryAccess; + return (word); + + case CMemory::MAP_BSX: + word = S9xGetBSX(Address); + addCyclesInMemoryAccess; + word |= S9xGetBSX(Address + 1) << 8; + addCyclesInMemoryAccess; + return (word); + + case CMemory::MAP_NONE: + default: + word = OpenBus | (OpenBus << 8); + addCyclesInMemoryAccess_x2; + return (word); + } +} + +inline void S9xSetByte (uint8 Byte, uint32 Address) +{ +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = 0xffffffff; +#endif + + int block = (Address & 0xffffff) >> MEMMAP_SHIFT; + uint8 *SetAddress = Memory.WriteMap[block]; + int32 speed = memory_speed(Address); + + if (SetAddress >= (uint8 *) CMemory::MAP_LAST) + { + #ifdef CPU_SHUTDOWN + SetAddress += (Address & 0xffff); + *SetAddress = Byte; + addCyclesInMemoryAccess; + + if (Settings.SA1) + { + if (SetAddress == SA1.WaitByteAddress1 || SetAddress == SA1.WaitByteAddress2) + { + SA1.Executing = SA1.S9xOpcodes != NULL; + SA1.WaitCounter = 0; + } + } + #else + *(SetAddress + (Address & 0xffff)) = Byte; + addCyclesInMemoryAccess; + #endif + return; + } + + switch ((pint) SetAddress) + { + case CMemory::MAP_CPU: + S9xSetCPU(Byte, Address & 0xffff); + addCyclesInMemoryAccess; + return; + + case CMemory::MAP_PPU: + if (CPU.InDMAorHDMA && (Address & 0xff00) == 0x2100) + return; + + S9xSetPPU(Byte, Address & 0xffff); + addCyclesInMemoryAccess; + return; + + case CMemory::MAP_LOROM_SRAM: + if (Memory.SRAMMask) + { + *(Memory.SRAM + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Memory.SRAMMask)) = Byte; + CPU.SRAMModified = TRUE; + } + + addCyclesInMemoryAccess; + return; + + case CMemory::MAP_LOROM_SRAM_B: + if (Multi.sramMaskB) + { + *(Multi.sramB + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Multi.sramMaskB)) = Byte; + CPU.SRAMModified = TRUE; + } + + addCyclesInMemoryAccess; + return; + + case CMemory::MAP_HIROM_SRAM: + if (Memory.SRAMMask) + { + *(Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask)) = Byte; + CPU.SRAMModified = TRUE; + } + + addCyclesInMemoryAccess; + return; + + case CMemory::MAP_BWRAM: + *(Memory.BWRAM + ((Address & 0x7fff) - 0x6000)) = Byte; + CPU.SRAMModified = TRUE; + addCyclesInMemoryAccess; + return; + + case CMemory::MAP_SA1RAM: + *(Memory.SRAM + (Address & 0xffff)) = Byte; + SA1.Executing = !SA1.Waiting; + addCyclesInMemoryAccess; + return; + + case CMemory::MAP_DSP: + S9xSetDSP(Byte, Address & 0xffff); + addCyclesInMemoryAccess; + return; + + case CMemory::MAP_C4: + S9xSetC4(Byte, Address & 0xffff); + addCyclesInMemoryAccess; + return; + + case CMemory::MAP_OBC_RAM: + S9xSetOBC1(Byte, Address & 0xffff); + addCyclesInMemoryAccess; + return; + + case CMemory::MAP_SETA_DSP: + S9xSetSetaDSP(Byte, Address); + addCyclesInMemoryAccess; + return; + + case CMemory::MAP_SETA_RISC: + S9xSetST018(Byte, Address); + addCyclesInMemoryAccess; + return; + + case CMemory::MAP_BSX: + S9xSetBSX(Byte, Address); + addCyclesInMemoryAccess; + return; + + case CMemory::MAP_NONE: + default: + addCyclesInMemoryAccess; + return; + } +} + +inline void S9xSetWord (uint16 Word, uint32 Address, enum s9xwrap_t w = WRAP_NONE, enum s9xwriteorder_t o = WRITE_01) +{ + uint32 mask = MEMMAP_MASK & (w == WRAP_PAGE ? 0xff : (w == WRAP_BANK ? 0xffff : 0xffffff)); + if ((Address & mask) == mask) + { + PC_t a; + + if (!o) + S9xSetByte((uint8) Word, Address); + + switch (w) + { + case WRAP_PAGE: + a.xPBPC = Address; + a.B.xPCl++; + S9xSetByte(Word >> 8, a.xPBPC); + break; + + case WRAP_BANK: + a.xPBPC = Address; + a.W.xPC++; + S9xSetByte(Word >> 8, a.xPBPC); + break; + + case WRAP_NONE: + default: + S9xSetByte(Word >> 8, Address + 1); + break; + } + + if (o) + S9xSetByte((uint8) Word, Address); + + return; + } + +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = 0xffffffff; +#endif + + int block = (Address & 0xffffff) >> MEMMAP_SHIFT; + uint8 *SetAddress = Memory.WriteMap[block]; + int32 speed = memory_speed(Address); + + if (SetAddress >= (uint8 *) CMemory::MAP_LAST) + { + #ifdef CPU_SHUTDOWN + SetAddress += (Address & 0xffff); + WRITE_WORD(SetAddress, Word); + addCyclesInMemoryAccess_x2; + + if (Settings.SA1) + { + if (SetAddress == SA1.WaitByteAddress1 || SetAddress == SA1.WaitByteAddress2) + { + SA1.Executing = SA1.S9xOpcodes != NULL; + SA1.WaitCounter = 0; + } + } + #else + WRITE_WORD(SetAddress + (Address & 0xffff), Word); + addCyclesInMemoryAccess_x2; + #endif + return; + } + + switch ((pint) SetAddress) + { + case CMemory::MAP_CPU: + if (o) + { + S9xSetCPU(Word >> 8, (Address + 1) & 0xffff); + addCyclesInMemoryAccess; + S9xSetCPU((uint8) Word, Address & 0xffff); + addCyclesInMemoryAccess; + return; + } + else + { + S9xSetCPU((uint8) Word, Address & 0xffff); + addCyclesInMemoryAccess; + S9xSetCPU(Word >> 8, (Address + 1) & 0xffff); + addCyclesInMemoryAccess; + return; + } + + case CMemory::MAP_PPU: + if (CPU.InDMAorHDMA) + { + if ((Address & 0xff00) != 0x2100) + S9xSetPPU((uint8) Word, Address & 0xffff); + if (((Address + 1) & 0xff00) != 0x2100) + S9xSetPPU(Word >> 8, (Address + 1) & 0xffff); + return; + } + + if (o) + { + S9xSetPPU(Word >> 8, (Address + 1) & 0xffff); + addCyclesInMemoryAccess; + S9xSetPPU((uint8) Word, Address & 0xffff); + addCyclesInMemoryAccess; + return; + } + else + { + S9xSetPPU((uint8) Word, Address & 0xffff); + addCyclesInMemoryAccess; + S9xSetPPU(Word >> 8, (Address + 1) & 0xffff); + addCyclesInMemoryAccess; + return; + } + + case CMemory::MAP_LOROM_SRAM: + if (Memory.SRAMMask) + { + if (Memory.SRAMMask >= MEMMAP_MASK) + WRITE_WORD(Memory.SRAM + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Memory.SRAMMask), Word); + else + { + *(Memory.SRAM + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Memory.SRAMMask)) = (uint8) Word; + *(Memory.SRAM + (((((Address + 1) & 0xff0000) >> 1) | ((Address + 1) & 0x7fff)) & Memory.SRAMMask)) = Word >> 8; + } + + CPU.SRAMModified = TRUE; + } + + addCyclesInMemoryAccess_x2; + return; + + case CMemory::MAP_LOROM_SRAM_B: + if (Multi.sramMaskB) + { + if (Multi.sramMaskB >= MEMMAP_MASK) + WRITE_WORD(Multi.sramB + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Multi.sramMaskB), Word); + else + { + *(Multi.sramB + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Multi.sramMaskB)) = (uint8) Word; + *(Multi.sramB + (((((Address + 1) & 0xff0000) >> 1) | ((Address + 1) & 0x7fff)) & Multi.sramMaskB)) = Word >> 8; + } + + CPU.SRAMModified = TRUE; + } + + addCyclesInMemoryAccess_x2; + return; + + case CMemory::MAP_HIROM_SRAM: + if (Memory.SRAMMask) + { + if (Memory.SRAMMask >= MEMMAP_MASK) + WRITE_WORD(Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask), Word); + else + { + *(Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask)) = (uint8) Word; + *(Memory.SRAM + ((((Address + 1) & 0x7fff) - 0x6000 + (((Address + 1) & 0xf0000) >> 3)) & Memory.SRAMMask)) = Word >> 8; + } + + CPU.SRAMModified = TRUE; + } + + addCyclesInMemoryAccess_x2; + return; + + case CMemory::MAP_BWRAM: + WRITE_WORD(Memory.BWRAM + ((Address & 0x7fff) - 0x6000), Word); + CPU.SRAMModified = TRUE; + addCyclesInMemoryAccess_x2; + return; + + case CMemory::MAP_SA1RAM: + WRITE_WORD(Memory.SRAM + (Address & 0xffff), Word); + SA1.Executing = !SA1.Waiting; + addCyclesInMemoryAccess_x2; + return; + + case CMemory::MAP_DSP: + if (o) + { + S9xSetDSP(Word >> 8, (Address + 1) & 0xffff); + addCyclesInMemoryAccess; + S9xSetDSP((uint8) Word, Address & 0xffff); + addCyclesInMemoryAccess; + return; + } + else + { + S9xSetDSP((uint8) Word, Address & 0xffff); + addCyclesInMemoryAccess; + S9xSetDSP(Word >> 8, (Address + 1) & 0xffff); + addCyclesInMemoryAccess; + return; + } + + case CMemory::MAP_C4: + if (o) + { + S9xSetC4(Word >> 8, (Address + 1) & 0xffff); + addCyclesInMemoryAccess; + S9xSetC4((uint8) Word, Address & 0xffff); + addCyclesInMemoryAccess; + return; + } + else + { + S9xSetC4((uint8) Word, Address & 0xffff); + addCyclesInMemoryAccess; + S9xSetC4(Word >> 8, (Address + 1) & 0xffff); + addCyclesInMemoryAccess; + return; + } + + case CMemory::MAP_OBC_RAM: + if (o) + { + S9xSetOBC1(Word >> 8, (Address + 1) & 0xffff); + addCyclesInMemoryAccess; + S9xSetOBC1((uint8) Word, Address & 0xffff); + addCyclesInMemoryAccess; + return; + } + else + { + S9xSetOBC1((uint8) Word, Address & 0xffff); + addCyclesInMemoryAccess; + S9xSetOBC1(Word >> 8, (Address + 1) & 0xffff); + addCyclesInMemoryAccess; + return; + } + + case CMemory::MAP_SETA_DSP: + if (o) + { + S9xSetSetaDSP(Word >> 8, Address + 1); + addCyclesInMemoryAccess; + S9xSetSetaDSP((uint8) Word, Address); + addCyclesInMemoryAccess; + return; + } + else + { + S9xSetSetaDSP((uint8) Word, Address); + addCyclesInMemoryAccess; + S9xSetSetaDSP(Word >> 8, Address + 1); + addCyclesInMemoryAccess; + return; + } + + case CMemory::MAP_SETA_RISC: + if (o) + { + S9xSetST018(Word >> 8, Address + 1); + addCyclesInMemoryAccess; + S9xSetST018((uint8) Word, Address); + addCyclesInMemoryAccess; + return; + } + else + { + S9xSetST018((uint8) Word, Address); + addCyclesInMemoryAccess; + S9xSetST018(Word >> 8, Address + 1); + addCyclesInMemoryAccess; + return; + } + + case CMemory::MAP_BSX: + if (o) + { + S9xSetBSX(Word >> 8, Address + 1); + addCyclesInMemoryAccess; + S9xSetBSX((uint8) Word, Address); + addCyclesInMemoryAccess; + return; + } + else + { + S9xSetBSX((uint8) Word, Address); + addCyclesInMemoryAccess; + S9xSetBSX(Word >> 8, Address + 1); + addCyclesInMemoryAccess; + return; + } + + case CMemory::MAP_NONE: + default: + addCyclesInMemoryAccess_x2; + return; + } +} + +inline void S9xSetPCBase (uint32 Address) +{ + Registers.PBPC = Address & 0xffffff; + ICPU.ShiftedPB = Address & 0xff0000; + + int block; + uint8 *GetAddress = Memory.Map[block = ((Address & 0xffffff) >> MEMMAP_SHIFT)]; + + CPU.MemSpeed = memory_speed(Address); + CPU.MemSpeedx2 = CPU.MemSpeed << 1; + + if (GetAddress >= (uint8 *) CMemory::MAP_LAST) + { + CPU.PCBase = GetAddress; + return; + } + + switch ((pint) GetAddress) + { + case CMemory::MAP_LOROM_SRAM: + if ((Memory.SRAMMask & MEMMAP_MASK) != MEMMAP_MASK) + CPU.PCBase = NULL; + else + CPU.PCBase = Memory.SRAM + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Memory.SRAMMask) - (Address & 0xffff); + return; + + case CMemory::MAP_LOROM_SRAM_B: + if ((Multi.sramMaskB & MEMMAP_MASK) != MEMMAP_MASK) + CPU.PCBase = NULL; + else + CPU.PCBase = Multi.sramB + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Multi.sramMaskB) - (Address & 0xffff); + return; + + case CMemory::MAP_HIROM_SRAM: + if ((Memory.SRAMMask & MEMMAP_MASK) != MEMMAP_MASK) + CPU.PCBase = NULL; + else + CPU.PCBase = Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask) - (Address & 0xffff); + return; + + case CMemory::MAP_BWRAM: + CPU.PCBase = Memory.BWRAM - 0x6000 - (Address & 0x8000); + return; + + case CMemory::MAP_SA1RAM: + CPU.PCBase = Memory.SRAM; + return; + + case CMemory::MAP_SPC7110_ROM: + CPU.PCBase = S9xGetBasePointerSPC7110(Address); + return; + + case CMemory::MAP_C4: + CPU.PCBase = S9xGetBasePointerC4(Address & 0xffff); + return; + + case CMemory::MAP_OBC_RAM: + CPU.PCBase = S9xGetBasePointerOBC1(Address & 0xffff); + return; + + case CMemory::MAP_BSX: + CPU.PCBase = S9xGetBasePointerBSX(Address); + return; + + case CMemory::MAP_NONE: + default: + CPU.PCBase = NULL; + return; + } +} + +inline uint8 * S9xGetBasePointer (uint32 Address) +{ + uint8 *GetAddress = Memory.Map[(Address & 0xffffff) >> MEMMAP_SHIFT]; + + if (GetAddress >= (uint8 *) CMemory::MAP_LAST) + return (GetAddress); + + switch ((pint) GetAddress) + { + case CMemory::MAP_LOROM_SRAM: + if ((Memory.SRAMMask & MEMMAP_MASK) != MEMMAP_MASK) + return (NULL); + return (Memory.SRAM + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Memory.SRAMMask) - (Address & 0xffff)); + + case CMemory::MAP_LOROM_SRAM_B: + if ((Multi.sramMaskB & MEMMAP_MASK) != MEMMAP_MASK) + return (NULL); + return (Multi.sramB + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Multi.sramMaskB) - (Address & 0xffff)); + + case CMemory::MAP_HIROM_SRAM: + if ((Memory.SRAMMask & MEMMAP_MASK) != MEMMAP_MASK) + return (NULL); + return (Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask) - (Address & 0xffff)); + + case CMemory::MAP_BWRAM: + return (Memory.BWRAM - 0x6000 - (Address & 0x8000)); + + case CMemory::MAP_SA1RAM: + return (Memory.SRAM); + + case CMemory::MAP_SPC7110_ROM: + return (S9xGetBasePointerSPC7110(Address)); + + case CMemory::MAP_C4: + return (S9xGetBasePointerC4(Address & 0xffff)); + + case CMemory::MAP_OBC_RAM: + return (S9xGetBasePointerOBC1(Address & 0xffff)); + + case CMemory::MAP_NONE: + default: + return (NULL); + } +} + +inline uint8 * S9xGetMemPointer (uint32 Address) +{ + uint8 *GetAddress = Memory.Map[(Address & 0xffffff) >> MEMMAP_SHIFT]; + + if (GetAddress >= (uint8 *) CMemory::MAP_LAST) + return (GetAddress + (Address & 0xffff)); + + switch ((pint) GetAddress) + { + case CMemory::MAP_LOROM_SRAM: + if ((Memory.SRAMMask & MEMMAP_MASK) != MEMMAP_MASK) + return (NULL); + return (Memory.SRAM + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Memory.SRAMMask)); + + case CMemory::MAP_LOROM_SRAM_B: + if ((Multi.sramMaskB & MEMMAP_MASK) != MEMMAP_MASK) + return (NULL); + return (Multi.sramB + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Multi.sramMaskB)); + + case CMemory::MAP_HIROM_SRAM: + if ((Memory.SRAMMask & MEMMAP_MASK) != MEMMAP_MASK) + return (NULL); + return (Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask)); + + case CMemory::MAP_BWRAM: + return (Memory.BWRAM - 0x6000 + (Address & 0x7fff)); + + case CMemory::MAP_SA1RAM: + return (Memory.SRAM + (Address & 0xffff)); + + case CMemory::MAP_SPC7110_ROM: + return (S9xGetBasePointerSPC7110(Address) + (Address & 0xffff)); + + case CMemory::MAP_C4: + return (S9xGetMemPointerC4(Address & 0xffff)); + + case CMemory::MAP_OBC_RAM: + return (S9xGetMemPointerOBC1(Address & 0xffff)); + + case CMemory::MAP_NONE: + default: + return (NULL); + } +} + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/gfx.cpp b/plugins/snes9x_gx/source/snes9x/gfx.cpp new file mode 100644 index 00000000..579aa526 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/gfx.cpp @@ -0,0 +1,2413 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#include "snes9x.h" +#include "ppu.h" +#include "tile.h" +#include "controls.h" +#include "crosshairs.h" +#include "cheats.h" +#include "movie.h" +#include "screenshot.h" +#include "font.h" +#include "display.h" + +extern struct SCheatData Cheat; +extern struct SLineData LineData[240]; +extern struct SLineMatrixData LineMatrixData[240]; + +void S9xComputeClipWindows (void); + +static int font_width = 8, font_height = 9; + +static void SetupOBJ (void); +static void DrawOBJS (int); +static void DisplayFrameRate (void); +static void DisplayPressedKeys (void); +static void DisplayWatchedAddresses (void); +static void DisplayStringFromBottom (const char *, int, int, bool); +static void DrawBackground (int, uint8, uint8); +static void DrawBackgroundMosaic (int, uint8, uint8); +static void DrawBackgroundOffset (int, uint8, uint8, int); +static void DrawBackgroundOffsetMosaic (int, uint8, uint8, int); +static inline void DrawBackgroundMode7 (int, void (*DrawMath) (uint32, uint32, int), void (*DrawNomath) (uint32, uint32, int), int); +static inline void DrawBackdrop (void); +static inline void RenderScreen (bool8); +static uint16 get_crosshair_color (uint8); + +#define TILE_PLUS(t, x) (((t) & 0xfc00) | ((t + x) & 0x3ff)) + + +bool8 S9xGraphicsInit (void) +{ + S9xInitTileRenderer(); + ZeroMemory(BlackColourMap, 256 * sizeof(uint16)); + +#ifdef GFX_MULTI_FORMAT + if (GFX.BuildPixel == NULL) + S9xSetRenderPixelFormat(RGB565); +#endif + + GFX.DoInterlace = 0; + GFX.InterlaceFrame = 0; + GFX.RealPPL = GFX.Pitch >> 1; + IPPU.OBJChanged = TRUE; + IPPU.DirectColourMapsNeedRebuild = TRUE; + Settings.BG_Forced = 0; + S9xFixColourBrightness(); + + GFX.X2 = (uint16 *) malloc(sizeof(uint16) * 0x10000); + GFX.ZERO = (uint16 *) malloc(sizeof(uint16) * 0x10000); + + GFX.ScreenSize = GFX.Pitch / 2 * SNES_HEIGHT_EXTENDED * (Settings.SupportHiRes ? 2 : 1); + GFX.SubScreen = (uint16 *) malloc(GFX.ScreenSize * sizeof(uint16)); + GFX.ZBuffer = (uint8 *) malloc(GFX.ScreenSize); + GFX.SubZBuffer = (uint8 *) malloc(GFX.ScreenSize); + + if (!GFX.X2 || !GFX.ZERO || !GFX.SubScreen || !GFX.ZBuffer || !GFX.SubZBuffer) + { + S9xGraphicsDeinit(); + return (FALSE); + } + + // Lookup table for color addition + ZeroMemory(GFX.X2, 0x10000 * sizeof(uint16)); + for (uint32 r = 0; r <= MAX_RED; r++) + { + uint32 r2 = r << 1; + if (r2 > MAX_RED) + r2 = MAX_RED; + + for (uint32 g = 0; g <= MAX_GREEN; g++) + { + uint32 g2 = g << 1; + if (g2 > MAX_GREEN) + g2 = MAX_GREEN; + + for (uint32 b = 0; b <= MAX_BLUE; b++) + { + uint32 b2 = b << 1; + if (b2 > MAX_BLUE) + b2 = MAX_BLUE; + + GFX.X2[BUILD_PIXEL2(r, g, b)] = BUILD_PIXEL2(r2, g2, b2); + GFX.X2[BUILD_PIXEL2(r, g, b) & ~ALPHA_BITS_MASK] = BUILD_PIXEL2(r2, g2, b2); + } + } + } + + // Lookup table for 1/2 color subtraction + ZeroMemory(GFX.ZERO, 0x10000 * sizeof(uint16)); + for (uint32 r = 0; r <= MAX_RED; r++) + { + uint32 r2 = r; + if (r2 & 0x10) + r2 &= ~0x10; + else + r2 = 0; + + for (uint32 g = 0; g <= MAX_GREEN; g++) + { + uint32 g2 = g; + if (g2 & GREEN_HI_BIT) + g2 &= ~GREEN_HI_BIT; + else + g2 = 0; + + for (uint32 b = 0; b <= MAX_BLUE; b++) + { + uint32 b2 = b; + if (b2 & 0x10) + b2 &= ~0x10; + else + b2 = 0; + + GFX.ZERO[BUILD_PIXEL2(r, g, b)] = BUILD_PIXEL2(r2, g2, b2); + GFX.ZERO[BUILD_PIXEL2(r, g, b) & ~ALPHA_BITS_MASK] = BUILD_PIXEL2(r2, g2, b2); + } + } + } + + return (TRUE); +} + +void S9xGraphicsDeinit (void) +{ + if (GFX.X2) { free(GFX.X2); GFX.X2 = NULL; } + if (GFX.ZERO) { free(GFX.ZERO); GFX.ZERO = NULL; } + if (GFX.SubScreen) { free(GFX.SubScreen); GFX.SubScreen = NULL; } + if (GFX.ZBuffer) { free(GFX.ZBuffer); GFX.ZBuffer = NULL; } + if (GFX.SubZBuffer) { free(GFX.SubZBuffer); GFX.SubZBuffer = NULL; } +} + +void S9xBuildDirectColourMaps (void) +{ + IPPU.XB = mul_brightness[PPU.Brightness]; + + for (uint32 p = 0; p < 8; p++) + for (uint32 c = 0; c < 256; c++) + DirectColourMaps[p][c] = BUILD_PIXEL(IPPU.XB[((c & 7) << 2) | ((p & 1) << 1)], IPPU.XB[((c & 0x38) >> 1) | (p & 2)], IPPU.XB[((c & 0xc0) >> 3) | (p & 4)]); + + IPPU.DirectColourMapsNeedRebuild = FALSE; +} + +void S9xStartScreenRefresh (void) +{ + if (IPPU.RenderThisFrame) + { + GFX.InterlaceFrame = !GFX.InterlaceFrame; + if (!GFX.DoInterlace || !GFX.InterlaceFrame) + { + if (!S9xInitUpdate()) + { + IPPU.RenderThisFrame = FALSE; + return; + } + + if (GFX.DoInterlace) + GFX.DoInterlace--; + + IPPU.MaxBrightness = PPU.Brightness; + + IPPU.Interlace = Memory.FillRAM[0x2133] & 1; + IPPU.InterlaceOBJ = Memory.FillRAM[0x2133] & 2; + IPPU.PseudoHires = Memory.FillRAM[0x2133] & 8; + + if (Settings.SupportHiRes && (PPU.BGMode == 5 || PPU.BGMode == 6 || IPPU.PseudoHires)) + { + GFX.RealPPL = GFX.Pitch >> 1; + IPPU.DoubleWidthPixels = TRUE; + IPPU.RenderedScreenWidth = SNES_WIDTH << 1; + } + else + { + #ifdef USE_OPENGL + if (Settings.OpenGLEnable) + GFX.RealPPL = SNES_WIDTH; + else + #endif + GFX.RealPPL = GFX.Pitch >> 1; + IPPU.DoubleWidthPixels = FALSE; + IPPU.RenderedScreenWidth = SNES_WIDTH; + } + + if (Settings.SupportHiRes && IPPU.Interlace) + { + GFX.PPL = GFX.RealPPL << 1; + IPPU.DoubleHeightPixels = TRUE; + IPPU.RenderedScreenHeight = PPU.ScreenHeight << 1; + GFX.DoInterlace++; + } + else + { + GFX.PPL = GFX.RealPPL; + IPPU.DoubleHeightPixels = FALSE; + IPPU.RenderedScreenHeight = PPU.ScreenHeight; + } + + IPPU.RenderedFramesCount++; + } + + PPU.MosaicStart = 0; + PPU.RecomputeClipWindows = TRUE; + IPPU.PreviousLine = IPPU.CurrentLine = 0; + + ZeroMemory(GFX.ZBuffer, GFX.ScreenSize); + ZeroMemory(GFX.SubZBuffer, GFX.ScreenSize); + } + + if (++IPPU.FrameCount % Memory.ROMFramesPerSecond == 0) + { + IPPU.DisplayedRenderedFrameCount = IPPU.RenderedFramesCount; + IPPU.RenderedFramesCount = 0; + IPPU.FrameCount = 0; + } + + if (GFX.InfoStringTimeout > 0 && --GFX.InfoStringTimeout == 0) + GFX.InfoString = NULL; + + IPPU.TotalEmulatedFrames++; +} + +void S9xEndScreenRefresh (void) +{ + if (IPPU.RenderThisFrame) + { + FLUSH_REDRAW(); + + if (GFX.DoInterlace && GFX.InterlaceFrame == 0) + { + S9xControlEOF(); + S9xContinueUpdate(IPPU.RenderedScreenWidth, IPPU.RenderedScreenHeight); + } + else + { + if (IPPU.ColorsChanged) + { + uint32 saved = PPU.CGDATA[0]; + IPPU.ColorsChanged = FALSE; + S9xSetPalette(); + PPU.CGDATA[0] = saved; + } + + S9xControlEOF(); + + if (Settings.TakeScreenshot) + S9xDoScreenshot(IPPU.RenderedScreenWidth, IPPU.RenderedScreenHeight); + + if (Settings.AutoDisplayMessages) + S9xDisplayMessages(GFX.Screen, GFX.RealPPL, IPPU.RenderedScreenWidth, IPPU.RenderedScreenHeight, 1); + + S9xDeinitUpdate(IPPU.RenderedScreenWidth, IPPU.RenderedScreenHeight); + } + } + else + S9xControlEOF(); + + S9xApplyCheats(); + +#ifdef DEBUGGER + if (CPU.Flags & FRAME_ADVANCE_FLAG) + { + if (ICPU.FrameAdvanceCount) + { + ICPU.FrameAdvanceCount--; + IPPU.RenderThisFrame = TRUE; + IPPU.FrameSkip = 0; + } + else + { + CPU.Flags &= ~FRAME_ADVANCE_FLAG; + CPU.Flags |= DEBUG_MODE_FLAG; + } + } +#endif + + if (CPU.SRAMModified) + { + if (!CPU.AutoSaveTimer) + { + if (!(CPU.AutoSaveTimer = Settings.AutoSaveDelay * Memory.ROMFramesPerSecond)) + CPU.SRAMModified = FALSE; + } + else + { + if (!--CPU.AutoSaveTimer) + { + S9xAutoSaveSRAM(); + CPU.SRAMModified = FALSE; + } + } + } +} + +void RenderLine (uint8 C) +{ + if (IPPU.RenderThisFrame) + { + LineData[C].BG[0].VOffset = PPU.BG[0].VOffset + 1; + LineData[C].BG[0].HOffset = PPU.BG[0].HOffset; + LineData[C].BG[1].VOffset = PPU.BG[1].VOffset + 1; + LineData[C].BG[1].HOffset = PPU.BG[1].HOffset; + + if (PPU.BGMode == 7) + { + struct SLineMatrixData *p = &LineMatrixData[C]; + p->MatrixA = PPU.MatrixA; + p->MatrixB = PPU.MatrixB; + p->MatrixC = PPU.MatrixC; + p->MatrixD = PPU.MatrixD; + p->CentreX = PPU.CentreX; + p->CentreY = PPU.CentreY; + p->M7HOFS = PPU.M7HOFS; + p->M7VOFS = PPU.M7VOFS; + } + else + { + LineData[C].BG[2].VOffset = PPU.BG[2].VOffset + 1; + LineData[C].BG[2].HOffset = PPU.BG[2].HOffset; + LineData[C].BG[3].VOffset = PPU.BG[3].VOffset + 1; + LineData[C].BG[3].HOffset = PPU.BG[3].HOffset; + } + + IPPU.CurrentLine = C + 1; + } + else + { + // if we're not rendering this frame, we still need to update this + // XXX: Check ForceBlank? Or anything else? + if (IPPU.OBJChanged) + SetupOBJ(); + PPU.RangeTimeOver |= GFX.OBJLines[C].RTOFlags; + } +} + +static inline void RenderScreen (bool8 sub) +{ + uint8 BGActive; + int D; + + if (!sub) + { + GFX.S = GFX.Screen; + if (GFX.DoInterlace && GFX.InterlaceFrame) + GFX.S += GFX.RealPPL; + GFX.DB = GFX.ZBuffer; + GFX.Clip = IPPU.Clip[0]; + BGActive = Memory.FillRAM[0x212c] & ~Settings.BG_Forced; + D = 32; + } + else + { + GFX.S = GFX.SubScreen; + GFX.DB = GFX.SubZBuffer; + GFX.Clip = IPPU.Clip[1]; + BGActive = Memory.FillRAM[0x212d] & ~Settings.BG_Forced; + D = (Memory.FillRAM[0x2130] & 2) << 4; // 'do math' depth flag + } + + if (BGActive & 0x10) + { + BG.TileAddress = PPU.OBJNameBase; + BG.NameSelect = PPU.OBJNameSelect; + BG.EnableMath = !sub && (Memory.FillRAM[0x2131] & 0x10); + BG.StartPalette = 128; + S9xSelectTileConverter(4, FALSE, sub, FALSE); + S9xSelectTileRenderers(PPU.BGMode, sub, TRUE); + DrawOBJS(D + 4); + } + + BG.NameSelect = 0; + S9xSelectTileRenderers(PPU.BGMode, sub, FALSE); + + #define DO_BG(n, pal, depth, hires, offset, Zh, Zl, voffoff) \ + if (BGActive & (1 << n)) \ + { \ + BG.StartPalette = pal; \ + BG.EnableMath = !sub && (Memory.FillRAM[0x2131] & (1 << n)); \ + BG.TileSizeH = (!hires && PPU.BG[n].BGSize) ? 16 : 8; \ + BG.TileSizeV = (PPU.BG[n].BGSize) ? 16 : 8; \ + S9xSelectTileConverter(depth, hires, sub, PPU.BGMosaic[n]); \ + \ + if (offset) \ + { \ + BG.OffsetSizeH = (!hires && PPU.BG[2].BGSize) ? 16 : 8; \ + BG.OffsetSizeV = (PPU.BG[2].BGSize) ? 16 : 8; \ + \ + if (PPU.BGMosaic[n] && (hires || PPU.Mosaic > 1)) \ + DrawBackgroundOffsetMosaic(n, D + Zh, D + Zl, voffoff); \ + else \ + DrawBackgroundOffset(n, D + Zh, D + Zl, voffoff); \ + } \ + else \ + { \ + if (PPU.BGMosaic[n] && (hires || PPU.Mosaic > 1)) \ + DrawBackgroundMosaic(n, D + Zh, D + Zl); \ + else \ + DrawBackground(n, D + Zh, D + Zl); \ + } \ + } + + switch (PPU.BGMode) + { + case 0: + DO_BG(0, 0, 2, FALSE, FALSE, 15, 11, 0); + DO_BG(1, 32, 2, FALSE, FALSE, 14, 10, 0); + DO_BG(2, 64, 2, FALSE, FALSE, 7, 3, 0); + DO_BG(3, 96, 2, FALSE, FALSE, 6, 2, 0); + break; + + case 1: + DO_BG(0, 0, 4, FALSE, FALSE, 15, 11, 0); + DO_BG(1, 0, 4, FALSE, FALSE, 14, 10, 0); + DO_BG(2, 0, 2, FALSE, FALSE, (PPU.BG3Priority ? 17 : 7), 3, 0); + break; + + case 2: + DO_BG(0, 0, 4, FALSE, TRUE, 15, 7, 8); + DO_BG(1, 0, 4, FALSE, TRUE, 11, 3, 8); + break; + + case 3: + DO_BG(0, 0, 8, FALSE, FALSE, 15, 7, 0); + DO_BG(1, 0, 4, FALSE, FALSE, 11, 3, 0); + break; + + case 4: + DO_BG(0, 0, 8, FALSE, TRUE, 15, 7, 0); + DO_BG(1, 0, 2, FALSE, TRUE, 11, 3, 0); + break; + + case 5: + DO_BG(0, 0, 4, TRUE, FALSE, 15, 7, 0); + DO_BG(1, 0, 2, TRUE, FALSE, 11, 3, 0); + break; + + case 6: + DO_BG(0, 0, 4, TRUE, TRUE, 15, 7, 8); + break; + + case 7: + if (BGActive & 0x01) + { + BG.EnableMath = !sub && (Memory.FillRAM[0x2131] & 1); + DrawBackgroundMode7(0, GFX.DrawMode7BG1Math, GFX.DrawMode7BG1Nomath, D); + } + + if ((Memory.FillRAM[0x2133] & 0x40) && (BGActive & 0x02)) + { + BG.EnableMath = !sub && (Memory.FillRAM[0x2131] & 2); + DrawBackgroundMode7(1, GFX.DrawMode7BG2Math, GFX.DrawMode7BG2Nomath, D); + } + + break; + } + + #undef DO_BG + + BG.EnableMath = !sub && (Memory.FillRAM[0x2131] & 0x20); + + DrawBackdrop(); +} + +void S9xUpdateScreen (void) +{ + if (IPPU.OBJChanged || IPPU.InterlaceOBJ) + SetupOBJ(); + + // XXX: Check ForceBlank? Or anything else? + PPU.RangeTimeOver |= GFX.OBJLines[GFX.EndY].RTOFlags; + + GFX.StartY = IPPU.PreviousLine; + if ((GFX.EndY = IPPU.CurrentLine - 1) >= PPU.ScreenHeight) + GFX.EndY = PPU.ScreenHeight - 1; + + if (!PPU.ForcedBlanking) + { + // If force blank, may as well completely skip all this. We only did + // the OBJ because (AFAWK) the RTO flags are updated even during force-blank. + + if (PPU.RecomputeClipWindows) + { + S9xComputeClipWindows(); + PPU.RecomputeClipWindows = FALSE; + } + + if (Settings.SupportHiRes) + { + if (!IPPU.DoubleWidthPixels && (PPU.BGMode == 5 || PPU.BGMode == 6 || IPPU.PseudoHires)) + { + #ifdef USE_OPENGL + if (Settings.OpenGLEnable && GFX.RealPPL == 256) + { + // Have to back out of the speed up hack where the low res. + // SNES image was rendered into a 256x239 sized buffer, + // ignoring the true, larger size of the buffer. + GFX.RealPPL = GFX.Pitch >> 1; + + for (register int32 y = (int32) GFX.StartY - 1; y >= 0; y--) + { + register uint16 *p = GFX.Screen + y * GFX.PPL + 255; + register uint16 *q = GFX.Screen + y * GFX.RealPPL + 510; + + for (register int x = 255; x >= 0; x--, p--, q -= 2) + *q = *(q + 1) = *p; + } + + GFX.PPL = GFX.RealPPL; // = GFX.Pitch >> 1 above + } + else + #endif + { + // Have to back out of the regular speed hack + for (register uint32 y = 0; y < GFX.StartY; y++) + { + register uint16 *p = GFX.Screen + y * GFX.PPL + 255; + register uint16 *q = GFX.Screen + y * GFX.PPL + 510; + + for (register int x = 255; x >= 0; x--, p--, q -= 2) + *q = *(q + 1) = *p; + } + } + + IPPU.DoubleWidthPixels = TRUE; + IPPU.RenderedScreenWidth = 512; + } + + if (!IPPU.DoubleHeightPixels && IPPU.Interlace) + { + IPPU.DoubleHeightPixels = TRUE; + IPPU.RenderedScreenHeight = PPU.ScreenHeight << 1; + GFX.PPL = GFX.RealPPL << 1; + GFX.DoInterlace = 2; + + for (register int32 y = (int32) GFX.StartY - 1; y >= 0; y--) + memmove(GFX.Screen + y * GFX.PPL, GFX.Screen + y * GFX.RealPPL, IPPU.RenderedScreenWidth * sizeof(uint16)); + } + else if (IPPU.DoubleHeightPixels && !IPPU.Interlace) + { + for (register int32 y = 0; y < (int32) GFX.StartY; y++) + memmove(GFX.Screen + y * GFX.RealPPL, GFX.Screen + y * GFX.PPL, IPPU.RenderedScreenWidth * sizeof(uint16)); + + IPPU.DoubleHeightPixels = FALSE; + IPPU.RenderedScreenHeight = PPU.ScreenHeight; + GFX.PPL = GFX.RealPPL; + GFX.DoInterlace = 0; + } + } + + if ((Memory.FillRAM[0x2130] & 0x30) != 0x30 && (Memory.FillRAM[0x2131] & 0x3f)) + GFX.FixedColour = BUILD_PIXEL(IPPU.XB[PPU.FixedColourRed], IPPU.XB[PPU.FixedColourGreen], IPPU.XB[PPU.FixedColourBlue]); + + if (PPU.BGMode == 5 || PPU.BGMode == 6 || IPPU.PseudoHires || + ((Memory.FillRAM[0x2130] & 0x30) != 0x30 && (Memory.FillRAM[0x2130] & 2) && (Memory.FillRAM[0x2131] & 0x3f) && (Memory.FillRAM[0x212d] & 0x1f))) + // If hires (Mode 5/6 or pseudo-hires) or math is to be done + // involving the subscreen, then we need to render the subscreen... + RenderScreen(TRUE); + + RenderScreen(FALSE); + } + else + { + const uint16 black = BUILD_PIXEL(0, 0, 0); + + GFX.S = GFX.Screen + GFX.StartY * GFX.PPL; + if (GFX.DoInterlace && GFX.InterlaceFrame) + GFX.S += GFX.RealPPL; + + for (uint32 l = GFX.StartY; l <= GFX.EndY; l++, GFX.S += GFX.PPL) + for (int x = 0; x < IPPU.RenderedScreenWidth; x++) + GFX.S[x] = black; + } + + IPPU.PreviousLine = IPPU.CurrentLine; +} + +static void SetupOBJ (void) +{ + int SmallWidth, SmallHeight, LargeWidth, LargeHeight; + + switch (PPU.OBJSizeSelect) + { + case 0: + SmallWidth = SmallHeight = 8; + LargeWidth = LargeHeight = 16; + break; + + case 1: + SmallWidth = SmallHeight = 8; + LargeWidth = LargeHeight = 32; + break; + + case 2: + SmallWidth = SmallHeight = 8; + LargeWidth = LargeHeight = 64; + break; + + case 3: + SmallWidth = SmallHeight = 16; + LargeWidth = LargeHeight = 32; + break; + + case 4: + SmallWidth = SmallHeight = 16; + LargeWidth = LargeHeight = 64; + break; + + case 5: + default: + SmallWidth = SmallHeight = 32; + LargeWidth = LargeHeight = 64; + break; + + case 6: + SmallWidth = 16; SmallHeight = 32; + LargeWidth = 32; LargeHeight = 64; + break; + + case 7: + SmallWidth = 16; SmallHeight = 32; + LargeWidth = LargeHeight = 32; + break; + } + + int inc = IPPU.InterlaceOBJ ? 2 : 1; + + int startline = (IPPU.InterlaceOBJ && GFX.InterlaceFrame) ? 1 : 0; + + // OK, we have three cases here. Either there's no priority, priority is + // normal FirstSprite, or priority is FirstSprite+Y. The first two are + // easy, the last is somewhat more ... interesting. So we split them up. + + int Height; + uint8 S; + + if (!PPU.OAMPriorityRotation || !(PPU.OAMFlip & PPU.OAMAddr & 1)) // normal case + { + uint8 LineOBJ[SNES_HEIGHT_EXTENDED]; + ZeroMemory(LineOBJ, sizeof(LineOBJ)); + + for (int i = 0; i < SNES_HEIGHT_EXTENDED; i++) + { + GFX.OBJLines[i].RTOFlags = 0; + GFX.OBJLines[i].Tiles = 34; + for (int j = 0; j < 32; j++) + GFX.OBJLines[i].OBJ[j].Sprite = -1; + } + + uint8 FirstSprite = PPU.FirstSprite; + S = FirstSprite; + + do + { + if (PPU.OBJ[S].Size) + { + GFX.OBJWidths[S] = LargeWidth; + Height = LargeHeight; + } + else + { + GFX.OBJWidths[S] = SmallWidth; + Height = SmallHeight; + } + + int HPos = PPU.OBJ[S].HPos; + if (HPos == -256) + HPos = 0; + + if (HPos > -GFX.OBJWidths[S] && HPos <= 256) + { + if (HPos < 0) + GFX.OBJVisibleTiles[S] = (GFX.OBJWidths[S] + HPos + 7) >> 3; + else + if (HPos + GFX.OBJWidths[S] > 255) + GFX.OBJVisibleTiles[S] = (256 - HPos + 7) >> 3; + else + GFX.OBJVisibleTiles[S] = GFX.OBJWidths[S] >> 3; + + for (uint8 line = startline, Y = (uint8) (PPU.OBJ[S].VPos & 0xff); line < Height; Y++, line += inc) + { + if (Y >= SNES_HEIGHT_EXTENDED) + continue; + + if (LineOBJ[Y] >= 32) + { + GFX.OBJLines[Y].RTOFlags |= 0x40; + continue; + } + + GFX.OBJLines[Y].Tiles -= GFX.OBJVisibleTiles[S]; + if (GFX.OBJLines[Y].Tiles < 0) + GFX.OBJLines[Y].RTOFlags |= 0x80; + + GFX.OBJLines[Y].OBJ[LineOBJ[Y]].Sprite = S; + if (PPU.OBJ[S].VFlip) + // Yes, Width not Height. It so happens that the + // sprites with H=2*W flip as two WxW sprites. + GFX.OBJLines[Y].OBJ[LineOBJ[Y]].Line = line ^ (GFX.OBJWidths[S] - 1); + else + GFX.OBJLines[Y].OBJ[LineOBJ[Y]].Line = line; + + LineOBJ[Y]++; + } + } + + S = (S + 1) & 0x7f; + } while (S != FirstSprite); + + for (int Y = 1; Y < SNES_HEIGHT_EXTENDED; Y++) + GFX.OBJLines[Y].RTOFlags |= GFX.OBJLines[Y - 1].RTOFlags; + } + else // evil FirstSprite+Y case + { + // First, find out which sprites are on which lines + uint8 OBJOnLine[SNES_HEIGHT_EXTENDED][128]; + ZeroMemory(OBJOnLine, sizeof(OBJOnLine)); + + for (S = 0; S < 128; S++) + { + if (PPU.OBJ[S].Size) + { + GFX.OBJWidths[S] = LargeWidth; + Height = LargeHeight; + } + else + { + GFX.OBJWidths[S] = SmallWidth; + Height = SmallHeight; + } + + int HPos = PPU.OBJ[S].HPos; + if (HPos == -256) + HPos = 256; + + if (HPos > -GFX.OBJWidths[S] && HPos <= 256) + { + if (HPos < 0) + GFX.OBJVisibleTiles[S] = (GFX.OBJWidths[S] + HPos + 7) >> 3; + else + if (HPos + GFX.OBJWidths[S] >= 257) + GFX.OBJVisibleTiles[S] = (257 - HPos + 7) >> 3; + else + GFX.OBJVisibleTiles[S] = GFX.OBJWidths[S] >> 3; + + for (uint8 line = startline, Y = (uint8) (PPU.OBJ[S].VPos & 0xff); line < Height; Y++, line += inc) + { + if (Y >= SNES_HEIGHT_EXTENDED) + continue; + + if (PPU.OBJ[S].VFlip) + // Yes, Width not Height. It so happens that the + // sprites with H=2*W flip as two WxW sprites. + OBJOnLine[Y][S] = (line ^ (GFX.OBJWidths[S] - 1)) | 0x80; + else + OBJOnLine[Y][S] = line | 0x80; + } + } + } + + // Now go through and pull out those OBJ that are actually visible. + int j; + for (int Y = 0; Y < SNES_HEIGHT_EXTENDED; Y++) + { + GFX.OBJLines[Y].RTOFlags = Y ? GFX.OBJLines[Y - 1].RTOFlags : 0; + GFX.OBJLines[Y].Tiles = 34; + + uint8 FirstSprite = (PPU.FirstSprite + Y) & 0x7f; + S = FirstSprite; + j = 0; + + do + { + if (OBJOnLine[Y][S]) + { + if (j >= 32) + { + GFX.OBJLines[Y].RTOFlags |= 0x40; + break; + } + + GFX.OBJLines[Y].Tiles -= GFX.OBJVisibleTiles[S]; + if (GFX.OBJLines[Y].Tiles < 0) + GFX.OBJLines[Y].RTOFlags |= 0x80; + GFX.OBJLines[Y].OBJ[j].Sprite = S; + GFX.OBJLines[Y].OBJ[j++].Line = OBJOnLine[Y][S] & ~0x80; + } + + S = (S + 1) & 0x7f; + } while (S != FirstSprite); + + if (j < 32) + GFX.OBJLines[Y].OBJ[j].Sprite = -1; + } + } + + IPPU.OBJChanged = FALSE; +} + +static void DrawOBJS (int D) +{ + void (*DrawTile) (uint32, uint32, uint32, uint32) = NULL; + void (*DrawClippedTile) (uint32, uint32, uint32, uint32, uint32, uint32) = NULL; + + int PixWidth = IPPU.DoubleWidthPixels ? 2 : 1; + BG.InterlaceLine = GFX.InterlaceFrame ? 8 : 0; + GFX.Z1 = 2; + + for (uint32 Y = GFX.StartY, Offset = Y * GFX.PPL; Y <= GFX.EndY; Y++, Offset += GFX.PPL) + { + int I = 0; + int tiles = GFX.OBJLines[Y].Tiles; + + for (int S = GFX.OBJLines[Y].OBJ[I].Sprite; S >= 0 && I < 32; S = GFX.OBJLines[Y].OBJ[++I].Sprite) + { + tiles += GFX.OBJVisibleTiles[S]; + if (tiles <= 0) + continue; + + int BaseTile = (((GFX.OBJLines[Y].OBJ[I].Line << 1) + (PPU.OBJ[S].Name & 0xf0)) & 0xf0) | (PPU.OBJ[S].Name & 0x100) | (PPU.OBJ[S].Palette << 10); + int TileX = PPU.OBJ[S].Name & 0x0f; + int TileLine = (GFX.OBJLines[Y].OBJ[I].Line & 7) * 8; + int TileInc = 1; + + if (PPU.OBJ[S].HFlip) + { + TileX = (TileX + (GFX.OBJWidths[S] >> 3) - 1) & 0x0f; + BaseTile |= H_FLIP; + TileInc = -1; + } + + GFX.Z2 = D + PPU.OBJ[S].Priority * 4; + + int DrawMode = 3; + int clip = 0, next_clip = -1000; + int X = PPU.OBJ[S].HPos; + if (X == -256) + X = 256; + + for (int t = tiles, O = Offset + X * PixWidth; X <= 256 && X < PPU.OBJ[S].HPos + GFX.OBJWidths[S]; TileX = (TileX + TileInc) & 0x0f, X += 8, O += 8 * PixWidth) + { + if (X < -7 || --t < 0 || X == 256) + continue; + + for (int x = X; x < X + 8;) + { + if (x >= next_clip) + { + for (; clip < GFX.Clip[4].Count && GFX.Clip[4].Left[clip] <= x; clip++) ; + if (clip == 0 || x >= GFX.Clip[4].Right[clip - 1]) + { + DrawMode = 0; + next_clip = ((clip < GFX.Clip[4].Count) ? GFX.Clip[4].Left[clip] : 1000); + } + else + { + DrawMode = GFX.Clip[4].DrawMode[clip - 1]; + next_clip = GFX.Clip[4].Right[clip - 1]; + GFX.ClipColors = !(DrawMode & 1); + + if (BG.EnableMath && (PPU.OBJ[S].Palette & 4) && (DrawMode & 2)) + { + DrawTile = GFX.DrawTileMath; + DrawClippedTile = GFX.DrawClippedTileMath; + } + else + { + DrawTile = GFX.DrawTileNomath; + DrawClippedTile = GFX.DrawClippedTileNomath; + } + } + } + + if (x == X && x + 8 < next_clip) + { + if (DrawMode) + DrawTile(BaseTile | TileX, O, TileLine, 1); + x += 8; + } + else + { + int w = (next_clip <= X + 8) ? next_clip - x : X + 8 - x; + if (DrawMode) + DrawClippedTile(BaseTile | TileX, O, x - X, w, TileLine, 1); + x += w; + } + } + } + } + } +} + +static void DrawBackground (int bg, uint8 Zh, uint8 Zl) +{ + BG.TileAddress = PPU.BG[bg].NameBase << 1; + + uint32 Tile; + uint16 *SC0, *SC1, *SC2, *SC3; + + SC0 = (uint16 *) &Memory.VRAM[PPU.BG[bg].SCBase << 1]; + SC1 = (PPU.BG[bg].SCSize & 1) ? SC0 + 1024 : SC0; + if (SC1 >= (uint16 *) (Memory.VRAM + 0x10000)) + SC1 -= 0x8000; + SC2 = (PPU.BG[bg].SCSize & 2) ? SC1 + 1024 : SC0; + if (SC2 >= (uint16 *) (Memory.VRAM + 0x10000)) + SC2 -= 0x8000; + SC3 = (PPU.BG[bg].SCSize & 1) ? SC2 + 1024 : SC2; + if (SC3 >= (uint16 *) (Memory.VRAM + 0x10000)) + SC3 -= 0x8000; + + uint32 Lines; + int OffsetMask = (BG.TileSizeH == 16) ? 0x3ff : 0x1ff; + int OffsetShift = (BG.TileSizeV == 16) ? 4 : 3; + int PixWidth = IPPU.DoubleWidthPixels ? 2 : 1; + bool8 HiresInterlace = IPPU.Interlace && IPPU.DoubleWidthPixels; + + void (*DrawTile) (uint32, uint32, uint32, uint32); + void (*DrawClippedTile) (uint32, uint32, uint32, uint32, uint32, uint32); + + for (int clip = 0; clip < GFX.Clip[bg].Count; clip++) + { + GFX.ClipColors = !(GFX.Clip[bg].DrawMode[clip] & 1); + + if (BG.EnableMath && (GFX.Clip[bg].DrawMode[clip] & 2)) + { + DrawTile = GFX.DrawTileMath; + DrawClippedTile = GFX.DrawClippedTileMath; + } + else + { + DrawTile = GFX.DrawTileNomath; + DrawClippedTile = GFX.DrawClippedTileNomath; + } + + for (uint32 Y = GFX.StartY; Y <= GFX.EndY; Y += Lines) + { + uint32 Y2 = HiresInterlace ? Y * 2 + GFX.InterlaceFrame : Y; + uint32 VOffset = LineData[Y].BG[bg].VOffset + (HiresInterlace ? 1 : 0); + uint32 HOffset = LineData[Y].BG[bg].HOffset; + int VirtAlign = ((Y2 + VOffset) & 7) >> (HiresInterlace ? 1 : 0); + + for (Lines = 1; Lines < GFX.LinesPerTile - VirtAlign; Lines++) + { + if ((VOffset != LineData[Y + Lines].BG[bg].VOffset) || (HOffset != LineData[Y + Lines].BG[bg].HOffset)) + break; + } + + if (Y + Lines > GFX.EndY) + Lines = GFX.EndY - Y + 1; + + VirtAlign <<= 3; + + uint32 t1, t2; + uint32 TilemapRow = (VOffset + Y2) >> OffsetShift; + BG.InterlaceLine = ((VOffset + Y2) & 1) << 3; + + if ((VOffset + Y2) & 8) + { + t1 = 16; + t2 = 0; + } + else + { + t1 = 0; + t2 = 16; + } + + uint16 *b1, *b2; + + if (TilemapRow & 0x20) + { + b1 = SC2; + b2 = SC3; + } + else + { + b1 = SC0; + b2 = SC1; + } + + b1 += (TilemapRow & 0x1f) << 5; + b2 += (TilemapRow & 0x1f) << 5; + + uint32 Left = GFX.Clip[bg].Left[clip]; + uint32 Right = GFX.Clip[bg].Right[clip]; + uint32 Offset = Left * PixWidth + Y * GFX.PPL; + uint32 HPos = (HOffset + Left) & OffsetMask; + uint32 HTile = HPos >> 3; + uint16 *t; + + if (BG.TileSizeH == 8) + { + if (HTile > 31) + t = b2 + (HTile & 0x1f); + else + t = b1 + HTile; + } + else + { + if (HTile > 63) + t = b2 + ((HTile >> 1) & 0x1f); + else + t = b1 + (HTile >> 1); + } + + uint32 Width = Right - Left; + + if (HPos & 7) + { + uint32 l = HPos & 7; + uint32 w = 8 - l; + if (w > Width) + w = Width; + + Offset -= l * PixWidth; + Tile = READ_WORD(t); + GFX.Z1 = GFX.Z2 = (Tile & 0x2000) ? Zh : Zl; + + if (BG.TileSizeV == 16) + Tile = TILE_PLUS(Tile, ((Tile & V_FLIP) ? t2 : t1)); + + if (BG.TileSizeH == 8) + { + DrawClippedTile(Tile, Offset, l, w, VirtAlign, Lines); + t++; + if (HTile == 31) + t = b2; + else + if (HTile == 63) + t = b1; + } + else + { + if (!(Tile & H_FLIP)) + DrawClippedTile(TILE_PLUS(Tile, (HTile & 1)), Offset, l, w, VirtAlign, Lines); + else + DrawClippedTile(TILE_PLUS(Tile, 1 - (HTile & 1)), Offset, l, w, VirtAlign, Lines); + t += HTile & 1; + if (HTile == 63) + t = b2; + else + if (HTile == 127) + t = b1; + } + + HTile++; + Offset += 8 * PixWidth; + Width -= w; + } + + while (Width >= 8) + { + Tile = READ_WORD(t); + GFX.Z1 = GFX.Z2 = (Tile & 0x2000) ? Zh : Zl; + + if (BG.TileSizeV == 16) + Tile = TILE_PLUS(Tile, ((Tile & V_FLIP) ? t2 : t1)); + + if (BG.TileSizeH == 8) + { + DrawTile(Tile, Offset, VirtAlign, Lines); + t++; + if (HTile == 31) + t = b2; + else + if (HTile == 63) + t = b1; + } + else + { + if (!(Tile & H_FLIP)) + DrawTile(TILE_PLUS(Tile, (HTile & 1)), Offset, VirtAlign, Lines); + else + DrawTile(TILE_PLUS(Tile, 1 - (HTile & 1)), Offset, VirtAlign, Lines); + t += HTile & 1; + if (HTile == 63) + t = b2; + else + if (HTile == 127) + t = b1; + } + + HTile++; + Offset += 8 * PixWidth; + Width -= 8; + } + + if (Width) + { + Tile = READ_WORD(t); + GFX.Z1 = GFX.Z2 = (Tile & 0x2000) ? Zh : Zl; + + if (BG.TileSizeV == 16) + Tile = TILE_PLUS(Tile, ((Tile & V_FLIP) ? t2 : t1)); + + if (BG.TileSizeH == 8) + DrawClippedTile(Tile, Offset, 0, Width, VirtAlign, Lines); + else + { + if (!(Tile & H_FLIP)) + DrawClippedTile(TILE_PLUS(Tile, (HTile & 1)), Offset, 0, Width, VirtAlign, Lines); + else + DrawClippedTile(TILE_PLUS(Tile, 1 - (HTile & 1)), Offset, 0, Width, VirtAlign, Lines); + } + } + } + } +} + +static void DrawBackgroundMosaic (int bg, uint8 Zh, uint8 Zl) +{ + BG.TileAddress = PPU.BG[bg].NameBase << 1; + + uint32 Tile; + uint16 *SC0, *SC1, *SC2, *SC3; + + SC0 = (uint16 *) &Memory.VRAM[PPU.BG[bg].SCBase << 1]; + SC1 = (PPU.BG[bg].SCSize & 1) ? SC0 + 1024 : SC0; + if (SC1 >= (uint16 *) (Memory.VRAM + 0x10000)) + SC1 -= 0x8000; + SC2 = (PPU.BG[bg].SCSize & 2) ? SC1 + 1024 : SC0; + if (SC2 >= (uint16 *) (Memory.VRAM + 0x10000)) + SC2 -= 0x8000; + SC3 = (PPU.BG[bg].SCSize & 1) ? SC2 + 1024 : SC2; + if (SC3 >= (uint16 *) (Memory.VRAM + 0x10000)) + SC3 -= 0x8000; + + int Lines; + int OffsetMask = (BG.TileSizeH == 16) ? 0x3ff : 0x1ff; + int OffsetShift = (BG.TileSizeV == 16) ? 4 : 3; + int PixWidth = IPPU.DoubleWidthPixels ? 2 : 1; + bool8 HiresInterlace = IPPU.Interlace && IPPU.DoubleWidthPixels; + + void (*DrawPix) (uint32, uint32, uint32, uint32, uint32, uint32); + + int MosaicStart = ((uint32) GFX.StartY - PPU.MosaicStart) % PPU.Mosaic; + + for (int clip = 0; clip < GFX.Clip[bg].Count; clip++) + { + GFX.ClipColors = !(GFX.Clip[bg].DrawMode[clip] & 1); + + if (BG.EnableMath && (GFX.Clip[bg].DrawMode[clip] & 2)) + DrawPix = GFX.DrawMosaicPixelMath; + else + DrawPix = GFX.DrawMosaicPixelNomath; + + for (uint32 Y = GFX.StartY - MosaicStart; Y <= GFX.EndY; Y += PPU.Mosaic) + { + uint32 Y2 = HiresInterlace ? Y * 2 : Y; + uint32 VOffset = LineData[Y].BG[bg].VOffset + (HiresInterlace ? 1 : 0); + uint32 HOffset = LineData[Y].BG[bg].HOffset; + + Lines = PPU.Mosaic - MosaicStart; + if (Y + MosaicStart + Lines > GFX.EndY) + Lines = GFX.EndY - Y - MosaicStart + 1; + + int VirtAlign = (((Y2 + VOffset) & 7) >> (HiresInterlace ? 1 : 0)) << 3; + + uint32 t1, t2; + uint32 TilemapRow = (VOffset + Y2) >> OffsetShift; + BG.InterlaceLine = ((VOffset + Y2) & 1) << 3; + + if ((VOffset + Y2) & 8) + { + t1 = 16; + t2 = 0; + } + else + { + t1 = 0; + t2 = 16; + } + + uint16 *b1, *b2; + + if (TilemapRow & 0x20) + { + b1 = SC2; + b2 = SC3; + } + else + { + b1 = SC0; + b2 = SC1; + } + + b1 += (TilemapRow & 0x1f) << 5; + b2 += (TilemapRow & 0x1f) << 5; + + uint32 Left = GFX.Clip[bg].Left[clip]; + uint32 Right = GFX.Clip[bg].Right[clip]; + uint32 Offset = Left * PixWidth + (Y + MosaicStart) * GFX.PPL; + uint32 HPos = (HOffset + Left - (Left % PPU.Mosaic)) & OffsetMask; + uint32 HTile = HPos >> 3; + uint16 *t; + + if (BG.TileSizeH == 8) + { + if (HTile > 31) + t = b2 + (HTile & 0x1f); + else + t = b1 + HTile; + } + else + { + if (HTile > 63) + t = b2 + ((HTile >> 1) & 0x1f); + else + t = b1 + (HTile >> 1); + } + + uint32 Width = Right - Left; + + HPos &= 7; + + while (Left < Right) + { + uint32 w = PPU.Mosaic - (Left % PPU.Mosaic); + if (w > Width) + w = Width; + + Tile = READ_WORD(t); + GFX.Z1 = GFX.Z2 = (Tile & 0x2000) ? Zh : Zl; + + if (BG.TileSizeV == 16) + Tile = TILE_PLUS(Tile, ((Tile & V_FLIP) ? t2 : t1)); + + if (BG.TileSizeH == 8) + DrawPix(Tile, Offset, VirtAlign, HPos & 7, w, Lines); + else + { + if (!(Tile & H_FLIP)) + DrawPix(TILE_PLUS(Tile, (HTile & 1)), Offset, VirtAlign, HPos & 7, w, Lines); + else + DrawPix(TILE_PLUS(Tile, 1 - (HTile & 1)), Offset, VirtAlign, HPos & 7, w, Lines); + } + + HPos += PPU.Mosaic; + + while (HPos >= 8) + { + HPos -= 8; + + if (BG.TileSizeH == 8) + { + t++; + if (HTile == 31) + t = b2; + else + if (HTile == 63) + t = b1; + } + else + { + t += HTile & 1; + if (HTile == 63) + t = b2; + else + if (HTile == 127) + t = b1; + } + + HTile++; + } + + Offset += w * PixWidth; + Width -= w; + Left += w; + } + + MosaicStart = 0; + } + } +} + +static void DrawBackgroundOffset (int bg, uint8 Zh, uint8 Zl, int VOffOff) +{ + BG.TileAddress = PPU.BG[bg].NameBase << 1; + + uint32 Tile; + uint16 *SC0, *SC1, *SC2, *SC3; + uint16 *BPS0, *BPS1, *BPS2, *BPS3; + + BPS0 = (uint16 *) &Memory.VRAM[PPU.BG[2].SCBase << 1]; + BPS1 = (PPU.BG[2].SCSize & 1) ? BPS0 + 1024 : BPS0; + if (BPS1 >= (uint16 *) (Memory.VRAM + 0x10000)) + BPS1 -= 0x8000; + BPS2 = (PPU.BG[2].SCSize & 2) ? BPS1 + 1024 : BPS0; + if (BPS2 >= (uint16 *) (Memory.VRAM + 0x10000)) + BPS2 -= 0x8000; + BPS3 = (PPU.BG[2].SCSize & 1) ? BPS2 + 1024 : BPS2; + if (BPS3 >= (uint16 *) (Memory.VRAM + 0x10000)) + BPS3 -= 0x8000; + + SC0 = (uint16 *) &Memory.VRAM[PPU.BG[bg].SCBase << 1]; + SC1 = (PPU.BG[bg].SCSize & 1) ? SC0 + 1024 : SC0; + if (SC1 >= (uint16 *) (Memory.VRAM + 0x10000)) + SC1 -= 0x8000; + SC2 = (PPU.BG[bg].SCSize & 2) ? SC1 + 1024 : SC0; + if (SC2 >= (uint16 *) (Memory.VRAM + 0x10000)) + SC2 -= 0x8000; + SC3 = (PPU.BG[bg].SCSize & 1) ? SC2 + 1024 : SC2; + if (SC3 >= (uint16 *) (Memory.VRAM + 0x10000)) + SC3 -= 0x8000; + + int OffsetMask = (BG.TileSizeH == 16) ? 0x3ff : 0x1ff; + int OffsetShift = (BG.TileSizeV == 16) ? 4 : 3; + int Offset2Mask = (BG.OffsetSizeH == 16) ? 0x3ff : 0x1ff; + int Offset2Shift = (BG.OffsetSizeV == 16) ? 4 : 3; + int OffsetEnableMask = 0x2000 << bg; + int PixWidth = IPPU.DoubleWidthPixels ? 2 : 1; + bool8 HiresInterlace = IPPU.Interlace && IPPU.DoubleWidthPixels; + + void (*DrawTile) (uint32, uint32, uint32, uint32); + void (*DrawClippedTile) (uint32, uint32, uint32, uint32, uint32, uint32); + + for (int clip = 0; clip < GFX.Clip[bg].Count; clip++) + { + GFX.ClipColors = !(GFX.Clip[bg].DrawMode[clip] & 1); + + if (BG.EnableMath && (GFX.Clip[bg].DrawMode[clip] & 2)) + { + DrawTile = GFX.DrawTileMath; + DrawClippedTile = GFX.DrawClippedTileMath; + } + else + { + DrawTile = GFX.DrawTileNomath; + DrawClippedTile = GFX.DrawClippedTileNomath; + } + + for (uint32 Y = GFX.StartY; Y <= GFX.EndY; Y++) + { + uint32 Y2 = HiresInterlace ? Y * 2 + GFX.InterlaceFrame : Y; + uint32 VOff = LineData[Y].BG[2].VOffset - 1; + uint32 HOff = LineData[Y].BG[2].HOffset; + uint32 HOffsetRow = VOff >> Offset2Shift; + uint32 VOffsetRow = (VOff + VOffOff) >> Offset2Shift; + uint16 *s, *s1, *s2; + + if (HOffsetRow & 0x20) + { + s1 = BPS2; + s2 = BPS3; + } + else + { + s1 = BPS0; + s2 = BPS1; + } + + s1 += (HOffsetRow & 0x1f) << 5; + s2 += (HOffsetRow & 0x1f) << 5; + s = ((VOffsetRow & 0x20) ? BPS2 : BPS0) + ((VOffsetRow & 0x1f) << 5); + int32 VOffsetOffset = s - s1; + + uint32 Left = GFX.Clip[bg].Left[clip]; + uint32 Right = GFX.Clip[bg].Right[clip]; + uint32 Offset = Left * PixWidth + Y * GFX.PPL; + uint32 LineHOffset = LineData[Y].BG[bg].HOffset; + bool8 left_edge = (Left < (8 - (LineHOffset & 7))); + uint32 Width = Right - Left; + + while (Left < Right) + { + uint32 VOffset, HOffset; + + if (left_edge) + { + // SNES cannot do OPT for leftmost tile column + VOffset = LineData[Y].BG[bg].VOffset; + HOffset = LineHOffset; + left_edge = FALSE; + } + else + { + int HOffTile = ((HOff + Left - 1) & Offset2Mask) >> 3; + + if (BG.OffsetSizeH == 8) + { + if (HOffTile > 31) + s = s2 + (HOffTile & 0x1f); + else + s = s1 + HOffTile; + } + else + { + if (HOffTile > 63) + s = s2 + ((HOffTile >> 1) & 0x1f); + else + s = s1 + (HOffTile >> 1); + } + + uint16 HCellOffset = READ_WORD(s); + uint16 VCellOffset; + + if (VOffOff) + VCellOffset = READ_WORD(s + VOffsetOffset); + else + { + if (HCellOffset & 0x8000) + { + VCellOffset = HCellOffset; + HCellOffset = 0; + } + else + VCellOffset = 0; + } + + if (VCellOffset & OffsetEnableMask) + VOffset = VCellOffset + 1; + else + VOffset = LineData[Y].BG[bg].VOffset; + + if (HCellOffset & OffsetEnableMask) + HOffset = (HCellOffset & ~7) | (LineHOffset & 7); + else + HOffset = LineHOffset; + } + + if (HiresInterlace) + VOffset++; + + uint32 t1, t2; + int VirtAlign = (((Y2 + VOffset) & 7) >> (HiresInterlace ? 1 : 0)) << 3; + int TilemapRow = (VOffset + Y2) >> OffsetShift; + BG.InterlaceLine = ((VOffset + Y2) & 1) << 3; + + if ((VOffset + Y2) & 8) + { + t1 = 16; + t2 = 0; + } + else + { + t1 = 0; + t2 = 16; + } + + uint16 *b1, *b2; + + if (TilemapRow & 0x20) + { + b1 = SC2; + b2 = SC3; + } + else + { + b1 = SC0; + b2 = SC1; + } + + b1 += (TilemapRow & 0x1f) << 5; + b2 += (TilemapRow & 0x1f) << 5; + + uint32 HPos = (HOffset + Left) & OffsetMask; + uint32 HTile = HPos >> 3; + uint16 *t; + + if (BG.TileSizeH == 8) + { + if (HTile > 31) + t = b2 + (HTile & 0x1f); + else + t = b1 + HTile; + } + else + { + if (HTile > 63) + t = b2 + ((HTile >> 1) & 0x1f); + else + t = b1 + (HTile >> 1); + } + + uint32 l = HPos & 7; + uint32 w = 8 - l; + if (w > Width) + w = Width; + + Offset -= l * PixWidth; + Tile = READ_WORD(t); + GFX.Z1 = GFX.Z2 = (Tile & 0x2000) ? Zh : Zl; + + if (BG.TileSizeV == 16) + Tile = TILE_PLUS(Tile, ((Tile & V_FLIP) ? t2 : t1)); + + if (BG.TileSizeH == 8) + { + DrawClippedTile(Tile, Offset, l, w, VirtAlign, 1); + } + else + { + if (!(Tile & H_FLIP)) + DrawClippedTile(TILE_PLUS(Tile, (HTile & 1)), Offset, l, w, VirtAlign, 1); + else + DrawClippedTile(TILE_PLUS(Tile, 1 - (HTile & 1)), Offset, l, w, VirtAlign, 1); + } + + Left += w; + Offset += 8 * PixWidth; + Width -= w; + } + } + } +} + +static void DrawBackgroundOffsetMosaic (int bg, uint8 Zh, uint8 Zl, int VOffOff) +{ + BG.TileAddress = PPU.BG[bg].NameBase << 1; + + uint32 Tile; + uint16 *SC0, *SC1, *SC2, *SC3; + uint16 *BPS0, *BPS1, *BPS2, *BPS3; + + BPS0 = (uint16 *) &Memory.VRAM[PPU.BG[2].SCBase << 1]; + BPS1 = (PPU.BG[2].SCSize & 1) ? BPS0 + 1024 : BPS0; + if (BPS1 >= (uint16 *) (Memory.VRAM + 0x10000)) + BPS1 -= 0x8000; + BPS2 = (PPU.BG[2].SCSize & 2) ? BPS1 + 1024 : BPS0; + if (BPS2 >= (uint16 *) (Memory.VRAM + 0x10000)) + BPS2 -= 0x8000; + BPS3 = (PPU.BG[2].SCSize & 1) ? BPS2 + 1024 : BPS2; + if (BPS3 >= (uint16 *) (Memory.VRAM + 0x10000)) + BPS3 -= 0x8000; + + SC0 = (uint16 *) &Memory.VRAM[PPU.BG[bg].SCBase << 1]; + SC1 = (PPU.BG[bg].SCSize & 1) ? SC0 + 1024 : SC0; + if (SC1 >= (uint16 *) (Memory.VRAM + 0x10000)) + SC1 -= 0x8000; + SC2 = (PPU.BG[bg].SCSize & 2) ? SC1 + 1024 : SC0; + if (SC2 >= (uint16 *) (Memory.VRAM + 0x10000)) + SC2 -= 0x8000; + SC3 = (PPU.BG[bg].SCSize & 1) ? SC2 + 1024 : SC2; + if (SC3 >= (uint16 *) (Memory.VRAM + 0x10000)) + SC3 -= 0x8000; + + int Lines; + int OffsetMask = (BG.TileSizeH == 16) ? 0x3ff : 0x1ff; + int OffsetShift = (BG.TileSizeV == 16) ? 4 : 3; + int Offset2Mask = (BG.OffsetSizeH == 16) ? 0x3ff : 0x1ff; + int Offset2Shift = (BG.OffsetSizeV == 16) ? 4 : 3; + int OffsetEnableMask = 0x2000 << bg; + int PixWidth = IPPU.DoubleWidthPixels ? 2 : 1; + bool8 HiresInterlace = IPPU.Interlace && IPPU.DoubleWidthPixels; + + void (*DrawPix) (uint32, uint32, uint32, uint32, uint32, uint32); + + int MosaicStart = ((uint32) GFX.StartY - PPU.MosaicStart) % PPU.Mosaic; + + for (int clip = 0; clip < GFX.Clip[bg].Count; clip++) + { + GFX.ClipColors = !(GFX.Clip[bg].DrawMode[clip] & 1); + + if (BG.EnableMath && (GFX.Clip[bg].DrawMode[clip] & 2)) + DrawPix = GFX.DrawMosaicPixelMath; + else + DrawPix = GFX.DrawMosaicPixelNomath; + + for (uint32 Y = GFX.StartY - MosaicStart; Y <= GFX.EndY; Y += PPU.Mosaic) + { + uint32 Y2 = HiresInterlace ? Y * 2 : Y; + uint32 VOff = LineData[Y].BG[2].VOffset - 1; + uint32 HOff = LineData[Y].BG[2].HOffset; + + Lines = PPU.Mosaic - MosaicStart; + if (Y + MosaicStart + Lines > GFX.EndY) + Lines = GFX.EndY - Y - MosaicStart + 1; + + uint32 HOffsetRow = VOff >> Offset2Shift; + uint32 VOffsetRow = (VOff + VOffOff) >> Offset2Shift; + uint16 *s, *s1, *s2; + + if (HOffsetRow & 0x20) + { + s1 = BPS2; + s2 = BPS3; + } + else + { + s1 = BPS0; + s2 = BPS1; + } + + s1 += (HOffsetRow & 0x1f) << 5; + s2 += (HOffsetRow & 0x1f) << 5; + s = ((VOffsetRow & 0x20) ? BPS2 : BPS0) + ((VOffsetRow & 0x1f) << 5); + int32 VOffsetOffset = s - s1; + + uint32 Left = GFX.Clip[bg].Left[clip]; + uint32 Right = GFX.Clip[bg].Right[clip]; + uint32 Offset = Left * PixWidth + (Y + MosaicStart) * GFX.PPL; + uint32 LineHOffset = LineData[Y].BG[bg].HOffset; + bool8 left_edge = (Left < (8 - (LineHOffset & 7))); + uint32 Width = Right - Left; + + while (Left < Right) + { + uint32 VOffset, HOffset; + + if (left_edge) + { + // SNES cannot do OPT for leftmost tile column + VOffset = LineData[Y].BG[bg].VOffset; + HOffset = LineHOffset; + left_edge = FALSE; + } + else + { + int HOffTile = ((HOff + Left - 1) & Offset2Mask) >> 3; + + if (BG.OffsetSizeH == 8) + { + if (HOffTile > 31) + s = s2 + (HOffTile & 0x1f); + else + s = s1 + HOffTile; + } + else + { + if (HOffTile > 63) + s = s2 + ((HOffTile >> 1) & 0x1f); + else + s = s1 + (HOffTile >> 1); + } + + uint16 HCellOffset = READ_WORD(s); + uint16 VCellOffset; + + if (VOffOff) + VCellOffset = READ_WORD(s + VOffsetOffset); + else + { + if (HCellOffset & 0x8000) + { + VCellOffset = HCellOffset; + HCellOffset = 0; + } + else + VCellOffset = 0; + } + + if (VCellOffset & OffsetEnableMask) + VOffset = VCellOffset + 1; + else + VOffset = LineData[Y].BG[bg].VOffset; + + if (HCellOffset & OffsetEnableMask) + HOffset = (HCellOffset & ~7) | (LineHOffset & 7); + else + HOffset = LineHOffset; + } + + if (HiresInterlace) + VOffset++; + + uint32 t1, t2; + int VirtAlign = (((Y2 + VOffset) & 7) >> (HiresInterlace ? 1 : 0)) << 3; + int TilemapRow = (VOffset + Y2) >> OffsetShift; + BG.InterlaceLine = ((VOffset + Y2) & 1) << 3; + + if ((VOffset + Y2) & 8) + { + t1 = 16; + t2 = 0; + } + else + { + t1 = 0; + t2 = 16; + } + + uint16 *b1, *b2; + + if (TilemapRow & 0x20) + { + b1 = SC2; + b2 = SC3; + } + else + { + b1 = SC0; + b2 = SC1; + } + + b1 += (TilemapRow & 0x1f) << 5; + b2 += (TilemapRow & 0x1f) << 5; + + uint32 HPos = (HOffset + Left - (Left % PPU.Mosaic)) & OffsetMask; + uint32 HTile = HPos >> 3; + uint16 *t; + + if (BG.TileSizeH == 8) + { + if (HTile > 31) + t = b2 + (HTile & 0x1f); + else + t = b1 + HTile; + } + else + { + if (HTile > 63) + t = b2 + ((HTile >> 1) & 0x1f); + else + t = b1 + (HTile >> 1); + } + + uint32 w = PPU.Mosaic - (Left % PPU.Mosaic); + if (w > Width) + w = Width; + + Tile = READ_WORD(t); + GFX.Z1 = GFX.Z2 = (Tile & 0x2000) ? Zh : Zl; + + if (BG.TileSizeV == 16) + Tile = TILE_PLUS(Tile, ((Tile & V_FLIP) ? t2 : t1)); + + if (BG.TileSizeH == 8) + DrawPix(Tile, Offset, VirtAlign, HPos & 7, w, Lines); + else + { + if (!(Tile & H_FLIP)) + DrawPix(TILE_PLUS(Tile, (HTile & 1)), Offset, VirtAlign, HPos & 7, w, Lines); + else + if (!(Tile & V_FLIP)) + DrawPix(TILE_PLUS(Tile, 1 - (HTile & 1)), Offset, VirtAlign, HPos & 7, w, Lines); + } + + Left += w; + Offset += w * PixWidth; + Width -= w; + } + + MosaicStart = 0; + } + } +} + +static inline void DrawBackgroundMode7 (int bg, void (*DrawMath) (uint32, uint32, int), void (*DrawNomath) (uint32, uint32, int), int D) +{ + for (int clip = 0; clip < GFX.Clip[bg].Count; clip++) + { + GFX.ClipColors = !(GFX.Clip[bg].DrawMode[clip] & 1); + + if (BG.EnableMath && (GFX.Clip[bg].DrawMode[clip] & 2)) + DrawMath(GFX.Clip[bg].Left[clip], GFX.Clip[bg].Right[clip], D); + else + DrawNomath(GFX.Clip[bg].Left[clip], GFX.Clip[bg].Right[clip], D); + } +} + +static inline void DrawBackdrop (void) +{ + uint32 Offset = GFX.StartY * GFX.PPL; + + for (int clip = 0; clip < GFX.Clip[5].Count; clip++) + { + GFX.ClipColors = !(GFX.Clip[5].DrawMode[clip] & 1); + + if (BG.EnableMath && (GFX.Clip[5].DrawMode[clip] & 2)) + GFX.DrawBackdropMath(Offset, GFX.Clip[5].Left[clip], GFX.Clip[5].Right[clip]); + else + GFX.DrawBackdropNomath(Offset, GFX.Clip[5].Left[clip], GFX.Clip[5].Right[clip]); + } +} + +void S9xReRefresh (void) +{ + // Be careful when calling this function from the thread other than the emulation one... + // Here it's assumed no drawing occurs from the emulation thread when Settings.Paused is TRUE. + if (Settings.Paused) + S9xDeinitUpdate(IPPU.RenderedScreenWidth, IPPU.RenderedScreenHeight); +} + +void S9xSetInfoString (const char *string) +{ + if (Settings.InitialInfoStringTimeout > 0) + { + GFX.InfoString = string; + GFX.InfoStringTimeout = Settings.InitialInfoStringTimeout; + S9xReRefresh(); + } +} + +void S9xDisplayChar (uint16 *s, uint8 c) +{ + const uint16 black = BUILD_PIXEL(0, 0, 0); + + int line = ((c - 32) >> 4) * font_height; + int offset = ((c - 32) & 15) * font_width; + + for (int h = 0; h < font_height; h++, line++, s += GFX.RealPPL - font_width) + { + for (int w = 0; w < font_width; w++, s++) + { + char p = font[line][offset + w]; + + if (p == '#') + *s = Settings.DisplayColor; + else + if (p == '.') + *s = black; + } + } +} + +static void DisplayStringFromBottom (const char *string, int linesFromBottom, int pixelsFromLeft, bool allowWrap) +{ + if (linesFromBottom <= 0) + linesFromBottom = 1; + + uint16 *dst = GFX.Screen + (IPPU.RenderedScreenHeight - font_height * linesFromBottom) * GFX.RealPPL + pixelsFromLeft; + + int len = strlen(string); + int max_chars = IPPU.RenderedScreenWidth / (font_width - 1); + int char_count = 0; + + for (int i = 0 ; i < len ; i++, char_count++) + { + if (char_count >= max_chars || (uint8) string[i] < 32) + { + if (!allowWrap) + break; + + dst += font_height * GFX.RealPPL - (font_width - 1) * max_chars; + if (dst >= GFX.Screen + IPPU.RenderedScreenHeight * GFX.RealPPL) + break; + + char_count -= max_chars; + } + + if ((uint8) string[i] < 32) + continue; + + S9xDisplayChar(dst, string[i]); + dst += font_width - 1; + } +} + +static void DisplayFrameRate (void) +{ + char string[10]; + static uint32 lastFrameCount = 0, calcFps = 0; + static time_t lastTime = time(NULL); + + time_t currTime = time(NULL); + if (lastTime != currTime) { + if (lastFrameCount < IPPU.TotalEmulatedFrames) { + calcFps = (IPPU.TotalEmulatedFrames - lastFrameCount) / (uint32)(currTime - lastTime); + } + lastTime = currTime; + lastFrameCount = IPPU.TotalEmulatedFrames; + } + sprintf(string, "%u fps", calcFps); + S9xDisplayString(string, 2, IPPU.RenderedScreenWidth - (font_width - 1) * strlen(string) - 1, false); + +#ifdef DEBUGGER + const int len = 8; + sprintf(string, "%02d/%02d %02d", (int) IPPU.DisplayedRenderedFrameCount, (int) Memory.ROMFramesPerSecond, (int) IPPU.FrameCount); +#else + const int len = 5; + sprintf(string, "%02d/%02d", (int) IPPU.DisplayedRenderedFrameCount, (int) Memory.ROMFramesPerSecond); +#endif + + S9xDisplayString(string, 1, IPPU.RenderedScreenWidth - (font_width - 1) * len - 1, false); +} + +static void DisplayPressedKeys (void) +{ + static char KeyMap[] = { '0', '1', '2', 'R', 'L', 'X', 'A', '>', '<', 'v', '^', 'S', 's', 'Y', 'B' }; + static int KeyOrder[] = { 8, 10, 7, 9, 0, 6, 14, 13, 5, 1, 4, 3, 2, 11, 12 }; // < ^ > v A B Y X L R S s + + enum controllers controller; + int line = 1; + int8 ids[4]; + char string[255]; + + for (int port = 0; port < 2; port++) + { + S9xGetController(port, &controller, &ids[0], &ids[1], &ids[2], &ids[3]); + + switch (controller) + { + case CTL_MOUSE: + { + uint8 buf[5], *p = buf; + MovieGetMouse(port, buf); + int16 x = READ_WORD(p); + int16 y = READ_WORD(p + 2); + uint8 buttons = buf[4]; + sprintf(string, "#%d %d: (%03d,%03d) %c%c", port, ids[0], x, y, + (buttons & 0x40) ? 'L' : ' ', (buttons & 0x80) ? 'R' : ' '); + S9xDisplayString(string, line++, 1, false); + break; + } + + case CTL_SUPERSCOPE: + { + uint8 buf[6], *p = buf; + MovieGetScope(port, buf); + int16 x = READ_WORD(p); + int16 y = READ_WORD(p + 2); + uint8 buttons = buf[4]; + sprintf(string, "#%d %d: (%03d,%03d) %c%c%c%c", port, ids[0], x, y, + (buttons & 0x80) ? 'F' : ' ', (buttons & 0x40) ? 'C' : ' ', + (buttons & 0x20) ? 'T' : ' ', (buttons & 0x10) ? 'P' : ' '); + S9xDisplayString(string, line++, 1, false); + break; + } + + case CTL_JUSTIFIER: + { + uint8 buf[11], *p = buf; + MovieGetJustifier(port, buf); + int16 x1 = READ_WORD(p); + int16 x2 = READ_WORD(p + 2); + int16 y1 = READ_WORD(p + 4); + int16 y2 = READ_WORD(p + 6); + uint8 buttons = buf[8]; + bool8 offscreen1 = buf[9]; + bool8 offscreen2 = buf[10]; + sprintf(string, "#%d %d: (%03d,%03d) %c%c%c / (%03d,%03d) %c%c%c", port, ids[0], + x1, y1, (buttons & 0x80) ? 'T' : ' ', (buttons & 0x20) ? 'S' : ' ', offscreen1 ? 'O' : ' ', + x2, y2, (buttons & 0x40) ? 'T' : ' ', (buttons & 0x10) ? 'S' : ' ', offscreen2 ? 'O' : ' '); + S9xDisplayString(string, line++, 1, false); + break; + } + + case CTL_JOYPAD: + { + sprintf(string, "#%d %d: ", port, ids[0]); + uint16 pad = MovieGetJoypad(ids[0]); + for (int i = 0; i < 15; i++) + { + int j = KeyOrder[i]; + int mask = (1 << (j + 1)); + string[6 + i]= (pad & mask) ? KeyMap[j] : ' '; + } + + S9xDisplayString(string, line++, 1, false); + break; + } + + case CTL_MP5: + { + for (int n = 0; n < 4; n++) + { + if (ids[n] != -1) + { + sprintf(string, "#%d %d: ", port, ids[n]); + uint16 pad = MovieGetJoypad(ids[n]); + for (int i = 0; i < 15; i++) + { + int j = KeyOrder[i]; + int mask = (1 << (j + 1)); + string[6 + i]= (pad & mask) ? KeyMap[j] : ' '; + } + + S9xDisplayString(string, line++, 1, false); + } + } + + break; + } + + case CTL_NONE: + { + sprintf(string, "#%d -", port); + S9xDisplayString(string, line++, 1, false); + break; + } + } + } +} + +static void DisplayWatchedAddresses (void) +{ + for (unsigned int i = 0; i < sizeof(watches) / sizeof(watches[0]); i++) + { + if (!watches[i].on) + break; + + int32 displayNumber = 0; + char buf[32]; + + for (int r = 0; r < watches[i].size; r++) + displayNumber += (Cheat.CWatchRAM[(watches[i].address - 0x7E0000) + r]) << (8 * r); + + if (watches[i].format == 1) + sprintf(buf, "%s,%du = %u", watches[i].desc, watches[i].size, (unsigned int) displayNumber); + else + if (watches[i].format == 3) + sprintf(buf, "%s,%dx = %X", watches[i].desc, watches[i].size, (unsigned int) displayNumber); + else // signed + { + if (watches[i].size == 1) + displayNumber = (int32) ((int8) displayNumber); + else + if (watches[i].size == 2) + displayNumber = (int32) ((int16) displayNumber); + else + if (watches[i].size == 3) + if (displayNumber >= 8388608) + displayNumber -= 16777216; + + sprintf(buf, "%s,%ds = %d", watches[i].desc, watches[i].size, (int) displayNumber); + } + + S9xDisplayString(buf, 6 + i, 1, false); + } +} + +void S9xDisplayMessages (uint16 *screen, int ppl, int width, int height, int scale) +{ + if (Settings.DisplayFrameRate) + DisplayFrameRate(); + + if (Settings.DisplayWatchedAddresses) + DisplayWatchedAddresses(); + + if (Settings.DisplayPressedKeys) + DisplayPressedKeys(); + + if (Settings.DisplayMovieFrame && S9xMovieActive()) + S9xDisplayString(GFX.FrameDisplayString, 1, 1, false); + + if (GFX.InfoString && *GFX.InfoString) + S9xDisplayString(GFX.InfoString, 5, 1, true); +} + +static uint16 get_crosshair_color (uint8 color) +{ + switch (color & 15) + { + case 0: return (BUILD_PIXEL( 0, 0, 0)); // transparent, shouldn't be used + case 1: return (BUILD_PIXEL( 0, 0, 0)); // Black + case 2: return (BUILD_PIXEL( 8, 8, 8)); // 25Grey + case 3: return (BUILD_PIXEL(16, 16, 16)); // 50Grey + case 4: return (BUILD_PIXEL(23, 23, 23)); // 75Grey + case 5: return (BUILD_PIXEL(31, 31, 31)); // White + case 6: return (BUILD_PIXEL(31, 0, 0)); // Red + case 7: return (BUILD_PIXEL(31, 16, 0)); // Orange + case 8: return (BUILD_PIXEL(31, 31, 0)); // Yellow + case 9: return (BUILD_PIXEL( 0, 31, 0)); // Green + case 10: return (BUILD_PIXEL( 0, 31, 31)); // Cyan + case 11: return (BUILD_PIXEL( 0, 23, 31)); // Sky + case 12: return (BUILD_PIXEL( 0, 0, 31)); // Blue + case 13: return (BUILD_PIXEL(23, 0, 31)); // Violet + case 14: return (BUILD_PIXEL(31, 0, 31)); // Magenta + case 15: return (BUILD_PIXEL(31, 0, 16)); // Purple + } + + return (0); +} + +void S9xDrawCrosshair (const char *crosshair, uint8 fgcolor, uint8 bgcolor, int16 x, int16 y) +{ + if (!crosshair) + return; + + int16 r, rx = 1, c, cx = 1, W = SNES_WIDTH, H = PPU.ScreenHeight; + uint16 fg, bg; + + x -= 7; + y -= 7; + + if (IPPU.DoubleWidthPixels) { cx = 2; x *= 2; W *= 2; } + if (IPPU.DoubleHeightPixels) { rx = 2; y *= 2; H *= 2; } + + fg = get_crosshair_color(fgcolor); + bg = get_crosshair_color(bgcolor); + + // XXX: FIXME: why does it crash without this on Linux port? There are no out-of-bound writes without it... +#if (defined(__unix) || defined(__linux) || defined(__sun) || defined(__DJGPP)) + if (x >= 0 && y >= 0) +#endif + { + uint16 *s = GFX.Screen + y * GFX.RealPPL + x; + + for (r = 0; r < 15 * rx; r++, s += GFX.RealPPL - 15 * cx) + { + if (y + r < 0) + { + s += 15 * cx; + continue; + } + + if (y + r >= H) + break; + + for (c = 0; c < 15 * cx; c++, s++) + { + if (x + c < 0 || s < GFX.Screen) + continue; + + if (x + c >= W) + { + s += 15 * cx - c; + break; + } + + uint8 p = crosshair[(r / rx) * 15 + (c / cx)]; + + if (p == '#' && fgcolor) + *s = (fgcolor & 0x10) ? COLOR_ADD1_2(fg, *s) : fg; + else + if (p == '.' && bgcolor) + *s = (bgcolor & 0x10) ? COLOR_ADD1_2(*s, bg) : bg; + } + } + } +} + +#ifdef GFX_MULTI_FORMAT + +static uint32 BuildPixelRGB565 (uint32, uint32, uint32); +static uint32 BuildPixelRGB555 (uint32, uint32, uint32); +static uint32 BuildPixelBGR565 (uint32, uint32, uint32); +static uint32 BuildPixelBGR555 (uint32, uint32, uint32); +static uint32 BuildPixelGBR565 (uint32, uint32, uint32); +static uint32 BuildPixelGBR555 (uint32, uint32, uint32); +static uint32 BuildPixelRGB5551 (uint32, uint32, uint32); + +static uint32 BuildPixel2RGB565 (uint32, uint32, uint32); +static uint32 BuildPixel2RGB555 (uint32, uint32, uint32); +static uint32 BuildPixel2BGR565 (uint32, uint32, uint32); +static uint32 BuildPixel2BGR555 (uint32, uint32, uint32); +static uint32 BuildPixel2GBR565 (uint32, uint32, uint32); +static uint32 BuildPixel2GBR555 (uint32, uint32, uint32); +static uint32 BuildPixel2RGB5551 (uint32, uint32, uint32); + +static void DecomposePixelRGB565 (uint32, uint32 &, uint32 &, uint32 &); +static void DecomposePixelRGB555 (uint32, uint32 &, uint32 &, uint32 &); +static void DecomposePixelBGR565 (uint32, uint32 &, uint32 &, uint32 &); +static void DecomposePixelBGR555 (uint32, uint32 &, uint32 &, uint32 &); +static void DecomposePixelGBR565 (uint32, uint32 &, uint32 &, uint32 &); +static void DecomposePixelGBR555 (uint32, uint32 &, uint32 &, uint32 &); +static void DecomposePixelRGB5551 (uint32, uint32 &, uint32 &, uint32 &); + +#define _BUILD_PIXEL(F) \ +static uint32 BuildPixel##F (uint32 R, uint32 G, uint32 B) \ +{ \ + return (BUILD_PIXEL_##F(R, G, B)); \ +} \ +\ +static uint32 BuildPixel2##F (uint32 R, uint32 G, uint32 B) \ +{ \ + return (BUILD_PIXEL2_##F(R, G, B)); \ +} \ +\ +static void DecomposePixel##F (uint32 pixel, uint32 &R, uint32 &G, uint32 &B) \ +{ \ + DECOMPOSE_PIXEL_##F(pixel, R, G, B); \ +} + +_BUILD_PIXEL(RGB565) +_BUILD_PIXEL(RGB555) +_BUILD_PIXEL(BGR565) +_BUILD_PIXEL(BGR555) +_BUILD_PIXEL(GBR565) +_BUILD_PIXEL(GBR555) +_BUILD_PIXEL(RGB5551) + +#define _BUILD_SETUP(F) \ +GFX.BuildPixel = BuildPixel##F; \ +GFX.BuildPixel2 = BuildPixel2##F; \ +GFX.DecomposePixel = DecomposePixel##F; \ +RED_LOW_BIT_MASK = RED_LOW_BIT_MASK_##F; \ +GREEN_LOW_BIT_MASK = GREEN_LOW_BIT_MASK_##F; \ +BLUE_LOW_BIT_MASK = BLUE_LOW_BIT_MASK_##F; \ +RED_HI_BIT_MASK = RED_HI_BIT_MASK_##F; \ +GREEN_HI_BIT_MASK = GREEN_HI_BIT_MASK_##F; \ +BLUE_HI_BIT_MASK = BLUE_HI_BIT_MASK_##F; \ +MAX_RED = MAX_RED_##F; \ +MAX_GREEN = MAX_GREEN_##F; \ +MAX_BLUE = MAX_BLUE_##F; \ +SPARE_RGB_BIT_MASK = SPARE_RGB_BIT_MASK_##F; \ +GREEN_HI_BIT = ((MAX_GREEN_##F + 1) >> 1); \ +RGB_LOW_BITS_MASK = (RED_LOW_BIT_MASK_##F | GREEN_LOW_BIT_MASK_##F | BLUE_LOW_BIT_MASK_##F); \ +RGB_HI_BITS_MASK = (RED_HI_BIT_MASK_##F | GREEN_HI_BIT_MASK_##F | BLUE_HI_BIT_MASK_##F); \ +RGB_HI_BITS_MASKx2 = (RED_HI_BIT_MASK_##F | GREEN_HI_BIT_MASK_##F | BLUE_HI_BIT_MASK_##F) << 1; \ +RGB_REMOVE_LOW_BITS_MASK = ~RGB_LOW_BITS_MASK; \ +FIRST_COLOR_MASK = FIRST_COLOR_MASK_##F; \ +SECOND_COLOR_MASK = SECOND_COLOR_MASK_##F; \ +THIRD_COLOR_MASK = THIRD_COLOR_MASK_##F; \ +ALPHA_BITS_MASK = ALPHA_BITS_MASK_##F; \ +FIRST_THIRD_COLOR_MASK = FIRST_COLOR_MASK | THIRD_COLOR_MASK; \ +TWO_LOW_BITS_MASK = RGB_LOW_BITS_MASK | (RGB_LOW_BITS_MASK << 1); \ +HIGH_BITS_SHIFTED_TWO_MASK = ((FIRST_COLOR_MASK | SECOND_COLOR_MASK | THIRD_COLOR_MASK) & ~TWO_LOW_BITS_MASK) >> 2; + +bool8 S9xSetRenderPixelFormat (int format) +{ + GFX.PixelFormat = format; + + switch (format) + { + case RGB565: + _BUILD_SETUP(RGB565) + return (TRUE); + + case RGB555: + _BUILD_SETUP(RGB555) + return (TRUE); + + case BGR565: + _BUILD_SETUP(BGR565) + return (TRUE); + + case BGR555: + _BUILD_SETUP(BGR555) + return (TRUE); + + case GBR565: + _BUILD_SETUP(GBR565) + return (TRUE); + + case GBR555: + _BUILD_SETUP(GBR555) + return (TRUE); + + case RGB5551: + _BUILD_SETUP(RGB5551) + return (TRUE); + + default: + break; + } + + return (FALSE); +} + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/gfx.h b/plugins/snes9x_gx/source/snes9x/gfx.h new file mode 100644 index 00000000..75981cc2 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/gfx.h @@ -0,0 +1,366 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _GFX_H_ +#define _GFX_H_ + +struct SGFX +{ + uint16 *Screen; + uint16 *SubScreen; + uint8 *ZBuffer; + uint8 *SubZBuffer; + uint32 Pitch; + uint32 ScreenSize; + uint16 *S; + uint8 *DB; + uint16 *X2; + uint16 *ZERO; + uint32 RealPPL; // true PPL of Screen buffer + uint32 PPL; // number of pixels on each of Screen buffer + uint32 LinesPerTile; // number of lines in 1 tile (4 or 8 due to interlace) + uint16 *ScreenColors; // screen colors for rendering main + uint16 *RealScreenColors; // screen colors, ignoring color window clipping + uint8 Z1; // depth for comparison + uint8 Z2; // depth to save + uint32 FixedColour; + uint8 DoInterlace; + uint8 InterlaceFrame; + uint32 StartY; + uint32 EndY; + bool8 ClipColors; + uint8 OBJWidths[128]; + uint8 OBJVisibleTiles[128]; + + struct ClipData *Clip; + + struct + { + uint8 RTOFlags; + int16 Tiles; + + struct + { + int8 Sprite; + uint8 Line; + } OBJ[32]; + } OBJLines[SNES_HEIGHT_EXTENDED]; + +#ifdef GFX_MULTI_FORMAT + uint32 PixelFormat; + uint32 (*BuildPixel) (uint32, uint32, uint32); + uint32 (*BuildPixel2) (uint32, uint32, uint32); + void (*DecomposePixel) (uint32, uint32 &, uint32 &, uint32 &); +#endif + + void (*DrawBackdropMath) (uint32, uint32, uint32); + void (*DrawBackdropNomath) (uint32, uint32, uint32); + void (*DrawTileMath) (uint32, uint32, uint32, uint32); + void (*DrawTileNomath) (uint32, uint32, uint32, uint32); + void (*DrawClippedTileMath) (uint32, uint32, uint32, uint32, uint32, uint32); + void (*DrawClippedTileNomath) (uint32, uint32, uint32, uint32, uint32, uint32); + void (*DrawMosaicPixelMath) (uint32, uint32, uint32, uint32, uint32, uint32); + void (*DrawMosaicPixelNomath) (uint32, uint32, uint32, uint32, uint32, uint32); + void (*DrawMode7BG1Math) (uint32, uint32, int); + void (*DrawMode7BG1Nomath) (uint32, uint32, int); + void (*DrawMode7BG2Math) (uint32, uint32, int); + void (*DrawMode7BG2Nomath) (uint32, uint32, int); + + const char *InfoString; + uint32 InfoStringTimeout; + char FrameDisplayString[256]; +}; + +struct SBG +{ + uint8 (*ConvertTile) (uint8 *, uint32, uint32); + uint8 (*ConvertTileFlip) (uint8 *, uint32, uint32); + + uint32 TileSizeH; + uint32 TileSizeV; + uint32 OffsetSizeH; + uint32 OffsetSizeV; + uint32 TileShift; + uint32 TileAddress; + uint32 NameSelect; + uint32 SCBase; + + uint32 StartPalette; + uint32 PaletteShift; + uint32 PaletteMask; + uint8 EnableMath; + uint8 InterlaceLine; + + uint8 *Buffer; + uint8 *BufferFlip; + uint8 *Buffered; + uint8 *BufferedFlip; + bool8 DirectColourMode; +}; + +struct SLineData +{ + struct + { + uint16 VOffset; + uint16 HOffset; + } BG[4]; +}; + +struct SLineMatrixData +{ + short MatrixA; + short MatrixB; + short MatrixC; + short MatrixD; + short CentreX; + short CentreY; + short M7HOFS; + short M7VOFS; +}; + +extern uint16 BlackColourMap[256]; +extern uint16 DirectColourMaps[8][256]; +extern uint8 mul_brightness[16][32]; +extern struct SBG BG; +extern struct SGFX GFX; + +#define H_FLIP 0x4000 +#define V_FLIP 0x8000 +#define BLANK_TILE 2 + +#define COLOR_ADD1_2(C1, C2) \ + ((((((C1) & RGB_REMOVE_LOW_BITS_MASK) + \ + ((C2) & RGB_REMOVE_LOW_BITS_MASK)) >> 1) + \ + ((C1) & (C2) & RGB_LOW_BITS_MASK)) | ALPHA_BITS_MASK) + +#define COLOR_ADD(C1, C2) \ + (GFX.X2[((((C1) & RGB_REMOVE_LOW_BITS_MASK) + \ + ((C2) & RGB_REMOVE_LOW_BITS_MASK)) >> 1) + \ + ((C1) & (C2) & RGB_LOW_BITS_MASK)] | \ + (((C1) ^ (C2)) & RGB_LOW_BITS_MASK)) + +#define COLOR_SUB1_2(C1, C2) \ + GFX.ZERO[(((C1) | RGB_HI_BITS_MASKx2) - \ + ((C2) & RGB_REMOVE_LOW_BITS_MASK)) >> 1] + +inline uint16 COLOR_SUB (uint16 C1, uint16 C2) +{ + uint16 mC1, mC2, v = ALPHA_BITS_MASK; + + mC1 = C1 & FIRST_COLOR_MASK; + mC2 = C2 & FIRST_COLOR_MASK; + if (mC1 > mC2) v += (mC1 - mC2); + + mC1 = C1 & SECOND_COLOR_MASK; + mC2 = C2 & SECOND_COLOR_MASK; + if (mC1 > mC2) v += (mC1 - mC2); + + mC1 = C1 & THIRD_COLOR_MASK; + mC2 = C2 & THIRD_COLOR_MASK; + if (mC1 > mC2) v += (mC1 - mC2); + + return (v); +} + +void S9xStartScreenRefresh (void); +void S9xEndScreenRefresh (void); +void S9xUpdateScreen (void); +void S9xBuildDirectColourMaps (void); +void RenderLine (uint8); +void S9xComputeClipWindows (void); +void S9xDisplayChar (uint16 *, uint8); +// called automatically unless Settings.AutoDisplayMessages is false +void S9xDisplayMessages (uint16 *, int, int, int, int); +#ifdef GFX_MULTI_FORMAT +bool8 S9xSetRenderPixelFormat (int); +#endif + +// external port interface which must be implemented or initialised for each port +bool8 S9xGraphicsInit (void); +void S9xGraphicsDeinit (void); +bool8 S9xInitUpdate (void); +bool8 S9xDeinitUpdate (int, int); +bool8 S9xContinueUpdate (int, int); +void S9xReRefresh (void); +void S9xSetPalette (void); +void S9xSyncSpeed (void); + +// called instead of S9xDisplayString if set to non-NULL +extern void (*S9xCustomDisplayString) (const char *, int, int, bool); + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/globals.cpp b/plugins/snes9x_gx/source/snes9x/globals.cpp new file mode 100644 index 00000000..60d7959f --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/globals.cpp @@ -0,0 +1,399 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#include "snes9x.h" +#include "memmap.h" +#include "dma.h" +#include "apu/apu.h" +#include "fxinst.h" +#include "fxemu.h" +#include "srtc.h" +#include "cheats.h" +#ifdef NETPLAY_SUPPORT +#include "netplay.h" +#endif +#ifdef DEBUGGER +#include "debug.h" +#include "missing.h" +#endif + +struct SCPUState CPU; +struct SICPU ICPU; +struct SRegisters Registers; +struct SPPU PPU; +struct InternalPPU IPPU; +struct SDMA DMA[8]; +struct STimings Timings; +struct SGFX GFX; +struct SBG BG; +struct SLineData LineData[240]; +struct SLineMatrixData LineMatrixData[240]; +struct SDSP0 DSP0; +struct SDSP1 DSP1; +struct SDSP2 DSP2; +struct SDSP3 DSP3; +struct SDSP4 DSP4; +struct SSA1 SA1; +struct SSA1Registers SA1Registers; +struct FxRegs_s GSU; +struct FxInfo_s SuperFX; +struct SST010 ST010; +struct SST011 ST011; +struct SST018 ST018; +struct SOBC1 OBC1; +struct SSPC7110Snapshot s7snap; +struct SSRTCSnapshot srtcsnap; +struct SRTCData RTCData; +struct SBSX BSX; +struct SMulti Multi; +struct SSettings Settings; +struct SSNESGameFixes SNESGameFixes; +#ifdef NETPLAY_SUPPORT +struct SNetPlay NetPlay; +#endif +#ifdef DEBUGGER +struct Missing missing; +#endif +struct SCheatData Cheat; +struct Watch watches[16]; +CMemory Memory; + +char String[513]; +uint8 OpenBus = 0; +uint8 *HDMAMemPointers[8]; +uint16 BlackColourMap[256]; +uint16 DirectColourMaps[8][256]; + +SnesModel M1SNES = { 1, 3, 2 }; +SnesModel M2SNES = { 2, 4, 3 }; +SnesModel *Model = &M1SNES; + +#ifdef GFX_MULTI_FORMAT +uint32 RED_LOW_BIT_MASK = RED_LOW_BIT_MASK_RGB565; +uint32 GREEN_LOW_BIT_MASK = GREEN_LOW_BIT_MASK_RGB565; +uint32 BLUE_LOW_BIT_MASK = BLUE_LOW_BIT_MASK_RGB565; +uint32 RED_HI_BIT_MASK = RED_HI_BIT_MASK_RGB565; +uint32 GREEN_HI_BIT_MASK = GREEN_HI_BIT_MASK_RGB565; +uint32 BLUE_HI_BIT_MASK = BLUE_HI_BIT_MASK_RGB565; +uint32 MAX_RED = MAX_RED_RGB565; +uint32 MAX_GREEN = MAX_GREEN_RGB565; +uint32 MAX_BLUE = MAX_BLUE_RGB565; +uint32 SPARE_RGB_BIT_MASK = SPARE_RGB_BIT_MASK_RGB565; +uint32 GREEN_HI_BIT = (MAX_GREEN_RGB565 + 1) >> 1; +uint32 RGB_LOW_BITS_MASK = (RED_LOW_BIT_MASK_RGB565 | GREEN_LOW_BIT_MASK_RGB565 | BLUE_LOW_BIT_MASK_RGB565); +uint32 RGB_HI_BITS_MASK = (RED_HI_BIT_MASK_RGB565 | GREEN_HI_BIT_MASK_RGB565 | BLUE_HI_BIT_MASK_RGB565); +uint32 RGB_HI_BITS_MASKx2 = (RED_HI_BIT_MASK_RGB565 | GREEN_HI_BIT_MASK_RGB565 | BLUE_HI_BIT_MASK_RGB565) << 1; +uint32 RGB_REMOVE_LOW_BITS_MASK = ~RGB_LOW_BITS_MASK; +uint32 FIRST_COLOR_MASK = FIRST_COLOR_MASK_RGB565; +uint32 SECOND_COLOR_MASK = SECOND_COLOR_MASK_RGB565; +uint32 THIRD_COLOR_MASK = THIRD_COLOR_MASK_RGB565; +uint32 ALPHA_BITS_MASK = ALPHA_BITS_MASK_RGB565; +uint32 FIRST_THIRD_COLOR_MASK = 0; +uint32 TWO_LOW_BITS_MASK = 0; +uint32 HIGH_BITS_SHIFTED_TWO_MASK = 0; +#endif + +uint16 SignExtend[2] = +{ + 0x0000, + 0xff00 +}; + +int HDMA_ModeByteCounts[8] = +{ + 1, 2, 2, 4, 4, 4, 2, 4 +}; + +uint8 mul_brightness[16][32] = +{ + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02 }, + { 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04 }, + { 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06 }, + { 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, + 0x04, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08 }, + { 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, + 0x05, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a }, + { 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, + 0x06, 0x07, 0x07, 0x08, 0x08, 0x08, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c }, + { 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, 0x07, + 0x07, 0x08, 0x08, 0x09, 0x09, 0x0a, 0x0a, 0x0b, 0x0b, 0x0c, 0x0c, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e }, + { 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, + 0x09, 0x09, 0x0a, 0x0a, 0x0b, 0x0b, 0x0c, 0x0c, 0x0d, 0x0d, 0x0e, 0x0e, 0x0f, 0x0f, 0x10, 0x11 }, + { 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x07, 0x07, 0x08, 0x08, 0x09, + 0x0a, 0x0a, 0x0b, 0x0b, 0x0c, 0x0d, 0x0d, 0x0e, 0x0e, 0x0f, 0x10, 0x10, 0x11, 0x11, 0x12, 0x13 }, + { 0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x04, 0x05, 0x05, 0x06, 0x07, 0x07, 0x08, 0x09, 0x09, 0x0a, + 0x0b, 0x0b, 0x0c, 0x0d, 0x0d, 0x0e, 0x0f, 0x0f, 0x10, 0x11, 0x11, 0x12, 0x13, 0x13, 0x14, 0x15 }, + { 0x00, 0x01, 0x01, 0x02, 0x03, 0x04, 0x04, 0x05, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0a, 0x0a, 0x0b, + 0x0c, 0x0c, 0x0d, 0x0e, 0x0f, 0x0f, 0x10, 0x11, 0x12, 0x12, 0x13, 0x14, 0x15, 0x15, 0x16, 0x17 }, + { 0x00, 0x01, 0x02, 0x02, 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0a, 0x0b, 0x0c, + 0x0d, 0x0e, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x12, 0x13, 0x14, 0x15, 0x16, 0x16, 0x17, 0x18, 0x19 }, + { 0x00, 0x01, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0a, 0x0b, 0x0c, 0x0d, + 0x0e, 0x0f, 0x10, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x17, 0x18, 0x19, 0x1a, 0x1b }, + { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, + 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d }, + { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f } +}; + +uint8 S9xOpLengthsM0X0[256] = +{ +// 0 1 2 3 4 5 6 7 8 9 A B C D E F + 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // 0 + 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // 1 + 3, 2, 4, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // 2 + 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // 3 + 1, 2, 2, 2, 3, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // 4 + 2, 2, 2, 2, 3, 2, 2, 2, 1, 3, 1, 1, 4, 3, 3, 4, // 5 + 1, 2, 3, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // 6 + 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // 7 + 2, 2, 3, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // 8 + 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // 9 + 3, 2, 3, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // A + 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // B + 3, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // C + 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // D + 3, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // E + 2, 2, 2, 2, 3, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4 // F +}; + +uint8 S9xOpLengthsM0X1[256] = +{ +// 0 1 2 3 4 5 6 7 8 9 A B C D E F + 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // 0 + 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // 1 + 3, 2, 4, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // 2 + 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // 3 + 1, 2, 2, 2, 3, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // 4 + 2, 2, 2, 2, 3, 2, 2, 2, 1, 3, 1, 1, 4, 3, 3, 4, // 5 + 1, 2, 3, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // 6 + 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // 7 + 2, 2, 3, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // 8 + 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // 9 + 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // A + 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // B + 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // C + 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // D + 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // E + 2, 2, 2, 2, 3, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4 // F +}; + +uint8 S9xOpLengthsM1X0[256] = +{ +// 0 1 2 3 4 5 6 7 8 9 A B C D E F + 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 1, 3, 3, 3, 4, // 0 + 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // 1 + 3, 2, 4, 2, 2, 2, 2, 2, 1, 2, 1, 1, 3, 3, 3, 4, // 2 + 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // 3 + 1, 2, 2, 2, 3, 2, 2, 2, 1, 2, 1, 1, 3, 3, 3, 4, // 4 + 2, 2, 2, 2, 3, 2, 2, 2, 1, 3, 1, 1, 4, 3, 3, 4, // 5 + 1, 2, 3, 2, 2, 2, 2, 2, 1, 2, 1, 1, 3, 3, 3, 4, // 6 + 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // 7 + 2, 2, 3, 2, 2, 2, 2, 2, 1, 2, 1, 1, 3, 3, 3, 4, // 8 + 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // 9 + 3, 2, 3, 2, 2, 2, 2, 2, 1, 2, 1, 1, 3, 3, 3, 4, // A + 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // B + 3, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 1, 3, 3, 3, 4, // C + 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // D + 3, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 1, 3, 3, 3, 4, // E + 2, 2, 2, 2, 3, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4 // F +}; + +uint8 S9xOpLengthsM1X1[256] = +{ +// 0 1 2 3 4 5 6 7 8 9 A B C D E F + 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 1, 3, 3, 3, 4, // 0 + 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // 1 + 3, 2, 4, 2, 2, 2, 2, 2, 1, 2, 1, 1, 3, 3, 3, 4, // 2 + 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // 3 + 1, 2, 2, 2, 3, 2, 2, 2, 1, 2, 1, 1, 3, 3, 3, 4, // 4 + 2, 2, 2, 2, 3, 2, 2, 2, 1, 3, 1, 1, 4, 3, 3, 4, // 5 + 1, 2, 3, 2, 2, 2, 2, 2, 1, 2, 1, 1, 3, 3, 3, 4, // 6 + 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // 7 + 2, 2, 3, 2, 2, 2, 2, 2, 1, 2, 1, 1, 3, 3, 3, 4, // 8 + 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // 9 + 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 1, 3, 3, 3, 4, // A + 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // B + 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 1, 3, 3, 3, 4, // C + 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, // D + 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 1, 3, 3, 3, 4, // E + 2, 2, 2, 2, 3, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4 // F +}; diff --git a/plugins/snes9x_gx/source/snes9x/language.h b/plugins/snes9x_gx/source/snes9x/language.h new file mode 100644 index 00000000..49a30ae1 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/language.h @@ -0,0 +1,202 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _LANGUAGE_H_ +#define _LANGUAGE_H_ + +// Movie Messages +#define MOVIE_ERR_SNAPSHOT_WRONG_MOVIE "Snapshot not from this movie" +#define MOVIE_ERR_SNAPSHOT_NOT_MOVIE "Not a movie snapshot" +#define MOVIE_INFO_REPLAY "Movie replay" +#define MOVIE_INFO_RECORD "Movie record" +#define MOVIE_INFO_RERECORD "Movie re-record" +#define MOVIE_INFO_REWIND "Movie rewind" +#define MOVIE_INFO_STOP "Movie stop" +#define MOVIE_INFO_END "Movie end" +#define MOVIE_INFO_SNAPSHOT "Movie snapshot" +#define MOVIE_ERR_SNAPSHOT_INCONSISTENT "Snapshot inconsistent with movie" + +// Snapshot Messages +#define SAVE_INFO_SNAPSHOT "Saved" +#define SAVE_INFO_LOAD "Loaded" +#define SAVE_INFO_OOPS "Auto-saving 'oops' snapshot" +#define SAVE_ERR_WRONG_FORMAT "File not in Snes9x snapshot format" +#define SAVE_ERR_WRONG_VERSION "Incompatable snapshot version" +#define SAVE_ERR_ROM_NOT_FOUND "ROM image \"%s\" for snapshot not found" +#define SAVE_ERR_SAVE_NOT_FOUND "Snapshot %s does not exist" + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/logger.cpp b/plugins/snes9x_gx/source/snes9x/logger.cpp new file mode 100644 index 00000000..235c5335 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/logger.cpp @@ -0,0 +1,267 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#include "snes9x.h" +#include "movie.h" +#include "logger.h" + +static int resetno = 0; +static int framecounter = 0; +static FILE *video = NULL; +static FILE *audio = NULL; + + +void S9xResetLogger (void) +{ + if (!Settings.DumpStreams) + return; + + char buffer[128]; + + S9xCloseLogger(); + framecounter = 0; + + sprintf(buffer, "videostream%d.dat", resetno); + video = fopen(buffer, "wb"); + if (!video) + { + printf("Opening %s failed. Logging cancelled.\n", buffer); + return; + } + + sprintf(buffer, "audiostream%d.dat", resetno); + audio = fopen(buffer, "wb"); + if (!audio) + { + printf("Opening %s failed. Logging cancelled.\n", buffer); + fclose(video); + return; + } + + resetno++; +} + +void S9xCloseLogger (void) +{ + if (video) + { + fclose(video); + video = NULL; + } + + if (audio) + { + fclose(audio); + audio = NULL; + } +} + +void S9xVideoLogger (void *pixels, int width, int height, int depth, int bytes_per_line) +{ + int fc = S9xMovieGetFrameCounter(); + if (fc > 0) + framecounter = fc; + else + framecounter++; + + if (video) + { + char *data = (char *) pixels; + size_t ignore; + + for (int i = 0; i < height; i++) + ignore = fwrite(data + i * bytes_per_line, depth, width, video); + fflush(video); + fflush(audio); + + if (Settings.DumpStreamsMaxFrames > 0 && framecounter >= Settings.DumpStreamsMaxFrames) + { + printf("Logging ended.\n"); + S9xCloseLogger(); + } + + } +} + +void S9xAudioLogger (void *samples, int length) +{ + if (audio) + { + size_t ignore; + ignore = fwrite(samples, 1, length, audio); + } +} diff --git a/plugins/snes9x_gx/source/snes9x/logger.h b/plugins/snes9x_gx/source/snes9x/logger.h new file mode 100644 index 00000000..63aa30b7 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/logger.h @@ -0,0 +1,186 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _LOGGER_H_ +#define _LOGGER_H_ + +void S9xResetLogger(void); +void S9xCloseLogger(void); +void S9xVideoLogger(void *, int, int, int, int); +void S9xAudioLogger(void *, int); + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/memmap.cpp b/plugins/snes9x_gx/source/snes9x/memmap.cpp new file mode 100644 index 00000000..d7297693 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/memmap.cpp @@ -0,0 +1,4613 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + +#ifdef GEKKO +#include <gccore.h> +#include <malloc.h> +#endif + +#include <string> +#include <numeric> +#include <assert.h> + +#ifdef UNZIP_SUPPORT +#include "unzip/unzip.h" +#endif + +#ifdef JMA_SUPPORT +#include "jma/s9x-jma.h" +#endif + +#include "snes9x.h" +#include "memmap.h" +#include "apu/apu.h" +#include "fxemu.h" +#include "sdd1.h" +#include "srtc.h" +#include "controls.h" +#include "cheats.h" +#include "movie.h" +#include "reader.h" +#include "display.h" + +#ifdef GEKKO +#include "../filebrowser.h" +extern int WiiFileLoader(); +extern void WiiSetupCheats(); +#endif + +#ifndef SET_UI_COLOR +#define SET_UI_COLOR(r, g, b) ; +#endif + +#ifndef max +#define max(a, b) (((a) > (b)) ? (a) : (b)) +#endif + +#ifndef min +#define min(a, b) (((a) < (b)) ? (a) : (b)) +#endif + +static bool8 stopMovie = TRUE; +static char LastRomFilename[PATH_MAX + 1] = ""; + +// from NSRT +static const char *nintendo_licensees[] = +{ + "Unlicensed", + "Nintendo", + "Rocket Games/Ajinomoto", + "Imagineer-Zoom", + "Gray Matter", + "Zamuse", + "Falcom", + NULL, + "Capcom", + "Hot B Co.", + "Jaleco", + "Coconuts Japan", + "Coconuts Japan/G.X.Media", + "Micronet", + "Technos", + "Mebio Software", + "Shouei System", + "Starfish", + NULL, + "Mitsui Fudosan/Dentsu", + NULL, + "Warashi Inc.", + NULL, + "Nowpro", + NULL, + "Game Village", + "IE Institute", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "Banarex", + "Starfish", + "Infocom", + "Electronic Arts Japan", + NULL, + "Cobra Team", + "Human/Field", + "KOEI", + "Hudson Soft", + "S.C.P./Game Village", + "Yanoman", + NULL, + "Tecmo Products", + "Japan Glary Business", + "Forum/OpenSystem", + "Virgin Games (Japan)", + "SMDE", + "Yojigen", + NULL, + "Daikokudenki", + NULL, + NULL, + NULL, + NULL, + NULL, + "Creatures Inc.", + "TDK Deep Impresion", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "Destination Software/KSS", + "Sunsoft/Tokai Engineering", + "POW (Planning Office Wada)/VR 1 Japan", + "Micro World", + NULL, + "San-X", + "Enix", + "Loriciel/Electro Brain", + "Kemco Japan", + "Seta Co.,Ltd.", + "Culture Brain", + "Irem Corp.", + "Palsoft", + "Visit Co., Ltd.", + "Intec", + "System Sacom", + "Poppo", + "Ubisoft Japan", + NULL, + "Media Works", + "NEC InterChannel", + "Tam", + "Gajin/Jordan", + "Smilesoft", + NULL, + NULL, + "Mediakite", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "Viacom", + "Carrozzeria", + "Dynamic", + NULL, + "Magifact", + "Hect", + "Codemasters", + "Taito/GAGA Communications", + "Laguna", + "Telstar Fun & Games/Event/Taito", + NULL, + "Arcade Zone Ltd.", + "Entertainment International/Empire Software", + "Loriciel", + "Gremlin Graphics", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "Seika Corp.", + "UBI SOFT Entertainment Software", + "Sunsoft US", + NULL, + "Life Fitness", + NULL, + "System 3", + "Spectrum Holobyte", + NULL, + "Irem", + NULL, + "Raya Systems", + "Renovation Products", + "Malibu Games", + NULL, + "Eidos/U.S. Gold", + "Playmates Interactive", + NULL, + NULL, + "Fox Interactive", + "Time Warner Interactive", + NULL, + NULL, + NULL, + NULL, + NULL, + "Disney Interactive", + NULL, + "Black Pearl", + NULL, + "Advanced Productions", + NULL, + NULL, + "GT Interactive", + "RARE", + "Crave Entertainment", + "Absolute Entertainment", + "Acclaim", + "Activision", + "American Sammy", + "Take 2/GameTek", + "Hi Tech", + "LJN Ltd.", + NULL, + "Mattel", + NULL, + "Mindscape/Red Orb Entertainment", + "Romstar", + "Taxan", + "Midway/Tradewest", + NULL, + "American Softworks Corp.", + "Majesco Sales Inc.", + "3DO", + NULL, + NULL, + "Hasbro", + "NewKidCo", + "Telegames", + "Metro3D", + NULL, + "Vatical Entertainment", + "LEGO Media", + NULL, + "Xicat Interactive", + "Cryo Interactive", + NULL, + NULL, + "Red Storm Entertainment", + "Microids", + NULL, + "Conspiracy/Swing", + "Titus", + "Virgin Interactive", + "Maxis", + NULL, + "LucasArts Entertainment", + NULL, + NULL, + "Ocean", + NULL, + "Electronic Arts", + NULL, + "Laser Beam", + NULL, + NULL, + "Elite Systems", + "Electro Brain", + "The Learning Company", + "BBC", + NULL, + "Software 2000", + NULL, + "BAM! Entertainment", + "Studio 3", + NULL, + NULL, + NULL, + "Classified Games", + NULL, + "TDK Mediactive", + NULL, + "DreamCatcher", + "JoWood Produtions", + "SEGA", + "Wannado Edition", + "LSP (Light & Shadow Prod.)", + "ITE Media", + "Infogrames", + "Interplay", + "JVC (US)", + "Parker Brothers", + NULL, + "SCI (Sales Curve Interactive)/Storm", + NULL, + NULL, + "THQ Software", + "Accolade Inc.", + "Triffix Entertainment", + NULL, + "Microprose Software", + "Universal Interactive/Sierra/Simon & Schuster", + NULL, + "Kemco", + "Rage Software", + "Encore", + NULL, + "Zoo", + "Kiddinx", + "Simon & Schuster Interactive", + "Asmik Ace Entertainment Inc./AIA", + "Empire Interactive", + NULL, + NULL, + "Jester Interactive", + NULL, + "Rockstar Games", + "Scholastic", + "Ignition Entertainment", + "Summitsoft", + "Stadlbauer", + NULL, + NULL, + NULL, + "Misawa", + "Teichiku", + "Namco Ltd.", + "LOZC", + "KOEI", + NULL, + "Tokuma Shoten Intermedia", + "Tsukuda Original", + "DATAM-Polystar", + NULL, + NULL, + "Bullet-Proof Software", + "Vic Tokai Inc.", + NULL, + "Character Soft", + "I'Max", + "Saurus", + NULL, + NULL, + "General Entertainment", + NULL, + NULL, + "I'Max", + "Success", + NULL, + "SEGA Japan", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "Takara", + "Chun Soft", + "Video System Co., Ltd./McO'River", + "BEC", + NULL, + "Varie", + "Yonezawa/S'pal", + "Kaneko", + NULL, + "Victor Interactive Software/Pack-in-Video", + "Nichibutsu/Nihon Bussan", + "Tecmo", + "Imagineer", + NULL, + NULL, + "Nova", + "Den'Z", + "Bottom Up", + NULL, + "TGL (Technical Group Laboratory)", + NULL, + "Hasbro Japan", + NULL, + "Marvelous Entertainment", + NULL, + "Keynet Inc.", + "Hands-On Entertainment", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "Telenet", + "Hori", + NULL, + NULL, + "Konami", + "K.Amusement Leasing Co.", + "Kawada", + "Takara", + NULL, + "Technos Japan Corp.", + "JVC (Europe/Japan)/Victor Musical Industries", + NULL, + "Toei Animation", + "Toho", + NULL, + "Namco", + "Media Rings Corp.", + "J-Wing", + NULL, + "Pioneer LDC", + "KID", + "Mediafactory", + NULL, + NULL, + NULL, + "Infogrames Hudson", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "Acclaim Japan", + "ASCII Co./Nexoft", + "Bandai", + NULL, + "Enix", + NULL, + "HAL Laboratory/Halken", + "SNK", + NULL, + "Pony Canyon Hanbai", + "Culture Brain", + "Sunsoft", + "Toshiba EMI", + "Sony Imagesoft", + NULL, + "Sammy", + "Magical", + "Visco", + NULL, + "Compile", + NULL, + "MTO Inc.", + NULL, + "Sunrise Interactive", + NULL, + "Global A Entertainment", + "Fuuki", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "Taito", + NULL, + "Kemco", + "Square", + "Tokuma Shoten", + "Data East", + "Tonkin House", + NULL, + "KOEI", + NULL, + "Konami/Ultra/Palcom", + "NTVIC/VAP", + "Use Co., Ltd.", + "Meldac", + "Pony Canyon (Japan)/FCI (US)", + "Angel/Sotsu Agency/Sunrise", + "Yumedia/Aroma Co., Ltd.", + NULL, + NULL, + "Boss", + "Axela/Crea-Tech", + "Sekaibunka-Sha/Sumire kobo/Marigul Management Inc.", + "Konami Computer Entertainment Osaka", + NULL, + NULL, + "Enterbrain", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "Taito/Disco", + "Sofel", + "Quest Corp.", + "Sigma", + "Ask Kodansha", + NULL, + "Naxat", + "Copya System", + "Capcom Co., Ltd.", + "Banpresto", + "TOMY", + "Acclaim/LJN Japan", + NULL, + "NCS", + "Human Entertainment", + "Altron", + "Jaleco", + "Gaps Inc.", + NULL, + NULL, + NULL, + NULL, + NULL, + "Elf", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "Jaleco", + NULL, + "Yutaka", + "Varie", + "T&ESoft", + "Epoch Co., Ltd.", + NULL, + "Athena", + "Asmik", + "Natsume", + "King Records", + "Atlus", + "Epic/Sony Records (Japan)", + NULL, + "IGS (Information Global Service)", + NULL, + "Chatnoir", + "Right Stuff", + NULL, + "NTT COMWARE", + NULL, + "Spike", + "Konami Computer Entertainment Tokyo", + "Alphadream Corp.", + NULL, + "Sting", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "A Wave", + "Motown Software", + "Left Field Entertainment", + "Extreme Entertainment Group", + "TecMagik", + NULL, + NULL, + NULL, + NULL, + "Cybersoft", + NULL, + "Psygnosis", + NULL, + NULL, + "Davidson/Western Tech.", + "Unlicensed", + NULL, + NULL, + NULL, + NULL, + "The Game Factory Europe", + "Hip Games", + "Aspyr", + NULL, + NULL, + "Mastiff", + "iQue", + "Digital Tainment Pool", + "XS Games", + "Daiwon", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "PCCW Japan", + NULL, + NULL, + "KiKi Co. Ltd.", + "Open Sesame Inc.", + "Sims", + "Broccoli", + "Avex", + "D3 Publisher", + NULL, + "Konami Computer Entertainment Japan", + NULL, + "Square-Enix", + "KSG", + "Micott & Basara Inc.", + NULL, + "Orbital Media", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "The Game Factory USA", + NULL, + NULL, + "Treasure", + "Aruze", + "Ertain", + "SNK Playmore", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "Yojigen" +}; + +static const uint32 crc32Table[256] = +{ + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, + 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, + 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, + 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, + 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, + 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, + 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, + 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, + 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, + 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, + 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, + 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, + 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, + 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, + 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, + 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, + 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, + 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d +}; + +static void S9xDeinterleaveType1 (int, uint8 *); +static void S9xDeinterleaveType2 (int, uint8 *); +static void S9xDeinterleaveGD24 (int, uint8 *); +static bool8 allASCII (uint8 *, int); +static bool8 is_SufamiTurbo_BIOS (uint8 *, uint32); +static bool8 is_SufamiTurbo_Cart (uint8 *, uint32); +static bool8 is_SameGame_BIOS (uint8 *, uint32); +static bool8 is_SameGame_Add_On (uint8 *, uint32); +static uint32 caCRC32 (uint8 *, uint32, uint32 crc32 = 0xffffffff); +static uint32 ReadUPSPointer (const uint8 *, unsigned &, unsigned); +static bool8 ReadUPSPatch (Reader *, long, int32 &); +static long ReadInt (Reader *, unsigned); +static bool8 ReadIPSPatch (Reader *, long, int32 &); +#ifdef UNZIP_SUPPORT +static int unzFindExtension (unzFile &, const char *, bool restart = TRUE, bool print = TRUE); +#endif + +// deinterleave + +static void S9xDeinterleaveType1 (int size, uint8 *base) +{ + Settings.DisplayColor = BUILD_PIXEL(0, 31, 0); + SET_UI_COLOR(0, 255, 0); + + uint8 blocks[256]; + int nblocks = size >> 16; + + for (int i = 0; i < nblocks; i++) + { + blocks[i * 2] = i + nblocks; + blocks[i * 2 + 1] = i; + } + + uint8 *tmp = (uint8 *) memalign(32,0x8000); + if (tmp) + { + for (int i = 0; i < nblocks * 2; i++) + { + for (int j = i; j < nblocks * 2; j++) + { + if (blocks[j] == i) + { + memmove(tmp, &base[blocks[j] * 0x8000], 0x8000); + memmove(&base[blocks[j] * 0x8000], &base[blocks[i] * 0x8000], 0x8000); + memmove(&base[blocks[i] * 0x8000], tmp, 0x8000); + uint8 b = blocks[j]; + blocks[j] = blocks[i]; + blocks[i] = b; + break; + } + } + } + + free(tmp); + } +} + +static void S9xDeinterleaveType2 (int size, uint8 *base) +{ + // for odd Super FX images + Settings.DisplayColor = BUILD_PIXEL(31, 14, 6); + SET_UI_COLOR(255, 119, 25); + + uint8 blocks[256]; + int nblocks = size >> 16; + int step = 64; + + while (nblocks <= step) + step >>= 1; + nblocks = step; + + for (int i = 0; i < nblocks * 2; i++) + blocks[i] = (i & ~0xf) | ((i & 3) << 2) | ((i & 12) >> 2); + + uint8 *tmp = (uint8 *) memalign(32,0x10000); + if (tmp) + { + for (int i = 0; i < nblocks * 2; i++) + { + for (int j = i; j < nblocks * 2; j++) + { + if (blocks[j] == i) + { + memmove(tmp, &base[blocks[j] * 0x10000], 0x10000); + memmove(&base[blocks[j] * 0x10000], &base[blocks[i] * 0x10000], 0x10000); + memmove(&base[blocks[i] * 0x10000], tmp, 0x10000); + uint8 b = blocks[j]; + blocks[j] = blocks[i]; + blocks[i] = b; + break; + } + } + } + + free(tmp); + } +} + +static void S9xDeinterleaveGD24 (int size, uint8 *base) +{ + // for 24Mb images dumped with Game Doctor + if (size != 0x300000) + return; + + Settings.DisplayColor = BUILD_PIXEL(0, 31, 31); + SET_UI_COLOR(0, 255, 255); + + uint8 *tmp = (uint8 *) memalign(32,0x80000); + if (tmp) + { + memmove(tmp, &base[0x180000], 0x80000); + memmove(&base[0x180000], &base[0x200000], 0x80000); + memmove(&base[0x200000], &base[0x280000], 0x80000); + memmove(&base[0x280000], tmp, 0x80000); + + free(tmp); + + S9xDeinterleaveType1(size, base); + } +} + +// allocation and deallocation + +bool8 CMemory::Init (void) +{ + RAM = (uint8 *) memalign(32,0x20000); + SRAM = (uint8 *) memalign(32,0x20000); + VRAM = (uint8 *) memalign(32,0x10000); + ROM = (uint8 *) memalign(32,MAX_ROM_SIZE + 0x200 + 0x8000); + + IPPU.TileCache[TILE_2BIT] = (uint8 *) memalign(32,MAX_2BIT_TILES * 64); + IPPU.TileCache[TILE_4BIT] = (uint8 *) memalign(32,MAX_4BIT_TILES * 64); + IPPU.TileCache[TILE_8BIT] = (uint8 *) memalign(32,MAX_8BIT_TILES * 64); + IPPU.TileCache[TILE_2BIT_EVEN] = (uint8 *) memalign(32,MAX_2BIT_TILES * 64); + IPPU.TileCache[TILE_2BIT_ODD] = (uint8 *) memalign(32,MAX_2BIT_TILES * 64); + IPPU.TileCache[TILE_4BIT_EVEN] = (uint8 *) memalign(32,MAX_4BIT_TILES * 64); + IPPU.TileCache[TILE_4BIT_ODD] = (uint8 *) memalign(32,MAX_4BIT_TILES * 64); + + IPPU.TileCached[TILE_2BIT] = (uint8 *) memalign(32,MAX_2BIT_TILES); + IPPU.TileCached[TILE_4BIT] = (uint8 *) memalign(32,MAX_4BIT_TILES); + IPPU.TileCached[TILE_8BIT] = (uint8 *) memalign(32,MAX_8BIT_TILES); + IPPU.TileCached[TILE_2BIT_EVEN] = (uint8 *) memalign(32,MAX_2BIT_TILES); + IPPU.TileCached[TILE_2BIT_ODD] = (uint8 *) memalign(32,MAX_2BIT_TILES); + IPPU.TileCached[TILE_4BIT_EVEN] = (uint8 *) memalign(32,MAX_4BIT_TILES); + IPPU.TileCached[TILE_4BIT_ODD] = (uint8 *) memalign(32,MAX_4BIT_TILES); + + if (!RAM || !SRAM || !VRAM || !ROM || + !IPPU.TileCache[TILE_2BIT] || + !IPPU.TileCache[TILE_4BIT] || + !IPPU.TileCache[TILE_8BIT] || + !IPPU.TileCache[TILE_2BIT_EVEN] || + !IPPU.TileCache[TILE_2BIT_ODD] || + !IPPU.TileCache[TILE_4BIT_EVEN] || + !IPPU.TileCache[TILE_4BIT_ODD] || + !IPPU.TileCached[TILE_2BIT] || + !IPPU.TileCached[TILE_4BIT] || + !IPPU.TileCached[TILE_8BIT] || + !IPPU.TileCached[TILE_2BIT_EVEN] || + !IPPU.TileCached[TILE_2BIT_ODD] || + !IPPU.TileCached[TILE_4BIT_EVEN] || + !IPPU.TileCached[TILE_4BIT_ODD]) + { + Deinit(); + return (FALSE); + } + + ZeroMemory(RAM, 0x20000); + ZeroMemory(SRAM, 0x20000); + ZeroMemory(VRAM, 0x10000); + ZeroMemory(ROM, MAX_ROM_SIZE + 0x200 + 0x8000); + + ZeroMemory(IPPU.TileCache[TILE_2BIT], MAX_2BIT_TILES * 64); + ZeroMemory(IPPU.TileCache[TILE_4BIT], MAX_4BIT_TILES * 64); + ZeroMemory(IPPU.TileCache[TILE_8BIT], MAX_8BIT_TILES * 64); + ZeroMemory(IPPU.TileCache[TILE_2BIT_EVEN], MAX_2BIT_TILES * 64); + ZeroMemory(IPPU.TileCache[TILE_2BIT_ODD], MAX_2BIT_TILES * 64); + ZeroMemory(IPPU.TileCache[TILE_4BIT_EVEN], MAX_4BIT_TILES * 64); + ZeroMemory(IPPU.TileCache[TILE_4BIT_ODD], MAX_4BIT_TILES * 64); + + ZeroMemory(IPPU.TileCached[TILE_2BIT], MAX_2BIT_TILES); + ZeroMemory(IPPU.TileCached[TILE_4BIT], MAX_4BIT_TILES); + ZeroMemory(IPPU.TileCached[TILE_8BIT], MAX_8BIT_TILES); + ZeroMemory(IPPU.TileCached[TILE_2BIT_EVEN], MAX_2BIT_TILES); + ZeroMemory(IPPU.TileCached[TILE_2BIT_ODD], MAX_2BIT_TILES); + ZeroMemory(IPPU.TileCached[TILE_4BIT_EVEN], MAX_4BIT_TILES); + ZeroMemory(IPPU.TileCached[TILE_4BIT_ODD], MAX_4BIT_TILES); + + // FillRAM uses first 32K of ROM image area, otherwise space just + // wasted. Might be read by the SuperFX code. + + FillRAM = ROM; + + // Add 0x8000 to ROM image pointer to stop SuperFX code accessing + // unallocated memory (can cause crash on some ports). + + ROM += 0x8000; + + C4RAM = ROM + 0x400000 + 8192 * 8; // C4 + OBC1RAM = ROM + 0x400000; // OBC1 + BIOSROM = ROM + 0x300000; // BS + BSRAM = ROM + 0x400000; // BS + + SuperFX.pvRegisters = FillRAM + 0x3000; + SuperFX.nRamBanks = 2; // Most only use 1. 1=64KB=512Mb, 2=128KB=1024Mb + SuperFX.pvRam = SRAM; + SuperFX.nRomBanks = (2 * 1024 * 1024) / (32 * 1024); + SuperFX.pvRom = (uint8 *) ROM; + + PostRomInitFunc = NULL; + + return (TRUE); +} + +void CMemory::Deinit (void) +{ + if (RAM) + { + free(RAM); + RAM = NULL; + } + + if (SRAM) + { + free(SRAM); + SRAM = NULL; + } + + if (VRAM) + { + free(VRAM); + VRAM = NULL; + } + + if (ROM) + { + ROM -= 0x8000; + free(ROM); + ROM = NULL; + } + + for (int t = 0; t < 7; t++) + { + if (IPPU.TileCache[t]) + { + free(IPPU.TileCache[t]); + IPPU.TileCache[t] = NULL; + } + + if (IPPU.TileCached[t]) + { + free(IPPU.TileCached[t]); + IPPU.TileCached[t] = NULL; + } + } + + Safe(NULL); + SafeANK(NULL); +} + +// file management and ROM detection + +static bool8 allASCII (uint8 *b, int size) +{ + for (int i = 0; i < size; i++) + { + if (b[i] < 32 || b[i] > 126) + return (FALSE); + } + + return (TRUE); +} + +static bool8 is_SufamiTurbo_BIOS (uint8 *data, uint32 size) +{ + if (size == 0x40000 && + strncmp((char *) data, "BANDAI SFC-ADX", 14) == 0 && strncmp((char * ) (data + 0x10), "SFC-ADX BACKUP", 14) == 0) + return (TRUE); + else + return (FALSE); +} + +static bool8 is_SufamiTurbo_Cart (uint8 *data, uint32 size) +{ + if (size >= 0x80000 && size <= 0x100000 && + strncmp((char *) data, "BANDAI SFC-ADX", 14) == 0 && strncmp((char * ) (data + 0x10), "SFC-ADX BACKUP", 14) != 0) + return (TRUE); + else + return (FALSE); +} + +static bool8 is_SameGame_BIOS (uint8 *data, uint32 size) +{ + if (size == 0x100000 && strncmp((char *) (data + 0xffc0), "Same Game Tsume Game", 20) == 0) + return (TRUE); + else + return (FALSE); +} + +static bool8 is_SameGame_Add_On (uint8 *data, uint32 size) +{ + if (size == 0x80000) + return (TRUE); + else + return (FALSE); +} + +int CMemory::ScoreHiROM (bool8 skip_header, int32 romoff) +{ + uint8 *buf = ROM + 0xff00 + romoff + (skip_header ? 0x200 : 0); + int score = 0; + + if (buf[0xd5] & 0x1) + score += 2; + + // Mode23 is SA-1 + if (buf[0xd5] == 0x23) + score -= 2; + + if (buf[0xd4] == 0x20) + score += 2; + + if ((buf[0xdc] + (buf[0xdd] << 8)) + (buf[0xde] + (buf[0xdf] << 8)) == 0xffff) + { + score += 2; + if (0 != (buf[0xde] + (buf[0xdf] << 8))) + score++; + } + + if (buf[0xda] == 0x33) + score += 2; + + if ((buf[0xd5] & 0xf) < 4) + score += 2; + + if (!(buf[0xfd] & 0x80)) + score -= 6; + + if ((buf[0xfc] + (buf[0xfd] << 8)) > 0xffb0) + score -= 2; // reduced after looking at a scan by Cowering + + if (CalculatedSize > 1024 * 1024 * 3) + score += 4; + + if ((1 << (buf[0xd7] - 7)) > 48) + score -= 1; + + if (!allASCII(&buf[0xb0], 6)) + score -= 1; + + if (!allASCII(&buf[0xc0], ROM_NAME_LEN - 1)) + score -= 1; + + return (score); +} + +int CMemory::ScoreLoROM (bool8 skip_header, int32 romoff) +{ + uint8 *buf = ROM + 0x7f00 + romoff + (skip_header ? 0x200 : 0); + int score = 0; + + if (!(buf[0xd5] & 0x1)) + score += 3; + + // Mode23 is SA-1 + if (buf[0xd5] == 0x23) + score += 2; + + if ((buf[0xdc] + (buf[0xdd] << 8)) + (buf[0xde] + (buf[0xdf] << 8)) == 0xffff) + { + score += 2; + if (0 != (buf[0xde] + (buf[0xdf] << 8))) + score++; + } + + if (buf[0xda] == 0x33) + score += 2; + + if ((buf[0xd5] & 0xf) < 4) + score += 2; + + if (!(buf[0xfd] & 0x80)) + score -= 6; + + if ((buf[0xfc] + (buf[0xfd] << 8)) > 0xffb0) + score -= 2; // reduced per Cowering suggestion + + if (CalculatedSize <= 1024 * 1024 * 16) + score += 2; + + if ((1 << (buf[0xd7] - 7)) > 48) + score -= 1; + + if (!allASCII(&buf[0xb0], 6)) + score -= 1; + + if (!allASCII(&buf[0xc0], ROM_NAME_LEN - 1)) + score -= 1; + + return (score); +} + +uint32 CMemory::HeaderRemove (uint32 size, int32 &headerCount, uint8 *buf) +{ + uint32 calc_size = (size / 0x2000) * 0x2000; + + if ((size - calc_size == 512 && !Settings.ForceNoHeader) || Settings.ForceHeader) + { + uint8 *NSRTHead = buf + 0x1D0; // NSRT Header Location + + // detect NSRT header + if (!strncmp("NSRT", (char *) &NSRTHead[24], 4)) + { + if (NSRTHead[28] == 22) + { + if (((std::accumulate(NSRTHead, NSRTHead + sizeof(NSRTHeader), 0) & 0xFF) == NSRTHead[30]) && + (NSRTHead[30] + NSRTHead[31] == 255) && ((NSRTHead[0] & 0x0F) <= 13) && + (((NSRTHead[0] & 0xF0) >> 4) <= 3) && ((NSRTHead[0] & 0xF0) >> 4)) + memcpy(NSRTHeader, NSRTHead, sizeof(NSRTHeader)); + } + } + + memmove(buf, buf + 512, calc_size); + headerCount++; + size -= 512; + } + + return (size); +} + +uint32 CMemory::FileLoader (uint8 *buffer, const char *filename, int32 maxsize) +{ + // <- ROM size without header + // ** Memory.HeaderCount + // ** Memory.ROMFilename + + int32 totalSize = 0; + char fname[PATH_MAX + 1]; + char drive[_MAX_DRIVE + 1], dir[_MAX_DIR + 1], name[_MAX_FNAME + 1], exts[_MAX_EXT + 1]; + char *ext; + +#if defined(__WIN32__) || defined(__MACOSX__) + ext = &exts[1]; +#else + ext = &exts[0]; +#endif + + memset(NSRTHeader, 0, sizeof(NSRTHeader)); + HeaderCount = 0; + + _splitpath(filename, drive, dir, name, exts); + _makepath(fname, drive, dir, name, exts); + + int nFormat = FILE_DEFAULT; + if (strcasecmp(ext, "zip") == 0) + nFormat = FILE_ZIP; + else + if (strcasecmp(ext, "jma") == 0) + nFormat = FILE_JMA; + + switch (nFormat) + { + case FILE_ZIP: + { + #ifdef UNZIP_SUPPORT + if (!LoadZip(fname, &totalSize, &HeaderCount, buffer)) + { + S9xMessage(S9X_ERROR, S9X_ROM_INFO, "Invalid Zip archive."); + return (0); + } + + strcpy(ROMFilename, fname); + #else + S9xMessage(S9X_ERROR, S9X_ROM_INFO, "This binary was not created with Zip support."); + return (0); + #endif + break; + } + + case FILE_JMA: + { + #ifdef JMA_SUPPORT + size_t size = load_jma_file(fname, buffer); + if (!size) + { + S9xMessage(S9X_ERROR, S9X_ROM_INFO, "Invalid JMA archive."); + return (0); + } + + totalSize = HeaderRemove(size, HeaderCount, buffer); + + strcpy(ROMFilename, fname); + #else + S9xMessage(S9X_ERROR, S9X_ROM_INFO, "This binary was not created with JMA support."); + return (0); + #endif + break; + } + + case FILE_DEFAULT: + default: + { + STREAM fp = OPEN_STREAM(fname, "rb"); + if (!fp) + return (0); + + strcpy(ROMFilename, fname); + + int len = 0; + uint32 size = 0; + bool8 more = FALSE; + uint8 *ptr = buffer; + + do + { + size = READ_STREAM(ptr, maxsize + 0x200 - (ptr - buffer), fp); + CLOSE_STREAM(fp); + + size = HeaderRemove(size, HeaderCount, ptr); + totalSize += size; + ptr += size; + + // check for multi file roms + if (ptr - buffer < maxsize + 0x200 && + (isdigit(ext[0]) && ext[1] == 0 && ext[0] < '9')) + { + more = TRUE; + ext[0]++; + _makepath(fname, drive, dir, name, exts); + } + else + if (ptr - buffer < maxsize + 0x200 && + (((len = strlen(name)) == 7 || len == 8) && + strncasecmp(name, "sf", 2) == 0 && + isdigit(name[2]) && isdigit(name[3]) && isdigit(name[4]) && isdigit(name[5]) && + isalpha(name[len - 1]))) + { + more = TRUE; + name[len - 1]++; + _makepath(fname, drive, dir, name, exts); + } + else + more = FALSE; + + } while (more && (fp = OPEN_STREAM(fname, "rb")) != NULL); + + break; + } + } + + if (HeaderCount == 0) + S9xMessage(S9X_INFO, S9X_HEADERS_INFO, "No ROM file header found."); + else + if (HeaderCount == 1) + S9xMessage(S9X_INFO, S9X_HEADERS_INFO, "Found ROM file header (and ignored it)."); + else + S9xMessage(S9X_INFO, S9X_HEADERS_INFO, "Found multiple ROM file headers (and ignored them)."); + + return ((uint32) totalSize); +} + +bool8 CMemory::LoadROM (const char *filename) +{ + int retry_count = 0; + + if (!filename || !*filename) + return (FALSE); + + ZeroMemory(ROM, MAX_ROM_SIZE); + ZeroMemory(&Multi, sizeof(Multi)); + +again: + Settings.DisplayColor = BUILD_PIXEL(31, 31, 31); + SET_UI_COLOR(255, 255, 255); + + CalculatedSize = 0; + ExtendedFormat = NOPE; + + int32 totalFileSize; + +#ifdef GEKKO + totalFileSize = WiiFileLoader(); +#else + totalFileSize = FileLoader(ROM, filename, MAX_ROM_SIZE); +#endif + + if (!totalFileSize) + return (FALSE); + + if (!Settings.NoPatch) + CheckForAnyPatch(filename, HeaderCount != 0, totalFileSize); + + int hi_score, lo_score; + + hi_score = ScoreHiROM(FALSE); + lo_score = ScoreLoROM(FALSE); + + if (HeaderCount == 0 && !Settings.ForceNoHeader && + ((hi_score > lo_score && ScoreHiROM(TRUE) > hi_score) || + (hi_score <= lo_score && ScoreLoROM(TRUE) > lo_score))) + { + memmove(ROM, ROM + 512, totalFileSize - 512); + totalFileSize -= 512; + S9xMessage(S9X_INFO, S9X_HEADER_WARNING, "Try 'force no-header' option if the game doesn't work"); + // modifying ROM, so we need to rescore + hi_score = ScoreHiROM(FALSE); + lo_score = ScoreLoROM(FALSE); + } + + CalculatedSize = (totalFileSize / 0x2000) * 0x2000; + + if (CalculatedSize > 0x400000 && + (ROM[0x7fd5] + (ROM[0x7fd6] << 8)) != 0x4332 && // exclude S-DD1 + (ROM[0x7fd5] + (ROM[0x7fd6] << 8)) != 0x4532 && + (ROM[0xffd5] + (ROM[0xffd6] << 8)) != 0xF93a && // exclude SPC7110 + (ROM[0xffd5] + (ROM[0xffd6] << 8)) != 0xF53a) + ExtendedFormat = YEAH; + + // if both vectors are invalid, it's type 1 interleaved LoROM + if (ExtendedFormat == NOPE && + ((ROM[0x7ffc] + (ROM[0x7ffd] << 8)) < 0x8000) && + ((ROM[0xfffc] + (ROM[0xfffd] << 8)) < 0x8000)) + { + if (!Settings.ForceInterleaved && !Settings.ForceNotInterleaved) + S9xDeinterleaveType1(totalFileSize, ROM); + } + + // CalculatedSize is now set, so rescore + hi_score = ScoreHiROM(FALSE); + lo_score = ScoreLoROM(FALSE); + + uint8 *RomHeader = ROM; + + if (ExtendedFormat != NOPE) + { + int swappedhirom, swappedlorom; + + swappedhirom = ScoreHiROM(FALSE, 0x400000); + swappedlorom = ScoreLoROM(FALSE, 0x400000); + + // set swapped here + if (max(swappedlorom, swappedhirom) >= max(lo_score, hi_score)) + { + ExtendedFormat = BIGFIRST; + hi_score = swappedhirom; + lo_score = swappedlorom; + RomHeader += 0x400000; + } + else + ExtendedFormat = SMALLFIRST; + } + + bool8 interleaved, tales = FALSE; + + interleaved = Settings.ForceInterleaved || Settings.ForceInterleaved2 || Settings.ForceInterleaveGD24; + + if (Settings.ForceLoROM || (!Settings.ForceHiROM && lo_score >= hi_score)) + { + LoROM = TRUE; + HiROM = FALSE; + + // ignore map type byte if not 0x2x or 0x3x + if ((RomHeader[0x7fd5] & 0xf0) == 0x20 || (RomHeader[0x7fd5] & 0xf0) == 0x30) + { + switch (RomHeader[0x7fd5] & 0xf) + { + case 1: + interleaved = TRUE; + break; + + case 5: + interleaved = TRUE; + tales = TRUE; + break; + } + } + } + else + { + LoROM = FALSE; + HiROM = TRUE; + + if ((RomHeader[0xffd5] & 0xf0) == 0x20 || (RomHeader[0xffd5] & 0xf0) == 0x30) + { + switch (RomHeader[0xffd5] & 0xf) + { + case 0: + case 3: + interleaved = TRUE; + break; + } + } + } + + // this two games fail to be detected + if (!Settings.ForceHiROM && !Settings.ForceLoROM) + { + if (strncmp((char *) &ROM[0x7fc0], "YUYU NO QUIZ DE GO!GO!", 22) == 0 || + (strncmp((char *) &ROM[0xffc0], "BATMAN--REVENGE JOKER", 21) == 0)) + { + LoROM = TRUE; + HiROM = FALSE; + interleaved = FALSE; + tales = FALSE; + } + } + + if (!Settings.ForceNotInterleaved && interleaved) + { + S9xMessage(S9X_INFO, S9X_ROM_INTERLEAVED_INFO, "ROM image is in interleaved format - converting..."); + + if (tales) + { + if (ExtendedFormat == BIGFIRST) + { + S9xDeinterleaveType1(0x400000, ROM); + S9xDeinterleaveType1(CalculatedSize - 0x400000, ROM + 0x400000); + } + else + { + S9xDeinterleaveType1(CalculatedSize - 0x400000, ROM); + S9xDeinterleaveType1(0x400000, ROM + CalculatedSize - 0x400000); + } + + LoROM = FALSE; + HiROM = TRUE; + } + else + if (Settings.ForceInterleaveGD24 && CalculatedSize == 0x300000) + { + bool8 t = LoROM; + LoROM = HiROM; + HiROM = t; + S9xDeinterleaveGD24(CalculatedSize, ROM); + } + else + if (Settings.ForceInterleaved2) + S9xDeinterleaveType2(CalculatedSize, ROM); + else + { + bool8 t = LoROM; + LoROM = HiROM; + HiROM = t; + S9xDeinterleaveType1(CalculatedSize, ROM); + } + + hi_score = ScoreHiROM(FALSE); + lo_score = ScoreLoROM(FALSE); + + if ((HiROM && (lo_score >= hi_score || hi_score < 0)) || + (LoROM && (hi_score > lo_score || lo_score < 0))) + { + if (retry_count == 0) + { + S9xMessage(S9X_INFO, S9X_ROM_CONFUSING_FORMAT_INFO, "ROM lied about its type! Trying again."); + Settings.ForceNotInterleaved = TRUE; + Settings.ForceInterleaved = FALSE; + retry_count++; + goto again; + } + } + } + + if (ExtendedFormat == SMALLFIRST) + tales = TRUE; + + if (tales) + { + uint8 *tmp = (uint8 *) memalign(32,CalculatedSize - 0x400000); + if (tmp) + { + S9xMessage(S9X_INFO, S9X_ROM_INTERLEAVED_INFO, "Fixing swapped ExHiROM..."); + memmove(tmp, ROM, CalculatedSize - 0x400000); + memmove(ROM, ROM + CalculatedSize - 0x400000, 0x400000); + memmove(ROM + 0x400000, tmp, CalculatedSize - 0x400000); + free(tmp); + } + } + + if (strncmp(LastRomFilename, filename, PATH_MAX + 1)) + { + strncpy(LastRomFilename, filename, PATH_MAX + 1); + LastRomFilename[PATH_MAX] = 0; + } + + ZeroMemory(&SNESGameFixes, sizeof(SNESGameFixes)); + SNESGameFixes.SRAMInitialValue = 0x60; +#ifdef GEKKO + WiiSetupCheats(); +#else + S9xLoadCheatFile(S9xGetFilename(".cht", CHEAT_DIR)); +#endif + InitROM(); + + S9xInitCheatData(); + S9xApplyCheats(); + + S9xReset(); + + return (TRUE); +} + +bool8 CMemory::LoadMultiCart (const char *cartA, const char *cartB) +{ + bool8 r = TRUE; + + ZeroMemory(ROM, MAX_ROM_SIZE); + ZeroMemory(&Multi, sizeof(Multi)); + + Settings.DisplayColor = BUILD_PIXEL(31, 31, 31); + SET_UI_COLOR(255, 255, 255); + + CalculatedSize = 0; + ExtendedFormat = NOPE; + + if (cartA && cartA[0]) + Multi.cartSizeA = FileLoader(ROM, cartA, MAX_ROM_SIZE); + + if (Multi.cartSizeA == 0) + { + if (cartB && cartB[0]) + Multi.cartSizeB = FileLoader(ROM, cartB, MAX_ROM_SIZE); + } + + if (Multi.cartSizeA) + { + if (is_SufamiTurbo_Cart(ROM, Multi.cartSizeA)) + Multi.cartType = 4; + else + if (is_SameGame_BIOS(ROM, Multi.cartSizeA)) + Multi.cartType = 3; + } + else + if (Multi.cartSizeB) + { + if (is_SufamiTurbo_Cart(ROM, Multi.cartSizeB)) + Multi.cartType = 4; + } + else + Multi.cartType = 4; // assuming BIOS only + + switch (Multi.cartType) + { + case 4: + r = LoadSufamiTurbo(cartA, cartB); + break; + + case 3: + r = LoadSameGame(cartA, cartB); + break; + + default: + r = FALSE; + } + + if (!r) + { + ZeroMemory(&Multi, sizeof(Multi)); + return (FALSE); + } + + ZeroMemory(&SNESGameFixes, sizeof(SNESGameFixes)); + SNESGameFixes.SRAMInitialValue = 0x60; + + S9xLoadCheatFile(S9xGetFilename(".cht", CHEAT_DIR)); + + InitROM(); + + S9xInitCheatData(); + S9xApplyCheats(); + + S9xReset(); + + return (TRUE); +} + +bool8 CMemory::LoadSufamiTurbo (const char *cartA, const char *cartB) +{ + Multi.cartOffsetA = 0x100000; + Multi.cartOffsetB = 0x200000; + Multi.sramA = SRAM; + Multi.sramB = SRAM + 0x10000; + + if (Multi.cartSizeA) + { + Multi.sramSizeA = 4; // ROM[0x37]? + Multi.sramMaskA = Multi.sramSizeA ? ((1 << (Multi.sramSizeA + 3)) * 128 - 1) : 0; + + if (!Settings.NoPatch) + CheckForAnyPatch(cartA, HeaderCount != 0, Multi.cartSizeA); + + strcpy(Multi.fileNameA, cartA); + memcpy(ROM + Multi.cartOffsetA, ROM, Multi.cartSizeA); + } + + if (Multi.cartSizeA && !Multi.cartSizeB) + { + if (cartB && cartB[0]) + Multi.cartSizeB = FileLoader(ROM, cartB, MAX_ROM_SIZE); + + if (Multi.cartSizeB) + { + if (!is_SufamiTurbo_Cart(ROM, Multi.cartSizeB)) + Multi.cartSizeB = 0; + } + } + + if (Multi.cartSizeB) + { + Multi.sramSizeB = 4; // ROM[0x37]? + Multi.sramMaskB = Multi.sramSizeB ? ((1 << (Multi.sramSizeB + 3)) * 128 - 1) : 0; + + if (!Settings.NoPatch) + CheckForAnyPatch(cartB, HeaderCount != 0, Multi.cartSizeB); + + strcpy(Multi.fileNameB, cartB); + memcpy(ROM + Multi.cartOffsetB, ROM, Multi.cartSizeB); + } + + FILE *fp; + size_t size; + char path[PATH_MAX + 1]; + + strcpy(path, S9xGetDirectory(BIOS_DIR)); + strcat(path, SLASH_STR); + strcat(path, "STBIOS.bin"); + + fp = fopen(path, "rb"); + if (fp) + { + size = fread((void *) ROM, 1, 0x40000, fp); + fclose(fp); + if (!is_SufamiTurbo_BIOS(ROM, size)) + return (FALSE); + } + else + return (FALSE); + + if (Multi.cartSizeA) + strcpy(ROMFilename, Multi.fileNameA); + else + if (Multi.cartSizeB) + strcpy(ROMFilename, Multi.fileNameB); + else + strcpy(ROMFilename, path); + + LoROM = TRUE; + HiROM = FALSE; + CalculatedSize = 0x40000; + + return (TRUE); +} + +bool8 CMemory::LoadSameGame (const char *cartA, const char *cartB) +{ + Multi.cartOffsetA = 0; + Multi.cartOffsetB = 0x200000; + Multi.sramA = SRAM; + Multi.sramB = NULL; + + Multi.sramSizeA = ROM[0xffd8]; + Multi.sramMaskA = Multi.sramSizeA ? ((1 << (Multi.sramSizeA + 3)) * 128 - 1) : 0; + Multi.sramSizeB = 0; + Multi.sramMaskB = 0; + + if (!Settings.NoPatch) + CheckForAnyPatch(cartA, HeaderCount != 0, Multi.cartSizeA); + + strcpy(Multi.fileNameA, cartA); + + if (cartB && cartB[0]) + Multi.cartSizeB = FileLoader(ROM + Multi.cartOffsetB, cartB, MAX_ROM_SIZE - Multi.cartOffsetB); + + if (Multi.cartSizeB) + { + if (!is_SameGame_Add_On(ROM + Multi.cartOffsetB, Multi.cartSizeB)) + Multi.cartSizeB = 0; + else + strcpy(Multi.fileNameB, cartB); + } + + strcpy(ROMFilename, Multi.fileNameA); + + LoROM = FALSE; + HiROM = TRUE; + CalculatedSize = Multi.cartSizeA; + + return (TRUE); +} + +bool8 CMemory::LoadSRTC (void) +{ + FILE *fp; + size_t ignore; + + fp = fopen(S9xGetFilename(".rtc", SRAM_DIR), "rb"); + if (!fp) + return (FALSE); + + ignore = fread(RTCData.reg, 1, 20, fp); + fclose(fp); + + return (TRUE); +} + +bool8 CMemory::SaveSRTC (void) +{ + FILE *fp; + size_t ignore; + + fp = fopen(S9xGetFilename(".rtc", SRAM_DIR), "wb"); + if (!fp) + return (FALSE); + + ignore = fwrite(RTCData.reg, 1, 20, fp); + fclose(fp); + + return (TRUE); +} + +void CMemory::ClearSRAM (bool8 onlyNonSavedSRAM) +{ + if (onlyNonSavedSRAM) + if (!(Settings.SuperFX && ROMType < 0x15) && !(Settings.SA1 && ROMType == 0x34)) // can have SRAM + return; + + memset(SRAM, SNESGameFixes.SRAMInitialValue, 0x20000); +} + +bool8 CMemory::LoadSRAM (const char *filename) +{ + FILE *file; + int size, len; + char sramName[PATH_MAX + 1]; + + strcpy(sramName, filename); + + ClearSRAM(); + + if (Multi.cartType && Multi.sramSizeB) + { + char temp[PATH_MAX + 1]; + + strcpy(temp, ROMFilename); + strcpy(ROMFilename, Multi.fileNameB); + + size = (1 << (Multi.sramSizeB + 3)) * 128; + + file = fopen(S9xGetFilename(".srm", SRAM_DIR), "rb"); + if (file) + { + len = fread((char *) Multi.sramB, 1, 0x10000, file); + fclose(file); + if (len - size == 512) + memmove(Multi.sramB, Multi.sramB + 512, size); + } + + strcpy(ROMFilename, temp); + } + + size = SRAMSize ? (1 << (SRAMSize + 3)) * 128 : 0; + if (size > 0x20000) + size = 0x20000; + + if (size) + { + file = fopen(sramName, "rb"); + if (file) + { + len = fread((char *) SRAM, 1, 0x20000, file); + fclose(file); + if (len - size == 512) + memmove(SRAM, SRAM + 512, size); + + if (Settings.SRTC || Settings.SPC7110RTC) + LoadSRTC(); + + return (TRUE); + } + else + if (Settings.BS && !Settings.BSXItself) + { + // The BS game's SRAM was not found + // Try to read BS-X.srm instead + char path[PATH_MAX + 1]; + + strcpy(path, S9xGetDirectory(SRAM_DIR)); + strcat(path, SLASH_STR); + strcat(path, "BS-X.srm"); + + file = fopen(path, "rb"); + if (file) + { + len = fread((char *) SRAM, 1, 0x20000, file); + fclose(file); + if (len - size == 512) + memmove(SRAM, SRAM + 512, size); + + S9xMessage(S9X_INFO, S9X_ROM_INFO, "The SRAM file wasn't found: BS-X.srm was read instead."); + return (TRUE); + } + else + { + S9xMessage(S9X_INFO, S9X_ROM_INFO, "The SRAM file wasn't found, BS-X.srm wasn't found either."); + return (FALSE); + } + } + + return (FALSE); + } + + return (TRUE); +} + +bool8 CMemory::SaveSRAM (const char *filename) +{ + if (Settings.SuperFX && ROMType < 0x15) // doesn't have SRAM + return (TRUE); + + if (Settings.SA1 && ROMType == 0x34) // doesn't have SRAM + return (TRUE); + + FILE *file; + int size; + char sramName[PATH_MAX + 1]; + + strcpy(sramName, filename); + + if (Multi.cartType && Multi.sramSizeB) + { + char name[PATH_MAX + 1], temp[PATH_MAX + 1]; + + strcpy(temp, ROMFilename); + strcpy(ROMFilename, Multi.fileNameB); + strcpy(name, S9xGetFilename(".srm", SRAM_DIR)); + + size = (1 << (Multi.sramSizeB + 3)) * 128; + + file = fopen(name, "wb"); + if (file) + { + size_t ignore; + ignore = fwrite((char *) Multi.sramB, size, 1, file); + fclose(file); + #ifdef __linux + ignore = chown(name, getuid(), getgid()); + #endif + } + + strcpy(ROMFilename, temp); + } + + size = SRAMSize ? (1 << (SRAMSize + 3)) * 128 : 0; + if (size > 0x20000) + size = 0x20000; + + if (size) + { + file = fopen(sramName, "wb"); + if (file) + { + size_t ignore; + ignore = fwrite((char *) SRAM, size, 1, file); + fclose(file); + #ifdef __linux + ignore = chown(sramName, getuid(), getgid()); + #endif + + if (Settings.SRTC || Settings.SPC7110RTC) + SaveSRTC(); + + return (TRUE); + } + } + + return (FALSE); +} + +// initialization + +static uint32 caCRC32 (uint8 *array, uint32 size, uint32 crc32) +{ + for (uint32 i = 0; i < size; i++) + crc32 = ((crc32 >> 8) & 0x00FFFFFF) ^ crc32Table[(crc32 ^ array[i]) & 0xFF]; + + return (~crc32); +} + +char * CMemory::Safe (const char *s) +{ + static char *safe = NULL; + static int safe_len = 0; + + if (s == NULL) + { + if (safe) + { + free(safe); + safe = NULL; + } + + return (NULL); + } + + int len = strlen(s); + if (!safe || len + 1 > safe_len) + { + if (safe) + free(safe); + + safe_len = len + 1; + safe = (char *) memalign(32,safe_len); + } + + for (int i = 0; i < len; i++) + { + if (s[i] >= 32 && s[i] < 127) + safe[i] = s[i]; + else + safe[i] = '_'; + } + + safe[len] = 0; + + return (safe); +} + +char * CMemory::SafeANK (const char *s) +{ + static char *safe = NULL; + static int safe_len = 0; + + if (s == NULL) + { + if (safe) + { + free(safe); + safe = NULL; + } + + return (NULL); + } + + int len = strlen(s); + if (!safe || len + 1 > safe_len) + { + if (safe) + free(safe); + + safe_len = len + 1; + safe = (char *) memalign(32,safe_len); + } + + for (int i = 0; i < len; i++) + { + if (s[i] >= 32 && s[i] < 127) // ASCII + safe [i] = s[i]; + else + if (ROMRegion == 0 && ((uint8) s[i] >= 0xa0 && (uint8) s[i] < 0xe0)) // JIS X 201 - Katakana + safe [i] = s[i]; + else + safe [i] = '_'; + } + + safe [len] = 0; + + return (safe); +} + +void CMemory::ParseSNESHeader (uint8 *RomHeader) +{ + bool8 bs = Settings.BS & !Settings.BSXItself; + + strncpy(ROMName, (char *) &RomHeader[0x10], ROM_NAME_LEN - 1); + if (bs) + memset(ROMName + 16, 0x20, ROM_NAME_LEN - 17); + + if (bs) + { + if (!(((RomHeader[0x29] & 0x20) && CalculatedSize < 0x100000) || + (!(RomHeader[0x29] & 0x20) && CalculatedSize == 0x100000))) + printf("BS: Size mismatch\n"); + + // FIXME + int p = 0; + while ((1 << p) < (int) CalculatedSize) + p++; + ROMSize = p - 10; + } + else + ROMSize = RomHeader[0x27]; + + SRAMSize = bs ? 5 /* BS-X */ : RomHeader[0x28]; + ROMSpeed = bs ? RomHeader[0x28] : RomHeader[0x25]; + ROMType = bs ? 0xE5 /* BS-X */ : RomHeader[0x26]; + ROMRegion = bs ? 0 : RomHeader[0x29]; + + ROMChecksum = RomHeader[0x2E] + (RomHeader[0x2F] << 8); + ROMComplementChecksum = RomHeader[0x2C] + (RomHeader[0x2D] << 8); + + memmove(ROMId, &RomHeader[0x02], 4); + + if (RomHeader[0x2A] != 0x33) + CompanyId = ((RomHeader[0x2A] >> 4) & 0x0F) * 36 + (RomHeader[0x2A] & 0x0F); + else + if (isalnum(RomHeader[0x00]) && isalnum(RomHeader[0x01])) + { + int l, r, l2, r2; + l = toupper(RomHeader[0x00]); + r = toupper(RomHeader[0x01]); + l2 = (l > '9') ? l - '7' : l - '0'; + r2 = (r > '9') ? r - '7' : r - '0'; + CompanyId = l2 * 36 + r2; + } +} + +void CMemory::InitROM (void) +{ + Settings.SuperFX = FALSE; + Settings.DSP = 0; + Settings.SA1 = FALSE; + Settings.C4 = FALSE; + Settings.SDD1 = FALSE; + Settings.SPC7110 = FALSE; + Settings.SPC7110RTC = FALSE; + Settings.OBC1 = FALSE; + Settings.SETA = 0; + Settings.SRTC = FALSE; + Settings.BS = FALSE; + + SuperFX.nRomBanks = CalculatedSize >> 15; + + SA1.Executing = FALSE; + + //// Parse ROM header and read ROM informatoin + + CompanyId = -1; + memset(ROMId, 0, 5); + + uint8 *RomHeader = ROM + 0x7FB0; + if (ExtendedFormat == BIGFIRST) + RomHeader += 0x400000; + if (HiROM) + RomHeader += 0x8000; + + S9xInitBSX(); // Set BS header before parsing + + ParseSNESHeader(RomHeader); + + //// Detect and initialize chips + //// detection codes are compatible with NSRT + + // DSP1/2/3/4 + if (ROMType == 0x03) + { + if (ROMSpeed == 0x30) + Settings.DSP = 4; // DSP4 + else + Settings.DSP = 1; // DSP1 + } + else + if (ROMType == 0x05) + { + if (ROMSpeed == 0x20) + Settings.DSP = 2; // DSP2 + else + if (ROMSpeed == 0x30 && RomHeader[0x2a] == 0xb2) + Settings.DSP = 3; // DSP3 + else + Settings.DSP = 1; // DSP1 + } + + switch (Settings.DSP) + { + case 1: // DSP1 + if (HiROM) + { + DSP0.boundary = 0x7000; + DSP0.maptype = M_DSP1_HIROM; + } + else + if (CalculatedSize > 0x100000) + { + DSP0.boundary = 0x4000; + DSP0.maptype = M_DSP1_LOROM_L; + } + else + { + DSP0.boundary = 0xc000; + DSP0.maptype = M_DSP1_LOROM_S; + } + + SetDSP = &DSP1SetByte; + GetDSP = &DSP1GetByte; + break; + + case 2: // DSP2 + DSP0.boundary = 0x10000; + DSP0.maptype = M_DSP2_LOROM; + SetDSP = &DSP2SetByte; + GetDSP = &DSP2GetByte; + break; + + case 3: // DSP3 + DSP0.boundary = 0xc000; + DSP0.maptype = M_DSP3_LOROM; + SetDSP = &DSP3SetByte; + GetDSP = &DSP3GetByte; + break; + + case 4: // DSP4 + DSP0.boundary = 0xc000; + DSP0.maptype = M_DSP4_LOROM; + SetDSP = &DSP4SetByte; + GetDSP = &DSP4GetByte; + break; + + default: + SetDSP = NULL; + GetDSP = NULL; + break; + } + + uint32 identifier = ((ROMType & 0xff) << 8) + (ROMSpeed & 0xff); + + switch (identifier) + { + // SRTC + case 0x5535: + Settings.SRTC = TRUE; + S9xInitSRTC(); + break; + + // SPC7110 + case 0xF93A: + Settings.SPC7110RTC = TRUE; + case 0xF53A: + Settings.SPC7110 = TRUE; + S9xInitSPC7110(); + break; + + // OBC1 + case 0x2530: + Settings.OBC1 = TRUE; + break; + + // SA1 + case 0x3423: + case 0x3523: + Settings.SA1 = TRUE; + break; + + // SuperFX + case 0x1320: + case 0x1420: + case 0x1520: + case 0x1A20: + Settings.SuperFX = TRUE; + S9xInitSuperFX(); + if (ROM[0x7FDA] == 0x33) + SRAMSize = ROM[0x7FBD]; + else + SRAMSize = 5; + break; + + // SDD1 + case 0x4332: + case 0x4532: + Settings.SDD1 = TRUE; + break; + + // ST018 + case 0xF530: + Settings.SETA = ST_018; + SetSETA = NULL; + GetSETA = NULL; + SRAMSize = 2; + SNESGameFixes.SRAMInitialValue = 0x00; + break; + + // ST010/011 + case 0xF630: + if (ROM[0x7FD7] == 0x09) + { + Settings.SETA = ST_011; + SetSETA = &S9xSetST011; + GetSETA = &S9xGetST011; + } + else + { + Settings.SETA = ST_010; + SetSETA = &S9xSetST010; + GetSETA = &S9xGetST010; + } + + SRAMSize = 2; + SNESGameFixes.SRAMInitialValue = 0x00; + break; + + // C4 + case 0xF320: + Settings.C4 = TRUE; + break; + } + + //// Map memory and calculate checksum + + Map_Initialize(); + CalculatedChecksum = 0; + + if (HiROM) + { + if (Settings.BS) + /* Do nothing */; + else + if (Settings.SPC7110) + Map_SPC7110HiROMMap(); + else + if (ExtendedFormat != NOPE) + Map_ExtendedHiROMMap(); + else + if (Multi.cartType == 3) + Map_SameGameHiROMMap(); + else + Map_HiROMMap(); + } + else + { + if (Settings.BS) + /* Do nothing */; + else + if (Settings.SETA && Settings.SETA != ST_018) + Map_SetaDSPLoROMMap(); + else + if (Settings.SuperFX) + Map_SuperFXLoROMMap(); + else + if (Settings.SA1) + Map_SA1LoROMMap(); + else + if (Settings.SDD1) + Map_SDD1LoROMMap(); + else + if (ExtendedFormat != NOPE) + Map_JumboLoROMMap(); + else + if (strncmp(ROMName, "WANDERERS FROM YS", 17) == 0) + Map_NoMAD1LoROMMap(); + else + if (strncmp(ROMName, "SOUND NOVEL-TCOOL", 17) == 0 || + strncmp(ROMName, "DERBY STALLION 96", 17) == 0) + Map_ROM24MBSLoROMMap(); + else + if (strncmp(ROMName, "THOROUGHBRED BREEDER3", 21) == 0 || + strncmp(ROMName, "RPG-TCOOL 2", 11) == 0) + Map_SRAM512KLoROMMap(); + else + if (strncmp(ROMName, "ADD-ON BASE CASSETE", 19) == 0) + { + if (Multi.cartType == 4) + { + SRAMSize = Multi.sramSizeA; + Map_SufamiTurboLoROMMap(); + } + else + { + SRAMSize = 5; + Map_SufamiTurboPseudoLoROMMap(); + } + } + else + Map_LoROMMap(); + } + + Checksum_Calculate(); + + bool8 isChecksumOK = (ROMChecksum + ROMComplementChecksum == 0xffff) & + (ROMChecksum == CalculatedChecksum); + + //// Build more ROM information + + // CRC32 + if (!Settings.BS || Settings.BSXItself) // Not BS Dump + ROMCRC32 = caCRC32(ROM, CalculatedSize); + else // Convert to correct format before scan + { + int offset = HiROM ? 0xffc0 : 0x7fc0; + // Backup + uint8 BSMagic0 = ROM[offset + 22], + BSMagic1 = ROM[offset + 23]; + // uCONSRT standard + ROM[offset + 22] = 0x42; + ROM[offset + 23] = 0x00; + // Calc + ROMCRC32 = caCRC32(ROM, CalculatedSize); + // Convert back + ROM[offset + 22] = BSMagic0; + ROM[offset + 23] = BSMagic1; + } + + // NTSC/PAL + if (Settings.ForceNTSC) + Settings.PAL = FALSE; + else + if (Settings.ForcePAL) + Settings.PAL = TRUE; + else + if (!Settings.BS && (ROMRegion >= 2) && (ROMRegion <= 12)) + Settings.PAL = TRUE; + else + Settings.PAL = FALSE; + + if (Settings.PAL) + { + Settings.FrameTime = Settings.FrameTimePAL; + ROMFramesPerSecond = 50; + } + else + { + Settings.FrameTime = Settings.FrameTimeNTSC; + ROMFramesPerSecond = 60; + } + + // truncate cart name + ROMName[ROM_NAME_LEN - 1] = 0; + if (strlen(ROMName)) + { + char *p = ROMName + strlen(ROMName); + if (p > ROMName + 21 && ROMName[20] == ' ') + p = ROMName + 21; + while (p > ROMName && *(p - 1) == ' ') + p--; + *p = 0; + } + + // SRAM size + SRAMMask = SRAMSize ? ((1 << (SRAMSize + 3)) * 128) - 1 : 0; + + // checksum + if (!isChecksumOK || ((uint32) CalculatedSize > (uint32) (((1 << (ROMSize - 7)) * 128) * 1024))) + { + Settings.DisplayColor = BUILD_PIXEL(31, 31, 0); + SET_UI_COLOR(255, 255, 0); + } + + if (Multi.cartType == 4) + { + Settings.DisplayColor = BUILD_PIXEL(0, 16, 31); + SET_UI_COLOR(0, 128, 255); + } + + //// Initialize emulation + + Timings.H_Max_Master = SNES_CYCLES_PER_SCANLINE; + Timings.H_Max = Timings.H_Max_Master; + Timings.HBlankStart = SNES_HBLANK_START_HC; + Timings.HBlankEnd = SNES_HBLANK_END_HC; + Timings.HDMAInit = SNES_HDMA_INIT_HC; + Timings.HDMAStart = SNES_HDMA_START_HC; + Timings.RenderPos = SNES_RENDER_START_HC; + Timings.V_Max_Master = Settings.PAL ? SNES_MAX_PAL_VCOUNTER : SNES_MAX_NTSC_VCOUNTER; + Timings.V_Max = Timings.V_Max_Master; + /* From byuu: The total delay time for both the initial (H)DMA sync (to the DMA clock), + and the end (H)DMA sync (back to the last CPU cycle's mcycle rate (6, 8, or 12)) always takes between 12-24 mcycles. + Possible delays: { 12, 14, 16, 18, 20, 22, 24 } + XXX: Snes9x can't emulate this timing :( so let's use the average value... */ + Timings.DMACPUSync = 18; + /* If the CPU is halted (i.e. for DMA) while /NMI goes low, the NMI will trigger + after the DMA completes (even if /NMI goes high again before the DMA + completes). In this case, there is a 24-30 cycle delay between the end of DMA + and the NMI handler, time enough for an instruction or two. */ + // Wild Guns, Mighty Morphin Power Rangers - The Fighting Edition + Timings.NMIDMADelay = 24; + Timings.IRQPendCount = 0; + + IPPU.TotalEmulatedFrames = 0; + + //// Hack games + + ApplyROMFixes(); + + //// Show ROM information + char displayName[ROM_NAME_LEN]; + + strcpy(RawROMName, ROMName); + sprintf(displayName, "%s", SafeANK(ROMName)); + sprintf(ROMName, "%s", Safe(ROMName)); + sprintf(ROMId, "%s", Safe(ROMId)); + + sprintf(String, "\"%s\" [%s] %s, %s, %s, %s, SRAM:%s, ID:%s, CRC32:%08X", + displayName, isChecksumOK ? "checksum ok" : ((Multi.cartType == 4) ? "no checksum" : "bad checksum"), + MapType(), Size(), KartContents(), Settings.PAL ? "PAL" : "NTSC", StaticRAMSize(), ROMId, ROMCRC32); + S9xMessage(S9X_INFO, S9X_ROM_INFO, String); + + Settings.ForceLoROM = FALSE; + Settings.ForceHiROM = FALSE; + Settings.ForceHeader = FALSE; + Settings.ForceNoHeader = FALSE; + Settings.ForceInterleaved = FALSE; + Settings.ForceInterleaved2 = FALSE; + Settings.ForceInterleaveGD24 = FALSE; + Settings.ForceNotInterleaved = FALSE; + Settings.ForcePAL = FALSE; + Settings.ForceNTSC = FALSE; + + Settings.TakeScreenshot = FALSE; + + if (stopMovie) + S9xMovieStop(TRUE); + + if (PostRomInitFunc) + PostRomInitFunc(); + + S9xVerifyControllers(); +} + +// memory map + +uint32 CMemory::map_mirror (uint32 size, uint32 pos) +{ + // from bsnes + if (size == 0) + return (0); + if (pos < size) + return (pos); + + uint32 mask = 1 << 31; + while (!(pos & mask)) + mask >>= 1; + + if (size <= (pos & mask)) + return (map_mirror(size, pos - mask)); + else + return (mask + map_mirror(size - mask, pos - mask)); +} + +void CMemory::map_lorom (uint32 bank_s, uint32 bank_e, uint32 addr_s, uint32 addr_e, uint32 size) +{ + uint32 c, i, p, addr; + + for (c = bank_s; c <= bank_e; c++) + { + for (i = addr_s; i <= addr_e; i += 0x1000) + { + p = (c << 4) | (i >> 12); + addr = (c & 0x7f) * 0x8000; + Map[p] = ROM + map_mirror(size, addr) - (i & 0x8000); + BlockIsROM[p] = TRUE; + BlockIsRAM[p] = FALSE; + } + } +} + +void CMemory::map_hirom (uint32 bank_s, uint32 bank_e, uint32 addr_s, uint32 addr_e, uint32 size) +{ + uint32 c, i, p, addr; + + for (c = bank_s; c <= bank_e; c++) + { + for (i = addr_s; i <= addr_e; i += 0x1000) + { + p = (c << 4) | (i >> 12); + addr = c << 16; + Map[p] = ROM + map_mirror(size, addr); + BlockIsROM[p] = TRUE; + BlockIsRAM[p] = FALSE; + } + } +} + +void CMemory::map_lorom_offset (uint32 bank_s, uint32 bank_e, uint32 addr_s, uint32 addr_e, uint32 size, uint32 offset) +{ + uint32 c, i, p, addr; + + for (c = bank_s; c <= bank_e; c++) + { + for (i = addr_s; i <= addr_e; i += 0x1000) + { + p = (c << 4) | (i >> 12); + addr = ((c - bank_s) & 0x7f) * 0x8000; + Map[p] = ROM + offset + map_mirror(size, addr) - (i & 0x8000); + BlockIsROM[p] = TRUE; + BlockIsRAM[p] = FALSE; + } + } +} + +void CMemory::map_hirom_offset (uint32 bank_s, uint32 bank_e, uint32 addr_s, uint32 addr_e, uint32 size, uint32 offset) +{ + uint32 c, i, p, addr; + + for (c = bank_s; c <= bank_e; c++) + { + for (i = addr_s; i <= addr_e; i += 0x1000) + { + p = (c << 4) | (i >> 12); + addr = (c - bank_s) << 16; + Map[p] = ROM + offset + map_mirror(size, addr); + BlockIsROM[p] = TRUE; + BlockIsRAM[p] = FALSE; + } + } +} + +void CMemory::map_space (uint32 bank_s, uint32 bank_e, uint32 addr_s, uint32 addr_e, uint8 *data) +{ + uint32 c, i, p; + + for (c = bank_s; c <= bank_e; c++) + { + for (i = addr_s; i <= addr_e; i += 0x1000) + { + p = (c << 4) | (i >> 12); + Map[p] = data; + BlockIsROM[p] = FALSE; + BlockIsRAM[p] = TRUE; + } + } +} + +void CMemory::map_index (uint32 bank_s, uint32 bank_e, uint32 addr_s, uint32 addr_e, int index, int type) +{ + uint32 c, i, p; + bool8 isROM, isRAM; + + isROM = ((type == MAP_TYPE_I_O) || (type == MAP_TYPE_RAM)) ? FALSE : TRUE; + isRAM = ((type == MAP_TYPE_I_O) || (type == MAP_TYPE_ROM)) ? FALSE : TRUE; + + for (c = bank_s; c <= bank_e; c++) + { + for (i = addr_s; i <= addr_e; i += 0x1000) + { + p = (c << 4) | (i >> 12); + Map[p] = (uint8 *) index; + BlockIsROM[p] = isROM; + BlockIsRAM[p] = isRAM; + } + } +} + +void CMemory::map_System (void) +{ + // will be overwritten + map_space(0x00, 0x3f, 0x0000, 0x1fff, RAM); + map_index(0x00, 0x3f, 0x2000, 0x3fff, MAP_PPU, MAP_TYPE_I_O); + map_index(0x00, 0x3f, 0x4000, 0x5fff, MAP_CPU, MAP_TYPE_I_O); + map_space(0x80, 0xbf, 0x0000, 0x1fff, RAM); + map_index(0x80, 0xbf, 0x2000, 0x3fff, MAP_PPU, MAP_TYPE_I_O); + map_index(0x80, 0xbf, 0x4000, 0x5fff, MAP_CPU, MAP_TYPE_I_O); +} + +void CMemory::map_WRAM (void) +{ + // will overwrite others + map_space(0x7e, 0x7e, 0x0000, 0xffff, RAM); + map_space(0x7f, 0x7f, 0x0000, 0xffff, RAM + 0x10000); +} + +void CMemory::map_LoROMSRAM (void) +{ + map_index(0x70, 0x7f, 0x0000, 0x7fff, MAP_LOROM_SRAM, MAP_TYPE_RAM); + map_index(0xf0, 0xff, 0x0000, 0x7fff, MAP_LOROM_SRAM, MAP_TYPE_RAM); +} + +void CMemory::map_HiROMSRAM (void) +{ + map_index(0x20, 0x3f, 0x6000, 0x7fff, MAP_HIROM_SRAM, MAP_TYPE_RAM); + map_index(0xa0, 0xbf, 0x6000, 0x7fff, MAP_HIROM_SRAM, MAP_TYPE_RAM); +} + +void CMemory::map_DSP (void) +{ + switch (DSP0.maptype) + { + case M_DSP1_LOROM_S: + map_index(0x20, 0x3f, 0x8000, 0xffff, MAP_DSP, MAP_TYPE_I_O); + map_index(0xa0, 0xbf, 0x8000, 0xffff, MAP_DSP, MAP_TYPE_I_O); + break; + + case M_DSP1_LOROM_L: + map_index(0x60, 0x6f, 0x0000, 0x7fff, MAP_DSP, MAP_TYPE_I_O); + map_index(0xe0, 0xef, 0x0000, 0x7fff, MAP_DSP, MAP_TYPE_I_O); + break; + + case M_DSP1_HIROM: + map_index(0x00, 0x1f, 0x6000, 0x7fff, MAP_DSP, MAP_TYPE_I_O); + map_index(0x80, 0x9f, 0x6000, 0x7fff, MAP_DSP, MAP_TYPE_I_O); + break; + + case M_DSP2_LOROM: + map_index(0x20, 0x3f, 0x6000, 0x6fff, MAP_DSP, MAP_TYPE_I_O); + map_index(0x20, 0x3f, 0x8000, 0xbfff, MAP_DSP, MAP_TYPE_I_O); + map_index(0xa0, 0xbf, 0x6000, 0x6fff, MAP_DSP, MAP_TYPE_I_O); + map_index(0xa0, 0xbf, 0x8000, 0xbfff, MAP_DSP, MAP_TYPE_I_O); + break; + + case M_DSP3_LOROM: + map_index(0x20, 0x3f, 0x8000, 0xffff, MAP_DSP, MAP_TYPE_I_O); + map_index(0xa0, 0xbf, 0x8000, 0xffff, MAP_DSP, MAP_TYPE_I_O); + break; + + case M_DSP4_LOROM: + map_index(0x30, 0x3f, 0x8000, 0xffff, MAP_DSP, MAP_TYPE_I_O); + map_index(0xb0, 0xbf, 0x8000, 0xffff, MAP_DSP, MAP_TYPE_I_O); + break; + } +} + +void CMemory::map_C4 (void) +{ + map_index(0x00, 0x3f, 0x6000, 0x7fff, MAP_C4, MAP_TYPE_I_O); + map_index(0x80, 0xbf, 0x6000, 0x7fff, MAP_C4, MAP_TYPE_I_O); +} + +void CMemory::map_OBC1 (void) +{ + map_index(0x00, 0x3f, 0x6000, 0x7fff, MAP_OBC_RAM, MAP_TYPE_I_O); + map_index(0x80, 0xbf, 0x6000, 0x7fff, MAP_OBC_RAM, MAP_TYPE_I_O); +} + +void CMemory::map_SetaRISC (void) +{ + map_index(0x00, 0x3f, 0x3000, 0x3fff, MAP_SETA_RISC, MAP_TYPE_I_O); + map_index(0x80, 0xbf, 0x3000, 0x3fff, MAP_SETA_RISC, MAP_TYPE_I_O); +} + +void CMemory::map_SetaDSP (void) +{ + // where does the SETA chip access, anyway? + // please confirm this? + map_index(0x68, 0x6f, 0x0000, 0x7fff, MAP_SETA_DSP, MAP_TYPE_RAM); + // and this! + map_index(0x60, 0x67, 0x0000, 0x3fff, MAP_SETA_DSP, MAP_TYPE_I_O); + + // ST-0010: + // map_index(0x68, 0x6f, 0x0000, 0x0fff, MAP_SETA_DSP, ?); +} + +void CMemory::map_WriteProtectROM (void) +{ + memmove((void *) WriteMap, (void *) Map, sizeof(Map)); + + for (int c = 0; c < 0x1000; c++) + { + if (BlockIsROM[c]) + WriteMap[c] = (uint8 *) MAP_NONE; + } +} + +void CMemory::Map_Initialize (void) +{ + for (int c = 0; c < 0x1000; c++) + { + Map[c] = (uint8 *) MAP_NONE; + WriteMap[c] = (uint8 *) MAP_NONE; + BlockIsROM[c] = FALSE; + BlockIsRAM[c] = FALSE; + } +} + +void CMemory::Map_LoROMMap (void) +{ + printf("Map_LoROMMap\n"); + map_System(); + + map_lorom(0x00, 0x3f, 0x8000, 0xffff, CalculatedSize); + map_lorom(0x40, 0x7f, 0x0000, 0xffff, CalculatedSize); + map_lorom(0x80, 0xbf, 0x8000, 0xffff, CalculatedSize); + map_lorom(0xc0, 0xff, 0x0000, 0xffff, CalculatedSize); + + if (Settings.DSP) + map_DSP(); + else + if (Settings.C4) + map_C4(); + else + if (Settings.OBC1) + map_OBC1(); + else + if (Settings.SETA == ST_018) + map_SetaRISC(); + + map_LoROMSRAM(); + map_WRAM(); + + map_WriteProtectROM(); +} + +void CMemory::Map_NoMAD1LoROMMap (void) +{ + printf("Map_NoMAD1LoROMMap\n"); + map_System(); + + map_lorom(0x00, 0x3f, 0x8000, 0xffff, CalculatedSize); + map_lorom(0x40, 0x7f, 0x0000, 0xffff, CalculatedSize); + map_lorom(0x80, 0xbf, 0x8000, 0xffff, CalculatedSize); + map_lorom(0xc0, 0xff, 0x0000, 0xffff, CalculatedSize); + + map_index(0x70, 0x7f, 0x0000, 0xffff, MAP_LOROM_SRAM, MAP_TYPE_RAM); + map_index(0xf0, 0xff, 0x0000, 0xffff, MAP_LOROM_SRAM, MAP_TYPE_RAM); + + map_WRAM(); + + map_WriteProtectROM(); +} + +void CMemory::Map_JumboLoROMMap (void) +{ + // XXX: Which game uses this? + printf("Map_JumboLoROMMap\n"); + map_System(); + + map_lorom_offset(0x00, 0x3f, 0x8000, 0xffff, CalculatedSize - 0x400000, 0x400000); + map_lorom_offset(0x40, 0x7f, 0x0000, 0xffff, CalculatedSize - 0x400000, 0x400000); + map_lorom_offset(0x80, 0xbf, 0x8000, 0xffff, 0x400000, 0); + map_lorom_offset(0xc0, 0xff, 0x0000, 0xffff, 0x400000, 0x200000); + + map_LoROMSRAM(); + map_WRAM(); + + map_WriteProtectROM(); +} + +void CMemory::Map_ROM24MBSLoROMMap (void) +{ + // PCB: BSC-1A5M-01, BSC-1A7M-10 + printf("Map_ROM24MBSLoROMMap\n"); + map_System(); + + map_lorom_offset(0x00, 0x1f, 0x8000, 0xffff, 0x100000, 0); + map_lorom_offset(0x20, 0x3f, 0x8000, 0xffff, 0x100000, 0x100000); + map_lorom_offset(0x80, 0x9f, 0x8000, 0xffff, 0x100000, 0x200000); + map_lorom_offset(0xa0, 0xbf, 0x8000, 0xffff, 0x100000, 0x100000); + + map_LoROMSRAM(); + map_WRAM(); + + map_WriteProtectROM(); +} + +void CMemory::Map_SRAM512KLoROMMap (void) +{ + printf("Map_SRAM512KLoROMMap\n"); + map_System(); + + map_lorom(0x00, 0x3f, 0x8000, 0xffff, CalculatedSize); + map_lorom(0x40, 0x7f, 0x0000, 0xffff, CalculatedSize); + map_lorom(0x80, 0xbf, 0x8000, 0xffff, CalculatedSize); + map_lorom(0xc0, 0xff, 0x0000, 0xffff, CalculatedSize); + + map_space(0x70, 0x70, 0x0000, 0xffff, SRAM); + map_space(0x71, 0x71, 0x0000, 0xffff, SRAM + 0x8000); + map_space(0x72, 0x72, 0x0000, 0xffff, SRAM + 0x10000); + map_space(0x73, 0x73, 0x0000, 0xffff, SRAM + 0x18000); + + map_WRAM(); + + map_WriteProtectROM(); +} + +void CMemory::Map_SufamiTurboLoROMMap (void) +{ + printf("Map_SufamiTurboLoROMMap\n"); + map_System(); + + map_lorom_offset(0x00, 0x1f, 0x8000, 0xffff, 0x40000, 0); + map_lorom_offset(0x20, 0x3f, 0x8000, 0xffff, Multi.cartSizeA, Multi.cartOffsetA); + map_lorom_offset(0x40, 0x5f, 0x8000, 0xffff, Multi.cartSizeB, Multi.cartOffsetB); + map_lorom_offset(0x80, 0x9f, 0x8000, 0xffff, 0x40000, 0); + map_lorom_offset(0xa0, 0xbf, 0x8000, 0xffff, Multi.cartSizeA, Multi.cartOffsetA); + map_lorom_offset(0xc0, 0xdf, 0x8000, 0xffff, Multi.cartSizeB, Multi.cartOffsetB); + + if (Multi.sramSizeA) + { + map_index(0x60, 0x63, 0x8000, 0xffff, MAP_LOROM_SRAM, MAP_TYPE_RAM); + map_index(0xe0, 0xe3, 0x8000, 0xffff, MAP_LOROM_SRAM, MAP_TYPE_RAM); + } + + if (Multi.sramSizeB) + { + map_index(0x70, 0x73, 0x8000, 0xffff, MAP_LOROM_SRAM_B, MAP_TYPE_RAM); + map_index(0xf0, 0xf3, 0x8000, 0xffff, MAP_LOROM_SRAM_B, MAP_TYPE_RAM); + } + + map_WRAM(); + + map_WriteProtectROM(); +} + +void CMemory::Map_SufamiTurboPseudoLoROMMap (void) +{ + // for combined images + printf("Map_SufamiTurboPseudoLoROMMap\n"); + map_System(); + + map_lorom_offset(0x00, 0x1f, 0x8000, 0xffff, 0x40000, 0); + map_lorom_offset(0x20, 0x3f, 0x8000, 0xffff, 0x100000, 0x100000); + map_lorom_offset(0x40, 0x5f, 0x8000, 0xffff, 0x100000, 0x200000); + map_lorom_offset(0x80, 0x9f, 0x8000, 0xffff, 0x40000, 0); + map_lorom_offset(0xa0, 0xbf, 0x8000, 0xffff, 0x100000, 0x100000); + map_lorom_offset(0xc0, 0xdf, 0x8000, 0xffff, 0x100000, 0x200000); + + // I don't care :P + map_space(0x60, 0x63, 0x8000, 0xffff, SRAM - 0x8000); + map_space(0xe0, 0xe3, 0x8000, 0xffff, SRAM - 0x8000); + map_space(0x70, 0x73, 0x8000, 0xffff, SRAM + 0x4000 - 0x8000); + map_space(0xf0, 0xf3, 0x8000, 0xffff, SRAM + 0x4000 - 0x8000); + + map_WRAM(); + + map_WriteProtectROM(); +} + +void CMemory::Map_SuperFXLoROMMap (void) +{ + printf("Map_SuperFXLoROMMap\n"); + map_System(); + + // Replicate the first 2Mb of the ROM at ROM + 2MB such that each 32K + // block is repeated twice in each 64K block. + for (int c = 0; c < 64; c++) + { + memmove(&ROM[0x200000 + c * 0x10000], &ROM[c * 0x8000], 0x8000); + memmove(&ROM[0x208000 + c * 0x10000], &ROM[c * 0x8000], 0x8000); + } + + map_lorom(0x00, 0x3f, 0x8000, 0xffff, CalculatedSize); + map_lorom(0x80, 0xbf, 0x8000, 0xffff, CalculatedSize); + + map_hirom_offset(0x40, 0x7f, 0x0000, 0xffff, CalculatedSize, 0); + map_hirom_offset(0xc0, 0xff, 0x0000, 0xffff, CalculatedSize, 0); + + map_space(0x00, 0x3f, 0x6000, 0x7fff, SRAM - 0x6000); + map_space(0x80, 0xbf, 0x6000, 0x7fff, SRAM - 0x6000); + map_space(0x70, 0x70, 0x0000, 0xffff, SRAM); + map_space(0x71, 0x71, 0x0000, 0xffff, SRAM + 0x10000); + + map_WRAM(); + + map_WriteProtectROM(); +} + +void CMemory::Map_SetaDSPLoROMMap (void) +{ + printf("Map_SetaDSPLoROMMap\n"); + map_System(); + + map_lorom(0x00, 0x3f, 0x8000, 0xffff, CalculatedSize); + map_lorom(0x40, 0x7f, 0x8000, 0xffff, CalculatedSize); + map_lorom(0x80, 0xbf, 0x8000, 0xffff, CalculatedSize); + map_lorom(0xc0, 0xff, 0x8000, 0xffff, CalculatedSize); + + map_SetaDSP(); + + map_LoROMSRAM(); + map_WRAM(); + + map_WriteProtectROM(); +} + +void CMemory::Map_SDD1LoROMMap (void) +{ + printf("Map_SDD1LoROMMap\n"); + map_System(); + + map_lorom(0x00, 0x3f, 0x8000, 0xffff, CalculatedSize); + map_lorom(0x80, 0xbf, 0x8000, 0xffff, CalculatedSize); + + map_hirom_offset(0x40, 0x7f, 0x0000, 0xffff, CalculatedSize, 0); + map_hirom_offset(0xc0, 0xff, 0x0000, 0xffff, CalculatedSize, 0); // will be overwritten dynamically + + map_index(0x70, 0x7f, 0x0000, 0x7fff, MAP_LOROM_SRAM, MAP_TYPE_RAM); + + map_WRAM(); + + map_WriteProtectROM(); +} + +void CMemory::Map_SA1LoROMMap (void) +{ + printf("Map_SA1LoROMMap\n"); + map_System(); + + map_lorom(0x00, 0x3f, 0x8000, 0xffff, CalculatedSize); + map_lorom(0x80, 0xbf, 0x8000, 0xffff, CalculatedSize); + + map_hirom_offset(0xc0, 0xff, 0x0000, 0xffff, CalculatedSize, 0); + + map_space(0x00, 0x3f, 0x3000, 0x3fff, FillRAM); + map_space(0x80, 0xbf, 0x3000, 0x3fff, FillRAM); + map_index(0x00, 0x3f, 0x6000, 0x7fff, MAP_BWRAM, MAP_TYPE_I_O); + map_index(0x80, 0xbf, 0x6000, 0x7fff, MAP_BWRAM, MAP_TYPE_I_O); + + for (int c = 0x40; c < 0x80; c++) + map_space(c, c, 0x0000, 0xffff, SRAM + (c & 1) * 0x10000); + + map_WRAM(); + + map_WriteProtectROM(); + + // Now copy the map and correct it for the SA1 CPU. + memmove((void *) SA1.Map, (void *) Map, sizeof(Map)); + memmove((void *) SA1.WriteMap, (void *) WriteMap, sizeof(WriteMap)); + + // SA-1 Banks 00->3f and 80->bf + for (int c = 0x000; c < 0x400; c += 0x10) + { + SA1.Map[c + 0] = SA1.Map[c + 0x800] = FillRAM + 0x3000; + SA1.Map[c + 1] = SA1.Map[c + 0x801] = (uint8 *) MAP_NONE; + SA1.WriteMap[c + 0] = SA1.WriteMap[c + 0x800] = FillRAM + 0x3000; + SA1.WriteMap[c + 1] = SA1.WriteMap[c + 0x801] = (uint8 *) MAP_NONE; + } + + // SA-1 Banks 60->6f + for (int c = 0x600; c < 0x700; c++) + SA1.Map[c] = SA1.WriteMap[c] = (uint8 *) MAP_BWRAM_BITMAP; + + BWRAM = SRAM; +} + +void CMemory::Map_HiROMMap (void) +{ + printf("Map_HiROMMap\n"); + map_System(); + + map_hirom(0x00, 0x3f, 0x8000, 0xffff, CalculatedSize); + map_hirom(0x40, 0x7f, 0x0000, 0xffff, CalculatedSize); + map_hirom(0x80, 0xbf, 0x8000, 0xffff, CalculatedSize); + map_hirom(0xc0, 0xff, 0x0000, 0xffff, CalculatedSize); + + if (Settings.DSP) + map_DSP(); + + map_HiROMSRAM(); + map_WRAM(); + + map_WriteProtectROM(); +} + +void CMemory::Map_ExtendedHiROMMap (void) +{ + printf("Map_ExtendedHiROMMap\n"); + map_System(); + + map_hirom_offset(0x00, 0x3f, 0x8000, 0xffff, CalculatedSize - 0x400000, 0x400000); + map_hirom_offset(0x40, 0x7f, 0x0000, 0xffff, CalculatedSize - 0x400000, 0x400000); + map_hirom_offset(0x80, 0xbf, 0x8000, 0xffff, 0x400000, 0); + map_hirom_offset(0xc0, 0xff, 0x0000, 0xffff, 0x400000, 0); + + map_HiROMSRAM(); + map_WRAM(); + + map_WriteProtectROM(); +} + +void CMemory::Map_SameGameHiROMMap (void) +{ + printf("Map_SameGameHiROMMap\n"); + map_System(); + + map_hirom_offset(0x00, 0x1f, 0x8000, 0xffff, Multi.cartSizeA, Multi.cartOffsetA); + map_hirom_offset(0x20, 0x3f, 0x8000, 0xffff, Multi.cartSizeB, Multi.cartOffsetB); + map_hirom_offset(0x40, 0x5f, 0x0000, 0xffff, Multi.cartSizeA, Multi.cartOffsetA); + map_hirom_offset(0x60, 0x7f, 0x0000, 0xffff, Multi.cartSizeB, Multi.cartOffsetB); + map_hirom_offset(0x80, 0x9f, 0x8000, 0xffff, Multi.cartSizeA, Multi.cartOffsetA); + map_hirom_offset(0xa0, 0xbf, 0x8000, 0xffff, Multi.cartSizeB, Multi.cartOffsetB); + map_hirom_offset(0xc0, 0xdf, 0x0000, 0xffff, Multi.cartSizeA, Multi.cartOffsetA); + map_hirom_offset(0xe0, 0xff, 0x0000, 0xffff, Multi.cartSizeB, Multi.cartOffsetB); + + map_HiROMSRAM(); + map_WRAM(); + + map_WriteProtectROM(); +} + +void CMemory::Map_SPC7110HiROMMap (void) +{ + printf("Map_SPC7110HiROMMap\n"); + map_System(); + + map_index(0x00, 0x00, 0x6000, 0x7fff, MAP_HIROM_SRAM, MAP_TYPE_RAM); + map_hirom(0x00, 0x0f, 0x8000, 0xffff, CalculatedSize); + map_index(0x30, 0x30, 0x6000, 0x7fff, MAP_HIROM_SRAM, MAP_TYPE_RAM); + map_index(0x50, 0x50, 0x0000, 0xffff, MAP_SPC7110_DRAM, MAP_TYPE_ROM); + map_hirom(0x80, 0x8f, 0x8000, 0xffff, CalculatedSize); + map_hirom_offset(0xc0, 0xcf, 0x0000, 0xffff, CalculatedSize, 0); + map_index(0xd0, 0xff, 0x0000, 0xffff, MAP_SPC7110_ROM, MAP_TYPE_ROM); + + map_WRAM(); + + map_WriteProtectROM(); +} + +// checksum + +uint16 CMemory::checksum_calc_sum (uint8 *data, uint32 length) +{ + uint16 sum = 0; + + for (uint32 i = 0; i < length; i++) + sum += data[i]; + + return (sum); +} + +uint16 CMemory::checksum_mirror_sum (uint8 *start, uint32 &length, uint32 mask) +{ + // from NSRT + while (!(length & mask)) + mask >>= 1; + + uint16 part1 = checksum_calc_sum(start, mask); + uint16 part2 = 0; + + uint32 next_length = length - mask; + if (next_length) + { + part2 = checksum_mirror_sum(start + mask, next_length, mask >> 1); + + while (next_length < mask) + { + next_length += next_length; + part2 += part2; + } + + length = mask + mask; + } + + return (part1 + part2); +} + +void CMemory::Checksum_Calculate (void) +{ + // from NSRT + uint16 sum = 0; + + if (Settings.BS && !Settings.BSXItself) + sum = checksum_calc_sum(ROM, CalculatedSize) - checksum_calc_sum(ROM + (HiROM ? 0xffb0 : 0x7fb0), 48); + else + if (Settings.SPC7110) + { + sum = checksum_calc_sum(ROM, CalculatedSize); + if (CalculatedSize == 0x300000) + sum += sum; + } + else + { + if (CalculatedSize & 0x7fff) + sum = checksum_calc_sum(ROM, CalculatedSize); + else + { + uint32 length = CalculatedSize; + sum = checksum_mirror_sum(ROM, length); + } + } + + CalculatedChecksum = sum; +} + +// information + +const char * CMemory::MapType (void) +{ + return (HiROM ? ((ExtendedFormat != NOPE) ? "ExHiROM": "HiROM") : "LoROM"); +} + +const char * CMemory::StaticRAMSize (void) +{ + static char str[20]; + + if (SRAMSize > 16) + strcpy(str, "Corrupt"); + else + sprintf(str, "%dKbits", 8 * (SRAMMask + 1) / 1024); + + return (str); +} + +const char * CMemory::Size (void) +{ + static char str[20]; + + if (Multi.cartType == 4) + strcpy(str, "N/A"); + else + if (ROMSize < 7 || ROMSize - 7 > 23) + strcpy(str, "Corrupt"); + else + sprintf(str, "%dMbits", 1 << (ROMSize - 7)); + + return (str); +} + +const char * CMemory::Revision (void) +{ + static char str[20]; + + sprintf(str, "1.%d", HiROM ? ((ExtendedFormat != NOPE) ? ROM[0x40ffdb] : ROM[0xffdb]) : ROM[0x7fdb]); + + return (str); +} + +const char * CMemory::KartContents (void) +{ + static char str[64]; + static const char *contents[3] = { "ROM", "ROM+RAM", "ROM+RAM+BAT" }; + + char chip[16]; + + if (ROMType == 0 && !Settings.BS) + return ("ROM"); + + if (Settings.BS) + strcpy(chip, "+BS"); + else + if (Settings.SuperFX) + strcpy(chip, "+Super FX"); + else + if (Settings.SDD1) + strcpy(chip, "+S-DD1"); + else + if (Settings.OBC1) + strcpy(chip, "+OBC1"); + else + if (Settings.SA1) + strcpy(chip, "+SA-1"); + else + if (Settings.SPC7110RTC) + strcpy(chip, "+SPC7110+RTC"); + else + if (Settings.SPC7110) + strcpy(chip, "+SPC7110"); + else + if (Settings.SRTC) + strcpy(chip, "+S-RTC"); + else + if (Settings.C4) + strcpy(chip, "+C4"); + else + if (Settings.SETA == ST_010) + strcpy(chip, "+ST-010"); + else + if (Settings.SETA == ST_011) + strcpy(chip, "+ST-011"); + else + if (Settings.SETA == ST_018) + strcpy(chip, "+ST-018"); + else + if (Settings.DSP) + sprintf(chip, "+DSP-%d", Settings.DSP); + else + strcpy(chip, ""); + + sprintf(str, "%s%s", contents[(ROMType & 0xf) % 3], chip); + + return (str); +} + +const char * CMemory::Country (void) +{ + switch (ROMRegion) + { + case 0: return("Japan"); + case 1: return("USA and Canada"); + case 2: return("Oceania, Europe and Asia"); + case 3: return("Sweden"); + case 4: return("Finland"); + case 5: return("Denmark"); + case 6: return("France"); + case 7: return("Holland"); + case 8: return("Spain"); + case 9: return("Germany, Austria and Switzerland"); + case 10: return("Italy"); + case 11: return("Hong Kong and China"); + case 12: return("Indonesia"); + case 13: return("South Korea"); + default: return("Unknown"); + } +} + +const char * CMemory::PublishingCompany (void) +{ + if (CompanyId >= (int) (sizeof(nintendo_licensees) / sizeof(nintendo_licensees[0])) || CompanyId < 0) + return ("Unknown"); + + if (nintendo_licensees[CompanyId] == NULL) + return ("Unknown"); + + return (nintendo_licensees[CompanyId]); +} + +void CMemory::MakeRomInfoText (char *romtext) +{ + char temp[256]; + + romtext[0] = 0; + + sprintf(temp, " Cart Name: %s", ROMName); + strcat(romtext, temp); + sprintf(temp, "\n Game Code: %s", ROMId); + strcat(romtext, temp); + sprintf(temp, "\n Contents: %s", KartContents()); + strcat(romtext, temp); + sprintf(temp, "\n Map: %s", MapType()); + strcat(romtext, temp); + sprintf(temp, "\n Speed: 0x%02X (%s)", ROMSpeed, (ROMSpeed & 0x10) ? "FastROM" : "SlowROM"); + strcat(romtext, temp); + sprintf(temp, "\n Type: 0x%02X", ROMType); + strcat(romtext, temp); + sprintf(temp, "\n Size (calculated): %dMbits", CalculatedSize / 0x20000); + strcat(romtext, temp); + sprintf(temp, "\n Size (header): %s", Size()); + strcat(romtext, temp); + sprintf(temp, "\n SRAM size: %s", StaticRAMSize()); + strcat(romtext, temp); + sprintf(temp, "\nChecksum (calculated): 0x%04X", CalculatedChecksum); + strcat(romtext, temp); + sprintf(temp, "\n Checksum (header): 0x%04X", ROMChecksum); + strcat(romtext, temp); + sprintf(temp, "\n Complement (header): 0x%04X", ROMComplementChecksum); + strcat(romtext, temp); + sprintf(temp, "\n Video Output: %s", (ROMRegion > 12 || ROMRegion < 2) ? "NTSC 60Hz" : "PAL 50Hz"); + strcat(romtext, temp); + sprintf(temp, "\n Revision: %s", Revision()); + strcat(romtext, temp); + sprintf(temp, "\n Licensee: %s", PublishingCompany()); + strcat(romtext, temp); + sprintf(temp, "\n Region: %s", Country()); + strcat(romtext, temp); + sprintf(temp, "\n CRC32: 0x%08X", ROMCRC32); + strcat(romtext, temp); +} + +// hack + +bool8 CMemory::match_na (const char *str) +{ + return (strcmp(ROMName, str) == 0); +} + +bool8 CMemory::match_nn (const char *str) +{ + return (strncmp(ROMName, str, strlen(str)) == 0); +} + +bool8 CMemory::match_nc (const char *str) +{ + return (strncasecmp(ROMName, str, strlen(str)) == 0); +} + +bool8 CMemory::match_id (const char *str) +{ + return (strncmp(ROMId, str, strlen(str)) == 0); +} + +void CMemory::ApplyROMFixes (void) +{ + Settings.Shutdown = Settings.ShutdownMaster; + Settings.BlockInvalidVRAMAccess = Settings.BlockInvalidVRAMAccessMaster; + + //// Warnings + + // Reject strange hacked games + if ((ROMCRC32 == 0x6810aa95) || + (ROMCRC32 == 0x340f23e5) || + (ROMCRC32 == 0x77fd806a) || + (match_nn("HIGHWAY BATTLE 2")) || + (match_na("FX SKIING NINTENDO 96") && (ROM[0x7fda] == 0)) || + (match_nn("HONKAKUHA IGO GOSEI") && (ROM[0xffd5] != 0x31))) + { + Settings.DisplayColor = BUILD_PIXEL(31, 0, 0); + SET_UI_COLOR(255, 0, 0); + } + + //// APU timing hacks :( + + Timings.APUSpeedup = 0; + Timings.APUAllowTimeOverflow = FALSE; + + if (!Settings.DisableGameSpecificHacks) + { + if (match_id("AVCJ")) // Rendering Ranger R2 + Timings.APUSpeedup = 4; + + if (match_na("GAIA GENSOUKI 1 JPN") || // Gaia Gensouki + match_id("JG ") || // Illusion of Gaia + match_id("CQ ") || // Stunt Race FX + match_na("SOULBLADER - 1") || // Soul Blader + match_na("SOULBLAZER - 1 USA") || // Soul Blazer + match_na("SLAP STICK 1 JPN") || // Slap Stick + match_id("E9 ") || // Robotrek + match_nn("ACTRAISER") || // Actraiser + match_nn("ActRaiser-2") || // Actraiser 2 + match_id("AQT") || // Tenchi Souzou, Terranigma + match_id("ATV") || // Tales of Phantasia + match_id("ARF") || // Star Ocean + match_id("APR") || // Zen-Nippon Pro Wrestling 2 - 3-4 Budoukan + match_id("A4B") || // Super Bomberman 4 + match_id("Y7 ") || // U.F.O. Kamen Yakisoban - Present Ban + match_id("Y9 ") || // U.F.O. Kamen Yakisoban - Shihan Ban + match_id("APB") || // Super Bomberman - Panic Bomber W + match_na("DARK KINGDOM") || // Dark Kingdom + match_na("ZAN3 SFC") || // Zan III Spirits + match_na("HIOUDEN") || // Hiouden - Mamono-tachi Tono Chikai + match_na("\xC3\xDD\xBC\xC9\xB3\xC0") || // Tenshi no Uta + match_na("FORTUNE QUEST") || // Fortune Quest - Dice wo Korogase + match_na("FISHING TO BASSING") || // Shimono Masaki no Fishing To Bassing + match_na("OHMONO BLACKBASS") || // Oomono Black Bass Fishing - Jinzouko Hen + match_na("MASTERS") || // Harukanaru Augusta 2 - Masters + match_na("SFC \xB6\xD2\xDD\xD7\xB2\xC0\xDE\xB0") || // Kamen Rider + match_na("ZENKI TENCHIMEIDOU") || // Kishin Douji Zenki - Tenchi Meidou + match_nn("TokyoDome '95Battle 7") || // Shin Nippon Pro Wrestling Kounin '95 - Tokyo Dome Battle 7 + match_nn("SWORD WORLD SFC") || // Sword World SFC/2 + match_nn("LETs PACHINKO(") || // BS Lets Pachinko Nante Gindama 1/2/3/4 + match_nn("THE FISHING MASTER") || // Mark Davis The Fishing Master + match_nn("Parlor") || // Parlor mini/2/3/4/5/6/7, Parlor Parlor!/2/3/4/5 + match_na("HEIWA Parlor!Mini8") || // Parlor mini 8 + match_nn("SANKYO Fever! \xCC\xA8\xB0\xCA\xDE\xB0!")) // SANKYO Fever! Fever! + Timings.APUSpeedup = 1; + + if (match_na ("EARTHWORM JIM 2") || // Earthworm Jim 2 + match_na ("NBA Hangtime") || // NBA Hang Time + match_na ("MSPACMAN") || // Ms Pacman + match_na ("THE MASK") || // The Mask + match_na ("PRIMAL RAGE") || // Primal Rage + match_na ("PORKY PIGS HAUNTED") || // Porky Pig's Haunted Holiday + match_na ("Big Sky Trooper") || // Big Sky Trooper + match_id ("A35") || // Mechwarrior 3050 / Battle Tech 3050 + match_na ("DOOM TROOPERS")) // Doom Troopers + Timings.APUAllowTimeOverflow = TRUE; + } + + S9xAPUTimingSetSpeedup(Timings.APUSpeedup); + S9xAPUAllowTimeOverflow(Timings.APUAllowTimeOverflow); + + //// Other timing hacks :( + + Timings.HDMAStart = SNES_HDMA_START_HC + Settings.HDMATimingHack - 100; + Timings.HBlankStart = SNES_HBLANK_START_HC + Timings.HDMAStart - SNES_HDMA_START_HC; + + if (!Settings.DisableGameSpecificHacks) + { + // The delay to sync CPU and DMA which Snes9x cannot emulate. + // Some games need really severe delay timing... + if (match_na("BATTLE GRANDPRIX")) // Battle Grandprix + { + Timings.DMACPUSync = 20; + printf("DMA sync: %d\n", Timings.DMACPUSync); + } + } + + if (!Settings.DisableGameSpecificHacks) + { + // Opcode-based emulators cannot escape from "reading $4211/BPL" infinite loop... + // The true IRQ can be triggered inside an opcode. + if (match_na("TRAVERSE")) // Traverse - Starlight & Prairie + { + Timings.IRQPendCount = 1; + printf("IRQ count hack: %d\n", Timings.IRQPendCount); + } + + // An infinite loop reads $4212 and waits V-blank end, whereas VIRQ is set V=0. + // If Snes9x succeeds to escape from the loop before jumping into the IRQ handler, the game goes further. + // If Snes9x jumps into the IRQ handler before escaping from the loop, + // Snes9x cannot escape from the loop permanently because the RTI is in the next V-blank. + if (match_na("Aero the AcroBat 2")) + { + Timings.IRQPendCount = 2; + printf("IRQ count hack: %d\n", Timings.IRQPendCount); + } + + if (match_na("BATTLE BLAZE")) + { + Timings.IRQPendCount = 1; + printf("IRQ count hack: %d\n", Timings.IRQPendCount); + } + } + + if (!Settings.DisableGameSpecificHacks) + { + // XXX: What's happening? + if (match_na("X-MEN")) // Spider-Man and the X-Men + { + Settings.BlockInvalidVRAMAccess = FALSE; + printf("Invalid VRAM access hack\n"); + } + } + + //// CPU speed-ups (CPU_Shutdown()) + + // Force disabling a speed-up hack + // Games which spool sound samples between the SNES and sound CPU using + // H-DMA as the sample is playing. + if (match_na("EARTHWORM JIM 2") || // Earth Worm Jim 2 + match_na("PRIMAL RAGE") || // Primal Rage + match_na("CLAY FIGHTER") || // Clay Fighter + match_na("ClayFighter 2") || // Clay Fighter 2 + match_na("WeaponLord") || // Weapon Lord + match_nn("WAR 2410") || // War 2410 + match_id("ARF") || // Star Ocean + match_id("A4WJ") || // Mini Yonku Shining Scorpion - Let's & Go!! + match_nn("NHL") || + match_nc("MADDEN")) + { + if (Settings.Shutdown) + printf("Disabled CPU shutdown hack.\n"); + Settings.Shutdown = FALSE; + } + + // SA-1 + SA1.WaitAddress = 0xffffffff; + SA1.WaitByteAddress1 = NULL; + SA1.WaitByteAddress2 = NULL; + + if (Settings.SA1) + { + // Itoi Shigesato no Bass Tsuri No.1 (J) + if (match_id("ZBPJ")) + { + SA1.WaitAddress = 0x0093f1; + SA1.WaitByteAddress1 = FillRAM + 0x304a; + } + + // Daisenryaku Expert WWII (J) + if (match_id("AEVJ")) + { + SA1.WaitAddress = 0x0ed18d; + SA1.WaitByteAddress1 = FillRAM + 0x3000; + } + + // Derby Jockey 2 (J) + if (match_id("A2DJ")) + { + SA1.WaitAddress = 0x008b62; + } + + // Dragon Ball Z - Hyper Dimension (J) + if (match_id("AZIJ")) + { + SA1.WaitAddress = 0x008083; + SA1.WaitByteAddress1 = FillRAM + 0x3020; + } + + // SD Gundam G NEXT (J) + if (match_id("ZX3J")) + { + SA1.WaitAddress = 0x0087f2; + SA1.WaitByteAddress1 = FillRAM + 0x30c4; + } + + // Shougi no Hanamichi (J) + if (match_id("AARJ")) + { + SA1.WaitAddress = 0xc1f85a; + SA1.WaitByteAddress1 = SRAM + 0x0c64; + SA1.WaitByteAddress2 = SRAM + 0x0c66; + } + + // Asahi Shinbun Rensai Katou Hifumi Kudan Shougi Shingiryu (J) + if (match_id("A23J")) + { + SA1.WaitAddress = 0xc25037; + SA1.WaitByteAddress1 = SRAM + 0x0c06; + SA1.WaitByteAddress2 = SRAM + 0x0c08; + } + + // Taikyoku Igo - Idaten (J) + if (match_id("AIIJ")) + { + SA1.WaitAddress = 0xc100be; + SA1.WaitByteAddress1 = SRAM + 0x1002; + SA1.WaitByteAddress2 = SRAM + 0x1004; + } + + // Takemiya Masaki Kudan no Igo Taishou (J) + if (match_id("AITJ")) + { + SA1.WaitAddress = 0x0080b7; + } + + // J. League '96 Dream Stadium (J) + if (match_id("AJ6J")) + { + SA1.WaitAddress = 0xc0f74a; + } + + // Jumpin' Derby (J) + if (match_id("AJUJ")) + { + SA1.WaitAddress = 0x00d926; + } + + // Kakinoki Shougi (J) + if (match_id("AKAJ")) + { + SA1.WaitAddress = 0x00f070; + } + + // Hoshi no Kirby 3 (J), Kirby's Dream Land 3 (U) + if (match_id("AFJJ") || match_id("AFJE")) + { + SA1.WaitAddress = 0x0082d4; + SA1.WaitByteAddress1 = SRAM + 0x72a4; + } + + // Hoshi no Kirby - Super Deluxe (J) + if (match_id("AKFJ")) + { + SA1.WaitAddress = 0x008c93; + SA1.WaitByteAddress1 = FillRAM + 0x300a; + SA1.WaitByteAddress2 = FillRAM + 0x300e; + } + + // Kirby Super Star (U) + if (match_id("AKFE")) + { + SA1.WaitAddress = 0x008cb8; + SA1.WaitByteAddress1 = FillRAM + 0x300a; + SA1.WaitByteAddress2 = FillRAM + 0x300e; + } + + // Super Mario RPG (J), (U) + if (match_id("ARWJ") || match_id("ARWE")) + { + SA1.WaitAddress = 0xc0816f; + SA1.WaitByteAddress1 = FillRAM + 0x3000; + } + + // Marvelous (J) + if (match_id("AVRJ")) + { + SA1.WaitAddress = 0x0085f2; + SA1.WaitByteAddress1 = FillRAM + 0x3024; + } + + // Harukanaru Augusta 3 - Masters New (J) + if (match_id("AO3J")) + { + SA1.WaitAddress = 0x00dddb; + SA1.WaitByteAddress1 = FillRAM + 0x37b4; + } + + // Jikkyou Oshaberi Parodius (J) + if (match_id("AJOJ")) + { + SA1.WaitAddress = 0x8084e5; + } + + // Super Bomberman - Panic Bomber W (J) + if (match_id("APBJ")) + { + SA1.WaitAddress = 0x00857a; + } + + // Pebble Beach no Hatou New - Tournament Edition (J) + if (match_id("AONJ")) + { + SA1.WaitAddress = 0x00df33; + SA1.WaitByteAddress1 = FillRAM + 0x37b4; + } + + // PGA European Tour (U) + if (match_id("AEPE")) + { + SA1.WaitAddress = 0x003700; + SA1.WaitByteAddress1 = FillRAM + 0x3102; + } + + // PGA Tour 96 (U) + if (match_id("A3GE")) + { + SA1.WaitAddress = 0x003700; + SA1.WaitByteAddress1 = FillRAM + 0x3102; + } + + // Power Rangers Zeo - Battle Racers (U) + if (match_id("A4RE")) + { + SA1.WaitAddress = 0x009899; + SA1.WaitByteAddress1 = FillRAM + 0x3000; + } + + // SD F-1 Grand Prix (J) + if (match_id("AGFJ")) + { + SA1.WaitAddress = 0x0181bc; + } + + // Saikousoku Shikou Shougi Mahjong (J) + if (match_id("ASYJ")) + { + SA1.WaitAddress = 0x00f2cc; + SA1.WaitByteAddress1 = SRAM + 0x7ffe; + SA1.WaitByteAddress2 = SRAM + 0x7ffc; + } + + // Shougi Saikyou II (J) + if (match_id("AX2J")) + { + SA1.WaitAddress = 0x00d675; + } + + // Mini Yonku Shining Scorpion - Let's & Go!! (J) + if (match_id("A4WJ")) + { + SA1.WaitAddress = 0xc048be; + } + + // Shin Shougi Club (J) + if (match_id("AHJJ")) + { + SA1.WaitAddress = 0xc1002a; + SA1.WaitByteAddress1 = SRAM + 0x0806; + SA1.WaitByteAddress2 = SRAM + 0x0808; + } + + // rest games: + // Habu Meijin no Omoshiro Shougi (J) + // Hayashi Kaihou Kudan no Igo Taidou (J) + // Shougi Saikyou (J) + // Super Robot Wars Gaiden (J) + // Super Shougi 3 - Kitaihei (J) + } + + //// SRAM initial value + + if (!Settings.DisableGameSpecificHacks) + { + if (match_na("HITOMI3")) + { + SRAMSize = 1; + SRAMMask = ((1 << (SRAMSize + 3)) * 128) - 1; + } + + // SRAM value fixes + if (match_na("SUPER DRIFT OUT") || // Super Drift Out + match_na("SATAN IS OUR FATHER!") || + match_na("goemon 4")) // Ganbare Goemon Kirakira Douchuu + SNESGameFixes.SRAMInitialValue = 0x00; + + // Additional game fixes by sanmaiwashi ... + // XXX: unnecessary? + if (match_na("SFX \xC5\xB2\xC4\xB6\xDE\xDD\xC0\xDE\xD1\xD3\xC9\xB6\xDE\xC0\xD8 1")) // SD Gundam Gaiden - Knight Gundam Monogatari + SNESGameFixes.SRAMInitialValue = 0x6b; + + // others: BS and ST-01x games are 0x00. + } + + //// OAM hacks :( + + if (!Settings.DisableGameSpecificHacks) + { + // OAM hacks because we don't fully understand the behavior of the SNES. + // Totally wacky display in 2P mode... + // seems to need a disproven behavior, so we're definitely overlooking some other bug? + if (match_nn("UNIRACERS")) // Uniracers + { + SNESGameFixes.Uniracers = TRUE; + printf("Applied Uniracers hack.\n"); + } + } +} + +// UPS % IPS + +static uint32 ReadUPSPointer (const uint8 *data, unsigned &addr, unsigned size) +{ + uint32 offset = 0, shift = 1; + while(addr < size) { + uint8 x = data[addr++]; + offset += (x & 0x7f) * shift; + if(x & 0x80) break; + shift <<= 7; + offset += shift; + } + return offset; +} + +//NOTE: UPS patches are *never* created against a headered ROM! +//this is per the UPS file specification. however, do note that it is +//technically possible for a non-compliant patcher to ignore this requirement. +//therefore, it is *imperative* that no emulator support such patches. +//thusly, we ignore the "long offset" parameter below. failure to do so would +//completely invalidate the purpose of UPS; which is to avoid header vs +//no-header patching errors that result in IPS patches having a 50/50 chance of +//being applied correctly. + +static bool8 ReadUPSPatch (Reader *r, long, int32 &rom_size) +{ + //Reader lacks size() and rewind(), so we need to read in the file to get its size + uint8 *data = new uint8[8 * 1024 * 1024]; //allocate a lot of memory, better safe than sorry ... + uint32 size = 0; + while(true) { + int value = r->get_char(); + if(value == EOF) break; + data[size++] = value; + if(size >= 8 * 1024 * 1024) { + //prevent buffer overflow: SNES-made UPS patches should never be this big anyway ... + delete[] data; + return false; + } + } + + //4-byte header + 1-byte input size + 1-byte output size + 4-byte patch CRC32 + 4-byte unpatched CRC32 + 4-byte patched CRC32 + if(size < 18) { delete[] data; return false; } //patch is too small + + uint32 addr = 0; + if(data[addr++] != 'U') { delete[] data; return false; } //patch has an invalid header + if(data[addr++] != 'P') { delete[] data; return false; } //... + if(data[addr++] != 'S') { delete[] data; return false; } //... + if(data[addr++] != '1') { delete[] data; return false; } //... + + uint32 patch_crc32 = caCRC32(data, size - 4); //don't include patch CRC32 itself in CRC32 calculation + uint32 rom_crc32 = caCRC32(Memory.ROM, rom_size); + uint32 px_crc32 = (data[size - 12] << 0) + (data[size - 11] << 8) + (data[size - 10] << 16) + (data[size - 9] << 24); + uint32 py_crc32 = (data[size - 8] << 0) + (data[size - 7] << 8) + (data[size - 6] << 16) + (data[size - 5] << 24); + uint32 pp_crc32 = (data[size - 4] << 0) + (data[size - 3] << 8) + (data[size - 2] << 16) + (data[size - 1] << 24); + if(patch_crc32 != pp_crc32) { delete[] data; return false; } //patch is corrupted + if((rom_crc32 != px_crc32) && (rom_crc32 != py_crc32)) { delete[] data; return false; } //patch is for a different ROM + + uint32 px_size = ReadUPSPointer(data, addr, size); + uint32 py_size = ReadUPSPointer(data, addr, size); + uint32 out_size = ((uint32) rom_size == px_size) ? py_size : px_size; + if(out_size > CMemory::MAX_ROM_SIZE) { delete[] data; return false; } //applying this patch will overflow Memory.ROM buffer + + //fill expanded area with 0x00s; so that XORing works as expected below. + //note that this is needed (and works) whether output ROM is larger or smaller than pre-patched ROM + for(unsigned i = min((uint32) rom_size, out_size); i < max((uint32) rom_size, out_size); i++) { + Memory.ROM[i] = 0x00; + } + + uint32 relative = 0; + while(addr < size - 12) { + relative += ReadUPSPointer(data, addr, size); + while(addr < size - 12) { + uint8 x = data[addr++]; + Memory.ROM[relative++] ^= x; + if(!x) break; + } + } + + rom_size = out_size; + delete[] data; + + uint32 out_crc32 = caCRC32(Memory.ROM, rom_size); + if(((rom_crc32 == px_crc32) && (out_crc32 == py_crc32)) + || ((rom_crc32 == py_crc32) && (out_crc32 == px_crc32)) + ) { + return true; + } else { + //technically, reaching here means that patching has failed. + //we should return false, but unfortunately Memory.ROM has already + //been modified above and cannot be undone. to do this properly, we + //would need to make a copy of Memory.ROM, apply the patch, and then + //copy that back to Memory.ROM. + // + //however, the only way for this case to happen is if the UPS patch file + //itself is corrupted, which should be detected by the patch CRC32 check + //above anyway. errors due to the wrong ROM or patch file being used are + //already caught above. + fprintf(stderr, "WARNING: UPS patching appears to have failed.\nGame may not be playable.\n"); + return true; + } +} + +static long ReadInt (Reader *r, unsigned nbytes) +{ + long v = 0; + + while (nbytes--) + { + int c = r->get_char(); + if (c == EOF) + return (-1); + v = (v << 8) | (c & 0xFF); + } + + return (v); +} + +static bool8 ReadIPSPatch (Reader *r, long offset, int32 &rom_size) +{ + const int32 IPS_EOF = 0x00454F46l; + int32 ofs; + char fname[6]; + + fname[5] = 0; + for (int i = 0; i < 5; i++) + { + int c = r->get_char(); + if (c == EOF) + return (0); + fname[i] = (char) c; + } + + if (strncmp(fname, "PATCH", 5)) + return (0); + + for (;;) + { + long len, rlen; + int rchar; + + ofs = ReadInt(r, 3); + if (ofs == -1) + return (0); + + if (ofs == IPS_EOF) + break; + + ofs -= offset; + + len = ReadInt(r, 2); + if (len == -1) + return (0); + + if (len) + { + if (ofs + len > CMemory::MAX_ROM_SIZE) + return (0); + + while (len--) + { + rchar = r->get_char(); + if (rchar == EOF) + return (0); + Memory.ROM[ofs++] = (uint8) rchar; + } + + if (ofs > rom_size) + rom_size = ofs; + } + else + { + rlen = ReadInt(r, 2); + if (rlen == -1) + return (0); + + rchar = r->get_char(); + if (rchar == EOF) + return (0); + + if (ofs + rlen > CMemory::MAX_ROM_SIZE) + return (0); + + while (rlen--) + Memory.ROM[ofs++] = (uint8) rchar; + + if (ofs > rom_size) + rom_size = ofs; + } + } + + ofs = ReadInt(r, 3); + if (ofs != -1 && ofs - offset < rom_size) + rom_size = ofs - offset; + + return (1); +} + +#ifdef UNZIP_SUPPORT +static int unzFindExtension (unzFile &file, const char *ext, bool restart, bool print) +{ + unz_file_info info; + int port, l = strlen(ext); + + if (restart) + port = unzGoToFirstFile(file); + else + port = unzGoToNextFile(file); + + while (port == UNZ_OK) + { + int len; + char name[132]; + + unzGetCurrentFileInfo(file, &info, name, 128, NULL, 0, NULL, 0); + len = strlen(name); + + if (len >= l + 1 && name[len - l - 1] == '.' && strcasecmp(name + len - l, ext) == 0 && unzOpenCurrentFile(file) == UNZ_OK) + { + if (print) + printf("Using IPS or UPS patch %s", name); + + return (port); + } + + port = unzGoToNextFile(file); + } + + return (port); +} +#endif + +void CMemory::CheckForAnyPatch (const char *rom_filename, bool8 header, int32 &rom_size) +{ + if (Settings.NoPatch) + return; + +#ifdef GEKKO + int patchtype; + char patchpath[2][512]; + STREAM patchfile = NULL; + long offset = header ? 512 : 0; + + sprintf(patchpath[0], "%s%s.ips", browser.dir, Memory.ROMFilename); + sprintf(patchpath[1], "%s%s.ups", browser.dir, Memory.ROMFilename); + + for(patchtype=0; patchtype<2; patchtype++) + { + if ((patchfile = OPEN_STREAM(patchpath[patchtype], "rb")) != NULL) + { + if(patchtype == 0) + ReadIPSPatch(new fReader(patchfile), offset, rom_size); + else + ReadUPSPatch(new fReader(patchfile), 0, rom_size); + CLOSE_STREAM(patchfile); + break; + } + } +#else + STREAM patch_file = NULL; + uint32 i; + long offset = header ? 512 : 0; + int ret; + bool flag; + char dir[_MAX_DIR + 1], drive[_MAX_DRIVE + 1], name[_MAX_FNAME + 1], ext[_MAX_EXT + 1], ips[_MAX_EXT + 3], fname[PATH_MAX + 1]; + const char *n; + + // UPS + + _splitpath(rom_filename, drive, dir, name, ext); + _makepath(fname, drive, dir, name, "ups"); + + if ((patch_file = OPEN_STREAM(fname, "rb")) != NULL) + { + printf("Using UPS patch %s", fname); + + ret = ReadUPSPatch(new fReader(patch_file), 0, rom_size); + CLOSE_STREAM(patch_file); + + if (ret) + { + printf("!\n"); + return; + } + else + printf(" failed!\n"); + } + +#ifdef UNZIP_SUPPORT + if (!strcasecmp(ext, "zip") || !strcasecmp(ext, ".zip")) + { + unzFile file = unzOpen(rom_filename); + if (file) + { + int port = unzFindExtension(file, "ups"); + if (port == UNZ_OK) + { + printf(" in %s", rom_filename); + + ret = ReadUPSPatch(new unzReader(file), offset, rom_size); + unzCloseCurrentFile(file); + + if (ret) + printf("!\n"); + else + printf(" failed!\n"); + } + } + } +#endif + + n = S9xGetFilename(".ups", IPS_DIR); + + if ((patch_file = OPEN_STREAM(n, "rb")) != NULL) + { + printf("Using UPS patch %s", n); + + ret = ReadUPSPatch(new fReader(patch_file), 0, rom_size); + CLOSE_STREAM(patch_file); + + if (ret) + { + printf("!\n"); + return; + } + else + printf(" failed!\n"); + } + + // IPS + + _splitpath(rom_filename, drive, dir, name, ext); + _makepath(fname, drive, dir, name, "ips"); + + if ((patch_file = OPEN_STREAM(fname, "rb")) != NULL) + { + printf("Using IPS patch %s", fname); + + ret = ReadIPSPatch(new fReader(patch_file), offset, rom_size); + CLOSE_STREAM(patch_file); + + if (ret) + { + printf("!\n"); + return; + } + else + printf(" failed!\n"); + } + + if (_MAX_EXT > 6) + { + i = 0; + flag = false; + + do + { + snprintf(ips, 8, "%03d.ips", i); + _makepath(fname, drive, dir, name, ips); + + if (!(patch_file = OPEN_STREAM(fname, "rb"))) + break; + + printf("Using IPS patch %s", fname); + + ret = ReadIPSPatch(new fReader(patch_file), offset, rom_size); + CLOSE_STREAM(patch_file); + + if (ret) + { + printf("!\n"); + flag = true; + } + else + { + printf(" failed!\n"); + break; + } + } while (++i < 1000); + + if (flag) + return; + } + + if (_MAX_EXT > 3) + { + i = 0; + flag = false; + + do + { + snprintf(ips, _MAX_EXT + 2, "ips%d", i); + if (strlen(ips) > _MAX_EXT) + break; + _makepath(fname, drive, dir, name, ips); + + if (!(patch_file = OPEN_STREAM(fname, "rb"))) + break; + + printf("Using IPS patch %s", fname); + + ret = ReadIPSPatch(new fReader(patch_file), offset, rom_size); + CLOSE_STREAM(patch_file); + + if (ret) + { + printf("!\n"); + flag = true; + } + else + { + printf(" failed!\n"); + break; + } + } while (++i != 0); + + if (flag) + return; + } + + if (_MAX_EXT > 2) + { + i = 0; + flag = false; + + do + { + snprintf(ips, 4, "ip%d", i); + _makepath(fname, drive, dir, name, ips); + + if (!(patch_file = OPEN_STREAM(fname, "rb"))) + break; + + printf("Using IPS patch %s", fname); + + ret = ReadIPSPatch(new fReader(patch_file), offset, rom_size); + CLOSE_STREAM(patch_file); + + if (ret) + { + printf("!\n"); + flag = true; + } + else + { + printf(" failed!\n"); + break; + } + } while (++i < 10); + + if (flag) + return; + } + +#ifdef UNZIP_SUPPORT + if (!strcasecmp(ext, "zip") || !strcasecmp(ext, ".zip")) + { + unzFile file = unzOpen(rom_filename); + if (file) + { + int port = unzFindExtension(file, "ips"); + while (port == UNZ_OK) + { + printf(" in %s", rom_filename); + + ret = ReadIPSPatch(new unzReader(file), offset, rom_size); + unzCloseCurrentFile(file); + + if (ret) + { + printf("!\n"); + flag = true; + } + else + printf(" failed!\n"); + + port = unzFindExtension(file, "ips", false); + } + + if (!flag) + { + i = 0; + + do + { + snprintf(ips, 8, "%03d.ips", i); + + if (unzFindExtension(file, ips) != UNZ_OK) + break; + + printf(" in %s", rom_filename); + + ret = ReadIPSPatch(new unzReader(file), offset, rom_size); + unzCloseCurrentFile(file); + + if (ret) + { + printf("!\n"); + flag = true; + } + else + { + printf(" failed!\n"); + break; + } + + if (unzFindExtension(file, ips, false, false) == UNZ_OK) + printf("WARNING: Ignoring extra .%s files!\n", ips); + } while (++i < 1000); + } + + if (!flag) + { + i = 0; + + do + { + snprintf(ips, _MAX_EXT + 2, "ips%d", i); + if (strlen(ips) > _MAX_EXT) + break; + + if (unzFindExtension(file, ips) != UNZ_OK) + break; + + printf(" in %s", rom_filename); + + ret = ReadIPSPatch(new unzReader(file), offset, rom_size); + unzCloseCurrentFile(file); + + if (ret) + { + printf("!\n"); + flag = true; + } + else + { + printf(" failed!\n"); + break; + } + + if (unzFindExtension(file, ips, false, false) == UNZ_OK) + printf("WARNING: Ignoring extra .%s files!\n", ips); + } while (++i != 0); + } + + if (!flag) + { + i = 0; + + do + { + snprintf(ips, 4, "ip%d", i); + + if (unzFindExtension(file, ips) != UNZ_OK) + break; + + printf(" in %s", rom_filename); + + ret = ReadIPSPatch(new unzReader(file), offset, rom_size); + unzCloseCurrentFile(file); + + if (ret) + { + printf("!\n"); + flag = true; + } + else + { + printf(" failed!\n"); + break; + } + + if (unzFindExtension(file, ips, false, false) == UNZ_OK) + printf("WARNING: Ignoring extra .%s files!\n", ips); + } while (++i < 10); + } + + assert(unzClose(file) == UNZ_OK); + + if (flag) + return; + } + } +#endif + + n = S9xGetFilename(".ips", IPS_DIR); + + if ((patch_file = OPEN_STREAM(n, "rb")) != NULL) + { + printf("Using IPS patch %s", n); + + ret = ReadIPSPatch(new fReader(patch_file), offset, rom_size); + CLOSE_STREAM(patch_file); + + if (ret) + { + printf("!\n"); + return; + } + else + printf(" failed!\n"); + } + + if (_MAX_EXT > 6) + { + i = 0; + flag = false; + + do + { + snprintf(ips, 9, ".%03d.ips", i); + n = S9xGetFilename(ips, IPS_DIR); + + if (!(patch_file = OPEN_STREAM(n, "rb"))) + break; + + printf("Using IPS patch %s", n); + + ret = ReadIPSPatch(new fReader(patch_file), offset, rom_size); + CLOSE_STREAM(patch_file); + + if (ret) + { + printf("!\n"); + flag = true; + } + else + { + printf(" failed!\n"); + break; + } + } while (++i < 1000); + + if (flag) + return; + } + + if (_MAX_EXT > 3) + { + i = 0; + flag = false; + + do + { + snprintf(ips, _MAX_EXT + 3, ".ips%d", i); + if (strlen(ips) > _MAX_EXT + 1) + break; + n = S9xGetFilename(ips, IPS_DIR); + + if (!(patch_file = OPEN_STREAM(n, "rb"))) + break; + + printf("Using IPS patch %s", n); + + ret = ReadIPSPatch(new fReader(patch_file), offset, rom_size); + CLOSE_STREAM(patch_file); + + if (ret) + { + printf("!\n"); + flag = true; + } + else + { + printf(" failed!\n"); + break; + } + } while (++i != 0); + + if (flag) + return; + } + + if (_MAX_EXT > 2) + { + i = 0; + flag = false; + + do + { + snprintf(ips, 5, ".ip%d", i); + n = S9xGetFilename(ips, IPS_DIR); + + if (!(patch_file = OPEN_STREAM(n, "rb"))) + break; + + printf("Using IPS patch %s", n); + + ret = ReadIPSPatch(new fReader(patch_file), offset, rom_size); + CLOSE_STREAM(patch_file); + + if (ret) + { + printf("!\n"); + flag = true; + } + else + { + printf(" failed!\n"); + break; + } + } while (++i < 10); + + if (flag) + return; + } +#endif +} diff --git a/plugins/snes9x_gx/source/snes9x/memmap.h b/plugins/snes9x_gx/source/snes9x/memmap.h new file mode 100644 index 00000000..153ae17d --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/memmap.h @@ -0,0 +1,381 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _MEMMAP_H_ +#define _MEMMAP_H_ + +#define MEMMAP_BLOCK_SIZE (0x1000) +#define MEMMAP_NUM_BLOCKS (0x1000000 / MEMMAP_BLOCK_SIZE) +#define MEMMAP_SHIFT (12) +#define MEMMAP_MASK (MEMMAP_BLOCK_SIZE - 1) + +struct CMemory +{ + enum +#ifdef HW_DOL + { MAX_ROM_SIZE = 0x600000 }; +#else + { MAX_ROM_SIZE = 0x800000 }; +#endif + enum file_formats + { FILE_ZIP, FILE_JMA, FILE_DEFAULT }; + + enum + { NOPE, YEAH, BIGFIRST, SMALLFIRST }; + + enum + { MAP_TYPE_I_O, MAP_TYPE_ROM, MAP_TYPE_RAM }; + + enum + { + MAP_CPU, + MAP_PPU, + MAP_LOROM_SRAM, + MAP_LOROM_SRAM_B, + MAP_HIROM_SRAM, + MAP_DSP, + MAP_SA1RAM, + MAP_BWRAM, + MAP_BWRAM_BITMAP, + MAP_BWRAM_BITMAP2, + MAP_SPC7110_ROM, + MAP_SPC7110_DRAM, + MAP_RONLY_SRAM, + MAP_C4, + MAP_OBC_RAM, + MAP_SETA_DSP, + MAP_SETA_RISC, + MAP_BSX, + MAP_NONE, + MAP_LAST + }; + + uint8 NSRTHeader[32]; + int32 HeaderCount; + + uint8 *RAM; + uint8 *ROM; + uint8 *SRAM; + uint8 *VRAM; + uint8 *FillRAM; + uint8 *BWRAM; + uint8 *C4RAM; + uint8 *OBC1RAM; + uint8 *BSRAM; + uint8 *BIOSROM; + + uint8 *Map[MEMMAP_NUM_BLOCKS]; + uint8 *WriteMap[MEMMAP_NUM_BLOCKS]; + uint8 BlockIsRAM[MEMMAP_NUM_BLOCKS]; + uint8 BlockIsROM[MEMMAP_NUM_BLOCKS]; + uint8 ExtendedFormat; + + char ROMFilename[PATH_MAX + 1]; + char ROMName[ROM_NAME_LEN]; + char RawROMName[ROM_NAME_LEN]; + char ROMId[5]; + int32 CompanyId; + uint8 ROMRegion; + uint8 ROMSpeed; + uint8 ROMType; + uint8 ROMSize; + uint32 ROMChecksum; + uint32 ROMComplementChecksum; + uint32 ROMCRC32; + int32 ROMFramesPerSecond; + + bool8 HiROM; + bool8 LoROM; + uint8 SRAMSize; + uint32 SRAMMask; + uint32 CalculatedSize; + uint32 CalculatedChecksum; + + // ports can assign this to perform some custom action upon loading a ROM (such as adjusting controls) + void (*PostRomInitFunc) (void); + + bool8 Init (void); + void Deinit (void); + + int ScoreHiROM (bool8, int32 romoff = 0); + int ScoreLoROM (bool8, int32 romoff = 0); + uint32 HeaderRemove (uint32, int32 &, uint8 *); + uint32 FileLoader (uint8 *, const char *, int32); + bool8 LoadROM (const char *); + bool8 LoadMultiCart (const char *, const char *); + bool8 LoadSufamiTurbo (const char *, const char *); + bool8 LoadSameGame (const char *, const char *); + bool8 LoadSRAM (const char *); + bool8 SaveSRAM (const char *); + void ClearSRAM (bool8 onlyNonSavedSRAM = 0); + bool8 LoadSRTC (void); + bool8 SaveSRTC (void); + + char * Safe (const char *); + char * SafeANK (const char *); + void ParseSNESHeader (uint8 *); + void InitROM (void); + + uint32 map_mirror (uint32, uint32); + void map_lorom (uint32, uint32, uint32, uint32, uint32); + void map_hirom (uint32, uint32, uint32, uint32, uint32); + void map_lorom_offset (uint32, uint32, uint32, uint32, uint32, uint32); + void map_hirom_offset (uint32, uint32, uint32, uint32, uint32, uint32); + void map_space (uint32, uint32, uint32, uint32, uint8 *); + void map_index (uint32, uint32, uint32, uint32, int, int); + void map_System (void); + void map_WRAM (void); + void map_LoROMSRAM (void); + void map_HiROMSRAM (void); + void map_DSP (void); + void map_C4 (void); + void map_OBC1 (void); + void map_SetaRISC (void); + void map_SetaDSP (void); + void map_WriteProtectROM (void); + void Map_Initialize (void); + void Map_LoROMMap (void); + void Map_NoMAD1LoROMMap (void); + void Map_JumboLoROMMap (void); + void Map_ROM24MBSLoROMMap (void); + void Map_SRAM512KLoROMMap (void); + void Map_SufamiTurboLoROMMap (void); + void Map_SufamiTurboPseudoLoROMMap (void); + void Map_SuperFXLoROMMap (void); + void Map_SetaDSPLoROMMap (void); + void Map_SDD1LoROMMap (void); + void Map_SA1LoROMMap (void); + void Map_HiROMMap (void); + void Map_ExtendedHiROMMap (void); + void Map_SameGameHiROMMap (void); + void Map_SPC7110HiROMMap (void); + + uint16 checksum_calc_sum (uint8 *, uint32); + uint16 checksum_mirror_sum (uint8 *, uint32 &, uint32 mask = 0x800000); + void Checksum_Calculate (void); + + bool8 match_na (const char *); + bool8 match_nn (const char *); + bool8 match_nc (const char *); + bool8 match_id (const char *); + void ApplyROMFixes (void); + void CheckForAnyPatch (const char *, bool8, int32 &); + + void MakeRomInfoText (char *); + + const char * MapType (void); + const char * StaticRAMSize (void); + const char * Size (void); + const char * Revision (void); + const char * KartContents (void); + const char * Country (void); + const char * PublishingCompany (void); +}; + +struct SMulti +{ + int cartType; + int32 cartSizeA, cartSizeB; + int32 sramSizeA, sramSizeB; + uint32 sramMaskA, sramMaskB; + uint32 cartOffsetA, cartOffsetB; + uint8 *sramA, *sramB; + char fileNameA[PATH_MAX + 1], fileNameB[PATH_MAX + 1]; +}; + +extern CMemory Memory; +extern SMulti Multi; + +void S9xAutoSaveSRAM (void); +bool8 LoadZip(const char *, int32 *, int32 *, uint8 *); + +enum s9xwrap_t +{ + WRAP_NONE, + WRAP_BANK, + WRAP_PAGE +}; + +enum s9xwriteorder_t +{ + WRITE_01, + WRITE_10 +}; + +#include "getset.h" + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/messages.h b/plugins/snes9x_gx/source/snes9x/messages.h new file mode 100644 index 00000000..f346a7ce --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/messages.h @@ -0,0 +1,228 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _MESSAGES_H_ +#define _MESSAGES_H_ + +// Types of message sent to S9xMessage() +enum +{ + S9X_TRACE, + S9X_DEBUG, + S9X_WARNING, + S9X_INFO, + S9X_ERROR, + S9X_FATAL_ERROR +}; + +// Individual message numbers +enum +{ + S9X_ROM_INFO, + S9X_HEADERS_INFO, + S9X_CONFIG_INFO, + S9X_ROM_CONFUSING_FORMAT_INFO, + S9X_ROM_INTERLEAVED_INFO, + S9X_SOUND_DEVICE_OPEN_FAILED, + S9X_APU_STOPPED, + S9X_USAGE, + S9X_GAME_GENIE_CODE_ERROR, + S9X_ACTION_REPLY_CODE_ERROR, + S9X_GOLD_FINGER_CODE_ERROR, + S9X_DEBUG_OUTPUT, + S9X_DMA_TRACE, + S9X_HDMA_TRACE, + S9X_WRONG_FORMAT, + S9X_WRONG_VERSION, + S9X_ROM_NOT_FOUND, + S9X_FREEZE_FILE_NOT_FOUND, + S9X_PPU_TRACE, + S9X_TRACE_DSP1, + S9X_FREEZE_ROM_NAME, + S9X_HEADER_WARNING, + S9X_NETPLAY_NOT_SERVER, + S9X_FREEZE_FILE_INFO, + S9X_TURBO_MODE, + S9X_SOUND_NOT_BUILT, + S9X_MOVIE_INFO, + S9X_WRONG_MOVIE_SNAPSHOT, + S9X_NOT_A_MOVIE_SNAPSHOT, + S9X_SNAPSHOT_INCONSISTENT, + S9X_AVI_INFO +}; + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/missing.h b/plugins/snes9x_gx/source/snes9x/missing.h new file mode 100644 index 00000000..9a41fab1 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/missing.h @@ -0,0 +1,256 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifdef DEBUGGER + +#ifndef _MISSING_H_ +#define _MISSING_H_ + +struct MissingHDMA +{ + uint8 used; + uint8 bbus_address; + uint8 abus_bank; + uint16 abus_address; + uint8 indirect_address; + uint8 force_table_address_write; + uint8 force_table_address_read; + uint8 line_count_write; + uint8 line_count_read; +}; + +struct Missing +{ + struct MissingHDMA hdma[8]; + uint8 emulate6502; + uint8 decimal_mode; + uint8 mv_8bit_index; + uint8 mv_8bit_acc; + uint8 interlace; + uint8 lines_239; + uint8 pseudo_512; + uint8 modes[8]; + uint8 mode7_fx; + uint8 mode7_flip; + uint8 mode7_bgmode; + uint8 direct; + uint8 matrix_multiply; + uint8 oam_read; + uint8 vram_read; + uint8 cgram_read; + uint8 wram_read; + uint8 dma_read; + uint8 vram_inc; + uint8 vram_full_graphic_inc; + uint8 virq; + uint8 hirq; + uint16 virq_pos; + uint16 hirq_pos; + uint8 h_v_latch; + uint8 h_counter_read; + uint8 v_counter_read; + uint8 fast_rom; + uint8 window1[6]; + uint8 window2[6]; + uint8 sprite_priority_rotation; + uint8 subscreen; + uint8 subscreen_add; + uint8 subscreen_sub; + uint8 fixed_colour_add; + uint8 fixed_colour_sub; + uint8 mosaic; + uint8 sprite_double_height; + uint8 dma_channels; + uint8 dma_this_frame; + uint8 oam_address_read; + uint8 bg_offset_read; + uint8 matrix_read; + uint8 hdma_channels; + uint8 hdma_this_frame; + uint16 unknownppu_read; + uint16 unknownppu_write; + uint16 unknowncpu_read; + uint16 unknowncpu_write; + uint16 unknowndsp_read; + uint16 unknowndsp_write; +}; + +extern struct Missing missing; + +#endif + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/movie.cpp b/plugins/snes9x_gx/source/snes9x/movie.cpp new file mode 100644 index 00000000..f8044ddb --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/movie.cpp @@ -0,0 +1,1201 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + +// Input recording/playback code +// (c) Copyright 2004 blip + +#ifndef __WIN32__ +#include <unistd.h> +#endif +#include "snes9x.h" +#include "memmap.h" +#include "controls.h" +#include "snapshot.h" +#include "movie.h" +#include "language.h" +#ifdef NETPLAY_SUPPORT +#include "netplay.h" +#endif + +#ifdef __WIN32__ +#include <io.h> +#ifndef W_OK +#define W_OK 2 +#endif +#define ftruncate chsize +#endif + +#define SMV_MAGIC 0x1a564d53 // SMV0x1a +#define SMV_VERSION 5 +#define SMV_HEADER_SIZE 64 +#define SMV_EXTRAROMINFO_SIZE 30 +#define BUFFER_GROWTH_SIZE 4096 + +enum MovieState +{ + MOVIE_STATE_NONE = 0, + MOVIE_STATE_PLAY, + MOVIE_STATE_RECORD +}; + +struct SMovie +{ + enum MovieState State; + + FILE *File; + char Filename[PATH_MAX + 1]; + char ROMName[23]; + uint32 ROMCRC32; + uint32 MovieId; + uint32 Version; + + uint32 SaveStateOffset; + uint32 ControllerDataOffset; + + uint8 ControllersMask; + uint8 Opts; + uint8 SyncFlags; + uint32 MaxFrame; + uint32 MaxSample; + uint32 CurrentFrame; + uint32 CurrentSample; + uint32 BytesPerSample; + uint32 RerecordCount; + bool8 ReadOnly; + uint8 PortType[2]; + int8 PortIDs[2][4]; + + uint8 *InputBuffer; + uint8 *InputBufferPtr; + uint32 InputBufferSize; +}; + +static struct SMovie Movie; + +static uint8 prevPortType[2]; +static int8 prevPortIDs[2][4]; +static bool8 prevMouseMaster, prevSuperScopeMaster, prevJustifierMaster, prevMultiPlayer5Master; + +static uint8 Read8 (uint8 *&); +static uint16 Read16 (uint8 *&); +static uint32 Read32 (uint8 *&); +static void Write8 (uint8, uint8 *&); +static void Write16 (uint16, uint8 *&); +static void Write32 (uint32, uint8 *&); +static void store_previous_settings (void); +static void restore_previous_settings (void); +static void store_movie_settings (void); +static void restore_movie_settings (void); +static int bytes_per_sample (void); +static void reserve_buffer_space (uint32); +static void reset_controllers (void); +static void read_frame_controller_data (bool); +static void write_frame_controller_data (void); +static void flush_movie (void); +static void truncate_movie (void); +static int read_movie_header (FILE *, SMovie *); +static int read_movie_extrarominfo (FILE *, SMovie *); +static void write_movie_header (FILE *, SMovie *); +static void write_movie_extrarominfo (FILE *, SMovie *); +static void change_state (MovieState); + +// HACK: reduce movie size by not storing changes that can only affect polled input in the movie for these types, +// because currently no port sets these types to polling +#define SKIPPED_POLLING_PORT_TYPE(x) (((x) == CTL_NONE) || ((x) == CTL_JOYPAD) || ((x) == CTL_MP5)) + +#ifndef max +#define max(a, b) (((a) > (b)) ? (a) : (b)) +#endif + + +static uint8 Read8 (uint8 *&ptr) +{ + uint8 v = *ptr++; + return (v); +} + +static uint16 Read16 (uint8 *&ptr) +{ + uint16 v = READ_WORD(ptr); + ptr += 2; + return (v); +} + +static uint32 Read32 (uint8 *&ptr) +{ + uint32 v = READ_DWORD(ptr); + ptr += 4; + return (v); +} + +static void Write8 (uint8 v, uint8 *&ptr) +{ + *ptr++ = v; +} + +static void Write16 (uint16 v, uint8 *&ptr) +{ + WRITE_WORD(ptr, v); + ptr += 2; +} + +static void Write32 (uint32 v, uint8 *&ptr) +{ + WRITE_DWORD(ptr, v); + ptr += 4; +} + +static void store_previous_settings (void) +{ + for (int i = 0; i < 2; i++) + { + enum controllers pt; + S9xGetController(i, &pt, &prevPortIDs[i][0], &prevPortIDs[i][1], &prevPortIDs[i][2], &prevPortIDs[i][3]); + prevPortType[i] = (uint8) pt; + } + + prevMouseMaster = Settings.MouseMaster; + prevSuperScopeMaster = Settings.SuperScopeMaster; + prevJustifierMaster = Settings.JustifierMaster; + prevMultiPlayer5Master = Settings.MultiPlayer5Master; +} + +static void restore_previous_settings (void) +{ + Settings.MouseMaster = prevMouseMaster; + Settings.SuperScopeMaster = prevSuperScopeMaster; + Settings.JustifierMaster = prevJustifierMaster; + Settings.MultiPlayer5Master = prevMultiPlayer5Master; + + S9xSetController(0, (enum controllers) prevPortType[0], prevPortIDs[0][0], prevPortIDs[0][1], prevPortIDs[0][2], prevPortIDs[0][3]); + S9xSetController(1, (enum controllers) prevPortType[1], prevPortIDs[1][0], prevPortIDs[1][1], prevPortIDs[1][2], prevPortIDs[1][3]); +} + +static void store_movie_settings (void) +{ + for (int i = 0; i < 2; i++) + { + enum controllers pt; + S9xGetController(i, &pt, &Movie.PortIDs[i][0], &Movie.PortIDs[i][1], &Movie.PortIDs[i][2], &Movie.PortIDs[i][3]); + Movie.PortType[i] = (uint8) pt; + } +} + +static void restore_movie_settings (void) +{ + Settings.MouseMaster = (Movie.PortType[0] == CTL_MOUSE || Movie.PortType[1] == CTL_MOUSE); + Settings.SuperScopeMaster = (Movie.PortType[0] == CTL_SUPERSCOPE || Movie.PortType[1] == CTL_SUPERSCOPE); + Settings.JustifierMaster = (Movie.PortType[0] == CTL_JUSTIFIER || Movie.PortType[1] == CTL_JUSTIFIER); + Settings.MultiPlayer5Master = (Movie.PortType[0] == CTL_MP5 || Movie.PortType[1] == CTL_MP5); + + S9xSetController(0, (enum controllers) Movie.PortType[0], Movie.PortIDs[0][0], Movie.PortIDs[0][1], Movie.PortIDs[0][2], Movie.PortIDs[0][3]); + S9xSetController(1, (enum controllers) Movie.PortType[1], Movie.PortIDs[1][0], Movie.PortIDs[1][1], Movie.PortIDs[1][2], Movie.PortIDs[1][3]); +} + +static int bytes_per_sample (void) +{ + int num_controllers = 0; + + for (int i = 0; i < 8; i++) + { + if (Movie.ControllersMask & (1 << i)) + num_controllers++; + } + + int bytes = CONTROLLER_DATA_SIZE * num_controllers; + + for (int p = 0; p < 2; p++) + { + if (Movie.PortType[p] == CTL_MOUSE) + bytes += MOUSE_DATA_SIZE; + else + if (Movie.PortType[p] == CTL_SUPERSCOPE) + bytes += SCOPE_DATA_SIZE; + else + if (Movie.PortType[p] == CTL_JUSTIFIER) + bytes += JUSTIFIER_DATA_SIZE; + } + + return (bytes); +} + +static void reserve_buffer_space (uint32 space_needed) +{ + if (space_needed > Movie.InputBufferSize) + { + uint32 ptr_offset = Movie.InputBufferPtr - Movie.InputBuffer; + uint32 alloc_chunks = space_needed / BUFFER_GROWTH_SIZE; + + Movie.InputBufferSize = BUFFER_GROWTH_SIZE * (alloc_chunks + 1); + Movie.InputBuffer = (uint8 *) realloc(Movie.InputBuffer, Movie.InputBufferSize); + Movie.InputBufferPtr = Movie.InputBuffer + ptr_offset; + } +} + +static void reset_controllers (void) +{ + for (int i = 0; i < 8; i++) + MovieSetJoypad(i, 0); + + uint8 clearedMouse[MOUSE_DATA_SIZE]; + ZeroMemory(clearedMouse, MOUSE_DATA_SIZE); + clearedMouse[4] = 1; + + uint8 clearedScope[SCOPE_DATA_SIZE]; + ZeroMemory(clearedScope, SCOPE_DATA_SIZE); + + uint8 clearedJustifier[JUSTIFIER_DATA_SIZE]; + ZeroMemory(clearedJustifier, JUSTIFIER_DATA_SIZE); + + for (int p = 0; p < 2; p++) + { + MovieSetMouse(p, clearedMouse, true); + MovieSetScope(p, clearedScope); + MovieSetJustifier(p, clearedJustifier); + } +} + +static void read_frame_controller_data (bool addFrame) +{ + // reset code check + if (Movie.InputBufferPtr[0] == 0xff) + { + bool reset = true; + for (int i = 1; i < (int) Movie.BytesPerSample; i++) + { + if (Movie.InputBufferPtr[i] != 0xff) + { + reset = false; + break; + } + } + + if (reset) + { + Movie.InputBufferPtr += Movie.BytesPerSample; + S9xSoftReset(); + return; + } + } + + for (int i = 0; i < 8; i++) + { + if (Movie.ControllersMask & (1 << i)) + MovieSetJoypad(i, Read16(Movie.InputBufferPtr)); + else + MovieSetJoypad(i, 0); // pretend the controller is disconnected + } + + for (int p = 0; p < 2; p++) + { + if (Movie.PortType[p] == CTL_MOUSE) + { + uint8 buf[MOUSE_DATA_SIZE]; + memcpy(buf, Movie.InputBufferPtr, MOUSE_DATA_SIZE); + Movie.InputBufferPtr += MOUSE_DATA_SIZE; + MovieSetMouse(p, buf, !addFrame); + } + else + if (Movie.PortType[p] == CTL_SUPERSCOPE) + { + uint8 buf[SCOPE_DATA_SIZE]; + memcpy(buf, Movie.InputBufferPtr, SCOPE_DATA_SIZE); + Movie.InputBufferPtr += SCOPE_DATA_SIZE; + MovieSetScope(p, buf); + } + else + if (Movie.PortType[p] == CTL_JUSTIFIER) + { + uint8 buf[JUSTIFIER_DATA_SIZE]; + memcpy(buf, Movie.InputBufferPtr, JUSTIFIER_DATA_SIZE); + Movie.InputBufferPtr += JUSTIFIER_DATA_SIZE; + MovieSetJustifier(p, buf); + } + } +} + +static void write_frame_controller_data (void) +{ + reserve_buffer_space((uint32) (Movie.InputBufferPtr + Movie.BytesPerSample - Movie.InputBuffer)); + + for (int i = 0; i < 8; i++) + { + if (Movie.ControllersMask & (1 << i)) + Write16(MovieGetJoypad(i), Movie.InputBufferPtr); + else + MovieSetJoypad(i, 0); // pretend the controller is disconnected + } + + for (int p = 0; p < 2; p++) + { + if (Movie.PortType[p] == CTL_MOUSE) + { + uint8 buf[MOUSE_DATA_SIZE]; + MovieGetMouse(p, buf); + memcpy(Movie.InputBufferPtr, buf, MOUSE_DATA_SIZE); + Movie.InputBufferPtr += MOUSE_DATA_SIZE; + } + else + if (Movie.PortType[p] == CTL_SUPERSCOPE) + { + uint8 buf[SCOPE_DATA_SIZE]; + MovieGetScope(p, buf); + memcpy(Movie.InputBufferPtr, buf, SCOPE_DATA_SIZE); + Movie.InputBufferPtr += SCOPE_DATA_SIZE; + } + else + if (Movie.PortType[p] == CTL_JUSTIFIER) + { + uint8 buf[JUSTIFIER_DATA_SIZE]; + MovieGetJustifier(p, buf); + memcpy(Movie.InputBufferPtr, buf, JUSTIFIER_DATA_SIZE); + Movie.InputBufferPtr += JUSTIFIER_DATA_SIZE; + } + } +} + +static void flush_movie (void) +{ + if (!Movie.File) + return; + + fseek(Movie.File, 0, SEEK_SET); + write_movie_header(Movie.File, &Movie); + fseek(Movie.File, Movie.ControllerDataOffset, SEEK_SET); + + size_t ignore; + ignore = fwrite(Movie.InputBuffer, 1, Movie.BytesPerSample * (Movie.MaxSample + 1), Movie.File); +} + +static void truncate_movie (void) +{ + if (!Movie.File || !Settings.MovieTruncate) + return; + + if (Movie.SaveStateOffset > Movie.ControllerDataOffset) + return; + + int ignore; + ignore = ftruncate(fileno(Movie.File), Movie.ControllerDataOffset + Movie.BytesPerSample * (Movie.MaxSample + 1)); +} + +static int read_movie_header (FILE *fd, SMovie *movie) +{ + uint32 value; + uint8 buf[SMV_HEADER_SIZE], *ptr = buf; + + if (fread(buf, 1, SMV_HEADER_SIZE, fd) != SMV_HEADER_SIZE) + return (WRONG_FORMAT); + + value = Read32(ptr); + if (value != SMV_MAGIC) + return (WRONG_FORMAT); + + value = Read32(ptr); + if(value > SMV_VERSION || value < 4) + return (WRONG_VERSION); + + movie->Version = value; + movie->MovieId = Read32(ptr); + movie->RerecordCount = Read32(ptr); + movie->MaxFrame = Read32(ptr); + movie->ControllersMask = Read8(ptr); + movie->Opts = Read8(ptr); + ptr++; + movie->SyncFlags = Read8(ptr); + movie->SaveStateOffset = Read32(ptr); + movie->ControllerDataOffset = Read32(ptr); + movie->MaxSample = Read32(ptr); + movie->PortType[0] = Read8(ptr); + movie->PortType[1] = Read8(ptr); + for (int p = 0; p < 2; p++) + { + for (int i = 0; i < 4; i++) + movie->PortIDs[p][i] = Read8(ptr); + } + + if (movie->MaxSample < movie->MaxFrame) + movie->MaxSample = movie->MaxFrame; + + return (SUCCESS); +} + +static int read_movie_extrarominfo (FILE *fd, SMovie *movie) +{ + uint8 buf[SMV_EXTRAROMINFO_SIZE], *ptr = buf; + + fseek(fd, movie->SaveStateOffset - SMV_EXTRAROMINFO_SIZE, SEEK_SET); + + if (fread(buf, 1, SMV_EXTRAROMINFO_SIZE, fd) != SMV_EXTRAROMINFO_SIZE) + return (WRONG_FORMAT); + + ptr += 3; // zero bytes + movie->ROMCRC32 = Read32(ptr); + strncpy(movie->ROMName, (char *) ptr, 23); + + return (SUCCESS); +} + +static void write_movie_header (FILE *fd, SMovie *movie) +{ + uint8 buf[SMV_HEADER_SIZE], *ptr = buf; + + ZeroMemory(buf, sizeof(buf)); + + Write32(SMV_MAGIC, ptr); + Write32(SMV_VERSION, ptr); + Write32(movie->MovieId, ptr); + Write32(movie->RerecordCount, ptr); + Write32(movie->MaxFrame, ptr); + Write8(movie->ControllersMask, ptr); + Write8(movie->Opts, ptr); + ptr++; + Write8(movie->SyncFlags, ptr); + Write32(movie->SaveStateOffset, ptr); + Write32(movie->ControllerDataOffset, ptr); + Write32(movie->MaxSample, ptr); + Write8(movie->PortType[0], ptr); + Write8(movie->PortType[1], ptr); + for (int p = 0; p < 2; p++) + { + for (int i = 0; i < 4; i++) + Write8(movie->PortIDs[p][i], ptr); + } + + size_t ignore; + ignore = fwrite(buf, 1, SMV_HEADER_SIZE, fd); +} + +static void write_movie_extrarominfo (FILE *fd, SMovie *movie) +{ + uint8 buf[SMV_EXTRAROMINFO_SIZE], *ptr = buf; + + Write8(0, ptr); + Write8(0, ptr); + Write8(0, ptr); + Write32(movie->ROMCRC32, ptr); + strncpy((char *) ptr, movie->ROMName, 23); + + size_t ignore; + ignore = fwrite(buf, 1, SMV_EXTRAROMINFO_SIZE, fd); +} + +static void change_state (MovieState new_state) +{ + if (new_state == Movie.State) + return; + + if (Movie.State == MOVIE_STATE_RECORD) + flush_movie(); + + if (new_state == MOVIE_STATE_NONE) + { + truncate_movie(); + fclose(Movie.File); + Movie.File = NULL; + + if (S9xMoviePlaying() || S9xMovieRecording()) + restore_previous_settings(); + } + + Movie.State = new_state; +} + +void S9xMovieFreeze (uint8 **buf, uint32 *size) +{ + if (!S9xMovieActive()) + return; + + uint32 size_needed; + uint8 *ptr; + + size_needed = sizeof(Movie.MovieId) + sizeof(Movie.CurrentFrame) + sizeof(Movie.MaxFrame) + sizeof(Movie.CurrentSample) + sizeof(Movie.MaxSample); + size_needed += (uint32) (Movie.BytesPerSample * (Movie.MaxSample + 1)); + *size = size_needed; + + *buf = new uint8[size_needed]; + ptr = *buf; + if (!ptr) + return; + + Write32(Movie.MovieId, ptr); + Write32(Movie.CurrentFrame, ptr); + Write32(Movie.MaxFrame, ptr); + Write32(Movie.CurrentSample, ptr); + Write32(Movie.MaxSample, ptr); + + memcpy(ptr, Movie.InputBuffer, Movie.BytesPerSample * (Movie.MaxSample + 1)); +} + +int S9xMovieUnfreeze (uint8 *buf, uint32 size) +{ + if (!S9xMovieActive()) + return (FILE_NOT_FOUND); + + if (size < sizeof(Movie.MovieId) + sizeof(Movie.CurrentFrame) + sizeof(Movie.MaxFrame) + sizeof(Movie.CurrentSample) + sizeof(Movie.MaxSample)) + return (WRONG_FORMAT); + + uint8 *ptr = buf; + + uint32 movie_id = Read32(ptr); + uint32 current_frame = Read32(ptr); + uint32 max_frame = Read32(ptr); + uint32 current_sample = Read32(ptr); + uint32 max_sample = Read32(ptr); + uint32 space_needed = (Movie.BytesPerSample * (max_sample + 1)); + + if (current_frame > max_frame || current_sample > max_sample || space_needed > size) + return (WRONG_MOVIE_SNAPSHOT); + + if (Settings.WrongMovieStateProtection) + if (movie_id != Movie.MovieId) + if (max_frame < Movie.MaxFrame || max_sample < Movie.MaxSample || memcmp(Movie.InputBuffer, ptr, space_needed)) + return (WRONG_MOVIE_SNAPSHOT); + + if (!Movie.ReadOnly) + { + change_state(MOVIE_STATE_RECORD); + + Movie.CurrentFrame = current_frame; + Movie.MaxFrame = max_frame; + Movie.CurrentSample = current_sample; + Movie.MaxSample = max_sample; + Movie.RerecordCount++; + + store_movie_settings(); + + reserve_buffer_space(space_needed); + memcpy(Movie.InputBuffer, ptr, space_needed); + + flush_movie(); + fseek(Movie.File, Movie.ControllerDataOffset + (Movie.BytesPerSample * (Movie.CurrentSample + 1)), SEEK_SET); + } + else + { + if (current_frame > Movie.MaxFrame || current_sample > Movie.MaxSample || memcmp(Movie.InputBuffer, ptr, space_needed)) + return (SNAPSHOT_INCONSISTENT); + + change_state(MOVIE_STATE_PLAY); + + Movie.CurrentFrame = current_frame; + Movie.CurrentSample = current_sample; + } + + Movie.InputBufferPtr = Movie.InputBuffer + (Movie.BytesPerSample * Movie.CurrentSample); + read_frame_controller_data(true); + + return (SUCCESS); +} + +int S9xMovieOpen (const char *filename, bool8 read_only) +{ + FILE *fd; + STREAM stream; + int result; + int fn; + + if (!(fd = fopen(filename, "rb+"))) + { + if (!(fd = fopen(filename, "rb"))) + return (FILE_NOT_FOUND); + else + read_only = TRUE; + } + + change_state(MOVIE_STATE_NONE); + + result = read_movie_header(fd, &Movie); + if (result != SUCCESS) + { + fclose(fd); + return (result); + } + + read_movie_extrarominfo(fd, &Movie); + + fn = dup(fileno(fd)); + fclose(fd); + + store_previous_settings(); + restore_movie_settings(); + + lseek(fn, Movie.SaveStateOffset, SEEK_SET); + stream = REOPEN_STREAM(fn, "rb"); + if (!stream) + return (FILE_NOT_FOUND); + + if (Movie.Opts & MOVIE_OPT_FROM_RESET) + { + S9xReset(); + reset_controllers(); + result = (READ_STREAM(Memory.SRAM, 0x20000, stream) == 0x20000) ? SUCCESS : WRONG_FORMAT; + } + else + result = S9xUnfreezeFromStream(stream); + + CLOSE_STREAM(stream); + + if (result != SUCCESS) + return (result); + + if (!(fd = fopen(filename, "rb+"))) + { + if (!(fd = fopen(filename, "rb"))) + return (FILE_NOT_FOUND); + else + read_only = TRUE; + } + + if (fseek(fd, Movie.ControllerDataOffset, SEEK_SET)) + return (WRONG_FORMAT); + + Movie.File = fd; + Movie.BytesPerSample = bytes_per_sample(); + Movie.InputBufferPtr = Movie.InputBuffer; + reserve_buffer_space(Movie.BytesPerSample * (Movie.MaxSample + 1)); + + size_t ignore; + ignore = fread(Movie.InputBufferPtr, 1, Movie.BytesPerSample * (Movie.MaxSample + 1), fd); + + // read "baseline" controller data + if (Movie.MaxSample && Movie.MaxFrame) + read_frame_controller_data(true); + + Movie.CurrentFrame = 0; + Movie.CurrentSample = 0; + Movie.ReadOnly = read_only; + strncpy(Movie.Filename, filename, PATH_MAX + 1); + Movie.Filename[PATH_MAX] = 0; + + change_state(MOVIE_STATE_PLAY); + + S9xUpdateFrameCounter(-1); + + S9xMessage(S9X_INFO, S9X_MOVIE_INFO, MOVIE_INFO_REPLAY); + + return (SUCCESS); +} + +int S9xMovieCreate (const char *filename, uint8 controllers_mask, uint8 opts, const wchar_t *metadata, int metadata_length) +{ + FILE *fd; + STREAM stream; + int fn; + + if (controllers_mask == 0) + return (WRONG_FORMAT); + + if (!(fd = fopen(filename, "wb"))) + return (FILE_NOT_FOUND); + + if (metadata_length > MOVIE_MAX_METADATA) + metadata_length = MOVIE_MAX_METADATA; + + change_state(MOVIE_STATE_NONE); + + store_previous_settings(); + store_movie_settings(); + + Movie.MovieId = (uint32) time(NULL); + Movie.RerecordCount = 0; + Movie.MaxFrame = 0; + Movie.MaxSample = 0; + Movie.SaveStateOffset = SMV_HEADER_SIZE + (sizeof(uint16) * metadata_length) + SMV_EXTRAROMINFO_SIZE; + Movie.ControllerDataOffset = 0; + Movie.ControllersMask = controllers_mask; + Movie.Opts = opts; + Movie.SyncFlags = MOVIE_SYNC_DATA_EXISTS | MOVIE_SYNC_HASROMINFO; + + write_movie_header(fd, &Movie); + + // convert wchar_t metadata string/array to a uint16 array + // XXX: UTF-8 is much better... + if (metadata_length > 0) + { + uint8 meta_buf[sizeof(uint16) * MOVIE_MAX_METADATA]; + for (int i = 0; i < metadata_length; i++) + { + uint16 c = (uint16) metadata[i]; + meta_buf[i * 2] = (uint8) (c & 0xff); + meta_buf[i * 2 + 1] = (uint8) ((c >> 8) & 0xff); + } + + size_t ignore; + ignore = fwrite(meta_buf, sizeof(uint16), metadata_length, fd); + } + + Movie.ROMCRC32 = Memory.ROMCRC32; + strncpy(Movie.ROMName, Memory.RawROMName, 23); + + write_movie_extrarominfo(fd, &Movie); + + fn = dup(fileno(fd)); + fclose(fd); + + stream = REOPEN_STREAM(fn, "ab"); + if (!stream) + return (FILE_NOT_FOUND); + + if (opts & MOVIE_OPT_FROM_RESET) + { + S9xReset(); + reset_controllers(); + WRITE_STREAM(Memory.SRAM, 0x20000, stream); + } + else + S9xFreezeToStream(stream); + + CLOSE_STREAM(stream); + + if (!(fd = fopen(filename, "rb+"))) + return (FILE_NOT_FOUND); + + fseek(fd, 0, SEEK_END); + Movie.ControllerDataOffset = (uint32) ftell(fd); + + // 16-byte align the controller input, for hex-editing friendliness if nothing else + while (Movie.ControllerDataOffset % 16) + { + fputc(0xcc, fd); // arbitrary + Movie.ControllerDataOffset++; + } + + // write "baseline" controller data + Movie.File = fd; + Movie.BytesPerSample = bytes_per_sample(); + Movie.InputBufferPtr = Movie.InputBuffer; + write_frame_controller_data(); + + Movie.CurrentFrame = 0; + Movie.CurrentSample = 0; + Movie.ReadOnly = false; + strncpy(Movie.Filename, filename, PATH_MAX + 1); + Movie.Filename[PATH_MAX] = 0; + + change_state(MOVIE_STATE_RECORD); + + S9xUpdateFrameCounter(-1); + + S9xMessage(S9X_INFO, S9X_MOVIE_INFO, MOVIE_INFO_RECORD); + + return (SUCCESS); +} + +int S9xMovieGetInfo (const char *filename, struct MovieInfo *info) +{ + FILE *fd; + SMovie local_movie; + int metadata_length; + int result, i; + + flush_movie(); + + ZeroMemory(info, sizeof(*info)); + + if (!(fd = fopen(filename, "rb"))) + return (FILE_NOT_FOUND); + + result = read_movie_header(fd, &local_movie); + if (result != SUCCESS) + return (result); + + info->TimeCreated = (time_t) local_movie.MovieId; + info->Version = local_movie.Version; + info->Opts = local_movie.Opts; + info->SyncFlags = local_movie.SyncFlags; + info->ControllersMask = local_movie.ControllersMask; + info->RerecordCount = local_movie.RerecordCount; + info->LengthFrames = local_movie.MaxFrame; + info->LengthSamples = local_movie.MaxSample; + info->PortType[0] = local_movie.PortType[0]; + info->PortType[1] = local_movie.PortType[1]; + + if (local_movie.SaveStateOffset > SMV_HEADER_SIZE) + { + uint8 meta_buf[sizeof(uint16) * MOVIE_MAX_METADATA]; + int curRomInfoSize = (local_movie.SyncFlags & MOVIE_SYNC_HASROMINFO) ? SMV_EXTRAROMINFO_SIZE : 0; + + metadata_length = ((int) local_movie.SaveStateOffset - SMV_HEADER_SIZE - curRomInfoSize) / sizeof(uint16); + metadata_length = (metadata_length >= MOVIE_MAX_METADATA) ? MOVIE_MAX_METADATA - 1 : metadata_length; + metadata_length = (int) fread(meta_buf, sizeof(uint16), metadata_length, fd); + + for (i = 0; i < metadata_length; i++) + { + uint16 c = meta_buf[i * 2] | (meta_buf[i * 2 + 1] << 8); + info->Metadata[i] = (wchar_t) c; + } + + info->Metadata[i] = '\0'; + } + else + info->Metadata[0] = '\0'; + + read_movie_extrarominfo(fd, &local_movie); + + info->ROMCRC32 = local_movie.ROMCRC32; + strncpy(info->ROMName, local_movie.ROMName, 23); + + fclose(fd); + + if (access(filename, W_OK)) + info->ReadOnly = true; + + return (SUCCESS); +} + +void S9xMovieUpdate (bool addFrame) +{ + switch (Movie.State) + { + case MOVIE_STATE_PLAY: + { + if (Movie.CurrentFrame >= Movie.MaxFrame || Movie.CurrentSample >= Movie.MaxSample) + { + change_state(MOVIE_STATE_NONE); + S9xMessage(S9X_INFO, S9X_MOVIE_INFO, MOVIE_INFO_END); + return; + } + else + { + if (addFrame) + S9xUpdateFrameCounter(); + else + if (SKIPPED_POLLING_PORT_TYPE(Movie.PortType[0]) && SKIPPED_POLLING_PORT_TYPE(Movie.PortType[1])) + return; + + read_frame_controller_data(addFrame); + Movie.CurrentSample++; + if (addFrame) + Movie.CurrentFrame++; + } + + break; + } + + case MOVIE_STATE_RECORD: + { + if (addFrame) + S9xUpdateFrameCounter(); + else + if (SKIPPED_POLLING_PORT_TYPE(Movie.PortType[0]) && SKIPPED_POLLING_PORT_TYPE(Movie.PortType[1])) + return; + + write_frame_controller_data(); + Movie.MaxSample = ++Movie.CurrentSample; + if (addFrame) + Movie.MaxFrame = ++Movie.CurrentFrame; + + size_t ignore; + ignore = fwrite((Movie.InputBufferPtr - Movie.BytesPerSample), 1, Movie.BytesPerSample, Movie.File); + + break; + } + + default: + { + if (addFrame) + S9xUpdateFrameCounter(); + + break; + } + } +} + +void S9xMovieUpdateOnReset (void) +{ + if (Movie.State == MOVIE_STATE_RECORD) + { + reserve_buffer_space((uint32) (Movie.InputBufferPtr + Movie.BytesPerSample - Movie.InputBuffer)); + memset(Movie.InputBufferPtr, 0xFF, Movie.BytesPerSample); + Movie.InputBufferPtr += Movie.BytesPerSample; + Movie.MaxSample = ++Movie.CurrentSample; + Movie.MaxFrame = ++Movie.CurrentFrame; + + size_t ignore; + ignore = fwrite((Movie.InputBufferPtr - Movie.BytesPerSample), 1, Movie.BytesPerSample, Movie.File); + } +} + +void S9xMovieInit (void) +{ + ZeroMemory(&Movie, sizeof(Movie)); + Movie.State = MOVIE_STATE_NONE; +} + +void S9xMovieStop (bool8 suppress_message) +{ + if (Movie.State != MOVIE_STATE_NONE) + { + change_state(MOVIE_STATE_NONE); + + if (!suppress_message) + S9xMessage(S9X_INFO, S9X_MOVIE_INFO, MOVIE_INFO_STOP); + } +} + +void S9xMovieShutdown (void) +{ + if (S9xMovieActive()) + S9xMovieStop(TRUE); +} + +bool8 S9xMovieActive (void) +{ + return (Movie.State != MOVIE_STATE_NONE); +} + +bool8 S9xMoviePlaying (void) +{ + return (Movie.State == MOVIE_STATE_PLAY); +} + +bool8 S9xMovieRecording (void) +{ + return (Movie.State == MOVIE_STATE_RECORD); +} + +uint8 S9xMovieControllers (void) +{ + return (Movie.ControllersMask); +} + +bool8 S9xMovieReadOnly (void) +{ + if (!S9xMovieActive()) + return (FALSE); + return (Movie.ReadOnly); +} + +uint32 S9xMovieGetId (void) +{ + if (!S9xMovieActive()) + return (0); + return (Movie.MovieId); +} + +uint32 S9xMovieGetLength (void) +{ + if (!S9xMovieActive()) + return (0); + return (Movie.MaxFrame); +} + +uint32 S9xMovieGetFrameCounter (void) +{ + if (!S9xMovieActive()) + return (0); + return (Movie.CurrentFrame); +} + +void S9xMovieToggleRecState (void) +{ + Movie.ReadOnly = !Movie.ReadOnly; + + if (Movie.ReadOnly) + S9xMessage(S9X_INFO, S9X_MOVIE_INFO, "Movie is now read-only."); + else + S9xMessage(S9X_INFO, S9X_MOVIE_INFO, "Movie is now read+write."); +} + +void S9xMovieToggleFrameDisplay (void) +{ + Settings.DisplayMovieFrame = !Settings.DisplayMovieFrame; + S9xReRefresh(); +} + +void S9xUpdateFrameCounter (int offset) +{ + extern bool8 pad_read; + + offset++; + + if (!Settings.DisplayMovieFrame) + *GFX.FrameDisplayString = 0; + else + if (Movie.State == MOVIE_STATE_RECORD) + sprintf(GFX.FrameDisplayString, "Recording frame: %d%s", + max(0, (int) (Movie.CurrentFrame + offset)), pad_read || !Settings.MovieNotifyIgnored ? "" : " (ignored)"); + else + if (Movie.State == MOVIE_STATE_PLAY) + sprintf(GFX.FrameDisplayString, "Playing frame: %d / %d", + max(0, (int) (Movie.CurrentFrame + offset)), Movie.MaxFrame); +#ifdef NETPLAY_SUPPORT + else + if (Settings.NetPlay) + sprintf(GFX.FrameDisplayString, "%s frame: %d", Settings.NetPlayServer ? "Server" : "Client", + max(0, (int) (NetPlay.FrameCount + offset))); +#endif +} diff --git a/plugins/snes9x_gx/source/snes9x/movie.h b/plugins/snes9x_gx/source/snes9x/movie.h new file mode 100644 index 00000000..f1fb2bb0 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/movie.h @@ -0,0 +1,254 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _MOVIE_H_ +#define _MOVIE_H_ + +#define MOVIE_OPT_FROM_SNAPSHOT 0 +#define MOVIE_OPT_FROM_RESET (1 << 0) +#define MOVIE_OPT_PAL (1 << 1) +#define MOVIE_OPT_NOSAVEDATA (1 << 2) +#define MOVIE_SYNC_DATA_EXISTS 0x01 +#define MOVIE_SYNC_OBSOLETE 0x02 +#define MOVIE_SYNC_LEFTRIGHT 0x04 +#define MOVIE_SYNC_VOLUMEENVX 0x08 +#define MOVIE_SYNC_FAKEMUTE 0x10 +#define MOVIE_SYNC_SYNCSOUND 0x20 +#define MOVIE_SYNC_HASROMINFO 0x40 +#define MOVIE_SYNC_NOCPUSHUTDOWN 0x80 +#define MOVIE_MAX_METADATA 512 + +#define CONTROLLER_DATA_SIZE 2 +#define MOUSE_DATA_SIZE 5 +#define SCOPE_DATA_SIZE 6 +#define JUSTIFIER_DATA_SIZE 11 + +struct MovieInfo +{ + time_t TimeCreated; + uint32 Version; + uint32 LengthFrames; + uint32 LengthSamples; + uint32 RerecordCount; + uint8 Opts; + uint8 ControllersMask; + uint8 SyncFlags; + bool8 ReadOnly; + uint8 PortType[2]; + wchar_t Metadata[MOVIE_MAX_METADATA]; + uint32 ROMCRC32; + char ROMName[23]; +}; + +// methods used by the user-interface code +int S9xMovieOpen (const char *, bool8); +int S9xMovieCreate (const char *, uint8, uint8, const wchar_t *, int); +int S9xMovieGetInfo (const char *, struct MovieInfo *); +void S9xMovieStop (bool8); +void S9xMovieToggleRecState (void); +void S9xMovieToggleFrameDisplay (void); +const char * S9xChooseMovieFilename (bool8); + +// methods used by the emulation +void S9xMovieInit (void); +void S9xMovieShutdown (void); +void S9xMovieUpdate (bool a = true); +void S9xMovieUpdateOnReset (void); +void S9xUpdateFrameCounter (int o = 0); +void S9xMovieFreeze (uint8 **, uint32 *); +int S9xMovieUnfreeze (uint8 *, uint32); + +// accessor functions +bool8 S9xMovieActive (void); +bool8 S9xMoviePlaying (void); +bool8 S9xMovieRecording (void); +bool8 S9xMovieReadOnly (void); +uint8 S9xMovieControllers (void); +uint32 S9xMovieGetId (void); +uint32 S9xMovieGetLength (void); +uint32 S9xMovieGetFrameCounter (void); + +uint16 MovieGetJoypad (int); +void MovieSetJoypad (int, uint16); +bool MovieGetMouse (int, uint8 d[MOUSE_DATA_SIZE]); +void MovieSetMouse (int, uint8 d[MOUSE_DATA_SIZE], bool); +bool MovieGetScope (int, uint8 d[SCOPE_DATA_SIZE]); +void MovieSetScope (int, uint8 d[SCOPE_DATA_SIZE]); +bool MovieGetJustifier (int, uint8 d[JUSTIFIER_DATA_SIZE]); +void MovieSetJustifier (int, uint8 d[JUSTIFIER_DATA_SIZE]); + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/obc1.cpp b/plugins/snes9x_gx/source/snes9x/obc1.cpp new file mode 100644 index 00000000..9fe98de5 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/obc1.cpp @@ -0,0 +1,276 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#include "snes9x.h" +#include "memmap.h" + + +uint8 S9xGetOBC1 (uint16 Address) +{ + switch (Address) + { + case 0x7ff0: + return (Memory.OBC1RAM[OBC1.basePtr + (OBC1.address << 2)]); + + case 0x7ff1: + return (Memory.OBC1RAM[OBC1.basePtr + (OBC1.address << 2) + 1]); + + case 0x7ff2: + return (Memory.OBC1RAM[OBC1.basePtr + (OBC1.address << 2) + 2]); + + case 0x7ff3: + return (Memory.OBC1RAM[OBC1.basePtr + (OBC1.address << 2) + 3]); + + case 0x7ff4: + return (Memory.OBC1RAM[OBC1.basePtr + (OBC1.address >> 2) + 0x200]); + } + + return (Memory.OBC1RAM[Address - 0x6000]); +} + +void S9xSetOBC1 (uint8 Byte, uint16 Address) +{ + switch (Address) + { + case 0x7ff0: + Memory.OBC1RAM[OBC1.basePtr + (OBC1.address << 2)] = Byte; + break; + + case 0x7ff1: + Memory.OBC1RAM[OBC1.basePtr + (OBC1.address << 2) + 1] = Byte; + break; + + case 0x7ff2: + Memory.OBC1RAM[OBC1.basePtr + (OBC1.address << 2) + 2] = Byte; + break; + + case 0x7ff3: + Memory.OBC1RAM[OBC1.basePtr + (OBC1.address << 2) + 3] = Byte; + break; + + case 0x7ff4: + { + uint8 Temp; + Temp = Memory.OBC1RAM[OBC1.basePtr + (OBC1.address >> 2) + 0x200]; + Temp = (Temp & ~(3 << OBC1.shift)) | ((Byte & 3) << OBC1.shift); + Memory.OBC1RAM[OBC1.basePtr + (OBC1.address >> 2) + 0x200] = Temp; + break; + } + + case 0x7ff5: + if (Byte & 1) + OBC1.basePtr = 0x1800; + else + OBC1.basePtr = 0x1c00; + break; + + case 0x7ff6: + OBC1.address = Byte & 0x7f; + OBC1.shift = (Byte & 3) << 1; + break; + } + + Memory.OBC1RAM[Address - 0x6000] = Byte; +} + +void S9xResetOBC1 (void) +{ + for (int i = 0; i <= 0x1fff; i++) + Memory.OBC1RAM[i] = 0xff; + + if (Memory.OBC1RAM[0x1ff5] & 1) + OBC1.basePtr = 0x1800; + else + OBC1.basePtr = 0x1c00; + + OBC1.address = Memory.OBC1RAM[0x1ff6] & 0x7f; + OBC1.shift = (Memory.OBC1RAM[0x1ff6] & 3) << 1; +} + +uint8 * S9xGetBasePointerOBC1 (uint16 Address) +{ + if (Address >= 0x7ff0 && Address <= 0x7ff6) + return (NULL); + return (Memory.OBC1RAM - 0x6000); +} + +uint8 * S9xGetMemPointerOBC1 (uint16 Address) +{ + if (Address >= 0x7ff0 && Address <= 0x7ff6) + return (NULL); + return (Memory.OBC1RAM + Address - 0x6000); +} diff --git a/plugins/snes9x_gx/source/snes9x/obc1.h b/plugins/snes9x_gx/source/snes9x/obc1.h new file mode 100644 index 00000000..836850b7 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/obc1.h @@ -0,0 +1,196 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _OBC1_H_ +#define _OBC1_H_ + +struct SOBC1 +{ + uint16 address; + uint16 basePtr; + uint16 shift; +}; + +extern struct SOBC1 OBC1; + +void S9xSetOBC1 (uint8, uint16); +uint8 S9xGetOBC1 (uint16); +void S9xResetOBC1 (void); +uint8 * S9xGetBasePointerOBC1 (uint16); +uint8 * S9xGetMemPointerOBC1 (uint16); + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/pixform.h b/plugins/snes9x_gx/source/snes9x/pixform.h new file mode 100644 index 00000000..1760899c --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/pixform.h @@ -0,0 +1,407 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _PIXFORM_H_ +#define _PIXFORM_H_ + +#ifdef GFX_MULTI_FORMAT + +enum { RGB565, RGB555, BGR565, BGR555, GBR565, GBR555, RGB5551 }; + +#define BUILD_PIXEL(R, G, B) ((*GFX.BuildPixel) (R, G, B)) +#define BUILD_PIXEL2(R, G, B) ((*GFX.BuildPixel2) (R, G, B)) +#define DECOMPOSE_PIXEL(PIX, R, G, B) ((*GFX.DecomposePixel) (PIX, R, G, B)) + +extern uint32 MAX_RED; +extern uint32 MAX_GREEN; +extern uint32 MAX_BLUE; +extern uint32 RED_LOW_BIT_MASK; +extern uint32 GREEN_LOW_BIT_MASK; +extern uint32 BLUE_LOW_BIT_MASK; +extern uint32 RED_HI_BIT_MASK; +extern uint32 GREEN_HI_BIT_MASK; +extern uint32 BLUE_HI_BIT_MASK; +extern uint32 FIRST_COLOR_MASK; +extern uint32 SECOND_COLOR_MASK; +extern uint32 THIRD_COLOR_MASK; +extern uint32 ALPHA_BITS_MASK; +extern uint32 GREEN_HI_BIT; +extern uint32 RGB_LOW_BITS_MASK; +extern uint32 RGB_HI_BITS_MASK; +extern uint32 RGB_HI_BITS_MASKx2; +extern uint32 RGB_REMOVE_LOW_BITS_MASK; +extern uint32 FIRST_THIRD_COLOR_MASK; +extern uint32 TWO_LOW_BITS_MASK; +extern uint32 HIGH_BITS_SHIFTED_TWO_MASK; +extern uint32 SPARE_RGB_BIT_MASK; + +#endif + +/* RGB565 format */ +#define BUILD_PIXEL_RGB565(R, G, B) (((int) (R) << 11) | ((int) (G) << 6) | (int) (B)) +#define BUILD_PIXEL2_RGB565(R, G, B) (((int) (R) << 11) | ((int) (G) << 5) | (int) (B)) +#define DECOMPOSE_PIXEL_RGB565(PIX, R, G, B) { (R) = (PIX) >> 11; (G) = ((PIX) >> 6) & 0x1f; (B) = (PIX) & 0x1f; } +#define SPARE_RGB_BIT_MASK_RGB565 (1 << 5) + +#define MAX_RED_RGB565 31 +#define MAX_GREEN_RGB565 63 +#define MAX_BLUE_RGB565 31 +#define RED_LOW_BIT_MASK_RGB565 0x0800 +#define GREEN_LOW_BIT_MASK_RGB565 0x0020 +#define BLUE_LOW_BIT_MASK_RGB565 0x0001 +#define RED_HI_BIT_MASK_RGB565 0x8000 +#define GREEN_HI_BIT_MASK_RGB565 0x0400 +#define BLUE_HI_BIT_MASK_RGB565 0x0010 +#define FIRST_COLOR_MASK_RGB565 0xF800 +#define SECOND_COLOR_MASK_RGB565 0x07E0 +#define THIRD_COLOR_MASK_RGB565 0x001F +#define ALPHA_BITS_MASK_RGB565 0x0000 + +/* RGB555 format */ +#define BUILD_PIXEL_RGB555(R, G, B) (((int) (R) << 10) | ((int) (G) << 5) | (int) (B)) +#define BUILD_PIXEL2_RGB555(R, G, B) (((int) (R) << 10) | ((int) (G) << 5) | (int) (B)) +#define DECOMPOSE_PIXEL_RGB555(PIX, R, G, B) { (R) = (PIX) >> 10; (G) = ((PIX) >> 5) & 0x1f; (B) = (PIX) & 0x1f; } +#define SPARE_RGB_BIT_MASK_RGB555 (1 << 15) + +#define MAX_RED_RGB555 31 +#define MAX_GREEN_RGB555 31 +#define MAX_BLUE_RGB555 31 +#define RED_LOW_BIT_MASK_RGB555 0x0400 +#define GREEN_LOW_BIT_MASK_RGB555 0x0020 +#define BLUE_LOW_BIT_MASK_RGB555 0x0001 +#define RED_HI_BIT_MASK_RGB555 0x4000 +#define GREEN_HI_BIT_MASK_RGB555 0x0200 +#define BLUE_HI_BIT_MASK_RGB555 0x0010 +#define FIRST_COLOR_MASK_RGB555 0x7C00 +#define SECOND_COLOR_MASK_RGB555 0x03E0 +#define THIRD_COLOR_MASK_RGB555 0x001F +#define ALPHA_BITS_MASK_RGB555 0x0000 + +/* BGR565 format */ +#define BUILD_PIXEL_BGR565(R, G, B) (((int) (B) << 11) | ((int) (G) << 6) | (int) (R)) +#define BUILD_PIXEL2_BGR565(R, G, B) (((int) (B) << 11) | ((int) (G) << 5) | (int) (R)) +#define DECOMPOSE_PIXEL_BGR565(PIX, R, G, B) { (B) = (PIX) >> 11; (G) = ((PIX) >> 6) & 0x1f; (R) = (PIX) & 0x1f; } +#define SPARE_RGB_BIT_MASK_BGR565 (1 << 5) + +#define MAX_RED_BGR565 31 +#define MAX_GREEN_BGR565 63 +#define MAX_BLUE_BGR565 31 +#define RED_LOW_BIT_MASK_BGR565 0x0001 +#define GREEN_LOW_BIT_MASK_BGR565 0x0040 +#define BLUE_LOW_BIT_MASK_BGR565 0x0800 +#define RED_HI_BIT_MASK_BGR565 0x0010 +#define GREEN_HI_BIT_MASK_BGR565 0x0400 +#define BLUE_HI_BIT_MASK_BGR565 0x8000 +#define FIRST_COLOR_MASK_BGR565 0xF800 +#define SECOND_COLOR_MASK_BGR565 0x07E0 +#define THIRD_COLOR_MASK_BGR565 0x001F +#define ALPHA_BITS_MASK_BGR565 0x0000 + +/* BGR555 format */ +#define BUILD_PIXEL_BGR555(R, G, B) (((int) (B) << 10) | ((int) (G) << 5) | (int) (R)) +#define BUILD_PIXEL2_BGR555(R, G, B) (((int) (B) << 10) | ((int) (G) << 5) | (int) (R)) +#define DECOMPOSE_PIXEL_BGR555(PIX, R, G, B) { (B) = (PIX) >> 10; (G) = ((PIX) >> 5) & 0x1f; (R) = (PIX) & 0x1f; } +#define SPARE_RGB_BIT_MASK_BGR555 (1 << 15) + +#define MAX_RED_BGR555 31 +#define MAX_GREEN_BGR555 31 +#define MAX_BLUE_BGR555 31 +#define RED_LOW_BIT_MASK_BGR555 0x0001 +#define GREEN_LOW_BIT_MASK_BGR555 0x0020 +#define BLUE_LOW_BIT_MASK_BGR555 0x0400 +#define RED_HI_BIT_MASK_BGR555 0x0010 +#define GREEN_HI_BIT_MASK_BGR555 0x0200 +#define BLUE_HI_BIT_MASK_BGR555 0x4000 +#define FIRST_COLOR_MASK_BGR555 0x7C00 +#define SECOND_COLOR_MASK_BGR555 0x03E0 +#define THIRD_COLOR_MASK_BGR555 0x001F +#define ALPHA_BITS_MASK_BGR555 0x0000 + +/* GBR565 format */ +#define BUILD_PIXEL_GBR565(R, G, B) (((int) (G) << 11) | ((int) (B) << 6) | (int) (R)) +#define BUILD_PIXEL2_GBR565(R, G, B) (((int) (G) << 11) | ((int) (B) << 5) | (int) (R)) +#define DECOMPOSE_PIXEL_GBR565(PIX, R, G, B) { (G) = (PIX) >> 11; (B) = ((PIX) >> 6) & 0x1f; (R) = (PIX) & 0x1f; } +#define SPARE_RGB_BIT_MASK_GBR565 (1 << 5) + +#define MAX_RED_GBR565 31 +#define MAX_GREEN_GBR565 31 +#define MAX_BLUE_GBR565 63 +#define RED_LOW_BIT_MASK_GBR565 0x0001 +#define GREEN_LOW_BIT_MASK_GBR565 0x0800 +#define BLUE_LOW_BIT_MASK_GBR565 0x0040 +#define RED_HI_BIT_MASK_GBR565 0x0010 +#define GREEN_HI_BIT_MASK_GBR565 0x8000 +#define BLUE_HI_BIT_MASK_GBR565 0x0400 +#define FIRST_COLOR_MASK_GBR565 0xF800 +#define SECOND_COLOR_MASK_GBR565 0x07E0 +#define THIRD_COLOR_MASK_GBR565 0x001F +#define ALPHA_BITS_MASK_GBR565 0x0000 + +/* GBR555 format */ +#define BUILD_PIXEL_GBR555(R, G, B) (((int) (G) << 10) | ((int) (B) << 5) | (int) (R)) +#define BUILD_PIXEL2_GBR555(R, G, B) (((int) (G) << 10) | ((int) (B) << 5) | (int) (R)) +#define DECOMPOSE_PIXEL_GBR555(PIX, R, G, B) { (G) = (PIX) >> 10; (B) = ((PIX) >> 5) & 0x1f; (R) = (PIX) & 0x1f; } +#define SPARE_RGB_BIT_MASK_GBR555 (1 << 15) + +#define MAX_RED_GBR555 31 +#define MAX_GREEN_GBR555 31 +#define MAX_BLUE_GBR555 31 +#define RED_LOW_BIT_MASK_GBR555 0x0001 +#define GREEN_LOW_BIT_MASK_GBR555 0x0400 +#define BLUE_LOW_BIT_MASK_GBR555 0x0020 +#define RED_HI_BIT_MASK_GBR555 0x0010 +#define GREEN_HI_BIT_MASK_GBR555 0x4000 +#define BLUE_HI_BIT_MASK_GBR555 0x0200 +#define FIRST_COLOR_MASK_GBR555 0x7C00 +#define SECOND_COLOR_MASK_GBR555 0x03E0 +#define THIRD_COLOR_MASK_GBR555 0x001F +#define ALPHA_BITS_MASK_GBR555 0x0000 + +/* RGB5551 format */ +#define BUILD_PIXEL_RGB5551(R, G, B) (((int) (R) << 11) | ((int) (G) << 6) | (int) ((B) << 1) | 1) +#define BUILD_PIXEL2_RGB5551(R, G, B) (((int) (R) << 11) | ((int) (G) << 6) | (int) ((B) << 1) | 1) +#define DECOMPOSE_PIXEL_RGB5551(PIX, R, G, B) { (R) = (PIX) >> 11; (G) = ((PIX) >> 6) & 0x1f; (B) = ((PIX) >> 1) & 0x1f; } +#define SPARE_RGB_BIT_MASK_RGB5551 (1) + +#define MAX_RED_RGB5551 31 +#define MAX_GREEN_RGB5551 31 +#define MAX_BLUE_RGB5551 31 +#define RED_LOW_BIT_MASK_RGB5551 0x0800 +#define GREEN_LOW_BIT_MASK_RGB5551 0x0040 +#define BLUE_LOW_BIT_MASK_RGB5551 0x0002 +#define RED_HI_BIT_MASK_RGB5551 0x8000 +#define GREEN_HI_BIT_MASK_RGB5551 0x0400 +#define BLUE_HI_BIT_MASK_RGB5551 0x0020 +#define FIRST_COLOR_MASK_RGB5551 0xf800 +#define SECOND_COLOR_MASK_RGB5551 0x07c0 +#define THIRD_COLOR_MASK_RGB5551 0x003e +#define ALPHA_BITS_MASK_RGB5551 0x0001 + +#ifndef GFX_MULTI_FORMAT + +#define CONCAT(X, Y) X##Y + +// C pre-processor needs a two stage macro define to enable it to concat +// to macro names together to form the name of another macro. +#define BUILD_PIXEL_D(F, R, G, B) CONCAT(BUILD_PIXEL_,F) (R, G, B) +#define BUILD_PIXEL2_D(F, R, G, B) CONCAT(BUILD_PIXEL2_,F) (R, G, B) +#define DECOMPOSE_PIXEL_D(F, PIX, R, G, B) CONCAT(DECOMPOSE_PIXEL_,F) (PIX, R, G, B) + +#define BUILD_PIXEL(R, G, B) BUILD_PIXEL_D(PIXEL_FORMAT, R, G, B) +#define BUILD_PIXEL2(R, G, B) BUILD_PIXEL2_D(PIXEL_FORMAT, R, G, B) +#define DECOMPOSE_PIXEL(PIX, R, G, B) DECOMPOSE_PIXEL_D(PIXEL_FORMAT, PIX, R, G, B) + +#define MAX_RED_D(F) CONCAT(MAX_RED_, F) +#define MAX_GREEN_D(F) CONCAT(MAX_GREEN_, F) +#define MAX_BLUE_D(F) CONCAT(MAX_BLUE_, F) +#define RED_LOW_BIT_MASK_D(F) CONCAT(RED_LOW_BIT_MASK_, F) +#define GREEN_LOW_BIT_MASK_D(F) CONCAT(GREEN_LOW_BIT_MASK_, F) +#define BLUE_LOW_BIT_MASK_D(F) CONCAT(BLUE_LOW_BIT_MASK_, F) +#define RED_HI_BIT_MASK_D(F) CONCAT(RED_HI_BIT_MASK_, F) +#define GREEN_HI_BIT_MASK_D(F) CONCAT(GREEN_HI_BIT_MASK_, F) +#define BLUE_HI_BIT_MASK_D(F) CONCAT(BLUE_HI_BIT_MASK_, F) +#define FIRST_COLOR_MASK_D(F) CONCAT(FIRST_COLOR_MASK_, F) +#define SECOND_COLOR_MASK_D(F) CONCAT(SECOND_COLOR_MASK_, F) +#define THIRD_COLOR_MASK_D(F) CONCAT(THIRD_COLOR_MASK_, F) +#define ALPHA_BITS_MASK_D(F) CONCAT(ALPHA_BITS_MASK_, F) + +#define MAX_RED MAX_RED_D(PIXEL_FORMAT) +#define MAX_GREEN MAX_GREEN_D(PIXEL_FORMAT) +#define MAX_BLUE MAX_BLUE_D(PIXEL_FORMAT) +#define RED_LOW_BIT_MASK RED_LOW_BIT_MASK_D(PIXEL_FORMAT) +#define GREEN_LOW_BIT_MASK GREEN_LOW_BIT_MASK_D(PIXEL_FORMAT) +#define BLUE_LOW_BIT_MASK BLUE_LOW_BIT_MASK_D(PIXEL_FORMAT) +#define RED_HI_BIT_MASK RED_HI_BIT_MASK_D(PIXEL_FORMAT) +#define GREEN_HI_BIT_MASK GREEN_HI_BIT_MASK_D(PIXEL_FORMAT) +#define BLUE_HI_BIT_MASK BLUE_HI_BIT_MASK_D(PIXEL_FORMAT) +#define FIRST_COLOR_MASK FIRST_COLOR_MASK_D(PIXEL_FORMAT) +#define SECOND_COLOR_MASK SECOND_COLOR_MASK_D(PIXEL_FORMAT) +#define THIRD_COLOR_MASK THIRD_COLOR_MASK_D(PIXEL_FORMAT) +#define ALPHA_BITS_MASK ALPHA_BITS_MASK_D(PIXEL_FORMAT) + +#define GREEN_HI_BIT ((MAX_GREEN + 1) >> 1) +#define RGB_LOW_BITS_MASK (RED_LOW_BIT_MASK | GREEN_LOW_BIT_MASK | BLUE_LOW_BIT_MASK) +#define RGB_HI_BITS_MASK (RED_HI_BIT_MASK | GREEN_HI_BIT_MASK | BLUE_HI_BIT_MASK) +#define RGB_HI_BITS_MASKx2 ((RED_HI_BIT_MASK | GREEN_HI_BIT_MASK | BLUE_HI_BIT_MASK) << 1) +#define RGB_REMOVE_LOW_BITS_MASK (~RGB_LOW_BITS_MASK) +#define FIRST_THIRD_COLOR_MASK (FIRST_COLOR_MASK | THIRD_COLOR_MASK) +#define TWO_LOW_BITS_MASK (RGB_LOW_BITS_MASK | (RGB_LOW_BITS_MASK << 1)) +#define HIGH_BITS_SHIFTED_TWO_MASK (((FIRST_COLOR_MASK | SECOND_COLOR_MASK | THIRD_COLOR_MASK) & ~TWO_LOW_BITS_MASK ) >> 2) + +#endif + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/port.h b/plugins/snes9x_gx/source/snes9x/port.h new file mode 100644 index 00000000..b9bed24c --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/port.h @@ -0,0 +1,362 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _PORT_H_ +#define _PORT_H_ + +#include <stdio.h> +#include <stdlib.h> +#include <limits.h> +#ifndef GEKKO +#include <memory.h> +#endif +#include <time.h> +#include <string.h> +#ifdef HAVE_STRINGS_H +#include <strings.h> +#endif +#include <sys/types.h> + +#ifdef __WIN32__ +#define NOMINMAX +#include <windows.h> +#endif + +#define GFX_MULTI_FORMAT + +#ifdef __WIN32__ +//#define RIGHTSHIFT_IS_SAR +#define RIGHTSHIFT_int8_IS_SAR +#define RIGHTSHIFT_int16_IS_SAR +#define RIGHTSHIFT_int32_IS_SAR +#define SNES_JOY_READ_CALLBACKS +#endif + +#ifdef __MACOSX__ +#undef GFX_MULTI_FORMAT +#define PIXEL_FORMAT RGB555 +#endif + +#ifndef snes9x_types_defined +#define snes9x_types_defined +typedef unsigned char bool8; +#ifdef HAVE_STDINT_H +#include <stdint.h> +typedef intptr_t pint; +typedef int8_t int8; +typedef uint8_t uint8; +typedef int16_t int16; +typedef uint16_t uint16; +typedef int32_t int32; +typedef uint32_t uint32; +typedef int64_t int64; +typedef uint64_t uint64; +#else // HAVE_STDINT_H +#ifdef __WIN32__ +typedef intptr_t pint; +#else // __WIN32__ +#ifdef PTR_NOT_INT +typedef long pint; +#else +typedef int pint; +#endif +#endif // __WIN32__ +#ifdef __WIN32__ +#ifdef __BORLANDC__ +#include <systypes.h> +#else +typedef signed char int8; +typedef unsigned char uint8; +typedef signed short int16; +typedef unsigned short uint16; +#ifndef WSAAP +// winsock2.h typedefs int32 as well +typedef signed int int32; +#endif +typedef unsigned int uint32; +#endif +typedef unsigned char uint8_t; +typedef signed __int64 int64; +typedef unsigned __int64 uint64; +typedef int socklen_t; +#else // __WIN32__ +typedef signed char int8; +typedef unsigned char uint8; +typedef signed short int16; +typedef unsigned short uint16; +typedef signed int int32; +typedef unsigned int uint32; +#ifdef __GNUC__ +// long long is not part of ISO C++ +__extension__ +#endif +typedef long long int64; +typedef unsigned long long uint64; +#endif // __WIN32__ +#endif // HAVE_STDINT_H +#endif // snes9x_types_defined + +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + +#define START_EXTERN_C extern "C" { +#define END_EXTERN_C } + +#ifndef __WIN32__ +#ifndef PATH_MAX +#define PATH_MAX 1024 +#endif +#define _MAX_DRIVE 1 +#define _MAX_DIR PATH_MAX +#define _MAX_FNAME PATH_MAX +#define _MAX_EXT PATH_MAX +#define _MAX_PATH PATH_MAX +#else +#ifndef PATH_MAX +#define PATH_MAX _MAX_PATH +#endif +#endif + +#ifndef __WIN32__ +#define ZeroMemory(a, b) memset((a), 0, (b)) +void _splitpath (const char *, char *, char *, char *, char *); +void _makepath (char *, const char *, const char *, const char *, const char *); +#define S9xDisplayString DisplayStringFromBottom +#else +#define snprintf _snprintf +#define strcasecmp stricmp +#define strncasecmp strnicmp +void WinDisplayStringFromBottom(const char *string, int linesFromBottom, int pixelsFromLeft, bool allowWrap); +#define S9xDisplayString WinDisplayStringFromBottom +void SetInfoDlgColor(unsigned char, unsigned char, unsigned char); +#define SET_UI_COLOR(r,g,b) SetInfoDlgColor(r,g,b) +#endif + +#ifdef __DJGPP +#define SLASH_STR "\\" +#define SLASH_CHAR '\\' +#else +#define SLASH_STR "/" +#define SLASH_CHAR '/' +#endif + +#ifndef SIG_PF +#define SIG_PF void (*) (int) +#endif + +#ifdef __linux +#define TITLE "Snes9x: Linux" +#define SYS_CONFIG_FILE "/etc/snes9x/snes9x.conf" +#endif + +#ifndef TITLE +#define TITLE "Snes9x" +#endif + +#if defined(__i386__) || defined(__i486__) || defined(__i586__) || defined(__i686__) || defined(__x86_64__) || defined(__alpha__) || defined(__MIPSEL__) || defined(_M_IX86) || defined(_M_X64) +#define LSB_FIRST +#define FAST_LSB_WORD_ACCESS +#else +#define MSB_FIRST +#endif + +#ifdef FAST_LSB_WORD_ACCESS +#define READ_WORD(s) (*(uint16 *) (s)) +#define READ_3WORD(s) (*(uint32 *) (s) & 0x00ffffff) +#define READ_DWORD(s) (*(uint32 *) (s)) +#define WRITE_WORD(s, d) *(uint16 *) (s) = (d) +#define WRITE_3WORD(s, d) *(uint16 *) (s) = (uint16) (d), *((uint8 *) (s) + 2) = (uint8) ((d) >> 16) +#define WRITE_DWORD(s, d) *(uint32 *) (s) = (d) +#else +#define READ_WORD(s) (*(uint8 *) (s) | (*((uint8 *) (s) + 1) << 8)) +#define READ_3WORD(s) (*(uint8 *) (s) | (*((uint8 *) (s) + 1) << 8) | (*((uint8 *) (s) + 2) << 16)) +#define READ_DWORD(s) (*(uint8 *) (s) | (*((uint8 *) (s) + 1) << 8) | (*((uint8 *) (s) + 2) << 16) | (*((uint8 *) (s) + 3) << 24)) +#define WRITE_WORD(s, d) *(uint8 *) (s) = (uint8) (d), *((uint8 *) (s) + 1) = (uint8) ((d) >> 8) +#define WRITE_3WORD(s, d) *(uint8 *) (s) = (uint8) (d), *((uint8 *) (s) + 1) = (uint8) ((d) >> 8), *((uint8 *) (s) + 2) = (uint8) ((d) >> 16) +#define WRITE_DWORD(s, d) *(uint8 *) (s) = (uint8) (d), *((uint8 *) (s) + 1) = (uint8) ((d) >> 8), *((uint8 *) (s) + 2) = (uint8) ((d) >> 16), *((uint8 *) (s) + 3) = (uint8) ((d) >> 24) +#endif + +#define SWAP_WORD(s) (s) = (((s) & 0xff) << 8) | (((s) & 0xff00) >> 8) +#define SWAP_DWORD(s) (s) = (((s) & 0xff) << 24) | (((s) & 0xff00) << 8) | (((s) & 0xff0000) >> 8) | (((s) & 0xff000000) >> 24) + +#include "pixform.h" + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/ppu.cpp b/plugins/snes9x_gx/source/snes9x/ppu.cpp new file mode 100644 index 00000000..898c6f41 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/ppu.cpp @@ -0,0 +1,2223 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#include "snes9x.h" +#include "memmap.h" +#include "dma.h" +#include "apu/apu.h" +#include "fxemu.h" +#include "sdd1.h" +#include "srtc.h" +#include "controls.h" +#include "movie.h" +#include "display.h" +#ifdef NETPLAY_SUPPORT +#include "netplay.h" +#endif +#ifdef DEBUGGER +#include "debug.h" +#include "missing.h" +#endif + +extern uint8 *HDMAMemPointers[8]; + + +static inline void S9xLatchCounters (bool force) +{ + if (force || (Memory.FillRAM[0x4213] & 0x80)) + { + // Latch h and v counters, like the gun + #ifdef DEBUGGER + missing.h_v_latch = 1; + #endif + #if 0 // #ifdef CPU_SHUTDOWN + CPU.WaitAddress = CPU.PCAtOpcodeStart; + #endif + + PPU.HVBeamCounterLatched = 1; + PPU.VBeamPosLatched = (uint16) CPU.V_Counter; + + // From byuu: + // All dots are 4 cycles long, except dots 322 and 326. dots 322 and 326 are 6 cycles long. + // This holds true for all scanlines except scanline 240 on non-interlace odd frames. + // The reason for this is because this scanline is only 1360 cycles long, + // instead of 1364 like all other scanlines. + // This makes the effective range of hscan_pos 0-339 at all times. + int32 hc = CPU.Cycles; + + if (Timings.H_Max == Timings.H_Max_Master) // 1364 + { + if (hc >= 1292) + hc -= (ONE_DOT_CYCLE / 2); + if (hc >= 1308) + hc -= (ONE_DOT_CYCLE / 2); + } + + PPU.HBeamPosLatched = (uint16) (hc / ONE_DOT_CYCLE); + + Memory.FillRAM[0x213f] |= 0x40; + } + + if (CPU.V_Counter > PPU.GunVLatch || (CPU.V_Counter == PPU.GunVLatch && CPU.Cycles >= PPU.GunHLatch * ONE_DOT_CYCLE)) + PPU.GunVLatch = 1000; +} + +static inline void S9xTryGunLatch (bool force) +{ + if (CPU.V_Counter > PPU.GunVLatch || (CPU.V_Counter == PPU.GunVLatch && CPU.Cycles >= PPU.GunHLatch * ONE_DOT_CYCLE)) + { + if (force || (Memory.FillRAM[0x4213] & 0x80)) + { + #ifdef DEBUGGER + missing.h_v_latch = 1; + #endif + #if 0 // #ifdef CPU_SHUTDOWN + CPU.WaitAddress = CPU.PCAtOpcodeStart; + #endif + + PPU.HVBeamCounterLatched = 1; + PPU.VBeamPosLatched = (uint16) PPU.GunVLatch; + PPU.HBeamPosLatched = (uint16) PPU.GunHLatch; + + Memory.FillRAM[0x213f] |= 0x40; + } + + PPU.GunVLatch = 1000; + } +} + +void S9xCheckMissingHTimerPosition (int32 hc) +{ + if (PPU.HTimerPosition == hc) + { + if (PPU.HTimerEnabled && (!PPU.VTimerEnabled || (CPU.V_Counter == PPU.VTimerPosition))) + S9xSetIRQ(PPU_IRQ_SOURCE); + else + if (PPU.VTimerEnabled && (CPU.V_Counter == PPU.VTimerPosition)) + S9xSetIRQ(PPU_IRQ_SOURCE); + } +} + +void S9xCheckMissingHTimerHalt (int32 hc_from, int32 range) +{ + if ((PPU.HTimerPosition >= hc_from) && (PPU.HTimerPosition < (hc_from + range))) + { + if (PPU.HTimerEnabled && (!PPU.VTimerEnabled || (CPU.V_Counter == PPU.VTimerPosition))) + CPU.IRQPending = 1; + else + if (PPU.VTimerEnabled && (CPU.V_Counter == PPU.VTimerPosition)) + CPU.IRQPending = 1; + } +} + +void S9xCheckMissingHTimerRange (int32 hc_from, int32 range) +{ + if ((PPU.HTimerPosition >= hc_from) && (PPU.HTimerPosition < (hc_from + range))) + { + if (PPU.HTimerEnabled && (!PPU.VTimerEnabled || (CPU.V_Counter == PPU.VTimerPosition))) + S9xSetIRQ(PPU_IRQ_SOURCE); + else + if (PPU.VTimerEnabled && (CPU.V_Counter == PPU.VTimerPosition)) + S9xSetIRQ(PPU_IRQ_SOURCE); + } +} + +void S9xUpdateHVTimerPosition (void) +{ + if (PPU.HTimerEnabled) + { + #ifdef DEBUGGER + missing.hirq_pos = PPU.IRQHBeamPos; + #endif + if (PPU.IRQHBeamPos != 0) + { + // IRQ_read + PPU.HTimerPosition = PPU.IRQHBeamPos * ONE_DOT_CYCLE; + if (Timings.H_Max == Timings.H_Max_Master) // 1364 + { + if (PPU.IRQHBeamPos > 322) + PPU.HTimerPosition += (ONE_DOT_CYCLE / 2); + if (PPU.IRQHBeamPos > 326) + PPU.HTimerPosition += (ONE_DOT_CYCLE / 2); + } + + PPU.HTimerPosition += 14; + // /IRQ + PPU.HTimerPosition += 4; + // after CPU executing + PPU.HTimerPosition += 6; + } + else + PPU.HTimerPosition = 10 + 4 + 6; + } + else + PPU.HTimerPosition = 10 + 4 + 6; + + PPU.VTimerPosition = PPU.IRQVBeamPos; + + if ((PPU.HTimerPosition >= Timings.H_Max) && (PPU.IRQHBeamPos < 340)) + { + PPU.HTimerPosition -= Timings.H_Max; + PPU.VTimerPosition++; + // FIXME + if (PPU.VTimerPosition >= Timings.V_Max) + PPU.VTimerPosition = 0; + } + + if (PPU.HTimerPosition < CPU.Cycles) + { + switch (CPU.WhichEvent) + { + case HC_IRQ_1_3_EVENT: + CPU.WhichEvent = HC_HDMA_START_EVENT; + CPU.NextEvent = Timings.HDMAStart; + break; + + case HC_IRQ_3_5_EVENT: + CPU.WhichEvent = HC_HCOUNTER_MAX_EVENT; + CPU.NextEvent = Timings.H_Max; + break; + + case HC_IRQ_5_7_EVENT: + CPU.WhichEvent = HC_HDMA_INIT_EVENT; + CPU.NextEvent = Timings.HDMAInit; + break; + + case HC_IRQ_7_9_EVENT: + CPU.WhichEvent = HC_RENDER_EVENT; + CPU.NextEvent = Timings.RenderPos; + break; + + case HC_IRQ_9_A_EVENT: + CPU.WhichEvent = HC_WRAM_REFRESH_EVENT; + CPU.NextEvent = Timings.WRAMRefreshPos; + break; + + case HC_IRQ_A_1_EVENT: + CPU.WhichEvent = HC_HBLANK_START_EVENT; + CPU.NextEvent = Timings.HBlankStart; + break; + } + } + else + if ((PPU.HTimerPosition < CPU.NextEvent) || (!(CPU.WhichEvent & 1) && (PPU.HTimerPosition == CPU.NextEvent))) + { + CPU.NextEvent = PPU.HTimerPosition; + + switch (CPU.WhichEvent) + { + case HC_HDMA_START_EVENT: + CPU.WhichEvent = HC_IRQ_1_3_EVENT; + break; + + case HC_HCOUNTER_MAX_EVENT: + CPU.WhichEvent = HC_IRQ_3_5_EVENT; + break; + + case HC_HDMA_INIT_EVENT: + CPU.WhichEvent = HC_IRQ_5_7_EVENT; + break; + + case HC_RENDER_EVENT: + CPU.WhichEvent = HC_IRQ_7_9_EVENT; + break; + + case HC_WRAM_REFRESH_EVENT: + CPU.WhichEvent = HC_IRQ_9_A_EVENT; + break; + + case HC_HBLANK_START_EVENT: + CPU.WhichEvent = HC_IRQ_A_1_EVENT; + break; + } + } + else + { + switch (CPU.WhichEvent) + { + case HC_IRQ_1_3_EVENT: + CPU.WhichEvent = HC_HDMA_START_EVENT; + CPU.NextEvent = Timings.HDMAStart; + break; + + case HC_IRQ_3_5_EVENT: + CPU.WhichEvent = HC_HCOUNTER_MAX_EVENT; + CPU.NextEvent = Timings.H_Max; + break; + + case HC_IRQ_5_7_EVENT: + CPU.WhichEvent = HC_HDMA_INIT_EVENT; + CPU.NextEvent = Timings.HDMAInit; + break; + + case HC_IRQ_7_9_EVENT: + CPU.WhichEvent = HC_RENDER_EVENT; + CPU.NextEvent = Timings.RenderPos; + break; + + case HC_IRQ_9_A_EVENT: + CPU.WhichEvent = HC_WRAM_REFRESH_EVENT; + CPU.NextEvent = Timings.WRAMRefreshPos; + break; + + case HC_IRQ_A_1_EVENT: + CPU.WhichEvent = HC_HBLANK_START_EVENT; + CPU.NextEvent = Timings.HBlankStart; + break; + } + } + +#ifdef DEBUGGER + S9xTraceFormattedMessage("--- IRQ settings: H:%d V:%d (%04d, %03d)", PPU.HTimerEnabled, PPU.VTimerEnabled, PPU.HTimerPosition, PPU.VTimerPosition); +#endif +} + +void S9xFixColourBrightness (void) +{ + IPPU.XB = mul_brightness[PPU.Brightness]; + + for (int i = 0; i < 256; i++) + { + IPPU.Red[i] = IPPU.XB[(PPU.CGDATA[i]) & 0x1f]; + IPPU.Green[i] = IPPU.XB[(PPU.CGDATA[i] >> 5) & 0x1f]; + IPPU.Blue[i] = IPPU.XB[(PPU.CGDATA[i] >> 10) & 0x1f]; + IPPU.ScreenColors[i] = BUILD_PIXEL(IPPU.Red[i], IPPU.Green[i], IPPU.Blue[i]); + } +} + +void S9xSetPPU (uint8 Byte, uint16 Address) +{ + // MAP_PPU: $2000-$3FFF + + if (CPU.InDMAorHDMA) + { + if (CPU.CurrentDMAorHDMAChannel >= 0 && DMA[CPU.CurrentDMAorHDMAChannel].ReverseTransfer) + { + // S9xSetPPU() is called to write to DMA[].AAddress + if ((Address & 0xff00) == 0x2100) + { + // Cannot access to Address Bus B ($2100-$21ff) via (H)DMA + return; + } + else + { + // 0x2000-0x3FFF is connected to Address Bus A + // SA1, SuperFX and SRTC are mapped here + // I don't bother for now... + return; + } + } + else + { + // S9xSetPPU() is called to read from $21xx + // Take care of DMA wrapping + if (Address > 0x21ff) + Address = 0x2100 + (Address & 0xff); + } + } + +#ifdef DEBUGGER + if (CPU.InHDMA) + S9xTraceFormattedMessage("--- HDMA PPU %04X -> %02X", Address, Byte); +#endif + + if ((Address & 0xffc0) == 0x2140) // APUIO0, APUIO1, APUIO2, APUIO3 + // write_port will run the APU until given clock before writing value + S9xAPUWritePort(Address & 3, Byte); + else + if (Address <= 0x2183) + { + switch (Address) + { + case 0x2100: // INIDISP + if (Byte != Memory.FillRAM[0x2100]) + { + FLUSH_REDRAW(); + + if (PPU.Brightness != (Byte & 0xf)) + { + IPPU.ColorsChanged = TRUE; + IPPU.DirectColourMapsNeedRebuild = TRUE; + PPU.Brightness = Byte & 0xf; + S9xFixColourBrightness(); + if (PPU.Brightness > IPPU.MaxBrightness) + IPPU.MaxBrightness = PPU.Brightness; + } + + if ((Memory.FillRAM[0x2100] & 0x80) != (Byte & 0x80)) + { + IPPU.ColorsChanged = TRUE; + PPU.ForcedBlanking = (Byte >> 7) & 1; + } + } + + if ((Memory.FillRAM[0x2100] & 0x80) && CPU.V_Counter == PPU.ScreenHeight + FIRST_VISIBLE_LINE) + { + PPU.OAMAddr = PPU.SavedOAMAddr; + + uint8 tmp = 0; + if (PPU.OAMPriorityRotation) + tmp = (PPU.OAMAddr & 0xfe) >> 1; + if ((PPU.OAMFlip & 1) || PPU.FirstSprite != tmp) + { + PPU.FirstSprite = tmp; + IPPU.OBJChanged = TRUE; + } + + PPU.OAMFlip = 0; + } + + break; + + case 0x2101: // OBSEL + if (Byte != Memory.FillRAM[0x2101]) + { + FLUSH_REDRAW(); + PPU.OBJNameBase = (Byte & 3) << 14; + PPU.OBJNameSelect = ((Byte >> 3) & 3) << 13; + PPU.OBJSizeSelect = (Byte >> 5) & 7; + IPPU.OBJChanged = TRUE; + } + + break; + + case 0x2102: // OAMADDL + PPU.OAMAddr = ((Memory.FillRAM[0x2103] & 1) << 8) | Byte; + PPU.OAMFlip = 2; + PPU.OAMReadFlip = 0; + PPU.SavedOAMAddr = PPU.OAMAddr; + if (PPU.OAMPriorityRotation && PPU.FirstSprite != (PPU.OAMAddr >> 1)) + { + PPU.FirstSprite = (PPU.OAMAddr & 0xfe) >> 1; + IPPU.OBJChanged = TRUE; + #ifdef DEBUGGER + missing.sprite_priority_rotation = 1; + #endif + } + + break; + + case 0x2103: // OAMADDH + PPU.OAMAddr = ((Byte & 1) << 8) | Memory.FillRAM[0x2102]; + PPU.OAMPriorityRotation = (Byte & 0x80) ? 1 : 0; + if (PPU.OAMPriorityRotation) + { + if (PPU.FirstSprite != (PPU.OAMAddr >> 1)) + { + PPU.FirstSprite = (PPU.OAMAddr & 0xfe) >> 1; + IPPU.OBJChanged = TRUE; + #ifdef DEBUGGER + missing.sprite_priority_rotation = 1; + #endif + } + } + else + { + if (PPU.FirstSprite != 0) + { + PPU.FirstSprite = 0; + IPPU.OBJChanged = TRUE; + #ifdef DEBUGGER + missing.sprite_priority_rotation = 1; + #endif + } + } + + PPU.OAMFlip = 0; + PPU.OAMReadFlip = 0; + PPU.SavedOAMAddr = PPU.OAMAddr; + + break; + + case 0x2104: // OAMDATA + REGISTER_2104(Byte); + break; + + case 0x2105: // BGMODE + if (Byte != Memory.FillRAM[0x2105]) + { + FLUSH_REDRAW(); + PPU.BG[0].BGSize = (Byte >> 4) & 1; + PPU.BG[1].BGSize = (Byte >> 5) & 1; + PPU.BG[2].BGSize = (Byte >> 6) & 1; + PPU.BG[3].BGSize = (Byte >> 7) & 1; + PPU.BGMode = Byte & 7; + // BJ: BG3Priority only takes effect if BGMode == 1 and the bit is set + PPU.BG3Priority = ((Byte & 0x0f) == 0x09); + IPPU.Interlace = Memory.FillRAM[0x2133] & 1; + #ifdef DEBUGGER + missing.modes[PPU.BGMode] = 1; + #endif + } + + break; + + case 0x2106: // MOSAIC + if (Byte != Memory.FillRAM[0x2106]) + { + FLUSH_REDRAW(); + PPU.MosaicStart = CPU.V_Counter; + if (PPU.MosaicStart > PPU.ScreenHeight) + PPU.MosaicStart = 0; + PPU.Mosaic = (Byte >> 4) + 1; + PPU.BGMosaic[0] = (Byte & 1); + PPU.BGMosaic[1] = (Byte & 2); + PPU.BGMosaic[2] = (Byte & 4); + PPU.BGMosaic[3] = (Byte & 8); + #ifdef DEBUGGER + if ((Byte & 0xf0) && (Byte & 0x0f)) + missing.mosaic = 1; + #endif + } + + break; + + case 0x2107: // BG1SC + if (Byte != Memory.FillRAM[0x2107]) + { + FLUSH_REDRAW(); + PPU.BG[0].SCSize = Byte & 3; + PPU.BG[0].SCBase = (Byte & 0x7c) << 8; + } + + break; + + case 0x2108: // BG2SC + if (Byte != Memory.FillRAM[0x2108]) + { + FLUSH_REDRAW(); + PPU.BG[1].SCSize = Byte & 3; + PPU.BG[1].SCBase = (Byte & 0x7c) << 8; + } + + break; + + case 0x2109: // BG3SC + if (Byte != Memory.FillRAM[0x2109]) + { + FLUSH_REDRAW(); + PPU.BG[2].SCSize = Byte & 3; + PPU.BG[2].SCBase = (Byte & 0x7c) << 8; + } + + break; + + case 0x210a: // BG4SC + if (Byte != Memory.FillRAM[0x210a]) + { + FLUSH_REDRAW(); + PPU.BG[3].SCSize = Byte & 3; + PPU.BG[3].SCBase = (Byte & 0x7c) << 8; + } + + break; + + case 0x210b: // BG12NBA + if (Byte != Memory.FillRAM[0x210b]) + { + FLUSH_REDRAW(); + PPU.BG[0].NameBase = (Byte & 7) << 12; + PPU.BG[1].NameBase = ((Byte >> 4) & 7) << 12; + } + + break; + + case 0x210c: // BG34NBA + if (Byte != Memory.FillRAM[0x210c]) + { + FLUSH_REDRAW(); + PPU.BG[2].NameBase = (Byte & 7) << 12; + PPU.BG[3].NameBase = ((Byte >> 4) & 7) << 12; + } + + break; + + case 0x210d: // BG1HOFS, M7HOFS + PPU.BG[0].HOffset = (Byte << 8) | (PPU.BGnxOFSbyte & ~7) | ((PPU.BG[0].HOffset >> 8) & 7); + PPU.M7HOFS = (Byte << 8) | PPU.M7byte; + PPU.BGnxOFSbyte = Byte; + PPU.M7byte = Byte; + break; + + case 0x210e: // BG1VOFS, M7VOFS + PPU.BG[0].VOffset = (Byte << 8) | PPU.BGnxOFSbyte; + PPU.M7VOFS = (Byte << 8) | PPU.M7byte; + PPU.BGnxOFSbyte = Byte; + PPU.M7byte = Byte; + break; + + case 0x210f: // BG2HOFS + PPU.BG[1].HOffset = (Byte << 8) | (PPU.BGnxOFSbyte & ~7) | ((PPU.BG[1].HOffset >> 8) & 7); + PPU.BGnxOFSbyte = Byte; + break; + + case 0x2110: // BG2VOFS + PPU.BG[1].VOffset = (Byte << 8) | PPU.BGnxOFSbyte; + PPU.BGnxOFSbyte = Byte; + break; + + case 0x2111: // BG3HOFS + PPU.BG[2].HOffset = (Byte << 8) | (PPU.BGnxOFSbyte & ~7) | ((PPU.BG[2].HOffset >> 8) & 7); + PPU.BGnxOFSbyte = Byte; + break; + + case 0x2112: // BG3VOFS + PPU.BG[2].VOffset = (Byte << 8) | PPU.BGnxOFSbyte; + PPU.BGnxOFSbyte = Byte; + break; + + case 0x2113: // BG4HOFS + PPU.BG[3].HOffset = (Byte << 8) | (PPU.BGnxOFSbyte & ~7) | ((PPU.BG[3].HOffset >> 8) & 7); + PPU.BGnxOFSbyte = Byte; + break; + + case 0x2114: // BG4VOFS + PPU.BG[3].VOffset = (Byte << 8) | PPU.BGnxOFSbyte; + PPU.BGnxOFSbyte = Byte; + break; + + case 0x2115: // VMAIN + PPU.VMA.High = (Byte & 0x80) == 0 ? FALSE : TRUE; + switch (Byte & 3) + { + case 0: PPU.VMA.Increment = 1; break; + case 1: PPU.VMA.Increment = 32; break; + case 2: PPU.VMA.Increment = 128; break; + case 3: PPU.VMA.Increment = 128; break; + } + + if (Byte & 0x0c) + { + static uint16 Shift[4] = { 0, 5, 6, 7 }; + static uint16 IncCount[4] = { 0, 32, 64, 128 }; + + uint8 i = (Byte & 0x0c) >> 2; + PPU.VMA.FullGraphicCount = IncCount[i]; + PPU.VMA.Mask1 = IncCount[i] * 8 - 1; + PPU.VMA.Shift = Shift[i]; + #ifdef DEBUGGER + missing.vram_full_graphic_inc = (Byte & 0x0c) >> 2; + #endif + } + else + PPU.VMA.FullGraphicCount = 0; + #ifdef DEBUGGER + if (Byte & 3) + missing.vram_inc = Byte & 3; + #endif + break; + + case 0x2116: // VMADDL + PPU.VMA.Address &= 0xff00; + PPU.VMA.Address |= Byte; + #ifdef CORRECT_VRAM_READS + if (PPU.VMA.FullGraphicCount) + { + uint32 addr = PPU.VMA.Address; + uint32 rem = addr & PPU.VMA.Mask1; + uint32 address = (addr & ~PPU.VMA.Mask1) + (rem >> PPU.VMA.Shift) + ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3); + IPPU.VRAMReadBuffer = READ_WORD(Memory.VRAM + ((address << 1) & 0xffff)); + } + else + IPPU.VRAMReadBuffer = READ_WORD(Memory.VRAM + ((PPU.VMA.Address << 1) & 0xffff)); + #else + IPPU.FirstVRAMRead = TRUE; + #endif + break; + + case 0x2117: // VMADDH + PPU.VMA.Address &= 0x00ff; + PPU.VMA.Address |= Byte << 8; + #ifdef CORRECT_VRAM_READS + if (PPU.VMA.FullGraphicCount) + { + uint32 addr = PPU.VMA.Address; + uint32 rem = addr & PPU.VMA.Mask1; + uint32 address = (addr & ~PPU.VMA.Mask1) + (rem >> PPU.VMA.Shift) + ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3); + IPPU.VRAMReadBuffer = READ_WORD(Memory.VRAM + ((address << 1) & 0xffff)); + } + else + IPPU.VRAMReadBuffer = READ_WORD(Memory.VRAM + ((PPU.VMA.Address << 1) & 0xffff)); + #else + IPPU.FirstVRAMRead = TRUE; + #endif + break; + + case 0x2118: // VMDATAL + #ifndef CORRECT_VRAM_READS + IPPU.FirstVRAMRead = TRUE; + #endif + REGISTER_2118(Byte); + break; + + case 0x2119: // VMDATAH + #ifndef CORRECT_VRAM_READS + IPPU.FirstVRAMRead = TRUE; + #endif + REGISTER_2119(Byte); + break; + + case 0x211a: // M7SEL + if (Byte != Memory.FillRAM[0x211a]) + { + FLUSH_REDRAW(); + PPU.Mode7Repeat = Byte >> 6; + if (PPU.Mode7Repeat == 1) + PPU.Mode7Repeat = 0; + PPU.Mode7VFlip = (Byte & 2) >> 1; + PPU.Mode7HFlip = Byte & 1; + } + + break; + + case 0x211b: // M7A + PPU.MatrixA = PPU.M7byte | (Byte << 8); + PPU.Need16x8Mulitply = TRUE; + PPU.M7byte = Byte; + break; + + case 0x211c: // M7B + PPU.MatrixB = PPU.M7byte | (Byte << 8); + PPU.Need16x8Mulitply = TRUE; + PPU.M7byte = Byte; + break; + + case 0x211d: // M7C + PPU.MatrixC = PPU.M7byte | (Byte << 8); + PPU.M7byte = Byte; + break; + + case 0x211e: // M7D + PPU.MatrixD = PPU.M7byte | (Byte << 8); + PPU.M7byte = Byte; + break; + + case 0x211f: // M7X + PPU.CentreX = PPU.M7byte | (Byte << 8); + PPU.M7byte = Byte; + break; + + case 0x2120: // M7Y + PPU.CentreY = PPU.M7byte | (Byte << 8); + PPU.M7byte = Byte; + break; + + case 0x2121: // CGADD + PPU.CGFLIP = 0; + PPU.CGFLIPRead = 0; + PPU.CGADD = Byte; + break; + + case 0x2122: // CGDATA + REGISTER_2122(Byte); + break; + + case 0x2123: // W12SEL + if (Byte != Memory.FillRAM[0x2123]) + { + FLUSH_REDRAW(); + PPU.ClipWindow1Enable[0] = !!(Byte & 0x02); + PPU.ClipWindow1Enable[1] = !!(Byte & 0x20); + PPU.ClipWindow2Enable[0] = !!(Byte & 0x08); + PPU.ClipWindow2Enable[1] = !!(Byte & 0x80); + PPU.ClipWindow1Inside[0] = !(Byte & 0x01); + PPU.ClipWindow1Inside[1] = !(Byte & 0x10); + PPU.ClipWindow2Inside[0] = !(Byte & 0x04); + PPU.ClipWindow2Inside[1] = !(Byte & 0x40); + PPU.RecomputeClipWindows = TRUE; + #ifdef DEBUGGER + if (Byte & 0x80) + missing.window2[1] = 1; + if (Byte & 0x20) + missing.window1[1] = 1; + if (Byte & 0x08) + missing.window2[0] = 1; + if (Byte & 0x02) + missing.window1[0] = 1; + #endif + } + + break; + + case 0x2124: // W34SEL + if (Byte != Memory.FillRAM[0x2124]) + { + FLUSH_REDRAW(); + PPU.ClipWindow1Enable[2] = !!(Byte & 0x02); + PPU.ClipWindow1Enable[3] = !!(Byte & 0x20); + PPU.ClipWindow2Enable[2] = !!(Byte & 0x08); + PPU.ClipWindow2Enable[3] = !!(Byte & 0x80); + PPU.ClipWindow1Inside[2] = !(Byte & 0x01); + PPU.ClipWindow1Inside[3] = !(Byte & 0x10); + PPU.ClipWindow2Inside[2] = !(Byte & 0x04); + PPU.ClipWindow2Inside[3] = !(Byte & 0x40); + PPU.RecomputeClipWindows = TRUE; + #ifdef DEBUGGER + if (Byte & 0x80) + missing.window2[3] = 1; + if (Byte & 0x20) + missing.window1[3] = 1; + if (Byte & 0x08) + missing.window2[2] = 1; + if (Byte & 0x02) + missing.window1[2] = 1; + #endif + } + + break; + + case 0x2125: // WOBJSEL + if (Byte != Memory.FillRAM[0x2125]) + { + FLUSH_REDRAW(); + PPU.ClipWindow1Enable[4] = !!(Byte & 0x02); + PPU.ClipWindow1Enable[5] = !!(Byte & 0x20); + PPU.ClipWindow2Enable[4] = !!(Byte & 0x08); + PPU.ClipWindow2Enable[5] = !!(Byte & 0x80); + PPU.ClipWindow1Inside[4] = !(Byte & 0x01); + PPU.ClipWindow1Inside[5] = !(Byte & 0x10); + PPU.ClipWindow2Inside[4] = !(Byte & 0x04); + PPU.ClipWindow2Inside[5] = !(Byte & 0x40); + PPU.RecomputeClipWindows = TRUE; + #ifdef DEBUGGER + if (Byte & 0x80) + missing.window2[5] = 1; + if (Byte & 0x20) + missing.window1[5] = 1; + if (Byte & 0x08) + missing.window2[4] = 1; + if (Byte & 0x02) + missing.window1[4] = 1; + #endif + } + + break; + + case 0x2126: // WH0 + if (Byte != Memory.FillRAM[0x2126]) + { + FLUSH_REDRAW(); + PPU.Window1Left = Byte; + PPU.RecomputeClipWindows = TRUE; + } + + break; + + case 0x2127: // WH1 + if (Byte != Memory.FillRAM[0x2127]) + { + FLUSH_REDRAW(); + PPU.Window1Right = Byte; + PPU.RecomputeClipWindows = TRUE; + } + + break; + + case 0x2128: // WH2 + if (Byte != Memory.FillRAM[0x2128]) + { + FLUSH_REDRAW(); + PPU.Window2Left = Byte; + PPU.RecomputeClipWindows = TRUE; + } + + break; + + case 0x2129: // WH3 + if (Byte != Memory.FillRAM[0x2129]) + { + FLUSH_REDRAW(); + PPU.Window2Right = Byte; + PPU.RecomputeClipWindows = TRUE; + } + + break; + + case 0x212a: // WBGLOG + if (Byte != Memory.FillRAM[0x212a]) + { + FLUSH_REDRAW(); + PPU.ClipWindowOverlapLogic[0] = (Byte & 0x03); + PPU.ClipWindowOverlapLogic[1] = (Byte & 0x0c) >> 2; + PPU.ClipWindowOverlapLogic[2] = (Byte & 0x30) >> 4; + PPU.ClipWindowOverlapLogic[3] = (Byte & 0xc0) >> 6; + PPU.RecomputeClipWindows = TRUE; + } + + break; + + case 0x212b: // WOBJLOG + if (Byte != Memory.FillRAM[0x212b]) + { + FLUSH_REDRAW(); + PPU.ClipWindowOverlapLogic[4] = (Byte & 0x03); + PPU.ClipWindowOverlapLogic[5] = (Byte & 0x0c) >> 2; + PPU.RecomputeClipWindows = TRUE; + } + + break; + + case 0x212c: // TM + if (Byte != Memory.FillRAM[0x212c]) + { + FLUSH_REDRAW(); + PPU.RecomputeClipWindows = TRUE; + } + + break; + + case 0x212d: // TS + if (Byte != Memory.FillRAM[0x212d]) + { + FLUSH_REDRAW(); + PPU.RecomputeClipWindows = TRUE; + #ifdef DEBUGGER + if (Byte & 0x1f) + missing.subscreen = 1; + #endif + } + + break; + + case 0x212e: // TMW + if (Byte != Memory.FillRAM[0x212e]) + { + FLUSH_REDRAW(); + PPU.RecomputeClipWindows = TRUE; + } + + break; + + case 0x212f: // TSW + if (Byte != Memory.FillRAM[0x212f]) + { + FLUSH_REDRAW(); + PPU.RecomputeClipWindows = TRUE; + } + + break; + + case 0x2130: // CGWSEL + if (Byte != Memory.FillRAM[0x2130]) + { + FLUSH_REDRAW(); + PPU.RecomputeClipWindows = TRUE; + #ifdef DEBUGGER + if ((Byte & 1) && (PPU.BGMode == 3 || PPU.BGMode == 4 || PPU.BGMode == 7)) + missing.direct = 1; + #endif + } + + break; + + case 0x2131: // CGADSUB + if (Byte != Memory.FillRAM[0x2131]) + { + FLUSH_REDRAW(); + #ifdef DEBUGGER + if (Byte & 0x80) + { + if (Memory.FillRAM[0x2130] & 0x02) + missing.subscreen_sub = 1; + else + missing.fixed_colour_sub = 1; + } + else + { + if (Memory.FillRAM[0x2130] & 0x02) + missing.subscreen_add = 1; + else + missing.fixed_colour_add = 1; + } + #endif + } + + break; + + case 0x2132: // COLDATA + if (Byte != Memory.FillRAM[0x2132]) + { + FLUSH_REDRAW(); + if (Byte & 0x80) + PPU.FixedColourBlue = Byte & 0x1f; + if (Byte & 0x40) + PPU.FixedColourGreen = Byte & 0x1f; + if (Byte & 0x20) + PPU.FixedColourRed = Byte & 0x1f; + } + + break; + + case 0x2133: // SETINI + if (Byte != Memory.FillRAM[0x2133]) + { + if ((Memory.FillRAM[0x2133] ^ Byte) & 8) + { + FLUSH_REDRAW(); + IPPU.PseudoHires = Byte & 8; + } + + if (Byte & 0x04) + { + PPU.ScreenHeight = SNES_HEIGHT_EXTENDED; + if (IPPU.DoubleHeightPixels) + IPPU.RenderedScreenHeight = PPU.ScreenHeight << 1; + else + IPPU.RenderedScreenHeight = PPU.ScreenHeight; + #ifdef DEBUGGER + missing.lines_239 = 1; + #endif + } + else + PPU.ScreenHeight = SNES_HEIGHT; + + if ((Memory.FillRAM[0x2133] ^ Byte) & 3) + { + FLUSH_REDRAW(); + if ((Memory.FillRAM[0x2133] ^ Byte) & 2) + IPPU.OBJChanged = TRUE; + IPPU.Interlace = Byte & 1; + IPPU.InterlaceOBJ = Byte & 2; + } + #ifdef DEBUGGER + if (Byte & 0x40) + missing.mode7_bgmode = 1; + if (Byte & 0x08) + missing.pseudo_512 = 1; + if (Byte & 0x02) + missing.sprite_double_height = 1; + if (Byte & 0x01) + missing.interlace = 1; + #endif + } + + break; + + case 0x2134: // MPYL + case 0x2135: // MPYM + case 0x2136: // MPYH + case 0x2137: // SLHV + case 0x2138: // OAMDATAREAD + case 0x2139: // VMDATALREAD + case 0x213a: // VMDATAHREAD + case 0x213b: // CGDATAREAD + case 0x213c: // OPHCT + case 0x213d: // OPVCT + case 0x213e: // STAT77 + case 0x213f: // STAT78 + return; + + case 0x2180: // WMDATA + if (!CPU.InWRAMDMAorHDMA) + REGISTER_2180(Byte); + break; + + case 0x2181: // WMADDL + if (!CPU.InWRAMDMAorHDMA) + { + PPU.WRAM &= 0x1ff00; + PPU.WRAM |= Byte; + } + + break; + + case 0x2182: // WMADDM + if (!CPU.InWRAMDMAorHDMA) + { + PPU.WRAM &= 0x100ff; + PPU.WRAM |= Byte << 8; + } + + break; + + case 0x2183: // WMADDH + if (!CPU.InWRAMDMAorHDMA) + { + PPU.WRAM &= 0x0ffff; + PPU.WRAM |= Byte << 16; + PPU.WRAM &= 0x1ffff; + } + + break; + } + } + else + { + if (Settings.SuperFX && Address >= 0x3000 && Address <= 0x32ff) + { + S9xSetSuperFX(Byte, Address); + return; + } + else + if (Settings.SA1 && Address >= 0x2200) + { + if (Address <= 0x23ff) + S9xSetSA1(Byte, Address); + else + Memory.FillRAM[Address] = Byte; + return; + } + else + if (Settings.BS && Address >= 0x2188 && Address <= 0x219f) + S9xSetBSXPPU(Byte, Address); + else + if (Settings.SRTC && Address == 0x2801) + S9xSetSRTC(Byte, Address); + #ifdef DEBUGGER + else + { + missing.unknownppu_write = Address; + if (Settings.TraceUnknownRegisters) + { + sprintf(String, "Unknown register write: $%02X->$%04X\n", Byte, Address); + S9xMessage(S9X_TRACE, S9X_PPU_TRACE, String); + } + } + #endif + } + + Memory.FillRAM[Address] = Byte; +} + +uint8 S9xGetPPU (uint16 Address) +{ + // MAP_PPU: $2000-$3FFF + + if (Address < 0x2100) + return (OpenBus); + + if (CPU.InDMAorHDMA) + { + if (CPU.CurrentDMAorHDMAChannel >= 0 && !DMA[CPU.CurrentDMAorHDMAChannel].ReverseTransfer) + { + // S9xGetPPU() is called to read from DMA[].AAddress + if ((Address & 0xff00) == 0x2100) + // Cannot access to Address Bus B ($2100-$21FF) via (H)DMA + return (OpenBus); + else + // $2200-$3FFF are connected to Address Bus A + // SA1, SuperFX and SRTC are mapped here + // I don't bother for now... + return (OpenBus); + } + else + { + // S9xGetPPU() is called to write to $21xx + // Take care of DMA wrapping + if (Address > 0x21ff) + Address = 0x2100 + (Address & 0xff); + } + } + + if ((Address & 0xffc0) == 0x2140) // APUIO0, APUIO1, APUIO2, APUIO3 + // read_port will run the APU until given APU time before reading value + return (S9xAPUReadPort(Address & 3)); + else + if (Address <= 0x2183) + { + uint8 byte; + + switch (Address) + { + case 0x2104: // OAMDATA + case 0x2105: // BGMODE + case 0x2106: // MOSAIC + case 0x2108: // BG2SC + case 0x2109: // BG3SC + case 0x210a: // BG4SC + case 0x2114: // BG4VOFS + case 0x2115: // VMAIN + case 0x2116: // VMADDL + case 0x2118: // VMDATAL + case 0x2119: // VMDATAH + case 0x211a: // M7SEL + case 0x2124: // W34SEL + case 0x2125: // WOBJSEL + case 0x2126: // WH0 + case 0x2128: // WH2 + case 0x2129: // WH3 + case 0x212a: // WBGLOG + return (PPU.OpenBus1); + + case 0x2134: // MPYL + case 0x2135: // MPYM + case 0x2136: // MPYH + if (PPU.Need16x8Mulitply) + { + int32 r = (int32) PPU.MatrixA * (int32) (PPU.MatrixB >> 8); + Memory.FillRAM[0x2134] = (uint8) r; + Memory.FillRAM[0x2135] = (uint8) (r >> 8); + Memory.FillRAM[0x2136] = (uint8) (r >> 16); + PPU.Need16x8Mulitply = FALSE; + } + #ifdef DEBUGGER + missing.matrix_multiply = 1; + #endif + return (PPU.OpenBus1 = Memory.FillRAM[Address]); + + case 0x2137: // SLHV + S9xLatchCounters(0); + return (OpenBus); + + case 0x2138: // OAMDATAREAD + if (PPU.OAMAddr & 0x100) + { + if (!(PPU.OAMFlip & 1)) + byte = PPU.OAMData[(PPU.OAMAddr & 0x10f) << 1]; + else + { + byte = PPU.OAMData[((PPU.OAMAddr & 0x10f) << 1) + 1]; + PPU.OAMAddr = (PPU.OAMAddr + 1) & 0x1ff; + if (PPU.OAMPriorityRotation && PPU.FirstSprite != (PPU.OAMAddr >> 1)) + { + PPU.FirstSprite = (PPU.OAMAddr & 0xfe) >> 1; + IPPU.OBJChanged = TRUE; + #ifdef DEBUGGER + missing.sprite_priority_rotation = 1; + #endif + } + } + } + else + { + if (!(PPU.OAMFlip & 1)) + byte = PPU.OAMData[PPU.OAMAddr << 1]; + else + { + byte = PPU.OAMData[(PPU.OAMAddr << 1) + 1]; + ++PPU.OAMAddr; + if (PPU.OAMPriorityRotation && PPU.FirstSprite != (PPU.OAMAddr >> 1)) + { + PPU.FirstSprite = (PPU.OAMAddr & 0xfe) >> 1; + IPPU.OBJChanged = TRUE; + #ifdef DEBUGGER + missing.sprite_priority_rotation = 1; + #endif + } + } + } + + PPU.OAMFlip ^= 1; + #ifdef DEBUGGER + missing.oam_read = 1; + #endif + return (PPU.OpenBus1 = byte); + + case 0x2139: // VMDATALREAD + #ifdef CORRECT_VRAM_READS + byte = IPPU.VRAMReadBuffer & 0xff; + if (!PPU.VMA.High) + { + if (PPU.VMA.FullGraphicCount) + { + uint32 addr = PPU.VMA.Address; + uint32 rem = addr & PPU.VMA.Mask1; + uint32 address = (addr & ~PPU.VMA.Mask1) + (rem >> PPU.VMA.Shift) + ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3); + IPPU.VRAMReadBuffer = READ_WORD(Memory.VRAM + ((address << 1) & 0xffff)); + } + else + IPPU.VRAMReadBuffer = READ_WORD(Memory.VRAM + ((PPU.VMA.Address << 1) & 0xffff)); + + PPU.VMA.Address += PPU.VMA.Increment; + } + #else + if (IPPU.FirstVRAMRead) + byte = Memory.VRAM[(PPU.VMA.Address << 1) & 0xffff]; + else + if (PPU.VMA.FullGraphicCount) + { + uint32 addr = PPU.VMA.Address - 1; + uint32 rem = addr & PPU.VMA.Mask1; + uint32 address = (addr & ~PPU.VMA.Mask1) + (rem >> PPU.VMA.Shift) + ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3); + byte = Memory.VRAM[((address << 1) - 2) & 0xffff]; + } + else + byte = Memory.VRAM[((PPU.VMA.Address << 1) - 2) & 0xffff]; + + if (!PPU.VMA.High) + { + PPU.VMA.Address += PPU.VMA.Increment; + IPPU.FirstVRAMRead = FALSE; + } + #endif + #ifdef DEBUGGER + missing.vram_read = 1; + #endif + return (PPU.OpenBus1 = byte); + + case 0x213a: // VMDATAHREAD + #ifdef CORRECT_VRAM_READS + byte = (IPPU.VRAMReadBuffer >> 8) & 0xff; + if (PPU.VMA.High) + { + if (PPU.VMA.FullGraphicCount) + { + uint32 addr = PPU.VMA.Address; + uint32 rem = addr & PPU.VMA.Mask1; + uint32 address = (addr & ~PPU.VMA.Mask1) + (rem >> PPU.VMA.Shift) + ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3); + IPPU.VRAMReadBuffer = READ_WORD(Memory.VRAM + ((address << 1) & 0xffff)); + } + else + IPPU.VRAMReadBuffer = READ_WORD(Memory.VRAM + ((PPU.VMA.Address << 1) & 0xffff)); + + PPU.VMA.Address += PPU.VMA.Increment; + } + #else + if (IPPU.FirstVRAMRead) + byte = Memory.VRAM[((PPU.VMA.Address << 1) + 1) & 0xffff]; + else + if (PPU.VMA.FullGraphicCount) + { + uint32 addr = PPU.VMA.Address - 1; + uint32 rem = addr & PPU.VMA.Mask1; + uint32 address = (addr & ~PPU.VMA.Mask1) + (rem >> PPU.VMA.Shift) + ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3); + byte = Memory.VRAM[((address << 1) - 1) & 0xffff]; + } + else + byte = Memory.VRAM[((PPU.VMA.Address << 1) - 1) & 0xffff]; + + if (PPU.VMA.High) + { + PPU.VMA.Address += PPU.VMA.Increment; + IPPU.FirstVRAMRead = FALSE; + } + #endif + #ifdef DEBUGGER + missing.vram_read = 1; + #endif + return (PPU.OpenBus1 = byte); + + case 0x213b: // CGDATAREAD + if (PPU.CGFLIPRead) + byte = (PPU.OpenBus2 & 0x80) | ((PPU.CGDATA[PPU.CGADD++] >> 8) & 0x7f); + else + byte = PPU.CGDATA[PPU.CGADD] & 0xff; + PPU.CGFLIPRead ^= 1; + #ifdef DEBUGGER + missing.cgram_read = 1; + #endif + return (PPU.OpenBus2 = byte); + + case 0x213c: // OPHCT + S9xTryGunLatch(false); + if (PPU.HBeamFlip) + byte = (PPU.OpenBus2 & 0xfe) | ((PPU.HBeamPosLatched >> 8) & 0x01); + else + byte = (uint8) PPU.HBeamPosLatched; + PPU.HBeamFlip ^= 1; + #ifdef DEBUGGER + missing.h_counter_read = 1; + #endif + return (PPU.OpenBus2 = byte); + + case 0x213d: // OPVCT + S9xTryGunLatch(false); + if (PPU.VBeamFlip) + byte = (PPU.OpenBus2 & 0xfe) | ((PPU.VBeamPosLatched >> 8) & 0x01); + else + byte = (uint8) PPU.VBeamPosLatched; + PPU.VBeamFlip ^= 1; + #ifdef DEBUGGER + missing.v_counter_read = 1; + #endif + return (PPU.OpenBus2 = byte); + + case 0x213e: // STAT77 + FLUSH_REDRAW(); + byte = (PPU.OpenBus1 & 0x10) | PPU.RangeTimeOver | Model->_5C77; + return (PPU.OpenBus1 = byte); + + case 0x213f: // STAT78 + S9xTryGunLatch(false); + PPU.VBeamFlip = PPU.HBeamFlip = 0; + byte = (PPU.OpenBus2 & 0x20) | (Memory.FillRAM[0x213f] & 0xc0) | (Settings.PAL ? 0x10 : 0) | Model->_5C78; + Memory.FillRAM[0x213f] &= ~0x40; + return (PPU.OpenBus2 = byte); + + case 0x2180: // WMDATA + if (!CPU.InWRAMDMAorHDMA) + { + byte = Memory.RAM[PPU.WRAM++]; + PPU.WRAM &= 0x1ffff; + } + else + byte = OpenBus; + #ifdef DEBUGGER + missing.wram_read = 1; + #endif + return (byte); + + default: + return (OpenBus); + } + } + else + { + if (Settings.SuperFX && Address >= 0x3000 && Address <= 0x32ff) + return (S9xGetSuperFX(Address)); + else + if (Settings.SA1 && Address >= 0x2200) + return (S9xGetSA1(Address)); + else + if (Settings.BS && Address >= 0x2188 && Address <= 0x219f) + return (S9xGetBSXPPU(Address)); + else + if (Settings.SRTC && Address == 0x2800) + return (S9xGetSRTC(Address)); + else + switch (Address) + { + case 0x21c2: + if (Model->_5C77 == 2) + return (0x20); + return (OpenBus); + + case 0x21c3: + if (Model->_5C77 == 2) + return (0); + return (OpenBus); + + default: + return (OpenBus); + } + } +} + +void S9xSetCPU (uint8 Byte, uint16 Address) +{ + if (Address < 0x4200) + { + switch (Address) + { + case 0x4016: // JOYSER0 + S9xSetJoypadLatch(Byte & 1); + break; + + case 0x4017: // JOYSER1 + return; + + default: + break; + } + } + else + if ((Address & 0xff80) == 0x4300) + { + if (CPU.InDMAorHDMA) + return; + + int d = (Address >> 4) & 0x7; + + switch (Address & 0xf) + { + case 0x0: // 0x43x0: DMAPx + DMA[d].ReverseTransfer = (Byte & 0x80) ? TRUE : FALSE; + DMA[d].HDMAIndirectAddressing = (Byte & 0x40) ? TRUE : FALSE; + DMA[d].UnusedBit43x0 = (Byte & 0x20) ? TRUE : FALSE; + DMA[d].AAddressDecrement = (Byte & 0x10) ? TRUE : FALSE; + DMA[d].AAddressFixed = (Byte & 0x08) ? TRUE : FALSE; + DMA[d].TransferMode = (Byte & 7); + return; + + case 0x1: // 0x43x1: BBADx + DMA[d].BAddress = Byte; + return; + + case 0x2: // 0x43x2: A1TxL + DMA[d].AAddress &= 0xff00; + DMA[d].AAddress |= Byte; + return; + + case 0x3: // 0x43x3: A1TxH + DMA[d].AAddress &= 0xff; + DMA[d].AAddress |= Byte << 8; + return; + + case 0x4: // 0x43x4: A1Bx + DMA[d].ABank = Byte; + HDMAMemPointers[d] = NULL; + return; + + case 0x5: // 0x43x5: DASxL + DMA[d].DMACount_Or_HDMAIndirectAddress &= 0xff00; + DMA[d].DMACount_Or_HDMAIndirectAddress |= Byte; + HDMAMemPointers[d] = NULL; + return; + + case 0x6: // 0x43x6: DASxH + DMA[d].DMACount_Or_HDMAIndirectAddress &= 0xff; + DMA[d].DMACount_Or_HDMAIndirectAddress |= Byte << 8; + HDMAMemPointers[d] = NULL; + return; + + case 0x7: // 0x43x7: DASBx + DMA[d].IndirectBank = Byte; + HDMAMemPointers[d] = NULL; + return; + + case 0x8: // 0x43x8: A2AxL + DMA[d].Address &= 0xff00; + DMA[d].Address |= Byte; + HDMAMemPointers[d] = NULL; + return; + + case 0x9: // 0x43x9: A2AxH + DMA[d].Address &= 0xff; + DMA[d].Address |= Byte << 8; + HDMAMemPointers[d] = NULL; + return; + + case 0xa: // 0x43xa: NLTRx + if (Byte & 0x7f) + { + DMA[d].LineCount = Byte & 0x7f; + DMA[d].Repeat = !(Byte & 0x80); + } + else + { + DMA[d].LineCount = 128; + DMA[d].Repeat = !!(Byte & 0x80); + } + + return; + + case 0xb: // 0x43xb: ????x + case 0xf: // 0x43xf: mirror of 0x43xb + DMA[d].UnknownByte = Byte; + return; + + default: + break; + } + } + else + { + uint16 pos; + + switch (Address) + { + case 0x4200: // NMITIMEN + if (Byte & 0x20) + { + PPU.VTimerEnabled = TRUE; + #ifdef DEBUGGER + missing.virq = 1; + missing.virq_pos = PPU.IRQVBeamPos; + #endif + } + else + PPU.VTimerEnabled = FALSE; + + if (Byte & 0x10) + { + PPU.HTimerEnabled = TRUE; + #ifdef DEBUGGER + missing.hirq = 1; + missing.hirq_pos = PPU.IRQHBeamPos; + #endif + } + else + PPU.HTimerEnabled = FALSE; + + S9xUpdateHVTimerPosition(); + + // The case that IRQ will trigger in an instruction such as STA $4200. + // FIXME: not true but good enough for Snes9x, I think. + S9xCheckMissingHTimerRange(CPU.PrevCycles, CPU.Cycles - CPU.PrevCycles); + + if (!(Byte & 0x30)) + S9xClearIRQ(PPU_IRQ_SOURCE); + + // NMI can trigger immediately during VBlank as long as NMI_read ($4210) wasn't cleard. + if ((Byte & 0x80) && !(Memory.FillRAM[0x4200] & 0x80) && + (CPU.V_Counter >= PPU.ScreenHeight + FIRST_VISIBLE_LINE) && (Memory.FillRAM[0x4210] & 0x80)) + { + // FIXME: triggered at HC+=6, checked just before the final CPU cycle, + // then, when to call S9xOpcode_NMI()? + CPU.Flags |= NMI_FLAG; + Timings.NMITriggerPos = CPU.Cycles + 6 + 6; + } + + break; + + case 0x4201: // WRIO + if ((Byte & 0x80) == 0 && (Memory.FillRAM[0x4213] & 0x80) == 0x80) + S9xLatchCounters(1); + else + S9xTryGunLatch((Byte & 0x80) ? true : false); + Memory.FillRAM[0x4201] = Memory.FillRAM[0x4213] = Byte; + break; + + case 0x4202: // WRMPYA + break; + + case 0x4203: // WRMPYB + { + uint32 res = Memory.FillRAM[0x4202] * Byte; + // FIXME: The update occurs 8 machine cycles after $4203 is set. + Memory.FillRAM[0x4216] = (uint8) res; + Memory.FillRAM[0x4217] = (uint8) (res >> 8); + break; + } + + case 0x4204: // WRDIVL + case 0x4205: // WRDIVH + break; + + case 0x4206: // WRDIVB + { + uint16 a = Memory.FillRAM[0x4204] + (Memory.FillRAM[0x4205] << 8); + uint16 div = Byte ? a / Byte : 0xffff; + uint16 rem = Byte ? a % Byte : a; + // FIXME: The update occurs 16 machine cycles after $4206 is set. + Memory.FillRAM[0x4214] = (uint8) div; + Memory.FillRAM[0x4215] = div >> 8; + Memory.FillRAM[0x4216] = (uint8) rem; + Memory.FillRAM[0x4217] = rem >> 8; + break; + } + + case 0x4207: // HTIMEL + pos = PPU.IRQHBeamPos; + PPU.IRQHBeamPos = (PPU.IRQHBeamPos & 0xff00) | Byte; + if (PPU.IRQHBeamPos != pos) + S9xUpdateHVTimerPosition(); + #ifdef DEBUGGER + missing.hirq_pos = PPU.IRQHBeamPos; + #endif + break; + + case 0x4208: // HTIMEH + pos = PPU.IRQHBeamPos; + PPU.IRQHBeamPos = (PPU.IRQHBeamPos & 0xff) | ((Byte & 1) << 8); + if (PPU.IRQHBeamPos != pos) + S9xUpdateHVTimerPosition(); + #ifdef DEBUGGER + missing.hirq_pos = PPU.IRQHBeamPos; + #endif + break; + + case 0x4209: // VTIMEL + pos = PPU.IRQVBeamPos; + PPU.IRQVBeamPos = (PPU.IRQVBeamPos & 0xff00) | Byte; + if (PPU.IRQVBeamPos != pos) + S9xUpdateHVTimerPosition(); + #ifdef DEBUGGER + missing.virq_pos = PPU.IRQVBeamPos; + #endif + break; + + case 0x420a: // VTIMEH + pos = PPU.IRQVBeamPos; + PPU.IRQVBeamPos = (PPU.IRQVBeamPos & 0xff) | ((Byte & 1) << 8); + if (PPU.IRQVBeamPos != pos) + S9xUpdateHVTimerPosition(); + #ifdef DEBUGGER + missing.virq_pos = PPU.IRQVBeamPos; + #endif + break; + + case 0x420b: // MDMAEN + if (CPU.InDMAorHDMA) + return; + // XXX: Not quite right... + if (Byte) + CPU.Cycles += Timings.DMACPUSync; + if (Byte & 0x01) + S9xDoDMA(0); + if (Byte & 0x02) + S9xDoDMA(1); + if (Byte & 0x04) + S9xDoDMA(2); + if (Byte & 0x08) + S9xDoDMA(3); + if (Byte & 0x10) + S9xDoDMA(4); + if (Byte & 0x20) + S9xDoDMA(5); + if (Byte & 0x40) + S9xDoDMA(6); + if (Byte & 0x80) + S9xDoDMA(7); + #ifdef DEBUGGER + missing.dma_this_frame = Byte; + missing.dma_channels = Byte; + #endif + break; + + case 0x420c: // HDMAEN + if (CPU.InDMAorHDMA) + return; + if (Settings.DisableHDMA) + Byte = 0; + Memory.FillRAM[0x420c] = Byte; + // Yoshi's Island, Genjyu Ryodan, Mortal Kombat, Tales of Phantasia + PPU.HDMA = Byte & ~PPU.HDMAEnded; + #ifdef DEBUGGER + missing.hdma_this_frame |= Byte; + missing.hdma_channels |= Byte; + #endif + break; + + case 0x420d: // MEMSEL + if ((Byte & 1) != (Memory.FillRAM[0x420d] & 1)) + { + if (Byte & 1) + { + CPU.FastROMSpeed = ONE_CYCLE; + #ifdef DEBUGGER + missing.fast_rom = 1; + #endif + } + else + CPU.FastROMSpeed = SLOW_ONE_CYCLE; + } + + break; + + case 0x4210: // RDNMI + #if 0 + Memory.FillRAM[0x4210] = Model->_5A22; + #endif + return; + + case 0x4211: // TIMEUP + #if 0 + S9xClearIRQ(PPU_IRQ_SOURCE); + #endif + return; + + case 0x4212: // HVBJOY + case 0x4213: // RDIO + case 0x4214: // RDDIVL + case 0x4215: // RDDIVH + case 0x4216: // RDMPYL + case 0x4217: // RDMPYH + case 0x4218: // JOY1L + case 0x4219: // JOY1H + case 0x421a: // JOY2L + case 0x421b: // JOY2H + case 0x421c: // JOY3L + case 0x421d: // JOY3H + case 0x421e: // JOY4L + case 0x421f: // JOY4H + return; + + default: + if (Settings.SPC7110 && Address >= 0x4800) + S9xSetSPC7110(Byte, Address); + else + if (Settings.SDD1 && Address >= 0x4804 && Address <= 0x4807) + S9xSetSDD1MemoryMap(Address - 0x4804, Byte & 7); + break; + } + } + + Memory.FillRAM[Address] = Byte; +} + +uint8 S9xGetCPU (uint16 Address) +{ + if (Address < 0x4200) + { + #ifdef SNES_JOY_READ_CALLBACKS + extern bool8 pad_read; + if (Address == 0x4016 || Address == 0x4017) + { + S9xOnSNESPadRead(); + pad_read = TRUE; + } + #endif + + switch (Address) + { + case 0x4016: // JOYSER0 + case 0x4017: // JOYSER1 + return (S9xReadJOYSERn(Address)); + + default: + return (OpenBus); + } + } + else + if ((Address & 0xff80) == 0x4300) + { + if (CPU.InDMAorHDMA) + return (OpenBus); + + int d = (Address >> 4) & 0x7; + + switch (Address & 0xf) + { + case 0x0: // 0x43x0: DMAPx + return ((DMA[d].ReverseTransfer ? 0x80 : 0) | + (DMA[d].HDMAIndirectAddressing ? 0x40 : 0) | + (DMA[d].UnusedBit43x0 ? 0x20 : 0) | + (DMA[d].AAddressDecrement ? 0x10 : 0) | + (DMA[d].AAddressFixed ? 0x08 : 0) | + (DMA[d].TransferMode & 7)); + + case 0x1: // 0x43x1: BBADx + return (DMA[d].BAddress); + + case 0x2: // 0x43x2: A1TxL + return (DMA[d].AAddress & 0xff); + + case 0x3: // 0x43x3: A1TxH + return (DMA[d].AAddress >> 8); + + case 0x4: // 0x43x4: A1Bx + return (DMA[d].ABank); + + case 0x5: // 0x43x5: DASxL + return (DMA[d].DMACount_Or_HDMAIndirectAddress & 0xff); + + case 0x6: // 0x43x6: DASxH + return (DMA[d].DMACount_Or_HDMAIndirectAddress >> 8); + + case 0x7: // 0x43x7: DASBx + return (DMA[d].IndirectBank); + + case 0x8: // 0x43x8: A2AxL + return (DMA[d].Address & 0xff); + + case 0x9: // 0x43x9: A2AxH + return (DMA[d].Address >> 8); + + case 0xa: // 0x43xa: NLTRx + return (DMA[d].LineCount ^ (DMA[d].Repeat ? 0x00 : 0x80)); + + case 0xb: // 0x43xb: ????x + case 0xf: // 0x43xf: mirror of 0x43xb + return (DMA[d].UnknownByte); + + default: + return (OpenBus); + } + } + else + { + uint8 byte; + + switch (Address) + { + case 0x4210: // RDNMI + #ifdef CPU_SHUTDOWN + CPU.WaitAddress = CPU.PBPCAtOpcodeStart; + #endif + byte = Memory.FillRAM[0x4210]; + Memory.FillRAM[0x4210] = Model->_5A22; + return ((byte & 0x80) | (OpenBus & 0x70) | Model->_5A22); + + case 0x4211: // TIMEUP + byte = (CPU.IRQActive & PPU_IRQ_SOURCE) ? 0x80 : 0; + S9xClearIRQ(PPU_IRQ_SOURCE); + return (byte | (OpenBus & 0x7f)); + + case 0x4212: // HVBJOY + #ifdef CPU_SHUTDOWN + CPU.WaitAddress = CPU.PBPCAtOpcodeStart; + #endif + return (REGISTER_4212() | (OpenBus & 0x3e)); + + case 0x4213: // RDIO + return (Memory.FillRAM[0x4213]); + + case 0x4214: // RDDIVL + case 0x4215: // RDDIVH + case 0x4216: // RDMPYL + case 0x4217: // RDMPYH + return (Memory.FillRAM[Address]); + + case 0x4218: // JOY1L + case 0x4219: // JOY1H + case 0x421a: // JOY2L + case 0x421b: // JOY2H + case 0x421c: // JOY3L + case 0x421d: // JOY3H + case 0x421e: // JOY4L + case 0x421f: // JOY4H + #ifdef SNES_JOY_READ_CALLBACKS + extern bool8 pad_read; + if (Memory.FillRAM[0x4200] & 1) + { + S9xOnSNESPadRead(); + pad_read = TRUE; + } + #endif + return (Memory.FillRAM[Address]); + + default: + if (Settings.SPC7110 && Address >= 0x4800) + return (S9xGetSPC7110(Address)); + if (Settings.SDD1 && Address >= 0x4800 && Address <= 0x4807) + return (Memory.FillRAM[Address]); + return (OpenBus); + } + } +} + +void S9xResetPPU (void) +{ + S9xSoftResetPPU(); + S9xControlsReset(); + PPU.M7HOFS = 0; + PPU.M7VOFS = 0; + PPU.M7byte = 0; +} + +void S9xSoftResetPPU (void) +{ + S9xControlsSoftReset(); + + PPU.VMA.High = 0; + PPU.VMA.Increment = 1; + PPU.VMA.Address = 0; + PPU.VMA.FullGraphicCount = 0; + PPU.VMA.Shift = 0; + + PPU.WRAM = 0; + + for (int c = 0; c < 4; c++) + { + PPU.BG[c].SCBase = 0; + PPU.BG[c].HOffset = 0; + PPU.BG[c].VOffset = 0; + PPU.BG[c].BGSize = 0; + PPU.BG[c].NameBase = 0; + PPU.BG[c].SCSize = 0; + } + + PPU.BGMode = 0; + PPU.BG3Priority = 0; + + PPU.CGFLIP = 0; + PPU.CGFLIPRead = 0; + PPU.CGADD = 0; + + for (int c = 0; c < 256; c++) + { + IPPU.Red[c] = (c & 7) << 2; + IPPU.Green[c] = ((c >> 3) & 7) << 2; + IPPU.Blue[c] = ((c >> 6) & 2) << 3; + PPU.CGDATA[c] = IPPU.Red[c] | (IPPU.Green[c] << 5) | (IPPU.Blue[c] << 10); + } + + for (int c = 0; c < 128; c++) + { + PPU.OBJ[c].HPos = 0; + PPU.OBJ[c].VPos = 0; + PPU.OBJ[c].HFlip = 0; + PPU.OBJ[c].VFlip = 0; + PPU.OBJ[c].Name = 0; + PPU.OBJ[c].Priority = 0; + PPU.OBJ[c].Palette = 0; + PPU.OBJ[c].Size = 0; + } + + PPU.OBJThroughMain = FALSE; + PPU.OBJThroughSub = FALSE; + PPU.OBJAddition = FALSE; + PPU.OBJNameBase = 0; + PPU.OBJNameSelect = 0; + PPU.OBJSizeSelect = 0; + + PPU.OAMAddr = 0; + PPU.SavedOAMAddr = 0; + PPU.OAMPriorityRotation = 0; + PPU.OAMFlip = 0; + PPU.OAMReadFlip = 0; + PPU.OAMTileAddress = 0; + PPU.OAMWriteRegister = 0; + ZeroMemory(PPU.OAMData, 512 + 32); + + PPU.FirstSprite = 0; + PPU.LastSprite = 127; + PPU.RangeTimeOver = 0; + + PPU.HTimerEnabled = FALSE; + PPU.VTimerEnabled = FALSE; + PPU.HTimerPosition = Timings.H_Max + 1; + PPU.VTimerPosition = Timings.V_Max + 1; + PPU.IRQHBeamPos = 0x1ff; + PPU.IRQVBeamPos = 0x1ff; + + PPU.HBeamFlip = 0; + PPU.VBeamFlip = 0; + PPU.HBeamPosLatched = 0; + PPU.VBeamPosLatched = 0; + PPU.GunHLatch = 0; + PPU.GunVLatch = 1000; + PPU.HVBeamCounterLatched = 0; + + PPU.Mode7HFlip = FALSE; + PPU.Mode7VFlip = FALSE; + PPU.Mode7Repeat = 0; + PPU.MatrixA = 0; + PPU.MatrixB = 0; + PPU.MatrixC = 0; + PPU.MatrixD = 0; + PPU.CentreX = 0; + PPU.CentreY = 0; + + PPU.Mosaic = 0; + PPU.BGMosaic[0] = FALSE; + PPU.BGMosaic[1] = FALSE; + PPU.BGMosaic[2] = FALSE; + PPU.BGMosaic[3] = FALSE; + + PPU.Window1Left = 1; + PPU.Window1Right = 0; + PPU.Window2Left = 1; + PPU.Window2Right = 0; + PPU.RecomputeClipWindows = TRUE; + + for (int c = 0; c < 6; c++) + { + PPU.ClipCounts[c] = 0; + PPU.ClipWindowOverlapLogic[c] = CLIP_OR; + PPU.ClipWindow1Enable[c] = FALSE; + PPU.ClipWindow2Enable[c] = FALSE; + PPU.ClipWindow1Inside[c] = TRUE; + PPU.ClipWindow2Inside[c] = TRUE; + } + + PPU.ForcedBlanking = TRUE; + + PPU.FixedColourRed = 0; + PPU.FixedColourGreen = 0; + PPU.FixedColourBlue = 0; + PPU.Brightness = 0; + PPU.ScreenHeight = SNES_HEIGHT; + + PPU.Need16x8Mulitply = FALSE; + PPU.BGnxOFSbyte = 0; + + PPU.HDMA = 0; + PPU.HDMAEnded = 0; + + PPU.OpenBus1 = 0; + PPU.OpenBus2 = 0; + + for (int c = 0; c < 2; c++) + memset(&IPPU.Clip[c], 0, sizeof(struct ClipData)); + IPPU.ColorsChanged = TRUE; + IPPU.OBJChanged = TRUE; + IPPU.DirectColourMapsNeedRebuild = TRUE; + ZeroMemory(IPPU.TileCached[TILE_2BIT], MAX_2BIT_TILES); + ZeroMemory(IPPU.TileCached[TILE_4BIT], MAX_4BIT_TILES); + ZeroMemory(IPPU.TileCached[TILE_8BIT], MAX_8BIT_TILES); + ZeroMemory(IPPU.TileCached[TILE_2BIT_EVEN], MAX_2BIT_TILES); + ZeroMemory(IPPU.TileCached[TILE_2BIT_ODD], MAX_2BIT_TILES); + ZeroMemory(IPPU.TileCached[TILE_4BIT_EVEN], MAX_4BIT_TILES); + ZeroMemory(IPPU.TileCached[TILE_4BIT_ODD], MAX_4BIT_TILES); +#ifdef CORRECT_VRAM_READS + IPPU.VRAMReadBuffer = 0; // XXX: FIXME: anything better? +#else + IPPU.FirstVRAMRead = FALSE; +#endif + IPPU.Interlace = FALSE; + IPPU.InterlaceOBJ = FALSE; + IPPU.DoubleWidthPixels = FALSE; + IPPU.DoubleHeightPixels = FALSE; + IPPU.CurrentLine = 0; + IPPU.PreviousLine = 0; + IPPU.XB = NULL; + for (int c = 0; c < 256; c++) + IPPU.ScreenColors[c] = c; + IPPU.MaxBrightness = 0; + IPPU.RenderThisFrame = TRUE; + IPPU.RenderedScreenWidth = SNES_WIDTH; + IPPU.RenderedScreenHeight = SNES_HEIGHT; + IPPU.FrameCount = 0; + IPPU.RenderedFramesCount = 0; + IPPU.DisplayedRenderedFrameCount = 0; + IPPU.SkippedFrames = 0; + IPPU.FrameSkip = 0; + + S9xFixColourBrightness(); + + for (int c = 0; c < 0x8000; c += 0x100) + memset(&Memory.FillRAM[c], c >> 8, 0x100); + ZeroMemory(&Memory.FillRAM[0x2100], 0x100); + ZeroMemory(&Memory.FillRAM[0x4200], 0x100); + ZeroMemory(&Memory.FillRAM[0x4000], 0x100); + // For BS Suttehakkun 2... + ZeroMemory(&Memory.FillRAM[0x1000], 0x1000); + + Memory.FillRAM[0x4201] = Memory.FillRAM[0x4213] = 0xff; +} diff --git a/plugins/snes9x_gx/source/snes9x/ppu.h b/plugins/snes9x_gx/source/snes9x/ppu.h new file mode 100644 index 00000000..7f20e897 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/ppu.h @@ -0,0 +1,752 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _PPU_H_ +#define _PPU_H_ + +#define FIRST_VISIBLE_LINE 1 + +#define TILE_2BIT 0 +#define TILE_4BIT 1 +#define TILE_8BIT 2 +#define TILE_2BIT_EVEN 3 +#define TILE_2BIT_ODD 4 +#define TILE_4BIT_EVEN 5 +#define TILE_4BIT_ODD 6 + +#define MAX_2BIT_TILES 4096 +#define MAX_4BIT_TILES 2048 +#define MAX_8BIT_TILES 1024 + +#define CLIP_OR 0 +#define CLIP_AND 1 +#define CLIP_XOR 2 +#define CLIP_XNOR 3 + +#define PPU_IRQ_SOURCE (1 << 1) +#define GSU_IRQ_SOURCE (1 << 2) +#define SA1_IRQ_SOURCE (1 << 7) +#define SA1_DMA_IRQ_SOURCE (1 << 5) + +struct ClipData +{ + uint8 Count; + uint8 DrawMode[6]; + uint16 Left[6]; + uint16 Right[6]; +}; + +struct InternalPPU +{ + struct ClipData Clip[2][6]; + bool8 ColorsChanged; + bool8 OBJChanged; + bool8 DirectColourMapsNeedRebuild; + uint8 *TileCache[7]; + uint8 *TileCached[7]; +#ifdef CORRECT_VRAM_READS + uint16 VRAMReadBuffer; +#else + bool8 FirstVRAMRead; +#endif + bool8 Interlace; + bool8 InterlaceOBJ; + bool8 PseudoHires; + bool8 DoubleWidthPixels; + bool8 DoubleHeightPixels; + int CurrentLine; + int PreviousLine; + uint8 *XB; + uint32 Red[256]; + uint32 Green[256]; + uint32 Blue[256]; + uint16 ScreenColors[256]; + uint8 MaxBrightness; + bool8 RenderThisFrame; + int RenderedScreenWidth; + int RenderedScreenHeight; + uint32 FrameCount; + uint32 RenderedFramesCount; + uint32 DisplayedRenderedFrameCount; + uint32 TotalEmulatedFrames; + uint32 SkippedFrames; + uint32 FrameSkip; +}; + +struct SOBJ +{ + int16 HPos; + uint16 VPos; + uint8 HFlip; + uint8 VFlip; + uint16 Name; + uint8 Priority; + uint8 Palette; + uint8 Size; +}; + +struct SPPU +{ + struct + { + bool8 High; + uint8 Increment; + uint16 Address; + uint16 Mask1; + uint16 FullGraphicCount; + uint16 Shift; + } VMA; + + uint32 WRAM; + + struct + { + uint16 SCBase; + uint16 HOffset; + uint16 VOffset; + uint8 BGSize; + uint16 NameBase; + uint16 SCSize; + } BG[4]; + + uint8 BGMode; + uint8 BG3Priority; + + bool8 CGFLIP; + uint8 CGFLIPRead; + uint8 CGADD; + uint16 CGDATA[256]; + + struct SOBJ OBJ[128]; + bool8 OBJThroughMain; + bool8 OBJThroughSub; + bool8 OBJAddition; + uint16 OBJNameBase; + uint16 OBJNameSelect; + uint8 OBJSizeSelect; + + uint16 OAMAddr; + uint16 SavedOAMAddr; + uint8 OAMPriorityRotation; + uint8 OAMFlip; + uint8 OAMReadFlip; + uint16 OAMTileAddress; + uint16 OAMWriteRegister; + uint8 OAMData[512 + 32]; + + uint8 FirstSprite; + uint8 LastSprite; + uint8 RangeTimeOver; + + bool8 HTimerEnabled; + bool8 VTimerEnabled; + short HTimerPosition; + short VTimerPosition; + uint16 IRQHBeamPos; + uint16 IRQVBeamPos; + + uint8 HBeamFlip; + uint8 VBeamFlip; + uint16 HBeamPosLatched; + uint16 VBeamPosLatched; + uint16 GunHLatch; + uint16 GunVLatch; + uint8 HVBeamCounterLatched; + + bool8 Mode7HFlip; + bool8 Mode7VFlip; + uint8 Mode7Repeat; + short MatrixA; + short MatrixB; + short MatrixC; + short MatrixD; + short CentreX; + short CentreY; + short M7HOFS; + short M7VOFS; + + uint8 Mosaic; + uint8 MosaicStart; + bool8 BGMosaic[4]; + + uint8 Window1Left; + uint8 Window1Right; + uint8 Window2Left; + uint8 Window2Right; + bool8 RecomputeClipWindows; + uint8 ClipCounts[6]; + uint8 ClipWindowOverlapLogic[6]; + uint8 ClipWindow1Enable[6]; + uint8 ClipWindow2Enable[6]; + bool8 ClipWindow1Inside[6]; + bool8 ClipWindow2Inside[6]; + + bool8 ForcedBlanking; + + uint8 FixedColourRed; + uint8 FixedColourGreen; + uint8 FixedColourBlue; + uint8 Brightness; + uint16 ScreenHeight; + + bool8 Need16x8Mulitply; + uint8 BGnxOFSbyte; + uint8 M7byte; + + uint8 HDMA; + uint8 HDMAEnded; + + uint8 OpenBus1; + uint8 OpenBus2; +}; + +extern uint16 SignExtend[2]; +extern struct SPPU PPU; +extern struct InternalPPU IPPU; + +void S9xResetPPU (void); +void S9xSoftResetPPU (void); +void S9xSetPPU (uint8, uint16); +uint8 S9xGetPPU (uint16); +void S9xSetCPU (uint8, uint16); +uint8 S9xGetCPU (uint16); +void S9xUpdateHVTimerPosition (void); +void S9xCheckMissingHTimerPosition (int32); +void S9xCheckMissingHTimerRange (int32, int32); +void S9xCheckMissingHTimerHalt (int32, int32); +void S9xFixColourBrightness (void); +void S9xDoAutoJoypad (void); + +#include "gfx.h" +#include "memmap.h" + +typedef struct +{ + uint8 _5C77; + uint8 _5C78; + uint8 _5A22; +} SnesModel; + +extern SnesModel *Model; +extern SnesModel M1SNES; +extern SnesModel M2SNES; + +#define MAX_5C77_VERSION 0x01 +#define MAX_5C78_VERSION 0x03 +#define MAX_5A22_VERSION 0x02 + +static inline void FLUSH_REDRAW (void) +{ + if (IPPU.PreviousLine != IPPU.CurrentLine) + S9xUpdateScreen(); +} + +static inline void REGISTER_2104 (uint8 Byte) +{ + if (PPU.OAMAddr & 0x100) + { + int addr = ((PPU.OAMAddr & 0x10f) << 1) + (PPU.OAMFlip & 1); + if (Byte != PPU.OAMData[addr]) + { + FLUSH_REDRAW(); + PPU.OAMData[addr] = Byte; + IPPU.OBJChanged = TRUE; + + // X position high bit, and sprite size (x4) + struct SOBJ *pObj = &PPU.OBJ[(addr & 0x1f) * 4]; + pObj->HPos = (pObj->HPos & 0xFF) | SignExtend[(Byte >> 0) & 1]; + pObj++->Size = Byte & 2; + pObj->HPos = (pObj->HPos & 0xFF) | SignExtend[(Byte >> 2) & 1]; + pObj++->Size = Byte & 8; + pObj->HPos = (pObj->HPos & 0xFF) | SignExtend[(Byte >> 4) & 1]; + pObj++->Size = Byte & 32; + pObj->HPos = (pObj->HPos & 0xFF) | SignExtend[(Byte >> 6) & 1]; + pObj->Size = Byte & 128; + } + + PPU.OAMFlip ^= 1; + if (!(PPU.OAMFlip & 1)) + { + ++PPU.OAMAddr; + PPU.OAMAddr &= 0x1ff; + if (PPU.OAMPriorityRotation && PPU.FirstSprite != (PPU.OAMAddr >> 1)) + { + PPU.FirstSprite = (PPU.OAMAddr & 0xfe) >> 1; + IPPU.OBJChanged = TRUE; + } + } + else + { + if (PPU.OAMPriorityRotation && (PPU.OAMAddr & 1)) + IPPU.OBJChanged = TRUE; + } + } + else + if (!(PPU.OAMFlip & 1)) + { + PPU.OAMWriteRegister &= 0xff00; + PPU.OAMWriteRegister |= Byte; + PPU.OAMFlip |= 1; + if (PPU.OAMPriorityRotation && (PPU.OAMAddr & 1)) + IPPU.OBJChanged = TRUE; + } + else + { + PPU.OAMWriteRegister &= 0x00ff; + uint8 lowbyte = (uint8) (PPU.OAMWriteRegister); + uint8 highbyte = Byte; + PPU.OAMWriteRegister |= Byte << 8; + + int addr = (PPU.OAMAddr << 1); + if (lowbyte != PPU.OAMData[addr] || highbyte != PPU.OAMData[addr + 1]) + { + FLUSH_REDRAW(); + PPU.OAMData[addr] = lowbyte; + PPU.OAMData[addr + 1] = highbyte; + IPPU.OBJChanged = TRUE; + if (addr & 2) + { + // Tile + PPU.OBJ[addr = PPU.OAMAddr >> 1].Name = PPU.OAMWriteRegister & 0x1ff; + // priority, h and v flip. + PPU.OBJ[addr].Palette = (highbyte >> 1) & 7; + PPU.OBJ[addr].Priority = (highbyte >> 4) & 3; + PPU.OBJ[addr].HFlip = (highbyte >> 6) & 1; + PPU.OBJ[addr].VFlip = (highbyte >> 7) & 1; + } + else + { + // X position (low) + PPU.OBJ[addr = PPU.OAMAddr >> 1].HPos &= 0xff00; + PPU.OBJ[addr].HPos |= lowbyte; + // Sprite Y position + PPU.OBJ[addr].VPos = highbyte; + } + } + + PPU.OAMFlip &= ~1; + ++PPU.OAMAddr; + if (PPU.OAMPriorityRotation && PPU.FirstSprite != (PPU.OAMAddr >> 1)) + { + PPU.FirstSprite = (PPU.OAMAddr & 0xfe) >> 1; + IPPU.OBJChanged = TRUE; + } + } +} + +// This code is correct, however due to Snes9x's inaccurate timings, some games might be broken by this chage. :( +#ifdef DEBUGGER +#define CHECK_INBLANK() \ + if (!PPU.ForcedBlanking && CPU.V_Counter < PPU.ScreenHeight + FIRST_VISIBLE_LINE) \ + { \ + printf("Invalid VRAM acess at (%04d, %04d) blank:%d\n", CPU.Cycles, CPU.V_Counter, PPU.ForcedBlanking); \ + if (Settings.BlockInvalidVRAMAccess) \ + return; \ + } +#else +#define CHECK_INBLANK() \ + if (Settings.BlockInvalidVRAMAccess && !PPU.ForcedBlanking && CPU.V_Counter < PPU.ScreenHeight + FIRST_VISIBLE_LINE) \ + return; +#endif + +static inline void REGISTER_2118 (uint8 Byte) +{ + CHECK_INBLANK(); + + uint32 address; + + if (PPU.VMA.FullGraphicCount) + { + uint32 rem = PPU.VMA.Address & PPU.VMA.Mask1; + address = (((PPU.VMA.Address & ~PPU.VMA.Mask1) + (rem >> PPU.VMA.Shift) + ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3)) << 1) & 0xffff; + Memory.VRAM[address] = Byte; + } + else + Memory.VRAM[address = (PPU.VMA.Address << 1) & 0xffff] = Byte; + + IPPU.TileCached[TILE_2BIT][address >> 4] = FALSE; + IPPU.TileCached[TILE_4BIT][address >> 5] = FALSE; + IPPU.TileCached[TILE_8BIT][address >> 6] = FALSE; + IPPU.TileCached[TILE_2BIT_EVEN][address >> 4] = FALSE; + IPPU.TileCached[TILE_2BIT_EVEN][((address >> 4) - 1) & (MAX_2BIT_TILES - 1)] = FALSE; + IPPU.TileCached[TILE_2BIT_ODD] [address >> 4] = FALSE; + IPPU.TileCached[TILE_2BIT_ODD] [((address >> 4) - 1) & (MAX_2BIT_TILES - 1)] = FALSE; + IPPU.TileCached[TILE_4BIT_EVEN][address >> 5] = FALSE; + IPPU.TileCached[TILE_4BIT_EVEN][((address >> 5) - 1) & (MAX_4BIT_TILES - 1)] = FALSE; + IPPU.TileCached[TILE_4BIT_ODD] [address >> 5] = FALSE; + IPPU.TileCached[TILE_4BIT_ODD] [((address >> 5) - 1) & (MAX_4BIT_TILES - 1)] = FALSE; + + if (!PPU.VMA.High) + { + #ifdef DEBUGGER + if (Settings.TraceVRAM && !CPU.InDMAorHDMA) + printf("VRAM write byte: $%04X (%d, %d)\n", PPU.VMA.Address, Memory.FillRAM[0x2115] & 3, (Memory.FillRAM[0x2115] & 0x0c) >> 2); + #endif + PPU.VMA.Address += PPU.VMA.Increment; + } +} + +static inline void REGISTER_2119 (uint8 Byte) +{ + CHECK_INBLANK(); + + uint32 address; + + if (PPU.VMA.FullGraphicCount) + { + uint32 rem = PPU.VMA.Address & PPU.VMA.Mask1; + address = ((((PPU.VMA.Address & ~PPU.VMA.Mask1) + (rem >> PPU.VMA.Shift) + ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3)) << 1) + 1) & 0xffff; + Memory.VRAM[address] = Byte; + } + else + Memory.VRAM[address = ((PPU.VMA.Address << 1) + 1) & 0xffff] = Byte; + + IPPU.TileCached[TILE_2BIT][address >> 4] = FALSE; + IPPU.TileCached[TILE_4BIT][address >> 5] = FALSE; + IPPU.TileCached[TILE_8BIT][address >> 6] = FALSE; + IPPU.TileCached[TILE_2BIT_EVEN][address >> 4] = FALSE; + IPPU.TileCached[TILE_2BIT_EVEN][((address >> 4) - 1) & (MAX_2BIT_TILES - 1)] = FALSE; + IPPU.TileCached[TILE_2BIT_ODD] [address >> 4] = FALSE; + IPPU.TileCached[TILE_2BIT_ODD] [((address >> 4) - 1) & (MAX_2BIT_TILES - 1)] = FALSE; + IPPU.TileCached[TILE_4BIT_EVEN][address >> 5] = FALSE; + IPPU.TileCached[TILE_4BIT_EVEN][((address >> 5) - 1) & (MAX_4BIT_TILES - 1)] = FALSE; + IPPU.TileCached[TILE_4BIT_ODD] [address >> 5] = FALSE; + IPPU.TileCached[TILE_4BIT_ODD] [((address >> 5) - 1) & (MAX_4BIT_TILES - 1)] = FALSE; + + if (PPU.VMA.High) + { + #ifdef DEBUGGER + if (Settings.TraceVRAM && !CPU.InDMAorHDMA) + printf("VRAM write word: $%04X (%d, %d)\n", PPU.VMA.Address, Memory.FillRAM[0x2115] & 3, (Memory.FillRAM[0x2115] & 0x0c) >> 2); + #endif + PPU.VMA.Address += PPU.VMA.Increment; + } +} + +static inline void REGISTER_2118_tile (uint8 Byte) +{ + CHECK_INBLANK(); + + uint32 rem = PPU.VMA.Address & PPU.VMA.Mask1; + uint32 address = (((PPU.VMA.Address & ~PPU.VMA.Mask1) + (rem >> PPU.VMA.Shift) + ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3)) << 1) & 0xffff; + + Memory.VRAM[address] = Byte; + + IPPU.TileCached[TILE_2BIT][address >> 4] = FALSE; + IPPU.TileCached[TILE_4BIT][address >> 5] = FALSE; + IPPU.TileCached[TILE_8BIT][address >> 6] = FALSE; + IPPU.TileCached[TILE_2BIT_EVEN][address >> 4] = FALSE; + IPPU.TileCached[TILE_2BIT_EVEN][((address >> 4) - 1) & (MAX_2BIT_TILES - 1)] = FALSE; + IPPU.TileCached[TILE_2BIT_ODD] [address >> 4] = FALSE; + IPPU.TileCached[TILE_2BIT_ODD] [((address >> 4) - 1) & (MAX_2BIT_TILES - 1)] = FALSE; + IPPU.TileCached[TILE_4BIT_EVEN][address >> 5] = FALSE; + IPPU.TileCached[TILE_4BIT_EVEN][((address >> 5) - 1) & (MAX_4BIT_TILES - 1)] = FALSE; + IPPU.TileCached[TILE_4BIT_ODD] [address >> 5] = FALSE; + IPPU.TileCached[TILE_4BIT_ODD] [((address >> 5) - 1) & (MAX_4BIT_TILES - 1)] = FALSE; + + if (!PPU.VMA.High) + PPU.VMA.Address += PPU.VMA.Increment; +} + +static inline void REGISTER_2119_tile (uint8 Byte) +{ + CHECK_INBLANK(); + + uint32 rem = PPU.VMA.Address & PPU.VMA.Mask1; + uint32 address = ((((PPU.VMA.Address & ~PPU.VMA.Mask1) + (rem >> PPU.VMA.Shift) + ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3)) << 1) + 1) & 0xffff; + + Memory.VRAM[address] = Byte; + + IPPU.TileCached[TILE_2BIT][address >> 4] = FALSE; + IPPU.TileCached[TILE_4BIT][address >> 5] = FALSE; + IPPU.TileCached[TILE_8BIT][address >> 6] = FALSE; + IPPU.TileCached[TILE_2BIT_EVEN][address >> 4] = FALSE; + IPPU.TileCached[TILE_2BIT_EVEN][((address >> 4) - 1) & (MAX_2BIT_TILES - 1)] = FALSE; + IPPU.TileCached[TILE_2BIT_ODD] [address >> 4] = FALSE; + IPPU.TileCached[TILE_2BIT_ODD] [((address >> 4) - 1) & (MAX_2BIT_TILES - 1)] = FALSE; + IPPU.TileCached[TILE_4BIT_EVEN][address >> 5] = FALSE; + IPPU.TileCached[TILE_4BIT_EVEN][((address >> 5) - 1) & (MAX_4BIT_TILES - 1)] = FALSE; + IPPU.TileCached[TILE_4BIT_ODD] [address >> 5] = FALSE; + IPPU.TileCached[TILE_4BIT_ODD] [((address >> 5) - 1) & (MAX_4BIT_TILES - 1)] = FALSE; + + if (PPU.VMA.High) + PPU.VMA.Address += PPU.VMA.Increment; +} + +static inline void REGISTER_2118_linear (uint8 Byte) +{ + CHECK_INBLANK(); + + uint32 address; + + Memory.VRAM[address = (PPU.VMA.Address << 1) & 0xffff] = Byte; + + IPPU.TileCached[TILE_2BIT][address >> 4] = FALSE; + IPPU.TileCached[TILE_4BIT][address >> 5] = FALSE; + IPPU.TileCached[TILE_8BIT][address >> 6] = FALSE; + IPPU.TileCached[TILE_2BIT_EVEN][address >> 4] = FALSE; + IPPU.TileCached[TILE_2BIT_EVEN][((address >> 4) - 1) & (MAX_2BIT_TILES - 1)] = FALSE; + IPPU.TileCached[TILE_2BIT_ODD] [address >> 4] = FALSE; + IPPU.TileCached[TILE_2BIT_ODD] [((address >> 4) - 1) & (MAX_2BIT_TILES - 1)] = FALSE; + IPPU.TileCached[TILE_4BIT_EVEN][address >> 5] = FALSE; + IPPU.TileCached[TILE_4BIT_EVEN][((address >> 5) - 1) & (MAX_4BIT_TILES - 1)] = FALSE; + IPPU.TileCached[TILE_4BIT_ODD] [address >> 5] = FALSE; + IPPU.TileCached[TILE_4BIT_ODD] [((address >> 5) - 1) & (MAX_4BIT_TILES - 1)] = FALSE; + + if (!PPU.VMA.High) + PPU.VMA.Address += PPU.VMA.Increment; +} + +static inline void REGISTER_2119_linear (uint8 Byte) +{ + CHECK_INBLANK(); + + uint32 address; + + Memory.VRAM[address = ((PPU.VMA.Address << 1) + 1) & 0xffff] = Byte; + + IPPU.TileCached[TILE_2BIT][address >> 4] = FALSE; + IPPU.TileCached[TILE_4BIT][address >> 5] = FALSE; + IPPU.TileCached[TILE_8BIT][address >> 6] = FALSE; + IPPU.TileCached[TILE_2BIT_EVEN][address >> 4] = FALSE; + IPPU.TileCached[TILE_2BIT_EVEN][((address >> 4) - 1) & (MAX_2BIT_TILES - 1)] = FALSE; + IPPU.TileCached[TILE_2BIT_ODD] [address >> 4] = FALSE; + IPPU.TileCached[TILE_2BIT_ODD] [((address >> 4) - 1) & (MAX_2BIT_TILES - 1)] = FALSE; + IPPU.TileCached[TILE_4BIT_EVEN][address >> 5] = FALSE; + IPPU.TileCached[TILE_4BIT_EVEN][((address >> 5) - 1) & (MAX_4BIT_TILES - 1)] = FALSE; + IPPU.TileCached[TILE_4BIT_ODD] [address >> 5] = FALSE; + IPPU.TileCached[TILE_4BIT_ODD] [((address >> 5) - 1) & (MAX_4BIT_TILES - 1)] = FALSE; + + if (PPU.VMA.High) + PPU.VMA.Address += PPU.VMA.Increment; +} + +static inline void REGISTER_2122 (uint8 Byte) +{ + if (PPU.CGFLIP) + { + if ((Byte & 0x7f) != (PPU.CGDATA[PPU.CGADD] >> 8)) + { + FLUSH_REDRAW(); + PPU.CGDATA[PPU.CGADD] &= 0x00ff; + PPU.CGDATA[PPU.CGADD] |= (Byte & 0x7f) << 8; + IPPU.ColorsChanged = TRUE; + IPPU.Blue[PPU.CGADD] = IPPU.XB[(Byte >> 2) & 0x1f]; + IPPU.Green[PPU.CGADD] = IPPU.XB[(PPU.CGDATA[PPU.CGADD] >> 5) & 0x1f]; + IPPU.ScreenColors[PPU.CGADD] = (uint16) BUILD_PIXEL(IPPU.Red[PPU.CGADD], IPPU.Green[PPU.CGADD], IPPU.Blue[PPU.CGADD]); + } + + PPU.CGADD++; + } + else + { + if (Byte != (uint8) (PPU.CGDATA[PPU.CGADD] & 0xff)) + { + FLUSH_REDRAW(); + PPU.CGDATA[PPU.CGADD] &= 0x7f00; + PPU.CGDATA[PPU.CGADD] |= Byte; + IPPU.ColorsChanged = TRUE; + IPPU.Red[PPU.CGADD] = IPPU.XB[Byte & 0x1f]; + IPPU.Green[PPU.CGADD] = IPPU.XB[(PPU.CGDATA[PPU.CGADD] >> 5) & 0x1f]; + IPPU.ScreenColors[PPU.CGADD] = (uint16) BUILD_PIXEL(IPPU.Red[PPU.CGADD], IPPU.Green[PPU.CGADD], IPPU.Blue[PPU.CGADD]); + } + } + + PPU.CGFLIP ^= 1; +} + +static inline void REGISTER_2180 (uint8 Byte) +{ + Memory.RAM[PPU.WRAM++] = Byte; + PPU.WRAM &= 0x1ffff; +} + +static inline uint8 REGISTER_4212 (void) +{ + uint8 byte = 0; + + if ((CPU.V_Counter >= PPU.ScreenHeight + FIRST_VISIBLE_LINE) && (CPU.V_Counter < PPU.ScreenHeight + FIRST_VISIBLE_LINE + 3)) + byte = 1; + if ((CPU.Cycles < Timings.HBlankEnd) || (CPU.Cycles >= Timings.HBlankStart)) + byte |= 0x40; + if (CPU.V_Counter >= PPU.ScreenHeight + FIRST_VISIBLE_LINE) + byte |= 0x80; + + return (byte); +} + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/reader.cpp b/plugins/snes9x_gx/source/snes9x/reader.cpp new file mode 100644 index 00000000..fa7ba1ec --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/reader.cpp @@ -0,0 +1,353 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +// Abstract the details of reading from zip files versus FILE *'s. + +#include <string> +#ifdef UNZIP_SUPPORT +#include "unzip.h" +#endif +#include "snes9x.h" +#include "reader.h" + + +// Generic constructor/destructor + +Reader::Reader (void) +{ + return; +} + +Reader::~Reader (void) +{ + return; +} + +// Generic getline function, based on gets. Reimlpement if you can do better. + +char * Reader::getline (void) +{ + bool eof; + std::string ret; + + ret = getline(eof); + if (ret.size() == 0 && eof) + return (NULL); + + return (strdup(ret.c_str())); +} + +std::string Reader::getline (bool &eof) +{ + char buf[1024]; + std::string ret; + + eof = false; + ret.clear(); + + do + { + if (gets(buf, sizeof(buf)) == NULL) + { + eof = true; + break; + } + + ret.append(buf); + } + while (*ret.rbegin() != '\n'); + + return (ret); +} + +// snes9x.h STREAM reader + +fReader::fReader (STREAM f) +{ + fp = f; +} + +fReader::~fReader (void) +{ + return; +} + +int fReader::get_char (void) +{ + return (GETC_STREAM(fp)); +} + +char * fReader::gets (char *buf, size_t len) +{ + return (GETS_STREAM(buf, len, fp)); +} + +size_t fReader::read (char *buf, size_t len) +{ + return (READ_STREAM(buf, len, fp)); +} + +// unzip reader + +#ifdef UNZIP_SUPPORT + +unzReader::unzReader (unzFile &v) +{ + file = v; + head = NULL; + numbytes = 0; +} + +unzReader::~unzReader (void) +{ + return; +} + +int unzReader::get_char (void) +{ + unsigned char c; + + if (numbytes <= 0) + { + numbytes = unzReadCurrentFile(file, buffer, unz_BUFFSIZ); + if (numbytes <= 0) + return (EOF); + head = buffer; + } + + c = *head; + head++; + numbytes--; + + return ((int) c); +} + +char * unzReader::gets (char *buf, size_t len) +{ + size_t i; + int c; + + for (i = 0; i < len - 1; i++) + { + c = get_char(); + if (c == EOF) + { + if (i == 0) + return (NULL); + break; + } + + buf[i] = (char) c; + if (buf[i] == '\n') + break; + } + + buf[i] = '\0'; + + return (buf); +} + +size_t unzReader::read (char *buf, size_t len) +{ + if (len == 0) + return (len); + + if (len <= numbytes) + { + memcpy(buf, head, len); + numbytes -= len; + head += len; + return (len); + } + + size_t numread = 0; + if (numbytes > 0) + { + memcpy(buf, head, numbytes); + numread += numbytes; + head = NULL; + numbytes = 0; + } + + int l = unzReadCurrentFile(file, buf + numread, len - numread); + if (l > 0) + numread += l; + + return (numread); +} + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/reader.h b/plugins/snes9x_gx/source/snes9x/reader.h new file mode 100644 index 00000000..2019cc1a --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/reader.h @@ -0,0 +1,228 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _READER_H_ +#define _READER_H_ + +class Reader +{ + public: + Reader (void); + virtual ~Reader (void); + virtual int get_char (void) = 0; + virtual char * gets (char *, size_t) = 0; + virtual char * getline (void); // free() when done + virtual std::string getline (bool &); + virtual size_t read (char *, size_t) = 0; +}; + +class fReader : public Reader +{ + public: + fReader (STREAM); + virtual ~fReader (void); + virtual int get_char (void); + virtual char * gets (char *, size_t); + virtual size_t read (char *, size_t); + + private: + STREAM fp; +}; + +#ifdef UNZIP_SUPPORT + +#define unz_BUFFSIZ 1024 + +class unzReader : public Reader +{ + public: + unzReader (unzFile &); + virtual ~unzReader (void); + virtual int get_char (void); + virtual char * gets (char *, size_t); + virtual size_t read (char *, size_t); + + private: + unzFile file; + char buffer[unz_BUFFSIZ]; + char *head; + size_t numbytes; +}; + +#endif + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/sa1.cpp b/plugins/snes9x_gx/source/snes9x/sa1.cpp new file mode 100644 index 00000000..df28bace --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/sa1.cpp @@ -0,0 +1,1136 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#include "snes9x.h" +#include "memmap.h" + +uint8 SA1OpenBus; + +static void S9xSA1Reset (void); +static void S9xSA1SetBWRAMMemMap (uint8); +static void S9xSetSA1MemMap (uint32, uint8); +static void S9xSA1CharConv2 (void); +static void S9xSA1DMA (void); +static void S9xSA1ReadVariableLengthData (bool8, bool8); + + +void S9xSA1Init (void) +{ + SA1.IRQActive = FALSE; + SA1.WaitingForInterrupt = FALSE; + SA1.Waiting = FALSE; + SA1.Flags = 0; + SA1.Executing = FALSE; + memset(&Memory.FillRAM[0x2200], 0, 0x200); + Memory.FillRAM[0x2200] = 0x20; + Memory.FillRAM[0x2220] = 0x00; + Memory.FillRAM[0x2221] = 0x01; + Memory.FillRAM[0x2222] = 0x02; + Memory.FillRAM[0x2223] = 0x03; + Memory.FillRAM[0x2228] = 0xff; + SA1.op1 = 0; + SA1.op2 = 0; + SA1.arithmetic_op = 0; + SA1.sum = 0; + SA1.overflow = FALSE; + SA1.S9xOpcodes = NULL; +} + +static void S9xSA1Reset (void) +{ + SA1Registers.PBPC = 0; + SA1Registers.PB = 0; + SA1Registers.PCw = Memory.FillRAM[0x2203] | (Memory.FillRAM[0x2204] << 8); + SA1Registers.D.W = 0; + SA1Registers.DB = 0; + SA1Registers.SH = 1; + SA1Registers.SL = 0xFF; + SA1Registers.XH = 0; + SA1Registers.YH = 0; + SA1Registers.P.W = 0; + + SA1.ShiftedPB = 0; + SA1.ShiftedDB = 0; + SA1SetFlags(MemoryFlag | IndexFlag | IRQ | Emulation); + SA1ClearFlags(Decimal); + + SA1.WaitingForInterrupt = FALSE; + SA1.PCBase = NULL; + S9xSA1SetPCBase(SA1Registers.PBPC); + SA1.S9xOpcodes = S9xSA1OpcodesM1X1; + SA1.S9xOpLengths = S9xOpLengthsM1X1; + + S9xSA1UnpackStatus(); + S9xSA1FixCycles(); + SA1.Executing = TRUE; + SA1.BWRAM = Memory.SRAM; + Memory.FillRAM[0x2225] = 0; +} + +static void S9xSA1SetBWRAMMemMap (uint8 val) +{ + if (val & 0x80) + { + for (int c = 0; c < 0x400; c += 16) + { + SA1.Map[c + 6] = SA1.Map[c + 0x806] = (uint8 *) CMemory::MAP_BWRAM_BITMAP2; + SA1.Map[c + 7] = SA1.Map[c + 0x807] = (uint8 *) CMemory::MAP_BWRAM_BITMAP2; + SA1.WriteMap[c + 6] = SA1.WriteMap[c + 0x806] = (uint8 *) CMemory::MAP_BWRAM_BITMAP2; + SA1.WriteMap[c + 7] = SA1.WriteMap[c + 0x807] = (uint8 *) CMemory::MAP_BWRAM_BITMAP2; + } + + SA1.BWRAM = Memory.SRAM + (val & 0x7f) * 0x2000 / 4; + } + else + { + for (int c = 0; c < 0x400; c += 16) + { + SA1.Map[c + 6] = SA1.Map[c + 0x806] = (uint8 *) CMemory::MAP_BWRAM; + SA1.Map[c + 7] = SA1.Map[c + 0x807] = (uint8 *) CMemory::MAP_BWRAM; + SA1.WriteMap[c + 6] = SA1.WriteMap[c + 0x806] = (uint8 *) CMemory::MAP_BWRAM; + SA1.WriteMap[c + 7] = SA1.WriteMap[c + 0x807] = (uint8 *) CMemory::MAP_BWRAM; + } + + SA1.BWRAM = Memory.SRAM + (val & 7) * 0x2000; + } +} + +void S9xSA1PostLoadState (void) +{ + SA1.ShiftedPB = (uint32) SA1Registers.PB << 16; + SA1.ShiftedDB = (uint32) SA1Registers.DB << 16; + + S9xSA1SetPCBase(SA1Registers.PBPC); + S9xSA1UnpackStatus(); + S9xSA1FixCycles(); + SA1.VirtualBitmapFormat = (Memory.FillRAM[0x223f] & 0x80) ? 2 : 4; + Memory.BWRAM = Memory.SRAM + (Memory.FillRAM[0x2224] & 7) * 0x2000; + S9xSA1SetBWRAMMemMap(Memory.FillRAM[0x2225]); + + SA1.Waiting = (Memory.FillRAM[0x2200] & 0x60) != 0; + SA1.Executing = !SA1.Waiting; +} + +void S9xSA1ExecuteDuringSleep (void) +{ +#if 0 + if (SA1.Executing) + { + while (CPU.Cycles < CPU.NextEvent) + { + S9xSA1MainLoop(); + CPU.Cycles += TWO_CYCLES * 2; + } + } +#endif +} + +static void S9xSetSA1MemMap (uint32 which1, uint8 map) +{ + int start = which1 * 0x100 + 0xc00; + int start2 = which1 * 0x200; + + if (which1 >= 2) + start2 += 0x400; + + for (int c = 0; c < 0x100; c += 16) + { + uint8 *block = &Memory.ROM[(map & 7) * 0x100000 + (c << 12)]; + for (int i = c; i < c + 16; i++) + Memory.Map[start + i] = SA1.Map[start + i] = block; + } + + for (int c = 0; c < 0x200; c += 16) + { + uint8 *block = &Memory.ROM[(map & 7) * 0x100000 + (c << 11) - 0x8000]; + for (int i = c + 8; i < c + 16; i++) + Memory.Map[start2 + i] = SA1.Map[start2 + i] = block; + } +} + +uint8 S9xGetSA1 (uint32 address) +{ + switch (address) + { + case 0x2300: + return ((uint8) ((Memory.FillRAM[0x2209] & 0x5f) | (CPU.IRQActive & (SA1_IRQ_SOURCE | SA1_DMA_IRQ_SOURCE)))); + + case 0x2301: + return ((Memory.FillRAM[0x2200] & 0xf) | (Memory.FillRAM[0x2301] & 0xf0)); + + case 0x2306: + return ((uint8) SA1.sum); + + case 0x2307: + return ((uint8) (SA1.sum >> 8)); + + case 0x2308: + return ((uint8) (SA1.sum >> 16)); + + case 0x2309: + return ((uint8) (SA1.sum >> 24)); + + case 0x230a: + return ((uint8) (SA1.sum >> 32)); + + case 0x230c: + return (Memory.FillRAM[0x230c]); + + case 0x230d: + { + uint8 byte = Memory.FillRAM[0x230d]; + + if (Memory.FillRAM[0x2258] & 0x80) + S9xSA1ReadVariableLengthData(TRUE, FALSE); + + return (byte); + } + + default: + //printf("R: %04x\n", address); + break; + } + + return (Memory.FillRAM[address]); +} + +void S9xSetSA1 (uint8 byte, uint32 address) +{ + switch (address) + { + case 0x2200: + SA1.Waiting = (byte & 0x60) != 0; + //SA1.Executing = !SA1.Waiting && SA1.S9xOpcodes; + + if (!(byte & 0x20) && (Memory.FillRAM[0x2200] & 0x20)) + S9xSA1Reset(); + + if (byte & 0x80) + { + Memory.FillRAM[0x2301] |= 0x80; + if (Memory.FillRAM[0x220a] & 0x80) + { + SA1.Flags |= IRQ_FLAG; + SA1.IRQActive |= SNES_IRQ_SOURCE; + SA1.Executing = !SA1.Waiting && SA1.S9xOpcodes; + } + } + + if (byte & 0x10) + { + Memory.FillRAM[0x2301] |= 0x10; + if (Memory.FillRAM[0x220a] & 0x10) + { + SA1.Flags |= NMI_FLAG; + SA1.Executing = !SA1.Waiting && SA1.S9xOpcodes; + } + } + + break; + + case 0x2201: + if (((byte ^ Memory.FillRAM[0x2201]) & 0x80) && (Memory.FillRAM[0x2300] & byte & 0x80)) + S9xSetIRQ(SA1_IRQ_SOURCE); + + if (((byte ^ Memory.FillRAM[0x2201]) & 0x20) && (Memory.FillRAM[0x2300] & byte & 0x20)) + S9xSetIRQ(SA1_DMA_IRQ_SOURCE); + + break; + + case 0x2202: + if (byte & 0x80) + { + Memory.FillRAM[0x2300] &= ~0x80; + S9xClearIRQ(SA1_IRQ_SOURCE); + } + + if (byte & 0x20) + { + Memory.FillRAM[0x2300] &= ~0x20; + S9xClearIRQ(SA1_DMA_IRQ_SOURCE); + } + + break; + + case 0x2203: + //printf("SA1 reset vector: %04x\n", byte | (Memory.FillRAM[0x2204] << 8)); + break; + + case 0x2204: + //printf("SA1 reset vector: %04x\n", (byte << 8) | Memory.FillRAM[0x2203]); + break; + + case 0x2205: + //printf("SA1 NMI vector: %04x\n", byte | (Memory.FillRAM[0x2206] << 8)); + break; + + case 0x2206: + //printf("SA1 NMI vector: %04x\n", (byte << 8) | Memory.FillRAM[0x2205]); + break; + + case 0x2207: + //printf("SA1 IRQ vector: %04x\n", byte | (Memory.FillRAM[0x2208] << 8)); + break; + + case 0x2208: + //printf("SA1 IRQ vector: %04x\n", (byte << 8) | Memory.FillRAM[0x2207]); + break; + + case 0x2209: + Memory.FillRAM[0x2209] = byte; + + if (byte & 0x80) + Memory.FillRAM[0x2300] |= 0x80; + + if (byte & Memory.FillRAM[0x2201] & 0x80) + S9xSetIRQ(SA1_IRQ_SOURCE); + + break; + + case 0x220a: + if (((byte ^ Memory.FillRAM[0x220a]) & 0x80) && (Memory.FillRAM[0x2301] & byte & 0x80)) + { + SA1.Flags |= IRQ_FLAG; + SA1.IRQActive |= SNES_IRQ_SOURCE; + //SA1.Executing = !SA1.Waiting; + } + + if (((byte ^ Memory.FillRAM[0x220a]) & 0x40) && (Memory.FillRAM[0x2301] & byte & 0x40)) + { + SA1.Flags |= IRQ_FLAG; + SA1.IRQActive |= TIMER_IRQ_SOURCE; + //SA1.Executing = !SA1.Waiting; + } + + if (((byte ^ Memory.FillRAM[0x220a]) & 0x20) && (Memory.FillRAM[0x2301] & byte & 0x20)) + { + SA1.Flags |= IRQ_FLAG; + SA1.IRQActive |= DMA_IRQ_SOURCE; + //SA1.Executing = !SA1.Waiting; + } + + if (((byte ^ Memory.FillRAM[0x220a]) & 0x10) && (Memory.FillRAM[0x2301] & byte & 0x10)) + { + SA1.Flags |= NMI_FLAG; + //SA1.Executing = !SA1.Waiting; + } + + break; + + case 0x220b: + if (byte & 0x80) + { + SA1.IRQActive &= ~SNES_IRQ_SOURCE; + Memory.FillRAM[0x2301] &= ~0x80; + } + + if (byte & 0x40) + { + SA1.IRQActive &= ~TIMER_IRQ_SOURCE; + Memory.FillRAM[0x2301] &= ~0x40; + } + + if (byte & 0x20) + { + SA1.IRQActive &= ~DMA_IRQ_SOURCE; + Memory.FillRAM[0x2301] &= ~0x20; + } + + if (byte & 0x10) + Memory.FillRAM[0x2301] &= ~0x10; + + if (!SA1.IRQActive) + SA1.Flags &= ~IRQ_FLAG; + + break; + + case 0x220c: + //printf("SNES NMI vector: %04x\n", byte | (Memory.FillRAM[0x220d] << 8)); + break; + + case 0x220d: + //printf("SNES NMI vector: %04x\n", (byte << 8) | Memory.FillRAM[0x220c]); + break; + + case 0x220e: + //printf("SNES IRQ vector: %04x\n", byte | (Memory.FillRAM[0x220f] << 8)); + break; + + case 0x220f: + //printf("SNES IRQ vector: %04x\n", (byte << 8) | Memory.FillRAM[0x220e]); + break; + + case 0x2210: + #if 0 + printf("Timer %s\n", (byte & 0x80) ? "linear" : "HV"); + printf("Timer H-IRQ %s\n", (byte & 1) ? "enabled" : "disabled"); + printf("Timer V-IRQ %s\n", (byte & 2) ? "enabled" : "disabled"); + #endif + break; + + case 0x2211: + //printf("Timer reset\n"); + break; + + case 0x2212: + //printf("H-Timer %04x\n", byte | (Memory.FillRAM[0x2213] << 8)); + break; + + case 0x2213: + //printf("H-Timer %04x\n", (byte << 8) | Memory.FillRAM[0x2212]); + break; + + case 0x2214: + //printf("V-Timer %04x\n", byte | (Memory.FillRAM[0x2215] << 8)); + break; + + case 0x2215: + //printf("V-Timer %04x\n", (byte << 8) | Memory.FillRAM[0x2214]); + break; + + case 0x2220: + case 0x2221: + case 0x2222: + case 0x2223: + //printf("MMC: %02x\n", byte); + S9xSetSA1MemMap(address - 0x2220, byte); + break; + + case 0x2224: + //printf("BWRAM image SNES %02x -> 0x6000\n", byte); + Memory.BWRAM = Memory.SRAM + (byte & 7) * 0x2000; + break; + + case 0x2225: + //printf("BWRAM image SA1 %02x -> 0x6000 (%02x)\n", byte, Memory.FillRAM[0x2225]); + if (byte != Memory.FillRAM[0x2225]) + S9xSA1SetBWRAMMemMap(byte); + break; + + case 0x2226: + //printf("BW-RAM SNES write %s\n", (byte & 0x80) ? "enabled" : "disabled"); + break; + + case 0x2227: + //printf("BW-RAM SA1 write %s\n", (byte & 0x80) ? "enabled" : "disabled"); + break; + + case 0x2228: + //printf("BW-RAM write protect area %02x\n", byte); + break; + + case 0x2229: + //printf("I-RAM SNES write protect area %02x\n", byte); + break; + + case 0x222a: + //printf("I-RAM SA1 write protect area %02x\n", byte); + break; + + case 0x2230: + #if 0 + printf("SA1 DMA %s\n", (byte & 0x80) ? "enabled" : "disabled"); + printf("DMA priority %s\n", (byte & 0x40) ? "DMA" : "SA1"); + printf("DMA %s\n", (byte & 0x20) ? "char conv" : "normal"); + printf("DMA type %s\n", (byte & 0x10) ? "BW-RAM -> I-RAM" : "SA1 -> I-RAM"); + printf("DMA distination %s\n", (byte & 4) ? "BW-RAM" : "I-RAM"); + printf("DMA source %s\n", DMAsource[byte & 3]); + #endif + break; + + case 0x2231: + if (byte & 0x80) + SA1.in_char_dma = FALSE; + #if 0 + printf("CHDEND %s\n", (byte & 0x80) ? "complete" : "incomplete"); + printf("DMA colour mode %d\n", byte & 3); + printf("virtual VRAM width %d\n", (byte >> 2) & 7); + #endif + break; + + case 0x2232: + case 0x2233: + case 0x2234: + Memory.FillRAM[address] = byte; + #if 0 + printf("DMA source start %06x\n", Memory.FillRAM[0x2232] | (Memory.FillRAM[0x2233] << 8) | (Memory.FillRAM[0x2234] << 16)); + #endif + break; + + case 0x2235: + Memory.FillRAM[0x2235] = byte; + break; + + case 0x2236: + Memory.FillRAM[0x2236] = byte; + + if ((Memory.FillRAM[0x2230] & 0xa4) == 0x80) // Normal DMA to I-RAM + S9xSA1DMA(); + else + if ((Memory.FillRAM[0x2230] & 0xb0) == 0xb0) + { + Memory.FillRAM[0x2300] |= 0x20; + if (Memory.FillRAM[0x2201] & 0x20) + S9xSetIRQ(SA1_DMA_IRQ_SOURCE); + SA1.in_char_dma = TRUE; + } + + break; + + case 0x2237: + Memory.FillRAM[0x2237] = byte; + + if ((Memory.FillRAM[0x2230] & 0xa4) == 0x84) // Normal DMA to BW-RAM + S9xSA1DMA(); + #if 0 + printf("DMA dest address %06x\n", Memory.FillRAM[0x2235] | (Memory.FillRAM[0x2236] << 8) | (Memory.FillRAM[0x2237] << 16)); + #endif + break; + + case 0x2238: + case 0x2239: + Memory.FillRAM[address] = byte; + #if 0 + printf("DMA length %04x\n", Memory.FillRAM[0x2238] | (Memory.FillRAM[0x2239] << 8)); + #endif + break; + + case 0x223f: + //printf("virtual VRAM depth %d\n", (byte & 0x80) ? 2 : 4); + SA1.VirtualBitmapFormat = (byte & 0x80) ? 2 : 4; + break; + + case 0x2240: + case 0x2241: + case 0x2242: + case 0x2243: + case 0x2244: + case 0x2245: + case 0x2246: + case 0x2247: + case 0x2248: + case 0x2249: + case 0x224a: + case 0x224b: + case 0x224c: + case 0x224d: + case 0x224e: + #if 0 + if (!(SA1.Flags & TRACE_FLAG)) + { + TraceSA1(); + Trace(); + } + #endif + Memory.FillRAM[address] = byte; + break; + + case 0x224f: + Memory.FillRAM[0x224f] = byte; + + if ((Memory.FillRAM[0x2230] & 0xb0) == 0xa0) // Char conversion 2 DMA enabled + { + memmove(&Memory.ROM[CMemory::MAX_ROM_SIZE - 0x10000] + SA1.in_char_dma * 16, &Memory.FillRAM[0x2240], 16); + SA1.in_char_dma = (SA1.in_char_dma + 1) & 7; + if ((SA1.in_char_dma & 3) == 0) + S9xSA1CharConv2(); + } + + break; + + case 0x2250: + if (byte & 2) + SA1.sum = 0; + SA1.arithmetic_op = byte & 3; + break; + + case 0x2251: + SA1.op1 = (SA1.op1 & 0xff00) | byte; + break; + + case 0x2252: + SA1.op1 = (SA1.op1 & 0xff) | (byte << 8); + break; + + case 0x2253: + SA1.op2 = (SA1.op2 & 0xff00) | byte; + break; + + case 0x2254: + SA1.op2 = (SA1.op2 & 0xff) | (byte << 8); + + switch (SA1.arithmetic_op) + { + case 0: // multiply + SA1.sum = SA1.op1 * SA1.op2; + break; + + case 1: // divide + if (SA1.op2 == 0) + SA1.sum = SA1.op1 << 16; + else + SA1.sum = (SA1.op1 / (int) ((uint16) SA1.op2)) | ((SA1.op1 % (int) ((uint16) SA1.op2)) << 16); + break; + + case 2: // cumulative sum + default: + SA1.sum += SA1.op1 * SA1.op2; + if (SA1.sum & ((int64) 0xffffff << 32)) + SA1.overflow = TRUE; + break; + } + + break; + + case 0x2258: // Variable bit-field length/auto inc/start. + Memory.FillRAM[0x2258] = byte; + S9xSA1ReadVariableLengthData(TRUE, FALSE); + return; + + case 0x2259: // Variable bit-field start address + case 0x225a: + case 0x225b: + Memory.FillRAM[address] = byte; + // XXX: ??? + SA1.variable_bit_pos = 0; + S9xSA1ReadVariableLengthData(FALSE, TRUE); + return; + + default: + //printf("W: %02x->%04x\n", byte, address); + break; + } + + if (address >= 0x2200 && address <= 0x22ff) + Memory.FillRAM[address] = byte; +} + +static void S9xSA1CharConv2 (void) +{ + uint32 dest = Memory.FillRAM[0x2235] | (Memory.FillRAM[0x2236] << 8); + uint32 offset = (SA1.in_char_dma & 7) ? 0 : 1; + int depth = (Memory.FillRAM[0x2231] & 3) == 0 ? 8 : (Memory.FillRAM[0x2231] & 3) == 1 ? 4 : 2; + int bytes_per_char = 8 * depth; + uint8 *p = &Memory.FillRAM[0x3000] + (dest & 0x7ff) + offset * bytes_per_char; + uint8 *q = &Memory.ROM[CMemory::MAX_ROM_SIZE - 0x10000] + offset * 64; + + switch (depth) + { + case 2: + for (int l = 0; l < 8; l++, q += 8) + { + for (int b = 0; b < 8; b++) + { + uint8 r = *(q + b); + *(p + 0) = (*(p + 0) << 1) | ((r >> 0) & 1); + *(p + 1) = (*(p + 1) << 1) | ((r >> 1) & 1); + } + + p += 2; + } + + break; + + case 4: + for (int l = 0; l < 8; l++, q += 8) + { + for (int b = 0; b < 8; b++) + { + uint8 r = *(q + b); + *(p + 0) = (*(p + 0) << 1) | ((r >> 0) & 1); + *(p + 1) = (*(p + 1) << 1) | ((r >> 1) & 1); + *(p + 16) = (*(p + 16) << 1) | ((r >> 2) & 1); + *(p + 17) = (*(p + 17) << 1) | ((r >> 3) & 1); + } + + p += 2; + } + + break; + + case 8: + for (int l = 0; l < 8; l++, q += 8) + { + for (int b = 0; b < 8; b++) + { + uint8 r = *(q + b); + *(p + 0) = (*(p + 0) << 1) | ((r >> 0) & 1); + *(p + 1) = (*(p + 1) << 1) | ((r >> 1) & 1); + *(p + 16) = (*(p + 16) << 1) | ((r >> 2) & 1); + *(p + 17) = (*(p + 17) << 1) | ((r >> 3) & 1); + *(p + 32) = (*(p + 32) << 1) | ((r >> 4) & 1); + *(p + 33) = (*(p + 33) << 1) | ((r >> 5) & 1); + *(p + 48) = (*(p + 48) << 1) | ((r >> 6) & 1); + *(p + 49) = (*(p + 49) << 1) | ((r >> 7) & 1); + } + + p += 2; + } + + break; + } +} + +static void S9xSA1DMA (void) +{ + uint32 src = Memory.FillRAM[0x2232] | (Memory.FillRAM[0x2233] << 8) | (Memory.FillRAM[0x2234] << 16); + uint32 dst = Memory.FillRAM[0x2235] | (Memory.FillRAM[0x2236] << 8) | (Memory.FillRAM[0x2237] << 16); + uint32 len = Memory.FillRAM[0x2238] | (Memory.FillRAM[0x2239] << 8); + uint8 *s, *d; + + switch (Memory.FillRAM[0x2230] & 3) + { + case 0: // ROM + s = SA1.Map[((src & 0xffffff) >> MEMMAP_SHIFT)]; + if (s >= (uint8 *) CMemory::MAP_LAST) + s += (src & 0xffff); + else + s = Memory.ROM + (src & 0xffff); + break; + + case 1: // BW-RAM + src &= Memory.SRAMMask; + len &= Memory.SRAMMask; + s = Memory.SRAM + src; + break; + + default: + case 2: + src &= 0x3ff; + len &= 0x3ff; + s = &Memory.FillRAM[0x3000] + src; + break; + } + + if (Memory.FillRAM[0x2230] & 4) + { + dst &= Memory.SRAMMask; + len &= Memory.SRAMMask; + d = Memory.SRAM + dst; + } + else + { + dst &= 0x3ff; + len &= 0x3ff; + d = &Memory.FillRAM[0x3000] + dst; + } + + memmove(d, s, len); + Memory.FillRAM[0x2301] |= 0x20; + + if (Memory.FillRAM[0x220a] & 0x20) + { + SA1.Flags |= IRQ_FLAG; + SA1.IRQActive |= DMA_IRQ_SOURCE; + //SA1.Executing = !SA1.Waiting; + } +} + +static void S9xSA1ReadVariableLengthData (bool8 inc, bool8 no_shift) +{ + uint32 addr = Memory.FillRAM[0x2259] | (Memory.FillRAM[0x225a] << 8) | (Memory.FillRAM[0x225b] << 16); + uint8 shift = Memory.FillRAM[0x2258] & 15; + + if (no_shift) + shift = 0; + else + if (shift == 0) + shift = 16; + + uint8 s = shift + SA1.variable_bit_pos; + + if (s >= 16) + { + addr += (s >> 4) << 1; + s &= 15; + } + + uint32 data = S9xSA1GetWord(addr) | (S9xSA1GetWord(addr + 2) << 16); + + data >>= s; + Memory.FillRAM[0x230c] = (uint8) data; + Memory.FillRAM[0x230d] = (uint8) (data >> 8); + + if (inc) + { + SA1.variable_bit_pos = (SA1.variable_bit_pos + shift) & 15; + Memory.FillRAM[0x2259] = (uint8) addr; + Memory.FillRAM[0x225a] = (uint8) (addr >> 8); + Memory.FillRAM[0x225b] = (uint8) (addr >> 16); + } +} + +uint8 S9xSA1GetByte (uint32 address) +{ + uint8 *GetAddress = SA1.Map[(address & 0xffffff) >> MEMMAP_SHIFT]; + + if (GetAddress >= (uint8 *) CMemory::MAP_LAST) + return (*(GetAddress + (address & 0xffff))); + + switch ((pint) GetAddress) + { + case CMemory::MAP_PPU: + return (S9xGetSA1(address & 0xffff)); + + case CMemory::MAP_LOROM_SRAM: + case CMemory::MAP_SA1RAM: + return (*(Memory.SRAM + (address & 0xffff))); + + case CMemory::MAP_BWRAM: + return (*(SA1.BWRAM + ((address & 0x7fff) - 0x6000))); + + case CMemory::MAP_BWRAM_BITMAP: + address -= 0x600000; + if (SA1.VirtualBitmapFormat == 2) + return ((Memory.SRAM[(address >> 2) & 0xffff] >> ((address & 3) << 1)) & 3); + else + return ((Memory.SRAM[(address >> 1) & 0xffff] >> ((address & 1) << 2)) & 15); + + case CMemory::MAP_BWRAM_BITMAP2: + address = (address & 0xffff) - 0x6000; + if (SA1.VirtualBitmapFormat == 2) + return ((SA1.BWRAM[(address >> 2) & 0xffff] >> ((address & 3) << 1)) & 3); + else + return ((SA1.BWRAM[(address >> 1) & 0xffff] >> ((address & 1) << 2)) & 15); + + default: + return (SA1OpenBus); + } +} + +uint16 S9xSA1GetWord (uint32 address, s9xwrap_t w) +{ + PC_t a; + + SA1OpenBus = S9xSA1GetByte(address); + + switch (w) + { + case WRAP_PAGE: + a.xPBPC = address; + a.B.xPCl++; + return (SA1OpenBus | (S9xSA1GetByte(a.xPBPC) << 8)); + + case WRAP_BANK: + a.xPBPC = address; + a.W.xPC++; + return (SA1OpenBus | (S9xSA1GetByte(a.xPBPC) << 8)); + + case WRAP_NONE: + default: + return (SA1OpenBus | (S9xSA1GetByte(address + 1) << 8)); + } +} + +void S9xSA1SetByte (uint8 byte, uint32 address) +{ + uint8 *SetAddress = SA1.WriteMap[(address & 0xffffff) >> MEMMAP_SHIFT]; + + if (SetAddress >= (uint8 *) CMemory::MAP_LAST) + { + *(SetAddress + (address & 0xffff)) = byte; + return; + } + + switch ((pint) SetAddress) + { + case CMemory::MAP_PPU: + S9xSetSA1(byte, address & 0xffff); + return; + + case CMemory::MAP_LOROM_SRAM: + case CMemory::MAP_SA1RAM: + *(Memory.SRAM + (address & 0xffff)) = byte; + return; + + case CMemory::MAP_BWRAM: + *(SA1.BWRAM + ((address & 0x7fff) - 0x6000)) = byte; + return; + + case CMemory::MAP_BWRAM_BITMAP: + address -= 0x600000; + if (SA1.VirtualBitmapFormat == 2) + { + uint8 *ptr = &Memory.SRAM[(address >> 2) & 0xffff]; + *ptr &= ~(3 << ((address & 3) << 1)); + *ptr |= (byte & 3) << ((address & 3) << 1); + } + else + { + uint8 *ptr = &Memory.SRAM[(address >> 1) & 0xffff]; + *ptr &= ~(15 << ((address & 1) << 2)); + *ptr |= (byte & 15) << ((address & 1) << 2); + } + + return; + + case CMemory::MAP_BWRAM_BITMAP2: + address = (address & 0xffff) - 0x6000; + if (SA1.VirtualBitmapFormat == 2) + { + uint8 *ptr = &SA1.BWRAM[(address >> 2) & 0xffff]; + *ptr &= ~(3 << ((address & 3) << 1)); + *ptr |= (byte & 3) << ((address & 3) << 1); + } + else + { + uint8 *ptr = &SA1.BWRAM[(address >> 1) & 0xffff]; + *ptr &= ~(15 << ((address & 1) << 2)); + *ptr |= (byte & 15) << ((address & 1) << 2); + } + + return; + + default: + return; + } +} + +void S9xSA1SetWord (uint16 Word, uint32 address, enum s9xwrap_t w, enum s9xwriteorder_t o) +{ + PC_t a; + + if (!o) + S9xSA1SetByte((uint8) Word, address); + + switch (w) + { + case WRAP_PAGE: + a.xPBPC = address; + a.B.xPCl++; + S9xSA1SetByte(Word >> 8, a.xPBPC); + break; + + case WRAP_BANK: + a.xPBPC = address; + a.W.xPC++; + S9xSA1SetByte(Word >> 8, a.xPBPC); + break; + + case WRAP_NONE: + default: + S9xSA1SetByte(Word >> 8, address + 1); + break; + } + + if (o) + S9xSA1SetByte((uint8) Word, address); +} + +void S9xSA1SetPCBase (uint32 address) +{ + SA1Registers.PBPC = address & 0xffffff; + SA1.ShiftedPB = address & 0xff0000; + + uint8 *GetAddress = SA1.Map[(address & 0xffffff) >> MEMMAP_SHIFT]; + + if (GetAddress >= (uint8 *) CMemory::MAP_LAST) + { + SA1.PCBase = GetAddress; + return; + } + + switch ((pint) GetAddress) + { + case CMemory::MAP_LOROM_SRAM: + if ((Memory.SRAMMask & MEMMAP_MASK) != MEMMAP_MASK) + SA1.PCBase = NULL; + else + SA1.PCBase = (Memory.SRAM + ((((address & 0xff0000) >> 1) | (address & 0x7fff)) & Memory.SRAMMask)) - (address & 0xffff); + return; + + case CMemory::MAP_HIROM_SRAM: + if ((Memory.SRAMMask & MEMMAP_MASK) != MEMMAP_MASK) + SA1.PCBase = NULL; + else + SA1.PCBase = (Memory.SRAM + (((address & 0x7fff) - 0x6000 + ((address & 0xf0000) >> 3)) & Memory.SRAMMask)) - (address & 0xffff); + return; + + case CMemory::MAP_BWRAM: + SA1.PCBase = SA1.BWRAM - 0x6000 - (address & 0x8000); + return; + + case CMemory::MAP_SA1RAM: + SA1.PCBase = Memory.SRAM; + return; + + default: + SA1.PCBase = NULL; + return; + } +} + diff --git a/plugins/snes9x_gx/source/snes9x/sa1.h b/plugins/snes9x_gx/source/snes9x/sa1.h new file mode 100644 index 00000000..7849c8c8 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/sa1.h @@ -0,0 +1,323 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _SA1_H_ +#define _SA1_H_ + +struct SSA1Registers +{ + uint8 DB; + pair P; + pair A; + pair D; + pair S; + pair X; + pair Y; + PC_t PC; +}; + +struct SSA1 +{ + struct SOpcodes *S9xOpcodes; + uint8 *S9xOpLengths; + uint8 _Carry; + uint8 _Zero; + uint8 _Negative; + uint8 _Overflow; + bool8 CPUExecuting; + uint32 ShiftedPB; + uint32 ShiftedDB; + + uint32 Flags; + uint8 *PCBase; + bool8 IRQActive; + bool8 Waiting; + bool8 WaitingForInterrupt; + uint32 WaitAddress; + uint32 WaitCounter; + uint32 PBPCAtOpcodeStart; + uint8 *WaitByteAddress1; + uint8 *WaitByteAddress2; + + uint8 *Map[MEMMAP_NUM_BLOCKS]; + uint8 *WriteMap[MEMMAP_NUM_BLOCKS]; + uint8 *BWRAM; + + bool8 Executing; + bool8 overflow; + bool8 in_char_dma; + int16 op1; + int16 op2; + int32 arithmetic_op; + int64 sum; + uint8 VirtualBitmapFormat; + uint8 variable_bit_pos; +}; + +#define SA1CheckCarry() (SA1._Carry) +#define SA1CheckZero() (SA1._Zero == 0) +#define SA1CheckIRQ() (SA1Registers.PL & IRQ) +#define SA1CheckDecimal() (SA1Registers.PL & Decimal) +#define SA1CheckIndex() (SA1Registers.PL & IndexFlag) +#define SA1CheckMemory() (SA1Registers.PL & MemoryFlag) +#define SA1CheckOverflow() (SA1._Overflow) +#define SA1CheckNegative() (SA1._Negative & 0x80) +#define SA1CheckEmulation() (SA1Registers.P.W & Emulation) + +#define SA1SetFlags(f) (SA1Registers.P.W |= (f)) +#define SA1ClearFlags(f) (SA1Registers.P.W &= ~(f)) +#define SA1CheckFlag(f) (SA1Registers.PL & (f)) + +extern struct SSA1Registers SA1Registers; +extern struct SSA1 SA1; +extern uint8 SA1OpenBus; +extern struct SOpcodes S9xSA1OpcodesM1X1[256]; +extern struct SOpcodes S9xSA1OpcodesM1X0[256]; +extern struct SOpcodes S9xSA1OpcodesM0X1[256]; +extern struct SOpcodes S9xSA1OpcodesM0X0[256]; +extern uint8 S9xOpLengthsM1X1[256]; +extern uint8 S9xOpLengthsM1X0[256]; +extern uint8 S9xOpLengthsM0X1[256]; +extern uint8 S9xOpLengthsM0X0[256]; + +uint8 S9xSA1GetByte (uint32); +void S9xSA1SetByte (uint8, uint32); +uint16 S9xSA1GetWord (uint32, enum s9xwrap_t w = WRAP_NONE); +void S9xSA1SetWord (uint16, uint32, enum s9xwrap_t w = WRAP_NONE, enum s9xwriteorder_t o = WRITE_01); +void S9xSA1SetPCBase (uint32); +uint8 S9xGetSA1 (uint32); +void S9xSetSA1 (uint8, uint32); +void S9xSA1Init (void); +void S9xSA1MainLoop (void); +void S9xSA1ExecuteDuringSleep (void); +void S9xSA1PostLoadState (void); + +#define SNES_IRQ_SOURCE (1 << 7) +#define TIMER_IRQ_SOURCE (1 << 6) +#define DMA_IRQ_SOURCE (1 << 5) + +static inline void S9xSA1UnpackStatus (void) +{ + SA1._Zero = (SA1Registers.PL & Zero) == 0; + SA1._Negative = (SA1Registers.PL & Negative); + SA1._Carry = (SA1Registers.PL & Carry); + SA1._Overflow = (SA1Registers.PL & Overflow) >> 6; +} + +static inline void S9xSA1PackStatus (void) +{ + SA1Registers.PL &= ~(Zero | Negative | Carry | Overflow); + SA1Registers.PL |= SA1._Carry | ((SA1._Zero == 0) << 1) | (SA1._Negative & 0x80) | (SA1._Overflow << 6); +} + +static inline void S9xSA1FixCycles (void) +{ + if (SA1CheckEmulation()) + { + SA1.S9xOpcodes = S9xSA1OpcodesM1X1; + SA1.S9xOpLengths = S9xOpLengthsM1X1; + } + else + if (SA1CheckMemory()) + { + if (SA1CheckIndex()) + { + SA1.S9xOpcodes = S9xSA1OpcodesM1X1; + SA1.S9xOpLengths = S9xOpLengthsM1X1; + } + else + { + SA1.S9xOpcodes = S9xSA1OpcodesM1X0; + SA1.S9xOpLengths = S9xOpLengthsM1X0; + } + } + else + { + if (SA1CheckIndex()) + { + SA1.S9xOpcodes = S9xSA1OpcodesM0X1; + SA1.S9xOpLengths = S9xOpLengthsM0X1; + } + else + { + SA1.S9xOpcodes = S9xSA1OpcodesM0X0; + SA1.S9xOpLengths = S9xOpLengthsM0X0; + } + } +} + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/sa1cpu.cpp b/plugins/snes9x_gx/source/snes9x/sa1cpu.cpp new file mode 100644 index 00000000..e5093617 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/sa1cpu.cpp @@ -0,0 +1,303 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#include "snes9x.h" +#include "memmap.h" + +#define CPU SA1 +#define ICPU SA1 +#define Registers SA1Registers +#define OpenBus SA1OpenBus +#define S9xGetByte S9xSA1GetByte +#define S9xGetWord S9xSA1GetWord +#define S9xSetByte S9xSA1SetByte +#define S9xSetWord S9xSA1SetWord +#define S9xSetPCBase S9xSA1SetPCBase +#define S9xOpcodesM1X1 S9xSA1OpcodesM1X1 +#define S9xOpcodesM1X0 S9xSA1OpcodesM1X0 +#define S9xOpcodesM0X1 S9xSA1OpcodesM0X1 +#define S9xOpcodesM0X0 S9xSA1OpcodesM0X0 +#define S9xOpcodesE1 S9xSA1OpcodesE1 +#define S9xOpcodesSlow S9xSA1OpcodesSlow +#define S9xOpcode_IRQ S9xSA1Opcode_IRQ +#define S9xOpcode_NMI S9xSA1Opcode_NMI +#define S9xUnpackStatus S9xSA1UnpackStatus +#define S9xPackStatus S9xSA1PackStatus +#define S9xFixCycles S9xSA1FixCycles +#define Immediate8 SA1Immediate8 +#define Immediate16 SA1Immediate16 +#define Relative SA1Relative +#define RelativeLong SA1RelativeLong +#define Absolute SA1Absolute +#define AbsoluteLong SA1AbsoluteLong +#define AbsoluteIndirect SA1AbsoluteIndirect +#define AbsoluteIndirectLong SA1AbsoluteIndirectLong +#define AbsoluteIndexedIndirect SA1AbsoluteIndexedIndirect +#define Direct SA1Direct +#define DirectIndirectIndexed SA1DirectIndirectIndexed +#define DirectIndirectIndexedLong SA1DirectIndirectIndexedLong +#define DirectIndexedIndirect SA1DirectIndexedIndirect +#define DirectIndexedX SA1DirectIndexedX +#define DirectIndexedY SA1DirectIndexedY +#define AbsoluteIndexedX SA1AbsoluteIndexedX +#define AbsoluteIndexedY SA1AbsoluteIndexedY +#define AbsoluteLongIndexedX SA1AbsoluteLongIndexedX +#define DirectIndirect SA1DirectIndirect +#define DirectIndirectLong SA1DirectIndirectLong +#define StackRelative SA1StackRelative +#define StackRelativeIndirectIndexed SA1StackRelativeIndirectIndexed + +//#undef CPU_SHUTDOWN +#define SA1_OPCODES + +#include "cpuops.cpp" + + +void S9xSA1MainLoop (void) +{ + if (SA1.Flags & NMI_FLAG) + { + if (Memory.FillRAM[0x2200] & 0x10) + { + SA1.Flags &= ~NMI_FLAG; + Memory.FillRAM[0x2301] |= 0x10; + + if (SA1.WaitingForInterrupt) + { + SA1.WaitingForInterrupt = FALSE; + SA1Registers.PCw++; + } + + S9xSA1Opcode_NMI(); + } + } + + if (SA1.Flags & IRQ_FLAG) + { + if (SA1.IRQActive) + { + if (SA1.WaitingForInterrupt) + { + SA1.WaitingForInterrupt = FALSE; + SA1Registers.PCw++; + } + + if (!SA1CheckFlag(IRQ)) + S9xSA1Opcode_IRQ(); + } + else + SA1.Flags &= ~IRQ_FLAG; + } + + for (int i = 0; i < 3 && SA1.Executing; i++) + { + #ifdef DEBUGGER + if (SA1.Flags & TRACE_FLAG) + S9xSA1Trace(); + #endif + + #ifdef CPU_SHUTDOWN + SA1.PBPCAtOpcodeStart = SA1Registers.PBPC; + #endif + + register uint8 Op; + register struct SOpcodes *Opcodes; + + if (SA1.PCBase) + { + SA1OpenBus = Op = SA1.PCBase[Registers.PCw]; + Opcodes = SA1.S9xOpcodes; + } + else + { + Op = S9xSA1GetByte(Registers.PBPC); + Opcodes = S9xOpcodesSlow; + } + + if ((SA1Registers.PCw & MEMMAP_MASK) + SA1.S9xOpLengths[Op] >= MEMMAP_BLOCK_SIZE) + { + uint32 oldPC = SA1Registers.PBPC; + S9xSA1SetPCBase(SA1Registers.PBPC); + SA1Registers.PBPC = oldPC; + Opcodes = S9xSA1OpcodesSlow; + } + + Registers.PCw++; + (*Opcodes[Op].S9xOpcode)(); + } +} + diff --git a/plugins/snes9x_gx/source/snes9x/sar.h b/plugins/snes9x_gx/source/snes9x/sar.h new file mode 100644 index 00000000..f53de57a --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/sar.h @@ -0,0 +1,223 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _SAR_H_ +#define _SAR_H_ + +#ifdef RIGHTSHIFT_IS_SAR +#define SAR(b, n) ((b) >> (n)) +#else + +static inline int8 SAR (const int8 b, const int n) +{ +#ifndef RIGHTSHIFT_int8_IS_SAR + if (b < 0) + return ((b >> n) | (-1 << (8 - n))); +#endif + return (b >> n); +} + +static inline int16 SAR (const int16 b, const int n) +{ +#ifndef RIGHTSHIFT_int16_IS_SAR + if (b < 0) + return ((b >> n) | (-1 << (16 - n))); +#endif + return (b >> n); +} + +static inline int32 SAR (const int32 b, const int n) +{ +#ifndef RIGHTSHIFT_int32_IS_SAR + if (b < 0) + return ((b >> n) | (-1 << (32 - n))); +#endif + return (b >> n); +} + +static inline int64 SAR (const int64 b, const int n) +{ +#ifndef RIGHTSHIFT_int64_IS_SAR + if (b < 0) + return ((b >> n) | (-1 << (64 - n))); +#endif + return (b >> n); +} + +#endif + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/screenshot.cpp b/plugins/snes9x_gx/source/snes9x/screenshot.cpp new file mode 100644 index 00000000..ec8f7503 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/screenshot.cpp @@ -0,0 +1,315 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifdef HAVE_LIBPNG +#include <png.h> +#endif +#include "snes9x.h" +#include "memmap.h" +#include "display.h" +#include "screenshot.h" + + +bool8 S9xDoScreenshot (int width, int height) +{ + Settings.TakeScreenshot = FALSE; + +#ifdef HAVE_LIBPNG + FILE *fp; + png_structp png_ptr; + png_infop info_ptr; + png_color_8 sig_bit; + int imgwidth, imgheight; + const char *fname; + + fname = S9xGetFilenameInc(".png", SCREENSHOT_DIR); + + fp = fopen(fname, "wb"); + if (!fp) + { + S9xMessage(S9X_ERROR, 0, "Failed to take screenshot."); + return (FALSE); + } + + png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if (!png_ptr) + { + fclose(fp); + remove(fname); + S9xMessage(S9X_ERROR, 0, "Failed to take screenshot."); + return (FALSE); + } + + info_ptr = png_create_info_struct(png_ptr); + if (!info_ptr) + { + png_destroy_write_struct(&png_ptr, (png_infopp) NULL); + fclose(fp); + remove(fname); + S9xMessage(S9X_ERROR, 0, "Failed to take screenshot."); + return (FALSE); + } + + if (setjmp(png_jmpbuf(png_ptr))) + { + png_destroy_write_struct(&png_ptr, &info_ptr); + fclose(fp); + remove(fname); + S9xMessage(S9X_ERROR, 0, "Failed to take screenshot."); + return (FALSE); + } + + imgwidth = width; + imgheight = height; + + if (Settings.StretchScreenshots == 1) + { + if (width > SNES_WIDTH && height <= SNES_HEIGHT_EXTENDED) + imgheight = height << 1; + } + else + if (Settings.StretchScreenshots == 2) + { + if (width <= SNES_WIDTH) + imgwidth = width << 1; + if (height <= SNES_HEIGHT_EXTENDED) + imgheight = height << 1; + } + + png_init_io(png_ptr, fp); + + png_set_IHDR(png_ptr, info_ptr, imgwidth, imgheight, 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); + + sig_bit.red = 5; + sig_bit.green = 5; + sig_bit.blue = 5; + png_set_sBIT(png_ptr, info_ptr, &sig_bit); + png_set_shift(png_ptr, &sig_bit); + + png_write_info(png_ptr, info_ptr); + + png_set_packing(png_ptr); + + png_byte *row_pointer = new png_byte[png_get_rowbytes(png_ptr, info_ptr)]; + uint16 *screen = GFX.Screen; + + for (int y = 0; y < height; y++, screen += GFX.RealPPL) + { + png_byte *rowpix = row_pointer; + + for (int x = 0; x < width; x++) + { + uint32 r, g, b; + + DECOMPOSE_PIXEL(screen[x], r, g, b); + + *(rowpix++) = r; + *(rowpix++) = g; + *(rowpix++) = b; + + if (imgwidth != width) + { + *(rowpix++) = r; + *(rowpix++) = g; + *(rowpix++) = b; + } + } + + png_write_row(png_ptr, row_pointer); + if (imgheight != height) + png_write_row(png_ptr, row_pointer); + } + + delete [] row_pointer; + + png_write_end(png_ptr, info_ptr); + png_destroy_write_struct(&png_ptr, &info_ptr); + + fclose(fp); + + fprintf(stderr, "%s saved.\n", fname); + + const char *base = S9xBasename(fname); + sprintf(String, "Saved screenshot %s", base); + S9xMessage(S9X_INFO, 0, String); + + return (TRUE); +#else + fprintf(stderr, "Screenshot support not available (libpng was not found at build time).\n"); + return (FALSE); +#endif +} diff --git a/plugins/snes9x_gx/source/snes9x/screenshot.h b/plugins/snes9x_gx/source/snes9x/screenshot.h new file mode 100644 index 00000000..6839ba09 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/screenshot.h @@ -0,0 +1,183 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _SCREENSHOT_H_ +#define _SCREENSHOT_H_ + +bool8 S9xDoScreenshot (int, int); + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/sdd1.cpp b/plugins/snes9x_gx/source/snes9x/sdd1.cpp new file mode 100644 index 00000000..40cd4c9b --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/sdd1.cpp @@ -0,0 +1,211 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#include "snes9x.h" +#include "memmap.h" +#include "sdd1.h" +#include "display.h" + + +void S9xSetSDD1MemoryMap (uint32 bank, uint32 value) +{ + bank = 0xc00 + bank * 0x100; + value = value * 1024 * 1024; + + for (int c = 0; c < 0x100; c += 16) + { + uint8 *block = &Memory.ROM[value + (c << 12)]; + for (int i = c; i < c + 16; i++) + Memory.Map[i + bank] = block; + } +} + +void S9xResetSDD1 (void) +{ + memset(&Memory.FillRAM[0x4800], 0, 4); + for (int i = 0; i < 4; i++) + { + Memory.FillRAM[0x4804 + i] = i; + S9xSetSDD1MemoryMap(i, i); + } +} + +void S9xSDD1PostLoadState (void) +{ + for (int i = 0; i < 4; i++) + S9xSetSDD1MemoryMap(i, Memory.FillRAM[0x4804 + i]); +} diff --git a/plugins/snes9x_gx/source/snes9x/sdd1.h b/plugins/snes9x_gx/source/snes9x/sdd1.h new file mode 100644 index 00000000..7419b5ba --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/sdd1.h @@ -0,0 +1,185 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _SDD1_H_ +#define _SDD1_H_ + +void S9xSetSDD1MemoryMap (uint32, uint32); +void S9xResetSDD1 (void); +void S9xSDD1PostLoadState (void); + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/sdd1emu.cpp b/plugins/snes9x_gx/source/snes9x/sdd1emu.cpp new file mode 100644 index 00000000..c4f4d36b --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/sdd1emu.cpp @@ -0,0 +1,503 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + +/* S-DD1 decompressor + * + * Based on code and documentation by Andreas Naive, who deserves a great deal + * of thanks and credit for figuring this out. + * + * Andreas says: + * The author is greatly indebted with The Dumper, without whose help and + * patience providing him with real S-DD1 data the research had never been + * possible. He also wish to note that in the very beggining of his research, + * Neviksti had done some steps in the right direction. By last, the author is + * indirectly indebted to all the people that worked and contributed in the + * S-DD1 issue in the past. + */ + + +#include "port.h" +#include "sdd1emu.h" + +static int valid_bits; +static uint16 in_stream; +static uint8 *in_buf; +static uint8 bit_ctr[8]; +static uint8 context_states[32]; +static int context_MPS[32]; +static int bitplane_type; +static int high_context_bits; +static int low_context_bits; +static int prev_bits[8]; + +static struct { + uint8 code_size; + uint8 MPS_next; + uint8 LPS_next; +} evolution_table[] = { + /* 0 */ { 0,25,25}, + /* 1 */ { 0, 2, 1}, + /* 2 */ { 0, 3, 1}, + /* 3 */ { 0, 4, 2}, + /* 4 */ { 0, 5, 3}, + /* 5 */ { 1, 6, 4}, + /* 6 */ { 1, 7, 5}, + /* 7 */ { 1, 8, 6}, + /* 8 */ { 1, 9, 7}, + /* 9 */ { 2,10, 8}, + /* 10 */ { 2,11, 9}, + /* 11 */ { 2,12,10}, + /* 12 */ { 2,13,11}, + /* 13 */ { 3,14,12}, + /* 14 */ { 3,15,13}, + /* 15 */ { 3,16,14}, + /* 16 */ { 3,17,15}, + /* 17 */ { 4,18,16}, + /* 18 */ { 4,19,17}, + /* 19 */ { 5,20,18}, + /* 20 */ { 5,21,19}, + /* 21 */ { 6,22,20}, + /* 22 */ { 6,23,21}, + /* 23 */ { 7,24,22}, + /* 24 */ { 7,24,23}, + /* 25 */ { 0,26, 1}, + /* 26 */ { 1,27, 2}, + /* 27 */ { 2,28, 4}, + /* 28 */ { 3,29, 8}, + /* 29 */ { 4,30,12}, + /* 30 */ { 5,31,16}, + /* 31 */ { 6,32,18}, + /* 32 */ { 7,24,22} +}; + +static uint8 run_table[128] = { + 128, 64, 96, 32, 112, 48, 80, 16, 120, 56, 88, 24, 104, 40, 72, + 8, 124, 60, 92, 28, 108, 44, 76, 12, 116, 52, 84, 20, 100, 36, + 68, 4, 126, 62, 94, 30, 110, 46, 78, 14, 118, 54, 86, 22, 102, + 38, 70, 6, 122, 58, 90, 26, 106, 42, 74, 10, 114, 50, 82, 18, + 98, 34, 66, 2, 127, 63, 95, 31, 111, 47, 79, 15, 119, 55, 87, + 23, 103, 39, 71, 7, 123, 59, 91, 27, 107, 43, 75, 11, 115, 51, + 83, 19, 99, 35, 67, 3, 125, 61, 93, 29, 109, 45, 77, 13, 117, + 53, 85, 21, 101, 37, 69, 5, 121, 57, 89, 25, 105, 41, 73, 9, + 113, 49, 81, 17, 97, 33, 65, 1 +}; + +static inline uint8 GetCodeword(int bits){ + uint8 tmp; + + if(!valid_bits){ + in_stream|=*(in_buf++); + valid_bits=8; + } + in_stream<<=1; + valid_bits--; + in_stream^=0x8000; + if(in_stream&0x8000) return 0x80+(1<<bits); + tmp=(in_stream>>8) | (0x7f>>bits); + in_stream<<=bits; + valid_bits-=bits; + if(valid_bits<0){ + in_stream |= (*(in_buf++))<<(-valid_bits); + valid_bits+=8; + } + return run_table[tmp]; +} + +static inline uint8 GolombGetBit(int code_size){ + if(!bit_ctr[code_size]) bit_ctr[code_size]=GetCodeword(code_size); + bit_ctr[code_size]--; + if(bit_ctr[code_size]==0x80){ + bit_ctr[code_size]=0; + return 2; /* secret code for 'last zero'. ones are always last. */ + } + return (bit_ctr[code_size]==0)?1:0; +} + +static inline uint8 ProbGetBit(uint8 context){ + uint8 state=context_states[context]; + uint8 bit=GolombGetBit(evolution_table[state].code_size); + + if(bit&1){ + context_states[context]=evolution_table[state].LPS_next; + if(state<2){ + context_MPS[context]^=1; + return context_MPS[context]; /* just inverted, so just return it */ + } else{ + return context_MPS[context]^1; /* we know bit is 1, so use a constant */ + } + } else if(bit){ + context_states[context]=evolution_table[state].MPS_next; + /* zero here, zero there, no difference so drop through. */ + } + return context_MPS[context]; /* we know bit is 0, so don't bother xoring */ +} + +static inline uint8 GetBit(uint8 cur_bitplane){ + uint8 bit; + + bit=ProbGetBit(((cur_bitplane&1)<<4) + | ((prev_bits[cur_bitplane]&high_context_bits)>>5) + | (prev_bits[cur_bitplane]&low_context_bits)); + + prev_bits[cur_bitplane] <<= 1; + prev_bits[cur_bitplane] |= bit; + return bit; +} + +void SDD1_decompress(uint8 *out, uint8 *in, int len){ + uint8 bit, i, plane; + uint8 byte1, byte2; + + if(len==0) len=0x10000; + + bitplane_type=in[0]>>6; + + switch(in[0]&0x30){ + case 0x00: + high_context_bits=0x01c0; + low_context_bits =0x0001; + break; + case 0x10: + high_context_bits=0x0180; + low_context_bits =0x0001; + break; + case 0x20: + high_context_bits=0x00c0; + low_context_bits =0x0001; + break; + case 0x30: + high_context_bits=0x0180; + low_context_bits =0x0003; + break; + } + + in_stream=(in[0]<<11) | (in[1]<<3); + valid_bits=5; + in_buf=in+2; + memset(bit_ctr, 0, sizeof(bit_ctr)); + memset(context_states, 0, sizeof(context_states)); + memset(context_MPS, 0, sizeof(context_MPS)); + memset(prev_bits, 0, sizeof(prev_bits)); + + switch(bitplane_type){ + case 0: + while(1) { + for(byte1=byte2=0, bit=0x80; bit; bit>>=1){ + if(GetBit(0)) byte1 |= bit; + if(GetBit(1)) byte2 |= bit; + } + *(out++)=byte1; + if(!--len) return; + *(out++)=byte2; + if(!--len) return; + } + break; + case 1: + i=plane=0; + while(1) { + for(byte1=byte2=0, bit=0x80; bit; bit>>=1){ + if(GetBit(plane)) byte1 |= bit; + if(GetBit(plane+1)) byte2 |= bit; + } + *(out++)=byte1; + if(!--len) return; + *(out++)=byte2; + if(!--len) return; + if(!(i+=32)) plane = (plane+2)&7; + } + break; + case 2: + i=plane=0; + while(1) { + for(byte1=byte2=0, bit=0x80; bit; bit>>=1){ + if(GetBit(plane)) byte1 |= bit; + if(GetBit(plane+1)) byte2 |= bit; + } + *(out++)=byte1; + if(!--len) return; + *(out++)=byte2; + if(!--len) return; + if(!(i+=32)) plane ^= 2; + } + break; + case 3: + do { + for(byte1=plane=0, bit=1; bit; bit<<=1, plane++){ + if(GetBit(plane)) byte1 |= bit; + } + *(out++)=byte1; + } while(--len); + break; + } +} + +#if 0 +static uint8 cur_plane; +static uint8 num_bits; +static uint8 next_byte; + +void SDD1_init(uint8 *in){ + bitplane_type=in[0]>>6; + + switch(in[0]&0x30){ + case 0x00: + high_context_bits=0x01c0; + low_context_bits =0x0001; + break; + case 0x10: + high_context_bits=0x0180; + low_context_bits =0x0001; + break; + case 0x20: + high_context_bits=0x00c0; + low_context_bits =0x0001; + break; + case 0x30: + high_context_bits=0x0180; + low_context_bits =0x0003; + break; + } + + in_stream=(in[0]<<11) | (in[1]<<3); + valid_bits=5; + in_buf=in+2; + memset(bit_ctr, 0, sizeof(bit_ctr)); + memset(context_states, 0, sizeof(context_states)); + memset(context_MPS, 0, sizeof(context_MPS)); + memset(prev_bits, 0, sizeof(prev_bits)); + + cur_plane=0; + num_bits=0; +} + +uint8 SDD1_get_byte(void){ + uint8 bit; + uint8 byte=0; + + switch(bitplane_type){ + case 0: + num_bits+=16; + if(num_bits&16){ + next_byte=0; + for(bit=0x80; bit; bit>>=1){ + if(GetBit(0)) byte |= bit; + if(GetBit(1)) next_byte |= bit; + } + return byte; + } else { + return next_byte; + } + + case 1: + num_bits+=16; + if(num_bits&16){ + next_byte=0; + for(bit=0x80; bit; bit>>=1){ + if(GetBit(cur_plane)) byte |= bit; + if(GetBit(cur_plane+1)) next_byte |= bit; + } + return byte; + } else { + if(!num_bits) cur_plane = (cur_plane+2)&7; + return next_byte; + } + + case 2: + num_bits+=16; + if(num_bits&16){ + next_byte=0; + for(bit=0x80; bit; bit>>=1){ + if(GetBit(cur_plane)) byte |= bit; + if(GetBit(cur_plane+1)) next_byte |= bit; + } + return byte; + } else { + if(!num_bits) cur_plane ^= 2; + return next_byte; + } + + case 3: + for(cur_plane=0, bit=1; bit; bit<<=1, cur_plane++){ + if(GetBit(cur_plane)) byte |= bit; + } + return byte; + + default: + /* should never happen */ + return 0; + } +} +#endif diff --git a/plugins/snes9x_gx/source/snes9x/sdd1emu.h b/plugins/snes9x_gx/source/snes9x/sdd1emu.h new file mode 100644 index 00000000..5722b4b6 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/sdd1emu.h @@ -0,0 +1,183 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _SDD1EMU_H_ +#define _SDD1EMU_H_ + +void SDD1_decompress (uint8 *, uint8 *, int); + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/seta.cpp b/plugins/snes9x_gx/source/snes9x/seta.cpp new file mode 100644 index 00000000..e7fd24c9 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/seta.cpp @@ -0,0 +1,193 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#include "snes9x.h" +#include "seta.h" + +uint8 (*GetSETA) (uint32) = &S9xGetST010; +void (*SetSETA) (uint32, uint8) = &S9xSetST010; + + +uint8 S9xGetSetaDSP (uint32 Address) +{ + return (GetSETA(Address)); +} + +void S9xSetSetaDSP (uint8 Byte, uint32 Address) +{ + SetSETA (Address, Byte); +} diff --git a/plugins/snes9x_gx/source/snes9x/seta.h b/plugins/snes9x_gx/source/snes9x/seta.h new file mode 100644 index 00000000..ee49097c --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/seta.h @@ -0,0 +1,238 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _SETA_H_ +#define _SETA_H_ + +#define ST_010 0x01 +#define ST_011 0x02 +#define ST_018 0x03 + +struct SST010 +{ + uint8 input_params[16]; + uint8 output_params[16]; + uint8 op_reg; + uint8 execute; + bool8 control_enable; +}; + +struct SST011 +{ + bool8 waiting4command; + uint8 status; + uint8 command; + uint32 in_count; + uint32 in_index; + uint32 out_count; + uint32 out_index; + uint8 parameters[512]; + uint8 output[512]; +}; + +struct SST018 +{ + bool8 waiting4command; + uint8 status; + uint8 part_command; + uint8 pass; + uint32 command; + uint32 in_count; + uint32 in_index; + uint32 out_count; + uint32 out_index; + uint8 parameters[512]; + uint8 output[512]; +}; + +extern struct SST010 ST010; +extern struct SST011 ST011; +extern struct SST018 ST018; + +uint8 S9xGetST010 (uint32); +void S9xSetST010 (uint32, uint8); +uint8 S9xGetST011 (uint32); +void S9xSetST011 (uint32, uint8); +uint8 S9xGetST018 (uint32); +void S9xSetST018 (uint8, uint32); +uint8 S9xGetSetaDSP (uint32); +void S9xSetSetaDSP (uint8, uint32); + +extern uint8 (*GetSETA) (uint32); +extern void (*SetSETA) (uint32, uint8); + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/seta010.cpp b/plugins/snes9x_gx/source/snes9x/seta010.cpp new file mode 100644 index 00000000..45cf8779 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/seta010.cpp @@ -0,0 +1,863 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#include <math.h> +#include "snes9x.h" +#include "memmap.h" +#include "seta.h" + +static const int16 ST010_SinTable[256] = +{ + 0x0000, 0x0324, 0x0648, 0x096a, 0x0c8c, 0x0fab, 0x12c8, 0x15e2, + 0x18f9, 0x1c0b, 0x1f1a, 0x2223, 0x2528, 0x2826, 0x2b1f, 0x2e11, + 0x30fb, 0x33df, 0x36ba, 0x398c, 0x3c56, 0x3f17, 0x41ce, 0x447a, + 0x471c, 0x49b4, 0x4c3f, 0x4ebf, 0x5133, 0x539b, 0x55f5, 0x5842, + 0x5a82, 0x5cb3, 0x5ed7, 0x60eb, 0x62f1, 0x64e8, 0x66cf, 0x68a6, + 0x6a6d, 0x6c23, 0x6dc9, 0x6f5e, 0x70e2, 0x7254, 0x73b5, 0x7504, + 0x7641, 0x776b, 0x7884, 0x7989, 0x7a7c, 0x7b5c, 0x7c29, 0x7ce3, + 0x7d89, 0x7e1d, 0x7e9c, 0x7f09, 0x7f61, 0x7fa6, 0x7fd8, 0x7ff5, + 0x7fff, 0x7ff5, 0x7fd8, 0x7fa6, 0x7f61, 0x7f09, 0x7e9c, 0x7e1d, + 0x7d89, 0x7ce3, 0x7c29, 0x7b5c, 0x7a7c, 0x7989, 0x7884, 0x776b, + 0x7641, 0x7504, 0x73b5, 0x7254, 0x70e2, 0x6f5e, 0x6dc9, 0x6c23, + 0x6a6d, 0x68a6, 0x66cf, 0x64e8, 0x62f1, 0x60eb, 0x5ed7, 0x5cb3, + 0x5a82, 0x5842, 0x55f5, 0x539b, 0x5133, 0x4ebf, 0x4c3f, 0x49b4, + 0x471c, 0x447a, 0x41ce, 0x3f17, 0x3c56, 0x398c, 0x36ba, 0x33df, + 0x30fb, 0x2e11, 0x2b1f, 0x2826, 0x2528, 0x2223, 0x1f1a, 0x1c0b, + 0x18f8, 0x15e2, 0x12c8, 0x0fab, 0x0c8c, 0x096a, 0x0648, 0x0324, + 0x0000, -0x0324, -0x0648, -0x096b, -0x0c8c, -0x0fab, -0x12c8, -0x15e2, + -0x18f9, -0x1c0b, -0x1f1a, -0x2223, -0x2528, -0x2826, -0x2b1f, -0x2e11, + -0x30fb, -0x33df, -0x36ba, -0x398d, -0x3c56, -0x3f17, -0x41ce, -0x447a, + -0x471c, -0x49b4, -0x4c3f, -0x4ebf, -0x5133, -0x539b, -0x55f5, -0x5842, + -0x5a82, -0x5cb3, -0x5ed7, -0x60ec, -0x62f1, -0x64e8, -0x66cf, -0x68a6, + -0x6a6d, -0x6c23, -0x6dc9, -0x6f5e, -0x70e2, -0x7254, -0x73b5, -0x7504, + -0x7641, -0x776b, -0x7884, -0x7989, -0x7a7c, -0x7b5c, -0x7c29, -0x7ce3, + -0x7d89, -0x7e1d, -0x7e9c, -0x7f09, -0x7f61, -0x7fa6, -0x7fd8, -0x7ff5, + -0x7fff, -0x7ff5, -0x7fd8, -0x7fa6, -0x7f61, -0x7f09, -0x7e9c, -0x7e1d, + -0x7d89, -0x7ce3, -0x7c29, -0x7b5c, -0x7a7c, -0x7989, -0x7883, -0x776b, + -0x7641, -0x7504, -0x73b5, -0x7254, -0x70e2, -0x6f5e, -0x6dc9, -0x6c23, + -0x6a6d, -0x68a6, -0x66cf, -0x64e8, -0x62f1, -0x60eb, -0x5ed7, -0x5cb3, + -0x5a82, -0x5842, -0x55f5, -0x539a, -0x5133, -0x4ebf, -0x4c3f, -0x49b3, + -0x471c, -0x447a, -0x41cd, -0x3f17, -0x3c56, -0x398c, -0x36b9, -0x33de, + -0x30fb, -0x2e10, -0x2b1f, -0x2826, -0x2527, -0x2223, -0x1f19, -0x1c0b, + -0x18f8, -0x15e2, -0x12c8, -0x0fab, -0x0c8b, -0x096a, -0x0647, -0x0324 +}; + +static const uint8 ST010_ArcTan[32][32] = +{ + { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 }, + { 0x80, 0xa0, 0xad, 0xb3, 0xb6, 0xb8, 0xb9, 0xba, 0xbb, 0xbb, 0xbc, 0xbc, 0xbd, 0xbd, 0xbd, 0xbd, + 0xbd, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbf, 0xbf, 0xbf, 0xbf }, + { 0x80, 0x93, 0xa0, 0xa8, 0xad, 0xb0, 0xb3, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xb9, 0xba, 0xba, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd }, + { 0x80, 0x8d, 0x98, 0xa0, 0xa6, 0xaa, 0xad, 0xb0, 0xb1, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb7, 0xb8, + 0xb8, 0xb9, 0xb9, 0xba, 0xba, 0xba, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xbc, 0xbc, 0xbc }, + { 0x80, 0x8a, 0x93, 0x9a, 0xa0, 0xa5, 0xa8, 0xab, 0xad, 0xaf, 0xb0, 0xb2, 0xb3, 0xb4, 0xb5, 0xb5, + 0xb6, 0xb7, 0xb7, 0xb8, 0xb8, 0xb8, 0xb9, 0xb9, 0xb9, 0xba, 0xba, 0xba, 0xba, 0xba, 0xbb, 0xbb }, + { 0x80, 0x88, 0x90, 0x96, 0x9b, 0xa0, 0xa4, 0xa7, 0xa9, 0xab, 0xad, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, + 0xb4, 0xb4, 0xb5, 0xb6, 0xb6, 0xb6, 0xb7, 0xb7, 0xb8, 0xb8, 0xb8, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9 }, + { 0x80, 0x87, 0x8d, 0x93, 0x98, 0x9c, 0xa0, 0xa3, 0xa6, 0xa8, 0xaa, 0xac, 0xad, 0xae, 0xb0, 0xb0, + 0xb1, 0xb2, 0xb3, 0xb4, 0xb4, 0xb5, 0xb5, 0xb6, 0xb6, 0xb6, 0xb7, 0xb7, 0xb7, 0xb8, 0xb8, 0xb8 }, + { 0x80, 0x86, 0x8b, 0x90, 0x95, 0x99, 0x9d, 0xa0, 0xa3, 0xa5, 0xa7, 0xa9, 0xaa, 0xac, 0xad, 0xae, + 0xaf, 0xb0, 0xb1, 0xb2, 0xb2, 0xb3, 0xb3, 0xb4, 0xb4, 0xb5, 0xb5, 0xb6, 0xb6, 0xb6, 0xb7, 0xb7 }, + { 0x80, 0x85, 0x8a, 0x8f, 0x93, 0x97, 0x9a, 0x9d, 0xa0, 0xa2, 0xa5, 0xa6, 0xa8, 0xaa, 0xab, 0xac, + 0xad, 0xae, 0xaf, 0xb0, 0xb0, 0xb1, 0xb2, 0xb2, 0xb3, 0xb3, 0xb4, 0xb4, 0xb5, 0xb5, 0xb5, 0xb5 }, + { 0x80, 0x85, 0x89, 0x8d, 0x91, 0x95, 0x98, 0x9b, 0x9e, 0xa0, 0xa0, 0xa4, 0xa6, 0xa7, 0xa9, 0xaa, + 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb0, 0xb1, 0xb1, 0xb2, 0xb2, 0xb3, 0xb3, 0xb4, 0xb4, 0xb4 }, + { 0x80, 0x84, 0x88, 0x8c, 0x90, 0x93, 0x96, 0x99, 0x9b, 0x9e, 0xa0, 0xa2, 0xa4, 0xa5, 0xa7, 0xa8, + 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xaf, 0xb0, 0xb0, 0xb1, 0xb2, 0xb2, 0xb2, 0xb3, 0xb3 }, + { 0x80, 0x84, 0x87, 0x8b, 0x8e, 0x91, 0x94, 0x97, 0x9a, 0x9c, 0x9e, 0xa0, 0xa2, 0xa3, 0xa5, 0xa6, + 0xa7, 0xa9, 0xaa, 0xab, 0xac, 0xac, 0xad, 0xae, 0xae, 0xaf, 0xb0, 0xb0, 0xb1, 0xb1, 0xb2, 0xb2 }, + { 0x80, 0x83, 0x87, 0x8a, 0x8d, 0x90, 0x93, 0x96, 0x98, 0x9a, 0x9c, 0x9e, 0xa0, 0xa2, 0xa3, 0xa5, + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xac, 0xad, 0xae, 0xae, 0xaf, 0xb0, 0xb0, 0xb0, 0xb1 }, + { 0x80, 0x83, 0x86, 0x89, 0x8c, 0x8f, 0x92, 0x94, 0x96, 0x99, 0x9b, 0x9d, 0x9e, 0xa0, 0xa2, 0xa3, + 0xa4, 0xa5, 0xa7, 0xa8, 0xa9, 0xa9, 0xaa, 0xab, 0xac, 0xac, 0xad, 0xae, 0xae, 0xaf, 0xaf, 0xb0 }, + { 0x80, 0x83, 0x86, 0x89, 0x8b, 0x8e, 0x90, 0x93, 0x95, 0x97, 0x99, 0x9b, 0x9d, 0x9e, 0xa0, 0xa1, + 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xaa, 0xab, 0xac, 0xad, 0xad, 0xae, 0xae, 0xaf }, + { 0x80, 0x83, 0x85, 0x88, 0x8b, 0x8d, 0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, 0x9b, 0x9d, 0x9f, 0xa0, + 0xa1, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa8, 0xa9, 0xaa, 0xab, 0xab, 0xac, 0xad, 0xad, 0xae }, + { 0x80, 0x83, 0x85, 0x88, 0x8a, 0x8c, 0x8f, 0x91, 0x93, 0x95, 0x97, 0x99, 0x9a, 0x9c, 0x9d, 0x9f, + 0xa0, 0xa1, 0xa2, 0xa3, 0xa5, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xaa, 0xab, 0xab, 0xac, 0xad }, + { 0x80, 0x82, 0x85, 0x87, 0x89, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x96, 0x97, 0x99, 0x9b, 0x9c, 0x9d, + 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa8, 0xa9, 0xaa, 0xaa, 0xab, 0xac }, + { 0x80, 0x82, 0x85, 0x87, 0x89, 0x8b, 0x8d, 0x8f, 0x91, 0x93, 0x95, 0x96, 0x98, 0x99, 0x9b, 0x9c, + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa7, 0xa8, 0xa9, 0xa9, 0xaa, 0xab }, + { 0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x95, 0x97, 0x98, 0x9a, 0x9b, + 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa6, 0xa7, 0xa8, 0xa8, 0xa9, 0xaa }, + { 0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0x90, 0x91, 0x93, 0x94, 0x96, 0x97, 0x99, 0x9a, + 0x9b, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa5, 0xa6, 0xa7, 0xa7, 0xa8, 0xa9 }, + { 0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8b, 0x8d, 0x8f, 0x90, 0x92, 0x94, 0x95, 0x97, 0x98, 0x99, + 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa4, 0xa5, 0xa6, 0xa6, 0xa7, 0xa8 }, + { 0x80, 0x82, 0x84, 0x86, 0x87, 0x89, 0x8b, 0x8d, 0x8e, 0x90, 0x91, 0x93, 0x94, 0x96, 0x97, 0x98, + 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa3, 0xa4, 0xa5, 0xa6, 0xa6, 0xa7 }, + { 0x80, 0x82, 0x84, 0x85, 0x87, 0x89, 0x8a, 0x8c, 0x8e, 0x8f, 0x91, 0x92, 0x94, 0x95, 0x96, 0x98, + 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa2, 0xa3, 0xa4, 0xa5, 0xa5, 0xa6 }, + { 0x80, 0x82, 0x83, 0x85, 0x87, 0x88, 0x8a, 0x8c, 0x8d, 0x8f, 0x90, 0x92, 0x93, 0x94, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa2, 0xa3, 0xa4, 0xa5, 0xa5 }, + { 0x80, 0x82, 0x83, 0x85, 0x86, 0x88, 0x8a, 0x8b, 0x8d, 0x8e, 0x90, 0x91, 0x92, 0x94, 0x95, 0x96, + 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa2, 0xa3, 0xa4, 0xa4 }, + { 0x80, 0x82, 0x83, 0x85, 0x86, 0x88, 0x89, 0x8b, 0x8c, 0x8e, 0x8f, 0x90, 0x92, 0x93, 0x94, 0x95, + 0x96, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa2, 0xa3, 0xa4 }, + { 0x80, 0x82, 0x83, 0x85, 0x86, 0x87, 0x89, 0x8a, 0x8c, 0x8d, 0x8e, 0x90, 0x91, 0x92, 0x93, 0x95, + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9e, 0x9f, 0xa0, 0xa1, 0xa1, 0xa2, 0xa3 }, + { 0x80, 0x81, 0x83, 0x84, 0x86, 0x87, 0x89, 0x8a, 0x8b, 0x8d, 0x8e, 0x8f, 0x90, 0x92, 0x93, 0x94, + 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9e, 0x9f, 0xa0, 0xa1, 0xa1, 0xa2 }, + { 0x80, 0x81, 0x83, 0x84, 0x86, 0x87, 0x88, 0x8a, 0x8b, 0x8c, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, + 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0x9f, 0xa0, 0xa1, 0xa1 }, + { 0x80, 0x81, 0x83, 0x84, 0x85, 0x87, 0x88, 0x89, 0x8b, 0x8c, 0x8d, 0x8e, 0x90, 0x91, 0x92, 0x93, + 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0x9f, 0xa0, 0xa1 }, + { 0x80, 0x81, 0x83, 0x84, 0x85, 0x87, 0x88, 0x89, 0x8a, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, + 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9c, 0x9d, 0x9e, 0x9f, 0x9f, 0xa0 } +}; + +// Mode 7 scaling constants for all raster lines +static const int16 ST010_M7Scale[176] = +{ + 0x0380, 0x0325, 0x02da, 0x029c, 0x0268, 0x023b, 0x0215, 0x01f3, + 0x01d5, 0x01bb, 0x01a3, 0x018e, 0x017b, 0x016a, 0x015a, 0x014b, + 0x013e, 0x0132, 0x0126, 0x011c, 0x0112, 0x0109, 0x0100, 0x00f8, + 0x00f0, 0x00e9, 0x00e3, 0x00dc, 0x00d6, 0x00d1, 0x00cb, 0x00c6, + 0x00c1, 0x00bd, 0x00b8, 0x00b4, 0x00b0, 0x00ac, 0x00a8, 0x00a5, + 0x00a2, 0x009e, 0x009b, 0x0098, 0x0095, 0x0093, 0x0090, 0x008d, + 0x008b, 0x0088, 0x0086, 0x0084, 0x0082, 0x0080, 0x007e, 0x007c, + 0x007a, 0x0078, 0x0076, 0x0074, 0x0073, 0x0071, 0x006f, 0x006e, + 0x006c, 0x006b, 0x0069, 0x0068, 0x0067, 0x0065, 0x0064, 0x0063, + 0x0062, 0x0060, 0x005f, 0x005e, 0x005d, 0x005c, 0x005b, 0x005a, + 0x0059, 0x0058, 0x0057, 0x0056, 0x0055, 0x0054, 0x0053, 0x0052, + 0x0051, 0x0051, 0x0050, 0x004f, 0x004e, 0x004d, 0x004d, 0x004c, + 0x004b, 0x004b, 0x004a, 0x0049, 0x0048, 0x0048, 0x0047, 0x0047, + 0x0046, 0x0045, 0x0045, 0x0044, 0x0044, 0x0043, 0x0042, 0x0042, + 0x0041, 0x0041, 0x0040, 0x0040, 0x003f, 0x003f, 0x003e, 0x003e, + 0x003d, 0x003d, 0x003c, 0x003c, 0x003b, 0x003b, 0x003a, 0x003a, + 0x003a, 0x0039, 0x0039, 0x0038, 0x0038, 0x0038, 0x0037, 0x0037, + 0x0036, 0x0036, 0x0036, 0x0035, 0x0035, 0x0035, 0x0034, 0x0034, + 0x0034, 0x0033, 0x0033, 0x0033, 0x0032, 0x0032, 0x0032, 0x0031, + 0x0031, 0x0031, 0x0030, 0x0030, 0x0030, 0x0030, 0x002f, 0x002f, + 0x002f, 0x002e, 0x002e, 0x002e, 0x002e, 0x002d, 0x002d, 0x002d, + 0x002d, 0x002c, 0x002c, 0x002c, 0x002c, 0x002b, 0x002b, 0x002b +}; + +#ifndef PI +#define PI 3.1415926535897932384626433832795 +#endif + +#define ST010_WORD(offset) (Memory.SRAM[offset + 1] << 8) | Memory.SRAM[offset] + + +static int16 ST010_Sin (int16 Theta) +{ + return (ST010_SinTable[(Theta >> 8) & 0xff]); +} + +static int16 ST010_Cos (int16 Theta) +{ + return (ST010_SinTable[((Theta + 0x4000) >> 8) & 0xff]); +} + +static void ST010_OP01 (int16 x0, int16 y0, int16 &x1, int16 &y1, int16 &Quadrant, int16 &Theta) +{ + if ((x0 < 0) && (y0 < 0)) + { + x1 = -x0; + y1 = -y0; + Quadrant = -0x8000; + } + else + if (x0 < 0) + { + x1 = y0; + y1 = -x0; + Quadrant = -0x4000; + } + else + if (y0 < 0) + { + x1 = -y0; + y1 = x0; + Quadrant = 0x4000; + } + else + { + x1 = x0; + y1 = y0; + Quadrant = 0x0000; + } + + while ((x1 > 0x1f) || (y1 > 0x1f)) + { + if (x1 > 1) + x1 >>= 1; + if (y1 > 1) + y1 >>= 1; + } + + if (y1 == 0) + Quadrant += 0x4000; + + Theta = (ST010_ArcTan[y1][x1] << 8) ^ Quadrant; +} + +static void ST010_Scale (int16 Multiplier, int16 X0, int16 Y0, int32 &X1, int32 &Y1) +{ + X1 = X0 * Multiplier << 1; + Y1 = Y0 * Multiplier << 1; +} + +static void ST010_Multiply (int16 Multiplicand, int16 Multiplier, int32 &Product) +{ + Product = Multiplicand * Multiplier << 1; +} + +static void ST010_Rotate (int16 Theta, int16 X0, int16 Y0, int16 &X1, int16 &Y1) +{ + X1 = (Y0 * ST010_Sin(Theta) >> 15) + (X0 * ST010_Cos(Theta) >> 15); + Y1 = (Y0 * ST010_Cos(Theta) >> 15) - (X0 * ST010_Sin(Theta) >> 15); +} + +static void ST010_SortDrivers (uint16 Positions, uint16 Places[32], uint16 Drivers[32]) +{ + bool Sorted; + uint16 Temp; + + if (Positions > 1) + { + do + { + Sorted = true; + + for (int i = 0; i < Positions - 1; i++) + { + if (Places[i] < Places[i + 1]) + { + Temp = Places[i + 1]; + Places[i + 1] = Places[i]; + Places[i] = Temp; + + Temp = Drivers[i + 1]; + Drivers[i + 1] = Drivers[i]; + Drivers[i] = Temp; + + Sorted = false; + } + } + + Positions--; + } + while (!Sorted); + } +} + +/* +static void SETA_Distance (int16 Y0, int16 X0, int16 &Distance) +{ + if (X0 < 0) + X0 = -X0; + if (Y0 < 0) + Y0 = -Y0; + + Distance = ((X0 * 0x7af0) + 0x4000) >> 15; +} +*/ + +uint8 S9xGetST010 (uint32 Address) +{ + if (!(Address & 0x80000)) + return (0x80); + + if ((Address & 0xFFF) == 0x20) + return (ST010.op_reg); + + if ((Address & 0xFFF) == 0x21) + return (ST010.execute); + + return (Memory.SRAM[Address & Memory.SRAMMask]); +} + +void S9xSetST010 (uint32 Address, uint8 Byte) +{ + if (!(Address & 0x80000)) + { + ST010.control_enable = TRUE; + return; + } + +#ifdef DEBUGGER + printf("Write %06X:%02X\n", Address, Byte); +#endif + + if ((Address & 0xFFF) == 0x20 && ST010.control_enable) + ST010.op_reg = Byte; + + if ((Address & 0xFFF) == 0x21 && ST010.control_enable) + ST010.execute = Byte; + else + Memory.SRAM[Address & Memory.SRAMMask] = Byte; + + if (ST010.execute & 0x80) + { + switch (ST010.op_reg) + { + // Sorts Driver Placements + // + // Input + // 0x0024-0x0025 : Positions + // 0x0040-0x007f : Places + // 0x0080-0x00ff : Drivers + // Output + // 0x0040-0x007f : Places + // 0x0080-0x00ff : Drivers + // + case 0x02: + { + #ifdef FAST_LSB_WORD_ACCESS + ST010_SortDrivers(*(uint16 *) (Memory.SRAM + 0x0024), (uint16 *) (Memory.SRAM + 0x0040), (uint16 *) (Memory.SRAM + 0x0080)); + #else + uint16 Places[32]; + uint16 Positions = ST010_WORD(0x0024); + int Pos, Offset; + + Offset = 0; + + for (Pos = 0; Pos < Positions; Pos++) + { + Places[Pos] = ST010_WORD(0x0040 + Offset); + Offset += 2; + } + + ST010_SortDrivers(Positions, Places, (uint16 *) (Memory.SRAM + 0x0080)); + + Offset = 0; + + for (Pos = 0; Pos < Positions; Pos++) + { + Memory.SRAM[0x0040 + Offset] = (uint8) (Places[Pos]); + Memory.SRAM[0x0041 + Offset] = (uint8) (Places[Pos] >> 8); + Offset += 2; + } + #endif + break; + } + + // Two Dimensional Coordinate Scale + // + // Input + // 0x0000-0x0001 : X0 (signed) + // 0x0002-0x0003 : Y0 (signed) + // 0x0004-0x0005 : Multiplier (signed) + // Output + // 0x0010-0x0013 : X1 (signed) + // 0x0014-0x0017 : Y1 (signed) + // + case 0x03: + { + #ifdef FAST_LSB_WORD_ACCESS + ST010_Scale(*(int16 *) &Memory.SRAM[0x0004], *(int16 *) &Memory.SRAM[0x0000], *(int16 *) &Memory.SRAM[0x0002], (int32 &) Memory.SRAM[0x0010], (int32 &) Memory.SRAM[0x0014]); + #else + int32 x1, y1; + + ST010_Scale(ST010_WORD(0x0004), ST010_WORD(0x0000), ST010_WORD(0x0002), x1, y1); + + Memory.SRAM[0x0010] = (uint8) (x1); + Memory.SRAM[0x0011] = (uint8) (x1 >> 8); + Memory.SRAM[0x0012] = (uint8) (x1 >> 16); + Memory.SRAM[0x0013] = (uint8) (x1 >> 24); + Memory.SRAM[0x0014] = (uint8) (y1); + Memory.SRAM[0x0015] = (uint8) (y1 >> 8); + Memory.SRAM[0x0016] = (uint8) (y1 >> 16); + Memory.SRAM[0x0017] = (uint8) (y1 >> 24); + #endif + break; + } + + // 16-bit Multiplication + // + // Input + // 0x0000-0x0001 : Multiplcand (signed) + // 0x0002-0x0003 : Multiplier (signed) + // Output + // 0x0010-0x0013 : Product (signed) + // + case 0x06: + { + #ifdef FAST_LSB_WORD_ACCESS + ST010_Multiply(*(int16 *) &Memory.SRAM[0x0000], *(int16 *) &Memory.SRAM[0x0002], (int32 &) Memory.SRAM[0x0010]); + #else + int32 Product; + + ST010_Multiply(ST010_WORD(0x0000), ST010_WORD(0x0002), Product); + + Memory.SRAM[0x0010] = (uint8) (Product); + Memory.SRAM[0x0011] = (uint8) (Product >> 8); + Memory.SRAM[0x0012] = (uint8) (Product >> 16); + Memory.SRAM[0x0013] = (uint8) (Product >> 24); + #endif + break; + } + + // Mode 7 Raster Data Calculation + // + // Input + // 0x0000-0x0001 : Angle (signed) + // Output + // 0x00f0-0x024f : Mode 7 Matrix A + // 0x0250-0x03af : Mode 7 Matrix B + // 0x03b0-0x050f : Mode 7 Matrix C + // 0x0510-0x066f : Mode 7 Matrix D + // + case 0x07: + { + int16 data; + int32 offset = 0; + int16 Theta = ST010_WORD(0x0000); + + for (int32 line = 0; line < 176; line++) + { + // Calculate Mode 7 Matrix A/D data + data = ST010_M7Scale[line] * ST010_Cos(Theta) >> 15; + + Memory.SRAM[0x00f0 + offset] = (uint8) (data); + Memory.SRAM[0x00f1 + offset] = (uint8) (data >> 8); + Memory.SRAM[0x0510 + offset] = (uint8) (data); + Memory.SRAM[0x0511 + offset] = (uint8) (data >> 8); + + // Calculate Mode 7 Matrix B/C data + data = ST010_M7Scale[line] * ST010_Sin(Theta) >> 15; + + Memory.SRAM[0x0250 + offset] = (uint8) (data); + Memory.SRAM[0x0251 + offset] = (uint8) (data >> 8); + + if (data) + data = ~data; + + Memory.SRAM[0x03b0 + offset] = (uint8) (data); + Memory.SRAM[0x03b1 + offset] = (uint8) (data >> 8); + + offset += 2; + } + + // Shift Angle for use with Lookup table + Memory.SRAM[0x00] = Memory.SRAM[0x01]; + Memory.SRAM[0x01] = 0x00; + + break; + } + + // Two dimensional Coordinate Rotation + // + // Input + // 0x0000-0x0001 : X0 (signed) + // 0x0002-0x0003 : Y0 (signed) + // 0x0004-0x0005 : Angle (signed) + // Output + // 0x0010-0x0011 : X1 (signed) + // 0x0012-0x0013 : Y1 (signed) + // + case 0x08: + { + #ifdef FAST_LSB_WORD_ACCESS + ST010_Rotate(*(int16 *) &Memory.SRAM[0x0004], *(int16 *) &Memory.SRAM[0x0000], *(int16 *) &Memory.SRAM[0x0002], (int16 &) Memory.SRAM[0x0010], (int16 &) Memory.SRAM[0x0012]); + #else + int16 x1, y1; + + ST010_Rotate(ST010_WORD(0x0004), ST010_WORD(0x0000), ST010_WORD(0x0002), x1, y1); + + Memory.SRAM[0x0010] = (uint8) (x1); + Memory.SRAM[0x0011] = (uint8) (x1 >> 8); + Memory.SRAM[0x0012] = (uint8) (y1); + Memory.SRAM[0x0013] = (uint8) (y1 >> 8); + #endif + break; + } + + // Input + // 0x0000-0x0001 : DX (signed) + // 0x0002-0x0003 : DY (signed) + // Output + // 0x0010-0x0011 : Angle (signed) + // + case 0x01: + { + Memory.SRAM[0x0006] = Memory.SRAM[0x0002]; + Memory.SRAM[0x0007] = Memory.SRAM[0x0003]; + + #ifdef FAST_LSB_WORD_ACCESS + ST010_OP01(*(int16 *) &Memory.SRAM[0x0000], *(int16 *) &Memory.SRAM[0x0002], (int16 &) Memory.SRAM[0x0000], (int16 &) Memory.SRAM[0x0002], (int16 &) Memory.SRAM[0x0004], (int16 &) Memory.SRAM[0x0010]); + #else + int16 x1, y1, Quadrant, Theta; + + ST010_OP01(ST010_WORD(0x0000), ST010_WORD(0x0002), x1, y1, Quadrant, Theta); + + Memory.SRAM[0x0000] = (uint8) (x1); + Memory.SRAM[0x0001] = (uint8) (x1 >> 8); + Memory.SRAM[0x0002] = (uint8) (y1); + Memory.SRAM[0x0003] = (uint8) (y1 >> 8); + Memory.SRAM[0x0004] = (uint8) (Quadrant); + Memory.SRAM[0x0005] = (uint8) (Quadrant >> 8); + Memory.SRAM[0x0010] = (uint8) (Theta); + Memory.SRAM[0x0011] = (uint8) (Theta >> 8); + #endif + break; + } + + // calculate the vector length of (x, y) + case 0x04: + { + int16 square, x, y; + #ifdef FAST_LSB_WORD_ACCESS + x = *((int16 *) Memory.SRAM); + y = *((int16 *) &Memory.SRAM[2]); + #else + x = Memory.SRAM[0] | (Memory.SRAM[1] << 8); + y = Memory.SRAM[2] | (Memory.SRAM[3] << 8); + #endif + square = (int16) sqrt((double) (y * y + x * x)); + //SETA_Distance(x, y, square); + + #ifdef FAST_LSB_WORD_ACCESS + *((int16 *) &Memory.SRAM[0x10]) = square; + #else + Memory.SRAM[0x10] = (uint8) (square); + Memory.SRAM[0x11] = (uint8) (square >> 8); + #endif + break; + } + + // calculate AI orientation based on specific guidelines + case 0x05: + { + int32 dx, dy; + int16 a1, b1, c1; + uint16 o1; + bool wrap = false; + + // target (x, y) coordinates + int16 ypos_max = ST010_WORD(0x00C0); + int16 xpos_max = ST010_WORD(0x00C2); + + // current coordinates and direction + int32 ypos = Memory.SRAM[0xC4] | (Memory.SRAM[0xC5] << 8) | (Memory.SRAM[0xC6] << 16) | (Memory.SRAM[0xC7] << 24); + int32 xpos = Memory.SRAM[0xC8] | (Memory.SRAM[0xC9] << 8) | (Memory.SRAM[0xCA] << 16) | (Memory.SRAM[0xCB] << 24); + uint16 rot = Memory.SRAM[0xCC] | (Memory.SRAM[0xCD] << 8); + + // physics + uint16 speed = ST010_WORD(0x00D4); + uint16 accel = ST010_WORD(0x00D6); + uint16 speed_max = ST010_WORD(0x00D8); + + // special condition acknowledgment + int16 system = ST010_WORD(0x00DA); + int16 flags = ST010_WORD(0x00DC); + + // new target coordinates + int16 ypos_new = ST010_WORD(0x00DE); + int16 xpos_new = ST010_WORD(0x00E0); + + // mask upper bit + xpos_new &= 0x7FFF; + + // get the current distance + dx = xpos_max - (xpos >> 16); + dy = ypos_max - (ypos >> 16); + + // quirk: clear and move in9 + Memory.SRAM[0xD2] = 0xFF; + Memory.SRAM[0xD3] = 0xFF; + Memory.SRAM[0xDA] = 0; + Memory.SRAM[0xDB] = 0; + + // grab the target angle + ST010_OP01(dy, dx, a1, b1, c1, (int16 &) o1); + + // check for wrapping + //if ((o1 < 0x6000 && rot > 0xA000) || (rot < 0x6000 && o1 > 0xA000)) + //if (o1 < rot) + if (abs(o1 - rot) > 0x8000) + { + o1 += 0x8000; + rot += 0x8000; + wrap = true; + } + //o1 = 0x0000; + //rot = 0xFF00; + + uint16 old_speed; + + old_speed = speed; + + // special case + if (abs(o1 - rot) == 0x8000) + speed = 0x100; + // slow down for sharp curves + else + if (abs(o1 - rot) >= 0x1000) + { + uint32 slow = abs(o1 - rot); + slow >>= 4; // scaling + speed -= slow; + } + // otherwise accelerate + else + { + speed += accel; + if (speed > speed_max) + { + // clip speed + speed = speed_max; + } + } + + // prevent negative/positive overflow + if (abs(old_speed - speed) > 0x8000) + { + if (old_speed < speed) + speed = 0; + else + speed = 0xff00; + } + + // adjust direction by so many degrees + // be careful of negative adjustments + if ((o1 > rot && (o1 - rot) > 0x80) || (o1 < rot && (rot - o1) >= 0x80)) + { + if (o1 < rot) + rot -= 0x280; + else + if (o1 > rot) + rot += 0x280; + } + + // turn off wrapping + if (wrap) + rot -= 0x8000; + + // now check the distances (store for later) + dx = (xpos_max << 16) - xpos; + dy = (ypos_max << 16) - ypos; + dx >>= 16; + dy >>= 16; + + // if we're in so many units of the target, signal it + if ((system && (dy <= 6 && dy >= -8) && (dx <= 126 && dx >= -128)) || (!system && (dx <= 6 && dx >= -8) && (dy <= 126 && dy >= -128))) + { + // announce our new destination and flag it + xpos_max = xpos_new & 0x7FFF; + ypos_max = ypos_new; + flags |= 0x08; + } + + // update position + xpos -= (ST010_Cos(rot) * 0x400 >> 15) * (speed >> 8) << 1; + ypos -= (ST010_Sin(rot) * 0x400 >> 15) * (speed >> 8) << 1; + + // quirk: mask upper byte + xpos &= 0x1FFFFFFF; + ypos &= 0x1FFFFFFF; + + Memory.SRAM[0x00C0] = (uint8) (ypos_max); + Memory.SRAM[0x00C1] = (uint8) (ypos_max >> 8); + Memory.SRAM[0x00C2] = (uint8) (xpos_max); + Memory.SRAM[0x00C3] = (uint8) (xpos_max >> 8); + Memory.SRAM[0x00C4] = (uint8) (ypos); + Memory.SRAM[0x00C5] = (uint8) (ypos >> 8); + Memory.SRAM[0x00C6] = (uint8) (ypos >> 16); + Memory.SRAM[0x00C7] = (uint8) (ypos >> 24); + Memory.SRAM[0x00C8] = (uint8) (xpos); + Memory.SRAM[0x00C9] = (uint8) (xpos >> 8); + Memory.SRAM[0x00CA] = (uint8) (xpos >> 16); + Memory.SRAM[0x00CB] = (uint8) (xpos >> 24); + Memory.SRAM[0x00CC] = (uint8) (rot); + Memory.SRAM[0x00CD] = (uint8) (rot >> 8); + Memory.SRAM[0x00D4] = (uint8) (speed); + Memory.SRAM[0x00D5] = (uint8) (speed >> 8); + Memory.SRAM[0x00DC] = (uint8) (flags); + Memory.SRAM[0x00DD] = (uint8) (flags >> 8); + + break; + } + + default: + #ifdef DEBUGGER + printf("Unknown Op\n"); + #endif + break; + } + + // lower signal: op processed + ST010.op_reg = 0; + ST010.execute = 0; + } +} diff --git a/plugins/snes9x_gx/source/snes9x/seta011.cpp b/plugins/snes9x_gx/source/snes9x/seta011.cpp new file mode 100644 index 00000000..b49a8b8b --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/seta011.cpp @@ -0,0 +1,309 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#include "snes9x.h" +#include "memmap.h" +#include "seta.h" + +static uint8 board[9][9]; // shougi playboard +static int line = 0; // line counter + + +uint8 S9xGetST011 (uint32 Address) +{ + uint8 t; + uint16 address = (uint16) Address & 0xFFFF; + + line++; + + // status check + if (address == 0x01) + t = 0xFF; + else + t = Memory.SRAM[address]; // read directly from s-ram + +#ifdef DEBUGGER + if (address < 0x150) + printf("ST011 R: %06X %02X\n", Address, t); +#endif + + return (t); +} + +void S9xSetST011 (uint32 Address, uint8 Byte) +{ + static bool reset = false; + uint16 address = (uint16) Address & 0xFFFF; + + line++; + + if (!reset) + { + // bootup values + ST011.waiting4command = true; + reset = true; + } + +#ifdef DEBUGGER + if (address < 0x150) + printf("ST011 W: %06X %02X\n", Address, Byte); +#endif + + Memory.SRAM[address] = Byte; + + // op commands/data goes through this address + if (address == 0x00) + { + // check for new commands + if (ST011.waiting4command) + { + ST011.waiting4command = false; + ST011.command = Byte; + ST011.in_index = 0; + ST011.out_index = 0; + + switch (ST011.command) + { + case 0x01: ST011.in_count = 12 * 10 + 8; break; + case 0x02: ST011.in_count = 4; break; + case 0x04: ST011.in_count = 0; break; + case 0x05: ST011.in_count = 0; break; + case 0x06: ST011.in_count = 0; break; + case 0x07: ST011.in_count = 0; break; + case 0x0E: ST011.in_count = 0; break; + default: ST011.waiting4command = true; break; + } + } + else + { + ST011.parameters[ST011.in_index] = Byte; + ST011.in_index++; + } + } + + if (ST011.in_count == ST011.in_index) + { + // actually execute the command + ST011.waiting4command = true; + ST011.out_index = 0; + + switch (ST011.command) + { + // unknown: download playboard + case 0x01: + // 9x9 board data: top to bottom, left to right + // Values represent piece types and ownership + for (int lcv = 0; lcv < 9; lcv++) + memcpy(board[lcv], ST011.parameters + lcv * 10, 9 * 1); + break; + + // unknown + case 0x02: + break; + + // unknown + case 0x04: + // outputs + Memory.SRAM[0x12C] = 0x00; + //Memory.SRAM[0x12D] = 0x00; + Memory.SRAM[0x12E] = 0x00; + break; + + // unknown + case 0x05: + // outputs + Memory.SRAM[0x12C] = 0x00; + //Memory.SRAM[0x12D] = 0x00; + Memory.SRAM[0x12E] = 0x00; + break; + + // unknown + case 0x06: + break; + + case 0x07: + break; + + // unknown + case 0x0E: + // outputs + Memory.SRAM[0x12C] = 0x00; + Memory.SRAM[0x12D] = 0x00; + break; + } + } +} diff --git a/plugins/snes9x_gx/source/snes9x/seta018.cpp b/plugins/snes9x_gx/source/snes9x/seta018.cpp new file mode 100644 index 00000000..24efb5c8 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/seta018.cpp @@ -0,0 +1,353 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#include "snes9x.h" +#include "memmap.h" +#include "seta.h" + +static int line; // line counter + + +uint8 S9xGetST018 (uint32 Address) +{ + uint8 t = 0; + uint16 address = (uint16) Address & 0xFFFF; + + line++; + + // these roles may be flipped + // op output + if (address == 0x3804) + { + if (ST018.out_count) + { + t = (uint8) ST018.output[ST018.out_index]; + ST018.out_index++; + if (ST018.out_count == ST018.out_index) + ST018.out_count = 0; + } + else + t = 0x81; + } + // status register + else + if (address == 0x3800) + t = ST018.status; + +#ifdef DEBUGGER + printf("ST018 R: %06X %02X\n", Address, t); +#endif + + return (t); +} + +void S9xSetST018 (uint8 Byte, uint32 Address) +{ + static bool reset = false; + uint16 address = (uint16) Address & 0xFFFF; + +#ifdef DEBUGGER + printf("ST018 W: %06X %02X\n", Address, Byte); +#endif + + line++; + + if (!reset) + { + // bootup values + ST018.waiting4command = true; + ST018.part_command = 0; + reset = true; + } + + Memory.SRAM[address] = Byte; + + // default status for now + ST018.status = 0x00; + + // op data goes through this address + if (address == 0x3804) + { + // check for new commands: 3 bytes length + if (ST018.waiting4command && ST018.part_command == 2) + { + ST018.waiting4command = false; + ST018.in_index = 0; + ST018.out_index = 0; + ST018.part_command = 0; // 3-byte commands + ST018.pass = 0; // data streams into the chip + ST018.command <<= 8; + ST018.command |= Byte; + + switch (ST018.command & 0xFFFFFF) + { + case 0x0100: ST018.in_count = 0; break; + case 0xFF00: ST018.in_count = 0; break; + default: ST018.waiting4command = true; break; + } + } + else + if (ST018.waiting4command) + { + // 3-byte commands + ST018.part_command++; + ST018.command <<= 8; + ST018.command |= Byte; + } + } + // extra parameters + else + if (address == 0x3802) + { + ST018.parameters[ST018.in_index] = Byte; + ST018.in_index++; + } + + if (ST018.in_count == ST018.in_index) + { + // qctually execute the command + ST018.waiting4command = true; + ST018.in_index = 0; + ST018.out_index = 0; + + switch (ST018.command) + { + // hardware check? + case 0x0100: + ST018.waiting4command = false; + ST018.pass++; + + if (ST018.pass == 1) + { + ST018.in_count = 1; + ST018.out_count = 2; + + // Overload's research + ST018.output[0x00] = 0x81; + ST018.output[0x01] = 0x81; + } + else + { + //ST018.in_count = 1; + ST018.out_count = 3; + + // no reason to change this + //ST018.output[0x00] = 0x81; + //ST018.output[0x01] = 0x81; + ST018.output[0x02] = 0x81; + + // done processing requests + if (ST018.pass == 3) + ST018.waiting4command = true; + } + + break; + + // unknown: feels like a security detection + // format identical to 0x0100 + case 0xFF00: + ST018.waiting4command = false; + ST018.pass++; + + if (ST018.pass == 1) + { + ST018.in_count = 1; + ST018.out_count = 2; + + // Overload's research + ST018.output[0x00] = 0x81; + ST018.output[0x01] = 0x81; + } + else + { + //ST018.in_count = 1; + ST018.out_count = 3; + + // no reason to change this + //ST018.output[0x00] = 0x81; + //ST018.output[0x01] = 0x81; + ST018.output[0x02] = 0x81; + + // done processing requests + if (ST018.pass == 3) + ST018.waiting4command = true; + } + + break; + } + } +} diff --git a/plugins/snes9x_gx/source/snes9x/snapshot.cpp b/plugins/snes9x_gx/source/snes9x/snapshot.cpp new file mode 100644 index 00000000..13934f04 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/snapshot.cpp @@ -0,0 +1,2250 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#include <assert.h> +#include "snes9x.h" +#include "memmap.h" +#include "dma.h" +#include "apu/apu.h" +#include "fxinst.h" +#include "fxemu.h" +#include "sdd1.h" +#include "srtc.h" +#include "snapshot.h" +#include "controls.h" +#include "movie.h" +#include "display.h" +#include "language.h" + +#ifndef min +#define min(a,b) (((a) < (b)) ? (a) : (b)) +#endif + +typedef struct +{ + int offset; + int offset2; + int size; + int type; + uint16 debuted_in; + uint16 deleted_in; + const char *name; +} FreezeData; + +enum +{ + INT_V, + uint8_ARRAY_V, + uint16_ARRAY_V, + uint32_ARRAY_V, + uint8_INDIR_ARRAY_V, + uint16_INDIR_ARRAY_V, + uint32_INDIR_ARRAY_V, + POINTER_V +}; + +#define COUNT(ARRAY) (sizeof(ARRAY) / sizeof(ARRAY[0])) +#define Offset(field, structure) ((int) (((char *) (&(((structure) NULL)->field))) - ((char *) NULL))) +#define OFFSET(f) Offset(f, STRUCT *) +#define DUMMY(f) Offset(f, struct Obsolete *) +#define DELETED(f) (-1) + +#define INT_ENTRY(save_version_introduced, field) \ +{ \ + OFFSET(field), \ + 0, \ + sizeof(((STRUCT *) NULL)->field), \ + INT_V, \ + save_version_introduced, \ + 9999, \ + #field \ +} + +#define ARRAY_ENTRY(save_version_introduced, field, count, elemType) \ +{ \ + OFFSET(field), \ + 0, \ + count, \ + elemType, \ + save_version_introduced, \ + 9999, \ + #field \ +} + +#define POINTER_ENTRY(save_version_introduced, field, relativeToField) \ +{ \ + OFFSET(field), \ + OFFSET(relativeToField), \ + 4, \ + POINTER_V, \ + save_version_introduced, \ + 9999, \ + #field \ +} + +#define OBSOLETE_INT_ENTRY(save_version_introduced, save_version_removed, field) \ +{ \ + DUMMY(field), \ + 0, \ + sizeof(((struct Obsolete *) NULL)->field), \ + INT_V, \ + save_version_introduced, \ + save_version_removed, \ + #field \ +} + +#define OBSOLETE_ARRAY_ENTRY(save_version_introduced, save_version_removed, field, count, elemType) \ +{ \ + DUMMY(field), \ + 0, \ + count, \ + elemType, \ + save_version_introduced, \ + save_version_removed, \ + #field \ +} + +#define OBSOLETE_POINTER_ENTRY(save_version_introduced, save_version_removed, field, relativeToField) \ +{ \ + DUMMY(field), \ + DUMMY(relativeToField), \ + 4, \ + POINTER_V, \ + save_version_introduced, \ + save_version_removed, \ + #field \ +} + +#define DELETED_INT_ENTRY(save_version_introduced, save_version_removed, field, size) \ +{ \ + DELETED(field), \ + 0, \ + size, \ + INT_V, \ + save_version_introduced, \ + save_version_removed, \ + #field \ +} + +#define DELETED_ARRAY_ENTRY(save_version_introduced, save_version_removed, field, count, elemType) \ +{ \ + DELETED(field), \ + 0, \ + count, \ + elemType, \ + save_version_introduced, \ + save_version_removed, \ + #field \ +} + +#define DELETED_POINTER_ENTRY(save_version_introduced, save_version_removed, field, relativeToField) \ +{ \ + DELETED(field), \ + DELETED(relativeToField), \ + 4, \ + POINTER_V, \ + save_version_introduced, \ + save_version_removed, \ + #field \ +} + +struct SDMASnapshot +{ + struct SDMA dma[8]; +}; + +struct SnapshotMovieInfo +{ + uint32 MovieInputDataSize; +}; + +struct SnapshotScreenshotInfo +{ + uint16 Width; + uint16 Height; + uint8 Interlaced; + uint8 Data[MAX_SNES_WIDTH * MAX_SNES_HEIGHT * 3]; +}; + +static struct Obsolete +{ + uint8 reserved; +} Obsolete; + +#define STRUCT struct SCPUState + +static FreezeData SnapCPU[] = +{ + INT_ENTRY(6, Cycles), + INT_ENTRY(6, PrevCycles), + INT_ENTRY(6, V_Counter), + INT_ENTRY(6, Flags), + INT_ENTRY(6, IRQActive), + INT_ENTRY(6, IRQPending), + INT_ENTRY(6, MemSpeed), + INT_ENTRY(6, MemSpeedx2), + INT_ENTRY(6, FastROMSpeed), + INT_ENTRY(6, InDMA), + INT_ENTRY(6, InHDMA), + INT_ENTRY(6, InDMAorHDMA), + INT_ENTRY(6, InWRAMDMAorHDMA), + INT_ENTRY(6, HDMARanInDMA), + INT_ENTRY(6, WhichEvent), + INT_ENTRY(6, NextEvent), + INT_ENTRY(6, WaitingForInterrupt), + INT_ENTRY(6, WaitAddress), + INT_ENTRY(6, WaitCounter), + INT_ENTRY(6, PBPCAtOpcodeStart) +}; + +#undef STRUCT +#define STRUCT struct SRegisters + +static FreezeData SnapRegisters[] = +{ + INT_ENTRY(6, PB), + INT_ENTRY(6, DB), + INT_ENTRY(6, P.W), + INT_ENTRY(6, A.W), + INT_ENTRY(6, D.W), + INT_ENTRY(6, S.W), + INT_ENTRY(6, X.W), + INT_ENTRY(6, Y.W), + INT_ENTRY(6, PCw) +}; + +#undef STRUCT +#define STRUCT struct SPPU + +static FreezeData SnapPPU[] = +{ + INT_ENTRY(6, VMA.High), + INT_ENTRY(6, VMA.Increment), + INT_ENTRY(6, VMA.Address), + INT_ENTRY(6, VMA.Mask1), + INT_ENTRY(6, VMA.FullGraphicCount), + INT_ENTRY(6, VMA.Shift), + INT_ENTRY(6, WRAM), +#define O(N) \ + INT_ENTRY(6, BG[N].SCBase), \ + INT_ENTRY(6, BG[N].HOffset), \ + INT_ENTRY(6, BG[N].VOffset), \ + INT_ENTRY(6, BG[N].BGSize), \ + INT_ENTRY(6, BG[N].NameBase), \ + INT_ENTRY(6, BG[N].SCSize) + O(0), O(1), O(2), O(3), +#undef O + INT_ENTRY(6, BGMode), + INT_ENTRY(6, BG3Priority), + INT_ENTRY(6, CGFLIP), + INT_ENTRY(6, CGFLIPRead), + INT_ENTRY(6, CGADD), + ARRAY_ENTRY(6, CGDATA, 256, uint16_ARRAY_V), +#define O(N) \ + INT_ENTRY(6, OBJ[N].HPos), \ + INT_ENTRY(6, OBJ[N].VPos), \ + INT_ENTRY(6, OBJ[N].HFlip), \ + INT_ENTRY(6, OBJ[N].VFlip), \ + INT_ENTRY(6, OBJ[N].Name), \ + INT_ENTRY(6, OBJ[N].Priority), \ + INT_ENTRY(6, OBJ[N].Palette), \ + INT_ENTRY(6, OBJ[N].Size) + O( 0), O( 1), O( 2), O( 3), O( 4), O( 5), O( 6), O( 7), + O( 8), O( 9), O( 10), O( 11), O( 12), O( 13), O( 14), O( 15), + O( 16), O( 17), O( 18), O( 19), O( 20), O( 21), O( 22), O( 23), + O( 24), O( 25), O( 26), O( 27), O( 28), O( 29), O( 30), O( 31), + O( 32), O( 33), O( 34), O( 35), O( 36), O( 37), O( 38), O( 39), + O( 40), O( 41), O( 42), O( 43), O( 44), O( 45), O( 46), O( 47), + O( 48), O( 49), O( 50), O( 51), O( 52), O( 53), O( 54), O( 55), + O( 56), O( 57), O( 58), O( 59), O( 60), O( 61), O( 62), O( 63), + O( 64), O( 65), O( 66), O( 67), O( 68), O( 69), O( 70), O( 71), + O( 72), O( 73), O( 74), O( 75), O( 76), O( 77), O( 78), O( 79), + O( 80), O( 81), O( 82), O( 83), O( 84), O( 85), O( 86), O( 87), + O( 88), O( 89), O( 90), O( 91), O( 92), O( 93), O( 94), O( 95), + O( 96), O( 97), O( 98), O( 99), O(100), O(101), O(102), O(103), + O(104), O(105), O(106), O(107), O(108), O(109), O(110), O(111), + O(112), O(113), O(114), O(115), O(116), O(117), O(118), O(119), + O(120), O(121), O(122), O(123), O(124), O(125), O(126), O(127), +#undef O + INT_ENTRY(6, OBJThroughMain), + INT_ENTRY(6, OBJThroughSub), + INT_ENTRY(6, OBJAddition), + INT_ENTRY(6, OBJNameBase), + INT_ENTRY(6, OBJNameSelect), + INT_ENTRY(6, OBJSizeSelect), + INT_ENTRY(6, OAMAddr), + INT_ENTRY(6, SavedOAMAddr), + INT_ENTRY(6, OAMPriorityRotation), + INT_ENTRY(6, OAMFlip), + INT_ENTRY(6, OAMReadFlip), + INT_ENTRY(6, OAMTileAddress), + INT_ENTRY(6, OAMWriteRegister), + ARRAY_ENTRY(6, OAMData, 512 + 32, uint8_ARRAY_V), + INT_ENTRY(6, FirstSprite), + INT_ENTRY(6, LastSprite), + INT_ENTRY(6, HTimerEnabled), + INT_ENTRY(6, VTimerEnabled), + INT_ENTRY(6, HTimerPosition), + INT_ENTRY(6, VTimerPosition), + INT_ENTRY(6, IRQHBeamPos), + INT_ENTRY(6, IRQVBeamPos), + INT_ENTRY(6, HBeamFlip), + INT_ENTRY(6, VBeamFlip), + INT_ENTRY(6, HBeamPosLatched), + INT_ENTRY(6, VBeamPosLatched), + INT_ENTRY(6, GunHLatch), + INT_ENTRY(6, GunVLatch), + INT_ENTRY(6, HVBeamCounterLatched), + INT_ENTRY(6, Mode7HFlip), + INT_ENTRY(6, Mode7VFlip), + INT_ENTRY(6, Mode7Repeat), + INT_ENTRY(6, MatrixA), + INT_ENTRY(6, MatrixB), + INT_ENTRY(6, MatrixC), + INT_ENTRY(6, MatrixD), + INT_ENTRY(6, CentreX), + INT_ENTRY(6, CentreY), + INT_ENTRY(6, M7HOFS), + INT_ENTRY(6, M7VOFS), + INT_ENTRY(6, Mosaic), + INT_ENTRY(6, MosaicStart), + ARRAY_ENTRY(6, BGMosaic, 4, uint8_ARRAY_V), + INT_ENTRY(6, Window1Left), + INT_ENTRY(6, Window1Right), + INT_ENTRY(6, Window2Left), + INT_ENTRY(6, Window2Right), + INT_ENTRY(6, RecomputeClipWindows), +#define O(N) \ + INT_ENTRY(6, ClipCounts[N]), \ + INT_ENTRY(6, ClipWindowOverlapLogic[N]), \ + INT_ENTRY(6, ClipWindow1Enable[N]), \ + INT_ENTRY(6, ClipWindow2Enable[N]), \ + INT_ENTRY(6, ClipWindow1Inside[N]), \ + INT_ENTRY(6, ClipWindow2Inside[N]) + O(0), O(1), O(2), O(3), O(4), O(5), +#undef O + INT_ENTRY(6, ForcedBlanking), + INT_ENTRY(6, FixedColourRed), + INT_ENTRY(6, FixedColourGreen), + INT_ENTRY(6, FixedColourBlue), + INT_ENTRY(6, Brightness), + INT_ENTRY(6, ScreenHeight), + INT_ENTRY(6, Need16x8Mulitply), + INT_ENTRY(6, BGnxOFSbyte), + INT_ENTRY(6, M7byte), + INT_ENTRY(6, HDMA), + INT_ENTRY(6, HDMAEnded), + INT_ENTRY(6, OpenBus1), + INT_ENTRY(6, OpenBus2) +}; + +#undef STRUCT +#define STRUCT struct SDMASnapshot + +static FreezeData SnapDMA[] = +{ +#define O(N) \ + INT_ENTRY(6, dma[N].ReverseTransfer), \ + INT_ENTRY(6, dma[N].HDMAIndirectAddressing), \ + INT_ENTRY(6, dma[N].UnusedBit43x0), \ + INT_ENTRY(6, dma[N].AAddressFixed), \ + INT_ENTRY(6, dma[N].AAddressDecrement), \ + INT_ENTRY(6, dma[N].TransferMode), \ + INT_ENTRY(6, dma[N].BAddress), \ + INT_ENTRY(6, dma[N].AAddress), \ + INT_ENTRY(6, dma[N].ABank), \ + INT_ENTRY(6, dma[N].DMACount_Or_HDMAIndirectAddress), \ + INT_ENTRY(6, dma[N].IndirectBank), \ + INT_ENTRY(6, dma[N].Address), \ + INT_ENTRY(6, dma[N].Repeat), \ + INT_ENTRY(6, dma[N].LineCount), \ + INT_ENTRY(6, dma[N].UnknownByte), \ + INT_ENTRY(6, dma[N].DoTransfer) + O(0), O(1), O(2), O(3), O(4), O(5), O(6), O(7) +#undef O +}; + +#undef STRUCT +#define STRUCT struct SControlSnapshot + +static FreezeData SnapControls[] = +{ + INT_ENTRY(6, ver), + ARRAY_ENTRY(6, port1_read_idx, 2, uint8_ARRAY_V), + ARRAY_ENTRY(6, dummy1, 4, uint8_ARRAY_V), + ARRAY_ENTRY(6, port2_read_idx, 2, uint8_ARRAY_V), + ARRAY_ENTRY(6, dummy2, 4, uint8_ARRAY_V), + ARRAY_ENTRY(6, mouse_speed, 2, uint8_ARRAY_V), + INT_ENTRY(6, justifier_select), + ARRAY_ENTRY(6, dummy3, 8, uint8_ARRAY_V), + INT_ENTRY(6, pad_read), + INT_ENTRY(6, pad_read_last), + ARRAY_ENTRY(6, internal, 60, uint8_ARRAY_V) +}; + +#undef STRUCT +#define STRUCT struct STimings + +static FreezeData SnapTimings[] = +{ + INT_ENTRY(6, H_Max_Master), + INT_ENTRY(6, H_Max), + INT_ENTRY(6, V_Max_Master), + INT_ENTRY(6, V_Max), + INT_ENTRY(6, HBlankStart), + INT_ENTRY(6, HBlankEnd), + INT_ENTRY(6, HDMAInit), + INT_ENTRY(6, HDMAStart), + INT_ENTRY(6, NMITriggerPos), + INT_ENTRY(6, WRAMRefreshPos), + INT_ENTRY(6, RenderPos), + INT_ENTRY(6, InterlaceField), + INT_ENTRY(6, DMACPUSync), + INT_ENTRY(6, NMIDMADelay), + INT_ENTRY(6, IRQPendCount), + INT_ENTRY(6, APUSpeedup) +}; + +#undef STRUCT +#define STRUCT struct FxRegs_s + +static FreezeData SnapFX[] = +{ + ARRAY_ENTRY(6, avReg, 16, uint32_ARRAY_V), + INT_ENTRY(6, vColorReg), + INT_ENTRY(6, vPlotOptionReg), + INT_ENTRY(6, vStatusReg), + INT_ENTRY(6, vPrgBankReg), + INT_ENTRY(6, vRomBankReg), + INT_ENTRY(6, vRamBankReg), + INT_ENTRY(6, vCacheBaseReg), + INT_ENTRY(6, vCacheFlags), + INT_ENTRY(6, vLastRamAdr), + POINTER_ENTRY(6, pvDreg, avRegAddr), + POINTER_ENTRY(6, pvSreg, avRegAddr), + INT_ENTRY(6, vRomBuffer), + INT_ENTRY(6, vPipe), + INT_ENTRY(6, vPipeAdr), + INT_ENTRY(6, vSign), + INT_ENTRY(6, vZero), + INT_ENTRY(6, vCarry), + INT_ENTRY(6, vOverflow), + INT_ENTRY(6, vErrorCode), + INT_ENTRY(6, vIllegalAddress), + INT_ENTRY(6, bBreakPoint), + INT_ENTRY(6, vBreakPoint), + INT_ENTRY(6, vStepPoint), + INT_ENTRY(6, nRamBanks), + INT_ENTRY(6, nRomBanks), + INT_ENTRY(6, vMode), + INT_ENTRY(6, vPrevMode), + POINTER_ENTRY(6, pvScreenBase, pvRam), +#define O(N) \ + POINTER_ENTRY(6, apvScreen[N], pvRam) + O( 0), O( 1), O( 2), O( 3), O( 4), O( 5), O( 6), O( 7), + O( 8), O( 9), O( 10), O( 11), O( 12), O( 13), O( 14), O( 15), + O( 16), O( 17), O( 18), O( 19), O( 20), O( 21), O( 22), O( 23), + O( 24), O( 25), O( 26), O( 27), O( 28), O( 29), O( 30), O( 31), +#undef O + ARRAY_ENTRY(6, x, 32, uint32_ARRAY_V), + INT_ENTRY(6, vScreenHeight), + INT_ENTRY(6, vScreenRealHeight), + INT_ENTRY(6, vPrevScreenHeight), + INT_ENTRY(6, vScreenSize), + POINTER_ENTRY(6, pvRamBank, apvRamBank), + POINTER_ENTRY(6, pvRomBank, apvRomBank), + POINTER_ENTRY(6, pvPrgBank, apvRomBank), +#define O(N) \ + POINTER_ENTRY(6, apvRamBank[N], pvRam) + O(0), O(1), O(2), O(3), +#undef O + INT_ENTRY(6, bCacheActive), + POINTER_ENTRY(6, pvCache, pvRegisters), + ARRAY_ENTRY(6, avCacheBackup, 512, uint8_ARRAY_V), + INT_ENTRY(6, vCounter), + INT_ENTRY(6, vInstCount), + INT_ENTRY(6, vSCBRDirty) +}; + +#undef STRUCT +#define STRUCT struct SSA1 + +static FreezeData SnapSA1[] = +{ + INT_ENTRY(6, CPUExecuting), + INT_ENTRY(6, ShiftedPB), + INT_ENTRY(6, ShiftedDB), + INT_ENTRY(6, Flags), + INT_ENTRY(6, IRQActive), + INT_ENTRY(6, Waiting), + INT_ENTRY(6, WaitingForInterrupt), + INT_ENTRY(6, WaitAddress), + INT_ENTRY(6, WaitCounter), + INT_ENTRY(6, PBPCAtOpcodeStart), + INT_ENTRY(6, Executing), + INT_ENTRY(6, overflow), + INT_ENTRY(6, in_char_dma), + INT_ENTRY(6, op1), + INT_ENTRY(6, op2), + INT_ENTRY(6, arithmetic_op), + INT_ENTRY(6, sum), + INT_ENTRY(6, VirtualBitmapFormat), + INT_ENTRY(6, variable_bit_pos) +}; + +#undef STRUCT +#define STRUCT struct SSA1Registers + +static FreezeData SnapSA1Registers[] = +{ + INT_ENTRY(6, PB), + INT_ENTRY(6, DB), + INT_ENTRY(6, P.W), + INT_ENTRY(6, A.W), + INT_ENTRY(6, D.W), + INT_ENTRY(6, S.W), + INT_ENTRY(6, X.W), + INT_ENTRY(6, Y.W), + INT_ENTRY(6, PCw) +}; + +#undef STRUCT +#define STRUCT struct SDSP1 + +static FreezeData SnapDSP1[] = +{ + INT_ENTRY(6, waiting4command), + INT_ENTRY(6, first_parameter), + INT_ENTRY(6, command), + INT_ENTRY(6, in_count), + INT_ENTRY(6, in_index), + INT_ENTRY(6, out_count), + INT_ENTRY(6, out_index), + ARRAY_ENTRY(6, parameters, 512, uint8_ARRAY_V), + ARRAY_ENTRY(6, output, 512, uint8_ARRAY_V), + INT_ENTRY(6, CentreX), + INT_ENTRY(6, CentreY), + INT_ENTRY(6, VOffset), + INT_ENTRY(6, VPlane_C), + INT_ENTRY(6, VPlane_E), + INT_ENTRY(6, SinAas), + INT_ENTRY(6, CosAas), + INT_ENTRY(6, SinAzs), + INT_ENTRY(6, CosAzs), + INT_ENTRY(6, SinAZS), + INT_ENTRY(6, CosAZS), + INT_ENTRY(6, SecAZS_C1), + INT_ENTRY(6, SecAZS_E1), + INT_ENTRY(6, SecAZS_C2), + INT_ENTRY(6, SecAZS_E2), + INT_ENTRY(6, Nx), + INT_ENTRY(6, Ny), + INT_ENTRY(6, Nz), + INT_ENTRY(6, Gx), + INT_ENTRY(6, Gy), + INT_ENTRY(6, Gz), + INT_ENTRY(6, C_Les), + INT_ENTRY(6, E_Les), + INT_ENTRY(6, G_Les), +#define O(N) \ + ARRAY_ENTRY(6, matrixA[N], 3, uint16_ARRAY_V), \ + ARRAY_ENTRY(6, matrixB[N], 3, uint16_ARRAY_V), \ + ARRAY_ENTRY(6, matrixC[N], 3, uint16_ARRAY_V) + O(0), O(1), O(2), +#undef O + INT_ENTRY(6, Op00Multiplicand), + INT_ENTRY(6, Op00Multiplier), + INT_ENTRY(6, Op00Result), + INT_ENTRY(6, Op20Multiplicand), + INT_ENTRY(6, Op20Multiplier), + INT_ENTRY(6, Op20Result), + INT_ENTRY(6, Op10Coefficient), + INT_ENTRY(6, Op10Exponent), + INT_ENTRY(6, Op10CoefficientR), + INT_ENTRY(6, Op10ExponentR), + INT_ENTRY(6, Op04Angle), + INT_ENTRY(6, Op04Radius), + INT_ENTRY(6, Op04Sin), + INT_ENTRY(6, Op04Cos), + INT_ENTRY(6, Op0CA), + INT_ENTRY(6, Op0CX1), + INT_ENTRY(6, Op0CY1), + INT_ENTRY(6, Op0CX2), + INT_ENTRY(6, Op0CY2), + INT_ENTRY(6, Op02FX), + INT_ENTRY(6, Op02FY), + INT_ENTRY(6, Op02FZ), + INT_ENTRY(6, Op02LFE), + INT_ENTRY(6, Op02LES), + INT_ENTRY(6, Op02AAS), + INT_ENTRY(6, Op02AZS), + INT_ENTRY(6, Op02VOF), + INT_ENTRY(6, Op02VVA), + INT_ENTRY(6, Op02CX), + INT_ENTRY(6, Op02CY), + INT_ENTRY(6, Op0AVS), + INT_ENTRY(6, Op0AA), + INT_ENTRY(6, Op0AB), + INT_ENTRY(6, Op0AC), + INT_ENTRY(6, Op0AD), + INT_ENTRY(6, Op06X), + INT_ENTRY(6, Op06Y), + INT_ENTRY(6, Op06Z), + INT_ENTRY(6, Op06H), + INT_ENTRY(6, Op06V), + INT_ENTRY(6, Op06M), + INT_ENTRY(6, Op01m), + INT_ENTRY(6, Op01Zr), + INT_ENTRY(6, Op01Xr), + INT_ENTRY(6, Op01Yr), + INT_ENTRY(6, Op11m), + INT_ENTRY(6, Op11Zr), + INT_ENTRY(6, Op11Xr), + INT_ENTRY(6, Op11Yr), + INT_ENTRY(6, Op21m), + INT_ENTRY(6, Op21Zr), + INT_ENTRY(6, Op21Xr), + INT_ENTRY(6, Op21Yr), + INT_ENTRY(6, Op0DX), + INT_ENTRY(6, Op0DY), + INT_ENTRY(6, Op0DZ), + INT_ENTRY(6, Op0DF), + INT_ENTRY(6, Op0DL), + INT_ENTRY(6, Op0DU), + INT_ENTRY(6, Op1DX), + INT_ENTRY(6, Op1DY), + INT_ENTRY(6, Op1DZ), + INT_ENTRY(6, Op1DF), + INT_ENTRY(6, Op1DL), + INT_ENTRY(6, Op1DU), + INT_ENTRY(6, Op2DX), + INT_ENTRY(6, Op2DY), + INT_ENTRY(6, Op2DZ), + INT_ENTRY(6, Op2DF), + INT_ENTRY(6, Op2DL), + INT_ENTRY(6, Op2DU), + INT_ENTRY(6, Op03F), + INT_ENTRY(6, Op03L), + INT_ENTRY(6, Op03U), + INT_ENTRY(6, Op03X), + INT_ENTRY(6, Op03Y), + INT_ENTRY(6, Op03Z), + INT_ENTRY(6, Op13F), + INT_ENTRY(6, Op13L), + INT_ENTRY(6, Op13U), + INT_ENTRY(6, Op13X), + INT_ENTRY(6, Op13Y), + INT_ENTRY(6, Op13Z), + INT_ENTRY(6, Op23F), + INT_ENTRY(6, Op23L), + INT_ENTRY(6, Op23U), + INT_ENTRY(6, Op23X), + INT_ENTRY(6, Op23Y), + INT_ENTRY(6, Op23Z), + INT_ENTRY(6, Op14Zr), + INT_ENTRY(6, Op14Xr), + INT_ENTRY(6, Op14Yr), + INT_ENTRY(6, Op14U), + INT_ENTRY(6, Op14F), + INT_ENTRY(6, Op14L), + INT_ENTRY(6, Op14Zrr), + INT_ENTRY(6, Op14Xrr), + INT_ENTRY(6, Op14Yrr), + INT_ENTRY(6, Op0EH), + INT_ENTRY(6, Op0EV), + INT_ENTRY(6, Op0EX), + INT_ENTRY(6, Op0EY), + INT_ENTRY(6, Op0BX), + INT_ENTRY(6, Op0BY), + INT_ENTRY(6, Op0BZ), + INT_ENTRY(6, Op0BS), + INT_ENTRY(6, Op1BX), + INT_ENTRY(6, Op1BY), + INT_ENTRY(6, Op1BZ), + INT_ENTRY(6, Op1BS), + INT_ENTRY(6, Op2BX), + INT_ENTRY(6, Op2BY), + INT_ENTRY(6, Op2BZ), + INT_ENTRY(6, Op2BS), + INT_ENTRY(6, Op28X), + INT_ENTRY(6, Op28Y), + INT_ENTRY(6, Op28Z), + INT_ENTRY(6, Op28R), + INT_ENTRY(6, Op1CX), + INT_ENTRY(6, Op1CY), + INT_ENTRY(6, Op1CZ), + INT_ENTRY(6, Op1CXBR), + INT_ENTRY(6, Op1CYBR), + INT_ENTRY(6, Op1CZBR), + INT_ENTRY(6, Op1CXAR), + INT_ENTRY(6, Op1CYAR), + INT_ENTRY(6, Op1CZAR), + INT_ENTRY(6, Op1CX1), + INT_ENTRY(6, Op1CY1), + INT_ENTRY(6, Op1CZ1), + INT_ENTRY(6, Op1CX2), + INT_ENTRY(6, Op1CY2), + INT_ENTRY(6, Op1CZ2), + INT_ENTRY(6, Op0FRamsize), + INT_ENTRY(6, Op0FPass), + INT_ENTRY(6, Op2FUnknown), + INT_ENTRY(6, Op2FSize), + INT_ENTRY(6, Op08X), + INT_ENTRY(6, Op08Y), + INT_ENTRY(6, Op08Z), + INT_ENTRY(6, Op08Ll), + INT_ENTRY(6, Op08Lh), + INT_ENTRY(6, Op18X), + INT_ENTRY(6, Op18Y), + INT_ENTRY(6, Op18Z), + INT_ENTRY(6, Op18R), + INT_ENTRY(6, Op18D), + INT_ENTRY(6, Op38X), + INT_ENTRY(6, Op38Y), + INT_ENTRY(6, Op38Z), + INT_ENTRY(6, Op38R), + INT_ENTRY(6, Op38D) +}; + +#undef STRUCT +#define STRUCT struct SDSP2 + +static FreezeData SnapDSP2[] = +{ + INT_ENTRY(6, waiting4command), + INT_ENTRY(6, command), + INT_ENTRY(6, in_count), + INT_ENTRY(6, in_index), + INT_ENTRY(6, out_count), + INT_ENTRY(6, out_index), + ARRAY_ENTRY(6, parameters, 512, uint8_ARRAY_V), + ARRAY_ENTRY(6, output, 512, uint8_ARRAY_V), + INT_ENTRY(6, Op05HasLen), + INT_ENTRY(6, Op05Len), + INT_ENTRY(6, Op05Transparent), + INT_ENTRY(6, Op06HasLen), + INT_ENTRY(6, Op06Len), + INT_ENTRY(6, Op09Word1), + INT_ENTRY(6, Op09Word2), + INT_ENTRY(6, Op0DHasLen), + INT_ENTRY(6, Op0DOutLen), + INT_ENTRY(6, Op0DInLen) +}; + +#undef STRUCT +#define STRUCT struct SDSP4 + +static FreezeData SnapDSP4[] = +{ + INT_ENTRY(6, waiting4command), + INT_ENTRY(6, half_command), + INT_ENTRY(6, command), + INT_ENTRY(6, in_count), + INT_ENTRY(6, in_index), + INT_ENTRY(6, out_count), + INT_ENTRY(6, out_index), + ARRAY_ENTRY(6, parameters, 512, uint8_ARRAY_V), + ARRAY_ENTRY(6, output, 512, uint8_ARRAY_V), + INT_ENTRY(6, byte), + INT_ENTRY(6, address), + INT_ENTRY(6, Logic), + INT_ENTRY(6, lcv), + INT_ENTRY(6, distance), + INT_ENTRY(6, raster), + INT_ENTRY(6, segments), + INT_ENTRY(6, world_x), + INT_ENTRY(6, world_y), + INT_ENTRY(6, world_dx), + INT_ENTRY(6, world_dy), + INT_ENTRY(6, world_ddx), + INT_ENTRY(6, world_ddy), + INT_ENTRY(6, world_xenv), + INT_ENTRY(6, world_yofs), + INT_ENTRY(6, view_x1), + INT_ENTRY(6, view_y1), + INT_ENTRY(6, view_x2), + INT_ENTRY(6, view_y2), + INT_ENTRY(6, view_dx), + INT_ENTRY(6, view_dy), + INT_ENTRY(6, view_xofs1), + INT_ENTRY(6, view_yofs1), + INT_ENTRY(6, view_xofs2), + INT_ENTRY(6, view_yofs2), + INT_ENTRY(6, view_yofsenv), + INT_ENTRY(6, view_turnoff_x), + INT_ENTRY(6, view_turnoff_dx), + INT_ENTRY(6, viewport_cx), + INT_ENTRY(6, viewport_cy), + INT_ENTRY(6, viewport_left), + INT_ENTRY(6, viewport_right), + INT_ENTRY(6, viewport_top), + INT_ENTRY(6, viewport_bottom), + INT_ENTRY(6, sprite_x), + INT_ENTRY(6, sprite_y), + INT_ENTRY(6, sprite_attr), + INT_ENTRY(6, sprite_size), + INT_ENTRY(6, sprite_clipy), + INT_ENTRY(6, sprite_count), +#define O(N) \ + ARRAY_ENTRY(6, poly_clipLf[N], 2, uint16_ARRAY_V), \ + ARRAY_ENTRY(6, poly_clipRt[N], 2, uint16_ARRAY_V), \ + ARRAY_ENTRY(6, poly_ptr[N], 2, uint16_ARRAY_V), \ + ARRAY_ENTRY(6, poly_raster[N], 2, uint16_ARRAY_V), \ + ARRAY_ENTRY(6, poly_top[N], 2, uint16_ARRAY_V), \ + ARRAY_ENTRY(6, poly_bottom[N], 2, uint16_ARRAY_V), \ + ARRAY_ENTRY(6, poly_cx[N], 2, uint16_ARRAY_V) + O(0), O(1), +#undef O + ARRAY_ENTRY(6, poly_start, 2, uint16_ARRAY_V), + ARRAY_ENTRY(6, poly_plane, 2, uint16_ARRAY_V), + ARRAY_ENTRY(6, OAM_attr, 16, uint16_ARRAY_V), + INT_ENTRY(6, OAM_index), + INT_ENTRY(6, OAM_bits), + INT_ENTRY(6, OAM_RowMax), + ARRAY_ENTRY(6, OAM_Row, 32, uint16_ARRAY_V) +}; + +#undef STRUCT +#define STRUCT struct SST010 + +static FreezeData SnapST010[] = +{ + ARRAY_ENTRY(6, input_params, 16, uint8_ARRAY_V), + ARRAY_ENTRY(6, output_params, 16, uint8_ARRAY_V), + INT_ENTRY(6, op_reg), + INT_ENTRY(6, execute), + INT_ENTRY(6, control_enable) +}; + +#undef STRUCT +#define STRUCT struct SOBC1 + +static FreezeData SnapOBC1[] = +{ + INT_ENTRY(6, address), + INT_ENTRY(6, basePtr), + INT_ENTRY(6, shift) +}; + +#undef STRUCT +#define STRUCT struct SSPC7110Snapshot + +static FreezeData SnapSPC7110Snap[] = +{ + INT_ENTRY(6, r4801), + INT_ENTRY(6, r4802), + INT_ENTRY(6, r4803), + INT_ENTRY(6, r4804), + INT_ENTRY(6, r4805), + INT_ENTRY(6, r4806), + INT_ENTRY(6, r4807), + INT_ENTRY(6, r4808), + INT_ENTRY(6, r4809), + INT_ENTRY(6, r480a), + INT_ENTRY(6, r480b), + INT_ENTRY(6, r480c), + INT_ENTRY(6, r4811), + INT_ENTRY(6, r4812), + INT_ENTRY(6, r4813), + INT_ENTRY(6, r4814), + INT_ENTRY(6, r4815), + INT_ENTRY(6, r4816), + INT_ENTRY(6, r4817), + INT_ENTRY(6, r4818), + INT_ENTRY(6, r481x), + INT_ENTRY(6, r4814_latch), + INT_ENTRY(6, r4815_latch), + INT_ENTRY(6, r4820), + INT_ENTRY(6, r4821), + INT_ENTRY(6, r4822), + INT_ENTRY(6, r4823), + INT_ENTRY(6, r4824), + INT_ENTRY(6, r4825), + INT_ENTRY(6, r4826), + INT_ENTRY(6, r4827), + INT_ENTRY(6, r4828), + INT_ENTRY(6, r4829), + INT_ENTRY(6, r482a), + INT_ENTRY(6, r482b), + INT_ENTRY(6, r482c), + INT_ENTRY(6, r482d), + INT_ENTRY(6, r482e), + INT_ENTRY(6, r482f), + INT_ENTRY(6, r4830), + INT_ENTRY(6, r4831), + INT_ENTRY(6, r4832), + INT_ENTRY(6, r4833), + INT_ENTRY(6, r4834), + INT_ENTRY(6, dx_offset), + INT_ENTRY(6, ex_offset), + INT_ENTRY(6, fx_offset), + INT_ENTRY(6, r4840), + INT_ENTRY(6, r4841), + INT_ENTRY(6, r4842), + INT_ENTRY(6, rtc_state), + INT_ENTRY(6, rtc_mode), + INT_ENTRY(6, rtc_index), + INT_ENTRY(6, decomp_mode), + INT_ENTRY(6, decomp_offset), + ARRAY_ENTRY(6, decomp_buffer, SPC7110_DECOMP_BUFFER_SIZE, uint8_ARRAY_V), + INT_ENTRY(6, decomp_buffer_rdoffset), + INT_ENTRY(6, decomp_buffer_wroffset), + INT_ENTRY(6, decomp_buffer_length), +#define O(N) \ + INT_ENTRY(6, context[N].index), \ + INT_ENTRY(6, context[N].invert) + O( 0), O( 1), O( 2), O( 3), O( 4), O( 5), O( 6), O( 7), + O( 8), O( 9), O( 10), O( 11), O( 12), O( 13), O( 14), O( 15), + O( 16), O( 17), O( 18), O( 19), O( 20), O( 21), O( 22), O( 23), + O( 24), O( 25), O( 26), O( 27), O( 28), O( 29), O( 30), O( 31) +#undef O +}; + +#undef STRUCT +#define STRUCT struct SSRTCSnapshot + +static FreezeData SnapSRTCSnap[] = +{ + INT_ENTRY(6, rtc_mode), + INT_ENTRY(6, rtc_index) +}; + +#undef STRUCT +#define STRUCT struct SBSX + +static FreezeData SnapBSX[] = +{ + INT_ENTRY(6, dirty), + INT_ENTRY(6, dirty2), + INT_ENTRY(6, bootup), + INT_ENTRY(6, flash_enable), + INT_ENTRY(6, write_enable), + INT_ENTRY(6, read_enable), + INT_ENTRY(6, flash_command), + INT_ENTRY(6, old_write), + INT_ENTRY(6, new_write), + INT_ENTRY(6, out_index), + ARRAY_ENTRY(6, output, 32, uint8_ARRAY_V), + ARRAY_ENTRY(6, PPU, 32, uint8_ARRAY_V), + ARRAY_ENTRY(6, MMC, 16, uint8_ARRAY_V), + ARRAY_ENTRY(6, prevMMC, 16, uint8_ARRAY_V), + ARRAY_ENTRY(6, test2192, 32, uint8_ARRAY_V) +}; + +#undef STRUCT +#define STRUCT struct SnapshotScreenshotInfo + +static FreezeData SnapScreenshot[] = +{ + INT_ENTRY(6, Width), + INT_ENTRY(6, Height), + INT_ENTRY(6, Interlaced), + ARRAY_ENTRY(6, Data, MAX_SNES_WIDTH * MAX_SNES_HEIGHT * 3, uint8_ARRAY_V) +}; + +#undef STRUCT +#define STRUCT struct SnapshotMovieInfo + +static FreezeData SnapMovie[] = +{ + INT_ENTRY(6, MovieInputDataSize) +}; + +static int UnfreezeBlock (STREAM, const char *, uint8 *, int); +static int UnfreezeBlockCopy (STREAM, const char *, uint8 **, int); +static int UnfreezeStruct (STREAM, const char *, void *, FreezeData *, int, int); +static int UnfreezeStructCopy (STREAM, const char *, uint8 **, FreezeData *, int, int); +static void UnfreezeStructFromCopy (void *, FreezeData *, int, uint8 *, int); +static void FreezeBlock (STREAM, const char *, uint8 *, int); +static void FreezeStruct (STREAM, const char *, void *, FreezeData *, int); + + +void S9xResetSaveTimer (bool8 dontsave) +{ + static time_t t = -1; + + if (!Settings.DontSaveOopsSnapshot && !dontsave && t != -1 && time(NULL) - t > 300) + { + char filename[PATH_MAX + 1]; + char drive[_MAX_DRIVE + 1], dir[_MAX_DIR + 1], def[_MAX_FNAME + 1], ext[_MAX_EXT + 1]; + + _splitpath(Memory.ROMFilename, drive, dir, def, ext); + sprintf(filename, "%s%s%s.%.*s", S9xGetDirectory(SNAPSHOT_DIR), SLASH_STR, def, _MAX_EXT - 1, "oops"); + S9xMessage(S9X_INFO, S9X_FREEZE_FILE_INFO, SAVE_INFO_OOPS); + S9xFreezeGame(filename); + } + + t = time(NULL); +} + +bool8 S9xFreezeGame (const char *filename) +{ + STREAM stream = NULL; + + if (S9xOpenSnapshotFile(filename, FALSE, &stream)) + { + S9xFreezeToStream(stream); + S9xCloseSnapshotFile(stream); + + S9xResetSaveTimer(TRUE); + + const char *base = S9xBasename(filename); + if (S9xMovieActive()) + sprintf(String, MOVIE_INFO_SNAPSHOT " %s", base); + else + sprintf(String, SAVE_INFO_SNAPSHOT " %s", base); + + S9xMessage(S9X_INFO, S9X_FREEZE_FILE_INFO, String); + + return (TRUE); + } + + return (FALSE); +} + +bool8 S9xUnfreezeGame (const char *filename) +{ + STREAM stream = NULL; + char drive[_MAX_DRIVE + 1], dir[_MAX_DIR + 1], def[_MAX_FNAME + 1], ext[_MAX_EXT + 1]; + + const char *base = S9xBasename(filename); + + _splitpath(filename, drive, dir, def, ext); + S9xResetSaveTimer(!strcmp(ext, "oops") || !strcmp(ext, "oop") || !strcmp(ext, ".oops") || !strcmp(ext, ".oop")); + + if (S9xOpenSnapshotFile(filename, TRUE, &stream)) + { + int result; + + result = S9xUnfreezeFromStream(stream); + S9xCloseSnapshotFile(stream); + + if (result != SUCCESS) + { + switch (result) + { + case WRONG_FORMAT: + S9xMessage(S9X_ERROR, S9X_WRONG_FORMAT, SAVE_ERR_WRONG_FORMAT); + break; + + case WRONG_VERSION: + S9xMessage(S9X_ERROR, S9X_WRONG_VERSION, SAVE_ERR_WRONG_VERSION); + break; + + case WRONG_MOVIE_SNAPSHOT: + S9xMessage(S9X_ERROR, S9X_WRONG_MOVIE_SNAPSHOT, MOVIE_ERR_SNAPSHOT_WRONG_MOVIE); + break; + + case NOT_A_MOVIE_SNAPSHOT: + S9xMessage(S9X_ERROR, S9X_NOT_A_MOVIE_SNAPSHOT, MOVIE_ERR_SNAPSHOT_NOT_MOVIE); + break; + + case SNAPSHOT_INCONSISTENT: + S9xMessage(S9X_ERROR, S9X_SNAPSHOT_INCONSISTENT, MOVIE_ERR_SNAPSHOT_INCONSISTENT); + break; + + case FILE_NOT_FOUND: + default: + sprintf(String, SAVE_ERR_ROM_NOT_FOUND, base); + S9xMessage(S9X_ERROR, S9X_ROM_NOT_FOUND, String); + break; + } + + return (FALSE); + } + + if (S9xMovieActive()) + { + if (S9xMovieReadOnly()) + sprintf(String, MOVIE_INFO_REWIND " %s", base); + else + sprintf(String, MOVIE_INFO_RERECORD " %s", base); + } + else + sprintf(String, SAVE_INFO_LOAD " %s", base); + + S9xMessage(S9X_INFO, S9X_FREEZE_FILE_INFO, String); + + return (TRUE); + } + + sprintf(String, SAVE_ERR_SAVE_NOT_FOUND, base); + S9xMessage(S9X_INFO, S9X_FREEZE_FILE_INFO, String); + + return (FALSE); +} + +void S9xFreezeToStream (STREAM stream) +{ + char buffer[1024]; + uint8 *soundsnapshot = new uint8[SPC_SAVE_STATE_BLOCK_SIZE]; + + S9xSetSoundMute(TRUE); + + sprintf(buffer, "%s:%04d\n", SNAPSHOT_MAGIC, SNAPSHOT_VERSION); + WRITE_STREAM(buffer, strlen(buffer), stream); + + sprintf(buffer, "NAM:%06d:%s%c", (int) strlen(Memory.ROMFilename) + 1, Memory.ROMFilename, 0); + WRITE_STREAM(buffer, strlen(buffer) + 1, stream); + + FreezeStruct(stream, "CPU", &CPU, SnapCPU, COUNT(SnapCPU)); + + FreezeStruct(stream, "REG", &Registers, SnapRegisters, COUNT(SnapRegisters)); + + FreezeStruct(stream, "PPU", &PPU, SnapPPU, COUNT(SnapPPU)); + + struct SDMASnapshot dma_snap; + for (int d = 0; d < 8; d++) + dma_snap.dma[d] = DMA[d]; + FreezeStruct(stream, "DMA", &dma_snap, SnapDMA, COUNT(SnapDMA)); + + FreezeBlock (stream, "VRA", Memory.VRAM, 0x10000); + + FreezeBlock (stream, "RAM", Memory.RAM, 0x20000); + + FreezeBlock (stream, "SRA", Memory.SRAM, 0x20000); + + FreezeBlock (stream, "FIL", Memory.FillRAM, 0x8000); + + S9xAPUSaveState(soundsnapshot); + FreezeBlock (stream, "SND", soundsnapshot, SPC_SAVE_STATE_BLOCK_SIZE); + + struct SControlSnapshot ctl_snap; + S9xControlPreSaveState(&ctl_snap); + FreezeStruct(stream, "CTL", &ctl_snap, SnapControls, COUNT(SnapControls)); + + FreezeStruct(stream, "TIM", &Timings, SnapTimings, COUNT(SnapTimings)); + + if (Settings.SuperFX) + { + GSU.avRegAddr = (uint8 *) &GSU.avReg; + FreezeStruct(stream, "SFX", &GSU, SnapFX, COUNT(SnapFX)); + } + + if (Settings.SA1) + { + S9xSA1PackStatus(); + FreezeStruct(stream, "SA1", &SA1, SnapSA1, COUNT(SnapSA1)); + FreezeStruct(stream, "SAR", &SA1Registers, SnapSA1Registers, COUNT(SnapSA1Registers)); + } + + if (Settings.DSP == 1) + FreezeStruct(stream, "DP1", &DSP1, SnapDSP1, COUNT(SnapDSP1)); + + if (Settings.DSP == 2) + FreezeStruct(stream, "DP2", &DSP2, SnapDSP2, COUNT(SnapDSP2)); + + if (Settings.DSP == 4) + FreezeStruct(stream, "DP4", &DSP4, SnapDSP4, COUNT(SnapDSP4)); + + if (Settings.C4) + FreezeBlock (stream, "CX4", Memory.C4RAM, 8192); + + if (Settings.SETA == ST_010) + FreezeStruct(stream, "ST0", &ST010, SnapST010, COUNT(SnapST010)); + + if (Settings.OBC1) + { + FreezeStruct(stream, "OBC", &OBC1, SnapOBC1, COUNT(SnapOBC1)); + FreezeBlock (stream, "OBM", Memory.OBC1RAM, 8192); + } + + if (Settings.SPC7110) + { + S9xSPC7110PreSaveState(); + FreezeStruct(stream, "S71", &s7snap, SnapSPC7110Snap, COUNT(SnapSPC7110Snap)); + } + + if (Settings.SRTC) + { + S9xSRTCPreSaveState(); + FreezeStruct(stream, "SRT", &srtcsnap, SnapSRTCSnap, COUNT(SnapSRTCSnap)); + } + + if (Settings.SRTC || Settings.SPC7110RTC) + FreezeBlock (stream, "CLK", RTCData.reg, 20); + + if (Settings.BS) + FreezeStruct(stream, "BSX", &BSX, SnapBSX, COUNT(SnapBSX)); + + if (Settings.SnapshotScreenshots) + { + SnapshotScreenshotInfo *ssi = new SnapshotScreenshotInfo; + + ssi->Width = min(IPPU.RenderedScreenWidth, MAX_SNES_WIDTH); + ssi->Height = min(IPPU.RenderedScreenHeight, MAX_SNES_HEIGHT); + ssi->Interlaced = GFX.DoInterlace; + + uint8 *rowpix = ssi->Data; + uint16 *screen = GFX.Screen; + + for (int y = 0; y < ssi->Height; y++, screen += GFX.RealPPL) + { + for (int x = 0; x < ssi->Width; x++) + { + uint32 r, g, b; + + DECOMPOSE_PIXEL(screen[x], r, g, b); + *(rowpix++) = r; + *(rowpix++) = g; + *(rowpix++) = b; + } + } + + memset(rowpix, 0, sizeof(ssi->Data) + ssi->Data - rowpix); + + FreezeStruct(stream, "SHO", ssi, SnapScreenshot, COUNT(SnapScreenshot)); + + delete ssi; + } + + if (S9xMovieActive()) + { + uint8 *movie_freeze_buf; + uint32 movie_freeze_size; + + S9xMovieFreeze(&movie_freeze_buf, &movie_freeze_size); + if (movie_freeze_buf) + { + struct SnapshotMovieInfo mi; + + mi.MovieInputDataSize = movie_freeze_size; + FreezeStruct(stream, "MOV", &mi, SnapMovie, COUNT(SnapMovie)); + FreezeBlock (stream, "MID", movie_freeze_buf, movie_freeze_size); + + delete [] movie_freeze_buf; + } + } + + S9xSetSoundMute(FALSE); + + delete [] soundsnapshot; +} + +int S9xUnfreezeFromStream (STREAM stream) +{ + int result = SUCCESS; + int version, len; + char buffer[PATH_MAX + 1]; + + len = strlen(SNAPSHOT_MAGIC) + 1 + 4 + 1; + if (READ_STREAM(buffer, len, stream) != len) + return (WRONG_FORMAT); + + if (strncmp(buffer, SNAPSHOT_MAGIC, strlen(SNAPSHOT_MAGIC)) != 0) + return (WRONG_FORMAT); + + version = atoi(&buffer[strlen(SNAPSHOT_MAGIC) + 1]); + if (version > SNAPSHOT_VERSION) + return (WRONG_VERSION); + + result = UnfreezeBlock(stream, "NAM", (uint8 *) buffer, PATH_MAX); + if (result != SUCCESS) + return (result); + + uint8 *local_cpu = NULL; + uint8 *local_registers = NULL; + uint8 *local_ppu = NULL; + uint8 *local_dma = NULL; + uint8 *local_vram = NULL; + uint8 *local_ram = NULL; + uint8 *local_sram = NULL; + uint8 *local_fillram = NULL; + uint8 *local_apu_sound = NULL; + uint8 *local_control_data = NULL; + uint8 *local_timing_data = NULL; + uint8 *local_superfx = NULL; + uint8 *local_sa1 = NULL; + uint8 *local_sa1_registers = NULL; + uint8 *local_dsp1 = NULL; + uint8 *local_dsp2 = NULL; + uint8 *local_dsp4 = NULL; + uint8 *local_cx4_data = NULL; + uint8 *local_st010 = NULL; + uint8 *local_obc1 = NULL; + uint8 *local_obc1_data = NULL; + uint8 *local_spc7110 = NULL; + uint8 *local_srtc = NULL; + uint8 *local_rtc_data = NULL; + uint8 *local_bsx_data = NULL; + uint8 *local_screenshot = NULL; + uint8 *local_movie_data = NULL; + + do + { + result = UnfreezeStructCopy(stream, "CPU", &local_cpu, SnapCPU, COUNT(SnapCPU), version); + if (result != SUCCESS) + break; + + result = UnfreezeStructCopy(stream, "REG", &local_registers, SnapRegisters, COUNT(SnapRegisters), version); + if (result != SUCCESS) + break; + + result = UnfreezeStructCopy(stream, "PPU", &local_ppu, SnapPPU, COUNT(SnapPPU), version); + if (result != SUCCESS) + break; + + result = UnfreezeStructCopy(stream, "DMA", &local_dma, SnapDMA, COUNT(SnapDMA), version); + if (result != SUCCESS) + break; + + result = UnfreezeBlockCopy (stream, "VRA", &local_vram, 0x10000); + if (result != SUCCESS) + break; + + result = UnfreezeBlockCopy (stream, "RAM", &local_ram, 0x20000); + if (result != SUCCESS) + break; + + result = UnfreezeBlockCopy (stream, "SRA", &local_sram, 0x20000); + if (result != SUCCESS) + break; + + result = UnfreezeBlockCopy (stream, "FIL", &local_fillram, 0x8000); + if (result != SUCCESS) + break; + + result = UnfreezeBlockCopy (stream, "SND", &local_apu_sound, SPC_SAVE_STATE_BLOCK_SIZE); + if (result != SUCCESS) + break; + + result = UnfreezeStructCopy(stream, "CTL", &local_control_data, SnapControls, COUNT(SnapControls), version); + if (result != SUCCESS) + break; + + result = UnfreezeStructCopy(stream, "TIM", &local_timing_data, SnapTimings, COUNT(SnapTimings), version); + if (result != SUCCESS) + break; + + result = UnfreezeStructCopy(stream, "SFX", &local_superfx, SnapFX, COUNT(SnapFX), version); + if (result != SUCCESS && Settings.SuperFX) + break; + + result = UnfreezeStructCopy(stream, "SA1", &local_sa1, SnapSA1, COUNT(SnapSA1), version); + if (result != SUCCESS && Settings.SA1) + break; + + result = UnfreezeStructCopy(stream, "SAR", &local_sa1_registers, SnapSA1Registers, COUNT(SnapSA1Registers), version); + if (result != SUCCESS && Settings.SA1) + break; + + result = UnfreezeStructCopy(stream, "DP1", &local_dsp1, SnapDSP1, COUNT(SnapDSP1), version); + if (result != SUCCESS && Settings.DSP == 1) + break; + + result = UnfreezeStructCopy(stream, "DP2", &local_dsp2, SnapDSP2, COUNT(SnapDSP2), version); + if (result != SUCCESS && Settings.DSP == 2) + break; + + result = UnfreezeStructCopy(stream, "DP4", &local_dsp4, SnapDSP4, COUNT(SnapDSP4), version); + if (result != SUCCESS && Settings.DSP == 4) + break; + + result = UnfreezeBlockCopy (stream, "CX4", &local_cx4_data, 8192); + if (result != SUCCESS && Settings.C4) + break; + + result = UnfreezeStructCopy(stream, "ST0", &local_st010, SnapST010, COUNT(SnapST010), version); + if (result != SUCCESS && Settings.SETA == ST_010) + break; + + result = UnfreezeStructCopy(stream, "OBC", &local_obc1, SnapOBC1, COUNT(SnapOBC1), version); + if (result != SUCCESS && Settings.OBC1) + break; + + result = UnfreezeBlockCopy (stream, "OBM", &local_obc1_data, 8192); + if (result != SUCCESS && Settings.OBC1) + break; + + result = UnfreezeStructCopy(stream, "S71", &local_spc7110, SnapSPC7110Snap, COUNT(SnapSPC7110Snap), version); + if (result != SUCCESS && Settings.SPC7110) + break; + + result = UnfreezeStructCopy(stream, "SRT", &local_srtc, SnapSRTCSnap, COUNT(SnapSRTCSnap), version); + if (result != SUCCESS && Settings.SRTC) + break; + + result = UnfreezeBlockCopy (stream, "CLK", &local_rtc_data, 20); + if (result != SUCCESS && (Settings.SRTC || Settings.SPC7110RTC)) + break; + + result = UnfreezeStructCopy(stream, "BSX", &local_bsx_data, SnapBSX, COUNT(SnapBSX), version); + if (result != SUCCESS && Settings.BS) + break; + + result = UnfreezeStructCopy(stream, "SHO", &local_screenshot, SnapScreenshot, COUNT(SnapScreenshot), version); + + SnapshotMovieInfo mi; + + result = UnfreezeStruct(stream, "MOV", &mi, SnapMovie, COUNT(SnapMovie), version); + if (result != SUCCESS) + { + if (S9xMovieActive()) + { + result = NOT_A_MOVIE_SNAPSHOT; + break; + } + } + else + { + result = UnfreezeBlockCopy(stream, "MID", &local_movie_data, mi.MovieInputDataSize); + if (result != SUCCESS) + { + if (S9xMovieActive()) + { + result = NOT_A_MOVIE_SNAPSHOT; + break; + } + } + + if (S9xMovieActive()) + { + result = S9xMovieUnfreeze(local_movie_data, mi.MovieInputDataSize); + if (result != SUCCESS) + break; + } + } + + result = SUCCESS; + } while (false); + + if (result == SUCCESS) + { + uint32 old_flags = CPU.Flags; + uint32 sa1_old_flags = SA1.Flags; + + S9xSetSoundMute(TRUE); + + S9xReset(); + + UnfreezeStructFromCopy(&CPU, SnapCPU, COUNT(SnapCPU), local_cpu, version); + + UnfreezeStructFromCopy(&Registers, SnapRegisters, COUNT(SnapRegisters), local_registers, version); + + UnfreezeStructFromCopy(&PPU, SnapPPU, COUNT(SnapPPU), local_ppu, version); + + struct SDMASnapshot dma_snap; + UnfreezeStructFromCopy(&dma_snap, SnapDMA, COUNT(SnapDMA), local_dma, version); + + memcpy(Memory.VRAM, local_vram, 0x10000); + + memcpy(Memory.RAM, local_ram, 0x20000); + + memcpy(Memory.SRAM, local_sram, 0x20000); + + memcpy(Memory.FillRAM, local_fillram, 0x8000); + + S9xAPULoadState(local_apu_sound); + + struct SControlSnapshot ctl_snap; + UnfreezeStructFromCopy(&ctl_snap, SnapControls, COUNT(SnapControls), local_control_data, version); + + UnfreezeStructFromCopy(&Timings, SnapTimings, COUNT(SnapTimings), local_timing_data, version); + + if (local_superfx) + { + GSU.avRegAddr = (uint8 *) &GSU.avReg; + UnfreezeStructFromCopy(&GSU, SnapFX, COUNT(SnapFX), local_superfx, version); + } + + if (local_sa1) + UnfreezeStructFromCopy(&SA1, SnapSA1, COUNT(SnapSA1), local_sa1, version); + + if (local_sa1_registers) + UnfreezeStructFromCopy(&SA1Registers, SnapSA1Registers, COUNT(SnapSA1Registers), local_sa1_registers, version); + + if (local_dsp1) + UnfreezeStructFromCopy(&DSP1, SnapDSP1, COUNT(SnapDSP1), local_dsp1, version); + + if (local_dsp2) + UnfreezeStructFromCopy(&DSP2, SnapDSP2, COUNT(SnapDSP2), local_dsp2, version); + + if (local_dsp4) + UnfreezeStructFromCopy(&DSP4, SnapDSP4, COUNT(SnapDSP4), local_dsp4, version); + + if (local_cx4_data) + memcpy(Memory.C4RAM, local_cx4_data, 8192); + + if (local_st010) + UnfreezeStructFromCopy(&ST010, SnapST010, COUNT(SnapST010), local_st010, version); + + if (local_obc1) + UnfreezeStructFromCopy(&OBC1, SnapOBC1, COUNT(SnapOBC1), local_obc1, version); + + if (local_obc1_data) + memcpy(Memory.OBC1RAM, local_obc1_data, 8192); + + if (local_spc7110) + UnfreezeStructFromCopy(&s7snap, SnapSPC7110Snap, COUNT(SnapSPC7110Snap), local_spc7110, version); + + if (local_srtc) + UnfreezeStructFromCopy(&srtcsnap, SnapSRTCSnap, COUNT(SnapSRTCSnap), local_srtc, version); + + if (local_rtc_data) + memcpy(RTCData.reg, local_rtc_data, 20); + + if (local_bsx_data) + UnfreezeStructFromCopy(&BSX, SnapBSX, COUNT(SnapBSX), local_bsx_data, version); + + CPU.Flags |= old_flags & (DEBUG_MODE_FLAG | TRACE_FLAG | SINGLE_STEP_FLAG | FRAME_ADVANCE_FLAG); + ICPU.ShiftedPB = Registers.PB << 16; + ICPU.ShiftedDB = Registers.DB << 16; + S9xSetPCBase(Registers.PBPC); + S9xUnpackStatus(); + S9xFixCycles(); + + for (int d = 0; d < 8; d++) + DMA[d] = dma_snap.dma[d]; + CPU.InDMA = CPU.InHDMA = FALSE; + CPU.InDMAorHDMA = CPU.InWRAMDMAorHDMA = FALSE; + CPU.HDMARanInDMA = 0; + + S9xFixColourBrightness(); + IPPU.ColorsChanged = TRUE; + IPPU.OBJChanged = TRUE; + IPPU.RenderThisFrame = TRUE; + + uint8 hdma_byte = Memory.FillRAM[0x420c]; + S9xSetCPU(hdma_byte, 0x420c); + + S9xControlPostLoadState(&ctl_snap); + + if (local_superfx) + { + GSU.pfPlot = fx_PlotTable[GSU.vMode]; + GSU.pfRpix = fx_PlotTable[GSU.vMode + 5]; + } + + if (local_sa1 && local_sa1_registers) + { + SA1.Flags |= sa1_old_flags & TRACE_FLAG; + S9xSA1PostLoadState(); + } + + if (Settings.SDD1) + S9xSDD1PostLoadState(); + + if (local_spc7110) + S9xSPC7110PostLoadState(version); + + if (local_srtc) + S9xSRTCPostLoadState(version); + + if (local_bsx_data) + S9xBSXPostLoadState(); + + if (local_movie_data) + { + // restore last displayed pad_read status + extern bool8 pad_read, pad_read_last; + bool8 pad_read_temp = pad_read; + + pad_read = pad_read_last; + S9xUpdateFrameCounter(-1); + pad_read = pad_read_temp; + } + + if (local_screenshot) + { + SnapshotScreenshotInfo *ssi = new SnapshotScreenshotInfo; + + UnfreezeStructFromCopy(ssi, SnapScreenshot, COUNT(SnapScreenshot), local_screenshot, version); + + IPPU.RenderedScreenWidth = min(ssi->Width, IMAGE_WIDTH); + IPPU.RenderedScreenHeight = min(ssi->Height, IMAGE_HEIGHT); + const bool8 scaleDownX = IPPU.RenderedScreenWidth < ssi->Width; + const bool8 scaleDownY = IPPU.RenderedScreenHeight < ssi->Height && ssi->Height > SNES_HEIGHT_EXTENDED; + GFX.DoInterlace = Settings.SupportHiRes ? ssi->Interlaced : 0; + + uint8 *rowpix = ssi->Data; + uint16 *screen = GFX.Screen; + + for (int y = 0; y < IPPU.RenderedScreenHeight; y++, screen += GFX.RealPPL) + { + for (int x = 0; x < IPPU.RenderedScreenWidth; x++) + { + uint32 r, g, b; + + r = *(rowpix++); + g = *(rowpix++); + b = *(rowpix++); + + if (scaleDownX) + { + r = (r + *(rowpix++)) >> 1; + g = (g + *(rowpix++)) >> 1; + b = (b + *(rowpix++)) >> 1; + + if (x + x + 1 >= ssi->Width) + break; + } + + screen[x] = BUILD_PIXEL(r, g, b); + } + + if (scaleDownY) + { + rowpix += 3 * ssi->Width; + if (y + y + 1 >= ssi->Height) + break; + } + } + + // black out what we might have missed + for (uint32 y = IPPU.RenderedScreenHeight; y < (uint32) (IMAGE_HEIGHT); y++) + memset(GFX.Screen + y * GFX.RealPPL, 0, GFX.RealPPL * 2); + + delete ssi; + } + else + { + // couldn't load graphics, so black out the screen instead + //for (uint32 y = 0; y < (uint32) (IMAGE_HEIGHT); y++) + // memset(GFX.Screen + y * GFX.RealPPL, 0, GFX.RealPPL * 2); + } + + S9xSetSoundMute(FALSE); + } + + if (local_cpu) delete [] local_cpu; + if (local_registers) delete [] local_registers; + if (local_ppu) delete [] local_ppu; + if (local_dma) delete [] local_dma; + if (local_vram) delete [] local_vram; + if (local_ram) delete [] local_ram; + if (local_sram) delete [] local_sram; + if (local_fillram) delete [] local_fillram; + if (local_apu_sound) delete [] local_apu_sound; + if (local_control_data) delete [] local_control_data; + if (local_timing_data) delete [] local_timing_data; + if (local_superfx) delete [] local_superfx; + if (local_sa1) delete [] local_sa1; + if (local_sa1_registers) delete [] local_sa1_registers; + if (local_dsp1) delete [] local_dsp1; + if (local_dsp2) delete [] local_dsp2; + if (local_dsp4) delete [] local_dsp4; + if (local_cx4_data) delete [] local_cx4_data; + if (local_st010) delete [] local_st010; + if (local_obc1) delete [] local_obc1; + if (local_obc1_data) delete [] local_obc1_data; + if (local_spc7110) delete [] local_spc7110; + if (local_srtc) delete [] local_srtc; + if (local_rtc_data) delete [] local_rtc_data; + if (local_bsx_data) delete [] local_bsx_data; + if (local_screenshot) delete [] local_screenshot; + if (local_movie_data) delete [] local_movie_data; + + return (result); +} + +static int FreezeSize (int size, int type) +{ + switch (type) + { + case uint32_ARRAY_V: + case uint32_INDIR_ARRAY_V: + return (size * 4); + + case uint16_ARRAY_V: + case uint16_INDIR_ARRAY_V: + return (size * 2); + + default: + return (size); + } +} + +static void FreezeStruct (STREAM stream, const char *name, void *base, FreezeData *fields, int num_fields) +{ + int len = 0; + int i, j; + + for (i = 0; i < num_fields; i++) + { + if (SNAPSHOT_VERSION < fields[i].debuted_in) + { + fprintf(stderr, "%s[%p]: field has bad debuted_in value %d, > %d.", name, (void *) fields, fields[i].debuted_in, SNAPSHOT_VERSION); + continue; + } + + if (SNAPSHOT_VERSION < fields[i].deleted_in) + len += FreezeSize(fields[i].size, fields[i].type); + } + + uint8 *block = new uint8[len]; + uint8 *ptr = block; + uint8 *addr; + uint16 word; + uint32 dword; + int64 qaword; + int relativeAddr; + + for (i = 0; i < num_fields; i++) + { + if (SNAPSHOT_VERSION >= fields[i].deleted_in || SNAPSHOT_VERSION < fields[i].debuted_in) + continue; + + addr = (uint8 *) base + fields[i].offset; + + // determine real address of indirect-type fields + // (where the structure contains a pointer to an array rather than the array itself) + if (fields[i].type == uint8_INDIR_ARRAY_V || fields[i].type == uint16_INDIR_ARRAY_V || fields[i].type == uint32_INDIR_ARRAY_V) + addr = (uint8 *) (*((pint *) addr)); + + // convert pointer-type saves from absolute to relative pointers + if (fields[i].type == POINTER_V) + { + uint8 *pointer = (uint8 *) *((pint *) ((uint8 *) base + fields[i].offset)); + uint8 *relativeTo = (uint8 *) *((pint *) ((uint8 *) base + fields[i].offset2)); + relativeAddr = pointer - relativeTo; + addr = (uint8 *) &relativeAddr; + } + + switch (fields[i].type) + { + case INT_V: + case POINTER_V: + switch (fields[i].size) + { + case 1: + *ptr++ = *(addr); + break; + + case 2: + word = *((uint16 *) (addr)); + *ptr++ = (uint8) (word >> 8); + *ptr++ = (uint8) word; + break; + + case 4: + dword = *((uint32 *) (addr)); + *ptr++ = (uint8) (dword >> 24); + *ptr++ = (uint8) (dword >> 16); + *ptr++ = (uint8) (dword >> 8); + *ptr++ = (uint8) dword; + break; + + case 8: + qaword = *((int64 *) (addr)); + *ptr++ = (uint8) (qaword >> 56); + *ptr++ = (uint8) (qaword >> 48); + *ptr++ = (uint8) (qaword >> 40); + *ptr++ = (uint8) (qaword >> 32); + *ptr++ = (uint8) (qaword >> 24); + *ptr++ = (uint8) (qaword >> 16); + *ptr++ = (uint8) (qaword >> 8); + *ptr++ = (uint8) qaword; + break; + } + + break; + + case uint8_ARRAY_V: + case uint8_INDIR_ARRAY_V: + memmove(ptr, addr, fields[i].size); + ptr += fields[i].size; + + break; + + case uint16_ARRAY_V: + case uint16_INDIR_ARRAY_V: + for (j = 0; j < fields[i].size; j++) + { + word = *((uint16 *) (addr + j * 2)); + *ptr++ = (uint8) (word >> 8); + *ptr++ = (uint8) word; + } + + break; + + case uint32_ARRAY_V: + case uint32_INDIR_ARRAY_V: + for (j = 0; j < fields[i].size; j++) + { + dword = *((uint32 *) (addr + j * 4)); + *ptr++ = (uint8) (dword >> 24); + *ptr++ = (uint8) (dword >> 16); + *ptr++ = (uint8) (dword >> 8); + *ptr++ = (uint8) dword; + } + + break; + } + } + + FreezeBlock(stream, name, block, len); + delete [] block; +} + +static void FreezeBlock (STREAM stream, const char *name, uint8 *block, int size) +{ + char buffer[20]; + + // check if it fits in 6 digits. (letting it go over and using strlen isn't safe) + if (size <= 999999) + sprintf(buffer, "%s:%06d:", name, size); + else + { + // to make it fit, pack it in the bytes instead of as digits + sprintf(buffer, "%s:------:", name); + buffer[6] = (unsigned char) ((unsigned) size >> 24); + buffer[7] = (unsigned char) ((unsigned) size >> 16); + buffer[8] = (unsigned char) ((unsigned) size >> 8); + buffer[9] = (unsigned char) ((unsigned) size >> 0); + } + + buffer[11] = 0; + + WRITE_STREAM(buffer, 11, stream); + WRITE_STREAM(block, size, stream); +} + +static int UnfreezeBlock (STREAM stream, const char *name, uint8 *block, int size) +{ + char buffer[20]; + int len = 0, rem = 0; + long rewind = FIND_STREAM(stream); + + size_t l = READ_STREAM(buffer, 11, stream); + buffer[l] = 0; + + if (l != 11 || strncmp(buffer, name, 3) != 0 || buffer[3] != ':') + { + err: + fprintf(stdout, "absent: %s(%d); next: '%.11s'\n", name, size, buffer); + REVERT_STREAM(stream, FIND_STREAM(stream) - l, 0); + return (WRONG_FORMAT); + } + + if (buffer[4] == '-') + { + len = (((unsigned char) buffer[6]) << 24) + | (((unsigned char) buffer[7]) << 16) + | (((unsigned char) buffer[8]) << 8) + | (((unsigned char) buffer[9]) << 0); + } + else + len = atoi(buffer + 4); + + if (len <= 0) + goto err; + + if (len > size) + { + rem = len - size; + len = size; + } + + ZeroMemory(block, size); + + if (READ_STREAM(block, len, stream) != len) + { + REVERT_STREAM(stream, rewind, 0); + return (WRONG_FORMAT); + } + + if (rem) + { + char *junk = new char[rem]; + len = READ_STREAM(junk, rem, stream); + delete [] junk; + if (len != rem) + { + REVERT_STREAM(stream, rewind, 0); + return (WRONG_FORMAT); + } + } + + return (SUCCESS); +} + +static int UnfreezeBlockCopy (STREAM stream, const char *name, uint8 **block, int size) +{ + int result; + + *block = new uint8[size]; + + result = UnfreezeBlock(stream, name, *block, size); + if (result != SUCCESS) + { + delete [] (*block); + *block = NULL; + return (result); + } + + return (SUCCESS); +} + +static int UnfreezeStruct (STREAM stream, const char *name, void *base, FreezeData *fields, int num_fields, int version) +{ + int result; + uint8 *block = NULL; + + result = UnfreezeStructCopy(stream, name, &block, fields, num_fields, version); + if (result != SUCCESS) + { + if (block != NULL) + delete [] block; + return (result); + } + + UnfreezeStructFromCopy(base, fields, num_fields, block, version); + delete [] block; + + return (SUCCESS); +} + +static int UnfreezeStructCopy (STREAM stream, const char *name, uint8 **block, FreezeData *fields, int num_fields, int version) +{ + int len = 0; + + for (int i = 0; i < num_fields; i++) + { + if (version >= fields[i].debuted_in && version < fields[i].deleted_in) + len += FreezeSize(fields[i].size, fields[i].type); + } + + return (UnfreezeBlockCopy(stream, name, block, len)); +} + +static void UnfreezeStructFromCopy (void *sbase, FreezeData *fields, int num_fields, uint8 *block, int version) +{ + uint8 *ptr = block; + uint16 word; + uint32 dword; + int64 qaword; + uint8 *addr; + void *base; + int relativeAddr; + int i, j; + + for (i = 0; i < num_fields; i++) + { + if (version < fields[i].debuted_in || version >= fields[i].deleted_in) + continue; + + base = (SNAPSHOT_VERSION >= fields[i].deleted_in) ? ((void *) &Obsolete) : sbase; + addr = (uint8 *) base + fields[i].offset; + + if (fields[i].type == uint8_INDIR_ARRAY_V || fields[i].type == uint16_INDIR_ARRAY_V || fields[i].type == uint32_INDIR_ARRAY_V) + addr = (uint8 *) (*((pint *) addr)); + + switch (fields[i].type) + { + case INT_V: + case POINTER_V: + switch (fields[i].size) + { + case 1: + if (fields[i].offset < 0) + { + ptr++; + break; + } + + *(addr) = *ptr++; + break; + + case 2: + if (fields[i].offset < 0) + { + ptr += 2; + break; + } + + word = *ptr++ << 8; + word |= *ptr++; + *((uint16 *) (addr)) = word; + break; + + case 4: + if (fields[i].offset < 0) + { + ptr += 4; + break; + } + + dword = *ptr++ << 24; + dword |= *ptr++ << 16; + dword |= *ptr++ << 8; + dword |= *ptr++; + *((uint32 *) (addr)) = dword; + break; + + case 8: + if (fields[i].offset < 0) + { + ptr += 8; + break; + } + + qaword = (int64) *ptr++ << 56; + qaword |= (int64) *ptr++ << 48; + qaword |= (int64) *ptr++ << 40; + qaword |= (int64) *ptr++ << 32; + qaword |= (int64) *ptr++ << 24; + qaword |= (int64) *ptr++ << 16; + qaword |= (int64) *ptr++ << 8; + qaword |= (int64) *ptr++; + *((int64 *) (addr)) = qaword; + break; + + default: + assert(0); + break; + } + + break; + + case uint8_ARRAY_V: + case uint8_INDIR_ARRAY_V: + if (fields[i].offset >= 0) + memmove(addr, ptr, fields[i].size); + ptr += fields[i].size; + + break; + + case uint16_ARRAY_V: + case uint16_INDIR_ARRAY_V: + if (fields[i].offset < 0) + { + ptr += fields[i].size * 2; + break; + } + + for (j = 0; j < fields[i].size; j++) + { + word = *ptr++ << 8; + word |= *ptr++; + *((uint16 *) (addr + j * 2)) = word; + } + + break; + + case uint32_ARRAY_V: + case uint32_INDIR_ARRAY_V: + if (fields[i].offset < 0) + { + ptr += fields[i].size * 4; + break; + } + + for (j = 0; j < fields[i].size; j++) + { + dword = *ptr++ << 24; + dword |= *ptr++ << 16; + dword |= *ptr++ << 8; + dword |= *ptr++; + *((uint32 *) (addr + j * 4)) = dword; + } + + break; + } + + if (fields[i].type == POINTER_V) + { + relativeAddr = (int) *((pint *) ((uint8 *) base + fields[i].offset)); + uint8 *relativeTo = (uint8 *) *((pint *) ((uint8 *) base + fields[i].offset2)); + *((pint *) (addr)) = (pint) (relativeTo + relativeAddr); + } + } +} + +bool8 S9xSPCDump (const char *filename) +{ + FILE *fs; + uint8 buf[SNES_SPC::spc_file_size]; + size_t ignore; + + fs = fopen(filename, "wb"); + if (!fs) + return (FALSE); + + S9xSetSoundMute(TRUE); + + spc_core->init_header(buf); + spc_core->save_spc(buf); + + ignore = fwrite(buf, SNES_SPC::spc_file_size, 1, fs); + + fclose(fs); + + S9xSetSoundMute(FALSE); + + return (TRUE); +} + diff --git a/plugins/snes9x_gx/source/snes9x/snapshot.h b/plugins/snes9x_gx/source/snes9x/snapshot.h new file mode 100644 index 00000000..b3ead241 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/snapshot.h @@ -0,0 +1,199 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _SNAPSHOT_H_ +#define _SNAPSHOT_H_ + +#define SNAPSHOT_MAGIC "#!s9xsnp" +#define SNAPSHOT_VERSION 6 + +#define SUCCESS 1 +#define WRONG_FORMAT (-1) +#define WRONG_VERSION (-2) +#define FILE_NOT_FOUND (-3) +#define WRONG_MOVIE_SNAPSHOT (-4) +#define NOT_A_MOVIE_SNAPSHOT (-5) +#define SNAPSHOT_INCONSISTENT (-6) + +void S9xResetSaveTimer (bool8); +bool8 S9xFreezeGame (const char *); +bool8 S9xUnfreezeGame (const char *); +void S9xFreezeToStream (STREAM); +int S9xUnfreezeFromStream (STREAM); +bool8 S9xSPCDump (const char *); + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/snes9x.h b/plugins/snes9x_gx/source/snes9x/snes9x.h new file mode 100644 index 00000000..a58be71f --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/snes9x.h @@ -0,0 +1,480 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _SNES9X_H_ +#define _SNES9X_H_ + +#ifndef VERSION +#define VERSION "1.53" +#endif + +#include "port.h" +#include "65c816.h" +#include "messages.h" + +#define S9X_ACCURACY_LEVEL 3 + +#ifdef ZLIB +#include <zlib.h> +#define STREAM gzFile +#define READ_STREAM(p, l, s) gzread(s, p, l) +#define WRITE_STREAM(p, l, s) gzwrite(s, p, l) +#define GETS_STREAM(p, l, s) gzgets(s, p, l) +#define GETC_STREAM(s) gzgetc(s) +#define OPEN_STREAM(f, m) gzopen(f, m) +#define REOPEN_STREAM(f, m) gzdopen(f, m) +#define FIND_STREAM(f) gztell(f) +#define REVERT_STREAM(f, o, s) gzseek(f, o, s) +#define CLOSE_STREAM(s) gzclose(s) +#else +#define STREAM FILE * +#define READ_STREAM(p, l, s) fread(p, 1, l, s) +#define WRITE_STREAM(p, l, s) fwrite(p, 1, l, s) +#define GETS_STREAM(p, l, s) fgets(p, l, s) +#define GETC_STREAM(s) fgetc(s) +#define OPEN_STREAM(f, m) fopen(f, m) +#define REOPEN_STREAM(f, m) fdopen(f, m) +#define FIND_STREAM(f) ftell(f) +#define REVERT_STREAM(f, o, s) fseek(f, o, s) +#define CLOSE_STREAM(s) fclose(s) +#endif + +#define SNES_WIDTH 256 +#define SNES_HEIGHT 224 +#define SNES_HEIGHT_EXTENDED 239 +#define MAX_SNES_WIDTH (SNES_WIDTH * 2) +#define MAX_SNES_HEIGHT (SNES_HEIGHT_EXTENDED * 2) +#define IMAGE_WIDTH (Settings.SupportHiRes ? MAX_SNES_WIDTH : SNES_WIDTH) +#define IMAGE_HEIGHT (Settings.SupportHiRes ? MAX_SNES_HEIGHT : SNES_HEIGHT_EXTENDED) + +#define NTSC_MASTER_CLOCK 21477272.0 +#define PAL_MASTER_CLOCK 21281370.0 + +#define SNES_MAX_NTSC_VCOUNTER 262 +#define SNES_MAX_PAL_VCOUNTER 312 +#define SNES_HCOUNTER_MAX 341 + +#define ONE_CYCLE 6 +#define SLOW_ONE_CYCLE 8 +#define TWO_CYCLES 12 +#define ONE_DOT_CYCLE 4 + +#define SNES_CYCLES_PER_SCANLINE (SNES_HCOUNTER_MAX * ONE_DOT_CYCLE) +#define SNES_SCANLINE_TIME (SNES_CYCLES_PER_SCANLINE / NTSC_MASTER_CLOCK) + +#define SNES_WRAM_REFRESH_HC_v1 530 +#define SNES_WRAM_REFRESH_HC_v2 538 +#define SNES_WRAM_REFRESH_CYCLES 40 + +#define SNES_HBLANK_START_HC 1096 // H=274 +#define SNES_HDMA_START_HC 1106 // FIXME: not true +#define SNES_HBLANK_END_HC 4 // H=1 +#define SNES_HDMA_INIT_HC 20 // FIXME: not true +#define SNES_RENDER_START_HC (48 * ONE_DOT_CYCLE) // FIXME: Snes9x renders a line at a time. + +#define SNES_TR_MASK (1 << 4) +#define SNES_TL_MASK (1 << 5) +#define SNES_X_MASK (1 << 6) +#define SNES_A_MASK (1 << 7) +#define SNES_RIGHT_MASK (1 << 8) +#define SNES_LEFT_MASK (1 << 9) +#define SNES_DOWN_MASK (1 << 10) +#define SNES_UP_MASK (1 << 11) +#define SNES_START_MASK (1 << 12) +#define SNES_SELECT_MASK (1 << 13) +#define SNES_Y_MASK (1 << 14) +#define SNES_B_MASK (1 << 15) + +#define DEBUG_MODE_FLAG (1 << 0) // debugger +#define TRACE_FLAG (1 << 1) // debugger +#define SINGLE_STEP_FLAG (1 << 2) // debugger +#define BREAK_FLAG (1 << 3) // debugger +#define NMI_FLAG (1 << 7) // CPU +#define IRQ_FLAG (1 << 11) // CPU +#define SCAN_KEYS_FLAG (1 << 4) // CPU +#define HALTED_FLAG (1 << 12) // APU +#define FRAME_ADVANCE_FLAG (1 << 9) + +#define ROM_NAME_LEN 23 +#define AUTO_FRAMERATE 200 + +struct SCPUState +{ + int32 Cycles; + int32 PrevCycles; + int32 V_Counter; + uint32 Flags; + uint8 *PCBase; + bool8 IRQActive; + int32 IRQPending; + int32 MemSpeed; + int32 MemSpeedx2; + int32 FastROMSpeed; + bool8 InDMA; + bool8 InHDMA; + bool8 InDMAorHDMA; + bool8 InWRAMDMAorHDMA; + uint8 HDMARanInDMA; + int32 CurrentDMAorHDMAChannel; + uint8 WhichEvent; + int32 NextEvent; + bool8 WaitingForInterrupt; + uint32 WaitAddress; + uint32 WaitCounter; + uint32 PBPCAtOpcodeStart; + uint32 AutoSaveTimer; + bool8 SRAMModified; +}; + +enum +{ + HC_HBLANK_START_EVENT = 1, + HC_IRQ_1_3_EVENT = 2, + HC_HDMA_START_EVENT = 3, + HC_IRQ_3_5_EVENT = 4, + HC_HCOUNTER_MAX_EVENT = 5, + HC_IRQ_5_7_EVENT = 6, + HC_HDMA_INIT_EVENT = 7, + HC_IRQ_7_9_EVENT = 8, + HC_RENDER_EVENT = 9, + HC_IRQ_9_A_EVENT = 10, + HC_WRAM_REFRESH_EVENT = 11, + HC_IRQ_A_1_EVENT = 12 +}; + +struct STimings +{ + int32 H_Max_Master; + int32 H_Max; + int32 V_Max_Master; + int32 V_Max; + int32 HBlankStart; + int32 HBlankEnd; + int32 HDMAInit; + int32 HDMAStart; + int32 NMITriggerPos; + int32 WRAMRefreshPos; + int32 RenderPos; + bool8 InterlaceField; + int32 DMACPUSync; // The cycles to synchronize DMA and CPU. Snes9x cannot emulate correctly. + int32 NMIDMADelay; // The delay of NMI trigger after DMA transfers. Snes9x cannot emulate correctly. + int32 IRQPendCount; // This value is just a hack, because Snes9x cannot emulate any events in an opcode. + int32 APUSpeedup; + bool8 APUAllowTimeOverflow; +}; + +struct SSettings +{ + bool8 TraceDMA; + bool8 TraceHDMA; + bool8 TraceVRAM; + bool8 TraceUnknownRegisters; + bool8 TraceDSP; + bool8 TraceHCEvent; + + bool8 SuperFX; + uint8 DSP; + bool8 SA1; + bool8 C4; + bool8 SDD1; + bool8 SPC7110; + bool8 SPC7110RTC; + bool8 OBC1; + uint8 SETA; + bool8 SRTC; + bool8 BS; + bool8 BSXItself; + bool8 BSXBootup; + bool8 MouseMaster; + bool8 SuperScopeMaster; + bool8 JustifierMaster; + bool8 MultiPlayer5Master; + + bool8 ForceLoROM; + bool8 ForceHiROM; + bool8 ForceHeader; + bool8 ForceNoHeader; + bool8 ForceInterleaved; + bool8 ForceInterleaved2; + bool8 ForceInterleaveGD24; + bool8 ForceNotInterleaved; + bool8 ForcePAL; + bool8 ForceNTSC; + bool8 PAL; + uint32 FrameTimePAL; + uint32 FrameTimeNTSC; + uint32 FrameTime; + + bool8 SoundSync; + bool8 SixteenBitSound; + uint32 SoundPlaybackRate; + uint32 SoundInputRate; + bool8 Stereo; + bool8 ReverseStereo; + bool8 Mute; + + bool8 SupportHiRes; + bool8 Transparency; + uint8 BG_Forced; + bool8 DisableGraphicWindows; + + bool8 DisplayFrameRate; + bool8 DisplayWatchedAddresses; + bool8 DisplayPressedKeys; + bool8 DisplayMovieFrame; + bool8 AutoDisplayMessages; + uint32 InitialInfoStringTimeout; + uint16 DisplayColor; + + bool8 Multi; + char CartAName[PATH_MAX + 1]; + char CartBName[PATH_MAX + 1]; + + bool8 DisableGameSpecificHacks; + bool8 ShutdownMaster; + bool8 Shutdown; + bool8 BlockInvalidVRAMAccessMaster; + bool8 BlockInvalidVRAMAccess; + bool8 DisableIRQ; + bool8 DisableHDMA; + int32 HDMATimingHack; + + bool8 ForcedPause; + bool8 Paused; + bool8 StopEmulation; + + uint32 SkipFrames; + uint32 TurboSkipFrames; + uint32 AutoMaxSkipFrames; + bool8 TurboMode; + uint32 HighSpeedSeek; + bool8 FrameAdvance; + + bool8 NetPlay; + bool8 NetPlayServer; + char ServerName[128]; + int Port; + + bool8 MovieTruncate; + bool8 MovieNotifyIgnored; + bool8 WrongMovieStateProtection; + bool8 DumpStreams; + int DumpStreamsMaxFrames; + + bool8 TakeScreenshot; + int8 StretchScreenshots; + bool8 SnapshotScreenshots; + + bool8 ApplyCheats; + bool8 NoPatch; + int32 AutoSaveDelay; + bool8 DontSaveOopsSnapshot; + bool8 UpAndDown; + + bool8 OpenGLEnable; +}; + +struct SSNESGameFixes +{ + uint8 SRAMInitialValue; + uint8 Uniracers; +}; + +enum +{ + PAUSE_NETPLAY_CONNECT = (1 << 0), + PAUSE_TOGGLE_FULL_SCREEN = (1 << 1), + PAUSE_EXIT = (1 << 2), + PAUSE_MENU = (1 << 3), + PAUSE_INACTIVE_WINDOW = (1 << 4), + PAUSE_WINDOW_ICONISED = (1 << 5), + PAUSE_RESTORE_GUI = (1 << 6), + PAUSE_FREEZE_FILE = (1 << 7) +}; + +void S9xSetPause(uint32); +void S9xClearPause(uint32); +void S9xExit(void); +void S9xMessage(int, int, const char *); + +extern struct SSettings Settings; +extern struct SCPUState CPU; +extern struct STimings Timings; +extern struct SSNESGameFixes SNESGameFixes; +extern char String[513]; + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/spc7110.cpp b/plugins/snes9x_gx/source/snes9x/spc7110.cpp new file mode 100644 index 00000000..5ead6581 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/spc7110.cpp @@ -0,0 +1,488 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + +/***** + * SPC7110 emulator - version 0.03 (2008-08-10) + * Copyright (c) 2008, byuu and neviksti + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * The software is provided "as is" and the author disclaims all warranties + * with regard to this software including all implied warranties of + * merchantibility and fitness, in no event shall the author be liable for + * any special, direct, indirect, or consequential damages or any damages + * whatsoever resulting from loss of use, data or profits, whether in an + * action of contract, negligence or other tortious action, arising out of + * or in connection with the use or performance of this software. + *****/ + + +#include <limits> + +#include "snes9x.h" +#include "memmap.h" +#include "srtc.h" +#include "display.h" + +#define memory_cartrom_size() Memory.CalculatedSize +#define memory_cartrom_read(a) Memory.ROM[(a)] +#define memory_cartrtc_read(a) RTCData.reg[(a)] +#define memory_cartrtc_write(a, b) { RTCData.reg[(a)] = (b); } +#define cartridge_info_spc7110rtc Settings.SPC7110RTC +#define cpu_regs_mdr OpenBus + +#define _SPC7110EMU_CPP_ + +#include <stdint.h> +#include "port.h" + +#include "spc7110emu.h" +#include "spc7110emu.cpp" + +SPC7110 s7emu; + +static void SetSPC7110SRAMMap (uint8); + + +void S9xInitSPC7110 (void) +{ + s7emu.power(); + memset(RTCData.reg, 0, 20); +} + +void S9xResetSPC7110 (void) +{ + s7emu.reset(); +} + +static void SetSPC7110SRAMMap (uint8 newstate) +{ + if (newstate & 0x80) + { + Memory.Map[0x006] = (uint8 *) Memory.MAP_HIROM_SRAM; + Memory.Map[0x007] = (uint8 *) Memory.MAP_HIROM_SRAM; + Memory.Map[0x306] = (uint8 *) Memory.MAP_HIROM_SRAM; + Memory.Map[0x307] = (uint8 *) Memory.MAP_HIROM_SRAM; + } + else + { + Memory.Map[0x006] = (uint8 *) Memory.MAP_RONLY_SRAM; + Memory.Map[0x007] = (uint8 *) Memory.MAP_RONLY_SRAM; + Memory.Map[0x306] = (uint8 *) Memory.MAP_RONLY_SRAM; + Memory.Map[0x307] = (uint8 *) Memory.MAP_RONLY_SRAM; + } +} + +uint8 * S9xGetBasePointerSPC7110 (uint32 address) +{ + uint32 i; + + switch (address & 0xf00000) + { + case 0xd00000: + i = s7emu.dx_offset; + break; + + case 0xe00000: + i = s7emu.ex_offset; + break; + + case 0xf00000: + i = s7emu.fx_offset; + break; + + default: + i = 0; + break; + } + + i += address & 0x0f0000; + + return (&Memory.ROM[i]); +} + +uint8 S9xGetSPC7110Byte (uint32 address) +{ + uint32 i; + + switch (address & 0xf00000) + { + case 0xd00000: + i = s7emu.dx_offset; + break; + + case 0xe00000: + i = s7emu.ex_offset; + break; + + case 0xf00000: + i = s7emu.fx_offset; + break; + + default: + i = 0; + break; + } + + i += address & 0x0fffff; + + return (Memory.ROM[i]); +} + +uint8 S9xGetSPC7110 (uint16 address) +{ + if (!Settings.SPC7110RTC && address > 0x483f) + return (OpenBus); + + return (s7emu.mmio_read(address)); +} + +void S9xSetSPC7110 (uint8 byte, uint16 address) +{ + if (!Settings.SPC7110RTC && address > 0x483f) + return; + + if (address == 0x4830) + SetSPC7110SRAMMap(byte); + + s7emu.mmio_write(address, byte); +} + +void S9xSPC7110PreSaveState (void) +{ + s7snap.r4801 = s7emu.r4801; + s7snap.r4802 = s7emu.r4802; + s7snap.r4803 = s7emu.r4803; + s7snap.r4804 = s7emu.r4804; + s7snap.r4805 = s7emu.r4805; + s7snap.r4806 = s7emu.r4806; + s7snap.r4807 = s7emu.r4807; + s7snap.r4808 = s7emu.r4808; + s7snap.r4809 = s7emu.r4809; + s7snap.r480a = s7emu.r480a; + s7snap.r480b = s7emu.r480b; + s7snap.r480c = s7emu.r480c; + + s7snap.r4811 = s7emu.r4811; + s7snap.r4812 = s7emu.r4812; + s7snap.r4813 = s7emu.r4813; + s7snap.r4814 = s7emu.r4814; + s7snap.r4815 = s7emu.r4815; + s7snap.r4816 = s7emu.r4816; + s7snap.r4817 = s7emu.r4817; + s7snap.r4818 = s7emu.r4818; + + s7snap.r481x = s7emu.r481x; + + s7snap.r4814_latch = s7emu.r4814_latch ? TRUE : FALSE; + s7snap.r4815_latch = s7emu.r4815_latch ? TRUE : FALSE; + + s7snap.r4820 = s7emu.r4820; + s7snap.r4821 = s7emu.r4821; + s7snap.r4822 = s7emu.r4822; + s7snap.r4823 = s7emu.r4823; + s7snap.r4824 = s7emu.r4824; + s7snap.r4825 = s7emu.r4825; + s7snap.r4826 = s7emu.r4826; + s7snap.r4827 = s7emu.r4827; + s7snap.r4828 = s7emu.r4828; + s7snap.r4829 = s7emu.r4829; + s7snap.r482a = s7emu.r482a; + s7snap.r482b = s7emu.r482b; + s7snap.r482c = s7emu.r482c; + s7snap.r482d = s7emu.r482d; + s7snap.r482e = s7emu.r482e; + s7snap.r482f = s7emu.r482f; + + s7snap.r4830 = s7emu.r4830; + s7snap.r4831 = s7emu.r4831; + s7snap.r4832 = s7emu.r4832; + s7snap.r4833 = s7emu.r4833; + s7snap.r4834 = s7emu.r4834; + + s7snap.dx_offset = (uint32) s7emu.dx_offset; + s7snap.ex_offset = (uint32) s7emu.ex_offset; + s7snap.fx_offset = (uint32) s7emu.fx_offset; + + s7snap.r4840 = s7emu.r4840; + s7snap.r4841 = s7emu.r4841; + s7snap.r4842 = s7emu.r4842; + + s7snap.rtc_state = (int32) s7emu.rtc_state; + s7snap.rtc_mode = (int32) s7emu.rtc_mode; + s7snap.rtc_index = (uint32) s7emu.rtc_index; + + s7snap.decomp_mode = (uint32) s7emu.decomp.decomp_mode; + s7snap.decomp_offset = (uint32) s7emu.decomp.decomp_offset; + + for (int i = 0; i < SPC7110_DECOMP_BUFFER_SIZE; i++) + s7snap.decomp_buffer[i] = s7emu.decomp.decomp_buffer[i]; + + s7snap.decomp_buffer_rdoffset = (uint32) s7emu.decomp.decomp_buffer_rdoffset; + s7snap.decomp_buffer_wroffset = (uint32) s7emu.decomp.decomp_buffer_wroffset; + s7snap.decomp_buffer_length = (uint32) s7emu.decomp.decomp_buffer_length; + + for (int i = 0; i < 32; i++) + { + s7snap.context[i].index = s7emu.decomp.context[i].index; + s7snap.context[i].invert = s7emu.decomp.context[i].invert; + } +} + +void S9xSPC7110PostLoadState (int version) +{ + s7emu.r4801 = s7snap.r4801; + s7emu.r4802 = s7snap.r4802; + s7emu.r4803 = s7snap.r4803; + s7emu.r4804 = s7snap.r4804; + s7emu.r4805 = s7snap.r4805; + s7emu.r4806 = s7snap.r4806; + s7emu.r4807 = s7snap.r4807; + s7emu.r4808 = s7snap.r4808; + s7emu.r4809 = s7snap.r4809; + s7emu.r480a = s7snap.r480a; + s7emu.r480b = s7snap.r480b; + s7emu.r480c = s7snap.r480c; + + s7emu.r4811 = s7snap.r4811; + s7emu.r4812 = s7snap.r4812; + s7emu.r4813 = s7snap.r4813; + s7emu.r4814 = s7snap.r4814; + s7emu.r4815 = s7snap.r4815; + s7emu.r4816 = s7snap.r4816; + s7emu.r4817 = s7snap.r4817; + s7emu.r4818 = s7snap.r4818; + + s7emu.r481x = s7snap.r481x; + + s7emu.r4814_latch = s7snap.r4814_latch ? true : false; + s7emu.r4815_latch = s7snap.r4815_latch ? true : false; + + s7emu.r4820 = s7snap.r4820; + s7emu.r4821 = s7snap.r4821; + s7emu.r4822 = s7snap.r4822; + s7emu.r4823 = s7snap.r4823; + s7emu.r4824 = s7snap.r4824; + s7emu.r4825 = s7snap.r4825; + s7emu.r4826 = s7snap.r4826; + s7emu.r4827 = s7snap.r4827; + s7emu.r4828 = s7snap.r4828; + s7emu.r4829 = s7snap.r4829; + s7emu.r482a = s7snap.r482a; + s7emu.r482b = s7snap.r482b; + s7emu.r482c = s7snap.r482c; + s7emu.r482d = s7snap.r482d; + s7emu.r482e = s7snap.r482e; + s7emu.r482f = s7snap.r482f; + + s7emu.r4830 = s7snap.r4830; + s7emu.r4831 = s7snap.r4831; + s7emu.r4832 = s7snap.r4832; + s7emu.r4833 = s7snap.r4833; + s7emu.r4834 = s7snap.r4834; + + s7emu.dx_offset = (unsigned) s7snap.dx_offset; + s7emu.ex_offset = (unsigned) s7snap.ex_offset; + s7emu.fx_offset = (unsigned) s7snap.fx_offset; + + s7emu.r4840 = s7snap.r4840; + s7emu.r4841 = s7snap.r4841; + s7emu.r4842 = s7snap.r4842; + + s7emu.rtc_state = (SPC7110::RTC_State) s7snap.rtc_state; + s7emu.rtc_mode = (SPC7110::RTC_Mode) s7snap.rtc_mode; + s7emu.rtc_index = (unsigned) s7snap.rtc_index; + + s7emu.decomp.decomp_mode = (unsigned) s7snap.decomp_mode; + s7emu.decomp.decomp_offset = (unsigned) s7snap.decomp_offset; + + for (int i = 0; i < SPC7110_DECOMP_BUFFER_SIZE; i++) + s7emu.decomp.decomp_buffer[i] = s7snap.decomp_buffer[i]; + + s7emu.decomp.decomp_buffer_rdoffset = (unsigned) s7snap.decomp_buffer_rdoffset; + s7emu.decomp.decomp_buffer_wroffset = (unsigned) s7snap.decomp_buffer_wroffset; + s7emu.decomp.decomp_buffer_length = (unsigned) s7snap.decomp_buffer_length; + + for (int i = 0; i < 32; i++) + { + s7emu.decomp.context[i].index = s7snap.context[i].index; + s7emu.decomp.context[i].invert = s7snap.context[i].invert; + } + + s7emu.update_time(0); +} diff --git a/plugins/snes9x_gx/source/snes9x/spc7110.h b/plugins/snes9x_gx/source/snes9x/spc7110.h new file mode 100644 index 00000000..7002b509 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/spc7110.h @@ -0,0 +1,275 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _SPC7110_H_ +#define _SPC7110_H_ + +#define SPC7110_DECOMP_BUFFER_SIZE 64 + +// for snapshot only +struct SSPC7110Snapshot +{ + uint8 r4801; + uint8 r4802; + uint8 r4803; + uint8 r4804; + uint8 r4805; + uint8 r4806; + uint8 r4807; + uint8 r4808; + uint8 r4809; + uint8 r480a; + uint8 r480b; + uint8 r480c; + + uint8 r4811; + uint8 r4812; + uint8 r4813; + uint8 r4814; + uint8 r4815; + uint8 r4816; + uint8 r4817; + uint8 r4818; + + uint8 r481x; + + bool8 r4814_latch; // bool + bool8 r4815_latch; // bool + + uint8 r4820; + uint8 r4821; + uint8 r4822; + uint8 r4823; + uint8 r4824; + uint8 r4825; + uint8 r4826; + uint8 r4827; + uint8 r4828; + uint8 r4829; + uint8 r482a; + uint8 r482b; + uint8 r482c; + uint8 r482d; + uint8 r482e; + uint8 r482f; + + uint8 r4830; + uint8 r4831; + uint8 r4832; + uint8 r4833; + uint8 r4834; + + uint32 dx_offset; // unsigned + uint32 ex_offset; // unsigned + uint32 fx_offset; // unsigned + + uint8 r4840; + uint8 r4841; + uint8 r4842; + + int32 rtc_state; // enum RTC_State + int32 rtc_mode; // enum RTC_Mode + uint32 rtc_index; // unsigned + + uint32 decomp_mode; // unsigned + uint32 decomp_offset; // unsigned + + uint8 decomp_buffer[SPC7110_DECOMP_BUFFER_SIZE]; + + uint32 decomp_buffer_rdoffset; // unsigned + uint32 decomp_buffer_wroffset; // unsigned + uint32 decomp_buffer_length; // unsigned + + struct ContextState + { + uint8 index; + uint8 invert; + } context[32]; +}; + +extern struct SSPC7110Snapshot s7snap; + +void S9xInitSPC7110 (void); +void S9xResetSPC7110 (void); +void S9xSPC7110PreSaveState (void); +void S9xSPC7110PostLoadState (int); +void S9xSetSPC7110 (uint8, uint16); +uint8 S9xGetSPC7110 (uint16); +uint8 S9xGetSPC7110Byte (uint32); +uint8 * S9xGetBasePointerSPC7110 (uint32); + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/spc7110dec.cpp b/plugins/snes9x_gx/source/snes9x/spc7110dec.cpp new file mode 100644 index 00000000..65d55868 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/spc7110dec.cpp @@ -0,0 +1,529 @@ +/***** + * SPC7110 emulator - version 0.03 (2008-08-10) + * Copyright (c) 2008, byuu and neviksti + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * The software is provided "as is" and the author disclaims all warranties + * with regard to this software including all implied warranties of + * merchantibility and fitness, in no event shall the author be liable for + * any special, direct, indirect, or consequential damages or any damages + * whatsoever resulting from loss of use, data or profits, whether in an + * action of contract, negligence or other tortious action, arising out of + * or in connection with the use or performance of this software. + *****/ + + +#ifdef _SPC7110EMU_CPP_ + +uint8 SPC7110Decomp::read() { + if(decomp_buffer_length == 0) { + //decompress at least (decomp_buffer_size / 2) bytes to the buffer + switch(decomp_mode) { + case 0: mode0(false); break; + case 1: mode1(false); break; + case 2: mode2(false); break; + default: return 0x00; + } + } + + uint8 data = decomp_buffer[decomp_buffer_rdoffset++]; + decomp_buffer_rdoffset &= decomp_buffer_size - 1; + decomp_buffer_length--; + return data; +} + +void SPC7110Decomp::write(uint8 data) { + decomp_buffer[decomp_buffer_wroffset++] = data; + decomp_buffer_wroffset &= decomp_buffer_size - 1; + decomp_buffer_length++; +} + +uint8 SPC7110Decomp::dataread() { + unsigned size = memory_cartrom_size() - 0x100000; + while(decomp_offset >= size) decomp_offset -= size; + return memory_cartrom_read(0x100000 + decomp_offset++); +} + +void SPC7110Decomp::init(unsigned mode, unsigned offset, unsigned index) { + decomp_mode = mode; + decomp_offset = offset; + + decomp_buffer_rdoffset = 0; + decomp_buffer_wroffset = 0; + decomp_buffer_length = 0; + + //reset context states + for(unsigned i = 0; i < 32; i++) { + context[i].index = 0; + context[i].invert = 0; + } + + switch(decomp_mode) { + case 0: mode0(true); break; + case 1: mode1(true); break; + case 2: mode2(true); break; + } + + //decompress up to requested output data index + while(index--) read(); +} + +// + +void SPC7110Decomp::mode0(bool init) { + static uint8 val, in, span; + static int out, inverts, lps, in_count; + + if(init == true) { + out = inverts = lps = 0; + span = 0xff; + val = dataread(); + in = dataread(); + in_count = 8; + return; + } + + while(decomp_buffer_length < (decomp_buffer_size >> 1)) { + for(unsigned bit = 0; bit < 8; bit++) { + //get context + uint8 mask = (1 << (bit & 3)) - 1; + uint8 con = mask + ((inverts & mask) ^ (lps & mask)); + if(bit > 3) con += 15; + + //get prob and mps + unsigned prob = probability(con); + unsigned mps = (((out >> 15) & 1) ^ context[con].invert); + + //get bit + unsigned flag_lps; + if(val <= span - prob) { //mps + span = span - prob; + out = (out << 1) + mps; + flag_lps = 0; + } else { //lps + val = val - (span - (prob - 1)); + span = prob - 1; + out = (out << 1) + 1 - mps; + flag_lps = 1; + } + + //renormalize + unsigned shift = 0; + while(span < 0x7f) { + shift++; + + span = (span << 1) + 1; + val = (val << 1) + (in >> 7); + + in <<= 1; + if(--in_count == 0) { + in = dataread(); + in_count = 8; + } + } + + //update processing info + lps = (lps << 1) + flag_lps; + inverts = (inverts << 1) + context[con].invert; + + //update context state + if(flag_lps & toggle_invert(con)) context[con].invert ^= 1; + if(flag_lps) context[con].index = next_lps(con); + else if(shift) context[con].index = next_mps(con); + } + + //save byte + write(out); + } +} + +void SPC7110Decomp::mode1(bool init) { + static unsigned pixelorder[4], realorder[4]; + static uint8 in, val, span; + static int out, inverts, lps, in_count; + + if(init == true) { + for(unsigned i = 0; i < 4; i++) pixelorder[i] = i; + out = inverts = lps = 0; + span = 0xff; + val = dataread(); + in = dataread(); + in_count = 8; + return; + } + + while(decomp_buffer_length < (decomp_buffer_size >> 1)) { + for(unsigned pixel = 0; pixel < 8; pixel++) { + //get first symbol context + unsigned a = ((out >> (1 * 2)) & 3); + unsigned b = ((out >> (7 * 2)) & 3); + unsigned c = ((out >> (8 * 2)) & 3); + unsigned con = (a == b) ? (b != c) : (b == c) ? 2 : 4 - (a == c); + + //update pixel order + unsigned m, n; + for(m = 0; m < 4; m++) if(pixelorder[m] == a) break; + for(n = m; n > 0; n--) pixelorder[n] = pixelorder[n - 1]; + pixelorder[0] = a; + + //calculate the real pixel order + for(m = 0; m < 4; m++) realorder[m] = pixelorder[m]; + + //rotate reference pixel c value to top + for(m = 0; m < 4; m++) if(realorder[m] == c) break; + for(n = m; n > 0; n--) realorder[n] = realorder[n - 1]; + realorder[0] = c; + + //rotate reference pixel b value to top + for(m = 0; m < 4; m++) if(realorder[m] == b) break; + for(n = m; n > 0; n--) realorder[n] = realorder[n - 1]; + realorder[0] = b; + + //rotate reference pixel a value to top + for(m = 0; m < 4; m++) if(realorder[m] == a) break; + for(n = m; n > 0; n--) realorder[n] = realorder[n - 1]; + realorder[0] = a; + + //get 2 symbols + for(unsigned bit = 0; bit < 2; bit++) { + //get prob + unsigned prob = probability(con); + + //get symbol + unsigned flag_lps; + if(val <= span - prob) { //mps + span = span - prob; + flag_lps = 0; + } else { //lps + val = val - (span - (prob - 1)); + span = prob - 1; + flag_lps = 1; + } + + //renormalize + unsigned shift = 0; + while(span < 0x7f) { + shift++; + + span = (span << 1) + 1; + val = (val << 1) + (in >> 7); + + in <<= 1; + if(--in_count == 0) { + in = dataread(); + in_count = 8; + } + } + + //update processing info + lps = (lps << 1) + flag_lps; + inverts = (inverts << 1) + context[con].invert; + + //update context state + if(flag_lps & toggle_invert(con)) context[con].invert ^= 1; + if(flag_lps) context[con].index = next_lps(con); + else if(shift) context[con].index = next_mps(con); + + //get next context + con = 5 + (con << 1) + ((lps ^ inverts) & 1); + } + + //get pixel + b = realorder[(lps ^ inverts) & 3]; + out = (out << 2) + b; + } + + //turn pixel data into bitplanes + unsigned data = morton_2x8(out); + write(data >> 8); + write(data >> 0); + } +} + +void SPC7110Decomp::mode2(bool init) { + static unsigned pixelorder[16], realorder[16]; + static uint8 bitplanebuffer[16], buffer_index; + static uint8 in, val, span; + static int out0, out1, inverts, lps, in_count; + + if(init == true) { + for(unsigned i = 0; i < 16; i++) pixelorder[i] = i; + buffer_index = 0; + out0 = out1 = inverts = lps = 0; + span = 0xff; + val = dataread(); + in = dataread(); + in_count = 8; + return; + } + + while(decomp_buffer_length < (decomp_buffer_size >> 1)) { + for(unsigned pixel = 0; pixel < 8; pixel++) { + //get first symbol context + unsigned a = ((out0 >> (0 * 4)) & 15); + unsigned b = ((out0 >> (7 * 4)) & 15); + unsigned c = ((out1 >> (0 * 4)) & 15); + unsigned con = 0; + unsigned refcon = (a == b) ? (b != c) : (b == c) ? 2 : 4 - (a == c); + + //update pixel order + unsigned m, n; + for(m = 0; m < 16; m++) if(pixelorder[m] == a) break; + for(n = m; n > 0; n--) pixelorder[n] = pixelorder[n - 1]; + pixelorder[0] = a; + + //calculate the real pixel order + for(m = 0; m < 16; m++) realorder[m] = pixelorder[m]; + + //rotate reference pixel c value to top + for(m = 0; m < 16; m++) if(realorder[m] == c) break; + for(n = m; n > 0; n--) realorder[n] = realorder[n - 1]; + realorder[0] = c; + + //rotate reference pixel b value to top + for(m = 0; m < 16; m++) if(realorder[m] == b) break; + for(n = m; n > 0; n--) realorder[n] = realorder[n - 1]; + realorder[0] = b; + + //rotate reference pixel a value to top + for(m = 0; m < 16; m++) if(realorder[m] == a) break; + for(n = m; n > 0; n--) realorder[n] = realorder[n - 1]; + realorder[0] = a; + + //get 4 symbols + for(unsigned bit = 0; bit < 4; bit++) { + //get prob + unsigned prob = probability(con); + + //get symbol + unsigned flag_lps; + if(val <= span - prob) { //mps + span = span - prob; + flag_lps = 0; + } else { //lps + val = val - (span - (prob - 1)); + span = prob - 1; + flag_lps = 1; + } + + //renormalize + unsigned shift = 0; + while(span < 0x7f) { + shift++; + + span = (span << 1) + 1; + val = (val << 1) + (in >> 7); + + in <<= 1; + if(--in_count == 0) { + in = dataread(); + in_count = 8; + } + } + + //update processing info + lps = (lps << 1) + flag_lps; + unsigned invertbit = context[con].invert; + inverts = (inverts << 1) + invertbit; + + //update context state + if(flag_lps & toggle_invert(con)) context[con].invert ^= 1; + if(flag_lps) context[con].index = next_lps(con); + else if(shift) context[con].index = next_mps(con); + + //get next context + con = mode2_context_table[con][flag_lps ^ invertbit] + (con == 1 ? refcon : 0); + } + + //get pixel + b = realorder[(lps ^ inverts) & 0x0f]; + out1 = (out1 << 4) + ((out0 >> 28) & 0x0f); + out0 = (out0 << 4) + b; + } + + //convert pixel data into bitplanes + unsigned data = morton_4x8(out0); + write(data >> 24); + write(data >> 16); + bitplanebuffer[buffer_index++] = data >> 8; + bitplanebuffer[buffer_index++] = data >> 0; + + if(buffer_index == 16) { + for(unsigned i = 0; i < 16; i++) write(bitplanebuffer[i]); + buffer_index = 0; + } + } +} + +// + +const uint8 SPC7110Decomp::evolution_table[53][4] = { +//{ prob, nextlps, nextmps, toggle invert }, + + { 0x5a, 1, 1, 1 }, + { 0x25, 6, 2, 0 }, + { 0x11, 8, 3, 0 }, + { 0x08, 10, 4, 0 }, + { 0x03, 12, 5, 0 }, + { 0x01, 15, 5, 0 }, + + { 0x5a, 7, 7, 1 }, + { 0x3f, 19, 8, 0 }, + { 0x2c, 21, 9, 0 }, + { 0x20, 22, 10, 0 }, + { 0x17, 23, 11, 0 }, + { 0x11, 25, 12, 0 }, + { 0x0c, 26, 13, 0 }, + { 0x09, 28, 14, 0 }, + { 0x07, 29, 15, 0 }, + { 0x05, 31, 16, 0 }, + { 0x04, 32, 17, 0 }, + { 0x03, 34, 18, 0 }, + { 0x02, 35, 5, 0 }, + + { 0x5a, 20, 20, 1 }, + { 0x48, 39, 21, 0 }, + { 0x3a, 40, 22, 0 }, + { 0x2e, 42, 23, 0 }, + { 0x26, 44, 24, 0 }, + { 0x1f, 45, 25, 0 }, + { 0x19, 46, 26, 0 }, + { 0x15, 25, 27, 0 }, + { 0x11, 26, 28, 0 }, + { 0x0e, 26, 29, 0 }, + { 0x0b, 27, 30, 0 }, + { 0x09, 28, 31, 0 }, + { 0x08, 29, 32, 0 }, + { 0x07, 30, 33, 0 }, + { 0x05, 31, 34, 0 }, + { 0x04, 33, 35, 0 }, + { 0x04, 33, 36, 0 }, + { 0x03, 34, 37, 0 }, + { 0x02, 35, 38, 0 }, + { 0x02, 36, 5, 0 }, + + { 0x58, 39, 40, 1 }, + { 0x4d, 47, 41, 0 }, + { 0x43, 48, 42, 0 }, + { 0x3b, 49, 43, 0 }, + { 0x34, 50, 44, 0 }, + { 0x2e, 51, 45, 0 }, + { 0x29, 44, 46, 0 }, + { 0x25, 45, 24, 0 }, + + { 0x56, 47, 48, 1 }, + { 0x4f, 47, 49, 0 }, + { 0x47, 48, 50, 0 }, + { 0x41, 49, 51, 0 }, + { 0x3c, 50, 52, 0 }, + { 0x37, 51, 43, 0 }, +}; + +const uint8 SPC7110Decomp::mode2_context_table[32][2] = { +//{ next 0, next 1 }, + + { 1, 2 }, + + { 3, 8 }, + { 13, 14 }, + + { 15, 16 }, + { 17, 18 }, + { 19, 20 }, + { 21, 22 }, + { 23, 24 }, + { 25, 26 }, + { 25, 26 }, + { 25, 26 }, + { 25, 26 }, + { 25, 26 }, + { 27, 28 }, + { 29, 30 }, + + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + + { 31, 31 }, +}; + +uint8 SPC7110Decomp::probability (unsigned n) { return evolution_table[context[n].index][0]; } +uint8 SPC7110Decomp::next_lps (unsigned n) { return evolution_table[context[n].index][1]; } +uint8 SPC7110Decomp::next_mps (unsigned n) { return evolution_table[context[n].index][2]; } +bool SPC7110Decomp::toggle_invert(unsigned n) { return evolution_table[context[n].index][3]; } + +unsigned SPC7110Decomp::morton_2x8(unsigned data) { + //reverse morton lookup: de-interleave two 8-bit values + //15, 13, 11, 9, 7, 5, 3, 1 -> 15- 8 + //14, 12, 10, 8, 6, 4, 2, 0 -> 7- 0 + return morton16[0][(data >> 0) & 255] + morton16[1][(data >> 8) & 255]; +} + +unsigned SPC7110Decomp::morton_4x8(unsigned data) { + //reverse morton lookup: de-interleave four 8-bit values + //31, 27, 23, 19, 15, 11, 7, 3 -> 31-24 + //30, 26, 22, 18, 14, 10, 6, 2 -> 23-16 + //29, 25, 21, 17, 13, 9, 5, 1 -> 15- 8 + //28, 24, 20, 16, 12, 8, 4, 0 -> 7- 0 + return morton32[0][(data >> 0) & 255] + morton32[1][(data >> 8) & 255] + + morton32[2][(data >> 16) & 255] + morton32[3][(data >> 24) & 255]; +} + +// + +void SPC7110Decomp::reset() { + //mode 3 is invalid; this is treated as a special case to always return 0x00 + //set to mode 3 so that reading decomp port before starting first decomp will return 0x00 + decomp_mode = 3; + + decomp_buffer_rdoffset = 0; + decomp_buffer_wroffset = 0; + decomp_buffer_length = 0; +} + +SPC7110Decomp::SPC7110Decomp() { + decomp_buffer = new uint8_t[decomp_buffer_size]; + reset(); + + //initialize reverse morton lookup tables + for(unsigned i = 0; i < 256; i++) { + #define map(x, y) (((i >> x) & 1) << y) + //2x8-bit + morton16[1][i] = map(7, 15) + map(6, 7) + map(5, 14) + map(4, 6) + + map(3, 13) + map(2, 5) + map(1, 12) + map(0, 4); + morton16[0][i] = map(7, 11) + map(6, 3) + map(5, 10) + map(4, 2) + + map(3, 9) + map(2, 1) + map(1, 8) + map(0, 0); + //4x8-bit + morton32[3][i] = map(7, 31) + map(6, 23) + map(5, 15) + map(4, 7) + + map(3, 30) + map(2, 22) + map(1, 14) + map(0, 6); + morton32[2][i] = map(7, 29) + map(6, 21) + map(5, 13) + map(4, 5) + + map(3, 28) + map(2, 20) + map(1, 12) + map(0, 4); + morton32[1][i] = map(7, 27) + map(6, 19) + map(5, 11) + map(4, 3) + + map(3, 26) + map(2, 18) + map(1, 10) + map(0, 2); + morton32[0][i] = map(7, 25) + map(6, 17) + map(5, 9) + map(4, 1) + + map(3, 24) + map(2, 16) + map(1, 8) + map(0, 0); + #undef map + } +} + +SPC7110Decomp::~SPC7110Decomp() { + delete[] decomp_buffer; +} + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/spc7110dec.h b/plugins/snes9x_gx/source/snes9x/spc7110dec.h new file mode 100644 index 00000000..3a9c7ce3 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/spc7110dec.h @@ -0,0 +1,67 @@ +/***** + * SPC7110 emulator - version 0.03 (2008-08-10) + * Copyright (c) 2008, byuu and neviksti + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * The software is provided "as is" and the author disclaims all warranties + * with regard to this software including all implied warranties of + * merchantibility and fitness, in no event shall the author be liable for + * any special, direct, indirect, or consequential damages or any damages + * whatsoever resulting from loss of use, data or profits, whether in an + * action of contract, negligence or other tortious action, arising out of + * or in connection with the use or performance of this software. + *****/ + + +#ifndef _SPC7110DEC_H_ +#define _SPC7110DEC_H_ + +class SPC7110Decomp { +public: + uint8 read(); + void init(unsigned mode, unsigned offset, unsigned index); + void reset(); + + SPC7110Decomp(); + ~SPC7110Decomp(); + + unsigned decomp_mode; + unsigned decomp_offset; + + //read() will spool chunks half the size of decomp_buffer_size + enum { decomp_buffer_size = SPC7110_DECOMP_BUFFER_SIZE }; //must be >= 64, and must be a power of two + uint8 *decomp_buffer; + unsigned decomp_buffer_rdoffset; + unsigned decomp_buffer_wroffset; + unsigned decomp_buffer_length; + + void write(uint8 data); + uint8 dataread(); + + void mode0(bool init); + void mode1(bool init); + void mode2(bool init); + + static const uint8 evolution_table[53][4]; + static const uint8 mode2_context_table[32][2]; + + struct ContextState { + uint8 index; + uint8 invert; + } context[32]; + + uint8 probability(unsigned n); + uint8 next_lps(unsigned n); + uint8 next_mps(unsigned n); + bool toggle_invert(unsigned n); + + unsigned morton16[2][256]; + unsigned morton32[4][256]; + unsigned morton_2x8(unsigned data); + unsigned morton_4x8(unsigned data); +}; + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/spc7110emu.cpp b/plugins/snes9x_gx/source/snes9x/spc7110emu.cpp new file mode 100644 index 00000000..69b3e7d5 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/spc7110emu.cpp @@ -0,0 +1,647 @@ +/***** + * SPC7110 emulator - version 0.03 (2008-08-10) + * Copyright (c) 2008, byuu and neviksti + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * The software is provided "as is" and the author disclaims all warranties + * with regard to this software including all implied warranties of + * merchantibility and fitness, in no event shall the author be liable for + * any special, direct, indirect, or consequential damages or any damages + * whatsoever resulting from loss of use, data or profits, whether in an + * action of contract, negligence or other tortious action, arising out of + * or in connection with the use or performance of this software. + *****/ + + +#ifdef _SPC7110EMU_CPP_ + +#include "spc7110dec.cpp" + +const unsigned SPC7110::months[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + + +void SPC7110::power() { + reset(); +} + +void SPC7110::reset() { + r4801 = 0x00; + r4802 = 0x00; + r4803 = 0x00; + r4804 = 0x00; + r4805 = 0x00; + r4806 = 0x00; + r4807 = 0x00; + r4808 = 0x00; + r4809 = 0x00; + r480a = 0x00; + r480b = 0x00; + r480c = 0x00; + + decomp.reset(); + + r4811 = 0x00; + r4812 = 0x00; + r4813 = 0x00; + r4814 = 0x00; + r4815 = 0x00; + r4816 = 0x00; + r4817 = 0x00; + r4818 = 0x00; + + r481x = 0x00; + r4814_latch = false; + r4815_latch = false; + + r4820 = 0x00; + r4821 = 0x00; + r4822 = 0x00; + r4823 = 0x00; + r4824 = 0x00; + r4825 = 0x00; + r4826 = 0x00; + r4827 = 0x00; + r4828 = 0x00; + r4829 = 0x00; + r482a = 0x00; + r482b = 0x00; + r482c = 0x00; + r482d = 0x00; + r482e = 0x00; + r482f = 0x00; + + r4830 = 0x00; + mmio_write(0x4831, 0); + mmio_write(0x4832, 1); + mmio_write(0x4833, 2); + r4834 = 0x00; + + r4840 = 0x00; + r4841 = 0x00; + r4842 = 0x00; + + if(cartridge_info_spc7110rtc) { + rtc_state = RTCS_Inactive; + rtc_mode = RTCM_Linear; + rtc_index = 0; + } +} + +unsigned SPC7110::datarom_addr(unsigned addr) { + unsigned size = memory_cartrom_size() - 0x100000; + while(addr >= size) addr -= size; + return addr + 0x100000; +} + +unsigned SPC7110::data_pointer() { return r4811 + (r4812 << 8) + (r4813 << 16); } +unsigned SPC7110::data_adjust() { return r4814 + (r4815 << 8); } +unsigned SPC7110::data_increment() { return r4816 + (r4817 << 8); } +void SPC7110::set_data_pointer(unsigned addr) { r4811 = addr; r4812 = addr >> 8; r4813 = addr >> 16; } +void SPC7110::set_data_adjust(unsigned addr) { r4814 = addr; r4815 = addr >> 8; } + +void SPC7110::update_time(int offset) { + time_t rtc_time + = (memory_cartrtc_read(16) << 0) + | (memory_cartrtc_read(17) << 8) + | (memory_cartrtc_read(18) << 16) + | (memory_cartrtc_read(19) << 24); + time_t current_time = time(0) - offset; + + //sizeof(time_t) is platform-dependent; though memory::cartrtc needs to be platform-agnostic. + //yet platforms with 32-bit signed time_t will overflow every ~68 years. handle this by + //accounting for overflow at the cost of 1-bit precision (to catch underflow). this will allow + //memory::cartrtc timestamp to remain valid for up to ~34 years from the last update, even if + //time_t overflows. calculation should be valid regardless of number representation, time_t size, + //or whether time_t is signed or unsigned. + time_t diff + = (current_time >= rtc_time) + ? (current_time - rtc_time) + : (std::numeric_limits<time_t>::max() - rtc_time + current_time + 1); //compensate for overflow + if(diff > std::numeric_limits<time_t>::max() / 2) diff = 0; //compensate for underflow + + bool update = true; + if(memory_cartrtc_read(13) & 1) update = false; //do not update if CR0 timer disable flag is set + if(memory_cartrtc_read(15) & 3) update = false; //do not update if CR2 timer disable flags are set + + if(diff > 0 && update == true) { + unsigned second = memory_cartrtc_read( 0) + memory_cartrtc_read( 1) * 10; + unsigned minute = memory_cartrtc_read( 2) + memory_cartrtc_read( 3) * 10; + unsigned hour = memory_cartrtc_read( 4) + memory_cartrtc_read( 5) * 10; + unsigned day = memory_cartrtc_read( 6) + memory_cartrtc_read( 7) * 10; + unsigned month = memory_cartrtc_read( 8) + memory_cartrtc_read( 9) * 10; + unsigned year = memory_cartrtc_read(10) + memory_cartrtc_read(11) * 10; + unsigned weekday = memory_cartrtc_read(12); + + day--; + month--; + year += (year >= 90) ? 1900 : 2000; //range = 1990-2089 + + second += diff; + while(second >= 60) { + second -= 60; + + minute++; + if(minute < 60) continue; + minute = 0; + + hour++; + if(hour < 24) continue; + hour = 0; + + day++; + weekday = (weekday + 1) % 7; + unsigned days = months[month % 12]; + if(days == 28) { + bool leapyear = false; + if((year % 4) == 0) { + leapyear = true; + if((year % 100) == 0 && (year % 400) != 0) leapyear = false; + } + if(leapyear) days++; + } + if(day < days) continue; + day = 0; + + month++; + if(month < 12) continue; + month = 0; + + year++; + } + + day++; + month++; + year %= 100; + + memory_cartrtc_write( 0, second % 10); + memory_cartrtc_write( 1, second / 10); + memory_cartrtc_write( 2, minute % 10); + memory_cartrtc_write( 3, minute / 10); + memory_cartrtc_write( 4, hour % 10); + memory_cartrtc_write( 5, hour / 10); + memory_cartrtc_write( 6, day % 10); + memory_cartrtc_write( 7, day / 10); + memory_cartrtc_write( 8, month % 10); + memory_cartrtc_write( 9, month / 10); + memory_cartrtc_write(10, year % 10); + memory_cartrtc_write(11, (year / 10) % 10); + memory_cartrtc_write(12, weekday % 7); + } + + memory_cartrtc_write(16, current_time >> 0); + memory_cartrtc_write(17, current_time >> 8); + memory_cartrtc_write(18, current_time >> 16); + memory_cartrtc_write(19, current_time >> 24); +} + +uint8 SPC7110::mmio_read(unsigned addr) { + addr &= 0xffff; + + switch(addr) { + //================== + //decompression unit + //================== + + case 0x4800: { + uint16 counter = (r4809 + (r480a << 8)); + counter--; + r4809 = counter; + r480a = counter >> 8; + return decomp.read(); + } + case 0x4801: return r4801; + case 0x4802: return r4802; + case 0x4803: return r4803; + case 0x4804: return r4804; + case 0x4805: return r4805; + case 0x4806: return r4806; + case 0x4807: return r4807; + case 0x4808: return r4808; + case 0x4809: return r4809; + case 0x480a: return r480a; + case 0x480b: return r480b; + case 0x480c: { + uint8 status = r480c; + r480c &= 0x7f; + return status; + } + + //============== + //data port unit + //============== + + case 0x4810: { + if(r481x != 0x07) return 0x00; + + unsigned addr = data_pointer(); + unsigned adjust = data_adjust(); + if(r4818 & 8) adjust = (int16)adjust; //16-bit sign extend + + unsigned adjustaddr = addr; + if(r4818 & 2) { + adjustaddr += adjust; + set_data_adjust(adjust + 1); + } + + uint8 data = memory_cartrom_read(datarom_addr(adjustaddr)); + if(!(r4818 & 2)) { + unsigned increment = (r4818 & 1) ? data_increment() : 1; + if(r4818 & 4) increment = (int16)increment; //16-bit sign extend + + if((r4818 & 16) == 0) { + set_data_pointer(addr + increment); + } else { + set_data_adjust(adjust + increment); + } + } + + return data; + } + case 0x4811: return r4811; + case 0x4812: return r4812; + case 0x4813: return r4813; + case 0x4814: return r4814; + case 0x4815: return r4815; + case 0x4816: return r4816; + case 0x4817: return r4817; + case 0x4818: return r4818; + case 0x481a: { + if(r481x != 0x07) return 0x00; + + unsigned addr = data_pointer(); + unsigned adjust = data_adjust(); + if(r4818 & 8) adjust = (int16)adjust; //16-bit sign extend + + uint8 data = memory_cartrom_read(datarom_addr(addr + adjust)); + if((r4818 & 0x60) == 0x60) { + if((r4818 & 16) == 0) { + set_data_pointer(addr + adjust); + } else { + set_data_adjust(adjust + adjust); + } + } + + return data; + } + + //========= + //math unit + //========= + + case 0x4820: return r4820; + case 0x4821: return r4821; + case 0x4822: return r4822; + case 0x4823: return r4823; + case 0x4824: return r4824; + case 0x4825: return r4825; + case 0x4826: return r4826; + case 0x4827: return r4827; + case 0x4828: return r4828; + case 0x4829: return r4829; + case 0x482a: return r482a; + case 0x482b: return r482b; + case 0x482c: return r482c; + case 0x482d: return r482d; + case 0x482e: return r482e; + case 0x482f: { + uint8 status = r482f; + r482f &= 0x7f; + return status; + } + + //=================== + //memory mapping unit + //=================== + + case 0x4830: return r4830; + case 0x4831: return r4831; + case 0x4832: return r4832; + case 0x4833: return r4833; + case 0x4834: return r4834; + + //==================== + //real-time clock unit + //==================== + + case 0x4840: return r4840; + case 0x4841: { + if(rtc_state == RTCS_Inactive || rtc_state == RTCS_ModeSelect) return 0x00; + + r4842 = 0x80; + uint8 data = memory_cartrtc_read(rtc_index); + rtc_index = (rtc_index + 1) & 15; + return data; + } + case 0x4842: { + uint8 status = r4842; + r4842 &= 0x7f; + return status; + } + } + + return cpu_regs_mdr; +} + +void SPC7110::mmio_write(unsigned addr, uint8 data) { + addr &= 0xffff; + + switch(addr) { + //================== + //decompression unit + //================== + + case 0x4801: r4801 = data; break; + case 0x4802: r4802 = data; break; + case 0x4803: r4803 = data; break; + case 0x4804: r4804 = data; break; + case 0x4805: r4805 = data; break; + case 0x4806: { + r4806 = data; + + unsigned table = (r4801 + (r4802 << 8) + (r4803 << 16)); + unsigned index = (r4804 << 2); + //unsigned length = (r4809 + (r480a << 8)); + unsigned addr = datarom_addr(table + index); + unsigned mode = (memory_cartrom_read(addr + 0)); + unsigned offset = (memory_cartrom_read(addr + 1) << 16) + + (memory_cartrom_read(addr + 2) << 8) + + (memory_cartrom_read(addr + 3) << 0); + + decomp.init(mode, offset, (r4805 + (r4806 << 8)) << mode); + r480c = 0x80; + } break; + + case 0x4807: r4807 = data; break; + case 0x4808: r4808 = data; break; + case 0x4809: r4809 = data; break; + case 0x480a: r480a = data; break; + case 0x480b: r480b = data; break; + + //============== + //data port unit + //============== + + case 0x4811: r4811 = data; r481x |= 0x01; break; + case 0x4812: r4812 = data; r481x |= 0x02; break; + case 0x4813: r4813 = data; r481x |= 0x04; break; + case 0x4814: { + r4814 = data; + r4814_latch = true; + if(!r4815_latch) break; + if(!(r4818 & 2)) break; + if(r4818 & 0x10) break; + + if((r4818 & 0x60) == 0x20) { + unsigned increment = data_adjust() & 0xff; + if(r4818 & 8) increment = (int8)increment; //8-bit sign extend + set_data_pointer(data_pointer() + increment); + } else if((r4818 & 0x60) == 0x40) { + unsigned increment = data_adjust(); + if(r4818 & 8) increment = (int16)increment; //16-bit sign extend + set_data_pointer(data_pointer() + increment); + } + } break; + case 0x4815: { + r4815 = data; + r4815_latch = true; + if(!r4814_latch) break; + if(!(r4818 & 2)) break; + if(r4818 & 0x10) break; + + if((r4818 & 0x60) == 0x20) { + unsigned increment = data_adjust() & 0xff; + if(r4818 & 8) increment = (int8)increment; //8-bit sign extend + set_data_pointer(data_pointer() + increment); + } else if((r4818 & 0x60) == 0x40) { + unsigned increment = data_adjust(); + if(r4818 & 8) increment = (int16)increment; //16-bit sign extend + set_data_pointer(data_pointer() + increment); + } + } break; + case 0x4816: r4816 = data; break; + case 0x4817: r4817 = data; break; + case 0x4818: { + if(r481x != 0x07) break; + + r4818 = data; + r4814_latch = r4815_latch = false; + } break; + + //========= + //math unit + //========= + + case 0x4820: r4820 = data; break; + case 0x4821: r4821 = data; break; + case 0x4822: r4822 = data; break; + case 0x4823: r4823 = data; break; + case 0x4824: r4824 = data; break; + case 0x4825: { + r4825 = data; + + if(r482e & 1) { + //signed 16-bit x 16-bit multiplication + int16 r0 = (int16)(r4824 + (r4825 << 8)); + int16 r1 = (int16)(r4820 + (r4821 << 8)); + + signed result = r0 * r1; + r4828 = result; + r4829 = result >> 8; + r482a = result >> 16; + r482b = result >> 24; + } else { + //unsigned 16-bit x 16-bit multiplication + uint16 r0 = (uint16)(r4824 + (r4825 << 8)); + uint16 r1 = (uint16)(r4820 + (r4821 << 8)); + + unsigned result = r0 * r1; + r4828 = result; + r4829 = result >> 8; + r482a = result >> 16; + r482b = result >> 24; + } + + r482f = 0x80; + } break; + case 0x4826: r4826 = data; break; + case 0x4827: { + r4827 = data; + + if(r482e & 1) { + //signed 32-bit x 16-bit division + int32 dividend = (int32)(r4820 + (r4821 << 8) + (r4822 << 16) + (r4823 << 24)); + int16 divisor = (int16)(r4826 + (r4827 << 8)); + + int32 quotient; + int16 remainder; + + if(divisor) { + quotient = (int32)(dividend / divisor); + remainder = (int32)(dividend % divisor); + } else { + //illegal division by zero + quotient = 0; + remainder = dividend & 0xffff; + } + + r4828 = quotient; + r4829 = quotient >> 8; + r482a = quotient >> 16; + r482b = quotient >> 24; + + r482c = remainder; + r482d = remainder >> 8; + } else { + //unsigned 32-bit x 16-bit division + uint32 dividend = (uint32)(r4820 + (r4821 << 8) + (r4822 << 16) + (r4823 << 24)); + uint16 divisor = (uint16)(r4826 + (r4827 << 8)); + + uint32 quotient; + uint16 remainder; + + if(divisor) { + quotient = (uint32)(dividend / divisor); + remainder = (uint16)(dividend % divisor); + } else { + //illegal division by zero + quotient = 0; + remainder = dividend & 0xffff; + } + + r4828 = quotient; + r4829 = quotient >> 8; + r482a = quotient >> 16; + r482b = quotient >> 24; + + r482c = remainder; + r482d = remainder >> 8; + } + + r482f = 0x80; + } break; + + case 0x482e: { + //reset math unit + r4820 = r4821 = r4822 = r4823 = 0; + r4824 = r4825 = r4826 = r4827 = 0; + r4828 = r4829 = r482a = r482b = 0; + r482c = r482d = 0; + + r482e = data; + } break; + + //=================== + //memory mapping unit + //=================== + + case 0x4830: r4830 = data; break; + + case 0x4831: { + r4831 = data; + dx_offset = datarom_addr((data & 7) * 0x100000); + } break; + + case 0x4832: { + r4832 = data; + ex_offset = datarom_addr((data & 7) * 0x100000); + } break; + + case 0x4833: { + r4833 = data; + fx_offset = datarom_addr((data & 7) * 0x100000); + } break; + + case 0x4834: r4834 = data; break; + + //==================== + //real-time clock unit + //==================== + + case 0x4840: { + r4840 = data; + if(!(r4840 & 1)) { + //disable RTC + rtc_state = RTCS_Inactive; + update_time(); + } else { + //enable RTC + r4842 = 0x80; + rtc_state = RTCS_ModeSelect; + } + } break; + + case 0x4841: { + r4841 = data; + + switch(rtc_state) { + case RTCS_ModeSelect: { + if(data == RTCM_Linear || data == RTCM_Indexed) { + r4842 = 0x80; + rtc_state = RTCS_IndexSelect; + rtc_mode = (RTC_Mode)data; + rtc_index = 0; + } + } break; + + case RTCS_IndexSelect: { + r4842 = 0x80; + rtc_index = data & 15; + if(rtc_mode == RTCM_Linear) rtc_state = RTCS_Write; + } break; + + case RTCS_Write: { + r4842 = 0x80; + + //control register 0 + if(rtc_index == 13) { + //increment second counter + if(data & 2) update_time(+1); + + //round minute counter + if(data & 8) { + update_time(); + + unsigned second = memory_cartrtc_read( 0) + memory_cartrtc_read( 1) * 10; + //clear seconds + memory_cartrtc_write(0, 0); + memory_cartrtc_write(1, 0); + + if(second >= 30) update_time(+60); + } + } + + //control register 2 + if(rtc_index == 15) { + //disable timer and clear second counter + if((data & 1) && !(memory_cartrtc_read(15) & 1)) { + update_time(); + + //clear seconds + memory_cartrtc_write(0, 0); + memory_cartrtc_write(1, 0); + } + + //disable timer + if((data & 2) && !(memory_cartrtc_read(15) & 2)) { + update_time(); + } + } + + memory_cartrtc_write(rtc_index, data & 15); + rtc_index = (rtc_index + 1) & 15; + } break; + + case RTCS_Inactive: { + } break; + } //switch(rtc_state) + } break; + } +} + +SPC7110::SPC7110() { +} + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/spc7110emu.h b/plugins/snes9x_gx/source/snes9x/spc7110emu.h new file mode 100644 index 00000000..5f66fecc --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/spc7110emu.h @@ -0,0 +1,136 @@ +/***** + * SPC7110 emulator - version 0.03 (2008-08-10) + * Copyright (c) 2008, byuu and neviksti + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * The software is provided "as is" and the author disclaims all warranties + * with regard to this software including all implied warranties of + * merchantibility and fitness, in no event shall the author be liable for + * any special, direct, indirect, or consequential damages or any damages + * whatsoever resulting from loss of use, data or profits, whether in an + * action of contract, negligence or other tortious action, arising out of + * or in connection with the use or performance of this software. + *****/ + + +#ifndef _SPC7110EMU_H_ +#define _SPC7110EMU_H_ + +#include "spc7110dec.h" + +class SPC7110 { +public: + void init(); + void enable(); + void power(); + void reset(); + + unsigned datarom_addr(unsigned addr); + + unsigned data_pointer(); + unsigned data_adjust(); + unsigned data_increment(); + void set_data_pointer(unsigned addr); + void set_data_adjust(unsigned addr); + + void update_time(int offset = 0); + time_t create_time(); + + uint8 mmio_read (unsigned addr); + void mmio_write(unsigned addr, uint8 data); + + uint8 read (unsigned addr); + void write(unsigned addr, uint8 data); + + //spc7110decomp + void decomp_init(); + uint8 decomp_read(); + + SPC7110(); + + //================== + //decompression unit + //================== + uint8 r4801; //compression table low + uint8 r4802; //compression table high + uint8 r4803; //compression table bank + uint8 r4804; //compression table index + uint8 r4805; //decompression buffer index low + uint8 r4806; //decompression buffer index high + uint8 r4807; //??? + uint8 r4808; //??? + uint8 r4809; //compression length low + uint8 r480a; //compression length high + uint8 r480b; //decompression control register + uint8 r480c; //decompression status + + SPC7110Decomp decomp; + + //============== + //data port unit + //============== + uint8 r4811; //data pointer low + uint8 r4812; //data pointer high + uint8 r4813; //data pointer bank + uint8 r4814; //data adjust low + uint8 r4815; //data adjust high + uint8 r4816; //data increment low + uint8 r4817; //data increment high + uint8 r4818; //data port control register + + uint8 r481x; + + bool r4814_latch; + bool r4815_latch; + + //========= + //math unit + //========= + uint8 r4820; //16-bit multiplicand B0, 32-bit dividend B0 + uint8 r4821; //16-bit multiplicand B1, 32-bit dividend B1 + uint8 r4822; //32-bit dividend B2 + uint8 r4823; //32-bit dividend B3 + uint8 r4824; //16-bit multiplier B0 + uint8 r4825; //16-bit multiplier B1 + uint8 r4826; //16-bit divisor B0 + uint8 r4827; //16-bit divisor B1 + uint8 r4828; //32-bit product B0, 32-bit quotient B0 + uint8 r4829; //32-bit product B1, 32-bit quotient B1 + uint8 r482a; //32-bit product B2, 32-bit quotient B2 + uint8 r482b; //32-bit product B3, 32-bit quotient B3 + uint8 r482c; //16-bit remainder B0 + uint8 r482d; //16-bit remainder B1 + uint8 r482e; //math control register + uint8 r482f; //math status + + //=================== + //memory mapping unit + //=================== + uint8 r4830; //SRAM write enable + uint8 r4831; //$[d0-df]:[0000-ffff] mapping + uint8 r4832; //$[e0-ef]:[0000-ffff] mapping + uint8 r4833; //$[f0-ff]:[0000-ffff] mapping + uint8 r4834; //??? + + unsigned dx_offset; + unsigned ex_offset; + unsigned fx_offset; + + //==================== + //real-time clock unit + //==================== + uint8 r4840; //RTC latch + uint8 r4841; //RTC index/data port + uint8 r4842; //RTC status + + enum RTC_State { RTCS_Inactive, RTCS_ModeSelect, RTCS_IndexSelect, RTCS_Write } rtc_state; + enum RTC_Mode { RTCM_Linear = 0x03, RTCM_Indexed = 0x0c } rtc_mode; + unsigned rtc_index; + + static const unsigned months[12]; +}; + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/srtc.cpp b/plugins/snes9x_gx/source/snes9x/srtc.cpp new file mode 100644 index 00000000..ca7b91c5 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/srtc.cpp @@ -0,0 +1,245 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + +/***** + * S-RTC emulation code + * Copyright (c) byuu + *****/ + + +#include <limits> + +#include "snes9x.h" +#include "memmap.h" +#include "srtc.h" +#include "display.h" + +#define memory_cartrtc_read(a) RTCData.reg[(a)] +#define memory_cartrtc_write(a, b) { RTCData.reg[(a)] = (b); } +#define cpu_regs_mdr OpenBus + +static inline unsigned max (unsigned a, unsigned b) +{ + return ((a > b) ? a : b); +} + +static inline unsigned min (unsigned a, unsigned b) +{ + return ((a < b) ? a : b); +} + +#define _SRTCEMU_CPP_ + +#include "srtcemu.h" +#include "srtcemu.cpp" + +static SRTC srtcemu; + + +void S9xInitSRTC (void) +{ + srtcemu.power(); + memset(RTCData.reg, 0, 20); +} + +void S9xResetSRTC (void) +{ + srtcemu.reset(); +} + +void S9xSetSRTC (uint8 data, uint16 address) +{ + srtcemu.mmio_write(address, data); +} + +uint8 S9xGetSRTC (uint16 address) +{ + return (srtcemu.mmio_read(address)); +} + +void S9xSRTCPreSaveState (void) +{ + srtcsnap.rtc_mode = (int32) srtcemu.rtc_mode; + srtcsnap.rtc_index = (int32) srtcemu.rtc_index; +} + +void S9xSRTCPostLoadState (int) +{ + srtcemu.rtc_mode = (SRTC::RTC_Mode) srtcsnap.rtc_mode; + srtcemu.rtc_index = (signed) srtcsnap.rtc_index; + + srtcemu.update_time(); +} diff --git a/plugins/snes9x_gx/source/snes9x/srtc.h b/plugins/snes9x_gx/source/snes9x/srtc.h new file mode 100644 index 00000000..8bc441cb --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/srtc.h @@ -0,0 +1,203 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _SRTC_H_ +#define _SRTC_H_ + +struct SRTCData +{ + uint8 reg[20]; +}; + +// for snapshot only +struct SSRTCSnapshot +{ + int32 rtc_mode; // enum RTC_Mode + int32 rtc_index; // signed +}; + +extern struct SRTCData RTCData; +extern struct SSRTCSnapshot srtcsnap; + +void S9xInitSRTC (void); +void S9xResetSRTC (void); +void S9xSRTCPreSaveState (void); +void S9xSRTCPostLoadState (int); +void S9xSetSRTC (uint8, uint16); +uint8 S9xGetSRTC (uint16); + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/srtcemu.cpp b/plugins/snes9x_gx/source/snes9x/srtcemu.cpp new file mode 100644 index 00000000..969b966e --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/srtcemu.cpp @@ -0,0 +1,225 @@ +/***** + * S-RTC emulation code + * Copyright (c) byuu + *****/ + + +#ifdef _SRTCEMU_CPP_ + +const unsigned SRTC::months[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + + +void SRTC::power() { + reset(); +} + +void SRTC::reset() { + rtc_mode = RTCM_Read; + rtc_index = -1; + update_time(); +} + +void SRTC::update_time() { + time_t rtc_time + = (memory_cartrtc_read(16) << 0) + | (memory_cartrtc_read(17) << 8) + | (memory_cartrtc_read(18) << 16) + | (memory_cartrtc_read(19) << 24); + time_t current_time = time(0); + + //sizeof(time_t) is platform-dependent; though memory::cartrtc needs to be platform-agnostic. + //yet platforms with 32-bit signed time_t will overflow every ~68 years. handle this by + //accounting for overflow at the cost of 1-bit precision (to catch underflow). this will allow + //memory::cartrtc timestamp to remain valid for up to ~34 years from the last update, even if + //time_t overflows. calculation should be valid regardless of number representation, time_t size, + //or whether time_t is signed or unsigned. + time_t diff + = (current_time >= rtc_time) + ? (current_time - rtc_time) + : (std::numeric_limits<time_t>::max() - rtc_time + current_time + 1); //compensate for overflow + if(diff > std::numeric_limits<time_t>::max() / 2) diff = 0; //compensate for underflow + + if(diff > 0) { + unsigned second = memory_cartrtc_read( 0) + memory_cartrtc_read( 1) * 10; + unsigned minute = memory_cartrtc_read( 2) + memory_cartrtc_read( 3) * 10; + unsigned hour = memory_cartrtc_read( 4) + memory_cartrtc_read( 5) * 10; + unsigned day = memory_cartrtc_read( 6) + memory_cartrtc_read( 7) * 10; + unsigned month = memory_cartrtc_read( 8); + unsigned year = memory_cartrtc_read( 9) + memory_cartrtc_read(10) * 10 + memory_cartrtc_read(11) * 100; + unsigned weekday = memory_cartrtc_read(12); + + day--; + month--; + year += 1000; + + second += diff; + while(second >= 60) { + second -= 60; + + minute++; + if(minute < 60) continue; + minute = 0; + + hour++; + if(hour < 24) continue; + hour = 0; + + day++; + weekday = (weekday + 1) % 7; + unsigned days = months[month % 12]; + if(days == 28) { + bool leapyear = false; + if((year % 4) == 0) { + leapyear = true; + if((year % 100) == 0 && (year % 400) != 0) leapyear = false; + } + if(leapyear) days++; + } + if(day < days) continue; + day = 0; + + month++; + if(month < 12) continue; + month = 0; + + year++; + } + + day++; + month++; + year -= 1000; + + memory_cartrtc_write( 0, second % 10); + memory_cartrtc_write( 1, second / 10); + memory_cartrtc_write( 2, minute % 10); + memory_cartrtc_write( 3, minute / 10); + memory_cartrtc_write( 4, hour % 10); + memory_cartrtc_write( 5, hour / 10); + memory_cartrtc_write( 6, day % 10); + memory_cartrtc_write( 7, day / 10); + memory_cartrtc_write( 8, month); + memory_cartrtc_write( 9, year % 10); + memory_cartrtc_write(10, (year / 10) % 10); + memory_cartrtc_write(11, year / 100); + memory_cartrtc_write(12, weekday % 7); + } + + memory_cartrtc_write(16, current_time >> 0); + memory_cartrtc_write(17, current_time >> 8); + memory_cartrtc_write(18, current_time >> 16); + memory_cartrtc_write(19, current_time >> 24); +} + +//returns day of week for specified date +//eg 0 = Sunday, 1 = Monday, ... 6 = Saturday +//usage: weekday(2008, 1, 1) returns weekday of January 1st, 2008 +unsigned SRTC::weekday(unsigned year, unsigned month, unsigned day) { + unsigned y = 1900, m = 1; //epoch is 1900-01-01 + unsigned sum = 0; //number of days passed since epoch + + year = max(1900, year); + month = max(1, min(12, month)); + day = max(1, min(31, day)); + + while(y < year) { + bool leapyear = false; + if((y % 4) == 0) { + leapyear = true; + if((y % 100) == 0 && (y % 400) != 0) leapyear = false; + } + sum += leapyear ? 366 : 365; + y++; + } + + while(m < month) { + unsigned days = months[m - 1]; + if(days == 28) { + bool leapyear = false; + if((y % 4) == 0) { + leapyear = true; + if((y % 100) == 0 && (y % 400) != 0) leapyear = false; + } + if(leapyear) days++; + } + sum += days; + m++; + } + + sum += day - 1; + return (sum + 1) % 7; //1900-01-01 was a Monday +} + +uint8 SRTC::mmio_read(unsigned addr) { + addr &= 0xffff; + + if(addr == 0x2800) { + if(rtc_mode != RTCM_Read) return 0x00; + + if(rtc_index < 0) { + update_time(); + rtc_index++; + return 0x0f; + } else if(rtc_index > 12) { + rtc_index = -1; + return 0x0f; + } else { + return memory_cartrtc_read(rtc_index++); + } + } + + return cpu_regs_mdr; +} + +void SRTC::mmio_write(unsigned addr, uint8 data) { + addr &= 0xffff; + + if(addr == 0x2801) { + data &= 0x0f; //only the low four bits are used + + if(data == 0x0d) { + rtc_mode = RTCM_Read; + rtc_index = -1; + return; + } + + if(data == 0x0e) { + rtc_mode = RTCM_Command; + return; + } + + if(data == 0x0f) return; //unknown behavior + + if(rtc_mode == RTCM_Write) { + if(rtc_index >= 0 && rtc_index < 12) { + memory_cartrtc_write(rtc_index++, data); + + if(rtc_index == 12) { + //day of week is automatically calculated and written + unsigned day = memory_cartrtc_read( 6) + memory_cartrtc_read( 7) * 10; + unsigned month = memory_cartrtc_read( 8); + unsigned year = memory_cartrtc_read( 9) + memory_cartrtc_read(10) * 10 + memory_cartrtc_read(11) * 100; + year += 1000; + + memory_cartrtc_write(rtc_index++, weekday(year, month, day)); + } + } + } else if(rtc_mode == RTCM_Command) { + if(data == 0) { + rtc_mode = RTCM_Write; + rtc_index = 0; + } else if(data == 4) { + rtc_mode = RTCM_Ready; + rtc_index = -1; + for(unsigned i = 0; i < 13; i++) memory_cartrtc_write(i, 0); + } else { + //unknown behavior + rtc_mode = RTCM_Ready; + } + } + } +} + +SRTC::SRTC() { +} + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/srtcemu.h b/plugins/snes9x_gx/source/snes9x/srtcemu.h new file mode 100644 index 00000000..fc1af24f --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/srtcemu.h @@ -0,0 +1,30 @@ +/***** + * S-RTC emulation code + * Copyright (c) byuu + *****/ + + +#ifndef _SRTCEMU_H_ +#define _SRTCEMU_H_ + +class SRTC { +public: + void update_time(); + unsigned weekday(unsigned year, unsigned month, unsigned day); + + void init(); + void enable(); + void power(); + void reset(); + + uint8 mmio_read (unsigned addr); + void mmio_write(unsigned addr, uint8 data); + + SRTC(); + + static const unsigned months[12]; + enum RTC_Mode { RTCM_Ready, RTCM_Command, RTCM_Read, RTCM_Write } rtc_mode; + signed rtc_index; +}; + +#endif diff --git a/plugins/snes9x_gx/source/snes9x/tile.cpp b/plugins/snes9x_gx/source/snes9x/tile.cpp new file mode 100644 index 00000000..f8d20827 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/tile.cpp @@ -0,0 +1,1514 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +// This file includes itself multiple times. +// The other option would be to have 4 files, where A includes B, and B includes C 3 times, and C includes D 5 times. +// Look for the following marker to find where the divisions are. + +// Top-level compilation. + +#ifndef _NEWTILE_CPP +#define _NEWTILE_CPP + +#include "snes9x.h" +#include "ppu.h" +#include "tile.h" + +static uint32 pixbit[8][16]; +static uint8 hrbit_odd[256]; +static uint8 hrbit_even[256]; + + +void S9xInitTileRenderer (void) +{ + register int i; + + for (i = 0; i < 16; i++) + { + register uint32 b = 0; + + #ifdef LSB_FIRST + if (i & 8) + b |= 1; + if (i & 4) + b |= 1 << 8; + if (i & 2) + b |= 1 << 16; + if (i & 1) + b |= 1 << 24; + #else + if (i & 8) + b |= 1 << 24; + if (i & 4) + b |= 1 << 16; + if (i & 2) + b |= 1 << 8; + if (i & 1) + b |= 1; + #endif + + for (uint8 bitshift = 0; bitshift < 8; bitshift++) + pixbit[bitshift][i] = b << bitshift; + } + + for (i = 0; i < 256; i++) + { + register uint8 m = 0; + register uint8 s = 0; + + if (i & 0x80) + s |= 8; + if (i & 0x40) + m |= 8; + if (i & 0x20) + s |= 4; + if (i & 0x10) + m |= 4; + if (i & 0x08) + s |= 2; + if (i & 0x04) + m |= 2; + if (i & 0x02) + s |= 1; + if (i & 0x01) + m |= 1; + + hrbit_odd[i] = m; + hrbit_even[i] = s; + } +} + +// Here are the tile converters, selected by S9xSelectTileConverter(). +// Really, except for the definition of DOBIT and the number of times it is called, they're all the same. + +#define DOBIT(n, i) \ + if ((pix = *(tp + (n)))) \ + { \ + p1 |= pixbit[(i)][pix >> 4]; \ + p2 |= pixbit[(i)][pix & 0xf]; \ + } + +static uint8 ConvertTile2 (uint8 *pCache, uint32 TileAddr, uint32) +{ + register uint8 *tp = &Memory.VRAM[TileAddr]; + uint32 *p = (uint32 *) pCache; + uint32 non_zero = 0; + uint8 line; + + for (line = 8; line != 0; line--, tp += 2) + { + uint32 p1 = 0; + uint32 p2 = 0; + register uint8 pix; + + DOBIT( 0, 0); + DOBIT( 1, 1); + *p++ = p1; + *p++ = p2; + non_zero |= p1 | p2; + } + + return (non_zero ? TRUE : BLANK_TILE); +} + +static uint8 ConvertTile4 (uint8 *pCache, uint32 TileAddr, uint32) +{ + register uint8 *tp = &Memory.VRAM[TileAddr]; + uint32 *p = (uint32 *) pCache; + uint32 non_zero = 0; + uint8 line; + + for (line = 8; line != 0; line--, tp += 2) + { + uint32 p1 = 0; + uint32 p2 = 0; + register uint8 pix; + + DOBIT( 0, 0); + DOBIT( 1, 1); + DOBIT(16, 2); + DOBIT(17, 3); + *p++ = p1; + *p++ = p2; + non_zero |= p1 | p2; + } + + return (non_zero ? TRUE : BLANK_TILE); +} + +static uint8 ConvertTile8 (uint8 *pCache, uint32 TileAddr, uint32) +{ + register uint8 *tp = &Memory.VRAM[TileAddr]; + uint32 *p = (uint32 *) pCache; + uint32 non_zero = 0; + uint8 line; + + for (line = 8; line != 0; line--, tp += 2) + { + uint32 p1 = 0; + uint32 p2 = 0; + register uint8 pix; + + DOBIT( 0, 0); + DOBIT( 1, 1); + DOBIT(16, 2); + DOBIT(17, 3); + DOBIT(32, 4); + DOBIT(33, 5); + DOBIT(48, 6); + DOBIT(49, 7); + *p++ = p1; + *p++ = p2; + non_zero |= p1 | p2; + } + + return (non_zero ? TRUE : BLANK_TILE); +} + +#undef DOBIT + +#define DOBIT(n, i) \ + if ((pix = hrbit_odd[*(tp1 + (n))])) \ + p1 |= pixbit[(i)][pix]; \ + if ((pix = hrbit_odd[*(tp2 + (n))])) \ + p2 |= pixbit[(i)][pix]; + +static uint8 ConvertTile2h_odd (uint8 *pCache, uint32 TileAddr, uint32 Tile) +{ + register uint8 *tp1 = &Memory.VRAM[TileAddr], *tp2; + uint32 *p = (uint32 *) pCache; + uint32 non_zero = 0; + uint8 line; + + if (Tile == 0x3ff) + tp2 = tp1 - (0x3ff << 4); + else + tp2 = tp1 + (1 << 4); + + for (line = 8; line != 0; line--, tp1 += 2, tp2 += 2) + { + uint32 p1 = 0; + uint32 p2 = 0; + register uint8 pix; + + DOBIT( 0, 0); + DOBIT( 1, 1); + *p++ = p1; + *p++ = p2; + non_zero |= p1 | p2; + } + + return (non_zero ? TRUE : BLANK_TILE); +} + +static uint8 ConvertTile4h_odd (uint8 *pCache, uint32 TileAddr, uint32 Tile) +{ + register uint8 *tp1 = &Memory.VRAM[TileAddr], *tp2; + uint32 *p = (uint32 *) pCache; + uint32 non_zero = 0; + uint8 line; + + if (Tile == 0x3ff) + tp2 = tp1 - (0x3ff << 5); + else + tp2 = tp1 + (1 << 5); + + for (line = 8; line != 0; line--, tp1 += 2, tp2 += 2) + { + uint32 p1 = 0; + uint32 p2 = 0; + register uint8 pix; + + DOBIT( 0, 0); + DOBIT( 1, 1); + DOBIT(16, 2); + DOBIT(17, 3); + *p++ = p1; + *p++ = p2; + non_zero |= p1 | p2; + } + + return (non_zero ? TRUE : BLANK_TILE); +} + +#undef DOBIT + +#define DOBIT(n, i) \ + if ((pix = hrbit_even[*(tp1 + (n))])) \ + p1 |= pixbit[(i)][pix]; \ + if ((pix = hrbit_even[*(tp2 + (n))])) \ + p2 |= pixbit[(i)][pix]; + +static uint8 ConvertTile2h_even (uint8 *pCache, uint32 TileAddr, uint32 Tile) +{ + register uint8 *tp1 = &Memory.VRAM[TileAddr], *tp2; + uint32 *p = (uint32 *) pCache; + uint32 non_zero = 0; + uint8 line; + + if (Tile == 0x3ff) + tp2 = tp1 - (0x3ff << 4); + else + tp2 = tp1 + (1 << 4); + + for (line = 8; line != 0; line--, tp1 += 2, tp2 += 2) + { + uint32 p1 = 0; + uint32 p2 = 0; + register uint8 pix; + + DOBIT( 0, 0); + DOBIT( 1, 1); + *p++ = p1; + *p++ = p2; + non_zero |= p1 | p2; + } + + return (non_zero ? TRUE : BLANK_TILE); +} + +static uint8 ConvertTile4h_even (uint8 *pCache, uint32 TileAddr, uint32 Tile) +{ + register uint8 *tp1 = &Memory.VRAM[TileAddr], *tp2; + uint32 *p = (uint32 *) pCache; + uint32 non_zero = 0; + uint8 line; + + if (Tile == 0x3ff) + tp2 = tp1 - (0x3ff << 5); + else + tp2 = tp1 + (1 << 5); + + for (line = 8; line != 0; line--, tp1 += 2, tp2 += 2) + { + uint32 p1 = 0; + uint32 p2 = 0; + register uint8 pix; + + DOBIT( 0, 0); + DOBIT( 1, 1); + DOBIT(16, 2); + DOBIT(17, 3); + *p++ = p1; + *p++ = p2; + non_zero |= p1 | p2; + } + + return (non_zero ? TRUE : BLANK_TILE); +} + +#undef DOBIT + +// First-level include: Get all the renderers. + +#include "tile.cpp" + +// Functions to select which converter and renderer to use. + +void S9xSelectTileRenderers (int BGMode, bool8 sub, bool8 obj) +{ + void (**DT) (uint32, uint32, uint32, uint32); + void (**DCT) (uint32, uint32, uint32, uint32, uint32, uint32); + void (**DMP) (uint32, uint32, uint32, uint32, uint32, uint32); + void (**DB) (uint32, uint32, uint32); + void (**DM7BG1) (uint32, uint32, int); + void (**DM7BG2) (uint32, uint32, int); + bool8 M7M1, M7M2; + + M7M1 = PPU.BGMosaic[0] && PPU.Mosaic > 1; + M7M2 = PPU.BGMosaic[1] && PPU.Mosaic > 1; + + bool8 interlace = obj ? FALSE : IPPU.Interlace; + bool8 hires = !sub && (BGMode == 5 || BGMode == 6 || IPPU.PseudoHires); + + if (!IPPU.DoubleWidthPixels) // normal width + { + DT = Renderers_DrawTile16Normal1x1; + DCT = Renderers_DrawClippedTile16Normal1x1; + DMP = Renderers_DrawMosaicPixel16Normal1x1; + DB = Renderers_DrawBackdrop16Normal1x1; + DM7BG1 = M7M1 ? Renderers_DrawMode7MosaicBG1Normal1x1 : Renderers_DrawMode7BG1Normal1x1; + DM7BG2 = M7M2 ? Renderers_DrawMode7MosaicBG2Normal1x1 : Renderers_DrawMode7BG2Normal1x1; + GFX.LinesPerTile = 8; + } + else if(hires) // hires double width + { + if (interlace) + { + DT = Renderers_DrawTile16HiresInterlace; + DCT = Renderers_DrawClippedTile16HiresInterlace; + DMP = Renderers_DrawMosaicPixel16HiresInterlace; + DB = Renderers_DrawBackdrop16Hires; + DM7BG1 = M7M1 ? Renderers_DrawMode7MosaicBG1Hires : Renderers_DrawMode7BG1Hires; + DM7BG2 = M7M2 ? Renderers_DrawMode7MosaicBG2Hires : Renderers_DrawMode7BG2Hires; + GFX.LinesPerTile = 4; + } + else + { + DT = Renderers_DrawTile16Hires; + DCT = Renderers_DrawClippedTile16Hires; + DMP = Renderers_DrawMosaicPixel16Hires; + DB = Renderers_DrawBackdrop16Hires; + DM7BG1 = M7M1 ? Renderers_DrawMode7MosaicBG1Hires : Renderers_DrawMode7BG1Hires; + DM7BG2 = M7M2 ? Renderers_DrawMode7MosaicBG2Hires : Renderers_DrawMode7BG2Hires; + GFX.LinesPerTile = 8; + } + } + else // normal double width + { + if (interlace) + { + DT = Renderers_DrawTile16Interlace; + DCT = Renderers_DrawClippedTile16Interlace; + DMP = Renderers_DrawMosaicPixel16Interlace; + DB = Renderers_DrawBackdrop16Normal2x1; + DM7BG1 = M7M1 ? Renderers_DrawMode7MosaicBG1Normal2x1 : Renderers_DrawMode7BG1Normal2x1; + DM7BG2 = M7M2 ? Renderers_DrawMode7MosaicBG2Normal2x1 : Renderers_DrawMode7BG2Normal2x1; + GFX.LinesPerTile = 4; + } + else + { + DT = Renderers_DrawTile16Normal2x1; + DCT = Renderers_DrawClippedTile16Normal2x1; + DMP = Renderers_DrawMosaicPixel16Normal2x1; + DB = Renderers_DrawBackdrop16Normal2x1; + DM7BG1 = M7M1 ? Renderers_DrawMode7MosaicBG1Normal2x1 : Renderers_DrawMode7BG1Normal2x1; + DM7BG2 = M7M2 ? Renderers_DrawMode7MosaicBG2Normal2x1 : Renderers_DrawMode7BG2Normal2x1; + GFX.LinesPerTile = 8; + } + } + + GFX.DrawTileNomath = DT[0]; + GFX.DrawClippedTileNomath = DCT[0]; + GFX.DrawMosaicPixelNomath = DMP[0]; + GFX.DrawBackdropNomath = DB[0]; + GFX.DrawMode7BG1Nomath = DM7BG1[0]; + GFX.DrawMode7BG2Nomath = DM7BG2[0]; + + int i; + + if (!Settings.Transparency) + i = 0; + else + { + i = (Memory.FillRAM[0x2131] & 0x80) ? 4 : 1; + if (Memory.FillRAM[0x2131] & 0x40) + { + i++; + if (Memory.FillRAM[0x2130] & 2) + i++; + } + } + + GFX.DrawTileMath = DT[i]; + GFX.DrawClippedTileMath = DCT[i]; + GFX.DrawMosaicPixelMath = DMP[i]; + GFX.DrawBackdropMath = DB[i]; + GFX.DrawMode7BG1Math = DM7BG1[i]; + GFX.DrawMode7BG2Math = DM7BG2[i]; +} + +void S9xSelectTileConverter (int depth, bool8 hires, bool8 sub, bool8 mosaic) +{ + switch (depth) + { + case 8: + BG.ConvertTile = BG.ConvertTileFlip = ConvertTile8; + BG.Buffer = BG.BufferFlip = IPPU.TileCache[TILE_8BIT]; + BG.Buffered = BG.BufferedFlip = IPPU.TileCached[TILE_8BIT]; + BG.TileShift = 6; + BG.PaletteShift = 0; + BG.PaletteMask = 0; + BG.DirectColourMode = Memory.FillRAM[0x2130] & 1; + + break; + + case 4: + if (hires) + { + if (sub || mosaic) + { + BG.ConvertTile = ConvertTile4h_even; + BG.Buffer = IPPU.TileCache[TILE_4BIT_EVEN]; + BG.Buffered = IPPU.TileCached[TILE_4BIT_EVEN]; + BG.ConvertTileFlip = ConvertTile4h_odd; + BG.BufferFlip = IPPU.TileCache[TILE_4BIT_ODD]; + BG.BufferedFlip = IPPU.TileCached[TILE_4BIT_ODD]; + } + else + { + BG.ConvertTile = ConvertTile4h_odd; + BG.Buffer = IPPU.TileCache[TILE_4BIT_ODD]; + BG.Buffered = IPPU.TileCached[TILE_4BIT_ODD]; + BG.ConvertTileFlip = ConvertTile4h_even; + BG.BufferFlip = IPPU.TileCache[TILE_4BIT_EVEN]; + BG.BufferedFlip = IPPU.TileCached[TILE_4BIT_EVEN]; + } + } + else + { + BG.ConvertTile = BG.ConvertTileFlip = ConvertTile4; + BG.Buffer = BG.BufferFlip = IPPU.TileCache[TILE_4BIT]; + BG.Buffered = BG.BufferedFlip = IPPU.TileCached[TILE_4BIT]; + } + + BG.TileShift = 5; + BG.PaletteShift = 10 - 4; + BG.PaletteMask = 7 << 4; + BG.DirectColourMode = FALSE; + + break; + + case 2: + if (hires) + { + if (sub || mosaic) + { + BG.ConvertTile = ConvertTile2h_even; + BG.Buffer = IPPU.TileCache[TILE_2BIT_EVEN]; + BG.Buffered = IPPU.TileCached[TILE_2BIT_EVEN]; + BG.ConvertTileFlip = ConvertTile2h_odd; + BG.BufferFlip = IPPU.TileCache[TILE_2BIT_ODD]; + BG.BufferedFlip = IPPU.TileCached[TILE_2BIT_ODD]; + } + else + { + BG.ConvertTile = ConvertTile2h_odd; + BG.Buffer = IPPU.TileCache[TILE_2BIT_ODD]; + BG.Buffered = IPPU.TileCached[TILE_2BIT_ODD]; + BG.ConvertTileFlip = ConvertTile2h_even; + BG.BufferFlip = IPPU.TileCache[TILE_2BIT_EVEN]; + BG.BufferedFlip = IPPU.TileCached[TILE_2BIT_EVEN]; + } + } + else + { + BG.ConvertTile = BG.ConvertTileFlip = ConvertTile2; + BG.Buffer = BG.BufferFlip = IPPU.TileCache[TILE_2BIT]; + BG.Buffered = BG.BufferedFlip = IPPU.TileCached[TILE_2BIT]; + } + + BG.TileShift = 4; + BG.PaletteShift = 10 - 2; + BG.PaletteMask = 7 << 2; + BG.DirectColourMode = FALSE; + + break; + } +} + +/*****************************************************************************/ +#else +#ifndef NAME1 // First-level: Get all the renderers. +/*****************************************************************************/ + +#define GET_CACHED_TILE() \ + uint32 TileNumber; \ + uint32 TileAddr = BG.TileAddress + ((Tile & 0x3ff) << BG.TileShift); \ + if (Tile & 0x100) \ + TileAddr += BG.NameSelect; \ + TileAddr &= 0xffff; \ + TileNumber = TileAddr >> BG.TileShift; \ + if (Tile & H_FLIP) \ + { \ + pCache = &BG.BufferFlip[TileNumber << 6]; \ + if (!BG.BufferedFlip[TileNumber]) \ + BG.BufferedFlip[TileNumber] = BG.ConvertTileFlip(pCache, TileAddr, Tile & 0x3ff); \ + } \ + else \ + { \ + pCache = &BG.Buffer[TileNumber << 6]; \ + if (!BG.Buffered[TileNumber]) \ + BG.Buffered[TileNumber] = BG.ConvertTile(pCache, TileAddr, Tile & 0x3ff); \ + } + +#define IS_BLANK_TILE() \ + (BG.Buffered[TileNumber] == BLANK_TILE) + +#define SELECT_PALETTE() \ + if (BG.DirectColourMode) \ + { \ + if (IPPU.DirectColourMapsNeedRebuild) \ + S9xBuildDirectColourMaps(); \ + GFX.RealScreenColors = DirectColourMaps[(Tile >> 10) & 7]; \ + } \ + else \ + GFX.RealScreenColors = &IPPU.ScreenColors[((Tile >> BG.PaletteShift) & BG.PaletteMask) + BG.StartPalette]; \ + GFX.ScreenColors = GFX.ClipColors ? BlackColourMap : GFX.RealScreenColors + +#define NOMATH(Op, Main, Sub, SD) \ + (Main) + +#define REGMATH(Op, Main, Sub, SD) \ + (COLOR_##Op((Main), ((SD) & 0x20) ? (Sub) : GFX.FixedColour)) + +#define MATHF1_2(Op, Main, Sub, SD) \ + (GFX.ClipColors ? (COLOR_##Op((Main), GFX.FixedColour)) : (COLOR_##Op##1_2((Main), GFX.FixedColour))) + +#define MATHS1_2(Op, Main, Sub, SD) \ + (GFX.ClipColors ? REGMATH(Op, Main, Sub, SD) : (((SD) & 0x20) ? COLOR_##Op##1_2((Main), (Sub)) : COLOR_##Op((Main), GFX.FixedColour))) + +// Basic routine to render an unclipped tile. +// Input parameters: +// BPSTART = either StartLine or (StartLine * 2 + BG.InterlaceLine), +// so interlace modes can render every other line from the tile. +// PITCH = 1 or 2, again so interlace can count lines properly. +// DRAW_PIXEL(N, M) is a routine to actually draw the pixel. N is the pixel in the row to draw, +// and M is a test which if false means the pixel should be skipped. +// Z1 is the "draw if Z1 > cur_depth". +// Z2 is the "cur_depth = new_depth". OBJ need the two separate. +// Pix is the pixel to draw. + +#define Z1 GFX.Z1 +#define Z2 GFX.Z2 + +#define DRAW_TILE() \ + uint8 *pCache; \ + register int32 l; \ + register uint8 *bp, Pix; \ + \ + GET_CACHED_TILE(); \ + if (IS_BLANK_TILE()) \ + return; \ + SELECT_PALETTE(); \ + \ + if (!(Tile & (V_FLIP | H_FLIP))) \ + { \ + bp = pCache + BPSTART; \ + for (l = LineCount; l > 0; l--, bp += 8 * PITCH, Offset += GFX.PPL) \ + { \ + DRAW_PIXEL(0, Pix = bp[0]); \ + DRAW_PIXEL(1, Pix = bp[1]); \ + DRAW_PIXEL(2, Pix = bp[2]); \ + DRAW_PIXEL(3, Pix = bp[3]); \ + DRAW_PIXEL(4, Pix = bp[4]); \ + DRAW_PIXEL(5, Pix = bp[5]); \ + DRAW_PIXEL(6, Pix = bp[6]); \ + DRAW_PIXEL(7, Pix = bp[7]); \ + } \ + } \ + else \ + if (!(Tile & V_FLIP)) \ + { \ + bp = pCache + BPSTART; \ + for (l = LineCount; l > 0; l--, bp += 8 * PITCH, Offset += GFX.PPL) \ + { \ + DRAW_PIXEL(0, Pix = bp[7]); \ + DRAW_PIXEL(1, Pix = bp[6]); \ + DRAW_PIXEL(2, Pix = bp[5]); \ + DRAW_PIXEL(3, Pix = bp[4]); \ + DRAW_PIXEL(4, Pix = bp[3]); \ + DRAW_PIXEL(5, Pix = bp[2]); \ + DRAW_PIXEL(6, Pix = bp[1]); \ + DRAW_PIXEL(7, Pix = bp[0]); \ + } \ + } \ + else \ + if (!(Tile & H_FLIP)) \ + { \ + bp = pCache + 56 - BPSTART; \ + for (l = LineCount; l > 0; l--, bp -= 8 * PITCH, Offset += GFX.PPL) \ + { \ + DRAW_PIXEL(0, Pix = bp[0]); \ + DRAW_PIXEL(1, Pix = bp[1]); \ + DRAW_PIXEL(2, Pix = bp[2]); \ + DRAW_PIXEL(3, Pix = bp[3]); \ + DRAW_PIXEL(4, Pix = bp[4]); \ + DRAW_PIXEL(5, Pix = bp[5]); \ + DRAW_PIXEL(6, Pix = bp[6]); \ + DRAW_PIXEL(7, Pix = bp[7]); \ + } \ + } \ + else \ + { \ + bp = pCache + 56 - BPSTART; \ + for (l = LineCount; l > 0; l--, bp -= 8 * PITCH, Offset += GFX.PPL) \ + { \ + DRAW_PIXEL(0, Pix = bp[7]); \ + DRAW_PIXEL(1, Pix = bp[6]); \ + DRAW_PIXEL(2, Pix = bp[5]); \ + DRAW_PIXEL(3, Pix = bp[4]); \ + DRAW_PIXEL(4, Pix = bp[3]); \ + DRAW_PIXEL(5, Pix = bp[2]); \ + DRAW_PIXEL(6, Pix = bp[1]); \ + DRAW_PIXEL(7, Pix = bp[0]); \ + } \ + } + +#define NAME1 DrawTile16 +#define ARGS uint32 Tile, uint32 Offset, uint32 StartLine, uint32 LineCount + +// Second-level include: Get the DrawTile16 renderers. + +#include "tile.cpp" + +#undef NAME1 +#undef ARGS +#undef DRAW_TILE +#undef Z1 +#undef Z2 + +// Basic routine to render a clipped tile. Inputs same as above. + +#define Z1 GFX.Z1 +#define Z2 GFX.Z2 + +#define DRAW_TILE() \ + uint8 *pCache; \ + register int32 l; \ + register uint8 *bp, Pix, w; \ + \ + GET_CACHED_TILE(); \ + if (IS_BLANK_TILE()) \ + return; \ + SELECT_PALETTE(); \ + \ + if (!(Tile & (V_FLIP | H_FLIP))) \ + { \ + bp = pCache + BPSTART; \ + for (l = LineCount; l > 0; l--, bp += 8 * PITCH, Offset += GFX.PPL) \ + { \ + w = Width; \ + switch (StartPixel) \ + { \ + case 0: DRAW_PIXEL(0, Pix = bp[0]); if (!--w) break; \ + case 1: DRAW_PIXEL(1, Pix = bp[1]); if (!--w) break; \ + case 2: DRAW_PIXEL(2, Pix = bp[2]); if (!--w) break; \ + case 3: DRAW_PIXEL(3, Pix = bp[3]); if (!--w) break; \ + case 4: DRAW_PIXEL(4, Pix = bp[4]); if (!--w) break; \ + case 5: DRAW_PIXEL(5, Pix = bp[5]); if (!--w) break; \ + case 6: DRAW_PIXEL(6, Pix = bp[6]); if (!--w) break; \ + case 7: DRAW_PIXEL(7, Pix = bp[7]); break; \ + } \ + } \ + } \ + else \ + if (!(Tile & V_FLIP)) \ + { \ + bp = pCache + BPSTART; \ + for (l = LineCount; l > 0; l--, bp += 8 * PITCH, Offset += GFX.PPL) \ + { \ + w = Width; \ + switch (StartPixel) \ + { \ + case 0: DRAW_PIXEL(0, Pix = bp[7]); if (!--w) break; \ + case 1: DRAW_PIXEL(1, Pix = bp[6]); if (!--w) break; \ + case 2: DRAW_PIXEL(2, Pix = bp[5]); if (!--w) break; \ + case 3: DRAW_PIXEL(3, Pix = bp[4]); if (!--w) break; \ + case 4: DRAW_PIXEL(4, Pix = bp[3]); if (!--w) break; \ + case 5: DRAW_PIXEL(5, Pix = bp[2]); if (!--w) break; \ + case 6: DRAW_PIXEL(6, Pix = bp[1]); if (!--w) break; \ + case 7: DRAW_PIXEL(7, Pix = bp[0]); break; \ + } \ + } \ + } \ + else \ + if (!(Tile & H_FLIP)) \ + { \ + bp = pCache + 56 - BPSTART; \ + for (l = LineCount; l > 0; l--, bp -= 8 * PITCH, Offset += GFX.PPL) \ + { \ + w = Width; \ + switch (StartPixel) \ + { \ + case 0: DRAW_PIXEL(0, Pix = bp[0]); if (!--w) break; \ + case 1: DRAW_PIXEL(1, Pix = bp[1]); if (!--w) break; \ + case 2: DRAW_PIXEL(2, Pix = bp[2]); if (!--w) break; \ + case 3: DRAW_PIXEL(3, Pix = bp[3]); if (!--w) break; \ + case 4: DRAW_PIXEL(4, Pix = bp[4]); if (!--w) break; \ + case 5: DRAW_PIXEL(5, Pix = bp[5]); if (!--w) break; \ + case 6: DRAW_PIXEL(6, Pix = bp[6]); if (!--w) break; \ + case 7: DRAW_PIXEL(7, Pix = bp[7]); break; \ + } \ + } \ + } \ + else \ + { \ + bp = pCache + 56 - BPSTART; \ + for (l = LineCount; l > 0; l--, bp -= 8 * PITCH, Offset += GFX.PPL) \ + { \ + w = Width; \ + switch (StartPixel) \ + { \ + case 0: DRAW_PIXEL(0, Pix = bp[7]); if (!--w) break; \ + case 1: DRAW_PIXEL(1, Pix = bp[6]); if (!--w) break; \ + case 2: DRAW_PIXEL(2, Pix = bp[5]); if (!--w) break; \ + case 3: DRAW_PIXEL(3, Pix = bp[4]); if (!--w) break; \ + case 4: DRAW_PIXEL(4, Pix = bp[3]); if (!--w) break; \ + case 5: DRAW_PIXEL(5, Pix = bp[2]); if (!--w) break; \ + case 6: DRAW_PIXEL(6, Pix = bp[1]); if (!--w) break; \ + case 7: DRAW_PIXEL(7, Pix = bp[0]); break; \ + } \ + } \ + } + +#define NAME1 DrawClippedTile16 +#define ARGS uint32 Tile, uint32 Offset, uint32 StartPixel, uint32 Width, uint32 StartLine, uint32 LineCount + +// Second-level include: Get the DrawClippedTile16 renderers. + +#include "tile.cpp" + +#undef NAME1 +#undef ARGS +#undef DRAW_TILE +#undef Z1 +#undef Z2 + +// Basic routine to render a single mosaic pixel. +// DRAW_PIXEL, BPSTART, Z1, Z2 and Pix are the same as above, but PITCH is not used. + +#define Z1 GFX.Z1 +#define Z2 GFX.Z2 + +#define DRAW_TILE() \ + uint8 *pCache; \ + register int32 l, w; \ + register uint8 Pix; \ + \ + GET_CACHED_TILE(); \ + if (IS_BLANK_TILE()) \ + return; \ + SELECT_PALETTE(); \ + \ + if (Tile & H_FLIP) \ + StartPixel = 7 - StartPixel; \ + \ + if (Tile & V_FLIP) \ + Pix = pCache[56 - BPSTART + StartPixel]; \ + else \ + Pix = pCache[BPSTART + StartPixel]; \ + \ + if (Pix) \ + { \ + for (l = LineCount; l > 0; l--, Offset += GFX.PPL) \ + { \ + for (w = Width - 1; w >= 0; w--) \ + DRAW_PIXEL(w, 1); \ + } \ + } + +#define NAME1 DrawMosaicPixel16 +#define ARGS uint32 Tile, uint32 Offset, uint32 StartLine, uint32 StartPixel, uint32 Width, uint32 LineCount + +// Second-level include: Get the DrawMosaicPixel16 renderers. + +#include "tile.cpp" + +#undef NAME1 +#undef ARGS +#undef DRAW_TILE +#undef Z1 +#undef Z2 + +// Basic routine to render the backdrop. +// DRAW_PIXEL is the same as above, but since we're just replicating a single pixel there's no need for PITCH or BPSTART +// (or interlace at all, really). +// The backdrop is always depth = 1, so Z1 = Z2 = 1. And backdrop is always color 0. + +#define NO_INTERLACE 1 +#define Z1 1 +#define Z2 1 +#define Pix 0 + +#define DRAW_TILE() \ + register uint32 l, x; \ + \ + GFX.RealScreenColors = IPPU.ScreenColors; \ + GFX.ScreenColors = GFX.ClipColors ? BlackColourMap : GFX.RealScreenColors; \ + \ + for (l = GFX.StartY; l <= GFX.EndY; l++, Offset += GFX.PPL) \ + { \ + for (x = Left; x < Right; x++) \ + DRAW_PIXEL(x, 1); \ + } + +#define NAME1 DrawBackdrop16 +#define ARGS uint32 Offset, uint32 Left, uint32 Right + +// Second-level include: Get the DrawBackdrop16 renderers. + +#include "tile.cpp" + +#undef NAME1 +#undef ARGS +#undef DRAW_TILE +#undef Pix +#undef Z1 +#undef Z2 +#undef NO_INTERLACE + +// Basic routine to render a chunk of a Mode 7 BG. +// Mode 7 has no interlace, so BPSTART and PITCH are unused. +// We get some new parameters, so we can use the same DRAW_TILE to do BG1 or BG2: +// DCMODE tests if Direct Color should apply. +// BG is the BG, so we use the right clip window. +// MASK is 0xff or 0x7f, the 'color' portion of the pixel. +// We define Z1/Z2 to either be constant 5 or to vary depending on the 'priority' portion of the pixel. + +#define CLIP_10_BIT_SIGNED(a) (((a) & 0x2000) ? ((a) | ~0x3ff) : ((a) & 0x3ff)) + +extern struct SLineMatrixData LineMatrixData[240]; + +#define NO_INTERLACE 1 +#define Z1 (D + 7) +#define Z2 (D + 7) +#define MASK 0xff +#define DCMODE (Memory.FillRAM[0x2130] & 1) +#define BG 0 + +#define DRAW_TILE_NORMAL() \ + uint8 *VRAM1 = Memory.VRAM + 1; \ + \ + if (DCMODE) \ + { \ + if (IPPU.DirectColourMapsNeedRebuild) \ + S9xBuildDirectColourMaps(); \ + GFX.RealScreenColors = DirectColourMaps[0]; \ + } \ + else \ + GFX.RealScreenColors = IPPU.ScreenColors; \ + \ + GFX.ScreenColors = GFX.ClipColors ? BlackColourMap : GFX.RealScreenColors; \ + \ + int aa, cc; \ + int startx; \ + \ + uint32 Offset = GFX.StartY * GFX.PPL; \ + struct SLineMatrixData *l = &LineMatrixData[GFX.StartY]; \ + \ + for (uint32 Line = GFX.StartY; Line <= GFX.EndY; Line++, Offset += GFX.PPL, l++) \ + { \ + int yy, starty; \ + \ + int32 HOffset = ((int32) l->M7HOFS << 19) >> 19; \ + int32 VOffset = ((int32) l->M7VOFS << 19) >> 19; \ + \ + int32 CentreX = ((int32) l->CentreX << 19) >> 19; \ + int32 CentreY = ((int32) l->CentreY << 19) >> 19; \ + \ + if (PPU.Mode7VFlip) \ + starty = 255 - (int) (Line + 1); \ + else \ + starty = Line + 1; \ + \ + yy = CLIP_10_BIT_SIGNED(VOffset - CentreY); \ + \ + int BB = ((l->MatrixB * starty) & ~63) + ((l->MatrixB * yy) & ~63) + (CentreX << 8); \ + int DD = ((l->MatrixD * starty) & ~63) + ((l->MatrixD * yy) & ~63) + (CentreY << 8); \ + \ + if (PPU.Mode7HFlip) \ + { \ + startx = Right - 1; \ + aa = -l->MatrixA; \ + cc = -l->MatrixC; \ + } \ + else \ + { \ + startx = Left; \ + aa = l->MatrixA; \ + cc = l->MatrixC; \ + } \ + \ + int xx = CLIP_10_BIT_SIGNED(HOffset - CentreX); \ + int AA = l->MatrixA * startx + ((l->MatrixA * xx) & ~63); \ + int CC = l->MatrixC * startx + ((l->MatrixC * xx) & ~63); \ + \ + uint8 Pix; \ + \ + if (!PPU.Mode7Repeat) \ + { \ + for (uint32 x = Left; x < Right; x++, AA += aa, CC += cc) \ + { \ + int X = ((AA + BB) >> 8) & 0x3ff; \ + int Y = ((CC + DD) >> 8) & 0x3ff; \ + \ + uint8 *TileData = VRAM1 + (Memory.VRAM[((Y & ~7) << 5) + ((X >> 2) & ~1)] << 7); \ + uint8 b = *(TileData + ((Y & 7) << 4) + ((X & 7) << 1)); \ + \ + DRAW_PIXEL(x, Pix = (b & MASK)); \ + } \ + } \ + else \ + { \ + for (uint32 x = Left; x < Right; x++, AA += aa, CC += cc) \ + { \ + int X = ((AA + BB) >> 8); \ + int Y = ((CC + DD) >> 8); \ + \ + uint8 b; \ + \ + if (((X | Y) & ~0x3ff) == 0) \ + { \ + uint8 *TileData = VRAM1 + (Memory.VRAM[((Y & ~7) << 5) + ((X >> 2) & ~1)] << 7); \ + b = *(TileData + ((Y & 7) << 4) + ((X & 7) << 1)); \ + } \ + else \ + if (PPU.Mode7Repeat == 3) \ + b = *(VRAM1 + ((Y & 7) << 4) + ((X & 7) << 1)); \ + else \ + continue; \ + \ + DRAW_PIXEL(x, Pix = (b & MASK)); \ + } \ + } \ + } + +#define DRAW_TILE_MOSAIC() \ + uint8 *VRAM1 = Memory.VRAM + 1; \ + \ + if (DCMODE) \ + { \ + if (IPPU.DirectColourMapsNeedRebuild) \ + S9xBuildDirectColourMaps(); \ + GFX.RealScreenColors = DirectColourMaps[0]; \ + } \ + else \ + GFX.RealScreenColors = IPPU.ScreenColors; \ + \ + GFX.ScreenColors = GFX.ClipColors ? BlackColourMap : GFX.RealScreenColors; \ + \ + int aa, cc; \ + int startx, StartY = GFX.StartY; \ + \ + int HMosaic = 1, VMosaic = 1, MosaicStart = 0; \ + int32 MLeft = Left, MRight = Right; \ + \ + if (PPU.BGMosaic[0]) \ + { \ + VMosaic = PPU.Mosaic; \ + MosaicStart = ((uint32) GFX.StartY - PPU.MosaicStart) % VMosaic; \ + StartY -= MosaicStart; \ + } \ + \ + if (PPU.BGMosaic[BG]) \ + { \ + HMosaic = PPU.Mosaic; \ + MLeft -= MLeft % HMosaic; \ + MRight += HMosaic - 1; \ + MRight -= MRight % HMosaic; \ + } \ + \ + uint32 Offset = StartY * GFX.PPL; \ + struct SLineMatrixData *l = &LineMatrixData[StartY]; \ + \ + for (uint32 Line = StartY; Line <= GFX.EndY; Line += VMosaic, Offset += VMosaic * GFX.PPL, l += VMosaic) \ + { \ + if (Line + VMosaic > GFX.EndY) \ + VMosaic = GFX.EndY - Line + 1; \ + \ + int yy, starty; \ + \ + int32 HOffset = ((int32) l->M7HOFS << 19) >> 19; \ + int32 VOffset = ((int32) l->M7VOFS << 19) >> 19; \ + \ + int32 CentreX = ((int32) l->CentreX << 19) >> 19; \ + int32 CentreY = ((int32) l->CentreY << 19) >> 19; \ + \ + if (PPU.Mode7VFlip) \ + starty = 255 - (int) (Line + 1); \ + else \ + starty = Line + 1; \ + \ + yy = CLIP_10_BIT_SIGNED(VOffset - CentreY); \ + \ + int BB = ((l->MatrixB * starty) & ~63) + ((l->MatrixB * yy) & ~63) + (CentreX << 8); \ + int DD = ((l->MatrixD * starty) & ~63) + ((l->MatrixD * yy) & ~63) + (CentreY << 8); \ + \ + if (PPU.Mode7HFlip) \ + { \ + startx = MRight - 1; \ + aa = -l->MatrixA; \ + cc = -l->MatrixC; \ + } \ + else \ + { \ + startx = MLeft; \ + aa = l->MatrixA; \ + cc = l->MatrixC; \ + } \ + \ + int xx = CLIP_10_BIT_SIGNED(HOffset - CentreX); \ + int AA = l->MatrixA * startx + ((l->MatrixA * xx) & ~63); \ + int CC = l->MatrixC * startx + ((l->MatrixC * xx) & ~63); \ + \ + uint8 Pix; \ + uint8 ctr = 1; \ + \ + if (!PPU.Mode7Repeat) \ + { \ + for (int32 x = MLeft; x < MRight; x++, AA += aa, CC += cc) \ + { \ + if (--ctr) \ + continue; \ + ctr = HMosaic; \ + \ + int X = ((AA + BB) >> 8) & 0x3ff; \ + int Y = ((CC + DD) >> 8) & 0x3ff; \ + \ + uint8 *TileData = VRAM1 + (Memory.VRAM[((Y & ~7) << 5) + ((X >> 2) & ~1)] << 7); \ + uint8 b = *(TileData + ((Y & 7) << 4) + ((X & 7) << 1)); \ + \ + if ((Pix = (b & MASK))) \ + { \ + for (int32 h = MosaicStart; h < VMosaic; h++) \ + { \ + for (int32 w = x + HMosaic - 1; w >= x; w--) \ + DRAW_PIXEL(w + h * GFX.PPL, (w >= (int32) Left && w < (int32) Right)); \ + } \ + } \ + } \ + } \ + else \ + { \ + for (int32 x = MLeft; x < MRight; x++, AA += aa, CC += cc) \ + { \ + if (--ctr) \ + continue; \ + ctr = HMosaic; \ + \ + int X = ((AA + BB) >> 8); \ + int Y = ((CC + DD) >> 8); \ + \ + uint8 b; \ + \ + if (((X | Y) & ~0x3ff) == 0) \ + { \ + uint8 *TileData = VRAM1 + (Memory.VRAM[((Y & ~7) << 5) + ((X >> 2) & ~1)] << 7); \ + b = *(TileData + ((Y & 7) << 4) + ((X & 7) << 1)); \ + } \ + else \ + if (PPU.Mode7Repeat == 3) \ + b = *(VRAM1 + ((Y & 7) << 4) + ((X & 7) << 1)); \ + else \ + continue; \ + \ + if ((Pix = (b & MASK))) \ + { \ + for (int32 h = MosaicStart; h < VMosaic; h++) \ + { \ + for (int32 w = x + HMosaic - 1; w >= x; w--) \ + DRAW_PIXEL(w + h * GFX.PPL, (w >= (int32) Left && w < (int32) Right)); \ + } \ + } \ + } \ + } \ + \ + MosaicStart = 0; \ + } + +#define DRAW_TILE() DRAW_TILE_NORMAL() +#define NAME1 DrawMode7BG1 +#define ARGS uint32 Left, uint32 Right, int D + +// Second-level include: Get the DrawMode7BG1 renderers. + +#include "tile.cpp" + +#undef NAME1 +#undef DRAW_TILE + +#define DRAW_TILE() DRAW_TILE_MOSAIC() +#define NAME1 DrawMode7MosaicBG1 + +// Second-level include: Get the DrawMode7MosaicBG1 renderers. + +#include "tile.cpp" + +#undef DRAW_TILE +#undef NAME1 +#undef Z1 +#undef Z2 +#undef MASK +#undef DCMODE +#undef BG + +#define NAME1 DrawMode7BG2 +#define DRAW_TILE() DRAW_TILE_NORMAL() +#define Z1 (D + ((b & 0x80) ? 11 : 3)) +#define Z2 (D + ((b & 0x80) ? 11 : 3)) +#define MASK 0x7f +#define DCMODE 0 +#define BG 1 + +// Second-level include: Get the DrawMode7BG2 renderers. + +#include "tile.cpp" + +#undef NAME1 +#undef DRAW_TILE + +#define DRAW_TILE() DRAW_TILE_MOSAIC() +#define NAME1 DrawMode7MosaicBG2 + +// Second-level include: Get the DrawMode7MosaicBG2 renderers. + +#include "tile.cpp" + +#undef MASK +#undef DCMODE +#undef BG +#undef NAME1 +#undef ARGS +#undef DRAW_TILE +#undef DRAW_TILE_NORMAL +#undef DRAW_TILE_MOSAIC +#undef Z1 +#undef Z2 +#undef NO_INTERLACE + +/*****************************************************************************/ +#else +#ifndef NAME2 // Second-level: Get all the NAME1 renderers. +/*****************************************************************************/ + +#define BPSTART StartLine +#define PITCH 1 + +// The 1x1 pixel plotter, for speedhacking modes. + +#define DRAW_PIXEL(N, M) \ + if (Z1 > GFX.DB[Offset + N] && (M)) \ + { \ + GFX.S[Offset + N] = MATH(GFX.ScreenColors[Pix], GFX.SubScreen[Offset + N], GFX.SubZBuffer[Offset + N]); \ + GFX.DB[Offset + N] = Z2; \ + } + +#define NAME2 Normal1x1 + +// Third-level include: Get the Normal1x1 renderers. + +#include "tile.cpp" + +#undef NAME2 +#undef DRAW_PIXEL + +// The 2x1 pixel plotter, for normal rendering when we've used hires/interlace already this frame. + +#define DRAW_PIXEL_N2x1(N, M) \ + if (Z1 > GFX.DB[Offset + 2 * N] && (M)) \ + { \ + GFX.S[Offset + 2 * N] = GFX.S[Offset + 2 * N + 1] = MATH(GFX.ScreenColors[Pix], GFX.SubScreen[Offset + 2 * N], GFX.SubZBuffer[Offset + 2 * N]); \ + GFX.DB[Offset + 2 * N] = GFX.DB[Offset + 2 * N + 1] = Z2; \ + } + +#define DRAW_PIXEL(N, M) DRAW_PIXEL_N2x1(N, M) +#define NAME2 Normal2x1 + +// Third-level include: Get the Normal2x1 renderers. + +#include "tile.cpp" + +#undef NAME2 +#undef DRAW_PIXEL + +// Hires pixel plotter, this combines the main and subscreen pixels as appropriate to render hires or pseudo-hires images. +// Use it only on the main screen, subscreen should use Normal2x1 instead. +// Hires math: +// Main pixel is mathed as normal: Main(x, y) * Sub(x, y). +// Sub pixel is mathed somewhat weird: Basically, for Sub(x + 1, y) we apply the same operation we applied to Main(x, y) +// (e.g. no math, add fixed, add1/2 subscreen) using Main(x, y) as the "corresponding subscreen pixel". +// Also, color window clipping clips Sub(x + 1, y) if Main(x, y) is clipped, not Main(x + 1, y). +// We don't know how Sub(0, y) is handled. + +#define DRAW_PIXEL_H2x1(N, M) \ + if (Z1 > GFX.DB[Offset + 2 * N] && (M)) \ + { \ + GFX.S[Offset + 2 * N] = MATH((GFX.ClipColors ? 0 : GFX.SubScreen[Offset + 2 * N]), GFX.RealScreenColors[Pix], GFX.SubZBuffer[Offset + 2 * N]); \ + GFX.S[Offset + 2 * N + 1] = MATH(GFX.ScreenColors[Pix], GFX.SubScreen[Offset + 2 * N], GFX.SubZBuffer[Offset + 2 * N]); \ + GFX.DB[Offset + 2 * N] = GFX.DB[Offset + 2 * N + 1] = Z2; \ + } + +#define DRAW_PIXEL(N, M) DRAW_PIXEL_H2x1(N, M) +#define NAME2 Hires + +// Third-level include: Get the Hires renderers. + +#include "tile.cpp" + +#undef NAME2 +#undef DRAW_PIXEL + +// Interlace: Only draw every other line, so we'll redefine BPSTART and PITCH to do so. +// Otherwise, it's the same as Normal2x1/Hires2x1. + +#undef BPSTART +#undef PITCH + +#define BPSTART (StartLine * 2 + BG.InterlaceLine) +#define PITCH 2 + +#ifndef NO_INTERLACE + +#define DRAW_PIXEL(N, M) DRAW_PIXEL_N2x1(N, M) +#define NAME2 Interlace + +// Third-level include: Get the double width Interlace renderers. + +#include "tile.cpp" + +#undef NAME2 +#undef DRAW_PIXEL + +#define DRAW_PIXEL(N, M) DRAW_PIXEL_H2x1(N, M) +#define NAME2 HiresInterlace + +// Third-level include: Get the HiresInterlace renderers. + +#include "tile.cpp" + +#undef NAME2 +#undef DRAW_PIXEL + +#endif + +#undef BPSTART +#undef PITCH + +/*****************************************************************************/ +#else // Third-level: Renderers for each math mode for NAME1 + NAME2. +/*****************************************************************************/ + +#define CONCAT3(A, B, C) A##B##C +#define MAKENAME(A, B, C) CONCAT3(A, B, C) + +static void MAKENAME(NAME1, _, NAME2) (ARGS) +{ +#define MATH(A, B, C) NOMATH(x, A, B, C) + DRAW_TILE(); +#undef MATH +} + +static void MAKENAME(NAME1, Add_, NAME2) (ARGS) +{ +#define MATH(A, B, C) REGMATH(ADD, A, B, C) + DRAW_TILE(); +#undef MATH +} + +static void MAKENAME(NAME1, AddF1_2_, NAME2) (ARGS) +{ +#define MATH(A, B, C) MATHF1_2(ADD, A, B, C) + DRAW_TILE(); +#undef MATH +} + +static void MAKENAME(NAME1, AddS1_2_, NAME2) (ARGS) +{ +#define MATH(A, B, C) MATHS1_2(ADD, A, B, C) + DRAW_TILE(); +#undef MATH +} + +static void MAKENAME(NAME1, Sub_, NAME2) (ARGS) +{ +#define MATH(A, B, C) REGMATH(SUB, A, B, C) + DRAW_TILE(); +#undef MATH +} + +static void MAKENAME(NAME1, SubF1_2_, NAME2) (ARGS) +{ +#define MATH(A, B, C) MATHF1_2(SUB, A, B, C) + DRAW_TILE(); +#undef MATH +} + +static void MAKENAME(NAME1, SubS1_2_, NAME2) (ARGS) +{ +#define MATH(A, B, C) MATHS1_2(SUB, A, B, C) + DRAW_TILE(); +#undef MATH +} + +static void (*MAKENAME(Renderers_, NAME1, NAME2)[7]) (ARGS) = +{ + MAKENAME(NAME1, _, NAME2), + MAKENAME(NAME1, Add_, NAME2), + MAKENAME(NAME1, AddF1_2_, NAME2), + MAKENAME(NAME1, AddS1_2_, NAME2), + MAKENAME(NAME1, Sub_, NAME2), + MAKENAME(NAME1, SubF1_2_, NAME2), + MAKENAME(NAME1, SubS1_2_, NAME2) +}; + +#undef MAKENAME +#undef CONCAT3 + +#endif +#endif +#endif diff --git a/plugins/snes9x_gx/source/snes9x/tile.h b/plugins/snes9x_gx/source/snes9x/tile.h new file mode 100644 index 00000000..d4bd94f9 --- /dev/null +++ b/plugins/snes9x_gx/source/snes9x/tile.h @@ -0,0 +1,185 @@ +/*********************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com), + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2004 Matthew Kendora + + (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org) + + (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/) + + (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca), + Kris Bleakley (codeviolation@hotmail.com) + + (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net), + Nach (n-a-c-h@users.sourceforge.net), + zones (kasumitokoduck@yahoo.com) + + (c) Copyright 2006 - 2007 nitsuja + + (c) Copyright 2009 - 2010 BearOso, + OV2 + + + BS-X C emulator code + (c) Copyright 2005 - 2006 Dreamer Nom, + zones + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com), + Nach, + zsKnight (zsknight@zsnes.com) + + C4 C++ code + (c) Copyright 2003 - 2006 Brad Jorsch, + Nach + + DSP-1 emulator code + (c) Copyright 1998 - 2006 _Demo_, + Andreas Naive (andreasnaive@gmail.com), + Gary Henderson, + Ivar (ivar@snes9x.com), + John Weidman, + Kris Bleakley, + Matthew Kendora, + Nach, + neviksti (neviksti@hotmail.com) + + DSP-2 emulator code + (c) Copyright 2003 John Weidman, + Kris Bleakley, + Lord Nightmare (lord_nightmare@users.sourceforge.net), + Matthew Kendora, + neviksti + + DSP-3 emulator code + (c) Copyright 2003 - 2006 John Weidman, + Kris Bleakley, + Lancer, + z80 gaiden + + DSP-4 emulator code + (c) Copyright 2004 - 2006 Dreamer Nom, + John Weidman, + Kris Bleakley, + Nach, + z80 gaiden + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, + pagefault (pagefault@zsnes.com), + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code used in 1.39-1.51 + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, + John Weidman, + Dark Force + + SPC7110 and RTC C++ emulator code used in 1.52+ + (c) Copyright 2009 byuu, + neviksti + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive, + John Weidman + + S-RTC C emulator code + (c) Copyright 2001 - 2006 byuu, + John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, + John Weidman, + Kris Bleakley, + Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 _Demo_, + pagefault, + zsKnight + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, + Gary Henderson, + John Weidman + + Sound emulator code used in 1.5-1.51 + (c) Copyright 1998 - 2003 Brad Martin + (c) Copyright 1998 - 2006 Charles Bilyue' + + Sound emulator code used in 1.52+ + (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + 2xSaI filter + (c) Copyright 1999 - 2001 Derek Liauw Kie Fa + + HQ2x, HQ3x, HQ4x filters + (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com) + + NTSC filter + (c) Copyright 2006 - 2007 Shay Green + + GTK+ GUI code + (c) Copyright 2004 - 2010 BearOso + + Win32 GUI code + (c) Copyright 2003 - 2006 blip, + funkyass, + Matthew Kendora, + Nach, + nitsuja + (c) Copyright 2009 - 2010 OV2 + + Mac OS GUI code + (c) Copyright 1998 - 2001 John Stiles + (c) Copyright 2001 - 2010 zones + + + Specific ports contains the works of other authors. See headers in + individual files. + + + Snes9x homepage: http://www.snes9x.com/ + + Permission to use, copy, modify and/or distribute Snes9x in both binary + and source form, for non-commercial purposes, is hereby granted without + fee, providing that this license information and copyright notice appear + with all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software or it's derivatives. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes, + but is not limited to, charging money for Snes9x or software derived from + Snes9x, including Snes9x or derivatives in commercial game bundles, and/or + using Snes9x as a promotion for your commercial product. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. + ***********************************************************************************/ + + +#ifndef _TILE_H_ +#define _TILE_H_ + +void S9xInitTileRenderer (void); +void S9xSelectTileRenderers (int, bool8, bool8); +void S9xSelectTileConverter (int, bool8, bool8, bool8); + +#endif diff --git a/plugins/snes9x_gx/source/snes9xgx.cpp b/plugins/snes9x_gx/source/snes9xgx.cpp new file mode 100644 index 00000000..b49ec1dc --- /dev/null +++ b/plugins/snes9x_gx/source/snes9xgx.cpp @@ -0,0 +1,574 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * softdev July 2006 + * crunchy2 May 2007-July 2007 + * Michniewski 2008 + * Tantric 2008-2010 + * + * snes9xgx.cpp + * + * This file controls overall program flow. Most things start and end here! + ***************************************************************************/ + +#include <gccore.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <string> +#include <ogcsys.h> +#include <unistd.h> +#include <wiiuse/wpad.h> +#include <wupc/wupc.h> +#include <fat.h> +#include <debug.h> +#include <sys/iosupport.h> + +#ifdef HW_RVL +#include <di/di.h> +#endif + +#include "snes9xgx.h" +#include "networkop.h" +#include "video.h" +#include "audio.h" +#include "menu.h" +#include "sram.h" +#include "freeze.h" +#include "preferences.h" +#include "button_mapping.h" +#include "fileop.h" +#include "filebrowser.h" +#include "input.h" +#include "mem2.h" +#include "utils/FreeTypeGX.h" + +#include "snes9x/snes9x.h" +#include "snes9x/memmap.h" +#include "snes9x/apu/apu.h" +#include "snes9x/controls.h" + +int ScreenshotRequested = 0; +int ConfigRequested = 0; +int ShutdownRequested = 0; +int ResetRequested = 0; +int ExitRequested = 0; +char appPath[1024] = { 0 }; +char loadedFile[1024] = { 0 }; +static int currentMode; + +extern "C" { +extern void __exception_setreload(int t); +} + +extern void S9xInitSync(); +extern uint32 prevRenderedFrameCount; + +/**************************************************************************** + * Shutdown / Reboot / Exit + ***************************************************************************/ + +void ExitCleanup() +{ + ShutdownAudio(); + StopGX(); + + HaltDeviceThread(); + UnmountAllFAT(); + +#ifdef HW_RVL + DI_Close(); +#endif +} + +#ifdef HW_DOL + #define PSOSDLOADID 0x7c6000a6 + int *psoid = (int *) 0x80001800; + void (*PSOReload) () = (void (*)()) 0x80001800; +#endif + +void ExitToWiiflow() +{ + ShutoffRumble(); + SavePrefs(SILENT); + if (SNESROMSize > 0 && !ConfigRequested && GCSettings.AutoSave == 1) + SaveSRAMAuto(SILENT); + ExitCleanup(); + + if( !!*(u32*)0x80001800 ) + { + // Were we launched via HBC? (or via wiiflows stub replacement? :P) + exit(1); + } + else + { + // Wii channel support + SYS_ResetSystem( SYS_RETURNTOMENU, 0, 0 ); + } +} + +void ExitApp() +{ +#ifdef HW_RVL + ShutoffRumble(); +#endif + + SavePrefs(SILENT); + + if (SNESROMSize > 0 && !ConfigRequested && GCSettings.AutoSave == 1) + SaveSRAMAuto(SILENT); + + ExitCleanup(); + + if(ShutdownRequested) + SYS_ResetSystem(SYS_POWEROFF, 0, 0); + + #ifdef HW_RVL + if(GCSettings.ExitAction == 0) // Auto + { + char * sig = (char *)0x80001804; + if( + sig[0] == 'S' && + sig[1] == 'T' && + sig[2] == 'U' && + sig[3] == 'B' && + sig[4] == 'H' && + sig[5] == 'A' && + sig[6] == 'X' && + sig[7] == 'X') + GCSettings.ExitAction = 3; // Exit to HBC + else + GCSettings.ExitAction = 1; // HBC not found + } + #endif + + if(GCSettings.ExitAction == 1) // Exit to Menu + { + #ifdef HW_RVL + SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0); + #else + #define SOFTRESET_ADR ((volatile u32*)0xCC003024) + *SOFTRESET_ADR = 0x00000000; + #endif + } + else if(GCSettings.ExitAction == 2) // Shutdown Wii + { + SYS_ResetSystem(SYS_POWEROFF, 0, 0); + } + else // Exit to Loader + { + #ifdef HW_RVL + exit(0); + #else + if (psoid[0] == PSOSDLOADID) + PSOReload(); + #endif + } +} + +#ifdef HW_RVL +void ShutdownCB() +{ + ShutdownRequested = 1; +} +void ResetCB() +{ + ResetRequested = 1; +} +#endif + +#ifdef HW_DOL +/**************************************************************************** + * ipl_set_config + * lowlevel Qoob Modchip disable + ***************************************************************************/ + +void ipl_set_config(unsigned char c) +{ + volatile unsigned long* exi = (volatile unsigned long*)0xCC006800; + unsigned long val,addr; + addr=0xc0000000; + val = c << 24; + exi[0] = ((((exi[0]) & 0x405) | 256) | 48); //select IPL + //write addr of IPL + exi[0 * 5 + 4] = addr; + exi[0 * 5 + 3] = ((4 - 1) << 4) | (1 << 2) | 1; + while (exi[0 * 5 + 3] & 1); + //write the ipl we want to send + exi[0 * 5 + 4] = val; + exi[0 * 5 + 3] = ((4 - 1) << 4) | (1 << 2) | 1; + while (exi[0 * 5 + 3] & 1); + + exi[0] &= 0x405; //deselect IPL +} +#endif + +/**************************************************************************** + * setFrameTimerMethod() + * change frametimer method depending on whether ROM is NTSC or PAL + ***************************************************************************/ + +void setFrameTimerMethod() +{ + /* + Set frametimer method + (timerstyle: 0=NTSC vblank, 1=PAL int timer) + */ + if ( Settings.PAL ) { + if(vmode_60hz) + timerstyle = 1; + else + timerstyle = 0; + } else { + if(vmode_60hz) + timerstyle = 0; + else + timerstyle = 1; + } + return; +} + +/**************************************************************************** + * IOS Check + ***************************************************************************/ +#ifdef HW_RVL +bool SupportedIOS(u32 ios) +{ + if(ios == 58 || ios == 61) + return true; + + return false; +} + +bool SaneIOS(u32 ios) +{ + bool res = false; + u32 num_titles=0; + u32 tmd_size; + + if(ios > 200) + return false; + + if (ES_GetNumTitles(&num_titles) < 0) + return false; + + if(num_titles < 1) + return false; + + u64 *titles = (u64 *)memalign(32, num_titles * sizeof(u64) + 32); + + if(!titles) + return false; + + if (ES_GetTitles(titles, num_titles) < 0) + { + free(titles); + return false; + } + + u32 *tmdbuffer = (u32 *)memalign(32, MAX_SIGNED_TMD_SIZE); + + if(!tmdbuffer) + { + free(titles); + return false; + } + + for(u32 n=0; n < num_titles; n++) + { + if((titles[n] & 0xFFFFFFFF) != ios) + continue; + + if (ES_GetStoredTMDSize(titles[n], &tmd_size) < 0) + break; + + if (tmd_size > 4096) + break; + + if (ES_GetStoredTMD(titles[n], (signed_blob *)tmdbuffer, tmd_size) < 0) + break; + + if (tmdbuffer[1] || tmdbuffer[2]) + { + res = true; + break; + } + } + free(tmdbuffer); + free(titles); + return res; +} +#endif +/**************************************************************************** + * USB Gecko Debugging + ***************************************************************************/ + +static bool gecko = false; +static mutex_t gecko_mutex = 0; + +static ssize_t __out_write(struct _reent *r, int fd, const char *ptr, size_t len) +{ + if (!gecko || len == 0) + return len; + + if(!ptr || len < 0) + return -1; + + u32 level; + LWP_MutexLock(gecko_mutex); + level = IRQ_Disable(); + usb_sendbuffer(1, ptr, len); + IRQ_Restore(level); + LWP_MutexUnlock(gecko_mutex); + return len; +} + +const devoptab_t gecko_out = { + "stdout", // device name + 0, // size of file structure + NULL, // device open + NULL, // device close + __out_write,// device write + NULL, // device read + NULL, // device seek + NULL, // device fstat + NULL, // device stat + NULL, // device link + NULL, // device unlink + NULL, // device chdir + NULL, // device rename + NULL, // device mkdir + 0, // dirStateSize + NULL, // device diropen_r + NULL, // device dirreset_r + NULL, // device dirnext_r + NULL, // device dirclose_r + NULL // device statvfs_r +}; + +static void USBGeckoOutput() +{ + gecko = usb_isgeckoalive(1); + LWP_MutexInit(&gecko_mutex, false); + + devoptab_list[STD_OUT] = &gecko_out; + devoptab_list[STD_ERR] = &gecko_out; +} + +extern "C" { + s32 __STM_Close(); + s32 __STM_Init(); +} + +int main(int argc, char *argv[]) +{ + #ifdef HW_RVL + L2Enhance(); + + u32 ios = IOS_GetVersion(); + + if(!SupportedIOS(ios)) + { + s32 preferred = IOS_GetPreferredVersion(); + + if(SupportedIOS(preferred)) + IOS_ReloadIOS(preferred); + } + #else + ipl_set_config(6); // disable Qoob modchip + #endif + + USBGeckoOutput(); + __exception_setreload(8); + + InitGCVideo(); // Initialise video + ResetVideo_Menu (); // change to menu video mode + + #ifdef HW_RVL + // Wii Power/Reset buttons + __STM_Close(); + __STM_Init(); + __STM_Close(); + __STM_Init(); + SYS_SetPowerCallback(ShutdownCB); + SYS_SetResetCallback(ResetCB); + + WUPC_Init(); + WPAD_Init(); + WPAD_SetPowerButtonCallback((WPADShutdownCallback)ShutdownCB); + DI_Init(); + USBStorage_Initialize(); + StartNetworkThread(); + #else + DVD_Init (); // Initialize DVD subsystem (GameCube only) + #endif + + SetupPads(); + InitDeviceThread(); + MountAllFAT(); // Initialize libFAT for SD and USB + + #ifdef HW_RVL + // store path app was loaded from + if(argc > 0 && argv[0] != NULL) + CreateAppPath(argv[0]); + + InitMem2Manager(); + #endif + + DefaultSettings (); // Set defaults + S9xUnmapAllControls (); + SetDefaultButtonMap (); + + // Allocate SNES Memory + if (!Memory.Init ()) + ExitApp(); + + // Allocate APU + if (!S9xInitAPU ()) + ExitApp(); + + S9xSetRenderPixelFormat (RGB565); // Set Pixel Renderer to match 565 + S9xInitSound (64, 0); // Initialise Sound System + + // Initialise Graphics + setGFX (); + if (!S9xGraphicsInit ()) + ExitApp(); + + AllocGfxMem(); + S9xInitSync(); // initialize frame sync + InitFreeType((u8*)font_ttf, font_ttf_size); // Initialize font system +#ifdef HW_RVL + savebuffer = (unsigned char *)mem2_malloc(SAVEBUFFERSIZE); + browserList = (BROWSERENTRY *)mem2_malloc(sizeof(BROWSERENTRY)*MAX_BROWSER_SIZE); +#else + savebuffer = (unsigned char *)malloc(SAVEBUFFERSIZE); + browserList = (BROWSERENTRY *)malloc(sizeof(BROWSERENTRY)*MAX_BROWSER_SIZE); +#endif + InitGUIThreads(); + + bool autoboot = false; + if(argc > 3 && argv[1] != NULL && argv[2] != NULL && argv[3] != NULL) + { + autoboot = true; + ResetBrowser(); + LoadPrefs(); + if(strcasestr(argv[1], "sd:/") != NULL) + { + GCSettings.SaveMethod = DEVICE_SD; + GCSettings.LoadMethod = DEVICE_SD; + } + else + { + GCSettings.SaveMethod = DEVICE_USB; + GCSettings.LoadMethod = DEVICE_USB; + } + SavePrefs(SILENT); + selectLoadedFile = 1; + std::string dir(argv[1]); + dir.assign(&dir[dir.find_last_of(":") + 2]); + char arg_filename[1024]; + strncpy(arg_filename, argv[2], sizeof(arg_filename)); + strncpy(GCSettings.LoadFolder, dir.c_str(), sizeof(GCSettings.LoadFolder)); + OpenGameList(); + strncpy(GCSettings.Exit_Dol_File, argv[3], sizeof(GCSettings.Exit_Dol_File)); + if(argc > 5 && argv[4] != NULL && argv[5] != NULL) + { + sscanf(argv[4], "%08x", &GCSettings.Exit_Channel[0]); + sscanf(argv[5], "%08x", &GCSettings.Exit_Channel[1]); + } + else + { + GCSettings.Exit_Channel[0] = 0x00010008; + GCSettings.Exit_Channel[1] = 0x57494948; + } + if(argc > 6 && argv[6] != NULL) + strncpy(GCSettings.LoaderName, argv[6], sizeof(GCSettings.LoaderName)); + else + snprintf(GCSettings.LoaderName, sizeof(GCSettings.LoaderName), "WiiFlow"); + for(int i = 0; i < browser.numEntries; i++) + { + // Skip it + if (strcmp(browserList[i].filename, ".") == 0 || strcmp(browserList[i].filename, "..") == 0) + continue; + if(strcasestr(browserList[i].filename, arg_filename) != NULL) + { + browser.selIndex = i; + if(IsSz()) + { + BrowserLoadSz(); + browser.selIndex = 1; + } + break; + } + } + BrowserLoadFile(); + } + + while (1) // main loop + { + // go back to checking if devices were inserted/removed + // since we're entering the menu + ResumeDeviceThread(); + + SwitchAudioMode(1); + + if(!autoboot) + { + MainMenu(MENU_GAME); + ConfigRequested = 0; + ScreenshotRequested = 0; + } + else if(SNESROMSize != 0 && autoboot) + autoboot = false; + else + ExitApp(); +#ifdef HW_RVL + SelectFilterMethod(); +#endif + ConfigRequested = 0; + ScreenshotRequested = 0; + SwitchAudioMode(0); + + Settings.MultiPlayer5Master = (GCSettings.Controller == CTRL_PAD4 ? true : false); + Settings.SuperScopeMaster = (GCSettings.Controller == CTRL_SCOPE ? true : false); + Settings.MouseMaster = (GCSettings.Controller == CTRL_MOUSE ? true : false); + Settings.JustifierMaster = (GCSettings.Controller == CTRL_JUST ? true : false); + SetControllers (); + + // stop checking if devices were removed/inserted + // since we're starting emulation again + HaltDeviceThread(); + + AudioStart (); + + FrameTimer = 0; + setFrameTimerMethod (); // set frametimer method every time a ROM is loaded + + CheckVideo = 2; // force video update + prevRenderedFrameCount = IPPU.RenderedFramesCount; + currentMode = GCSettings.render; + + while(1) // emulation loop + { + S9xMainLoop (); + ReportButtons (); + + if(ResetRequested) + { + S9xSoftReset (); // reset game + ResetRequested = 0; + } + if (ConfigRequested) + { + ConfigRequested = 0; + ResetVideo_Menu(); + break; + } + #ifdef HW_RVL + if(ShutdownRequested) + ExitApp(); + #endif + } // emulation loop + } // main loop +} diff --git a/plugins/snes9x_gx/source/snes9xgx.h b/plugins/snes9x_gx/source/snes9xgx.h new file mode 100644 index 00000000..eca8db9f --- /dev/null +++ b/plugins/snes9x_gx/source/snes9xgx.h @@ -0,0 +1,134 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * softdev July 2006 + * crunchy2 May 2007-July 2007 + * Michniewski 2008 + * Tantric 2008-2010 + * + * snes9xgx.h + * + * This file controls overall program flow. Most things start and end here! + ***************************************************************************/ + +#ifndef _SNES9XGX_H_ +#define _SNES9XGX_H_ + +#include "utils/FreeTypeGX.h" +#include "snes9x.h" +#include "filter.h" +#include "filelist.h" + +#define APPNAME "Snes9x GX" +#define APPVERSION "4.3.4" +#define APPFOLDER "snes9xgx" +#define PREF_FILE_NAME "settings.xml" + +#define NOTSILENT 0 +#define SILENT 1 + +const char pathPrefix[9][8] = +{ "", "sd:/", "usb:/", "dvd:/", "smb:/", "carda:/", "cardb:/" }; + +enum { + DEVICE_AUTO, + DEVICE_SD, + DEVICE_USB, + DEVICE_DVD, + DEVICE_SMB, + DEVICE_SD_SLOTA, + DEVICE_SD_SLOTB +}; + +enum { + FILE_SRAM, + FILE_SNAPSHOT, + FILE_ROM, + FILE_CHEAT +}; + +enum +{ + CTRL_PAD, + CTRL_MOUSE, + CTRL_SCOPE, + CTRL_JUST, + CTRL_PAD2, + CTRL_PAD4, + CTRL_LENGTH +}; + +const char ctrlName[6][24] = +{ "SNES Controller", "SNES Mouse", "Superscope", "Justifier", "SNES Controllers (2)", "SNES Controllers (4)" }; + +enum { + LANG_JAPANESE = 0, + LANG_ENGLISH, + LANG_GERMAN, + LANG_FRENCH, + LANG_SPANISH, + LANG_ITALIAN, + LANG_DUTCH, + LANG_SIMP_CHINESE, + LANG_TRAD_CHINESE, + LANG_KOREAN, + LANG_PORTUGUESE, + LANG_BRAZILIAN_PORTUGUESE, + LANG_CATALAN, + LANG_TURKISH, + LANG_LENGTH +}; + +struct SGCSettings{ + int AutoLoad; + int AutoSave; + int LoadMethod; // For ROMS: Auto, SD, DVD, USB, Network (SMB) + int SaveMethod; // For SRAM, Freeze, Prefs: Auto, SD, USB, SMB + char LoadFolder[MAXPATHLEN]; // Path to game files + char LastFileLoaded[MAXPATHLEN]; //Last file loaded filename + char SaveFolder[MAXPATHLEN]; // Path to save files + char CheatFolder[MAXPATHLEN]; // Path to cheat files + char ScreenshotsFolder[MAXPATHLEN]; //Path to screenshots files + + char Exit_Dol_File[MAXPATHLEN]; // Exit Path + char LoaderName[20]; // Menu Loader Name + u32 Exit_Channel[2]; // Exit Channel + + char smbip[80]; + char smbuser[20]; + char smbpwd[20]; + char smbshare[20]; + + float zoomHor; // horizontal zoom amount + float zoomVert; // vertical zoom amount + int videomode; // 0 - automatic, 1 - NTSC (480i), 2 - Progressive (480p), 3 - PAL (50Hz), 4 - PAL (60Hz) + int render; // 0 - original, 1 - filtered, 2 - unfiltered + int FilterMethod; // convert to RenderFilter + int Controller; + int crosshair; + int widescreen; // 0 - 4:3 aspect, 1 - 16:9 aspect + int xshift; // video output shift + int yshift; + int WiimoteOrientation; + int ExitAction; + int MusicVolume; + int SFXVolume; + int Rumble; + int language; +}; + +void ExitApp(); +void ExitToWiiflow(); +void ShutdownWii(); +bool SupportedIOS(u32 ios); +bool SaneIOS(u32 ios); +extern struct SGCSettings GCSettings; +extern int ScreenshotRequested; +extern int ConfigRequested; +extern int ShutdownRequested; +extern int ExitRequested; +extern char appPath[]; +extern char loadedFile[]; +extern FreeTypeGX *fontSystem[]; + +#endif diff --git a/plugins/snes9x_gx/source/sounds/bg_music.ogg b/plugins/snes9x_gx/source/sounds/bg_music.ogg new file mode 100644 index 0000000000000000000000000000000000000000..0431a02d91b4a76195892490bb3f57b5152627ae GIT binary patch literal 3086744 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±-)2pny}L+lAkEG8lfPlv+h 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%0AB(=#wb<$C;dL4B^IjEDcc8ylnr^%vK9fx=ZC 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�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 z%0D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%0A^rPH(jXjr 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 }%*ydWjwC?Q%7&hmQX33isv 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≧H5*q@p6R5(UxeQ<AWgNb*SEA?Tt^-w|Y{mvCQCL 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%0AATLmFrNZlz=KbyN?^ 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%0A+$Vuh9 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�r?9mT{^Drdu3vR^`qZ6!N%0X_4^KtUH6{W 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≦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�apHx$9W=y0W~H^jV1h_ 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 )Edl_?JVelhmR<N~LRkX)|wjcYjY%xLHAT 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%0D~B;fx}sFTNj#vq5uIHikPWYVZ<RK?hHgwQ$j$M ziv+K845dUAnUvv($Wo)wSqfd1brltbMkWFQQi;eB2vTaIRYV?Au!IUAAVA4dCnB&K zphTD^fmDNrm;tD&lE!eT>%<bKL`fJcD1iY`8YY4X>VRYjpp&6PC>jJzKtwb}V1QN> z8Kjm$5l{>O01fR_O0=RjNezP%F-eUkN#qr@h6o5iKtaAjKzeheQ(%Dv0RpoI#2*l@ z+WaFlfJ%)3AD{vrs@(b&=FbZ@))q&TYq?=g?g#9|mS_Frt0zcHT00{T*(>YlPtgv> z%3C2_#qU~(HA-1JGz(IcyCWHs!SK-~se6t^9}+5ZU^~*LSz2tyBFqS2u#`FgTWn`R zl|Uy(Qo^&V5DWlEqCi`aT^Ff1I=;`<pFiPNQ%`+jpX}AW3A*()XW#R>Ih-M<_?>XK zk^b~7FQij&`;ZQ9?mq(vZ8)G<Y6At}iN+?Q?SL~0E%}oWCkEDHrfDJvKi2CrTpXFq z%M@|J{K2pyV`pflD!+tE%nG?f9+kZerR<6pV#;ff7&CY=(IDdiqR@jAnCZ-*CLRGc z)VOm-4h3_{L6LC*Ff!#y(ntv^U_=CAb_iz-iYbZ_D`KcIAcsRZjDfdGAVma_h;#_k zIRZPHDy9&a1w>L2AV5Hph~TLNVIV0y$*}?z6Zm-=oBQ%|MEJgNm9C1eacBJezum!o zt+lMX6?@ZncHHx6{$79l&K6dE`mb55dA9xthkS;IB1>0@&NuXLeAo~3Qg=QV%luKb zwRHqK)cWQiP=tc0O{(c!QYbhkQi2GoE+TJ2Q53AoQe&oCiGZYfhBK=WJ4{Flk2HlU z3<xI?5Rewh(<loAvsOS?fJqn35eXV33jmNL0Du7n6e?1oX~2N0R0e}i00g3-bW+Wf z0u&h(T&ju`kW3T~O_@pP;o+<lB$+i3sW3DOh9DIc+0wueBn5;jgTTU|fdD|kx`I{0 zSgVm0%uG-<hCy|10t(6m0b@c4MF^k;N>iHx)ub2(!Kl^hRd9rup(#ruC_pMKL|Om^ z01%8>D+o=PAQX&5wCKr*783sUR1*Ry>QN!7puK}S5N0^#%w7gSI50U_ObI{&$N(OC z+=dnM>p^j2F-lFIrWNMb3l11R-ZL@+qNU|A@1wXd`WWRicAiUDJy^@QTc}U59@B(5 zArjbKT=~1mE!LQsXCF-}4B-a?=uBV-a)NG{%#Ib5)?hPh!cqf-QU{Pr=`1LvLm)?l zvS0wn9osL#b}m6kb9`51Iulwhw_fjG>F=&Xe0racgWuzpVSY2VIVt5?iUY^^Ye=Dw zab9m&!*C73ruvWNttcCgS^4vuO7S^1wPFpSES38;7)O7Or0=!Xu_XtyNge(988UW- z=D>IBdF|!R;JD!7nU#hPO1VrJAxuowB1hqCqo^Gj+-QSoba|*SxG~F`3``#<j>4*x zCQFnkAX?y{Go>QJ(Bv7Yh)x=@X&9805{faxmS;*JK>DO2;V}Xd5TO7BCNXx%r&|)h z3}8tTQ3Q;D;DPWlSU4#<DK3E&V#5nX&~ys+F|B#tSf$fMYuAixU9D(}1sw_@wIK?X zQc!d|0F}oUA%p@*EA*^#&Zb6%JM`#i&EpPcM}%<oQn;3rqzRcC`3P8@ph=_NinS`N zR1&u>IUo($w4szP*(H%ubA+n^<bqN-tQxBhqE5_2uWT|lf}$vDLtaJ;2uc7^9SjBq z5()`L=bA*IqGW|?BbXUTC7=$4DoX*`8Dd5&90UnSL8=i+$XHiG1tet5lC=U+5=zk# znOZAg5)hgcsWn0wC^RZHD#D}`PzMyH?3^Mhl&pl*l2%PJ^kUWwqRlK*U7e(olpw(r ztqLV*+@J^)1Z)kH!(c*b2m$Rz06_urfB*mtFtq{3pcNAe69AzC0TI9mG$BUN3J@q0 zCI|ou1_cF(vW5^6LN(x_2=Pmf_o4L-2)!dBl!Q}`AodCfXaEX6d7RRMJi8uHz$mnN z<P~vp{j>^LUaOxQlmx)q)-A98L-d`qYQd~}=;m?E*sBnNLbXUy8F6UJ9Oet%%D3FQ zQCNLhBUjSpE~e8AQWY3FBuZ<CqccHbGO^THptAylgaKGvIty&I5=u^z5G)t~e!KmF zy;|`cXu{i)NE3#(vDdKQ7)N+6mXv4BvF%aBGbIl%*i*S$?3_s6V*F$!hF6x_Yl%(e zz~Sp5)ct;WtsmNdujdH4CR5uy9irIgtwjwpaNVstui7BDYR$CfK)AJ4%T%EOIWQ1` zm=;+*f_S!{A%_85-AZlFN*XaoL3b8Ij9IBho`K3o_K=yxY{ap&)i~HwOjjOJf=CS7 z2(c^zQWR{=vk58!3DAj<Vvp(*O7#MmKtMr=BrKu>Mx4_C%Z<T|05A&pfB{HElt76I zfdSY8fJhR1h;51qgfUG_xTuj*h6Zl7Vai2KgP45xh9Xjax=@e0N=dPvN!Ez9H9dh) z=sA@Wu8zZwL~{h~jgs6v(lw=~Nkgkwm&h$TR*H&oCAED<p{RwhBd#K|fgC`RDGZgF zL39zWI3}445(*9!LhF!_>Ocoa6|97Y4j7=cBsWB2R^`;xl7mtvX;M?pJkbCYgaRla zoU;=&Eg>Z}8ju=E3a}s%1{ry(MkN+dMCpRPtw4eS1q*0|I*|rR8ZZE}yq*-(Oj<>& z7AZwwp~~SZDvE{?&8#V9mvpH@3X*zDC|FnFNFs!wfOH5j80Z4+He!OhDj=u<!U<{; z3c#EIiZ(!58U(@+71jU%AR58o)X++-ltHY4T0+K>q3S#g3Gpjuuu?R{qzsT<8cKjs z5EuvzKtdBDsDibLjX(^&{>S$9)c~mZ9+C?6U!YVzKm}fDT>OkYIUW)Nj7pd1yk>Sm z8VxKT@m@M62~+NE)NQq5`B#VvJ)e#qBAc{-QZE?A3Pz|?ydtE+l!O$$?UOJ93?Mo( zIz~zYNYPggvUD>@9Wl&|#0-!s21-Po1yfsHpss@lZGsdF6cSuo-04SfCj{5x5?qTF zcXyZI?k=UcLve=|C@wA5mKv9P=FFU#{S(%#S?{x7scvF(;9FJ!R*|a6ks8HDc`_<u z0)#itE}<l@*?V;2k6kvkjg`C03QA{>RIR&zR5S#Sa2}*PJpNmFnKmZ#qf@kRg!W%T z)$q$Z9z+H4e_5;U6%j!VvGCf-S0j7fqS<vMU&brM3Xv9V^jODnEO_*SKK?F4@|5yF zrg)HM-A4B5vy73Wb0XLk<$A-YG9jz`?3It9Gs`|zOr?YL*1m@LLMW1~%nsaU0-qxU zkM4+o7H@Ej2zNFWuM(0O{5%IJJz;rIZlp^n!Dv>D6Geqd&R;+}!aK=`)!6^>_vbkN z+sq7EM!2%vYk6H?bn}Q=nFU(qSsyJehRqBHBL+tZ4@F9`fGwsc`lt3dBaB~K6`fPK zrL2}oCLE&Jqciku*l5Q-rDw*tk}d3t+F|i@!TM?O4tF<wF`gX1``ZX<G8qz5SQS-s zj82*1s1qqfZiRam^yDFnOIPKnf)gpg6r1;~O&k~-u{qLw)|AU6SkVRo=P+~BKrsFA zAQw@pJ}EqD6I2Wxfl5G}l3R5pp>iDEX=GH&OBA4L>~d`EA?9ioQknw%ni_H}f=E^= zhFCtN9xyRf3Q*07R*{`T#!8ulitX#S(LB{1;xsb|#Is>dE@~I^7t7=#y8QB(ELI|A zMf9a2&|?TpBqmY0kZ3Rs!y@hq6CjbP0&fME1KUt}n5RW7Do$ydiJBmP42sDcJPBqo zEJqj)(g2`%BcwclU?@2p&52DC&Jl>w$jO0m?fn5W`AgOwX2MT^3n1WsPy}E=;r~zs z`Uyoe|896q_CNHY^YO9m@v-vpvElKt;PG{L{*$J<FC_pOKuoT#ga7=5hkV;#>HP&) zl2Y^|5ug3FJ_XKETm72^7Uv-DAjmP8j)wTfDf(T(W}+9vg2i$yseyo=?MqN)BAJ#) z8C^L68f!9~QTZ*G%#*55!L=a;glnA-seVCG&eE6I9lZI5*-8Gd`ACu7u;emK-Qif_ zrQJVwub_8dbtvy#iNBdgF#Z*+^U(DF9^~|BkYuFf8!>o&er#myPK4{c;OKeEt);)a zs0E}+(>W@>H@*~mZAVdiJ?To($BE~kB2S?Oi5-<2|2?C~<~|1{wZ&ku&wXfGCS!_7 z$qPO(|8JyE2U5Z|%DWn-gc;)ZnaUj1fFi(t33_dU|7n{b3T!526AwyalaQ7`;Lpgj zO^2*70I`ISQ=k}w(K1{%i&l>cgia0+sQLBF^)E6VG4Abx68pwPD{-cYgC8_)*K3v^ zn!7_j|6FsP7t1XzaPF0XtgVt1>0QHpVh`w6(E56xp5hat?MfQEXW!zHM*{hpl(X`? zc=WkhGJJT4%GI?5SKG?l;~iS*eva@H>^bb!?G_n5e5TYgBr-lxBroT`?IQgju}44x z+mdtphE8dH&d|<ja_%=!=4Tk@pm~bTj;FmOOag40(qm|4MF>GjF|81}9WgdpG^j?g zHv!5{RU6JbC{2XFGaz-$OzojZVbg@%V_dWbn%FEwOMzulnOGC-WI$S8g_x0wN2EmN z=OfDH&-cjdp;}~#nW~>fO2G4p42mrkOwu*c&@|WZ<h|OMh-yA<B7#sM8K6@+aq6%% zI~WHH;(4Bn$qcGQ6}RIu4wjMV88QHSmQXB{a9KV;2@)W$P(W`YPe>7rz)+HU$~yAm z1Ji}ei)CQK(y&k<Na|`3+cakTPw3pL#w1OwK_JW94}+e6$Z_=p{v3X#<YV%T-t6lV zo34{MkN(>kUFj62d`yiKWhD!Zf~(Zp%BZOy*@A#jtn#6javXYHSco+aLu)02HV~Io ziLfJm(I66u3tHuJ*L7fc`ZYT3oB!R1VRRv`<rl9GlM}&*1$**byPzqLImcH8h6tLd zMz{ibAG;c*;H~9{zZ?6sY<69)E4$?R$$yLAbWtiN7IELvcK2*+3vK*8_?#loUeCdX z%|E$jA){nM%4cU~>p5B8zpa`cm>U}(l`!R2W}_f8&(K*N`{VO|0LXQkoL_o$V9I<o zlF;d4US$<TZk(=xy_QN;7>8}^Trh}RU5N_wv6UT5f_!zrH45pag&DJ#;|sre^@>x2 z9PJ~YD5XSPXXPx7x0uBc`(Z4X2lhHV7$6VAUWd9ydn(_cC&tVev!ivJBmmC>k#lqV z)!y%f(}jgJWqV)UE4B&$$Xcs5e*4}l*0{E|KX}ume}Hr&)?Ka9Rq{`R_r(~ZbF6+@ zCIxrXI;sC30`il81>_7dUoD<aj_nVZvr;JKSIEj1Q1<4-Q@IJEK+#B#r_r!en4v!L z)Y%*IS1t(=&795OI^bfcMAnoZ0yWku2%kzkM0yOR^(ol|BR^Ld!mXMSgq@19)O^9a zJT&Ao)yskfV2RYe=jFSx1GrErf;L#0LK#xmXoZ^V4%1M(r|AHL$R0((sAXc6CC4GQ zuTCdY5g&Acu22TyM2ml%N2U|#)F)SKx{K&5$i8<_$i@d(d8XDB;3MPOMB-s>5=3^r z5%}uPV)1QlH&QW*F-mWfw++ic1PuEXZA$7EmwYoa8Bxgyb+Yb+UH<C`{6)c5D-tRq zGh!BUfD}ndi!nfo0G~iMm#0L~E>+&~7w!?!Nhf|2hN%+dAW`JKDFK<of#xCjhr3~N zO2Xvk*+x)4OdHen`D^ksi^BJc=4#F>5XQy)8J?flp@~<M$fRZfOQ&VAjA1#B)0s%J z2}RW){t<3++~ps52169~b7XsS+=cnh01+S+NmY9g#H;c7V<f5OYdMH>@Eg!tl>z<Y zD!Xmz%hAJLx6e;jkIik=6sk~vl_s)>QII-))``ro)|I-oQJQ^C5!<b2|6RPB$&gT6 zlCSx3?V1xiE!^UIs`BU@>$?jR&kJ5Pna(<KybkvDoZIfm?W&pj6u3|*v9IssGGX25 zGp#1kZ7a2vbSEK!um3Pv=#E0;QCRfw3n5XzHk!7vLX%DA*CnZ=ERYG_%4goZmfT~* zxVuzo6Ei}zm~wq#s@*oBGAU|<0U@K?`~cVW@gcH8*!xBK_C|?aQCu858!=T05R`sQ zDwkRtYXv-PID|&1%tYS~TBrasD1uwV+4;O3Sw^5tkZ~c`VBQzkEw3%k&zr=vuf+_i zWt|dHL$+ROIUPray`{3L*X}W@3&n5_t9dc=->1=`TP^kftn_~La%l%(!GGvz7}~lG zu{hq~8@QNKnFke^XEh#c{`J>4fA{5m(%)3pru{w51&+nK+jCWta<oK<v$(fj`LY-Y z_O-x2H@04YlLZu_zXtp}s@UB+ZGcRP8~R)~ZmoSR$z?D>q{u_j8dfWlJb%LbK<}Fn zHw$0@y7^Oc?;&*Sa5FbZSn+XS)=R$c@fXF}LC92&N<X|3mfId#r_^|vJ8qCj^oS*d z(pm|}Ep14&J9~@umw+Z_E+(|I!XcU?tZh(e_>^Qp2Id~mjzY6C3WkHQ@QEgP<j$u6 zX`1$KrA#3`_&odrEX=T13~WGh90bEMUOfZ0A`xbU3Pw6E!C5_9JD>|d*`H&)h41V4 zm*I1<PSs8Nk9@9ZxuLn6(_0DuVwK6v8~yD6YD+&V9L+R51z(quPCGk{Eizg&ZMbAu z#h+4^OPS0sg9nd>2A+hL=9Ds%w0zte+*82qSXn=;cp1m)NpmUNK6jiO#d)gHv12My zvd0!=)Nqe9WnQQEjVNyJ<IX5b#%gbaN;qicqK5fv?KJ@lB+7YTVn2wz$**2U4*@f% zNQmNBjavxGN5#5~E=!6}EPPjfu7kQv5$llj`v1n6dmmf^BpOLv{)AnwXIi;ZkFfdE z3(g2jQP**Wm<uVD=eBG^I7ZWRfqP@wV`5b4Fsjm{IciMPWNSRP#8n){8VA0=?G=;a zvA`dJ#rz)4IqwE_8{7z4s)BuQ6dt9m4o}Q;n{Ki*fV)Cu4mzz7$ul!$Y1;9Gqio=H z7!U1rCSbS2taA)`Vc;HK!qWfEYVxG1F+7I7vSI=icA~h<*>jsU4SXYfwkJyC#)-A~ z{lcGrnWCrGt13#t*KW<w4XNOG@N<DKOW&)5U^T@vyPG#+?iM2Wuhr5-@>dMWJrqKo z>ZMrkb(ZS&D<qiX4pCjh1pOvfPkUCaY!f=hxDnJr7g}u8HK&LPXWW`!S0g@y`W!AK zGs1odXmyJe8z*CtQ{q;t3x`J!8<BDh)*!N~Jb7$&yra5y(Dt??2MjUV<aTy~tw?Yz z%#8wOEvOckZ(YyXP2sRO2Q2TAOOB3Fw1UA<mUSN_W#i!3%-4^lxzG6caAl>4qzI=b z(9yx_^5LoHNA)u@7-7}n1UrQviP6R&9BPJ&WK!hYig<ktZO&jR8?AX$+46*WmdTAH zM?el+awtah0Jyki^l3RkR)<OzLX(RUgRegi2h`xCcvIaCQARLA$pHNZ+c$~%^+lS3 zGntiB9+FdilSBo)oP4V<S}hx7NmE)NPF5ENnm^~R{S`WmigS&vKZ%!sGFtg<;pwCP zc<ill?(vpYI!NxQ;J<LH0s-(@uAs%dyjgJUV4WPUq}=Y+>4JA?G(GaWf7y(+Dd7la zeY7A^Zc{LFZ!&!@l!J#nPqO#Px7XBj#9Wg2pV^Ge5<yUWGfeEyxgOUh?N(=PwF?H^ z*aEK@@GPvtZ0KKu=yQh!*Cmri+!_VD-X7<Z+?IFq(>{gq!;ZwCNeK~-fwOXX4g7Cl z<YZ&Uz4i;*Rk;L^@rrc{tV+51m+tcYSu;Ab->W?M+b@Fb)EI|IplWgZI*7EdTcH{v zj^SkPXO03Cwu}_a5KCt^`@CUY{GHrwt))-L&;37br?6m01>zOfeVtx^rlY&<J!(_p z^*VCq_mw=4ymk~(L?}KlmAu+c0T3~RJ5GWROXtVy(n(Y<b~7B(jO76c3U{s@Vy5&z zlK`CzAnV#E7&%2TKBtiA6KXrx7t>442UC{(K-q`@#5|;Y0B@1f1JI^g>Dc#>=2)GQ z0CP4AhLNNCDsW;}jqm(X#(Bvh{9J)pKhH8eOPLjC<aCp}Vw&cNcf(rhU6TP_a5g0^ z>2<Meu5<`hdX2uY*Z3V>&+~8s#7DI%LPc_!Vj>-yN<V!n&e{5S-c3(|mv0k6g2^$_ zA!gB55svCShM#ioB8?{Qk2Yn*bgw;t9TK032zPwGM8CMd!2*4M0e&&C#gqj1WlG}m zWX#gw)(6_QdgWyl>*=v_h|}lp53hTMKCLVzysRLP48|~-Z}TOVVbH8g%{Mq+Hl73H zvYWcH3pS-H5>t~*xH7^+zI2!e@6}j-4rwxR&o2R=h)F-u-nEYTD!;&P0d1T=FhGA! z{!)8Bog<NV2ub;LX+hotTnJZQOyZpHt*kT%3_dLCchIbLI4oRA?9M;t8tG~+<9b_A z_wr1p%4nk4aI(j|`Rh}A5#Swc1c4PMrkJj)_@C!M1@s_?ixG*EBl!Qvl7zh6vlqVt zTY2(oP!$s}_Uc!M(uWZQUfMIpuS<Vkl6m|Qkd~^;^9Nn)TT*`%zl$}B$I8-B3<}DL z{XG3Ebdh+qR#3Y<Wd8{6l6fRl`a4L_=WwdDsn4#t=E7M7E!gn0*IMV>08=;y`#SCO zsUC2z6-jIL?Yz#<M12FE9N?0@o)k9*2PbWoPZ^;+4$^)W&QzNa2_m*9;3x<{6`u|y zOm?RyFnJWvM7@)}DX(8mVDft3(n@oyey>)?Tc2ISGz-*J<l!9T^uO#o1bI*FOP#)` z#p{=O?L7fCyIpq!bx`lmexMPZISMo9Ii^~6t62{=)HoC&6@^stsrOZwAeJXesyf&E z*(#_H-S=d=O;LzjsfE6zH3K$>%g3dGf@&QH)6v<f1(h-kg<BK0s6bggRK$!#9rIZg z-05E3e&{FCwj6Vk?^%a<LA95jPQzJEg*SHf#k0%`aZ$vo>4CliPptq*$-qRq(&Fn` zzjqSKY^8rTfwn_GxK`_e*nkjIwV<g3B^=wTA_jE`2Vn2>kWRqh?q*XAnTo^-RwGL4 z4}Zer24a%hdOsX;{>lH@mDTR*>Xh#y?wr-};&}TzPODd)szR^Y!WEKKm$65sn7q67 zd@?=yTd^H>3k)cxvB~4`8zDCS?qRmejzfS5xf2fbpK^)C`j)&9|9;-#H((lHa(cqp zluJ+t<duCV`9e_NY!|*P{a-L46}erQQRr~BZw>KM#dpjQdfH&j!WiS*_8ej%S-JM5 zNFFWG2cwEGxR#oj#5L7Dif$y8U`0Ae=hKz!s^3TmY}6?URFkvuR{JI1iWqf^4oj9c zZ)4#~(6X+LONV1hFAHWtyj(jqT-Orq8Djn|G@Nw>tp+<G^ci9>r<H0hr^WC1;+pkz zIzLNPHd<7Tb1~%9kC)7qm!wPAT`_m~aAbfkM?f$C`5zIwpws^vLp}x-yuI$Ib`}KZ z(@-X?N~}s{a69(=9q+lz`oTxfm(+?h=y5haQW0;&WuefgQPqe{VdMa#@wBGZspQ~{ z4p`nwlcAb9-P_^Oru5<OsYBdMR9}fUKVNb)`?rm^j12o<r^cKA!z0B{c!UgemreFq z_LR(fvS&O#KKV4BN;scB%goUGeh0qf1@jJE;KsE%w6i#1Z_DbX>zJV@_&j68=H2@b z7qk%fW$6uL$}0<H-fJ8<m2EzH6=}h)bS*nG5q?m@j8F<2k-q<Omf@n`1YsfFPjQuc zu6ee~faPjRLM06Co4$FFfjJ%m+k<qzdtU0elD3`M>om>H_tfx7vq@0l(e#yO#Qp=r zA^#0MchGN~GyJMrx~r`)tn78Hd#a&J2+e+}q`zGu1uoY$(MFpxXFvf_!X|S~*X<X? z!kgdtj6HREY`0vc2Gd+VM(kM(G&ii(c0F0wF9LM42Btk-bB(qwHfW{%kCtZJQafqS z-9a!{1V^LcyAkWc#krFry-So5f)9c*9#l#Gn_Pome3auO8PA%c^)r*SDw!;HO9PUV zrZ10VYeL--3_`~drt+to2Q4YhbyR+}F_zI%{(sF=aqt+VKZx#Fl+p5<WXmj90(XY- zjX=wE#NWbo%WW1x?@F<xl5SL#a&lNUBx}CqX(^(rTirKj(TU$fO7?Vof84%_x~aS^ zQW&8NP3=o}8q?Z26pQ|;hyAi&pX;8vl{wi8Q_PAc%7?vD1`VJ8#c6tinMxgAD4a^P zpFP8wH0Q0c{DtNg#A)jlZ5+iOWhK<BB(KY*ZSmY1NH*a5oxd#S0^g5ka+C%A484!- zkRVmm6*Hd!$1wYXV$u%&#`H8OCvtPTbN0i({&Ib=(ER1wDzU(P>Bgacn_aP#@n&7| zo=%cZPs1L`()Kn9l26l0RSr#zBI~2yZ|^0tf1Q`xtWNKPpeN72_p~+@IX;k<g*YDB z2gFg6OO%SG%@@~92nghCVC3qas3$XZ63yPP+xpEl2E4$-5zO#2H6wuyWhAI1xOqe* z4yIS>+B0&>>c?g8w+&T94A|1cbi)Tb6@uOywW}$cHZ&VEcbY{l2Z**Oha?|5=rB}d zmx<GwxtO#>1dAf-@$v0DYET}XN{?mvm)O5ZToEaLs?8D&9gv%*R%qt&bQ-v;t;WXL zm3WbsbT(hXiBY!2l~(Yo;K;_6exAJt_EW<@ojdltui;Y@m+G!a|D(@ZE9|`Yex>gE zv!;Kx^a6Ot(<G>Liu^o7uZH8-k|WkaqY=5_$_0<zCO=Tg^b_wv{X?V9_$uXzJ{=)W z&F^2|EBp>%7yAX0uM8KiUSD@-%PR)u>l_@vi1Su{H*OW(B6{A6pJDSMoUKAAM=ML& z5)=@5^PS$;*sTLo=3kW##LCQL{fss%U(eST|9WPJ5BXa-g9WdZXutCJ(p$_Zn=1YK z`t=kg?bEgC*J9tIkVPh8N8KkvM@y3|V|B;J3sC><M=z6o9a^op(u8a;)%Km#Fjm?O zc+XwmuG=&1xYu4Fm^gg;aMZOby#m4YbIm)dm#ONQ+W|K_z~ocnu({)oO3-KCk`FI> zegw%Xvd2-DwK&ERS}_Cm$yFB&sW<$ysx7AfMb|x;s#B&>%5|*H0fjOw`>n;YHJLZW z(8PmUjeie(btrE9;4f+sY!J(&jK3Mq{)eUe7bzviIO1cIW$oss_QkI(?&HbiiLj$b zh(wwh5#kOAey)<c2;#8NB5Vg;0Q)-%IxH`Ya?A=$B22V=v(Pp(79d#9M)+M(kR?c? zsa$svZ}#sOdX==D_Rw0%D9fuwD2|}_nBdp28z2gmz$lDR_N8%<da4Kb{Y-B+9=Yj2 zI0w=+)MtrTo{8iL_+gYkeLJ$}4kaL$WwBHrVuCg?t4)c(s3r5%Xp(u&fqXb0CT_tI zyb>fLgrRvk<Q?W#Omc<PSHLYZ-_aqCT3;{j6lvY5z{K1<y7Q;^>0$gTjSZ~?ddlpD zkBeR&7*FdPjll9Oc8(GiJ5Hw5_fEuw8))3nqpB_D*Xo`0kGzETk&@%%tCK2r(3Rxy z@s_HS{S}6P#Ru+J>m^fK*aZDiQ@TDk5-lIKm+rsN0j{~eI*uSLF;Yb)|B8dz5KR4t zpcav+#Gs#v0}F?Hf%Tg9OWJ)u`)rtvT^d`Lt&%{8osUDSYRnP8U<D7v*@fq8$1M9l z|6X(t>#mgwdr=5L(q5J@kL$5-NN%d=z0|z4fv)V6y`fTn$I~Y8Ot0nLf50BBl(REW zG!cmeycMiTpWiN=`Y^cG`tZDB{UkcV#AQw1FX=acNIh!sXJ;>dP4JPYYiULM2ps4T z{Uu%!JNDT>0!&$SDc4PTVa(j?hx?1R<PlAu{)UH7pUb9mMFKM3S-nx8-ld(LkmKq% zH1#LGsEyQd2!d9o*y1)|JTLLF!imNhLFLCsy`Z&4OI=T|XY%<EU#+ScRIo>(;Qrb- z(G9|#bKrwdeQ48q&Dx;-tX=$IPXG=+4I!Wyuh1T{CE3a?FZZ2i@mioe<44)FT^z&j zVxjP)A(aTC0WKSZ=Pg_|5vZKrukFxJt&0JasNZHsRz*t|QQD6^l3^!cDwg<UfKAD8 zNup#itrBfH&H@6?Ck_ZTWE}*k5`LLrj#Z)w@8QP>3}i`s6--O83*ftI+X^b)mHVBX z?|3fJ;xO5ppk;_JcN??i5$>P3F8C(Op8Ew*XqGz8=(~A6NxSsA&`RVX%Tx$++Z>1u zEIXKSsyJ__8wxpaI`f*b;8!{nl~E*AQC4jV3C-goVAhXCM~8+5z`QX?5)7nQ!?751 zoc#8G7ZXqZc0-Wzp*1cR5n99gL>1H50};rgc;`t2R0c7BGRI_^Lo4HN3?1NS;=%*s ze*x`Mq@;ZiSy0sL1Xrf<H_kf_6igxjIf+4H>$%r)siCQclvTBtgwG)Q8~~BH<g*i% zJd;@Ey3x5+wcnZ!iE*H_9!We~!^f}!xlX?RI?v{_2kYZPN|xS^`&w{^F1f+8+X(F+ zy&B9VE31jUYwi?n!;N&rp>w~m*3SI9{L<A<q$6iD>P4?(UI#UMHY|~zeZ4R9U|n;% z^XIfN-H9DC=w0=@`pk|ILo~KLJmfxWtjrMk=XgHNHzOx6?Jj2!r3tu-J$XrN!v8jG zVU~CY9IqEm6>V7w-nq~S{qN5lIjBHt!sNxHi}?P0w^4AKHQ-~Vpa$nav6+bU0jtIH zKuRL74manoq<nez?*@&~t8HRybscvqu;jEbh3xNrQqSUS#ak$Ll=A(q91~kcQvQ^< zuj}8`Rx9KNZ5!eIvC4TSmPv@++5E4~>D$=F8O3e5`on|Y5DbCI`RSXs`+Mnl<Tq{C z@wtYurj(|aZt=s-@@-BrxC~gP2Kk$UtZ|B2xMEh&EYG<B&>sHDw=cePrKhRvg!XGw zI`uXZe%m>3Zxg<1vW34j5aw4K;o>KYG5cg8W0K4Qas+7U5w*O+FoEh4rk|>s)e497 zNRWi#0@3Nn8f*@#I)5k*0O0!TyH3%M26l*Iquk7h;3v9B+BaSe%~gpYz4jn%qO9sp zPn{8)*q{I-m=BXeKv!~2x_o8J3Ia{T9p+9E;dM%}hU3wtGYv0}5t7q`(e)Bdwr>IJ zy+r8?jD4GR8{4D^3WoA?<MX%#@X|knv-F+O7#mib$TAx(Wj_Ngkj8M};=pfta%x_c zWx{`%_D7M$kfS_1`x#vh*>PfmioTY~+Vltppme6GJCpS@qZ&{3%p$K<78Oo<8b<;l zREOvl)j@i&7%cTpVq4`~t1>u^{0kZ5n^XYit&Op`wvPVJ<sz)k>ou3SjFy_u?%No` zpZyB+qWg|zUDUPmT=s*6tEjgbFW?2v7t3xkUS9tdN__Gj!~8bvQ-}Yim<O``JVIa4 zNXx}R`{4aSqOs`P6Hgn_G?^>vhOAmKw9yG$!M}4AxXFtJ&fCe1*rR9yw!0-Unz+sP zP7bGbUciSFwv*<0OK!g%)2sT5p#zn>H)v~z3SBSiwY+xxXy$rbA9_WC{qOahqiQbA z7R38r7iKJIE|yQJI1#I#cu3{nEN6JdQs6z_o&SxrUDDlaNI)nHT}I?RZ!al46SPLp ztinGO9d^?-tFH!HeTbDP@;^mZl62)T;HvUt@u=~Ok$qV>p@<eKpyA?^7vFMjbwB>{ z`J8uEpz(lJ?QPkptF&IfMKjGj&Bu8m1u<mZO9Z2N1}g!xOUAdi9Ojr?4eLL?zS_{l zN%s831lVIB*u-(f=~pt|6l^6u<dYg#`(pemNASQrG*M&j=tb^4JGqBJ{ioO;Vymdb zfGYZ}K0~7j<HMxh_%;XLiK;GH`An0zt_|D4WdR4OIvgNYDp@8{d2|lKQHXG4hy5cS zupZ$73`DY~KEYGW&b@;(Qiw{C#I^TlAJt010*h#^ncs$0qxmX{yCu7p^jF(|z`M|+ zVPT__I|iP6$@iaC9utW}#x7DUg(~g^zfL09W_jnr@h#M%E%7;bW(07;_}PVIRgnqJ z)Ojk+A_uN~2Po!rTVb3fuqdmeT`>-DD4KMDp3pN<jUjep`I!)3l%3Gry9-R2^wq_% z$hYKLC2Gyuk2h1;xnU~0;Z3BAo_+rut6F}kVJZTvW-%W0`L~4IW-4feq(ADlu+LbN zZ0&mRoWD5(V6k~`xzZJ8z3n<7NkWQ}1TI7vmtBKv)q5;H?8e*;wU3r;mODr{thQsC zbL*wFnI>tFtF?JoH-v7fK%M||nR0Tx0a=8u;FL0$?xn1Lz`heHVZ_sNVRCe9J?YC5 z_1Uz|bNZk!FEbXF?>B#hmz4KON{tp&%t_OF)qh`{{=(ww_-eVm8ClEnWA0Gq!0){_ z&Ez>tu?yYUXk8ck>f_%t<&?6Tg9jb3&Y9s|bj}y$-=V`A3H?FZ!kRR~F@K&ZXvdVC zEko=VuuCa2%9ckzpsf>{PX38+d}ugkFmolja^a-}-6iT8F9-Y(a5bgb4csbF>P|8a z?7y1%V|zf#eDbldU@PH8QSKL8@(J@4r)Sj?YsSx}#{tWSsf4$!CXa$jhVu$vNX-<@ zE%ZdY0dCa>*MWR{UQEqD4W>OrITQ0BS$1uS16P5H$604_4^)AngcnF_yhtgY3Y4Op zBqhG_)4iz#`6FmUb-*}jQy-o(Zqv}L;sX$SJ?!AXzn}>dUO4R2o%XNsEh4xU`E^wp z2H(lb<b4sf=Kj{2T+t#wh9pyfkVrgc(L4vKoWlwN(2-VPtKw!O5V6$+R%F=RQnF8u zZP&w63`dO>Z%OBIjzY|<|BPO>F}9>+I0mh3|4!cWcdG4U`uK6(+iy6Zk!H=<BW3j} zS+J21{>}p})TGO#!grhekp0cTgGva8s;QeTzlHKH!)$Sl`L@@QB$g5GiAG2hh7M3s zP2w*l$G*(ZM&Q%fqe1!pHtW%x78csgTR*QqR@5Q?7T?(jB^hXk$_{C=cT#xBF=K%T z{Gz4Si>8ho4n4up<e%kJjmZk1yiVgF-@~fvJiiM&s{YKBsX97qihcEBJSPeK-;`U< z0HJ*0>;PDC1~P_2sfoTQcdtfkb=f6$FxxNEs49pZBj+NAb%JVURyK+?V|8%F5NU)( zM6@aL@M_~72NRD(2DznL@3u@d^B=|UZD|VCF*UhzNW4qM44U>ZiB!W{W4rm9jxT!% z??C)vROLZK@8IyTZd<IM3Wx7?M?;CW!>VMBFy;FXn?Crpa<qTnaax?q){@sd2YEv5 zygjS9>Ikf<v5ocKoX&T<)Bimk6*M?iU7eWKUCrPAg|mh-#>08Xo|vD?-wlKQFYxgH zKj2aF1U!24iw4M_nuszVACn#*pC(SDA0N{mALSnZyz#7Bz_J-3R@wROl(w*SFCt3z zmMzq|`vuClzU05)T}NK~x>r8^JS^{DNN1;Z@i0C_a16Ezb^ShB(<v2qL3XD`{OGd# z>@JoB4Y}|f$(glk>*fuF!%0tnCSQ%+2{7#qA+=<+mHDk?1sUpVl`zntsoc&|(wjP3 zj4XG|Cgu&isT4AIXKdN&i~T#aQQ5ZA#nRVAzEfHNy%N`~U`xWa^~A|fyP3P^Tk^hC zH3qbMg2#rQ1L_q4;~^;)oUfT${AB%!%}1S9!!|-b(Op>K#z1n~;&I+l!ZQfB_<^2; z1&frX_NgJ*+9NTs;|#|ZMnVII=Vx<F06<F^>g&5<EsYFsqkvyI_H?V0tF}8yVRTC; zuujTMId<I(3McNT>X2JyyyxaJ%}V^#j^tR3@T%%{_c&alVTSaw3a?h3XEWgsBW%9~ z+!b%ZBdD3B;tlE+1_J7I%J^mB!=F;X(c>wm1PWD=5oI(YmtBJs8;5#`2r|Mj<yoW< z%KNc#o%Ch2yxi+Sh=lJb(-I>6Wj7!yTc4fj8ZB!@PGa03<e7~*7{8(5l&X$}NE_ny zekn-dpZ$3TyIhbMk}=IMwQUGiRHpx>{6m>eR&-y@zwRJX*kr-FoorrE(li|s;&RUu z!BS07yXPbyw+t00twnaCrJ8UczT#X+W)lt6iiI_gk`p2Meig1-K9~m`g~|4|GI`oN zeoiFyTiVJMiG#maY;oLU>RRkiPi-&Lo<ALiPl>d_sJaTqM2dnqWcZMW+6^2!oBaVs z?Ql;*#w)@8*+OTasPB!ytZZD3qe^1mi#A1*SGE+28JQ0CvYDx`nxn;e1eUEM`2{o; z4(DvPBT7V~i_+4ucl3C)(sZ=uL@(_%<QoQ1ldPtU4eFEL=amJYFYh9)YPTl0F1J2* zr(}#PR}EOFr?#XXcHlkyq&3Js`cqy70B9KcHlDl=jnWmGW3BibDD6+45|7fjy}1Jn zS9nD{NZ+n4E_Lu1!N+|iUT9X7!Q@`oceRNyHU8?yJwN-SQSm38GmP-QoT5g=HC0_X z(52ktps$FAt|NYE)?XPA_@tJYTdl)Y5L}zVRveW+lgmR`7*6q@CLCx_kY(cpExrpE z1@V(GPXj{HDcdy7-%YT*2Lg5oBspFLyPVMQ?z5FP8SYAWc0N)=if(;bnN)|O$sCgi z@Dipf<<uIL`m{X4VER*`$igjzvHS7^it0Js&xmUGA}%jmunsAk@NkbZ{6VSvci`{c z_Alq>V;#A6OlvmfHbhH;BoqiDF&p{BQpCo>{9C7wr7))(^gx>0P+P3z7h0)-8M8wX zsS6MdlUO^6d2V|*yE#8UV9ch3!qX#|revN}H6^p1>Njr5h#62Wy)<7rwGHIqUNN(K zXv#CKwrM(G3rMiM+*PxX#@AOT$eP2xo-mgMkbwj3R+#)~HDmoOc&lSmcQ*;(i9=@r z@$1>g0cTsjR+ucy<b}^kSQY1T#@S!T>HQfe6brnH(u5rjZ=IO!*si?B=$ADl7U&R9 zl;PafYhbsov{YR_k!F`MF@hIE`VH+Wv=cZyzMceb!d`}!Wb8|Ii*Ek%0}Cpt&`0-M zzl+dbE)n9(EnQ2FUoR(H#^%zlH)1R8l`JD>CFrUw0Xl99f*T)st(rO%$W<xo7N)r= zUuM6SVD1L_iiBO*+1b|PX(PAiw!89Xx+MG9^}J4?iqszBi9uWc9>RS$dE~5lWin21 zNeb%E`*iehIs0z0ZDy$Y<l1J9ulx9a{OS7jF@pE|+{|Lvh{(Hl&R_DiX<H)W-~B5i zU164Qpw6_4CtmQMS}E!1xw%gczuENb+VPfM<8=(R<!U2NW%v&q-KdnVp%+Rcu06e+ ztrWKkd)RN!)Y9I#(hIeVq0&qajn95&hKhgQl}qipRF++5_fNO5TvPJ<f3N@l1?f(8 zSzI2Um@&Frkk+}U6q5Kh+n*w2UEGnLp45%YdL-cFu=ogC+d5-FmO2xL=htH)&kCs` z^yg@|4CR)|J<!BFLf@&O)0?_W@mHVc_F9nwf>ZAP*eNg5lS#V2PF-lSFDq?bCP#bX z|0HgMik!@r@hfomow|MFuk7r+D0Kwt#0D4qlgYOAmZa?zNd%}4L*OvAyc9$?4G!73 z`9}%r5f`;u6%(E~+!4D;;(DiMrV^;3n@^%#xr76i^vS40*S`#0qrrR^k2%Ez<`xgn z?1xF~eq0D^rWM7%rq7oynIl#sqWe*(&zc=cr{^dCaTH7S_W0MZ;}pegnE=)NvT8ma zGQa-UgQ@BNZNM)z_FI)t9j&|9!a`1eW6~F(w5)`98cihdt4wZ9M_cK#L3abEnEvfd zJ0>uLq?N*nOdU*K!(B|T6PfD`i?~QUaDKmB@<`TD2BO2}zX2N6{$@Se6KfE5PQtB; zN-20Pr>B)0QT?ORL`_9Atm<5Z=5NrT8nwr7>~1mMaCbTyrh3nHmQbntY$0(S*~~h{ zkMknWtLdRiJQkCe9WTqI*qKHD-7C!y_tY9o=2?|-OYweHZoT`%MU)m&Emx}+4&By> z6a8r-*>G$YN*e<6`JjLyC9XBaBp3oJ)85t(CZ05NOc%u~_`^}IuqE-n!wU}shtth} zHZ{BTTua9Gmomf@aF^-!vw>{MkYXiv67!w4u@|MM;dC2`uSM;1V_Ie(t2RaNAJ!@> zpPEW{p7K`E9baALx`!Q7p{juOy`0Q6{aZqZtPln<+rzDq#1lW1^r!qH-?<7F!wrGn znmt(z<~YEFCzd2ED(-oXD&h-%peWY?Hy5woQ|YX9oMr#0BkUfxL+my0oH(fs)SCN< z+tSn#5kMbdb-%KFlybRHYB%GJ0BhEgVdXPYnllZpVX(}GSYOU#*j5go<q_gy=M#2^ z;*SPk49Rm=NOg?Dp3<UH7ODLm>0nWP!@jjgq2E0&E_$^$%kDG3y{fhS8|a^DnDpX_ za=BQIp2Pjll>e9=Y-T4C{$Y+|;xF?I3!ODQvMMOcl_Qo((Nt!Yt@aMm35@(V9UWo| z;}645GL?29vEjbYR@Eh;@ZGmm`2jqq%)@opx>f;=lVK|rbIN{3;c~#OYZSG5K@dbJ zYdV9yDvgr+m{hUr1R=TR&t!)4ED^I@sOh>ioD>^FE7wmT{y|D++1!MK*xd5m;K%`- zq1z@8Rb}AE#RU)f4#7*yE*c(X%En7EJ4B=rD*9&JZAJ_>_pZ|O;f-1f$BE(Lxv6>N z@4;?muH|<k@qP9Rf^6b~=FPasL7lNb0TmhD_>VlZ9yC*4Z85d=4PC`Gp+mIRih_wS zoqumwCEe8o<gqvqNJZz|nzG+u2hCjf`(pR4cwNf48S8pQPO@&Z?wZak|H_#%d!`x5 ze-;cy!r{2)ls%Qj+Q>X>$J*hKJayr3B&>;+p(!Z=dd>mGVh(5dHQ0exWKdFBTF-E5 ze!=eVJO=NjW|L#@oA*Qh6>-4WBo%0q^;X~5m{`UdG?1rG`;pwOD7$pMZ~3|dmR8rU zF5#|*S~o?Xev2-qK(b}$-K6v6ZR$=9%X=dQ-*VWyoP{r3^<74Uvixm!J>d#)f1wM3 zlF_DREgBR>F@%ybi*hpHU{<r|0`cv^{C4mnR7EU<XHq#8PTn*wy@Bc#{Zfgska|pF z+Jw~=c-T%uYdNknu~Snmi(7hv3astVzLRut;(M&tdDZ`Myy3vv$tKyO&Czn*!y+Ut z7M{*$zG#+4QJ&6+iA|uL0q96awh(_D1OTL>^Rzz^MD4M4XTp73BrLP^ygOIlSH}Yj zJaBsmMe+TV1?NdLquvsJmvG?!ux2_+jVGEO6`747#&Af8-@tg2f=TKUEiYSMpF4el zs<Oe00FBP9Ajx=2j<lzx>af$!s^~{K^3cI=q%3Aaz&;gnAwofoYq0lYW8C3F;T%Ve z8jA$RVbrQkul^$^gK<O%SSInyg~;DpHv1VV?V)}E-Q`eUM4oyZJY%V<A#RYBlAX|# zc4&$ASMoD1kLjZ>#o<EV-W4~h4ecc=3yKVt`MMO%;k}R_yb;we*uw2$ZA04SUj~L! zOT3F0%Yk+L{<e7*%qF;Mm3B^JUb)qd+Ay{<0z(c>9qrV1LvDxncfcjChIN@-6p%&l z^eAsr+kIHS-a@&YTv3)#tz`*Q?NH&Z&I(8XSAmAjj34o*U6!l~Uua%Dwf+>j;p<W> zue-TAx~Uc*fx|GrFm5GPLdGww4pHy`>AZPBeX2UCikmUoKyVgIX_pOc78ve5udPz| z&DNFnuK99&TFd3}$*PWt5eMez@TN0~s=1@vJXwtHrXcL~e)~z2y4G(EEfEIDU-QWC z`q7Vs_r+NYmlr)MF8W1VNn8xRMTf`nucnxZb@<9l^f?`4ZgoK3%Q8_RjH9i$UEmvr z8u4i=%N(L=9%}-NqY(Qqm3H68;>i-<&IQV#pJ_K=Fv*iOJ>?VxowH&dN}My#tDQqX zGh|#m`HGO3(vIcdV?W$^v#|x@1S&z!3%T;Y13do-kUT&l(+Y7<e5!(q|NY9%%b|03 zC5V6&wV}RKe9-85TwnSbw?UQo$SY5CJI*lW3)1}rjH35L6G^M%Lpd>(*~`5!yJ@(D z+`|<}baZf^#7nKpBX#))ugJfZMU}rlculgsGQIwJQ%vmd<}VzVM*it{Q}e%&t5qxg z;ryDq?-i|~e_wJ^#s>t&awo*ZDw5)XG_a0kebNV_2dP^Vhz8`Zl4Y1cviR_M`vu`P zQiJ#~%eA#OqYF31PYFf^o8a_r`K~#{3e1j3o1!lMoxsk@q3hdWQZQ0bHl?{=SE-uj z+=`zIQIx7AL~xexg~k_7t9jb6-oxnZZcPjp<#KG7e=igMJC>!#?K6Rwd|w;1ss~}I z9vKaiS2j`3rs1BTiC0zNT>>{jpHEerGzw$r*StBHs`Jg=kd{k?h>D%BPT_DE#*z#i zZrdy}zYx1M=b`%sqG>qWwB8ax;3(Qm5IVzy5vt1WM{JZ-i@_9lF$FS*M{?vL7=BQs zL1VHkZ;nGlx>T}>?x{0Nh);Z68OyS|p?iv&y~`Hpj?PY9mHDW<9`|lEXPdH1MoqwI zDLVRKNyDUc$(-@h-QFqoA_D#Jr=sQgODsK}6hB+PD$U|3^;1=L*DPy#X&3N+pEuC~ zLua^p`0gy8{Gy>{;n(l)bAK&7{KPWH&dZ)o9u|G4Y2JicDEfgXAHV-w{dJU=re&pe zk^(G%W5mUVXt~|FP4jj8by2a~`*wk`M@<<V)0mlmxqSt*K!F&(eW8IFE0yD!Eo$<R zo$JYL4+AcfJi#v^sA9zBAmgaG<=cpD|1n?MoRs&+FWq+zYx-g*q%X9U*-aQGDHNHb z;wSi2PNko?B11qww@w+Yix2$gN!>Vpj`>HQPe>Wlu-9eG1sA$P9S-4L{cGMI(pn;i z1JuI*8*gSy_mhKvY<i(ZRWIbl63(tvya4QB-VkE&<RC5{v5(3)S;O-TL3*|4;u3?9 zZ#el#1gC`J&_jfH7z)dVM)fKjQ{fa<I2k|;55>~4Ie`IYe^`=(XGR4UUnZN<J{tRU zuqUB5*>Hf%JXRgZ*P^R1!j>ThPmcXxoRRf^IHU9lXBbht9#cF@JwD1lKC1lBr0P?( zXV&9m%wsHKj7}&b78=_B%4RN?lYp2qj;IV%S9!zS5ne{8tXI{bAjf<pl@@*N92Ut2 zrzli!QtMNklS8(rS9D#;e|<62EN-vU25ygaHl@~Vpr}B^h1QVn`AsNctCh~e=H(Oe zqQ&GfN0aM0*`NxzX-ljh?T^S;Tw?+cdvRjZRt1npQYSJdB89AyMUcs43T*_2=x68A zeDX0J1`V8o1yIVQ#w9^RB%}K=#`Cg@o>73BPZeV}lyecm^H=r~8!{8gBHQE&XQhi? z)cp^aja$gUJ{E%v$8QvyQb&!9@nnl}bxS!)`{P}q1}M?WcD2_$@AoQNI(W#le8~Lv zsi{ou80<sOol(e#fqswa1B|Am!y#@{-EcKFAkx*{qO|L;s`3(s9Smu9of2et>@E5Z zXEw}tk+1(Ndx63%w4b>zbQBkpYdi7DQN7Nzr!D6wp>Yb<AUXbzFwfP9uho$ASZ;M< zYn-Z+PSvvT)K^$$>_C)5{|7LI-RcW#i*{zYCsXYgr29*-=(dT@6Dpj@le~I^3mIr% zmY7|c+H4Gte`+B!`seFeAap;meVKaw#(}#c5WT0GiIMI)=_4SjFnv~{=e(iF=+of_ z1r9ONP^4ex;PS9Y<d!#ah_9<jW+sf%L`+S&yH)_<>5I|qV+(Ahx*TPEsJsC>UXG^B zSih=rM8j%QQM;}p2}65$gvIV1libKvQ^Q$HnDJz@GSlKfh<k)*wT`<jlZ7r)1(%CO zfsGMVUNaH<zFJ*#&B3v@suHnKM`pAIUIdL7lniS>&~|BwdzPwM!l*u4^VOVwk;dL7 zMp==0K)B=imm@Dx^@2E8f)s+2Lv5}b)xXFx!2Mod3!2alosm`MvT*+4HV4`C-q<-i zyqZ>H8Fsy*LWbG84s<pN)T9l<@P*Xyb%83cuI}gOAf9M;az<6FDoN(pu&Z1g?s-{H z=W^9N3lu+VGDDf2%S^B)EjfCTy<W~ihF~nWR3`md1}hV*A=7E=JIgXx9wY)~Rr$>@ z3W3ahJ1JvOzI+1UYa{=7icx~uB$K_F;!e`k3JV>j+>`aiyiQNbn@Lrl3|~di?|1E7 zM`(VsVoU{hX|Sq$XLOU;9Hq{k=we|pUDMAkX%;7lk9(ZOD;Uy+wGand%qQV)XOgoQ zEdN#5^C`QvEBn-HKY#}aWOsak7z}aj#n(BJ8ucwdjmLhD_j($yef#VZ#UBCr%Bp># zNthEGXS321XF}{YrZZjW%?0)IPIIhHM=G;Qt*3g(HVX~O@H{yg79xw^n0)j33(Nbb z%h=Dq90M596s*5!@IN%cst;7P8_!#{jMEF5kABu3cR|i`BsuA1@iPE~2?6b5^Ry56 zPx;C_8BC||nJ7B>aF;b;3x~ThDjW;2Q8;w&Z`0T~P2_@xtdEC9Z?e$|rmW1qp6<hp z86=7%8U-t5k<uZ#JdCj-UI}NA@>DVMv78hdxX-*BHg`F_pnI{Hbd8)DFvFQI)2UpW zO;jFR4WB?=&};IrS{oIL8Q#KCqP@U;S|^yCIfT=efNNMzR7vQ5q&9PQl@q7lF<G6i zd1C6mSx9s`bEri-8!Gj(JYYh;F(bMFic<XbT*ae(r3Mwf<-a71Ni7p$(%zf*0S3K1 zg79R$czv!T0zC!mI~;w?CnD#$;i<2V$ZUfmYoIP+*s02foqVMDH}mWYuQ^{TmEre9 zdzlF3y^~ib$V`Hrr?tgoGuH~)v!;JXP|Kwin6sR>xzAhR?DMphC*u!4Uny{xp;oJR zzX>%9tR!*5s#eg)523LoiPsE^`pX1_!cxOF^`Dt4gxX!iy*`U2n(0%1yJk|tUD1)n zAw%rZ<$3cZ-*A|Rq#6k44@Zmg+j6{WnCj`}vruL<h!Po@4-9@aVVzjB5K^-zO~g0F zgq9<>lhKN0NYP9(Y`ouIFq2wS<fHi<O5O!9HMqN{?k!m8ZC>SFwA<%?aJM-&6ZiTf zKMBvsi8flqbu5{57kQC%64V$te`bmk5m>icmy84T3!+QurlPL3a7&La9ECDize%HB z&^aHRa3*oMAI<Uf^+s$E%~^yd_9u6&Lzr!88CR&E>ir2g-HtaUp4F+`qdzLkGlc*7 z(qZ7*k<tCfK*>0wHzIJO<3GwrKXbI`lqY`@HnUTHOs7NF$*RuHJCf04On1%R+4cnY zfJQgq-nqqCW(2??EbX%t??*G&Yzrbs<>Z*B=M<h913)ix(9Bv|nmkmxRP!A{#^jC7 znk@Vd(6oIgukSsNyupczQ-!dY@M?Ukis2E^bY;)WAl!HCk`cd~p|~CrtRX1w++vM< zq1o`JHm%9|J)Ip4bz#g3MxaV{+IJJ3$zrNd)MwHg;QIKh?=mrSW&b2x=p+NP)1>wE z<D)OVj|bA8j4nF1nw&V*b+t^I7`|~ZD8E(()MIWU(e;JWZ@c-0Y84ue6Etj3J0a<_ z(N<gpkxQ7Ng?vSV;L{Tn_sGx2>3dFvdHR-*5D9-7Ylso?z~#%>Xt7Cob}`v#7lVPL zw>>8)d%G;FcS9HM6Y0DYZ1C5243XMV1@5~$GgT<^o>Y!Z?3D_CyNq5dq}B~dwG-zS z0ei*bn|qk*iVpiixJApbG_2g<<%ca^t+IsBLI0(_@Ymk~$+F};y$D6gnIy;HWka?3 zCE3ZQ=u0UC1cIM^h*qA_2(CHH8T{<=Bd4K-k}hqZJHq!P2lX_TO?9aJQk9%4F5qn; z{Z?^5N)l<L)&_Kn%=BYr{63G8O!tkOFmwd78;0-CvsZe>4%DZ%Wq{)J-b_*G39<tM zMO7~|FL-2$TS>CUvRzW5ic#nTy}pW$nc#VTBMqgO^3f8f?>J=R|E8@F>j~%h1sB8Q zvzCCG@Kg!~@---HOc_>3x^qZQq8v$w)~}bi9@%moq6!`6<qA(ln8B_Y4lYXXSHrF5 z0xjo+OFxMw?xFn|zy%N3&(%v-`ZeN*t9mkvIT*$a)$+$HifGGllN1+6*SaYyK9V{` z<{eX<BGS^<+ZePw?3;2}Bf^4{SQ9NIKSV3J*;o=3l&~zzpJc|SB<V{MIm!)cJMKSu zY<W1DsfaLI8Ab?n289XCX~Ov}$Qb3UEoD#NJ*OHzfWB5F<t0hdN)lfq$w<Xgo^9p7 zM4Rd@Xm1ecZM4H7hdon3i{oU&<@B?uj@<Ys;o8z&)7mY?MHj_k-rdq6Bw|(VmADAg z)RJ9P9qplE1iuvbTIlv#Gr-A3^<<94OOO&1D<NeUuSOP2hG7Xb^$PF1s}`Y2<O>zT zG3#MAt8BGIxNOWdnHypS0rBEAl^|xuHa9+Y(I*2$?xrHzu_4_<Js!mDR$6Xlvtfrz z`8?etT2dlIE_PnbVvZIWJvhOHVxsY`Y9EUppvm#%E3b(h)W{f3=?*_#Voe)F%o`4b zQ{xNUz0$$qvE+%5=Ky~{?%7aGZzUX8-27GcOa>*nq^jZ`hcvKhz9})O1hS|;rC7Y0 z<=9m>i3shzlfaR_;VC+a_QaD_b?fAH^XXODpyQruI-zw;t5DR(iBnsGl$nI>l86`v zg4Rh%d3RDQjG3x>!6{!GOFJ?;$rv*H39{5)RuMb(Z~>D}TnH(VGR%YoM~J8-G6D!T zWDH77)QJ@!0Q>{qU8mYd4~?*QWGdBN=JpZ4Pni5gcDd`X933)oU$?3&_QzzmJ{iL8 zZu=(3tMTAgC}Cr~0LOqfLA&6GThzNgclvOWRHS8MMhlk3rYsRzb^}(0C-yqh@g=iD zI5`tOV7?f~;^=@&{bHiz9_J>X@wYnN(5}mz--oaUkrR4_x(}zH`gPaxU93x?s}5@c z3m*ilPb&gSe}1!V0u)<jI>_BvAtwGGQRm^!1{?POBtj!b6GH7q5)rd@jcOxe#b`v# z(%QSN-Bzm)5kzc4?Gj>ByXdluqIOXoW))pZ=kv5bzxTZ7y#K>}?)%)I>wA4aK;4%) zM*TVTk~3)T*L2gaO!vvT5iK!*QvlD2s;Q7zuDe3xQD*}|8NCGA_|J8wzJU0+r^*_J zw8}NW6>t)w0%kQ4ujCGP7Lp7r9kZ2+mz$dckz)b(3lT3axovTY@9c5IxzXi9GBfj> zVrWC6hC!6iiRstVHIur82&H{8E8DNu<yE!@Ok-!~(Ds7#vC4O8&}oKeB<^V7waH^p zmHmO)`it_;rg+T8NV1OLRxWUX`#%Na653v|a(cZD7oTXxd?ibLpfn5B?m!QgzseiA zVDAUZu1i;98z=l?cJ9j!2fprkIpD9c<e~0at3YZFp|$xCym>jErp+H=tW}qHbv7D> ztR?63rX|I^ctw#pt>F)No#|l@qcTdB+wR;?y?74|pfNU8fTrbt-~T0O(^fK=sc-s> zxu2vvWo)gC$Y{Au(|@AMt!VWwlh$Wcq0KuQ*yzwaBf-v>NUlnz*t1p+RG-#6-jfgP z61!eHr3Jg-u5Lcf=g>({!80Mqat>F&Z%yQv$;%;Pxs;!eFKFKVGE!JF)C>wi4GjiE zHwiXs9b^sZE#<3~IlC)t4qef}RM8f#R?B1R5MRh`avAo_l<{s1<{|L?{nS^Ym)4wr z(shZDcXZ_A=4G+ypD&W$qyS14QvWl2ALcFW_gJuG(CMT_l6ti8@yNycebPTpdPP~G z3tN`|7Ivq(9W-}eHhHqew+U5B+mjyMuEgKLD1w|%OObhClE~kn@l7dKaD}&|Lt>IU z0N`-?TadKMbI}f);Hob#f{P~6|Ln3B1nzLueh56fuM2)+Ygzxq_&}X5w>265eST|1 z$+{;jQXE@@2-IQa0&+ddV7?pqKIvwa0ZzGucmVdYrlKxLx9&*Y$kt5bHurNLw(G(- zpOm68LwJj9s<S2`cRam1Z56mET_dNtE&cS{{5p-Oh3-6L-qLi?+VwhkeRtm^ua{SN zue?|=R>x5$&8a$a8KrJ-(s0by^a_6{Sh0R6V1?;9rEL&Y={pT{xoK9-d?+HV*a*IF z5b)ZD3Nwp&taB|*b3DoNQ}O+)2Or5dOT3>nkyt&ynywvFTrw(dAsB<jjeM?Z)tK7j zXKSaB`X{?hw6f!>T3qCnzV~|1)SSF5clB+&`}~*K>C_HXz%ra<YRn0TUwA2$Oz5I? zMsU0@COeOaQ4AUX62c3m{cS;-=x)?<-NRDd%(f2tNsMudz(t8OY=_zjqsDfK`I!<s z-FO=xvT+f)s&s4Zuw0UhFvW9?iqmu<BGW(4QD|Hu6p{Xpo<$TflVAxqSGs&&;(dWN z?Oy^{$^0)kBVa_J#G4**4jb##_4*Y~q`RZm!0~0tnI82HQY8EMgffaaJVl~UJ<zRg zG>$mk(0_xyJtk0KDC?5CHkfmIL`>%%t2sL;_e?N*gauI-c6Yym<F$e%VxMLHGv1Yo zlW_6=k@d8W;&LM!(_Z_^f~e5wLfj;%igUrB9YVBNqjE9;qIz@;tv<-)HB00-ToVd^ zG^ARgg53_$t+WYM43613SF33@wEqzZ4fw}wuqo}4=Lx@0CqH)DOsaaS6_pf&-BLI{ zpd~bKMA?K!MUIe~Ey>5)taB&|yittqKPm_)6Zqw(uNw1d=YGJ8^(o88PipH`KkdSu zFX95Pvl@2|qhZfbmgmKStXrzMvwQdCa<b2M)k?67k{yIQ-Lb4w?pOga!lqQteLUxw z_%=V%x>4)vW54VZ#aRfuRy8i+VG)!$SB?ktR_tXyF<V97tX6B91W<Isx8Hwok6YX| zq<~DyT=EE?;F1G>NpH@7{}u4oHifH$bL=-z5H`e9^yPoi$i4qVBb7&J1bhE2S@<vW z@88>h|K|Vwdn7yQ`TO@s-uj_#aPYLfhp@SAQ6Z|>d$39~!NJbaBrkiEUo2IVX|FTy zCN5V^Eunl>lh#PHvvUyOGcm50A@X09CHGJmpH&-~11KVjs?`iC-_Jy3X)nKyU!D2h zkx^q$<cxW+<k5~yekEC`1j5c<b`Wk4tZ8PiljS3)WkHf3*5_L5WvWD9)pi+2G3DOu z%^gNLJxGZX)9*MQRTENd6d^wZiJmxX=f94*p?(-TIPPbtWvqGE3!>n=hIF}#^JMVX z-K00OT$M?Iauw4s3p1`4n{OTb1Wx3ds)}1+zJnbp42Rie)nW@=4*eR)V&=s_Pu^)L zy|UlQG?y7@a)*yos#;pmR=k?J^?S^E@U^Hr<-5ZGkgsfrMelaM9CM>3Sh9ooWoNOY zRkq6ae9ug|-1#{S7s0E2cyLT1a;Y@w*$_$}+m2E-B>={pUd)vY6OYLf<Y>xvK|X25 z6U4DR?aZ8as5#{)!&A;f8oerymZSZ|{ik0KwX&-(bbR9WWDo)nD~o`Oyayi&ZxtZ* z-5+U+z0?jij*34V_^*Dy&BckG*>=74Zsf;X$}wjq{9f&ewRX-C8gA}XjW1PyP;(I5 zN$r?6^;i)u&}+>c@TEladv$t2IDFEzlYLMQA}D-A${|s}2n0aBq<(trW&V?^{y(jZ zg3V~xcshU9*HeErU#xnJ3tZ8z_-nMud9d+uzvJ9U(_OI+o4M$xq{CgZ&Xz>O&JC4H zI_y^LQH;AF^PwgWaYlif$R}B_WJ=`{8N(u&JVkUcKV!f|)<fTS3Ia|a-pI$q{mgG7 ztzbD-ZaC7s=q5Z3Y_bwmE>Yfg;=E!;!hL<V>(vqlo3BS^fhc;KV4qUEooD2p)>`Q+ z>(5rd^@&lI)sd~&Wpp?)xKk5Ig0{D+^c$EU%Nd}6<?b#{uoAU0ZilS93<p!^B+6CG zs~!_2n5+b7PVn+H#Yo1!*IqI*h`H{7Fc;@gnm>Q+40coS6zMXxu3!OYECwHVD$)yi zW*^o=?|aVVMq4oj#m)R9uP5tlsBQ?iwl(NcgK}3)h0!oI$M>!~$~9lv?d(8HbGS+l zy^LW}*WhYx8ultNZC<4+(S3SO;nWo&_Ez75JyRG6_a8V)<65T^bapR$#jKlO|IkK7 zxzuJVu*Jl?HGM1mh)Q#TO8WOUNI@(OY~z{lBj@)j2Ppxes-qv8{D7OLJh|cNl#4O_ zY>8R0KCiH#TfUQ94^HkrHz3eg3%d?|+Qbr7MBeX^Aoo@w#^jGex89Kafk4OEG9fPk z6ERl7g)j`P#04Hl$-bCHW3>n+gMG0qAzpuOj5N2gda@-K(KC4upT?G?$q--w89l4_ z*$pP|5yhn8EED;A(>i0u@gqB<+CRE|o+<7z*ny2vBZ9^sf<E1DH>}TToBUHtb8@(0 z7H3Oz`TAJ)I6~f|)LvIe+9jfZUqs$YEhIBr-QkX|x_%Iy5~d*cj)FqD9wEP_#Xu7g zxiFW9wo$LHFZ|8OuX~bpO6Wvnq)QRv;QDuD(!+}twyoy`Dr7_IAD1#{D}i?9UHKC_ zrdT45rK^6uiU`5VLEfocqBLux%~XyRiq8#BF2#!Lu;dpXJ3&)|{eW-*8XY=4X00-u z#fQq&%lF~O22P0uJB*iwSiu5e+6?3vzg6`QA09V|)s)ll+th7btfUc8F@dQrt}dxr zkHn%L)l3sjXmdVEdsdQF5)FCGk$9xlix(H26X3U#l_9%=g0Jc|(LM*u9(8@0M%(5) z><Zy)!+}k6t*Tl?dxzc+j2-E)$m^Ym8FWThsfeqJ0U4HLRZh0!&5gYr$M1cjK4arJ z%u}SWs=`=~&>k4|p)v>QrhP)ev{X|wQm`Tmi`LEq?`+AzNV4T!ulcegDOW?y(LskH ziNOfCOSZDVlYPhLxKWLHIkj1r!PpK_caeQ@n2Pfx7(+$%bG;qNen!`4!`$i>ot};I zJL145ieL27WW2*R32f)#p0U2wuGM_rJJJIASA08+Zc2=Mh-F;`EHQOF<HZR(ime0E zgmOSA{WE#6l8dT5*S-2VF=FQT!a^6zqsN6Yz;8%2mGL3EU5P#I?LZx^Iocu5GP{8J zpr0)IbQqH(%E4B6l*|$fjN1L7{Y0FK1k9&w#@ZWKeIplc(c^AhKIo1ER?XD82ihmH z1*3O(AR3&XN&C_jUdr350H2wuOW&0en-c2)w|SMnDpX}g1-LKWkeb!Q5^n^GwVr9a zV!K)4jvf1NbO+1~Kpig__*C$H0}gI8F<rU_@e36N@d)=~+<W5&DZC>y=-Ah)%X6dd zOB9mokSTEkMgsyG1&sHqcXNxV|F*Cy&t{o@u>*>qpq+HT`@=B0{n_%~@4&0U7hOI& z@3#&XN&j{^Tcjl*=H|S(8fdZc>tmHxu3h_8RhfcR|4RY^$tK3)1g%n(tkiz6yRUf3 zTJt><8Mfr?M9s+QA8LEyX|Nuzd;w8EgqP`4?3Z4~nzJ`~RlVqR5%N5|yxm{5{1*l) z3%LlQoADXPs%<Vca8J52L1-vu2;Q4+T^TLFm4o}{Ftqoy00y$gDHASo^c=U%b5yy~ zR?A0_#I7UT_y;?2U|^Foq92t(v@f6BX(%XI<5}QE;Lz2XBY1m}LQ{s=s6y8{HrZvW zBh-hemrUx^FdfxxSMg{&@<t?Db2#b)W;_~7Rv8^0ItHi_?52!)!k&b>zrH@LnJh*z zfg8yTisn$f%0Q!*2wAS9-D9>>v!Du{S*wKKj0+BhNbkfkD7pF1iZxJ1ghT`_rw@x1 z)D9Ljv~ciNH;2e}nCF}EbFb3a@zfNY_XW314J@&&+1|rFmdgaMc1Ocgib_awD3mQs ztde}|VPXLnr%q+BTpv)cCBHDi)K`HSiz@}URGspxqV`kE!M;Y+ja-v=xgk>wk{lmb zt%bk_MebF%$pMDvl^mFwLJq1sV@6Bt)RJaaZor|;4dhGbF~P_nh+?QEM=t*u7Ozwy zuQ10pAr5A44;?kAZgO)Ap$5ZEdr1L5B-Z5obOCq;fe;=t@a$5`d+<_^SV{coQ4iQw z?5!2nUhJyvo{7fjzsh9|=MSL7zJF_eJ<+^*n_*XHaMvfj?Mhv;agfhT4aY`u^<!Df zdJP)?P8BN^W*aa@Trk0Kgdto(g36ka6lHyPQY|0DRiBI0;=u^fKB|^he*hl+*Kc!D zCfk?2zxXuv9_PQ=VcCxQT_uI9ZCXY5{TsE;LV|J0U&e?J4}Sz7R-bJtY<ll;P;< z%;sak@0PO<y_+o=*qXy9*!M$<*YjPqHRv)wx~zt7(Xpx{Qn@_xikjw9qb%PU+ak*} zLwyT1DKZD*2miTd8=(Bu8XZg%oeNG)HAm~jDdZOZz%AnY_=7_@mCg9p8HAma0*~Yd z?2~P7L-8pvFZFXA1uoHHVRrZt{p@hYl1u(nh7!D90SylRU|FlPTZw6DO|O>xYMN=5 zcJaZb3bXk{!b`Z`odX$5SZJ-QaHw3v^niUuv!cfHkGKKnCpXdu@5>ts*{U=)<-yr` z4vw2Obw?l>q<+AEZdzmvEe%&nRiG}bhMRL`+DJQ{*2gzrqXhBF8kS8~)A>o#9#U8X z<!pvk-3mUR;4YD|M!qa@MiT38Vy~gT-KFUOcT?8!Y<D4X3M(y~wTZP2i1K!$dQyW7 z#71kTPj)ADz?tDiG3tS0+7Vok$f^%{ad^lyj}f6p(fMVKncVey%MuHr%=wyUx`Peg z8UHc@Bl7u&Dxph+3vO_KHjMW2a){rQ%jw+d%Av(dAvqwV-yT1xYH6&qNy8$=h5-VZ z{3b+&IFlgttkY~9g%9B)niwH4WYli#t3Bw%0y@v~#!d+XfYVj}8pk74A!SyEIY&48 zc$b6wX`memoC8>U%R*JYOub$2Ab>#frh$>XKoO+7jFh_?LbBy5O{|d5|8v|?Z~NJ^ zyyF4f23M3N1h0l~HK$6B+%|udC^1mc1sz0HNPkn@{DB$Y@x38G{KdSj_*~eJ$j23T zKDs`5TBb`MF{F3;7zA$-Vv}zSmh*WJ;W(_BtntO{#*PwTH*3$ir`{b<dcH}E*XbnX z+RpR4JUJDU$rAl9$43_K=7&pi4lSakmhL?L{cXWp3`SEqapqK|7Qw<JB=C7}iL;uo zLK{*C*VgK-(*(;J8{A1|dz|%5X`AK9ywb^0HnJ-)i3x=91tY9llTq4hENfX7M!g>c z=qJ=g6)*1Gvh3#0$(dvQH@1M&80+keP)W9T6PakLMKL)&g^@awI8zzA*<RR2TGg6b z)|_C<2H5qUpo8hQhA=-I1zBnrA?(({!uZ}_@FqJ(TJ#X6SM{wJHD(s;NQYG$Qn|#E zN!Ps`r8Q*hh?d7ZK5SrTY%(GQ&!ATL^L~vjpi@7%T0#<Z6xf8;w_2@gJ5sylpIuR= zO>Cn&5r-gq#sCWMAFRnMTI&OZ)aaXiBya;Y6$ldT#fq^QSlDxOAV{{%DPX%{j73YF z6p~|DaAz~Xypf{uP&;8xy8>GQPmOLtF=aD#&^)O%M~)4C7b}T~1a4Y;R+icYNhHWt zqxKnI!CWcQZ<{7}f!Gx?Qd|`<B4KQ&V64-M$*UuAYweJXM29Q=soq@-{-fip*bcCa z)k`l<#)AL`ny5oct}Kn|J&I(}U<#T?|1wMfK2awLl3T-%qa)ij3>9Ndqi9A)rPcl1 z`A+>T%($YY1eCxvPj|C}`P-WlaBwjrUZOEs6UZ9?$(+N{&?H(ckgRNDsJEk4I-n5d zZ3xwi4}^g{xmo@2w*Xl50q%CAfZ^FC&7a^f0dFq9+Yx3GoX4>rkEO)@$9Va8YhZ*$ zcz(<9Oi$YPbl(j7DwRvmweO|ZOKeW6n<Q#42ir_qoX#{&!Kf@N3-`i+oQNsgF+7NC zXnE!XW|7jGbTBf;e;w<&>d#2|Jo#<Upz>5l#+$pJ1LrQ)^NR>@3*LQu<J+Hh>H=Kv z_oKY`zelb;F*<W~C?Z$mD%)?Pd^BXS(eP>FvYrVm**Q?>rj;sPPPRg3wX=_3utL<% zZ$ecUk_Re2F97S+LUl=5S#0LPPFCVDixq0l^IrodV<)y^)4(Xugs78YsV5jbgb=gJ zX7&Ow?)~z-snV~UTJ(?--dq@zILz5X5m1XXmkaDVT?fZ6C^!{S1v>)c>V{J**R~g? z$_oezEm6WPb}(7(*^M&HC{D4#*_Qr(W=?RiM_W<b9`dP@|Ae?`nMduil{;>3YQe!k zh&fQ0rwBhbMCMvrhIfcJ1<kiB!V&O_m($bH)#Pg@t5Yp&YIf_?cUJ>R+}ZtfQK*sB zt8R#`+v)kKwJQV-*1`?#Y<@$er#4ZBehjEi#RF25n0-U}+peY_bJ-=M_;MwSG<$K1 zx-f@h!k5Z@g8}G;LUJdQlqv%fD)XpNOuoo=rI7I}P~U2udo#*HET8M>dk>-U;KwSb zS+-1UYMLJFf0@M7|6>xIBPMZvv_DJe(ciz_fB!!G`*-B;-)DdSUjO@-kc01|)WFO@ z7V1h!^lWEur70Q0jb6Y&;)#_F5(-pph$D^LNgC<NU5W3qss*JN%a&)FC}J>kdiJ?i zAT|=@T_&7rKF!VrfS@c5cC*NrU4Bp0dQ~SBn`unU(Ratt$rxZ1JsveiMQ|UD*75DU zfM}XO17d_}L@rd6rU7k)drMm?)nj>M>;Yr|&}>R=NAGR3n#WF@W$G2ct4A9*Vz+^S zN5m(r<rhl-p8RD0Ps~5uckTghk9heWYm+Du_~xt55gv*0YU%q-d|>9n7yWGU<PN61 z#_4kDW)GyrVt;|NhdgcC59-%#;q&ar7>G(%&NvHe+@X*Zx{Ev%M4IKy@;*8!@Dyk? zB*_myaL(09Fn{;0D&&H+QOw`DF>dkqHlMH57EOO`8pTXKofbVce5ChIy$~*fYe*jd zcR?o&Zbn=P>-A%R%-kn``brG5^yT@Iy>G(GYNlfeTrTfz+kJ(E^34p#F}1#zZ+dt+ zjI@nt34RuTsoCEv(f`&u^{31DnQ8}xhv&bZ;V~TiN%O}f*FcVWK+kJ5f6gaTiOmK1 z$XG$C?7yh@t`CwQI{RJRHod^P@y_Ml<kxwWgv#Br<yzm8+?uhfwqGJg^(^m=iWR)d zt5C*`4E%r;xg8}6ooDkCG}iQ!b%|L$`HGhL?4Y@+7RE76pJuhMjZ5PN?SrHJgc28a z`R8==`F;d%N*T(W$X@{^6l%4~$)fAJI(ebC;1tM1A!*=;`NBHUB5Ylg?3v0s+ayv> zrXp#9lc2?}j3rS9E{jlvxn;||ecsy!DsqGQ{dWNh`JSSe>EQqqqAwgUu848!;}>{4 zDP;>q`Eo2qF+LVGndB486d#Tng(eo#+{&%37?1Z07sJO*@@jPDN7Ph<m0YAkV5Mn_ z=6%`r^u*!0+y)<DUghT_Cj?aBGLI6ScmYs1C0ova0$`kGURY(tKv2-;d=wg5!_oml zAvFtC(b)cSS`kNT^)Mj>#2=>agozb$Rzs7(M;%VAOeDs_L{SXq0TeEmo_8wHC$vxa zm%{;ZG@*PffDwBG51>yO=f*@3!PcM~<}%&pHmk**y=TC}!`qLuZ7Zgcca@lNhk#hZ zKex_|o83At^JuV^a}e|2lQZ-UHkiI)+&EW7R_Z+_vy>9b^Wa!3E!w6gv_`Tr25qS; zVs)XTYcl=()~}H^t>3k!JriE)4HI8;Tx>KIh`xi6r)&JmXbWZcOrZcQj#J2b5dG3c zm^6_<ZRqHHX@TP)?!Ze+Jcl2|!(KmmT=dEd*)<$F^Gk1Tlb`h4Wx`Beb8J+ssP~O@ zV_thzaa>Z+DdIKe^GF{RqluTRLSFIjgUF%wpNqU0=i=y=`Qvh$9w6UutJ&I0xn+J@ zXgf#sxWJHycEz!z^;^EswfNMQQ1=l(cma<F8fxK1Zn#Rj?hD~U0Y|hTx2han)gLW7 z1bbF4iZ4nPyu`kRX$%*iAk6eZRh!{S>S8VX-Z&omHU^2(Ev5GG1xiO?$zN(3EsNZJ z7K7^}KB#_(4X$s$*Jj?s?9f(ScKE$oSV#1EG;e7gt`e*eFS)0@H`3yIy5j9lbjb0a zQR{D2tt>6Am^zL`s9j#*yIzzwahY=5Zu(`=J%V{(PcR*^Q>S60B#tch8H@#5tWHl+ zak@yuVw64InNFrdWVv^HTF)pLBac~@ol&APM<h(+3<p*bGz;6Kv|_b)v4w&OhLo+q z0t06h1DG@nMHxT?CXzJ*yhk0fEOm-Pp#YN_DVI@hUU9fPM5N?suA2gzE(F!%6U=!i z$K#Q1)?wbLLASiJe4ql@5=|kpT<GTZJ4fEVEH1cgGE1>?3T7^A4gf$9yz#JZfRdFd zeB50w9E0SH!Z7h*RKG6RqS7Z3`9e(?44ZNyo(U-Ll#xhvK_}2bT;_rdwg$I^i@6-( z4!?UDMU6aI<A0Qvw(1E0f$3~@UT>-@0F-Uar;x_uEYT*R!6j?+#i;i?Z<Clm{0dko zRpMuW`7`_SSWql)f}(3Vc08UfFJGp$vwr96Q9Oq4;8u4T&xyDH{BQ;Q8PN<#x^*Hx z&7)c~e@1ZMi8TrS{kc5k{PQJczL>jNaOb(Yj=5(wk37fI)t(HEl|;Ttco6s}s_|tR zemshi>MVb}z+~=Bf2Psp0{l}<^l5j}3y!8fhdQ8KB2vSJ8;atg0$JH;GkS!G)mgts z`4c3Kz~P&(8<URQ%oi+WJgL)<XV!4uMJ~RjdoL#rSFfg*{2+{-y4Csf_jNh5vnQXa z0DU?bZ~0_L*2`<@?>gEoMiTEujw11`@dJi$%DiS>(#~*HzhdTv!+pG=ZZIw!!c~gu z3%1>^e8&yarQ2|rKDg@)nBw^gO?j{9!VsJ<+?n2tgjyi&5@J7b$D^gWfr7wn8{<i5 zMSy8OSPCRne~hC%U&B;Q5{si~o7p22QRiAn1)_nR8OmH8lCnV4&1;0*C}xO7Bx@4` zueeO>rPV<NccVopDhbdJ%Mh#+JglX@T_mhNsQ%z%h);g0N}%Y(a@Df4Q!H}8-oDm* z<Fa)ndANYl%Ca>ci#-tR=;ABOvaseCZ(px*BRObf5z3K_PNgo7#xv>DD5@nXaX4T5 zdZ$?CFa>$VHd7UOw5JtCS^_$&N{Xj+2`eB<%+b9Yic|1-acCYX0X2qJrlZCx!^Htw zQ)@T)M7WJx8A9%|23~z6IVH`7%FNG`E`!QQ3!F2Q;^$z_F0)jrmCY+bz{X=qXpSPX zFK|0HljfA^j^!;s5?!gXg=#Ar)$`mr6ug_fec~jEM>EyH+`pIZ&%~D30#qnWY#;>e z0fBIP^VY-_FuGVsC^%mo33`FiKnQE$xp)A>Wgsw2-G5vQ2?NkY#gI32c<3W;s0tBT zI+lpJZ-mF!XoGRc4D_aY81A?P!K!<NmySRJzzFx)ZZasXf*`9w7oK|p;bUf(PN6?T z0U^vPL~oKMcMYI)G5$Sx#kx*sVS08Xeha)}Qg>yq_^H?Tv&EM8WlY3}g3jDtY}DCo z+?RQwzW#o?@w}k0(l7mg-UtpvmNh5GG!N|9a<{u(0qX;uk7`zrHK=R>Q12#VDWq=< z2ANslu7CE<O~TdJj+k>9=UgRU*y*h7yBSboq<{DE7SVegnku>ldcreLe0TnEZ@NnX z=Az-BRJLXP^NrscK<N@9_Mg2h)~Zz+DfN2dC}iOI?ThAVh5jyo){Sr5D8LAr-A}f7 zpt^%d^THax&x$=}l)hM7hHNkXZ1aM$XEqInRdy1J#p6N!V-(@f>Y3DLRvpA_;m7o3 zBopmFQ>fn-jftaJ4{85?tvl^_W<RD-`pk1wz$wM&++U9CZLjpLhBMI<yp&G;6Sb^{ zlQ3;&WEB@@?i!oHOh0t1>1^yFCl@2i*XtZdK1V$$agbf0!jGDR1Px5)=8M!zQz*4S z8H%lcl?bV(xhZJiIE~T5L<RaScgmREcOBLu=&)*8Im=~OreH?dwm)3qk)}ZOPK$dZ zjHXS;Tr=lQmqU0HESPx`NtOQSnUShusUZy=GK&*{Oatq6Y)r9%>&2YR@oaB*fmqFM z8#Wx&;|?01%;(8PRzdvDWedRV>Rs`Xc3NSQ19KG9Y<V?1egPsA7MW;je=3(pqQJhd zhe?M?<ht_$NanIm*_3HYR25mV1~EwJ;>ji%4Ph#qCavD;luar-L9kgQ5gL!D1+u1& zV46VS%_jT6(Dwl#AY>dOr$s^t0C;TOz3KZ8XfU$4wLqZl9HN{7AtPwm8lt#+84f>z zmjk;RX;~!%fFQEaDG4kc43_Xjj-%xBW8vn#kf~S;iZPH*V;o7lh~g<c7VsRl0+>4! zP(gv5tI?+Igp{+YrbTIN1W__!ijEhXvJJ+gk<3S3K;g4Lb2bH+G;t~MLyxp}uE)lx z&IG#aoU2k=YQtCgUFaTr_DB7xa#zmDjNc~DxcdH#%F8}bi}TRr&l*+aWFIxK1a}&x zNOgC~s}AHA#Fa!$7!dlKW|#bAii(b9L|;0!E}AKRuXf;{|L(rCKG1VDa7p15t@+#~ zh2A2MByS+Nc42776bIDjaUz%)JtO6<bHXD$q}O%?@WM8B%s4HE%QW+qwZ+l=@${f4 z&V;^Rp9z~ZEr0jk>4kyhZY<mGXex}I*@8^T8c268L%&;-682@Pwp0c`f3%ruuoI4T zHtj5O3SjM=zTM$vv7C<c^`EEQys#688U!^d8DkV2?k@^R$>u3~Kus|EJ)MUOr&H$b z*@+I?nry<f!X)1A6BjS~j+82AFEg5}omS)V+d*YM<P{eLUk=G2_5pXPE{7YHp^Ri_ zs$!auqRTc7<|*n?m`&;6#P%>X?75AU5N+5n34O^a#IZ1Oe$oRqL}j8V_xLcm6{E`# zuTc|-tMRWE5*aRYn$PB=UPyo`1@~ekMDWt|G7ctJ?YI!=yfaP(r6!ilGl&tln*Yg& z4GGZ)#NqjQ{L8PXBluwzC?Np}c6(@(4gfT!#gFQ(9ERE_*SOaXAoZ)qE+eU-U1O)M zFbwBci$(xTPhgEamn&I2MS|o7vQFc@SO+n|)Fr#pVPGx)SW18ez-nq<97Lvx0PF<? zF$i2aH%SeywF(c>@uCZ>(v;Il02~Z8NH4(0qw=+5vy)#D94_Jn0K&-ped6QIwSE!O zengq$+uwGNmIjZH8S5(ZP40Fx*BqYwYg)Os55$#$ZvPkvO^Q%f=9#=uO$nIc4am3@ zF0QK`cjnjoj>{J;JM$tXW1fG+M6T~S>qeZ>+}jq@Nfhu)0{bWf5?8oWj)nsZ%iC5o zm7!OhF|w~vqKg9Kb#oKftnuk<i;o_16l@!xs4nb!ZAv!Hj=P;h=|4KSX{{c@XPU10 zz~RZ3-rPe5_ukj(AZ=v7tArGSKW{Qh`76wC>&C_fGz-MzaT$4!K+>GLRmfQaRLrrC zd$?p{Y~^kVcR=}Xp0NZS;n;aIFtD-(4TSN=nm1_KGN$~WKP}Gpv0N`qtNZlHvwWwQ z<Y<%PDto-B>^OJYn(f4x-1E4HyHd*!0R-U&bS1gtvndL}3LF%s3a`SQ<Edji%8*ZQ zYl2z{oKO?^eh6e90vD;1QDxb3Qro{aSZK?gSja78WV$B|QB0KHB7Bmn%Q}Thc0ZeU zSj0g?k46d95I&!q0ZUwEbFyJWCZmhckk!dc4YE9(pl)JPKdRkZOIDK4(}YeYq6IkK zJH(4ZY3@d5!lD-H`An|M0JZj`7v$*k1tB6WtU-hQ3GVsa=G<z+ObFZv$*-6NM)Fay z@wEX$vg7ZE*M^z;O2fm(V71<Cu$8%ZG9L=Z3!0MkffXL*B@t3EN~S|OW;BjA;2nx- z(6*4ZXrR`RUVx=gDxqDl|D_A-|3??9j_5*xgFz%B>+fIM-@iv&AV<lE=>G{nB>#me z^TKm`Ciy{qM#`wTge-`aJ^BI}#ElhJ6q&ZOK5!^<foOUpKr%fG7*~SyrH;idkm5m1 z3)^KhKY+_VwKQT&aEjj;0LvaC#v*C{bejyA6E2eK*?KPGd^)1{BhVFyuORoDys~pk zQ#W0QYWJ8Of&poE@ui@1B>=u(+-8sNkyl*Kb|6#_2|yg+&ySqTNqZNaw54v_aHcn< ztJa5&jf%8mVq$8(^<yIp-y5D3V@$a3nLfPq;+XJu`)K(^{4t}C8-!yvOL?9F@J1<j zOI`tzA)haD=F;W)=%Mo{rBAUE6^k*Wkev7DFPo~m3TM521HUl)`S4d5B=^E^+3$q2 zcV6pJ(ofpcyI@fP&{);`SS`pp{I<ZBZ~Sk?r=sf#1Uc*kXLZWOT(Cwa5L>H##DS>T zJ~hO{GSO@`tQtah62;#0dOG%2Y%R-uPi+Y!7GDA4DNpKu&@|K|^8V@Z<Ae`xZYpCT z{zF%VultptIOGd0+dYJV7R_7d6C6a*R@M=v<6X8qM~mS*IZx%k=%kHjc82e+#CttT zq3&EB8dOvfWM5CCbujE%9@Aescbn{F_4jnsKG^iT7i$LLjFW8-H-^Pav{i4p7Ki#4 zCr<k5f~$=Ur?i<OFXC$mWwM@f<Q@(57_(vMViu9jADSQ9rE0Bsl!@Pm;>X{5<LpHw zrs<4av@80al`#rPydcT#kSPkz)}Pw;$hC0(DRp|vl1mdF$|Eh{8<1Kss~x~wkHLe6 zd5m#)vHji%z*OugL0t1?X*|k3KucBtzAn`aLdTJ{rbzqv((*&6x|_NOYFm&VDhNoD zz6`S{8>+=HDT;^&6WCTm+FZH2;tr9PY#9eg3^BL&2CHQuaCoppYOp_{wTxqA*_l~@ zM?*ND8!Ctusm>rCkSE;(B(A39xw^!Z0@xy$Rj>S~Boq?wX2k;GgV4Hk22Z=Zu@(gH zWr~mILR4GF0$}mNy=m@jLS$*~QviT^Y6ILGN4WI69!H;H7{>g(RE}$cmj0;t1GuR? z=1F^ntK0(baorL4HrtwZQ>^XRWyi5yn^otWYiV!LC(ad#d&IbgjoDhF_%7pL@`{ma z%~2^I1k0#M7DVzD|41j@U=vOg|8YvTV8ODA$#<d5g+r-7tKmEK<Wl+WpIc^=_t&42 zl%=i8v7wcTA%?{d&$$=Rk1+z}<_)6qZ8}%<-dfLlTgjDuOWTg<A1Afe#t{n^G0DkC zgM=gbT<Z;0S<RRNUhqj|sw=KJd#&sQQ>ac$IQswyHwQrgie|a`PV|PaaveO5kmCpL zbiX8a+XVrVSMB^mc8x6Jz%g!L!Lwm8%ern%+S|w!K)Af2zkF&hK>fn}M+V=R_H=;R z;8<uO)n>3YdA<s_<UonjKA&4+;Zv>k<aoS)5|srNP-iCw(EW|4J@oHvq>J@r^=K$7 zL%7W9rR?eLi>@s~+1cMA!%VeEg^)^AKUMEa0ui0)QnnW6D=l1?9=2d7US&X7(Np<~ z$<>jVRa1DLl~PuV<j*%P<B1q0!e#SoX`(v~<o&v^faf>`^5FPoHFugi#t4DW6mSPM zSRxyPEmV3jAecskD$)+P5qyF;2CxFOT@&Rot%c`zPhj|q>0aB!aYO-vXolVA(Q5L9 zW%4$X@JE6#dVU8iOQVNhHb1MC+Z>;k9LIn$O>5K>kiu3#tnKG~3|AK~TpfZK0%Yfx z^O{$Pv?2#d1OA<EvR*L7OaM3khHjB!b-?Z-wBDM5Y8CDJD8|PXI|Dd|M2-*cL>y;A zX~EY1S>oJafZ9F?0FcNxf+X-t5EvFiupuFH1t*{Yru>DL=cn(UUbWRpOc_PM*`Jm- z60~$=c<L6j@E-)5gM?+Ux*2&6?QE;()_VpWXU+`S9{DDhbkn731_g)R2T3$)-rHFG z*byfk%Ig6Hg|`fCLBx6de0wL|{(A9VNn)N7ah1{B)n9fie1H#^@yQo^bi7FP-Ho6} zQ=G;O<9jZ4$2E7kQMvd@U06szzm^wzrm!8ARJ!G3U*0t=9wbBk&1vXL8`bhbkDe_O zlX^<Z6yxeg6drr1m{V1t{rA#3bFQNx>9@rE(vnM4L)EqU?R2Ve(qodO@B5>NGeTg= zKM9k3J!a~oRr#KVrJ%k7F50BMr|!PQw~rNLsx&ij{bcyFiX!`x_AjJ*`K5@3i;}Cx zCXKvSz|AHd=emHNr(^o<Of+r<y<Jl12bYOpccw=l3%ZU9+$}e?Kg={B&gJEanJwuy zl@_ie#Ww2{i&!d@G&u=z``V{sv%yAsCg(MHT^!rzIG@ApP3AiKle3HFYlll}{Ux!? zT4Nz5I!cLEmWlK=k!lKh0kX7+#n`z}$?#ZPDm>wu76)0I!_Xw{@?$i>?iO}$-9a~) z3G1;6LMZLQBagJF<7(Cg200<nJIq)@zt#KQn4H}TKHHXLA=M2qQbeeUv3AuG^FIgR zE0Pt{0KK{TRPQ(|Yp{jTV6I@IBF^&$z9Ea6%Y<#0l61}Esi-;e1TjSkG5ty#c)PpB zJXvQ@RLiIz;4d&lGj%ZL;}yee0|7vj(O4JEa^VcYKNi`;TS$>DC6MeIjHTkm*~l9J ze-;pg2Eg!O6pUDp1jg|?0k*|FjPU$i`vHbac!-#OzQ8dulkf&b1H2G3j!9*o6@W)i zsFqKEcfNWaxdVLtBj+&oXpLc@H<@4miP2+K*Vv!aYmq8X`w+%I-gmKsPWwz-eTl0! zFy2zEgwMVz9sM^GBf#~`Q+RvPNP&aqF%-{XPRIp&7Y(>2N>bH$$$TG5ztP&qu42xw zn^-ZcYFZb6A;c@rS2TS4<v3kfeW;T6-Y-jjQ;t2TG67srCF{M2UZss4Y-u}QL|f&v zOBXh!-l1Rf*z?RR4y@_gI!xY62(XZRXr7m7jL{uD&8zAmc_Z%O;c)oSoQ{MCqB~f9 zTITlkUe4^-b)AO~B@A804&$~nt}Wtfmj6C^Kjolh;`F?+c{@YKy0<U2Y$iL(3&*Ca zV^7n~ey*S)uJE-Y?UyaVjm#EQg>lN(6^-V6PdoomyyjY4M@0uGGf7du(?PgnzDD(1 z&7s@8rH+Q8f}Hu)m$q2Zi6-LUl?0i}v(L)IFHa8>E&N{UDj>9vMB0xS4kx%BbS6|y zq)&;`;wVN*IyIA{V_B|T4I&=(uMkGTXQu!A*FP?@St*~+x(q9Ks@&JmiI1zt+v)po z?@aZCRZ59+k*PRfX6e{|2ViuJp*Cg(jHRcB{D5!*vZ0r^gt8Vihzrf|jxi!&Xp$~z z$1-nK#XgcdQN#U{pJcI`o!0A)C3@ef6vz>UH}$pi<5}~w{E+7^TVpzd7Fo)eIG$=` zb*Q(P9)DrTs7JW(k~4<;go3*J#iT%=6pnU+D1wP^NhQlj+16|J+en2$VP&m?$Ar#E z9zEB?7(xiazYhQeRMFlsc<49~NP~u-_R<9bzf9qIeH^ye$@nQ=u9iUV5U@S~1e2!H zo@UjYQd#?6dq;(FA9&*RkJ&$f2Z9GWi+6^L1@qTTI<qRCsvkZ$7c=}dXAgd@qS+I% z+|(8HyT+a^!MC*XzVlxn<BtjL;Tp~Bcf>4f)o>qZ#-rU4fN<b~Y5Lx(Ox+|H+$(d{ zNB8@q3-^_p$ESi5<?nqPc!IuOdm}k!g62C6T+i-r+VZ;>Q@G$_Zp80RcukYE{Wjq1 z62$#s!StQmKFG@7bvE05skmbHJ-<Myb)LC#f~}gyH&B$6QvY$!TF@|1`$FPxibxz! z==RHAvA6+<c{YJ5^Ii0(Ok8;6i{#qMtBSHw83&5ZpM{^?dla?E)L09hPHWxTZ{)oF zVS35&9ARa8;o+m`1WogfSczv?5t{i*rPqmnk3Yx7`MpV8IdLvrGo7M@sw;fIZQo|i z-H@@@Y}@&OTuHsrygg;to-<%<R9WXCa0gwaf7-xu_pU@64FdIoIF8K-IlRiY=IS<% z=gEx|P^^;)LHaQ2ZL?%g9ggY^O{*O?OJd&X9F+Ng;E{b_=b~cg*BUhGucb!R$ic|N z#uMiU%8*3@uO&rNXfg^K!vk)Ed?*17O_*CCfq+mm0fdd~2K0vU2bZV~089;J(ejbT zGYU`%u6Izckuv{R#qaBlt@{gtY!%|OmD94V^=cyuCyeY|+zEx?7uo^}J$s&!cqk0Q z^;;JGc3&)8C=s}f39ivoH>LkHmdRM&l*&4}CPAb+;7{WL9!4;BKPVAvA~j`9!=3Kk z7R@u(Pa-6OkbG({-BVBeHw9CRNE*!t2uL95023#bl9ND>JAKunR=@tF<~yOwOhjBn zM!EsfNj#NC$P84kCG<1k<L~<8kC~3p+%fLgKZHL*quf~YX`^QX=C*jE9&W$NPrVxI z6B%R05JkP*`XYSp>G<vOz#7AM;)a5E<BR3SBfJJprSY{8oLjb43nyQQk$nLx`>y!a zb)1qgAmp3+ueH~Yit9H>x8IAosk};49XowxqVbwp&;!pao3lIVMJFv1;(y)TG^k>I zhThh)54I><RN@ub`sdVxGII;a3+Xo-gKy`;&Y-Rbc(`N$kR{@hG*}uKYSx+PTO}*y zO}nCG5!Z}|cRt4gxD1R33;~1&3;{Q$t#tS04_!*sv(HXmfb^XBkcy7dnh8J3reMOF z?%`=0G5tRR<mx%gfz@29>74S~rm~-K_(QX>2<y%ob<>m9plyfB=zre@Sv=x%$wgQ0 zF?yUwu0=MsFUeLa9agEXq;nlvQ;EUwzYc*y`nrn!FuaA#mmACQlL2urc0Km4fW|*$ z1eE%XB)l=KfNf4<><0!rGG)r=?Rvt0F=Z%;l+d1YS8JQy&TW3Pu*4q{8w0(iq+7Ud z=<OSdYZLrUJeFvL1}1F4RRz9L;y?|-+VR|9?j0kf)mLKs8h+^cE{|*8_v5lIFlOOr z@sj>P)b*R$+j=~6_GM-g4>WCqRlbI>hMIGKFH|fq)+zHu<jI#>Bw9_Vy?23+2s;aq zGh!hMVdAX&x*uaVR-t)HSx17fM0ut5&-wcQv^dtY<j$E$JSArjJHc|0-c^E6-~6`% z<O|5U+{rIHm4*VT@&G`!QE>oaq7hbqNj$4KPN>}FQ3yYonmDJ&5A{k9KdXQC2HR;o z%|@cBc$mcpER$%s!tN52(Vc=FJ63){?%<WNl>I*#Q^l2#H<nh{{_Q^6uHF8kq<RFu ze+d5pEnPQH5zenw*8e9>Jd=Dme>g+iz-+JD``+Sokl<_7a&Tdc-n*w(Z(3Tr<-N=| z%L~L!qXw3*C7!VoNsIUJEX&~?a^Pw=Am`(oyXg}p79*W3h{925>h17WjRM<y><Tq< z^y1B@zlDsqU)bH`4|8ojB0iU-{&iWnX<7f8veNZOL%po4XLdC$t9}zy&^DYhdh@2{ zsM4FZa-#@7*ES)eiN7-SX2!^dM|8af=H>zA&EYU*cD&T=8qiL0>A+ZAQnN-13U6I& z*UI}_doTv8+J{z+nX#gyH8AhUUy%+Y^1R^3yUneslyrrn@~xrTUHF-R!zteX#TUQ- z4_{Ot;R`*Llgq;Yzm>D_f3`Kk{|8<q{rwvibMRZFqW{#R7(~p|7S)Fx4iRSN96eoC zXx(yDb@udo*}T!~A0r}xW;Rvxe!}zfSFV5AM@O^j*!DWZa*VFW23H8vA5>A!R}Pg7 z@BclM6z6h%%;m(P6)UKFLZQj;ZW*bF>glJKs%?W4Y<D~STrKG;JeotJJd06My!qSA z;`PL;62Vus+IAt?`_!Zu7*ju;!Io_yXIa}Hifazl&e9$+iFW6^g{yDX=MVen>=qnu zI6K^5<!M9dmFJ2n7M-MuC1W4jm)~8?JSH8jc@SuiZONt@RIof@;z_8leiO0$#JA@j zSX^tM`+M9$y`YJ-coyc}vTh^SLhpPQ`S7}%Je(MObEcSZS^p!xy9p+9iTCW?SIcF@ z3apa%l7<L33dXYRJjz0j)ZoQ-Ni2iL_~ycSPjc#TpF(6+;6Dfil1P&cBDg{zVzk7R zjY!m6)kq+gf{+A6^V9?=pHYoQ!=uur;li0f)xJI;9l3NHqs7BH1=^OT9seR2cd_eU zj6&EC@~IQ0KQuqa2HZ-0M$ER|IyEnBwJUdk<vA1Ry?tDz?atztm7VdRM=LFV8XqsV z2t0Dr5pPrE9k6-mXa<?$wNV6;o(|eX@I~~pX8JrqPC+RuaCo*S76|BUz5gU8;+d&y z|JRkHxyOfJR}s}k*&dN!YYIAY&wJl};j&EmJ8ojhaP$jy3$oS2*eq7vP;zoYNI#+{ zI*GolKQ`d)<=^`|Efp4}J9XDFCHweMYOq=1d?C%OnLY`>MIP$OsH#*E-0y914i+gm zcG|omsy#7zmc7lbrt-E9i$SYKj38>ZmQR}h5Sh+`KV7}XhV@Z4LJPj{$X;p=lX{QW zx{|VY<;hvY-Kf5L>VZR9`K6n;PIT<)1ji_mK0z|}M7PNeJrRzjRMTJM7AHzV?9AP= z4c2#lzqlv;8rLJ6x9xfScn%tI7}oQL!E@v5psTIVf5SEL#whT&Gkx2pkCqVgOuY>e z`Z8tA!7}^H<0dB&k3`!Q=eMD^uKFaA9z;s0CY(+Qy~euw?C;5;!~<l7{fnnBbzR%e zPB{i2zi8ff((V3>#Tj)?aba(C4MzE+Ds!V))h<KbsPu}x1C6`D`eJdb=-Ai4c^ZM2 zirl2tK!jZGfi1_NNB8!Eb1#~7YA(rm`^OMV@<CVEyfc!!_2QabPQR3Mb1qPy4d*mS zI7X@b9!rB9JH%Jnm?!@^s(jO@y;eb<p4JyX=JwHfs@3B`Md9Tez#K}|7+E=N<52!Z zYb)=S^KvJAoZGUGvC9*<WN~)S0P4vjB{$~;qB-mh>l2XW3rr_t3C4|YCfwyx6`vsD zp+F-@L14T7Ey0ZypQh{fq*z7=$C&CQ4b7-B6cOew;9J=a7S*8y>hq|Xu4t9K_a__& zy#As2r}&oaW`KKVGjGJtya;@Q;KFc{?E`~T=YBp~uq*j}Av&)j>K|Ov?$o$CJH>Fk zPkE_;IewJ(yn<}IR<uGEc5kZ%=&)ZNcPipM`~R`|nAFPowv%h$R$oPTefphen0@KK z?TW0-y-)${k&?)j_u7_EsmDgBgR_f_hf)|zBW?~pcRXi)rfFgS1+m7!-?dVsx--t0 zmv&m!c702ztq<1phj44?)E4tznwI-~=Cao7JLUiMkGOzrhg?8hy$Gudr`KG;t3#xx z+A$o>7oDq(;deTYea}UgTx_}O`D&?vw5$K<w|Q4W_NQGm*3pSoFWEv*hzvY=UNP!t zM5RDRWUjw;5xFyM+xM7AlCnejw(kRRb>9m&R2TGmx_zJDJ4yMD5<G}$`XrQ#<y((R zizIp(q=kfY>~fZf(06A|@4v2G8?;~f==Ent!^}!RYG2~%^&z=OX#VP0?;ozoF!D3~ zKKZCq&uhjPZ>X;U`73Zz{64qDEQBeL64kM(vB*ZtpqM$`uJL>g*(Wc8!{7DV&uz}_ zr39G%*s%EuVk~GMl22^D(+V{i4^2dcx*u$>i_gvBb>fRjbO(Sd&p$cGeiYp<lEl?z zHaKU8_qJ(K1<W5f0$;QCqSrjE_RHIj8!C4PyxN-W=LAvH<JU&}m`<zip#6U_PmCs5 zJS+C``EO)f*b@VRyE%t6<G<EwzkkJIw$x7sO`yH^Y+js|J^*p?fB5$11bCuS?Rlyy zZRlZpI=0lWD(3z97PANZ2ddv)9Dg?+Jo9a-DNn+kcz=cs3DA0*FxhDJJ#i{f19re# z4s!u4I9v?R%Zbh_3=ptnuJMiU5V!!3#pbq(YZ>jjX#`Pp&c#dF0&rEX)Z;r}d#b<f zR&Ox>)F40HI3S_<Jfut|UM+jq>5WboU{W!{AQq{JMj<J|&(4CnLBz$$-^gJ4O~}!$ zSomFcLqoP8>B%+e?Uq*+@R&b$QU?<^>X%`2SN^+H>_R%*_)rEK8QPscz<66oGYnO$ zaZHhrQ#x?q89%}iEH%{i3#X4!wbw-65?~!#BeK!!$x3wue_P==!dKgcFvtU))p+Tw zq4ikXl#a6>MxzE-new-Y|Gi1RBK=crOPCBewoOA?{Sbq4?ztxRn$h47V`9z*9Cx&P zc<RC0>zLpV&o0!xbj}zx=vbd*`F+qgD_C*(K!~`Mzwvz!kivgsVeah3KvYRb{nZCe zk6&w0?~{|hTbse6n>;QnIyPR^{lwSP`DhxwbAGjd7T_R*yRhnF{xQ3Ac16%2AQk&3 zsamj{J*&j-Op<D_uZbq8zYwX~KQ^nRYd8GexpgkV{6@fF&JFKn8QlEc(gdn~#v27% z6gNdaPe$?FNjvYh&gz)~t43bT_@RTBVmv<-)Teci*W%ylNoOyCmUWx<ue@WFnT1#L zyfY2cK{mzR3nQ1``}f64Wm>dmp_9*J?sPYr=gonTCr_>C)5NXgdK%wcr0I3@4=5+? zr<g?V=r+1~FO7%3vSWVfo>NfOyWLZN(I;f{*FCCa8_Rnp|2W1^=$;Z2XPDA8s!M%* zd02nSaCkPIWm2J*b|qfvAm4h@zZxNR<2ow@S-$jI?r|4Aat8|F^tQ<USGskNGtWOS z5kIs)OE*Kn?0&4yv{L|6Dcq;#gvf7cP=E}t@+%nw$Z?>(ihPD%$=DK1mD|3-aHBr4 z7MGl9c=PhVX<cI%Wt3BU*5}V(3DU6$6ZowruHoIyV$x-LZC@N^CAcj+JuXish<?0+ z1Ole+1WX}{|EPueoO$u%nTj1wSo`sprtr%eev=3Pv=NljtQLn~`4{*MUv$28yW}Z7 zKZYxMr*>%lRqd_q|3}nWzeN?UZF_(LhMs|;Yv@M0V;F`8rMtU3Bt*KqBt*Kqk&<qZ z1`$yj0Rd@2;bZUbJ&wJ8SbxHL)^pz1eO{TXmfTOH#GgIpEq4$xq?_h@xvF_u0AY7| z&cx`Wrv+4@ZQJDiJaz07+Apbc)?Tj8g(-5YFLgS9)!C<c3k<GPPMn|4bq113zZUqb zoHIzE=h7@!_mEPn!8H4jt<fE{G4*NgS|E0z=h#QX(QQ{Z{^hFJ4+i}k^+IfcxEnl% z*!p9-VExk17hZt@S%!PLXaA6yn-a&htH~MLVwvaNF;eANeo3s`)$QtTUPj2CDrp~O z@A%U_&ge-kYL7QF`6Nay2^vMcy3~ncL$0h>@&R=nTvEIL;9th7i#ruaFQ)H<TVmzs z1f{f7HzfS}{~VCKtvz^=obz_Y&{p$HeEFw4E6*iy!P#q0<uvWqtF_7*D|YhYSL0S> z<5O}DZ}Iq)XBx6E_>21B$|=4ob5pQb)PII}t=9Fk*4$m{1i1P+BH|*3wJh?;{-O^2 z1ts!<;MWKc51u>#uOoT#s^@B)0D{wG8emtI5>U8^y)+VjVp{cTkf&&m-AQB?zR->q zxfCbnOd&v3Q$REShl{yucp;MXWFYa`s<isj`Y`z7WkFW64xLE^jMfx&zK4B)^P>?I zy%VKBwa$UVLQw4+FR=SDj|jQO92igkiCO(V3!++$$YBET=v#wE<Z6Uf0C<2?z`Dpq z^dP1b`PH8f&M+%MUL#i$uPzqKh>_tcmtS+V*VTX6Fvss0_sM$`E_XPpSL%sU(<N2K z#O&6Kewk~U!0iadfXY+$8lG&_uy+ge{l3^SiW1q3D1fW)XN+<xbYm9B-LkX3@E58~ zx5n61i=+<ExhsYE8eQ~4Y_59657XPM&BNZAM2_)UZrasANWmNiE!iJJM(CyI{ORHQ zckgt|$EWw>+X^{!i9T&JmB13#db&KRE?Da9;z-(tMWk_%eaMUe;;*00s<?lkd4}N9 z$fI9`bMRYyOo<(inLC*(ry>6B9c}=8GC#C00hdqw5HXhYMI1(1)Z~gm>WDr>Y;=!J zmvku$$32q?KYbMk{W6kdMWt=)KqlgR#(y@##lE$reX}l79jvx`7?#uuHybFD7dLqY z_)gi{#;;|fXTQ_G#3Kv@%j|XSHzu`qDG#X7whNe4t%4);-7a&#lJZ8-1iA$Jrp{hW zdcOLiSgW3++!Jwi(7J98+}i%6FDX_3ahaig=lGi$276g_m%R4QyVVkq+lH|f8-iTo z>iSnnS`tjv|ElR{idwv};z}Zr31wZD{1;?>t0;W>uiJ%{{luTFo2tLmxkv541Rj$5 z@WO!Xt`{#(U6=a@5001lLJyCAU^Hv6?(B-(`wtKQW60s#8)xg-s>^w&RCa!dGw5{{ zJ*sy<NcPra!IEiCeWR{B`{|DelgVnJN8hivWn!ZVZ(qTyHp2@}&JI4d9#h%X@OcF@ zSZC!|Qz;uKZ}Fe3&nL&Qa9r{n(Glsu)jcF)RIXWiYw>;{6|B)s?bf8^S`AL{8xWxN zNDR_YXBnFC2o;O8wBXaZv-#BQ_&6NN5Nw(|t8J>5?29ssrrf`BZ$n#y7v7<c5_s^t zzMyw*P^_s;I-8NSxN%4pnascZ?Q_cWoxFv*mswQb-u>{Du;~lwa}I(OQ7g1G&C2w3 zT*G;yz6iksfOj)uR!sfbj35!)>Gj#JbS-#}zQhkcevIZtE(~0)hf|#XnQe9WBpXpd zDkF%F{d%CMKGes-X551VaUa6Bc&zz)Ad50jLhTLKJ;W4Cpe{k^0>$SJJ$cwlM39;y zQ}d~tB(vVlCia5Luw?y&Ix#qKTql3f$K$o}ak*n*wr>F6-O~y(b4x~%fO-;HYLW~b zphzn1?dYvqX76ULJ2JI8BRhz3oLNpDc%iE;7U<h1g$!iu&eh$Mx9PaQ-^~lHx35_d z^IIOZRNHmJ5--+REr@qr2~AQo>{jr6V^VMy=JaO&6RE_(<;N9@$=6H*1vFG+ymB1H zG{2q?Fax6+H5c(7X+k93iO{+$23=Y)M>0`;moHyRO@Umy;k-}2+{S#wURZd-GATte zvp_w%1?k)f>!k$MDjWazoymYcr(fCbp>LG96m;U+#8{45En>(pB)x?eG)P6)?*`Gf z*GW#l26*+w`qW_|z=cdRg}6ohe)ulc=J}+T<DrP>#D?(xK`;@oc5{ovG$ls$?$5@3 zbZxB6U*4#Y3=hFo(N{+#JpV@#NZA1Yd1AEzfXZiz;F)hk2`zYf3Va3!{|!MrM<M>3 zi2yzB>x$_ZM_SA#<0ijeqfl8a)h}zHatO<cZ$DXYV#fDz$)jN{UM--pK=iasN}84k zH`%Kmuj~OeBb5W$Gk37{8WiI`1iDJ5y~`j#`<M1|Mnxsxbl8qq&Umx9WQr#`@M}uz zNUT^_v#Y1B(DC~YN$t$pWO%D~WAz7a2PTbHw{Lo;(s!{;OQ=d^*@<@A(Q$EaTtrC2 zX%w*-0l}=$Q<Cm%Z}RNK7vU3T&k?Bk{tK;^29KD%`=wYgXmrN=O$)uW^u*DCeyh&g z>`0fo{*1UtO=aOmWj10Ah=mcO{v!IbQSw=(mGY&#FVcJZ<B5Yl|I6BM<&i=VUiEL} z82Et$t>=}!Yh%9h{z?Us%PL)kU5|<E#{G0ukz1%6Dk?LlhpT<0zkk0_4aAV}%!rB| zZ9kkLC&H-h^H)PL0fsQ-9Azfuil!G^Z|@+oq6aDp!zhLRWxFf#!P)(rg@v@qjQZQs zEgq+A5Ade9Ho^t$&gUM-3LE6v6>CIN*yG$*i@8ZNK4rgOkAE3glBdm%eAh+T7M{sq zBIsLOEm!7rrpKW{VYl@A@4JfYNn1mAVMF@oReiH24z&!-&vFTST@a2|EpeJxoNf=x z0Z~d<pLgj$HE@jjkGA`=8mlPOfAh89TV_&ThmNrYB;H3Y+h!~N1A!MDMV*~Wb@klp zsMwWhmUf*WDpX&6UDT%wan@14b(b%Gjy@2v-{cUnh{hY3`+gAo@KjUcY^BjYI=wGi z{zjHr=o?MJUNEWyyK2n2MEMQ-6(7FOR-_hOd(SJcBoMn!84oLb!B%)|kvO+9om6$g zzxlvxFFQ@}N=rG`^|!5KtfKQMcEh`BBwaP#LSFdaFbIvMO`%bPhNywyWTALEuIe{B zAbQU3-?~@-#9Hl);i&IjE_-&gR1>TwQNpK|gOn6j&RFB7((fkzwsP!fAOsBTS!NA( zs_4AdkjG~jOpT6<d}0jqqYtN=VzQa(wcvzL{xEDvG0CgvbiGf6QFuJM6^X{rZbLxh z`Hf0Ky?)<k&j4;(X_QYWn;_NSR9^?N^}88`{E{4OB>+wYF38b%dWV&Tj4ktsbx$*k z4DpPbCt$-62e*m#fzUL5M<#7UCTp3u`Ez=41YZoU|0UHt9xpTPSr-F;_{4>2Oik|C zz&hJIl-R&w>`oUAsCuL8QF!aFeHWI1Yeq{^{+)pa6UOLA8rK{CUDCX#tC^o%kgKJ= zQ~I7T+_7hMf8=<ICv#;3q)1B$V^bN`s<H!|5FvU>``0Sg6Bx0uWB*F4m^8;EOJJ_u zD&3%=qSix=jvraXzeY*-8BS^!i?zN~1J_B08Ma((Xl}*U1Z7cD3qXb}>&?G?>mG|z z2uiVjC>DF^tfaZwxe(Ur^q!0E&%NQyo_VD3nzC`6+ME0x<;X>Yqx&EAXI{6}l$%L# zoHu(ST$mKZ*B0H=mkxmohSlsHsq7`j4_>`u0lOcaEF<p=7uDTrt}VsG)ZId_OVsM} zXsBFjMvH3}%bSre=57Lyzowq5<uLHO>ofjTm}#^v8flGYHoKm6sQcrov!~Yga7v+v z8J9glD!%2-0XjN`E`-lWHn51GElpPcnQK~f2u?`!?FVc655Rim5wXnuYbB>EO$fPf zowRlrB0PFd6Xwi(O7!BFVGRjvhZdzcWw|Rj*sdw0p}lw0(;SlTu0@s_x>1_gQx+n& z1@J!_a6;N$JDeNDBo0fI8t#yC;xV>B=#INCI*cjvVCF0R=H=(HBC2Mg{;pAh7Ysn{ zaYsiymXmDnq%bb_q9dYZJ%pR6q8;g5e96<pZ1MNLd1)$9;yapLe1A%fzD`=QG?N;% z3|YotP?7CemcQzXka8nMS0sm__1!I=W<9stp|$AjH<o!_Y$a5WSKBj*us)WqAMo%0 zo2{N<@SDYNuN}S9xoLV`sflCYCv3xZ%4|z+_4^W$UZ5VTgQ851)6FR(3|40IL0Q?i zba@?NLkIx8E3TJ5Fpj?ql1$pse87rZeTFV~YwO3sYcG6xO>X<9F}*~6iAs*0alB{y z6>e-;b#T^2`c{^;l`U)pc2@EX6Eji|?28*Y6f7J5gb~9k^fKM@vh$rbeq}dksH4)M z4R?EkM%*!{YURcvEt@vfDFXHdl44^wiU7&_=d2&4p?S1U)X}M1FW&LVGukpK#ba@I z`(Bd%`o?iEyAbgHM;rDOtFM`^rFeNv;_`}siqG{SDUF{e>HC>3d6cRNxQG8i*os^Y zu5@%>wS)cf>cd;E$0EVce*F3k_9V*ztw};^j5Wk9{8fCJm|GsMetVHPvMa%rodQh( zb8=T$d0NAcC!oHkMnlQfm^tgfJPmodzwbFTr(Qi8&Rb&PuSVQ%a2b8YO=8tExz$+M zl{c$1k$(lz9`CSCt;*)ye%Sd40w4RRpN=UOjrF}l-q538HnCa1dPi5EjT-#LJs?XB zI!;^++$|sSk$jrLihn`<iNid;C@+J0Y@KjiI>wlkedUUqY3W4c;<hGNK%d_-e+St3 z>xCbO2QqdJ8fhCObtUJx?rRR|5MuFN50y1(yPW#|`MgAgR|j>TT5Rlx-A(N^gKpw$ zN3$OMBnieB{`%cFCzhoBR!0T_t4p0HntkTi1&WT~4_)}@4cqFP=WMgQFPL(dZE!eq zNLVCAd@y?sc-e8<-!E%&xodiv+JdVpcdN#X7(;_HK49XO6eW1iDxbJjK>;*(=@;)E zcz^NrdlHfzi`wO><8hMEl6&4vy2ekP8VOp_BI=yqUP?O0MN@N(eU74ISeNmgmV#FT zWEmA*7i4mibmJV+v_mxGGQao&BN9(e!=Ar@VoFBW4NEN}7JM8)KdZ8geVD!TUzfCD zCNtCY4_r>CoNl)FpN_>oO&e@zh`5uRHvXQZs6IbviHlEgqOgPRQ}QInMm#AQrfY6; z+CkHiUq0>@J8a^8QP-w0e@dt@tdg7IZQ1Sb`1hnq(-^F^7;?|=5^?e+YRIG)YYU+s z?=jH<X+D_$^4`7soX0Jl_*neMm&oZj3;K<1!IPY_di3r+8sC4?rElh4^YLHpx}4uP zDq4S!Zuq8Pue<)m?5FP=tLw|QRf{Rz7X++9cw9SF8?=2i8%{$*z2ZkCTW2E&uAB8E zFA82P6-dl&-l-m|J$Cz>5b3f9=#78Uo@DUwI;6HUsz&=wsPXoLZl>Wnc`&jTx6Rps zm*m%M5A&*aMwfC*?Tvm#iKUa<WJ17uYTH{>H${wNl_>9E56a2-e8`T+(D`agd+n|D zP$Rw{os6wH^yS+%r%AcaaYUmU8-tI=l#SYe+w(4-W^s&pYRWy1l!rKO=czQLOd~SJ zdxPE9(Kljm)PCZ4n?8rpDBwzpQu&Fn#P4Ild+pCpCjTDsvR;um*ars8ws;o2ybd;r zF|<3&vhRlegUrgD)K!*d{6YS>6EBx_*ib;9jr|zm&*ebjtJ`Ckk~J<PNnBRP1YRV` zt+3NT%}1l5ccwA^kn=5Y0fVBjrpgly8o5*?h$H+%G>*wTzJ#R}t>5Q3%}6!dVbo&D zb_AP#?S6uZc@5Bar*cmfm-8-EYn&azy7TcpS5XJA^>yVC(<*VXU3H1NZPFY;<>Tyw zn67ScQuch(EBZ;<qr+yfl3qO?$I3U@nc-Ff3ob5qHu+afwIDbqvpA;iPq>CEsb)M& z+G#kWGt`J37ZGKh1_V^Ton@@ITcNy7KUDY|XvU$}Ba(8=vHDs`!w&=J!RSZtW8Mq* z0!i!zzjZz(8v8^uEA#YfZU=&Ys~J!8_bJvmuP$uYe-ozsY^aO?6=r!(F-0a?35qbg zkn%aQ8shUuaT6%mvOjH?%_Ynh6|FMw1vY26xHs9O((w^nfu@CInR3X2c6nuMG>&+% z;^PSUL~#8V-I+q0Io?>wSxY=k?$B2c+Tvs8q)MyN2^8F!wVsn45&K=uVO#8m(i%I4 zw!U;^6=eBg^dYCRZIy-nQ+`SteJ=g-WPRx6qbaY8#EwT83;u2qwS#bl$-l87S_!g_ zPlDk?6+R_>xD3zjeq}gX!x;+e)a)tiD{+rL5!ZtD&%HU1=q+3%9_~^UV1>+%z4~vx z1DpqUJCkR%=B8d|JziGT@vn8QSDxzVOF#E8fH6Kxd~V+EbJBg6=&;~4?B$Wf=qS9j zwt8C|?SRMB%N}1OoZVx<=QSNi;7}Jx)!`II$UVAfQZ+K=mC=xJ&|<vx#>R(?y9v{h zA&RmR^~*mCH|aqivAQ--|JhHwm6SWPf5@9MM7KxZxJ4Mu-IsmMrU?`b;Iy2p+DJ}) z>0!Jk8hjj+!ykd9CQ-5dOpSAiwpE34+oL_=*zJ-qqigZbtM6EA-wHN8A-5r`gG#0P z%d1#k>9`*a9omZH7?DUdAyoF)Fq32JjWNX_3$XivrCC>CvSr~`fVdEqC>SKLpBqGO z)#Nh{&x4i+OazJV6iw($BloKAR^1u|kEn1Wg^nXtkW^I5`Yp7+S6_3!WZq1IU54qS ze`%62%4=d`9?GJtyusla!tquVI}yTTT~f?gD3V1Yr_^F%+zD&}fUCRP*tj-|z$z`X zO29!FVNf@=DKiaWmWl&YeOmIEY0WD>DWGlqXZ^M<jD36qsrC2GZ;u|iWemVRA>Tx` zS&N9aG2h$NwS=fN)Rufm=6uwq#DVOiC8ZxXmDJGb&s9`k{-x~Wi6{Mg==sTsM8IMX z;%2k_FpYOdPy0Di6T#wm$PbgHGwdk`e{cO2Q|Q@U5LE4~Z01^awEqaDu2(O->fV*W zjFv0PfrQ{*e+jQe7^Kq1VKOikoHu`QHl%a<C?xY30XX4F_F9eKdnkT%`^7HrBY!L@ zrfa4!M;&b4)*#W>+xf|npk8`#%4dZw;xzL|jd%ccFstFWRkpLz0RGmuTFd>PRSfP^ z@fD&$CWvAy2h7IC(In2X;YB5lPZ}G_dxdYB|LA=iZFcalPi{o#VjhbVTpE#RQN`lJ z+$Q3xSFb7e`i->;eix?3*Je!r6mgp2*!*rR*F>aA>{fe?KDu&Ve_=j2K0s>GbG>_P z{LL~Q+;N|LEH3u<Mvw7nI$cPbf!2)Yx|r{Z?jf&AMk;_wR++m_m6%CrxLam2C};m7 z<r}_&u}%FeKLPzQwVzOs=NFP$bi|SJKQy5OZpvCG^vmp*NP>50rY&6P{Ti&lV-g;c zMlO^?4-kJ!sv7FP_2XwayWwoo;J1z^)q1eK59e{Zg3NUq7k4}!%OKIfDS}+sPCMe| zL1}_xf<;k%3MeGE3_t6#T@Y^OP3%;TZzqCyxv{kR?=s_-rwJsQh^xbic`H)fMmAOU zC~Q4mYe#OD;Etj3e=FJnSW;)p(T(TR73(Qre_&W0dK!SY=!cMNI`<dW1Fq+QC8!7R zq+gi=9&;$G5$`tJ%+qHeT!!N-%%_v8r~q37ybJ+HyZCaW#fu#1PriYtjwZcr1InyP zM$Mv@gl}xW>`YcaJQ;WQ)ikaLh|u@29I(^b`FL(VaRC=+T)vOrNlRbdduplYIb*-a zJo!2)_mCT|vp^`xG2}#t9kszaT@GHW2%1=}+h=m}oGNE3Fa20H(Q1h8$Z3=P@cE1& z`30rf(dGZA834Zj(Tu8RnsJbcaZCDC=a~PTiOBeGUuojgQ-g=2qob?4PUTkm*oscl zSKvyzQ6ARU3*)L#F>V*a3wCt87hII+S<&6Lwz+uM&20D)uG1qAjW|%VRaS2hQLhrn zkH>TZ-+AS^9b(%G<zkY9>gjUK%RzK1ccEbZ@za{Z{zYLl&w$ru*U#_VAQiQX#0$f) z{y3}a{)*+qx-^LFtE2g;*z!=b_7`7*39DvSZfU)}{jZz+PZym2YHXaK*}uwQGdpe2 zyZ%(!#=b4~GOqn}e1N4cp80Drf%mV;Em72iS35yIH#9sSB&W+qJ9pZPo~Yv*v#lz; zsN8w=UgU5V&U^3`^B6gz7O<JQIx(klZ)&>lk?6)>MbyFzmOL|yH}0l`9PJ&b;mN;^ zrK2<HPjT?Hy7~rO>5Dx-phH~F^KyOB?X_Xari$I}^~T4R{)R{^qh98-p|cm8&mCLs zG1J$ANv;W;^fV92h3va{UGZ*jL}hjDABU?)G2$GsD#Odc(_#(sEg9aM{oJ`9<B!B? zDKf(J65vCZT7S1gNT^1O2`|>3e>sOpfs)BvqATWv^Mvwe8zvY*x`|DHSDm?hLf_6? zpu^A@0lRqD-BzZB=XrAFU1H4eA<0kvloMQ@5C<J>DYB$Nu`Mh^f0NvHQYWTIir%aJ zY&274Qa@>#5o#mXwB1u(_m7JIx_bQ0Rx1{5_F5jF^2V-93FrCbhgwR@_Z&71Y@!Jp z{y0xW{~$pxMUPB>_s6<*?hNbqmyPev85w9@H4lF+a}}t%f@}F7j$3*!@8Z}0TGiEx z-wc>&&{jFDx96{4N_^gJ%-VU?qZed0xiyl$obC(pvV^^PLs@^b8u0JtIP0y)YTc@l zoSBd-U4n=e1!U4(sqv%t-k`tpqPv5dkWP`VH)E<jVXX47V)vYJZ+f*SFNB(!jx$U{ z$_*1yOH=n;TEvJtG`fyX*~JYZ^Hp+Qu>VOAluQuVEst;F;^M^rvwG%()8?_9{0H`5 z<;M#&TO#;H;d^&XZ}98>8COi9$0iD6*#0(mxaQgwZK}Fo^r~#T(rv45vnbJpI`<Mf zM;M;@WMt*Po4*4?;jBMcR*}A8`Kz5THN=hdtTM*rswlXM{E#}UNGnE-r9yVHrKnmN zyH-rpW!Dad+}oiG<M%EgLjA)B3y;a4A(a%f<AWW_3gX5?4MItGQ-2}r7r*VlzE0t5 z`C@Z2EtP&|#kCmI_ANWym?8KZm!{|-|8OmdWXVBgI~gHKAufr&`2&c@B2;Y-MVXtX zeVp)%WVR9jP{iMxWSln<=B_~Z7Y8U9bp5Yk_{#Ae$K9cWAlkT#dLI6JZ88JR-FX2V zp_WqC2<IY!1|4o*quj%?lnc*4L)}*<@^2;ogb`eMd8yGg{p8(>!>KDEkX2%R%+Ad* zb%XT|S#EAn+Ly2X)vX2kb?JLrn+P>J54J;=$jTW)X$7sX<}ycAdF|-r5AUtlQ&oiH z+lqlL6YLtNW5@g2S|EbjGvq%2rN#GIXo<e_zwh(E2YpoI@3x7vKt=uGKQ<kG|I8Jt z_pW&Ccjg#b{iQsZnRMyf-QHx6Yj-j%x(hyOKB|u{k}vdhsJryKDrm4FoSA>w<w_^U zaee)wM@ry(t(F~*b$f<tvz3ngZe@X@)E7ui8<*Iia`U0C(RbPtv$xUt*6;xt;e!Jg za`J>Ee@02nBG@VJ*G9`Ytm_^-k8-kva=Jq(p3Y!%j-r8|0AYc(vitPFVp{j*d6LpC zC+jb3X1AB3Pw^t22|}iOSMHG8A4=W~F+C2p*T!jSVSObk5ItUxotLF7-t=v{;Zdn- z<C7mBx)h6wo1F)xn;qH5wK150)EeytpAy3pzE*E^ifon<+W?(Ly1?94IP-=F(=Jr@ z^ido&%=ydR2Sk<TF2cRkA>-l`j-B#*bbPU3x{$E!FSazm)~MFaOa>!C3FL80Wy<u# z5=>Cn1ZS#2QX!oE-H7u-*@X>WmLfg<0z&T0iQ^nPqAv4I09G%1SeX2LJ-GCY{@Im6 z+{!Vu^LYyI;!R<$qIq!TL}n(r7VXsGP4}keG`CQIo!3_ZZ}KyYWbdPAF(xAnh=HX& zz&S83EVFN{yo8?7n6K6daaBa<<S4<y9*9lTup>28yM0LyTe#Z@9j6L^Q7uvbU@cl4 zCOkS%HnGQ>x2CH4<|1c?Eq9h#=fvU{2=!N)df`k<o6B>PVULG*&(pkc<tu}Nk4~DL z5RVx9U>grt!Zmq%DLCX*OjPv5bT#o}d*DPc@?M2wpD0t}Q|g-3QfbghFU=U=N+Gk? z%f|hhQ1AJ|zk}tqawyXv0%^vs^<@%Oa9zgx*FT`p6g!l7S$K8*M_ddr5;fK^dFSSo zA+Cb7ICq~%@RY+M5qiKaWHn+4X320dr8Vz$`!=AVQb209#Br-a_Q5DV_%o6tjn-H6 z^oN#f$6Hpn*n=mQ`ecp?>43?PY7hqd<!ew`eCO(`!r>IPp^L^cZZS-*j-_fWgB=gT z;;&m5`}dMzzGNQRd+TbgmAn;#hn)(20@+Lf?zwvc#$6W7>80|;J0GKIW{^sFtVA$( zmE@AHroiVJ3;z~2M4?Ot+q<LnbY2PBLBgt~{W-py*X7`%SQZ>M(Mcd~%=khB`z3QE zPAL<y92<-fJIeDbg{TZ^ZdlcuwGpTXxTBJI23sJVo9JW0x;7W*&xCwD3eQ|Z?L!_{ zNM&fP1(*)bUg2EgJgi<lsW>&49RZDDn~vsz5i;O0EF<jWLPFrv&<0&IX{K$~P!e9& zOk8`Yhst*Ac*r!20<4ZqhjH=bNIHeoLx)0&+joB0^F{E94+3@x)Dttw3)N|Uve_)9 zBr$pba(mh36?Z|-0gX0*;JZs_3@;aLtdU>H!W9nHTNH|HT1dn439GHy<qNBKO{c@& z(SHUGk7elj#!AwgZ)4Oe@kGwWDo1BgJx!$B<dJ^Nt;C|m;TB{)z(NZ1+H5jFnUV7$ zNR>@amu$^a1>djA(VQ9ONQ8HTB>Ju|q+wFeXKXR+okf28WhHvWJOr^*!j*rmG%@Jf zEI;rrs3;M6>K1Sl{8MIOW6N=vAvwqLiBMY9$_%UP`YZZba%>PWxh9<~Zn63>!#@wB zKl{u~rlafoQqvbg+PxRXO5qxsf*oh&;I1Xo&iaqvGZ&&v^?K6ieOENo-wfD&^|@?x zcRVloBfo>c24@?XLtZZl7}>5Wu`aM)50J%j&|$^%oRfi*!Kge{J0YjCFBd)^v!xy0 zE#C<HjxY<>A9XR;inAwqKWS6HCB4n?x0MVFF6;a!KPj&xIecNjrfa*y8|FyX<>dW~ z84X{FDM*5aLJ!I4NPn2ZsJLC&ns1bv>bZDRl+pc?kR-ah3Ul(Bm*03e&Xb77NglaT zr1)-G4Z0v;(~XPYthlU3NJJ!P4)YumX{fOm#2TR*r2s=%wX`xK=>eQEKr#jeSu5;> zplN|fWh_tcFo7^edSuKsYc*v^20BJ+%c&!FMg)a73Ng}v0zJDZOIZ*dh_w$>mQe<W zmq5#PtFZAIWTsOo>CqA3U2ID>I+UbgcnY8mFzo`&WMH(nw#0~msVtDqJ-b4R<@7PS znD7!|0QJh8*f1g+bVTe+X1P@5{xw2N%6@QhcB{L396JgYiZ=<6@vRB3KC#Vd;j9MX zvnqs!p>RZ0EoKo_9bkz{;j%kt?$Y)EUmQk}36YBGvk&|5;e(VAp#3)7Hnb%$6vfwK z?jx3@u#n=R&OmT8u|nTX(4N`K;n4BzxTO3ZEkW?n)7V4p*SCI$g4^TMM*{)8pJk70 z!8%=3kd~yFu0Yj5f(IebPdK!si0KO1LQXg~?{CE%Uu#|ca?NM!BMB;#v#SBPJp!|g zB8*(|@hs!TBBIRRp`fmyCQ9lIw%6+ZQ?7)H1kbU|cP*=RwuVsf{OF+A*$USqF9m1E z$SAh$DSU-WZ4x@vCU1FsA`AQ%DTG@sYm}i#kWhz0G|w_AOC}9kk;q)#LL)LXyS=Dv zfzW3JNi0vS5ghG(Vj9}mw$ij8?6d11|C6-<r*Ziq7hii<8^^oo!5ae)38@Yl)DFwk zQM<yE192dX5nN~Yga3f8Q7>3<ANu|#7NjFGW4ljHx~-P4A!v4n(W9V;fMuPV9$IO` zWu@f2c2i@{D-q~-f!cAgeqUIgU|gF&b!ydz#>j*%RM{cHOTRriKig2wfO3dhlYO+I zaA|mD@yJK+V)3^4BV8TC4R!SC@+Efq*Iqx0uwNz1Q~5B|3AtB_+0kPNFMyal#`SxR z{eUr|3?`UFgdspc2w&_p0569e$u^H6`&^6SQ0LWMg`4`hKMWgH6Q_dnHIk$W6~V)1 zBc=kcLb4275-Re*08NERP+=wn89M-iCFnm395O64C$rf*gy@)?*9%9?@pvY8mnaO> zAcACJW!3C5C`H_Y*e<eNfOLuqZyQ1&ScY}IJ|+qPrSOL<qQSM0Sa<*>JoIPX84nl; zoRb@|Z$s#rhX9y~flxZ+8X}hqz_!q86o80s&R=v)GzXHkvT`^pQ7aFMm=ih0)CDp& zW{#ru7sIU7=?dP_q2lpE?f9xt0VsHQta63PzoYjtdM`H%S%&*avG9<9lRY^9)TnHj zT)_!bw}_^-_pOwjf_1<z21!0x9cW}?jrG0ENByXVzBg6!MjZw14%7mFFC^x;F3!Z- zs~Q4J?4y@PnqF?h-(6*grY2yh^3K`-XXp%VTMFSn*Li#f+eQP%l~bmhM?|}!V#Y=% zD9|J4w8W;A80=_!+hz*Z$+LOG&~Xp!1^uE(#^~QGNlRV<-V+q`fj1TH>o&*x$`K#f z6}aW)%ZxBgY_v_Hs^e3**$W~mEJI?r;TNg7i{f&XKKPmkPzoG6`SJyDKZU47oa5_O z)lZm=7|WFh7<6(UQ!9PHRrBe(UcOJ|@T!n<tc7fWu!6ojhvmI*+R3!@s(aoqw%{0q z00XL@U{0BOM2?t-R&mB7#-}-_h?nBH$|%aJWj`r+R@6MxV%PP5qL$;1Py`=YR1yRD zQDDl&EL8XXwH03hyPpdBCLKf};{^w{z*^$S;yDeAhQ*TKZP&}!=-t<aT4PMEerEbR z3c!vgiAVVNB0t*L=K5Ez>$>^^aykKIbWlD7MO8`ypAs{sOpz&!Tn@>K0l~0T0M-0z z6;V5(yr<dtd6kqS4U@4*nGTR9CKP@5FL<r0t@N|1evG<+f6eT7F#EOH1;2x%r6kq6 zor~GP$^5j`9=iVW+JF4`6Z#OkxF&06qH5mxl)_Y&oV*yGFtP)dY>ef&dAT(K?>pJA zFAs22u;y;AVp-410ni)!&(n#Rj^uxf45TP{6RKuPrk^(O&@go)7}7i}p|LiJ`^CqZ ziKVbl&QM9#aFva;rhtgOALEI)HME^##9QmI(rTsmS&N2st)r!imASDpxR&5Z=v-7S zM3oiLD#!(Ca)?40WiBE$DVpA({Fg5P;7b4F3)RnjA?_`UDKswj>8bYV>HX7F%zqm) z(w^TEs9*7oVR9~|ye6+r0SUrSbs`DGkH;G=*eyEk>+Pb^4o*8U++Pi2-1}_`2fjPM z)xasZ;l=D$=spM(e_dCT)pwxVpfRs|Mk>&-RAGkWLbi%~fLXRC>@g96cs*K*l{tik z5}I&`n>Jt}mR{-}q0F*S$rf2t?NnXOJg8d9UI^DN_w9y^&}>kb2(NAkQ0<s$y!Dw# zBs}z_^<ili`8e;I{Bu}9uSRegOXYKh?(so8UFF@JLT4Z1C;_#`1EREZ_nv0Dm=j_6 z%}{_vy42K*s-t|(KVHmz6F>2%w`>zXod^R(H;_^>*UmO{6b>EKuVfq$+R9Wo(nwHE zAd}%$W8iJ$Q*$gUQiDKZQ-Sx)j6WkjynT_v)4Uo%C2BGI3nk=|`Rlo3fmx%Uv{$ol ztN)fO{i3o2I5f?l@Q6xNKFZ)MX3#2s9*4noZw<YM+SRx`1qIg)5(~w1gv}d~+164K zM!7b61KXjLLd{$&f(X2U>Hcyb*M=>s^ISHqpEk~FzYIxh@K<RRJzqz6XEIVWc<&OS z#c8>@U0h${u?t8`<tva`D&$ISQmvl_4{9)NPtf?izx+)gC_s26?6~y6z3Vc~l=QS< z#8Yg`8-ZL7Wy_lt_j0&Y6leKMV)Lw0_yZdeBEZ#Z*jm;J#o=>!Eq#_Og)pzSY+VvC z^jusIf;2aKdVpy>G4?Nb-sBIw{kKyXu8!9B#e*xVu#wIWnQqeqcFss#sf<CBK6GyH zhocmu&OYahsm!H1FFRJdgR4ps&mO-&ndwYAZ*S%&Pr2y$>qndQN$XS>3mUf>VLIiG z{py+w7DA8Lvvj?#BNFodx^GCmEGrfn8m3LkUW*IUEc7NfrG{!$sn<KPiA-|SQ!wNh zt^a$ysyt9js)Ft<Z?yRA@<WHS=X`Xa0yi;PtLD-(>W9290tmd<1mGdGWL3%qphd?0 ze1sIw!Y80lItrGpB7NMn5|$>h8WWTyB86(MN&r2IzEH^y{~h8oDH{-pWQXM%rsafZ z@DO`~bJ5dBRWZ;R(4Fj4&A~ASDN86e$a$3fC0Gm!t4fVFTron09*;;t28aq##D_P| z!4U{Kx=6;HVZ~Txs0`jYE{0?VPSfbhxT<Qk4$^wCFyk0D4YLQ@$H0N(;Sm@z>To6) zRw$O5dME}f768y%{w04<nMi9?mW^peJp%}bgRt=c4ha4S5J;|)ju`^QY@v781ONmq zYxqY$m>Pi)-*LpFsPix&o^#LRbuZ7*FB*&(<>yL&mAVGKF_|0{eQBxc2s%;%BTee` zCGcsAqdii5WaZVfDPt4()F$-_ejecdHBl!2LC6s!WuA$jl{7qy8nQ&E!GhxCWf#gN zWUON%#*YQ$V6IK5`1+33D8XVjSQ+ad>k{>DWN)}xk)fn^hErtyHY;Aozw9Mxs4RY- z<!0Was?u98Q4qB$k$C4%(n<7hYO*=ZzZ9iUrW8KuFkqv4@eT-Qb&5z7op(&XikEYp zw)h^glrk&qF~po5lV!+UK8`L4{6Ycm&8-3F#zpZYgQ6Mf(d4OM{V@zdvKP2gFoslf z)!f(nBusH~OQKmsjA7R2iNpN1IVGB4i26+!00;u#0idXjnvI4GNICO3l*)_yKGNwZ z8kR@f$}bmx2E{XJR5i6`H(%}i8@9ckieGY<-Sf=9`DA?TkowfI(fChp`S*o?-C-W% z=VIyKc`%Zhurm5Y{NKWL2+|_hVD;R9-@&4sYkmd`?W+Ky0aY6vy*#JLksL=TJW6EW zRd;mL^t-jQ2?n|%Q))N8vTKMtf=^#1`X~ie44%od1|05pWr!j?5{p<#t1~He9-VY# z1-tN}Xu_ftn3xPxlr+Q~V5qn-3`3hjd-?>Ke#LNgK348TUTc64vt)Qv3@=;kQZW?U z1(PV0jI#)zq%?tj`(>heED1J#;s`rZTbZ88h&6?tkt_`-MZMCaFa(<yP^Pp)KD|XB zf&nZ?MaM3Lqam_Go*Q?u>Wl(;#MGU}*%BFk`A`a>!N~>NPstb%C*yJKa)Up}>f%J? zx``373k-7ogpAtZYF3bbM;kz)oT#LB1PM4y6bYh(1HhpGur&&H41>EpLDMRDg!M)Z zhDZh-%KZmwIHNS-^pb9<SO{@sTNQbwIGu1EXT7Oir9r<gxNUFoY@uAS)+~zM`k20) z9jS5u$xNWqQ-%#MzRaqzeMt!x_lvWVkX1;)!-sSlcZESO=YrR+<Mx*iA~Akd2z?#h zy5X37@f{BYpWZ=}R;ouZaUnSjk)=Q?CB4KXTwyzkG<-E($E1*(v-mSF*hZh<*8a;C zwX0)Ey^ie<0)hrdM|S~s8YyCtD%IHiLX1_iZumUA0k*!Xb>xuT>wc~Jsof%Ho{K-t z-#1XD^qtQ2TkG)T*HAFvpp<Au6?S@M0LmPXE<Y+Nj{^!FBV#P+-2`+`{u@g}@wWA% z<{wR0wL)hfS}IlqN2*s%g@T+wTavMGOez~gUuVXqL8a5dZtywZTWUPZDr<CWhlVpy z*a}7DC@8hw+v#;kK-^kfC6!%KUEQKK4O>#)u*J<aj@0}^o#Axm`M)h0Mn^JX7d-i2 z5dd9<l9VY$2E9ab=B%gz5#ry!3qf&4OR+<Mm&<fZ;bPobTjo01#lVtpvFjm&`7%w@ z?P4P?7=;OP>a19)5?&5ub8!d;kRn7&0|*DeiEseZ@OZ=d#KU4Tbr&u2Rsa|z<G_>( zg$aV9ss}-YNJ5GnCH3x^G*)w622G$kF@6@p-oBNBu}YTDLv@~uZHWr0*;&sHi@;|< z4Iw0~Rd0+L4@2QA!xA(nY&0hUs=`6&phENy^#0Bo?IeSh-$c>DmQiAi5TN1~k{SeO z2n7fVfY4=QNRq_lB*dy6P@vb9uO)$o4Bjyz*(f0yVIss9TC9}j9N3_eC=5uhqDacf z?^!yK{okUwzVlBo!sJNANCgBy&pm_wc*k)K@D<Qy;&Eq*op(v8S2J{OBrrIrn7a8* z9dNRJ6vMhSvtzwNwK0E8%^`;*h#uSI-R?gS58p5!KBs+%8L(X1B0y8TN2lgH#He4$ zwa{w%2z3(Ad$v*~tK$tYqFnh>JofzVXvp&Dd0+Pnsq%({Cd}Rfq@0>yIO&xCD!^f7 zL!Y**wnw{#AYf5f`)=>`{U>%Nij08+m0V?r&3IDvTd8x-(4+<>*e9{W1bJR?gQ-Rf zj3J409>P=H(;P0X<5212m7{jY>_t)=nz=v8w*xxYuBV`=yW`5lz4iYwc58zsJ}gWR zIrFb82X_v|QICV@Wv~FhSMg41M??y%CTq;26;KnE1xE&G>hpIB#Sd#+Em$(5p|ei6 zy~Tfb4KaSrtE4z}(I$H8z_#^+J31QK8W?Ai>Q#d5Vs|Gnrbjvbd@I!fak?x_Lncj5 z2|h~7SUOcF>LKP5^341?%;T}6saj}a@ka71-j-$95Jg{Q`@ztcU2s<8L!1Gy&5sR< za(tH*MVnF*Y_#z<;LIdyNWM1)Q4E#&OFd0_AQ41Kw>~N<gwuXxy$}uv(ExzK{7_|* zT(bTe13p9TLKJHhe&lc(uu54>HX^(~gfXs?Q4$t01gN%V;E1!(4$-Y<jma5Tsw*_d zZbF#ILk-!mwiLM#8cH&0WlHoA>J$KCjscAqZ3LG-D>a0o5!tC!mxInGkUa-~i9**1 z0O8@W<6-{@nS(1~;R4Ky+QP6j1wf(EDF7HM89b2(4gyscQ3DE7=%BF1C@>+S4c&~D z-Xd^`!h$w@C<jPJk1lY?2Aoz=Q_seT(7LUS3jqKQF{t$w?F&J-6vlH5j*jZvK5V4u z&x~!+65U_0%<%^^KDs2_I9^-Lc0bxds#`y71A@<1p5@Pzsj%NY&37Yo@zUZ3#L+t- z^wH^yXWfzF$JG)Z492@qe060%z&H8@V62k9Bj+5QIt#!_<@w|u!Q+l(4kK3&J(kpD z=SoHM$<Vmc2m8;mspj+O>VJ0a<=U5XsRmBm6qr4Jz^w})&$U81+Hrh4{xIfj)#<Vs z_vYmCWzGv(<g}7D`v`CV^Sc93fxN7tJM0z4(N-~hoP*heW)|`LG1-bKg+p;8S}ig& zQyD5zL8hu%l?>KO2_4H?j<Vd!SZHwfo~1vrN+P1;Eq|!xM2nEXPP9WK-uv+|4kF58 zbWSOYKktLsG614c8O_0(plU6m2owpFXtC~`IF@AVXQ8!gGRsxSz|@TEvUa>~S$N%7 zNzo2-`;51)Mg6zm6~!tp1`Cb!$`dr}KEyiO$?Lo^mQ4A#boEXM`+n7A_`0^{5N$b= zS-;ONWBOZ7U{ly~o9zdJ9!9Y8jv$qSVOIcyQJCz@35a5RTCWd8o$}boejEx8-G|no zBF*hrQPF2pHs&ZcP?CyKjMEg+I;zG=%;A;jsHn9yh>{w2Sx>GMF$z>7#ZY<T$;t^- zc5D*dD)dkk&)jNtrZ{98K=g;9njypxhSbIyD2>pbPqWtIaawAcWo%<)oip$(WfQZa zk3v<>k1*GSh0%w=f6NVx;QA<H(N{Y5BLL|<%Hy!G>Uy$PEIBN)X8}vdMAWz4Yj8<O zT6i3Si-!(`^_#t-HbTA~3!Vu80?A=0G6HlF?E2l7i$MDDI(krBVE{`ME&v_&yzG1g zbVW(4xc0|u#6&|ET@Js<3)pb~siPrFiy9gC0`+;#+cWgUBx4iU&3m|u{iS!F(ww%~ zv@Q43KYFieg>R1f4A^JdtSRJ?`L<TfRqpOMoBZQc%>F^L=WeVze3-;aL+dp3R?K2& zRAuPtUm)4orJ92ga^56R$}QzmnlQ_dpgXIb%c%9Ok-QGryxvcxH)l?Y)4wB}?$=i@ zmK2<v_$k8SJATeQLd?GDViNXdZ;4_bU+-OPYzQ?6eZp`xSkHQV-L__O!BI<_47idI z*%diaAB~(Z7HFHd?ZKOAk=l_Fspb~0I`@2n8Czmo9@)s%$#7hOzY9MroOK1At}eGi zk|p_Ld1xb+<y6EXcu|i-2HA+wgi_3r?wok;<EZF7quzZoChy`*jpx0vndq^7s4SF< zKJTyByge(pw5wRY7=75<nq_yY8Z%LGQRD2cPRorSs{f|&GOq2F)I+>HfARMg!@6a= zE)UYr-Tum}czOv=PQw^Zb<0v29<mvU^xnBHi60K;1e-~(LkN27XkP=*I3KiYje_30 zV`?^{=1&RnalY3PNJo}Ak5J+Nj41)6`7=^AD}Pa^VbJZj#8e_yn<j(Hh-62?i$OiL z7Mc;eWRA87VY;Y|FMK4s@^t2?82W-tDl#1QMIO}_xOA#S`2UeE9L`g7Zfi1#WCOkB zSu&s-GF3^0!)c|O?#R{3_p*4{cyu2_z!BQbVoEYyhHPR?=rR5FY2fTauvjX_gk%ZH zK1mYi;9v|7VRk=b2%IR*8~`kaDgs`HDrJOWha#8QHSLRatd<d(3I~iQToP3jl5lh| z1|}8{EW%!cC%Qj0Lw4F8&V#3(LICbski=9(<KZo0R)b)V_sm5wqkv%*D2b@gc@0*) z-oi@Fel}dlyzKuGjDC~<5saE=f<cvM8Bh9Oc=6or+3Mux?&9Q{l9ltEl6ZQ0PS|-y z{WU4A-E#k$IKWCW-XM3x1lq*>!+(5IjM?^{nv-$NBnX}{k}$r8V7C@?caPk{RbN3) zOY#?sdDbq|X~;8$sPbIpB#avdmtO(eu%n)By&p5M$&P6j%AnIB;!`cQi=PrT-Vnag z<d`V0dv!e?#<MZx&3j7MT8d}5C7f8JPRL-b`8d-Tpr;bYPkwV%^+QUkaZUKMCV864 zw(8SXzXU7I_B%C)y_2v^YU6-$o*9}xl5z2dFakBRJeJoTCdvw=`)Cb+-)6|T>ZU88 z{HdWs2uQ>&SqpN%i4)C+n{(l59QNcZQA)}XPN#=Z5jW-fPZgY7D2O*~Y!7ktAp^ce z61=JiPI3IL=W<Y{wMwM#v6raVfw_IZl5pqq*SJ0J_g=-(XG#-dRF(##^zF{fn)rm% z+T+W%uPVj|l-q~Z?k=ruG@3I13}5${{+?q;Gc1cKIbp0~GUBxEd~aC#<7suorw(SN zM?YIlOqjnFqwHM0Vdzj#+Ab!;msPD`LX^g*Q3o&L!ic0-8;D8r#or~4ViQD(xL}S! z6=y=z#+Sz}0nml<AR{=&Ro}^=4FkA!RlmeeV&%xNG;UdUMu>#=qmQ`2Z~^c+Wh8W8 z6rd=D2`T_4lE1-axl>pu9GpWzC5usI=GBTP2WjxeFhLi@(G<YkRr3}{>S<Z<Q09HO z^Ry~11EiUs0@fNjtZq9gw1hc=8#^ZokmDctQFKUlt>xQU6w989%Ls>YEM;_lU`>qB z+8`@p%YvB$(8mn`JkM(20XB?GJX?S{fY0XuB_zVNGXxj1-wAyQszhDXI7?*!z<C$| zu=iT+i<aUDXdvoy;*FhxqA(6Yl*cTT_{Yk*I%@M*(Urintsvgxd4IEY1W6z0akz`( z;KIqAO^Y#9v;sV)VY|_}OXfV@?P+WgWA-vFvMKZ`{eG{FB3}*E*P~Dw5>Y$^P#3Og zrx8|Cm94Q7qphsFhkHZ9umC__*NtD(9YIb64J>r&x0SL5hu1%8e1uJM>zkUtoF@uO zK2l6)mg_=);r`)k;<;qR?<Bpdj+Unzd$+7AwQ_E5;GQ~>c}8V3yIHz-IK8~Bn(MXL z-+<4Cosf}@D~Kb6Cn)fOH@ffFlVt)wMWlo`x`{K9?ee^6t~N(`C_$jsZP?%&MQV-5 znnYzS9w@lxUh~;t=90es`}T#-hGlI6v56vsZ;=5AFdStJ#+cT+`Y|3$sT3$`!jyJw z;CI9!oPf_VN+2&`N2D!ZKlrvpFJeT?(d}l_faLo`S3ES;yM;d2SkAeM2e`^D>{vVJ zwTa(s^u1D~ommx4O3g<05l;nb!l<xRo_N%Ll+nF@FQukd;t0k=Z&B)f2V$o>yr=T} zs8W_UGsB4X^F_Hcx_&o9_|j0$J_V`=*a#dUkjMxIkfpKOT2tnLag@B++!W^meGV#t zsAP#k{{BUR*eK1KOA7`Vg@TFKA&7%8A+)d|2xuG>B{)I21=$J#19rwy{+*>nc#(-% zWBB3iva_0u#u`+?bRaxqU>Z1Ah)sP$j_CS6i9G;xjbMkR4Gn%wuWmK~!9B3-8A1wa zYz-}r6qyA|Q+ZplZRAi;<FFL%Vc!94sEgQG>QTj(t*A706g5EG01*vkc%xgCn83{Q z<z@vG5s@(*G5}ETR}Vn}D6)p3=0p(+4U0ZdL&;=&=#utJPyy&@(>Ne7j|u?45CwoQ zLMm`0&~#u{P*Oe`ua6>hYvmp0@S-+EQqem=?)?c)en{$1IqeV2@uJHcLrK$R#BN*% z<n>!JzrnoNH76RoJL6S699~B=p@wNvXGUB`C&<sYy;}U5vbi)_m_INJRlE~^prjUs zV-IB*-vg8<MD4UtN1~!?a0YOp#m&Z_8w00_y=@zkd3-9!*V#Q!<wmMWeN{MIKF@S& zJ*-TbC2jpH@5l%~dwdf_s)YU4cqXsVtoWxg%}R;-g&4i7pWTy(>`45`ZHz~*Y4^aB zG;@O50>`u5W31NdQuWNEo`I%CyndoHhmuN7&O!Y~&{)50tSjg*DcN9;?ZC_dfNL%{ z^g5y6-r=?VHhp)tDTzI22lV4F!^|>EWf7yJc>X~0^HMNY-T*yj3=(6(9@+3h@9W?5 zgQl@e$2sFb4w@InAHVv&*fh<k@Y(G&`O_e~*48F2*8S}Hi!<yy#xM59Gxkp-PBnh@ zR$7~8lA%YgbMq*dBw6sYx5jJ@`7}=QIF;C8^i~S%0{g2`<;=#+BZ^Zh{fxRsXTCJ` z#Y&BM1#1m`I~<SBdNVmDmt8|qwwJ8|JIKl!wlux5(1>&%!@TtqI?I)&S+*aFJeH0q z0bwB#kwlSI7Zj=m6bPF`)_z?*>-f&3ffPee6pXpzXiZyoWRPpX@V2L)dbk*f9nD^Y z91^+$9S!BX>VdgV`=H4AGKbU(?aGDZgqHDQU90XRRq$=~1LOtBW$db$tjNG@Q#@fX zlURFE832|Y+>#HJ5jx7fI7tyNfMqHZ_3@H891IP)nT*|?L***wLeR5Ort`OX%InWi zkAo@1FrWR2F<xPSI#d9ffGlCAqAmp0hG{UyA6GJ7k`2A4Im#xJjJuFsB?MguU{Q)f zLE8j~Ig%O5!3-wDCI*BsoEIrLd&#({13H5M(8rU*aqg5uqS*7&3c3im^zGAQ;I;pY z3bN+`kymZBXu$qs&K}L~Xc0vFR%G=yU-vkh-9q`F;)@-qiD{9fC5NGaOQyX1H=9bB zY9uFDLIq<IjCo%%EZ+4cAFgG0LJccJ$l?DZ>MWz84A-weGYl~F3|->TjkKf=-7s_` z-Q9>W#K6$qA>AM#Eg;?9AgFYQ0-`AL@;~oc>wI~>J|FINuXWw~+WWVW!hrVx!XFn= z6ILYylxqX;)<;xC2!U%K_sShkF)lpnXxlhQToFN^j%x8xZ;Jiah>yP6!n59=K0!ir zT!nKNtfXTQDz6st%k15Jp}17S(jV6Lbk1fqDru}v1;B+h-5p?D!vsLCf|S93{%Yft z?<D|yb}%%h5foZBh*tJpKCS0J_>{1We?T(@u7+q7nG>BSDaoY0m`)m^+wbk~Vthn< z7eB6%^Nd;P@?_^okyE81mw(x!+<)O3OTyUA;i<L~js2r!0+k;)5w=iH_D~KgCtE~z zSUJ>aN-dyv!IbOOcl-~_u_mM&g^8MTg+D6;g>P<YZU%+}enuke8O;<4CmX)X{nI9) zBG^8BM9wVpWba`p2_F21CN?Zx;a&8m^dA{Bdio~6Q6jMcl$j(CH4v<(0nHB7uKDJ1 z{-L%4VsTYdK$=o%VqNgTgtr%LIf}wz0^WzyKS~f=Q#-HrDO=PHHko+N{-u))$0g4G zjqdY%Iy4?fzJ=tB?>^&loA(HWKS?Gy8yBYyILVVJcdfq#!4682=ABJ__G)Hm%!5Yv z6hIR~VV@s`bZUkG%?3bHUEEYWx8Jgw*m;?cs3N~{?Gmw+8Q%nbjl6O>N&(jw&5*zJ zaoqg!<AUlnq~^qt)+Fd3mP^80UpjWf4*&NaXczILTjFz`g(U{2U3LNtC1F^884s_e zRr=G~bYhrx%)4;>8Jd16iajY~HD{zSIe?zwQs#Vo20du&(^>yp(T(T*iBnykxLsGY zOM*}O7v7uR>f1E0t1f?;h}Q}09`mCMHVN`3@gzarz5_Tioexai_8`SYrEZ>b_3G5K z2`v|b)~>F+a0cw<W7g`4xk>`oU*-E%yGve`S9L}9pxSv%r!n30lP1mSqGoOXib_Si zYv<~twed1_cwe1vIp8lgK}rl~bdPYBI$2?;j@Z@pY-HGoG<Wd&XfTzQZqO`80Qpw# z<dAsMX?(3~z!v?D0&z^l3YjrBta+&5h;-}f@pfNZoBa|(ycoUI^sVuSdfEP^h9X1W zZ=y^uWiof-!=R6S1=#B^$=ttWY6#m*CRF-rRy#Q`;Ya&D;}f%BQR*P4KOgGfpPsO9 zt4ZIU$yoaa+M!upWF;}>scqe{ZeW-QXOs2a=f2#Y(m%!ozvyylS15%||Cp+{d^%lt z{yj0sYR%c}jnQKFm_Pq#$Am~okP-2XM8TGMV=za{<ALkNZ9gIPcvb(Otm3gsHIIBv zTZwKSurwNNvu3mXsgCk)xl1!Iro&e!f@*slieBqYIk$|({d(Wk#mp)a$0V5Mvh-G0 zlh&jUM<0;Q4*muHu#GJ=>yX`BNQt|1+{+X)o5B2^^V2V;>}S9JZ2vGEhcOhNe^Iiv z-MLL<^u9Wuwv<ltN0})>7heZlHJ=Yen9Q!(yni*C#8&zR^|mP4lC+=NQh91vI!qqd z6?cAyY$chXc1Oha`XV+JDS;SeC=8_mU`AP9&#InO5BfzNmDGM}9&1^)HGTesE19J! z7?ZMm_&VuR!Ai!er}+W;)rG8$O3=cS-EY~v)OugLzJ47RT7O1;gK)sOJ*Frz|41Ao z`o-ShH|2h?uv$xBNxLUJaDL+QN1=st&O>i)xwvytI<e#&&Ih&8=v=w7YJooa*|#4D z#B866Nd&};NMir%f3p{tW0>GY%lXEmTYUO`P+P@wdd<jJS)Lrz>c6z#N%jHddL!P6 z+$%Yb&!l|uKkJ!jbc0WONaqmQ78`u^p}n)Alp$Pp>t|EN3fa%mx$9A*_=aTcQTZC6 z1iA}))O>c`{jW<SVxc>3dFJiuH^~Nz>&oNX^wjSXxv6z=N~9;a;WgYdkwwiNOeNd| zFd~q8CGPDH^`~Q%Q3j@bL56?xqC&$s2xx<!z41aY_E?<6)r?iB$W^1#uTx=$DN}@j z^BFoCo5To1D|{`-kCrvf8&)>HuZ{S)DUr}A`t~QwTCVWS;UT+|fvl?sU#TL)7yUxo zEK6QO9x%c7Uu@#auWzBkRKjGsD!IQrfojVnnFcIO&ag+MG2vsXYVsuuIH=lzxu~6& zBBcjlO7h6Y-+VcttdEU(F(9!vFNVlVj&NZ%ccz}EQe|p^N;s<*D+dckOh864Pxhfx zGtro>%C**|1Teucwq5#>2#6RcRKrhqBrB!Y(PgI1yxu{DVP~K4B)<45yvz6!F!pmM zD}p78=;B*6ZT8Hx*aWt}D*y_7&<lToe+H_|T8$s*7){cgd?%xfM5B4P>pu_6+E447 zJzp#e>Z}ypWK>|^e-)tr_tO}9o0fmCzo~^J?k0y2i#<I=6Pu9oIqC#_J42Ld0N}OM zfTwYx>f7x=Os&un2CfH`B;v5>oUDn~kDfy#DoNyhMrNhUE7Ij>=<JMb$9A&6@?9#Y zlIx57`9WVDtTq@_qB$#;7xY?pl=ilMUbVW<t_>|7L_{CAzW^sW_Q+V-On0(BIX$uh z#8y5jZj+YXR02}vO$*QDKkbsBQP1c?#hhP<{F~t0ug*9iv#<yZ>S{1n>2`c7dKE+s z<GB=n_k-Y&bC_;qW9&MX{6`HsMGX7b*k5Oeb7gO$>g%U{e!M524pIo?nyJKi(}GI; z_qaT5!zQtRelxwwsQ%@U0oM(e9%lX;isfAL$-;#^cdj-u`wtV2j7BY~#lYj9-S+Eg zKeMYa_urRqt0RcbJ{r8{X#Q<pv-tB*YlL|hc{vxuH~LKz(-4DICt~KDcCMYaQ@<dC z?w;K%m?=t@ww2gcl42Tbsp}c}#@6k<$?l+`EjGSSOn?5n041Za0=vbCA#!Mb>`KO- z)BsT9U^Fa#elPop$!FcE-voPQL7%|DT@ycCVA^djA(@??iAJ0xJ15v4{1V@9XNj`) zzA}QqBSTh}_Vb1Kf6*6y|C2&$9;A@N=E*Xul>7U<2l2zh)!p4QD=zW=KL7qc=KkLI zf;JcU&R2&o)`H7>0B+a#l5Z`r?s<rd-`uM?5knoWM*iQn01Y&^=bzUPj@7ff(ZNAB zY?GTXBq!(tJdu4MEj?l#icmwYi*S@cAbp079x6ngj)z!~%yju-^3id;{KTMu5H!d1 z%yD7A6q1kuiPI$iKFt(cV!=7(Lexk(%A8RG1J3-2Wvp8n{u}4j|Jh2n2(9l+7I6ro z<c2j9e`=Yi*I)2EGPi;>;x(-#nx@8t#gHpOp0j@@w7!~M&K>A>LaYflHt*q`mVe>E zrC*u*nNQoPWBDf<CHQ<1O_p>x6o3q=Uy<l|+nsGfc+c9pF_hI|x_1HqsBf0=V*TLk z!?%K2!hGqg4Z72!Hc*5w)8{WE9cdUI;b*|E^(4Dr<b+l*?=8Qn%Wt=xeJNbvtMsD# zcAzM^ZJ<lTvTGHSwp3w#aQwyk3w8P#-u%p<m1N^ozXdELTK%6UIz{U(;fKf|fsmNr zMPix1xq}3&8VauhFHh(!EGG7gt?&bUoiAy<F5i!~4c6sOau2zR9=#xBc!8ZNAo_;e zEG>q2)Mu|B+G#?=FdFYAdB8A6KL4#q0;H$r@_4Eg$noK1x)EEe)>OdzXU~b2>w9$l zy{<h@+Sqb(np}#Wq~(N}TeufcsBV}s#=yI#W)w}<bCQV{Gj3+0299)v0>cT4$*f=d zPgcG=(DG{LsgYiC=LksnCu^IqGAv0Y`}*1BSD$vR^c4yF6uB=rZO@q|J`s4B$zwX7 zXl!fw^ja*HpO3HS7@-zit(r8xgn*7>6fj1SRw=Pq&Jqf91FBSMc&L|-BZnxjvAbXH z3vL;7?`F;w<BOby^21yc8L7eg?o{vbJT5-doR1F2+}V`0yR4b7_9^5l!l;&h7+*~t zzH*?mtNC{q%4Bw==)mi>7s4R?&hEC5Ca*4l67y{9R2h_qho<Ga`Mg!+N1*~T761HH zoX%I!_sBmlhpfs4glERrsEWq{(fdh`w%c!P5KAQ$8^bUVq%eq?gJ(?P00w`&9?r)= zW&P6`8h$Ka&k&NLrTqoo9X7Dd9cTA@>j=Qg<RA&a;D#)agrFz|IW7A*Y0Txvq>)Gr z3r#iE9nzGWb8XfTeP}74=TTd&B=cxmaBK9WIi{(Oypa1*>#FOqM$7Nd&i;O+YnD7n zWdm$+E+PJB65Fz2-Hw(C)Fd{EQlzM6nB?MXJg6VSv6euT3+&o}g`)MQUdMkR{uyYP z%?J32NK&W1?Htn6rwF<mxKvDEBcxovnGE>pT2HK#zMBUPcNTs^PSt4(e(W$Q_SOvd zzIO44oT;>l*B3&&11Sl}Zsethn=M-ysF;zJ9W=H>6{;bkJ)yC4L|WDUxZN~?s*JHu zzh7Z8wMcI2CKiJKZoV-uUgwx`p7Y=Q^WsSQtQ^5|9&8M*{Y}ItW&^TO=D}Z+Q;~Z^ zkcL2Fj;jUF-b20JS2Ns)q8X*QzZOMqG=>$VSw#c2<25;dTUv@36(g3uuIBjjt4P&O zwb%v?ukJ+0MU!g-dot2?i2_E6w4P~sP&orhnhG__O(cF?f(`j@&;Kgu8}Az`C-E4t z1px=JXr$d-mo*dqX}@pe+PY6Xo|HRyuWZk9{_FGR*mPj2;oxD%*Yx+6bwB(6FoRwj z7``%}X3RT29_iDT3Tfv&lW7+GgGs16P-<c?&W$J_8LSxVeD(JFkq)Us*ZliqY=FOl zO$a}+Owk19Pf}{o$666KNy_;eA3MiV3hm>)L&?Om>F+p2TT-w$D=AE-;Te*1+`dSP z^2*ja3w%1J)*380ka1}dq7-(0Mg~S#a}xRgd=l{dO~uo>Ohh$(oET{V%eE28R0;d} z;Y@_nk=Z9JnVR>#^*H|qD}9%nzN^y#=!2~B)uqkTeSxsGb90vszZ#mPXu&*{$@lT< zy>I?jcimhThDdd?Ry`8H)N8WY;4U|fHDwNqs02Gu4vkA~zu4v0!|xH_!5du_CaS|C z{)LP>k9AXhy2tHfj9z;BoV={oCwuyP&=$VZ=I@m@t=t#ZY0FvFPr07$P`j|cl~P9! zo?{a;>vWcB<Z|EaqN$9>vx1)Siflizl>D@DXO(qW9bwQ7dR^6#<@z(+W(GL^zO|Zw zoOpL?q}Q~+=)0q4EU(Na|I_z{5J`8=fU_?knP2c|nUG|jmT+?WV7iT>!45$Z`_EEE z($%ASSpRI5`tKzwhP5*u>ph`)Q*k4eq-tue8?={}*FVt7)4QQ9{`;yrSm!{;-}q7* z^-oO|2Tb{$AaCQqMC|gh?irsUkdpH2&1bx+rxE({j^qnvpVRzD^Y{CozCT~`77U9q z=<51X^(okt=N;X%U%z+$`ZOF7n4n*ivENe>bYC#bHG8J@o;)d&-mOACD_8Ri4?&7c z94-aub~qmrviidT4;vQUDfW=<)G(Qs{C4H!xAZ<jL^N-KvOTy8$}6dJ(qVbpal&;L z7jnN6w3C7bVqW|p;<df5;#{y|*wV6FxsSUWTGEjAZA|!KX>4)(Z+-rcQJEI=Nhx9W zStD{lJeYuVEA8ocmum#Qd@7KK;V$nq?5a;xu=0y#PIg`_)e)VxKV=oB8ZayKO6;*> zA(Fa@kM&Na3^_I7ulp`*m9Kjuj5@H?0ZVr8cCcD*{^PtEo;&>ZTX?x-Or*z4yXV2H z1X`yVfADb%37I8cxtyQTr&Wx{wQObd=aK`Y*vbiP=#F|nr%e3ACU+qFR@;>@X5jzp zCB?JueLv^n#{`GJ%Qf@PGoP%wo4#B7ELQCKtb5Vs?*|>j%I>e-V~LBcvZ(Nzoy61o zZ~HeF?sJtpBe=mIUnNJqNN9Z_H1+h&Q={&ezFx-*!PG*wZ)>FkFL}BYxih|?`?9|u z)E;iUV1LoCU7by5OqA$O$Rw{yah|c)QcVQlA-%%~GipvG$%+Fxu<j-&b&|Rgitdl@ z&}q^>CJvgW<xY7^h0PMQs#!rU`^wD(Of}-w*Wsl(D(M{6(}Hlqn)v;GY#&=T-71`1 zJee%@OuaCr-9;5Sa^XxJ8}dctLYaqFyF#ad7^7Os(zTGrn2}}Ven)3VX>1@b({Xh_ z#*V{r@l}n7pH(l8FxN4f6Z`R@oF>~TQ0(yW;h{lRQ8(Y8-<6w2nTt+;zHCYbND9GD zT{Fz)J?=(@nCe6Nj_)i!X;BQ)f|$Mr!1sw?)gf&mr5+WbobH<u47DDt#c3y2l(C`t zgZkAz%=VYih8F}b+Lu9psT#>G9Ef<<T3%D1d@^P5@W*7S(v?1TGVj1iidX(~){>UZ zY=T>2AExrE4X`cA)EobU5ZrU{5`d~{`gim9heNly-*CWd)9XMoA87FFa)7i!uXu30 z+fR$QK|!C!o+x^76g&%00;iukLIyylOl(PHWT|}w5b6QwM5(*XqUuGZ%pf=b{y)jQ z1GG}HZ=1gSHTy?>->qe6#Z9*HCzDb1Jm8xDUjjO1H$eRLHYfMf&l<gLbSl;MCSC!i z#zfiHnDR-#CA&=cc_j+sJTI2nf(8(hQMx=5?X~-Qk|RP*hAbqOe2%I>Cx>1)xOJ^6 zMXO4Md80(QMM+~b6>%s|er@HmgCLi#k2#BM(y2Kj2<Kg5K?4tOP2E6SjfxfPgl?h~ zFa^>nk&CUurH8sliF2j;Q6#S1H|FcuSTVpbRjXzoQjgqrPuhhF*FNlmh&ch-i)_Nd zKUY?N(S^fxB-JOB^6aB<J1?L`!xr_V6dK=_13v-0ipi;OjFTK7@E*y!&le_S5X9P| zr?~v-GI4(S;p2{AZVS!3_SS^)*1v2vwDy|4-SNko)CUBNvc9k@zk{Uk3GVo8$F*At z&0j_A{-9RwgDhF1qGENC4oxs<;mcb#1o!el4UTJ(lB_6o)lnawdq8~9_3GoudNuhP zwcwN?01N_gg$lyD;T+6~u@!I{|F4y}O4we^t(jFO0uF?Oo#nYt&_2|IQZ>F>7mesF zu6M8hd1T8tJ)S_UCJj$jt8r@)W|c%;s9%4=BxijtnxPd`G5nWI@NXni!#p}Is6g~E zb#+$fyS{2_w0xQpKsa2@&#(Sl$PvJVg`Q@_@*;Oxj8d~qC+Mv&5$pWm)?z4#7V7mu zlIOga4X5P1Q-($ZYt6C4!8rs=T@6-Hon|@1LOD3_Q)?AQP3s(;C_(<P#JYSF)<kl} zM)^^YdIQ+vQG-JrueVaVwI;Ql_&a+t?Y+C*5^vx_QOodXxW(f{H~z5ex3p3GP`r3s zVlv|=PJ*CDcM)tqkRnvwlV4(-KdJ;v5%<MWZ^$7f2W!cxI*KPLu&qiEh<EUM$hqS* zu%xn}c`griU6#2G>nGvQN&8V3Yt&*H*P4;|eNILVu$<7G<~7HbC%((cHc7bM_`tV$ zSCG1)il1ZsOK8Xf*%F;Afp6~Bv(^5F(=?`!x3J>m`!h9JFYJ?b?jLu5(Jd!8;u?GD zOCMLvmuvBl>4;1sRlc9Bk*w5JqNi*t<-)hsP4M1iVQrH0FDE@MkN#V0^~009U(T*a zGp-j`K@RJ2$aW<z@dDz2b|E%UH%C0x6(zYA)HmzKX1Ni+24y+1PALt4+N27I=@nu= z0asHQ=E(sdK%6-b&qud1k{YMC8PT7ycca9H-OXFT`V`ux(SDj0fqya+l}~s7ET|u_ z$jLPSte&qU7d9_eRbZh&`sf%Sh&QSzI1bTP;Ju=Bbt1?ul-@G<3_#k0FH5Xar_9tS zI4NbEZn?fHI)=p;l_ZxI`p#B=)vt+N=Y^oR-GCRiWNZN#+Xz=(7&gk{tIs~l$O{7~ zJH!np8`%kwz+&XvO}USKMRfBtiWtWVBKUO`>lGm`Nqn*7l^C!a)xZ=!!p0Hk%dyQv z{*jqeYqxzPC4zfTZpsz&$Rrvuv4*sU+ZKpp!F)AgP#}v+84<2Mz*Sq9vMiPI^A?kG zs4)uqP^}^B;3x#QVm`DjWF&ng;CG>Hs{F>XP+bi|?Y9MciF$FX>x{kot%-DFyE7t} z(UAn<8V(cYznZ;p0R#SVOgN#P9#ybqvc-wl@?VEp04yNjtX<aLv4!2Vrh3Y*=kzHw z;*XhRL+BSw)rxqo2mf`sTcT75lXwUwaH0xqiiBJaLReIltX27}+!{)4rx`iy0Q`w) z>2$MGOtMw`ufX86w^*7Djb6=h+t$uZJ1EXbzGKz)z;+QFJ+bt(uiRNhRm04k1Rr%C zPWz7Uto?KDUuOqIz|W%LTA~H)Dq25n{yw?U72^glGw*K(yM=uKv{7y-6<%i_$4V3v zuCFBYnE%~nDOiWkH>!_sJ6ZO)o@ztY5ic?~BZt3N*KH@*dr*A6-?`U4CR<v~)*rLY zX@9CDUPUs}_$*nA=^H-daOzfxY=26k&Zm%iojuAg?*cuWp_+d~LI&L6Y&~DOVz(}Y zmKK(_{0HXe$`-GMLye+ZqS;yMOo?9jQkwXx((zSk4C}QQGQ*e#a5Y*oH?kddqE23p z!E02MSk|R%Ed1sqt3Brxkt7`75;gGwIYY^kk`6VDz~;=fVLAF1cs20xJA|!glP`)f z)QXi;Q-iq>q%JLVNrdE&sCyn+2#}#Hgomor64+n6<Ct;USP;mByJG}&P}KAk15o%Q zIIB`1Fi{QwfB=-c`c1=)WDrgvOM=A{(I!r`P<9{n8ZI5dH7LZcq$Cb&>4?c#pIb~; zhv2_rNZkL#klF_^<XbGe5!I{v`$`8dS7%R;1oVH>Ee}bT2Qa8CTCXWYoe3DjWF)I9 zi_t-7j8>`hsFY4Z<wKhYMS#g8P>>gv!T=Ws;pjsTK#A%EE2SbfaUVBR7ASECAAv<a z+5r)!rh%gH06-*yNO|7MG8`RPN4||>YPw+=pp$*kL90QsRl(BJ@06M%g`JB(!#EQo zXNFxzAj%#dXg!vIMVOoY?M|u07w!9qoc7Z7P3e|1jr?PiS|rARdOE6QtI7J+5>8}y zb-=!4@RGD`x56i%Gr?<<WNzz(=9io8#>e^<A8<3Hjmd$_^27+HS>R9)3*o#bpfr^j z&s6nH9l^;;s9I7r!2(scaQ1u`iL3aI-0ibFb8EHM+FChooM5!_BHk~F;!g_m>HTbD zRI;Ci<FyGTPNlo7bRY@b)37@=igY!>b;W&Tzo>;*jmD?ywes{iwkJ@%ZXR(l^u=$N z!sl8zKLes*Ev(gdac~|#CmXfK$=S!S<lX+|KlxhB@k!<mtP>w%bd}yrvSovw>4o!P z2L+WhPxKP3eU8{qN-kjJ&>NhBPDt9(;w9uLe@+bzZKLmdvn20HD3h*Quan0d4u(sA zQ*q`eRwagUQ1b_BE8Z9uD&d$Dld&)G936ik&DVYQ<fq{APrn*>v#)6Z$*a6mn?yN% zzL~h09m&{52F~j|%7?U9%CvyZPqaL-1!I(aTT=l{Khrp}MT=4kxH#o1lgB>nt$*p< zz{?Yppv=W{2Web+8-(|&kJ5}}#So>U@pIwq4-M{wo*~hAAUK{MSe`!Sgr!1(oLRqi z!5WA++E@XSC6I?Rr5%?n6uPO%v+!4BvT&zm;;r)7gh#})VUm@(7daC($l}5o)FO%X z5pm&6W)%VaX?SdY#LaOKa`7BuH@Gpyl6?i0o{=i4NhK_l0;G;C2dCyjk>A;h>M@+* zAgk;#S4^fHA-Nk$CWO}{iqJQ|K%Xppum~b3AbMN4X&JXb-z?Hu%k4ppvEeWoOT1tv zw55cThk_;{yR*!HG2iegDO@nR{ut*^NbVX+07oDOBi4<SUd%0wqV?=T65-8I>xU{Y z_&8mGh2@DChfZezcFB(ZL#b?p&fff5c(jA~yx=o-UWq+N_3o-mzkZh=FfWM@dkQJq zd+iyoxWpD-fA~!Du`W6>Sq_%wwLY=y8m1vGTVOmV&g8@sn5*rARq4>Tu7R;C69$(! zgc~#fS#Ect+h@Om1->a2t<%sL2qA5J=={nme>a02zHYrR2$xm1E=vFR!ZX-k;A%*Z zWdp)>Kbw!<yBnUiC5d&vLx_|p`pMXrtfm=QyCS(>;K{|Nv8m695hOCnx~UWJHMtQz zmm++G-J_0#ia2WV0qB3)vTNjEjct-lPF$6vk^_DZPUNMN_C(8iU9~;Wdsciq)8~mQ z?hU^Gk@r=uS?+i-!B21I?K%H}fq7m-ReF&^%!2H$B5|~gV;nitI{_6D*de|j&Zv(f zS#$^yR)e&fW1$$YCfT2eZd~wDXVM1%4$n~_77?{)zc_x}UWUubNexqa(TK!uD+A>> z4K2;DTTceZUdqgBZ*|YbkC+q@#17_~XByI6|7!WL;LO#u@`{p;FkKG~bO!suG9QRU z*1j-NqDTK`TIQJ<1)JpYWvGRLSEtDH%!nTQv4R9Q?<ZJc*`0e97&aYkc`=3fz3*o> zDVeb|*FS6m4Qu!H-M6(!@=X2MpAEyNsHFVAjQFS!#5t$dQj5FcJ*3SlWy`!ZA9|8S zF`*b2Inj(9B;3(OPu>`9BxkzFIq6hdyW$QI#_u0k1L4^vacG@fsjL<1UA|KCnLmld za*5OYAXXfk<R%-pd-!!k_#G(ht(^Ql!tIf7^~tbm=|{h9Ud_~`msj7T|3YMgGv7?+ zVDKB0-F%4+2_kKIhaIBpEs5Sb#tB-@$d<E_|3J7tEn2~%C+#(MaBM7mPG0oEJzY^Q z=Y=G@0?&Ml+vk?JmN=)+EpAOhQ>0U=iX&4Ftj)>$g9B@!R1<n1Z0!ZgABs+Gw~Q@= zs$V6{%Fn4h!;F?S_C%|E_)1@({aW5Z0b`xLDwwewU9tR_!bGI{B7I0XEpJ)<k~G_; zNG1%Y+;N_R#v#p1^C&h#GzFuaMdJ!k=bB|lLD62?oZV^&$ne#qm8@92&BtLFtYO1^ zZ596U!zn{}Gd;l^!|ErQzQCy^aP37b50MZwrC3l|qRd)igGG#5TyKnDgbZVeGssp9 z)<+G|lG3~Ov2+2j;0T<}0=Ny!0%)>?NdiBQ%CQnLxxl12183H@vz-_N$zO5^I)bwe z^$zgto4o*+?~=&bM_jNhUr?}zQID@&j{l$r0A4AMh7Q&ry)@J1u}$oG6Qq?>VdrsW zXt(d}|HujKM%tv}iUgL(M#v2N%0$9p{iD{#SJ<LdrqR5!Oa<h0IDR6?2|%a5fQZ$R z@QZi7m2YR|O@A4E#J7Edr)-t~<VKGljkoa~dt$roXw#Ye_x3*C+kAUE=sX_VS;F=H z=%dHAoI>wqecCmCJ@mqd)Rtz>td=-<ve}3311hM2kzpM6ASgbyx}8lG-v$>RG+DJ6 zcfJRNoXnhZmbXdNLwxgOhLB0If<dZK7A1vrT%z!B`1e@#-UWidZU^V8DV<5Zaa9GP zz6qdF0g4?ME?xHFSxb*<?@ABSgjB(@%rfTR<#IXS^~a82;VUQ2m|1bj3s%0-Y%|N` zYOF(k&wafli7my^QP8lB#<n76u0A9eCu}ro(BG2SS0@P&QqNXcvLMfC*_;nB%Zzb` zg17|VS2nN~FK~g{g7t{pGA)&lSn^*el$z8m;!rA1&<7B+7{er0bU+k9`+;awf&MZC zN)5NpD|nQGSzsv<aT3(~>@^<&mPOGTNweaK&QTBpm92r;GL?0xM10l(M=|)8@=QA0 zx01Qgh{`Vh1{qp=*&ZWZ=x~vhOlW(pV-fj+c$OPA6{avz;DOA5uK+Jag+@h*l=OWA zdF31iBEh+uP<~up1aD$;MG71XmyO7TkeDdZ5uXT&@^=iO)C4I&0DXX2n=qNL_^0|5 zr0u-B^mgz<Hx5a1WekoWDuNn{Gprn<3^Pe8(d$*s6j9kZ2LM2_h*6G2Hg{`}&W$T+ zd7MIULHPy-<V68LfdHNbmiz*U6O#f{4xytLKx?y9iwE8rmGnRawOf|7Tx>@v^n#Pq zUtV-XTV@S3v~9!CQ2bV1di|dB^2^xlnAObjyIy8eTRb?-?!ja{Qb<572=TXviGex7 z(&Gy41bA)%<^*hM&WwJLRM%qW0^1xrQZ8^9n2>Da#gE)In+=<%{lk#yfa-(W#&oo# zNWx4n-?r@n(MCZw$=g_Sj(1;2eK$|uYQQ&%=-YLP7pcV<hQ5EfclUaWCwb#R_R0LU z?JO=nuM?+Gh7OHAqj~f^<Y`!(cr4*uNGO}Onb$L%0W_}~&4@%P%!a3rO+$kxs(?BV zAy@+N`^_7IpL==0N-6H$>s_6lgtM<JUTO3)7L98*^@`zP(L{!H4#8DdHqaK3ZQeF+ zpb`7D3FcPWT^`y@PR!n4=>gYIHK{-Ff$1>KdXG4?Ohkt|Md++_%?d0D$q{<4{CSK0 zZ62yN`^p5%Ebt+!*aKHb<dGhe33ykgz|6tA&{BldEJSl-qD%lw1lmCCu6G3u0F5`r zlTWRq2sWlPSTOpVAl~>T5nMHXGWrfmlTe`*Sdtp^i0@pL6-a@VvP^Jljzf$QO9l{| z%qL;g#44anMoXi?2mwSVotr_q9GP)9MgZ8ADV90}%KV)Ax|~_fWjF?q3ZU!(ZCU|9 z9jabMh~2laRtO1Q#Q1slEZ~$XAO!3+Yn2iG(U3$D6sw+IVIqSz99T-4#8oh3d@w`W z!$gBY$SEs_Holw@TjbQn7Y4ww_zQXw3Sc!vC?=|c5+7TUR5nyq*$Ar%8O{eq5JFXD z3Ne%lwegN#sT^YmdZ|!4F&#K@EP`6TA2maU0Q`CuXzPkK{}hkzFC$EBL}Md-aOE3X zfr(@<CxustlTnvwONcuO1Ic6uJ>+6vhQh<nvNjdYP(f2ngt;=_IPFQs?}_E{=vY4V zHug3O*c<c2%!TCU^Q7wZt;GXOqd(#jJUDr6N@Avt_BbN-NFJ|7H!L3GX`!$En0FIj z)^EI@Q(CZhFO8O$Pj$-;L`ssLQuDiRi%Qb#>zKu51MUVX|K!j+`I6vj&G8pLvhKaL zxCifJ!>G4wm=dANXq^^i3EEL(7d&~RV43P)Nv0o&C;OzFWQl<Y0d5L%pgZ0Vv2TtO zIxGcqN0bxHecL%?n<1t)nC4u!q!fWDp$gS;z<RQ@y+~$lAcky8*d#IwL4rM1ocjKJ zMlkGZHQjP~>r#}t8Qs(!nR5(*pg_-Lo=~6GhRw2OHJkzeX+3TAlcY>XlTW{GT10%! ztY{i;bv-2=-c+;;;1ruN_VK0+O_%Ml%2ExCoZ;Ybp4nkI->j)}$^;fN&!oZ^Qt^Kn zrRi!zYM2l}(WHriWc@`91)u<2B-Jexg5PL#Brd{1<UlI0!~8YvJZTm#4;(6x;l_tg z(C7fddTLb5R7g{*j`$~pDU?SBfEyTc&?=2lxu+9Y1){CM^pJnir=(+ZbRCnYb%E9D zREAIhsPwK7(a;owymmGDS<**(yd1)!b(|TbI<lXM5d}LZH9d~x(9r$`n08?#7~nf$ zsf@&e?jVt|5rqi|yx0Y6_3{V=n?hh+s<#oMSA79GD=Uzg>dZl2q~O>mZwJTY=MVsZ zAOb-CB<q7>HbN2Y_aw7b1;8eWS~hT~J@nRJ3k!t<2X!lv2jYArF+&|rLuP?{5;Js0 z>V_#DM3EDm$l2#>rf*E+6*J$oy|u8Tn{8tI*>e_U_eU>`sENM7m(Um31WIvcq7=g6 z7)+moS>hL@UhwEc*Z`ITQceFf79F|tzcy)KG7gXbT5MfC*y@vyT<S6ZOIa(<-|m`M zOf~cd+R^qhWIR2os=j^U!<R#BJ`VTt?iH|Ngw}>k;zvgrr?+AuV1w?2<GqXQ>!qzd zOJ-NtsQ7n6ac6T!4Wd6p*;EOHW!lp2!{SuZZ)U=ESPtYa7~5$2&{)Y8>O`H`68<bk z0f)4*7i{!<vD!(EjT#8XoA5D4@K6n6zlK>w0Zjb?48bmiC^hz4sWXu>V--2o^AvtM z!|vVe^_pEi^vcp+;<!<0_nF|nQ;GlUau6%k_kq7};dA3Om6l$#4Hwt1y8i1~_gX)* zSFTgn)*{@pvpU?%!EN~HCZhoTL-0H+6MYlXbnR~%-8a$TUD(PYa(=442vWf6LeAVe zG69?mZ^0yYtVdmcD#S-ni~)d{#X@+V9yb`=fDV}Q)3-qkEc_nHgGf-T2zEgz^^h9) zWj%tH^7fX25K<HQWIddSREZUufp93t+{1N4W9dvQf=~sdswEP~eJ~m$xVmR7s-P6k z!$lzDOc*vpK3k;$8wGSE(_I_=|3nH9RrNpRq3%I>(B6K#PWd1=l>H}_^6-5S9Xi~+ zJzc#$OZl=`QaoYCP#r3kOjd0cK1ecLl9`zwO3eXBD<V*|71{ic=$Y^%2%9WL0T0eo zt`Ihj5Ptv?gr$nz1cHa?V37~W*RVhmAF7zhF~C>`Usc&x*<eH*4-mV4K|n`AxS+GR z!+K$IpsELD4>gsmQxG^(YZb<vLg{D=9Uw%pG9+*I!v+99O@vh~ZK-~;<oDL~8l@sN zb_u`rimI*J<oBBHeCqhK>em`rD~8PZ%dqxYI6>hr_|Bd3(z{mr<4Z=M6$p_(GKJzo z;m-giGRt(ha2}>GQxot^Uqpo71Hr<Q?>aV7-o29C;VxsJulhI5&|^DGG1EUn!~J2G z-GM%x{_V3bGRL`1>Acm0?4npblj^=Z+u)5KI*j!Np6-X32bp^iS~@*g4n;ns8(jtq zU!(WmZ&ESQ(6&up+Cf{l>i1aDTcOE|I!-QRVdEUGPQj3|TAaspj~vk5$Os%m*+*}J z3WtquY*|{c!weOPM@#|F<ih9)LLkL%4Jz3WgM%-1k1;hMvAI?!lnC2EX>2WfAZZ0? zjqSp_6;e)XWQqm?AOw!ZwtH<i#lB|}#DB_|+pG-?pTGJ-z(8~Eb5(cz#9HJ{G5(<F z60zC+WCe>>e|1Ap(f4a2GWc`oxIa<T%g3-(KkCSM!_X};wzQn%b%?OWdxe4`l{U<_ z*bf(-v>Sh21KGeU?H7a5a6Omo?&rpeZA;F)Nd<;o5sF-&<p$WZ_(Jvd6(B6&TDxpD zufi(j0Jj2&O-~zFD0|uyPD<OUM<8BD?2rQGHAZ~6LW3_;A~Pn6$r~Etx2@BR66BW+ z3CB?PvX9E>xQ#RX-FP-{AYX`#_!b@hQhi8sHb`U_<g3rHkZd}uw@^ZvT}U3@;WI6! z5(T$sDVzoHX8NTV?-;X0G)?vc1b87;;qp6=!ug2-VF!c@6!IbXR)q>=G}<O$7M3hN zkR#&HpBd*&Jv}F*NT@L-*pkCfUaMyZ!dd_+^bwczg?z8*p|*0t<^TwA(h6e|p_ow> z4mbeQC>N5P-$rXyQK%IAI<{+uzz_@pzy@&s-4t7*U5Nm>z3)&2w$dozzExHu+UjI^ zI_%(l^WU05bvCxktn^)Q&5EBA{-Qc3L2yP#t)`;O2NN^}UV?6zii<J}fiI*ib=Df7 zh&w^pBU@!ufyF_A)6NXffQ0GR)lHy^ZeK5}+LOH6OHma4p0V%O&GzC0x7`b*G-b0d z?2YG!pTYb0&*FOrp7Hh*X3I}z-9>e~b}bpsJ~k%Q7VVM+U!LpW)7pjyr9LGaf>_yI zG|~R96wXZAg?zw^G@Ft;O}kjSQI`XoMh>umJnP(vi^M>(9RL2MDQPQ@DXS<m5gaim zlZ`7zul}R$Bj>_-UWmZ+F0y1MI5D7Im52B6;U>p%NG*DI%7}@2r^1*o2#8|vJVS$8 zsO%+@ZDHJalr_wG6olak1J+ssYOly`Uw3%4Tk;PPgT-h$_UdgKJvgLfGx7)TT=^Oj ziH@@)N83URW91QNxG<7p=WcDT>&y(@3STDkWn&AMWM=9Gl)s6Z2gikBybAxRNYfwL zumlcGJqmMH*^1-$i8z8x9L4Qxi?f^^PFAd<cv(R^2g-PLsnMi^6Ez=UN{iS63YG?3 zW>E0qf?|1_jJGRGW^>80&Ot0#jw5FALtKdL7l3w=6aZIjca2w<>A@obC8VU}Eu5mS zoD&yPXmD<97x4-8Bh7ANRG~Q#^y9EP;#`DF6zG*iS0RfjCSvtLx^k&K6;kZ6z6hUm zRR`_3b&66m0(As{6}cD<ZIgk50MTv{lwC4ZEQyjFvJi4vHRZ^Nww)@QgPet9;$X-p z-$bVx09?2c0Fi-|7O;Sqhyx24WP7itmPoPS$wfuBO%Zq@kBrHpu&OH@Kpji~08ZT8 zjexKKrm#H03x6P=7xd;PYzKdjmJmhu%f>V8#L*WdmarmiM#VcV!0mfKef^OJoo&px z+yBxS=Oci4{e@ylGuG1d89x)g_+0PC+w<n@h%nx{c%&E$;|z8~k}-WU`3g&x3Ibog z9J>~5P?8F!z>J8P>QqrjJY3N1Q+23ngK?=ZNiPfF4?sjQKGj=IvA`d*WQ~kzJM8*> zt=O+-*H8N0+(VG6O-xnkOvv!DkCUDHg^x?euIbUC7+$4f%lUK0vU%60Huqw_#ya`a z$4zME6Z565o^NTl;~e9iQX`g)C)a~nWr+luJZkEkI^Su=apRlhoq6}^`})w1?z}2a z?t-HBPwe@d$qNL+_!IZjxgAWN+2QFjUnq_Q%jqtWiL~yR{q8L1R#)WUN%Y3)wZ+L5 zAU6cOviB60h2^9YiPncWgQ(k(%qtx1EPHN4>PCmWb$$d`Awg5}t7bz-EPk-#JYiA0 z5FBd$fU=}(0wKHz(H^l|rk@2ni6@<fd@NPA=-sJt!Js@>y5Jr44_2xE@hr0{hDbI0 zakj%6SlwfMa~Yk>&!*vF6g<LG5;*~k_Pk35<n9{m)Z&mnM+mzUc4kHDyicxmx>#uq zECNdHDO32k!i{BcM->kMYl2OHO^6Ur{J?+}f}InwMPYHgFV^Gu%sOyP0WOz`w2lQ+ z0~{x9mo1ERg0h9JWSEWl0F$X+#+s!~&<Bl+o^t}xQgOlH<xs)|e4SsjNLb-)VH^NR zjAb<55TAvLpCvzJI523NX%q8i>EM`ggoLqWCqnt>o{=akFaW}_u~lOSz&KL{WjJs! ztL4KML=Q;F4+f`drwy2cS5a(f5s8CQ?I>&zH5?p^hXbJnKD?a(5D6-1ArwBq);h2< zz$ow&13mzL`KjARG}nN7m`pJ<z)pfk-#X!fM!Hh&0)C4&DU4k6NiWgn84Whi4!bNi ztOiV`!`FHrWsQB07Qt7s=MmR?c=)*D$|+gif+R#O@p}|gIbiw90Wtzu$ui(DMNkXU z>E>rzbw9_wMeJ1fK*(2Fx&8WIwF70r`|sGgLYp=24La^Dlon>hS`S(SMM-3hr*+pU zThF|E-g-8?GjHwfVUUjUF)@u`ZZkU4^}_yRwDs$qI5g}oibdjhH0w~k9cA4!^^!|N z3NLpzP*-rK1nI9w!aF%dih>G~?}zuJc;P(^jhJGOvMfKR*H>Hgjtvd5Go}422EUQP zpz;<;=W<WqkIrfe>EA_&F4q7xFd2V+25m>{Wu?1o-f}CriRpIKld`kk=Kd`^@xU(u z+P7oP`mI_|yC{rO?`eW-V5_#53{?|N%)?QH=Fl&#&ARRM=Bo0B<?QqZ5#&RR9L?h< zk0h+0O<X@}n8}h77NNj5ndFl6qmQvqmw<h59`WORrOQtFbkrBfqzY0Q00I%U<uPe3 zvWg2)nJmd!<x@${qDh`WJWLn@C*PDUow|LFlNOY~qhZ&775>bphj9dJqPBuTC7dxT z4PO~Yz&C2Yf%SvVQ!Lu5SoXNsF{?G(iFI)WEK+GO4iuP_?Oc2e1N9QhD$3UKu#wG9 z<Y}viCQ{;i6N9xCdulG*8Bs==L+;A_KwH2j&oPKYv6_-8%18lH^4XR{m66(Y*QO{M zpv<2WHu8~vau*+`y4VVRQfpb!iNr!dlYrg;AWI1XmI#%#l2%*+z>z4$9AcmZ0*Ft6 z!SK_<thuE^L~Ey%WdMB-KV**J711V<|34Sy%g_`Xo7tWzGV2dk)A3j_z&)zyLkYXr z_6Lu-^~!mMVpuJ%mzE#;CtZv^C=9ZGkA965^^XrM{KzPa|3i6{MS?L|<AgzrF$L}; zTP4a90aWZWg8=4xXOfVQ5Os7Y-qKX-etp%=2|{Saj}zfk{G4%V`9SvH+E{G<ZSo%8 zX+i`$(jS+CuilQdFsG1+UjH+B^79mt$=l&g?5B$J5MZI_<GS5`;lK5|;|=ATF`1`q zy(WA?^t3o;L4*5Y_!=5zB6hVMlsz$u`+rEhJ)ghaEpmR-!D3`U$n#V@q<1B$La@yr z!b^gyu3{~7PtwNt$<<o^cQ{mCZuqAxv0;pC{O6{k-B3nu$7{p30<@{vS=+j|KD2MD zkbG_modochl!;(EquSCIhc`3hv|J<Xt)|H|w<j5K@QfnEh+I<)D4XhtR%jtDD3~GO zm@x(l!66ZD|4Qd8|5*E<_Oh<X-Qd(43&WS4ZzQFcWGbb+z+(VG$)y@YRR6meZb98y zw253lgX17>P@g+1It9B!ZF|aCnZ#Fu`sx<Xs7$q*kc2DWMm-^podk*@U>C04K|+;v z(D)LHbt-gGIVG_|DL}y=Fvbc<uWB309Rg!#1mdvz=shF})hp<*)ZvZJA=tQh(&XjL zi;Q8eN`$w^+!V~E{EX_JBJx!Vtd+W9$eeyoTYTcDjwNlT=87GZX;|`oY-+2i-UPb3 zI7LoI{8TJ4E01cp`7j-0!q~FQ5+#X~!Sugw7hSpJDsU!v^mP>7P>C0>;^1HeiKyRB zI7)X6K^`(i);tGK<>yeO(qyr=i$<!Hno^BH7e}gmD*lcp%2Tn4<pC!1r7F;BsBi>~ zg|jA$B~;}*uuaCe@ck7L1f}qeR3E^!&`Cv(EDq#@>-2m|yQM?XnFCG^J=u3>pvt$e zEPXRU1$*9+t*mlfeP{tDOi5Dqqua(W`2C-G9+Qzz-KmZf3COBzdrVyO?vW*g>dXd; zIvf#t8w~K9+xzeLr7r5_HvZO`PgVM2i6L!BQKv~RJ4iGe`IJ$_dcxtk5}w3RbGkn1 z<%VGT{kdUP$^$@{+xagelZmN@LIJ96&!c{mG|=T!t<|~s<-Ok1Q>C=eg=fjZ$2(ND zBbrt+wH=i{1AHmU(o;tSWnL7NUcb#4uU;wg+qwGb4~3S#<g%0>gWx*)G)}4AGdmSu zdT|VtQ2+^loG6!pOq5CAI;YO5w8_m{WIg^AO8IBIffaVqWbH^9poOipx!(7N^wXWQ zk-&8lZ>jnHbIGEf-+H^~5Vu})w2Rwm<qyas+SJ0F`IO*@@B<4qBW?=3l$T=x_OY@B zY53y499DqdtR~!3MSVci>4Uoh$3!+*Sw2AYT~DI${`5PlTS|*CA|Chf!Pd79hr&-{ zuD<@ro&;h=#c<m13=RhE+LIi42Tn~f8qg#843Gb4Ql%;PT>bt;{D*XxQlkVfUZ!1- zt~uATJC(3Vfu@g~aSX|UdH0sP^Ly^%dJdP2wlh=W*{xm^u=vm4I9;&J2<lBNl71t3 zuv$a(UJ&<5eQu6MT>0WAG6tXZob1<^xF5DR_o_e5zrOn%e?9g$<Vd*2^Ytd)Le*fK zvV-oFys$uVb|-mlgQ&kE4mZ;j&r4BoIB%tKs2cF^X;0a{8{-Fc8uDldXLl^^gEzX@ z`H6ox?Cg;?3SwwYYBLLc#rAcbbtd&Y9_1JPO9wr#E}a<yE(S~-Z^ddZ9^=Ra1_zro z4?%2pz?1oPilF2?m9x$Xc>(eybfF3>m&!pBNgOzze(6wWdV}P@9MA6mX%6onG>1O6 zx?Qr&j0Xh9#DnGG{=Vx!+C%Jp=kIU5ekOff9WsSq&2Mol+YYF{@{JUIG`8=4yZ)VP z;<-830`b`v*87#<bw5L6`*)RQyvtR-j&{`pf0)*-Jg-vn$}N%>7U|zi93>e;UV?Hy zQoFfED=k&!r`|JPP|Kw?Aw%&}w7jNnr@fg~oByrOjlgL{0&xkS^~^^BB10C3?b7Hp z&jRzKN92y7>BH`MF)Q-40Qy^X5&+hGal@I8$qd<LoKo%$aaQC6$>Wb5*$LO{O6nd0 ze=a6u&-#L{D(+&bzb{TjNYV4k^bEZ4v$VU?d*KjMSu*9)x;N`?Z&%2|axvU3Sn*5# zDerq4dQpowM#gcEl!CIhb=w8sG<1{ilZET&x*WppSJM}V9tXF7z77oQJEth#HOyyD zzrTx>8`u-rRl)-40aEYQKW+oahX!mqRELWi>t7{&;=N)D9>y^DO>zG)dL1L>ZP0G` zUd;NlP~U7uM_2H3Ki+XKa7uM6c;owwU+c4f!zX1S!yojV>lfcCk1i{kHI^pT@))PU z)c!?GWw*X>-YPC{u^&u|-A8Ie=UppIX=}25JEA>;X6sIh9**sVRzbn@Ic9(&LPlEd zY_mKPT?LT1!San<?U2EiTPF#jXnbvjt^Q;S&&i$TYx7q_iZ!Q}F^97Pis;qY%$2A6 zNng&FuiQSC8h(!_Bbt^w%`e=)9bKB-+Jpxd3r7g`1mnfueMg8&)SumRKwcWmpIZ>m zkuS=;5z8Dw4-Ky}@r*t&wv8g1%NOn}<?Mb{2p}BD$;lE+o76*_n@;%9{E$Rc?XtTh z$%4GgdHu=x%j6+C@nt-fjX9lDF}7K~NHv1%*H*QgFMbkWt#*X<{#zUWxICW#D!Uu8 z+wA-6{-m|8dBs!IILPa!nTRB<iOS*T?s~eeeF>kP`wKlGVQ27*Ppn7<j|1n;B>8Xc z=_yn&aau$XD{jVHmw_m~6zjepDLl8$1_JbaeBZ4SX4}thvZR!WZu)06vz(vv{qBxQ zr@q>JQW7)nIK`}o`UMoEr@uN5s!qHc_2VlNPp)?p8_9pFKN)(u5%F!g13~7JBHY<b z=cR_&6`#+JS~<yoRe<X6WHmz27nY8XTm})VR3POnB=6~_KvEf2>?MBhR;>~F=MOks zh*Vbn#I2<egH`zb_(9U*T3A{p$&nI6JNM2x-p8NS)YEZ@Qi{*M9*)nYoMnmwaQQ-i zMp>!x#nAIV605Hu$VdlpO^H0G6i8DcqX^X<WxNt*JEg*@8ZGvl_tVtpjLu`%Cw%?d zr?DEW>!3QgV95(YhSayO5w9dtZlX99tL(#)4_^IZPoPVOsY)-{-|n$03}D^8&u=Ag zR~DVo<0!QbT(Zo4;En`ES_aPlV4guFV*0BN=V-1{*Q(?8<9capo#pZ8U<+%sCFz(n zPen;y@yR+k5#1G@zn`l*lRl8ii!LC=_`t6he@3IU4`o1ZB7n?+F5D+h;_VUPoi;|x zD2MJ?u{sj40;z;7x-x!kJDRu+hO83pdD_Yr=!97+n#l^Iu&jLnJ?CWgz%Mt&7vQ}> zmAsHa$M5^AK&R(TQ(y)iWx>m@@jlT3JB8+Xg%VHmgL5v4#S`+Znw+v%SeThi+OLI_ z_;Uq)zzGSMSTF<LuW#6p9zQ@}CjgM}NawRa&B#|Y)(QE>o#cqC)zy_3HjOEMXA39l zZBHT(EduvS1P(#qa#&pgENNP7;IeY~i~vB(OL~=47gfaSh)&bHO*QE+AODfRdc5(G zj~C<=)RMlH{=T6F=3~hm*39aFH_!q8Exdhte^Ns+98n14=dw}%p?J?%vAt$+dc=uq zl_yQ&lwU4m#C0uyt!&9WvAE#p^zZ@$J=tZkqH?!0r7)-<tP2w7s)bdC@#hbn_C@;J zP@;LKLbgx-+`f`M&PWOLI5mHB-);1{li~iSkCiH=$&pf?=fy4_=)F}*#D)DN(EweE zEVd-s`fj#8G?dBShGDjFcSLV-Plrrs?DdoIqszpM7kHwIly%MA301>?P`Q5$jT43@ zP)Q-RMG5pV;^#6Eu}!Y<H@#(2{|~xAMZd>om;@lr+dulcI^=kV)FO}!``wT=#@GZn z;Xr@VEvrUrF|R*xk1XV2T3V^S;~BIfB$67MO!`7$U);obDOy+2Cj&sBpTk?`3>a1i z0-n^-E(z`_t1?JR^8J@C4sjVkjA?d>l4{SYE(ge6hl;H4PL6<vwxfwh6Dop^UI}{# zSGTpWIXk-W+^GXy`ov7d=I`y%{q*}A=qM&ZD1~f<e#3BWgm7ICRH)tRbL(M|@lSG} z5cI@bpl$OKC@<lZpQuH&7kADsQ8t?!APj;;s17%G{&Ov2b$^}#V*u7}%56?iPC-si z22fLHPy`j&9HZ-bK3NzhhjbO3q7{Z@vPA-Jo;3N+j^{HHkZ!R>X-RKZ$taSvg|;9y z0s#K^)A$5w{DiDAI0Y;`{z|q%Ha=94LkSo?^d5UQ>Fas@r7(A^#VezhncKSUZGFtl zG~auOn4pP;2>Xc@`5GfTJFrb#l@aZz13lO79-aQmj~YSZec-ht>_p`8`nVT{h1?%j zjvjLFNb!+vkr6qi4@$ZCWAKv%8_-FFo<P)i0-dW5EGXa!09b3+MC-E?AP4XSLn+~j z3n4%NK*@fB?pgj450|_YC#00_d5t@UQR$0>x8czlltAl|#&YMs)UfOg+|G>H1kG=< zRYhHc>Am2&p0ae9ap0NqyxsceFZ#2+(`${?Lc8rq%MlzDUiUAUYwK4Ixv!rC>i6)I z&2{rST86*dJiY57`pP|DIf7{&FEkEw>+O@+>pj=oOo}69pStPdLu1^{>=9^H=@|I+ zLv~4Vjre};-%u2$B$L@yL@4d}Bie4)i*ms<BVu}+@J?JFbfpnpmMsO9vws(gFz%V2 zk%XT4Wzz8k9|+kv)rNB2YBF9jw!YXLkUHdte$>ELgjC|J?FNt|jjWLLUyqTeXPK4A zz*FDN9*<FYWQhIaD8^R>I#3J9u-YbWwT&MiAx1KFgCe;9z&>0CNdmZyR5`)NZHn$^ zuBT7>yV~}s@iVFe8XbXF*Z-%SvWHA;WswnUXIvXP@(*hQ&*BUz>V9F(Tm;$25di=a zd})avxO0r;oEK)lKm$Di6+BRNy?FJDi-}YylaRvzZKQ~q>cAk|{$2D6;#Nz0I!+Gm zTStz1+=`K&I5^m3BRDw@BGvZhs%uu1BEP)=DH`skEO<NTmClPVGI4%BGGJz+ch?4@ z#~HAv&MiGiqAFd`4z=*B#1exW*{LBUWz7Tg)y|!}M<?%4(#$3iqHs=~Kjqo+j&NmS z)WX2>xf-*&Gg?g)DrSOA1qzX90f0OKY+m?t;vBOfdJTtPbRqIr%>ilsSQPXy3LZa9 zv&_||7Cw3x){Z>pCaSVdR0~UvjMDJ#MVVbD5r%Dx)(08!96&4szz(vLMa@7m7$~K* zXhH=TXaXR$o&o?Y&2|!WSf&HmNOA}!0RWs9JiBa%kMrke`nV_=&)D13kdl@UeU2kl zD0`%+H8F&`)V=y4;QQWI=;}ycqRlsd`{6g!ox&ZesfkhDJJ1rpc$#q*g%;eO%rUaL zE!W^o-an69Aum@8<3O+ZZe`#(qq6bJF=ggnGN;xz9bX_~Sx{+N?{(3|B6`Z6aPcaU z9tH;gIh#3-&B@EXvQ|}#>O<b7mZpKU4bb!{bBI5Axaj5%ueo#J^W&)20r*!p(hJ4O z7*~@m7y&3>$XQ-Zw`1ae;M5;B&6Ti#t;OZpjsW*ed=Y}hJ94g}l#S*M2aopp*RCs( zDh^uR)`8or6jwK{isN-6S6xmI$=iqJ72JRwD30=e=z(Z;em|#Ee|q%}_j5#lhWY!x zA~X?Qs4N!r$4>GBYt5*g{qTIy@@+RG?h)5)N1)1Z-mva_%Bio@yx3T`lP*>OgnN@_ z)wMx!JAOW{C)ohqy*v&ICsf-vT+>j~6)!TuNcUA|ZP#Tc;i-_b_E}OHVi~@=Ys0AH z<rei60U(#lshq<Yr8pXCIl%<xVeVk38`vx6@XZ3ZE^eBRAm-MJf^x>GukcEgkL_%+ zHoI3--p=V-e})LA`9p8)TR--BX)nzL=~|_^Y^`s$BtNsc5f`{uG|=L;gbnN84hca4 z2+n>vDGGN^9_SsBo*tBCNmNqsDo?AI7tpX!4|Ih}lPYNy7l%1wPY8CQs|yxTjLO*9 z-EqYCv%%P6oC$vkuxAB+_)Gqjd=OR>ELH+@yufsQ;DGT>w9HsbjYF*NjX3A%Mvlqw z2w{_U<WxM~Lju<rmRUfj0R}L<0!nVdP^u5GRRE=Q36u&@fp|rDNWmlk0AZn|+9NWb zPm&KEcBQ|xdTmo*Xd;6-%Efl6+^R7&Cv)&rT{d|}bicQsRRgA-EbA>4C_8hZ#F}3S z!Z5qxk@ffQ7YwZ9-N*4&pvW&9UHn?gwfM{c33Uw3ipVPP@6md`P?(F5gb7;FOL(@$ z{J~Oo9}ZtmAw?Sj+*szaK`fhInuiNrZ{!u+@XAG}5ig3$t`J1*_pWUz9>-t&<$Rl} zLnE2GIj9VVjua^w_(?!i!Ghz(x4E(PGsp!E^NxC>aPHPLSy1d8jc_#<jH3n?1%O(D zF!}A}3+Vm*Tg2`D+BzJoGNg62<!5+D)JWCCoJ12kCT$xQD_^f9i7oI{%_We{v7`44 zpF>;lx#!~7)cb-6O7a-l+@dqfKYg}oXG$i{r>#@N45nw1M&?0-7wT=!aFM#}hhIy@ z>9T>Y6@nVxxo1XKm-h3KvE8rf5k~s5f8BPwa9c$|l}EP}Cmb`b0Q$_>z3)q(6rc4j zF1Cta#*($?AoiF?fTTa&Y!sKrAcssMz|hvC$cKIZ(Eg>iAzdm$iF$OWd)>(EyQIDv zt}8Dl(u;stMtRJQ!u0FrN~3QJD`H_Q{?!Lf#$}z+%Af0<3ltPeCE9(60kTO7#v=LX z|7kxXtbRdkre_rxGPkCbk^lT=Ayp$}bxT`ckOHb^QHstZWytC^NL5aM;jwrIaBrYJ zu3kVu2)~REB|gThipC&Q3U9}ngp|BnI#V6!rR{eU8=c|w03^T?0Nw`__#AN~dJQZ@ z0;@h^4~SI(<A;p!im>c?K6jh-{w%cA3knBwdhSp-SSDk9tc7hWDa;Pr)CbQ$Ih3*h zWWFN|BWy|S0Z_q5YcO;SwgN@PLfr;nOYUq9w)z7$yN5Fa08n{)r&4?0aT0IVBTTdI zR}KAZnTqDOb84C%Ow?;)j!g(-#>ITStTg{vWxJ66l9~tC%k2j>+_=sNZ+M^R*B@$Y z9$GfGu@z>nmpt%7w4HxYdi;f=0K<-hW|R5;{d6<T-&Raz$1#cexOS{zPbG0J(`Yyh z=*9CQsqt`C3=ABA^^j+asRcys?Z?dqjFI1@EGv68YqQ73PiJRS00BVODF6Tf004<p z006K7004Mbth^Kdn*aZc|Nol*|B3(qo&W!1|Nlau@;97ej|T$E@rCg63I{;WYafjO z4lD?u=m5&rdF)p+@2XNN`088Yup(_JkHo4U8{$b{_E9fJxIVd>2XX$Xmd!}lJ_LvI zm#HjR^#fIJs8_6guY^RK$Zo1dSo<!cCd;8!EZKMS@}vxobhnTExUOnOdSdtcC!X$6 zr+%#U5h8Od#b$4p^f{*}$kAFvwcB>S8Eu==&)>!(*;(hHy@1LNw<+3J-}7o!Mbr^w z(}cY)J)6TjxQPLBB_31ulQIOSTW*)bWP%`h`nvF&&Mr^^DsX~>8st;+eE(Iq1c&9d zzaG1J9GEG1M_lXxt`1xAe4ir>aIQsFRo9)4_nmPE#i~b7+~?mj-9sAVbL%2wQQq3G zk)-(8(bnqDQW)4^xp;*DGM}#{WmJ;cScZPwLs(B1i}Stf-y)I&?QnkrT3+vN`mMYx zvJhnAW3AL6YGyG!q!7X`#x={ctwt@BOg?t5(O%PQBpFF7rX2xv70NFsL1RdD8dquS z>jK#lV8Ok(kd#6V&V{%+0}5b9#9#v+_|xVRdoWfLtUU&uyCz)-4p=_8#CT4ZeV&o? z(R0?{V;^aU>J`@*i*5=3+OK=8-Xmof>&{@N`B-BXzlAb@G`yC|g3jWv14;)&1w$!S z6^JZbeyu_&*42Ya5&)pxQhCf9d$51W#_1Ic$8M^}yU)Cy&~E`@8+xbObkHdBl=(6c z<(#+PwM7Pw-M&2@VXhYKOJ2t08jqIs|FC$B{7n-Ielfwr2=<{NhyNWILX2__jMta9 zt4GItHdMIIF1V)5#}tmSbiR>8jRG6{+*QI&rKAMY{n;A4r591($14Xh8R*(KEsVdU zsZ~GhntaNz?-|$w)Ba$EtZkCuihni52rZSI9DpcbzzPm<6*nbAr_wNp4Z^deUdnON z_3Msm%_=@|9-K)uCq7?jEa7?9<LKiLRjy5T>|d>s@nTJP=z7$CbNHIQllb<^LN(D# zU1Zovesp(g#VV|{QURf8kG~r2q&yX8TuQfawTL&5TdE_on{DnYy*5@HTXS`D<K?}v z{^A+~8b6<?j9XuzC($f?P3x9q&%rS3PI@uloA7_=a9FyX5|D<3zrCLEoXS6rOnx>1 zR8Rl6inhm#6cF0|M1mTPz?P?eqb_shHazQ|#cG*lLzMP2?0C{g9Y@2lrX1?=2ifdu zk=R^_P%B&yR&&}V;P8^uz2VcieLb^^>A$x6!HnKZ|HO2EJYDl#@4Cq4obmO~*~t%o z&-qS1sgnU8tkL&4u5JAaYIGg{$tLg0k8Xh@DuQc`ic@^FJ-JlTcy5%_rKG{a9I5${ zbpL0<<LU0v5Um5=xu7aTRw)I)cSzvQUygjn6VTG^hDiL=%ed0&XYU#jq-}x(e)x0d z8v7zCOPDPiiBX;-E~E8|>fn|cKkQ)*TTaE%uLqt{tL?puM9nT76l%S%(btFC?m6CT zg`rSjaM12Dtd#@r>JoAZ1DKBvhVTItI+>EOKml}s^(41!O^idJ^Z>LZurzC1CcuV` z$Wkx^08rWtx8GbcJ``7qi2NAUJuG^AjfXB2jjc^F6;VHbJi9dt*Eo+2$Hn8$Eq?1Z zQoA}>t%3hbf<wAM#qg`}zQE4anm?$tj?OKW4r@D&HXa@40;Vj$5GMth8i2gYsHDlK z9vTl1g0dN~^T{hEf?3~!#|`$f*`%@YSC(qFakz)s`)?ONaLC0)|D|)UMJ?HJ2_C&$ zQ)CJa{-SDBL}p3i|FfvhgPI7Xa9hq9+Iw6r9H&_VRHGaPlJ7{ZQ2R?{LHH#M!GRiT z=X?iJ9h+94EIMojJEU0m-d<L|YX#nP_J1p#4$eOhey>koRtkY+2+HUc^`&*N)lGfO zU2$Lc!ZL`y=Gu-<SzIT6H)Q>c8?9{OYd2QL#}|=3w!Le<VExK44Xx~py_<TN_Z{i# z5LCOmu!~C?bgUI--4g_EC@lcF?uk3^emchH(5#AscTaI;j5hVs%rk^OQ-VnCNDnp9 zJ$-d+p*<qZtot`1n5N71&3k-NQf%$7qzuBGtjVdTY|e{+TKwY*l)}BPrssE0sJ6Lv zYRQ9S$CU8r9SX<r@sq6AJGe=nIfl{t98*1f@)wQ%tj2`hO_V=kdw!01s|mGyQ2Ako zD=%9bEXCf!dJBhOvQve6)QFm*1l5j7#$~oBvVlsNgbeJ0o)-X~!?r+XUZQZ$S_GlQ zru@EcD{{_SYS+332IdiEBS@cv7Z_V(zcD5X)lQfInv4$sKKP5`NZO7nrAj%gUP&y? zIr3n3ujtIOpoeI=o-7JkNEulta=&g7HKQEQr|Bp46{cz*Ji?Gy*ZX*87N##VJBZkf zFaQS-r3zpYp@BNFId=wTs(?&5RCHkW8$j47GH9+If=K`XV=Jn3bVB=9NTuc=t)-K9 zN$8>bQ<c|7mRmi(D#Cd6;;I#<tZoe}IU^sUwk(ZeJfJ-;7}W3LJ!JNxd-s0o+i&_3 zuH$IlVEs|&o;SWAmU+k1UvK2Hx%VKu8Q3IQ0$Q5{hV~iM=ITb_-MnsSY`iHWp8dvO z!)g+$pN7}}n|W^qU6eZ8OzAv;|Dy*Hm)Y2d(LZB6F!C*6^(1-Nd*MR6VnsZ#Ywn`; zU~?5`>Fqn%9J5xA9J+i8wt&=e$RSW1{!o9YtXZY}w7*FYBI+m4f!)RzU0<cdS|PE5 zm-m&XwYr^0s`>w&zJ0Ux+K7H+WwjpH?RCp;FCF$zu5SDHS!I*Tqd$0k;Ww_Ip~L4j zm-p{ZPoHNj2XLf1j?49jAsr#s^WeWo;y$>e>xEi9AC<Ea7F!|Ik@BBmgFaTA-*WE= zY2NmC@elb4xafWF23py;-<eXcd7thnBPdJ>hOB8Hv6em#!|re6=aM7BrNZ4)Hj;)8 zc~6%3K+u%&I@UGG#QH;K6+2s?i%xnd-o!#}8ZAS)mv)iy-Jf8B0CwF3N3#mwNppC~ z_NwtI^H+I6K$XmQEwP+BZkpk-kXm^Ji&lwuU_Pci@{32j=+C^wHW}DK=QmxBtRXX8 za$Qq8EFR9OIB39CCd?M179NrT!z|W&utTk}I7!^@2${Xtz<xX$F5N6)<f9T3su41i zqL&TZWB?PM`CH`?a}c{%P}QoGIEs73#q4Zjvc9QhSsu*H=yeVhRYNjuyLXo5Sj6<K zZkZ>rTa)qZLtLxP!}AHBkxUN&44D|)AQ&k?J(?K1Rf6}$$Ifq{0iaZXeGD2gVTS-i zsSB{y4m$u)N(ogJBnbdO7?)8vcr_{^u7WX#*>3}nhiEJg5_#RJ_I)Y&&MvLiv|vn@ zAP<#LM?BwP^l9$TQwA-6@7})8@VR&qdh&`c7lFC-Xvs=baU#nZjS{qE6bf5M=EDtg zzBp6-jQwhAO7k5z{AXYt_Xl^kfWq1H124n-i>lNc4WkT`sN^N(?BR2<X|bQkcPYJk z={8Ltc}W!`!6z28kIPHJD@t`aYFZ9Ziq?x??Ra$sKWDzlrIn=-!6Haq32$^@z8r#G z-EKS2qIV*k`hm&|>Jcf#=q=%u%1Iwzeo^wUtsO987<vJ}7Y>(A0)$1VtB2JgY@yUi zQt&jpqOpv%MIAC=1?+GH!okgEL3Q1m!hzaUeb0k9)?<EAabt8#dn7h$gxni%t>)<8 zt~F{q?_s|jXR|6`m2TN2?$Mu3iT+3@6E0$p0(u3b3AO@N@^L;SX2#|@dy@MW=anCF zk+sWQ-|Ao9jT-VsTj=}Ghkz)MB~P0R>4;s^Zr5$)$nUWixd*!Z;<9=?(qrQ8zu~?F z;UKiPnN_;Vet3$g6n(>$_}Uny1O<1|6558#4be?djAKeZ9b3fiu3w6k(`MY#{@mju zF{|ijs)mAX0hCq$sm_b@wrz<<wG&=A<jNHLzMQT+-D<NieeMFR1;6Lrd|K=RH7pw^ zG=Kyj#&-Vm(#@A>=zKfR@=8QAC~x|yB_k%(Y6;u@Vh(Rjhi0_jjFi~(1qJ*Ipa32? z^za<94G%*^CzHwyAMt}3i=v{FkD*!2o5*H7I#O{|0Wlyx`Kp=NyUoz96hQ-#gWNfk z+hFO?1r@hj7U(PJHZEy|9?=0>u(aSso(v#isCa=15LUJbuvt|INdf=>sZ<mnG~<^- z<}T9pWJNAtXsJuKkjxG?O!cD{Ma{=NGkV=rT>Xu9xe{-77!46hzX+<_((1Ail-a{A zd#Ybd{H|_v?&lj{?z6&@A6^;?znxX$8#-1;7`Ge*VOhlu!t^+R*#D=0iYKd`&lrd= z=qm^B<%?=D4pf^k>ImXm)^|0E>&C};H9?u&(a)$0y`?2&F6v6zM#s%%1Gb?iTq>RO zp!|8NP=uE%2&n_)gNQ+_91aI|LKrm_vIBmryt$06qLt~yFS*KQ>K4ndAOMPRL_mN# z-iez3=@usnSU{cjonpH&lEcG}e}VG79{2wK5No0j^!33H*i@gdzjVxItq5kPQU;hR z7r0!gtE)myNqpY_U<G_=jjuk|Gum=->iT+BOA-#wosB+z6^GUr>2>LK92vKRR-L$? zPX;S>3A6=|<2Gk8-2!Otb^z!C+c>+OGPliK7g^Me>dW&|U1BN<5{3*ZC%AhBhuW8p z*lR1lHW-;(E~iPVFPh6bfJg}MBJZ6wVri{v3fhK%)8xJ{zD2QW^_PMH-^kDu2=`;% z+HSW%kyK8c<|fyLmT8jZGiWcNb=;Y)ONhMUKaXa^>`Y19+V**8-YtDUKqU`jP-cl0 z{LzaVeC)zwbsF=h$~;ZEJZ=ofdY{I^AW;qg4M=q)eF-j}CuGDq;u3nmI5L^>J#iU2 zNk$u!PeI?qd5@(I=gbjS#I?yJ8hJ2&X0KbacP&N#$=VT|h9UNGxV?zpe5l;e;Y4RZ z4H~dTq|DA^tp+U3y*v;?*dRcwiHiwP^#ct4015L6DAu#-4^#`}P?ZKI0RU2T&#Qzl zktvw^kfKh_L`%;}r4ipF2Bk>Svf@^^YGUM9SW8q_!}>#)v0tHZu|ZRj!Q|?d1w#rt z{+zDDi<js%*I{n0;qX<^O!rx-3+F`)kE~oNI1+iJA?Vdrg*0=udT>PX`l@u$9%Sc6 zLgBdUjC!EJQ0wmWV-TOuLleJ0l%eIttuJl;`{zZ!?PE?;7~j>DU4aQ2r^@WQbq)Ao z-mki=1R*=X;1R|dR9X05j44{)to2=U0ba{K7qsIYa<TTQu)bY_3ZU<eaxO{2{Y$}z zIU=E~l{SPx0FW24LTZrlfqj4(d~<@z06h6eIvx~I9XX|Ux160<R;^_zqffSThJ~rH zn%hbC6D9XtD=QHzmW}%A7mi1%NH>!KSeYo<QL~=U=7jwucg83eSe|=o|62{|T4Fv- z`8e2=8~l}#Xa^;@0ILQCS5m}Kt}G#s(z;$PL3)#%yHfTa??(z}Om=rk0s*4k{~IIy z>UV$qrvojZ6S?w|=JhSCjTxRf{3eC3dQWF(Qvd+~?<oKP0001qQ~&_60RRBWl*-*5 zg8%<`|No|MZEkdNX_uCaje?1VYiDMRjF4w&jUhG<&Bn4E7WLGJd*QRFAfEPnTE}|T zZ7&0Eu4}g7gKN$3hPF=DfEmmnqwY8X2^Bi4Ke;X{9@eYW{GLBWwkr$A|I_UN8Z8WG z3DR`^#R3g3$2~NA_0wd4-_TP5{v!HHZ^OBQ=Ff>#4WI!4by=4L0000Q4fXQ+E3VfM z6+i)A==1a(c@P!_leI}>$<AR1Ize;_X~X1`O^!z-{c}Vl(tJ}8fkoSc?VCa^&9`SE z5XSIp=m9d_rw)=*lZDa&N--r+>Io>3I|FPfSzQGQ000{KTnaURtH*eDRzHbP=*GcV zMijC~ge#&5<FSVO+W%Wi5=HE5nr3CEOQ>o){g*yCKOh4&<o*DS)TKZgh10=5*;pDi z-m;x{S$c(d_(#YET+A*GeRZsHC^zc=gHN||yzF4R-lpKLLCMK+<d^&8{VhyjWT=(| zo^a=HFegJVWr`@M03=Xwj;t-zU645IImNC+XAZS**d=Yp>9@;|%{_+x?7KySb4OuS zA0&<NFgE3K-Epl!d-vE6L$<@TnjAhi4|)+_4%^SIy7BM3>&4gGpLg6UZHE6v*dug} z$lStg)*OE4RbgA$&31&LSFCa~I9O$`YgS_P@h0QZLbG6sd#fMRgyh<BTTa43<p0ib zlhC81&<;gyn%gFWt-V&tY(8HG7-Sa^(AFAJuq;<cf*Te8DSFmQ*Z1BVe(}gv5zHEb zoRlw;i%hE2f>5aP(rP)<cGr-$-F_cPMPLS|oZI%vXZ2_xFfaK400F9ge9aJE%yn6{ zo(upJ_O?Gx)E7zMb~`!n%&Lo%X5&W(Qe^I^DK0(_y|uK>O+Ef6yKl5|rZR4@PqZph z`mffy*#vrT$?Wtvref1*h<jtL=X4}U?;9%j+}H?pjFv|>ErSIiI<eE#ayCHEO>&k` z1VpW7i;vtAqj|C#G;rS%jm;(t=~a1PU%@4$+A(xd6s4mn+q)!xpu2-0B_641+SfJ2 zVg)RPASC=Z0QUBS?3C#edPTIzNFV%Zb4q?0Rt;<GuR5<+HS4yPH$UGF+55S|<s3U= zbUXJGnp{M`gE(ZgS?C`Gg~-9~9Oa*hvF*r=bj|dbbX=6F)d4UVYw*^`G6oo+K?PWw zMzCT<6rNifd;m}ent(*fk+TV40_4QQnFIh}$x@#UZNkw@zFwT9_=&H=PL4ndQlu3_ z6ir*~eYTe!9c-)R{<F_3c9>x|2GYtf#>Q2qdJtY*fso$5tKoH98D0~t=9~4en~OsO z6ck!qkGh<9urowi<gt$3;XqH))w^;8+Z#?-%P*y&qp!!6c)IDU(GH*>5YjuJmKT4F z{3`Y}HZEvBIz%p0TKwRr;ZayB1XCC#!JJ<*YCw72_}0{+-O269!V$1K_lJW<yazkJ z7Fi=lB@4X#SIJORP2823F`w(8xe6gjxx?q7(FjOB((wa;@X@7~eN1qH8L<EK90CW& zWR?DzYxjzQ;JUmDNR2q(z7TxYsDMYGMdL7XfH1f+wodWJ2=Ts%@Gg6X7CrA9UQ|AN z|FHFZ(b1_mGA=FgoHe@83xPsOY|ZL}XWUF<w)k21X`Lu;IB7Jn*|k5xoh5ryohr;4 z2a$p`M0&it2+}i=+#;fEF>=P=l(=%Cy}V>-+1D0o3FTvb40~MW1DH<l7O?Rk?#j~V zg#Yug>alZ7nQXy6{mzqb)ZZ8#DP`g7pu?0w#Q(+Mc-wl<;3$j`M5}5264C_PHU=t_ zWG<{+)t<Xx+mzK3im%gB<hFY2ozRp`D_wq;SIC_13ZIOFR?vUNU~o)kOP+k^*bZze zan<{1_j2}JJ;zk?EwQAq?z?+pZA^}PUEU0*xcj_BI8pgOj3S~Zl8ni8ixxvnMQN=Z z_CE^(I+P3U1^oT|By|UYHzS$p%9_FDjnmwSUrQpQHXlE>klh%g3kv<z`?uZRZA-`( zxbf+~u&~33__8^#=PsTu&P+AVZq?w`ej<NU7#}K%Un#bMN;%f8F8tm+Ix4W2+uuK& zo~ZWbk;$KLi+lXMAOCU&6bku^G!3AI^K3kZr(^+@IqUrGLvs>sUf7}tjNt^#`vfC7 zHzWhAfi+?*i^hpkC^9VXW`A{vO5DuPTUk^k|1fOHIlDESZ0}$9c0L5B%!Tzg#(sJ2 z9tR`mRUSwOnj4iV#b|BUF@8PI4-Ee7F53YDQ{quwnQ4K-=0?u#Ly<<2VD$iD;a?~$ z3hsscYhEYC-VVJs=Rf9_>0vhNSf5nR$YzZnHPZ%<{zVc{K&zh%9Z`1w?6|H&;b5Lg zKJtB0_vUse!@A=WwK3Ish?*S@50*PLGZg>~{@|VVWu!>5ewpr$`cs}ygMst>{?W~j zDfkC<eIF_lSP>EiWbz#D%zLovUE_#tE;MWVeEi3n@Jl)zFo?j}2tC%bQWF<ChCJwF zqxpW_lP*A{E!k4wM$hrE&r|w)32W`1P%kV{-B()HrH$qgqXPge677{pOX#RFhb|Q2 z3r!2rM2<L*nDgD<?d<bKU3OD^Lb?lL1cmC-G_qrt+xm(2b=2}OHYGpd+T+cpS1WHT zTzO6Q<QWE0>X+-R`ZurV?4Hsm!p{|+bSz0P4Ag~FXLioHIdnEk`xSxr{0*uM`~mSp zHVXufvA8rB))c?*jH8u&)qlAl!dg)j44aS4*vQpGSNOPKhTT-$RPNVqe<`mQ)^Qe1 zSa&e$-K@Q=V#T3deJS%hGqA@r8ANiZu*c<%xWx5I@n)kU;bZOs-+2X#Pyqov0R#rq z1cauAgYtNM1OP{Ue>(quwKubUdf$6DeZ<yzp4vw2nKP}UjoM6YupD*87oIwMb_o@H zQQG12eoZG&P&wF?Na%3%`)OROn11MAkCmN;lrT$`g?``#d(^y$=9o-ljyaOd#<`&o z4EXzAsMXko#z@zwM;^IGB`Z`quc32c6ojiA=hQ-_GTNY1J&R3;1?%eo1Oojg8~50T zV?-{~g%r!y8wcMg-!Ie@G3%A@>aD1@5q}4Mef-7UC1<reYu-DnyUycywxKe2w;dOx zWidvW`7(D7#W#;EukI=F^x&SZ<;*7oQ`l;M<JPeJB0M})nXno+SVIFW6CxVZ3kD-5 z8AO_ddbG~E-e43Xu8DF+EDn#L+Ie}y=ovwIJV}_;i~@8YUj_UHa|ae_7B+>+v@<kn z7tZ$m;-B7Rv_buzbrNx(y0s7Sm$TxCQ|t~KCcE;e;|`HQn*vT0LO(r;PM3&zB`eRD zlqs$8Fu?5%FH4!_V?zn+9BAT$g9|NB^I;q+Rs(6$Fm=u02Fs0?*g*^<rYVJ9ZVimq zdEIjtqDvKNOg{|qb5Du`bd8Q1(FODc&B(~6*)y|QG}cWv?w(Il4*N#@bxwvT>?1{{ zDeswYyC|~fJe%3dooP-S*1BUSEenl&<+3gYt5w*7Jo@sTpSk>}-cQe~wT}i~*3^`> zSQ9VoQ4K4`tv2F^+MMBOaKWq%Do^n%E~vO4Vc<i2{PPPH-uj;kSM;VzYB3^V)q~C% z)$HQd0%QOT28EpzQaU!=3g&SMPh4T=8@}V_E2H#DWMq3zBO@c*ZEjlAwq^4?&yXuE zGlUvOcOv#l*7{H(SxJ(WAvBtSii8NJ&;^)u0s#f6j36qjF_lsj;2XSGMwUurV^+4% zc*|figXunpJFy&zsOv|UqCAdPqO@ZQot`_+2$5F=0Q3b(1w%dte5aQf#2q-L%Yg6v z@{5=IR1E9rF^?GXsHl*l(n4+6Zrkn(XFFjmiwOLTc(W^G6H93q$1D$8>*&tRT6S1i z7)S~D0u6=G5S`@BoGG1Ys&tYtGk_UHBbcUUDnSOQet>2q1ks9A5sNkPrqaF68bfjT z$(APENehLaw_bQgdI0<ZX#%CcIDGk?WcC@j{L%`({LdeJ&C|A`zH-iZIF5|WGAk*2 z&P+(%<1lt>#R-MP;d<a{Qa>KH2gZLPMXkR!yBjQcl41-J+HDgR9Ft(OH2_S+@unON z2PtNF&V<BF8pjAG5RHcD7}y>`p%ScwaXtlHjm~!}Wp*aag@?fZuO0vl_F$sPR70i7 zdF~BKFeO`sMrzWdz8>DWF@Zybgb2-||J<70xUsO?lBaG)Dft?N36G@sWQ|FzL;#{x zRh2=Y>X4eKC`+kT3~4n}r6x5)(;yRa43bIQAV8;Rpv720sDPOO0MWcc;R6)%NJ0wc zHN>4L@F+An2m51)`>^=F@*0T1VXWbtgg`6mBX8n32PPcX0<1pJz<@9&7>EOlG$fR2 znvyVR6+)?ps}pq5NRp(1U_x>Mv)nnMNC?8OjpxqPXjjk|+ztbE;xGm`0Oa}Ho<OCa zk-663(Ahw-KMU9T-ESX+yp@rl7(-Je4*Iat_!%k`{}=rt(F7ai$1qJJhl-FY(5RWZ zln{bclx}5eB_e1ms0*bemC_lAZaqUQbD0<z3?0#JYlI8iPzVKcJ17VQ{`8qB%e<aA z%fumBc}vXev%q=X)$bM}+s@-wR8%O6?m6w|M4hKN&nW9m(Su!?R>6e8!bDCgKl$u) z5R*tVo3IY3R2t9;#9#nHqhJPuAQ{0lR+33LD-1FO5Q80H)432Z;i%R#LB$xnoD~HZ z_y0Opi?*U7tm^F0g{Cz#CD%-k;-do0T)`_84&e?`IW&CkMJB!)!d5_oXY+o~&8>A| zd)jWx3Mo>3GBPu=@+p;}EJ|Vn+l8(pqzH~(s`?qy{qGePmJWXnrZkq8>k|aE6bj^$ zFC!``UU{@SF#9OCY%xm_#kWk3$u7_ho+G`GmKJ)Xsw#*OCb>ImBel&5biOmitX8x_ zUYhI)U=Tl+vrqx_0l^HkENbe928nnBS_U=sBX0i7ALG^y>J}o3GY{=*+dYq%GK;e; z3)W<q_M8xbYZDfgf5z>hoYs~74*d4uM<a?U3oMc(L7|xhvj~EuU@3)18k@-=v$6|( zfC0fFUUB6GDI0YxVZ{bI!kQ>VXVocOwF!?bXrJt&<1k(unrfuL6fMxe`Owoq^Z6C* z?cxp?esT1NMsWs)UrRp3&G$cF$lxe5Wmw-}gr-o}ck1li(QmI?lUXDPDggvR7XqrJ zX(J(7zrJt=nZtN$1(qQhQ2|LvMrjb*l%f&KW}re0T8*7(L*1B(Kv_d1x-9@|#Ruf= zN+Tf>aR_+~+!a><4&*Vvm0ZSsGlpWt&>XFOM-<jH7bbLAg4|4yT4zjS<7~Fg3T>KD zC(U(9k*Fyc%$*eBlr?1YMNy)ahRtcJgIl1IgbtG|JrZ;g&a{-J4ULej#%6%1VSnuT zgdPZWS(pcXU<7E_h3WqGk74L}KldS{EG`r`&!Y`98A=pVY;;o!U5E@JBN+4+lBCp& z{lk|%4%#(Kjab=qQs^vTOJ~w)3_OU)1Ue(IstMJED}alHnKNQgC{&WcplTxzV)!AB zO*Lhz3zXFmL>^77+M!lKTUT@zQ4NREIs*wqE>WOx?jZqBXJ=CY06+yQ000000Etup z0I~r907@dF@feGVXN!Z4gNgtDZ~y;J|NlV$|3?4+LI3;#ot_k#oR;i@SS=n=PesOb zN?d@|l^x7PVTV!ZWl^EHv(X*VZFNT{a%*tLgpFkdd(yho?(*&0<o#Aa$25|a4Z!or zK%-y)293fb2t=pR1B7SFpp*uX!&C~WDFrZ{Ng9BONLB`^=1^5_MX5om9?uTdm5pZ6 zFr`w_NpUvm7RfydlhkxR1S}GTQM5$nPw_)#B2t{WNMwF1e&UtC_oz0R*?Ug5-8dtU zsrGEQJ;Uh^L2Imz|9B8asU3D|b!(ae3<{G*0F6qevl0X{lN7)NNyj9j(@8c@GT0=~ zN>w8|$D~pnlgc)xYq$#3)l^v-d6C85j)170R|!<PbF8`M;TERHosa}2I5Ob+F9H+- zMGtX+p@@U=eM2WmTp*U>0)xrt=Z80`2ZR+767}~tyJB>;Go>>T0+PW$<FyqH!W9x+ ztWl#>LJ~ApQ8KGSgAf3<GL_caKqh0M0!(B8MJ-||4KbCJ)dn#@1EHx#wVH}H4Kx;c z<=Q3N^yeFSR2>r&o0|S=Za7aNR<{1bftM)Cn5bArA&PP*axw~0p+d@ub=?wnQW$Vd zN|Pn-A?vnZ&Y@k1FUr^?m`ac)^xzOlOsq&4z%vrM&khbkH6y?bVVdcVhS;1DNdSdn zM5ibyBGbT8DTpj`jc79`buLOxn`lWWKnx&}C~gn|L>|e?h0yJSpGHp_(acrIX~9pU z?liArYO$1&g$fE;sZc1S6wNNWoR*v2v{oRqST$%qQh0@n9*jW;L;y24Coy6rC}ao& z(SS~3f<lr3BUTCk!6Ydpg{D*}1PQ4T>e{v<N{B{iqKQW<G>FK#BQn7u*25J_g$6ai zO|jYvvLN6j8d*;W!H7pWuSX<V36v41;uY^}g|ecBJkSgESBNQ&Ohsk1u@g7KrxXfh z779^>8E%8HgW!#<We8m~VWp(x9F-(N#3Jd4%A|Rm0n^x2mV&A2yra;5g2CWeSxKIi zG!CNB12mwOI#3Lh=Bg;jKxLvpQ;m^EN#SAbEoCZN8ev3TGK5Bg0g)g83?8*i0NLMI zKPFKn5M=*j^Q&H%2nvPzmxahiH%FM6f<nkj%gqe8Y@-8R$c4qfKCIRfbr2;!ciA3u zV3K5jq=%3cz!V0B0EUz#r3TDE6e{*epfYIKlq5(t-B*%H!PG!7VXPdJ&I%M@Dq126 z3YH4hcugo=YD1F5gsG{eZw(bZ7HOt!mUwh7B<95;%tTExx6Xyc;}uH^?8vJKq1}wO z9iz-bR4hZ+DR!5zLvsjlOrQ$`rHdirk?jOYJVt0-jEo6_&LF7-qB#sg5)%m`X*8fQ z5iLL?NRrB68EK}moTLJUYD%)`n50K2)res*7=&p;K^#b^b5ZJ@)LG`#ipm9%6hZ78 zI%l**N}h|D^wDxO`AB(3UZ>1*Ay{&DVDeVp0RW8XquS#pi!IjLk+aXpwi#qf9_~x} zKeLrN;?UuYR0W+>iY-yX7F)7LA|#Pgf=K{4Oh^g`7op!wam(oSQC#0KYyb7@MXaog z<>L_g+dp!6PXwQgugMLClHJM3OeT`0SH;I;zQLv~8%BoK;cPynvN9N)v7^&TCY@w3 z00Y99fk=V{l4npEf|)!3X<|Y%Pz}ZyVQVwHeus9K4o!W0CqK9BnsgCt)@_3=hb8Kf zmMhihCH9EaM5ZcQnV_OFh&F<0M1hhOAfb~ooT30C3WS7E)hZ*90ELkxNg;s<qztiC z2a&5P5t+IIf|XE{P=b|eQZQIWp+-t|(wr3vg;Z)HR9Hw&X)LB_A=OOLNGYXY0t*Q! zRh60xbycZQC<JMuN}4FuHIYh%x+biqDXS8zsi~@Igc5^Ez%<q%C<JIQg<&CLQjwvN z3B*EG%aBs50ud2VhFA@(m0?=itid>xra;845J3TT0Gg&jvXoFD#n4KWXaO)wA=Q*h zC89!ea8#&9$)qGAC>Tu4LPW_zLv&|R0i_~EG)*v{+awGoMHeI-0wPLcaI4J?od9HX zyAww(Fo7h9DOOg~g&@fQqT{120Z!%^XbJ&PBp1LY_A#)>lsM5$L%|=(h9m?Nh|2An z0tK)|2qkSogk(ty5LgmA0ccS|by!2&r>yx25T#Aj+&*-NKzMw*2O7$0KtO|&;yMH& z^aITfCIJNiFoc9>^CulzJH-Kn*-D8u1fjV@1~Gs*Xa@i=&V$h*#t;I;9t{v+1HQ*p zSb1h9!yq6Zag^AEuAOBwLm(j^HM&L(FrM##h>^KM<!RMKj#F+QvgO}VS$8<}BYmvs zTSsJ45hi0G2pOQ1GM#oML5xJp39Z=TR))G1f&l;uS?+Z{jd7yJDu((vC2W*b_j%7a zoL=Wc7(F8wE<Oxm4XRnMOEVSI!jT%dZIj%*3uity{m*~S>0Qvj-tfPdm^d0iWi?S_ zV~<W^k|cRL!aN|Fu)xYQSvd+pP!J|aOr;pnfQm>OU<x8ImB5Hj!88(~025OX-IVmH z7KI?7k~BwpAs)p;AtAS`R8^aXNra-@S%orOM&L+PE2J8^GDO-)CDepqsB#2WCw0Lp zOiY>zCP_q6s%S33kR*jmg}PD`7DNn*NSPE0DFl-WDWQlU1qr3#h{RBhsDKbsaCi_2 zM5L?;0CmBnL7}-t!kQm>Bo>0qGjzL=U@EXspoPu}RwqEl5~3|NK&X=eS!e|l3Pwgs zlw>DK)QU9_B^u^+26$91WJ#+0Z1CC&01&KDRca7Q4Vo&r3!wl&k||6nS(Rg<))7mR zq#{|B0T_!`+6X$g2oxzALMWh6FsTVup{4{AG!v3!EG0;l)mT-4+e%^q1xqo8DTLBA zMM!ESbwDw&kfK4L#i>OLK`2512x1U4cBz6`;g1<8Gy!A>jFCWU%uEQy2>~HtssbU@ zuplK7p+F4`A%ZF}Dw882CPhO)6hspe+KwHgbCft`RSZf84FCWI1!zV%8VXpN*lKpu zpo%C*v;YG1^bL9%06rK6vOI~&N#vAh1Z(5NDHQ$5OiqZTFek`I8(ob7pm<Q30`ZrV zvt>{Sap?Dlq-Dfn*D(cocjQ<jcGo8dOxR%L5+iF!3p*Im!GJ9`XB$yGq`H*KBmh8W zG`560F0y$!jyD_r+gwCu<Dh7`mPptm)_e^K@_RFJS`a?IeHe{Vx45;E&UnCTWQW7l zv7a?*fX)=-Jw^)ggE1Mxqy;n0OpI9RCM1&$nF+zhJf@f+$N+_M2pg4<MnzPU&|=;| z@NA3_Ne~D;GXM~DOahZ2sZ?W<iV+4X4FOLw7zk77RIN&TM4Si<!DWk5t5gW7uBL^P ziBJR?9s=9yuyu5qB7{jrco3NZtO?X6++om+stP4bl1d^Xg~Akz)W$F<DuYrYNmYfR z0w|<HA)qET3Kh*nvQTQODXS=iLP!-=C{>Bo6m6+sh$%EFVg(8WgVkA`oJkR;qEr)5 zVb&N3je#J+tR_XY5-}p0P@=O;3Z*Hbt22Q>AhiM@G%+Rs0a8E((F_-pP!f_Qu~ZYJ z1`$(F5KMqTgixlbSy~ylCJ|CPmmsgH01=AT6o_aMJwd_1AW3SF$`&LMkwC0$T!j&> zM3jhOXaf{P0ZNge2u%g7$`Rm{2pJ}zArvtM04Q2P8DT&<eWjQN!yJHuXrKVb5Fu%e zL{$VLJLO@XKuU`UAfPD%o4{5fLf8FDfq^FmfKWOh5OEG42?0YGLP}yF6#xLDLCpxj zIi7~Vf!Gk}`=&<^&<FtD7?rvYxzVD&vo59Lk1nSvmJzuTE`85IC>4KnodE#Gh@a+e za^)&ye-~9gQY?#U*&ck4N9&x7q!R|E6q98{Pn<$2A+3}V(xppf0ulfKpfXIGd1b<0 zV}NoHL~YdpHn3FM9%#8=9)sGU|C^rMEs1EeJyc}i|C%_0y<#rCGP3Q%msTDR`xQh4 zbS{V;VE7C=1*im-?js5XktP6il8%9((}M{T1Hn?n^a(E*Q)q-^m|_|&grqP5)=*4w zT_mpLf`v4H@MM$p|F~g|=l-7Ov#Y-FQm%66Y&6BxO4Q6iD6O(&2&D!H5)y*drBWy~ zvPM-EsA?)zR1i^vCJLccfLRSts45gpQbDRDR5hp)1S_B_z>H`q97?DQh6tCesz&M> zRY8IqSE{N;DV42O=Rr)YP6#0esv!UrG)hP%t4Y}fY1T=-bF8k`87aC{N>vF{C?EnM zqltt94LV3ujZqm2g@B@wq#~tyG?c8Ol!A%1Dv%`9P0>&S(FSNJQx}`2PzfNeL{W`{ z9exRODKUsZM5&~Wz%bGXP>EKeNHP&OQVErYqbf+~5n42MNUuklsGwySFcBgY#!w+1 zOjL)ah;HLnq9Gcj21!6fAtwOBNSL4m0zi-eF*)TSnji=Of|&>i720i*jNudmMNCE4 z5KW*(J4`?TLW7W~v2&mSq7zD-RYd?405E_801(0e0Z4%ch(mX9&<R6?@<79Ag$XJ^ z(0~%?!OlTB5G52K2@yD^jb9No0Js1ixCFY*Wnx5YhstPjX<`eOQ7s)Ru8|GM>Y*Gx z>@37=WFBT_)fh|Koa*Fj9Ak-52sodedl)*y5jrWBQi>h10y`kO4A3S*3MnH;gbNue zm;pdecbN_W5zf3d43sT3PTC6Lx-P$W8zqmI_t)kN7qFJ=H)!-$qrdxM<HC4WlVUI9 zDdHKD0vNqp@y#~umYlxqSgBOPC>T=_8ASLLl8s0TL7^Z_l0c&qn4~eOn8H8=Nu^*K zm10Dt0!gJ&fI$b3>M&+d*g_%-U__??2Z(`~2uOnFJl|&!n7SC%bpeKITY?pVD^(;B zI936qlA%!nO-WTDQ$=dkpkOssR!DUzSSVSkfKp9rqJ@fJ1z1Rh2BktUSmByN2*Dbq zswM=YFhLPPL0d8)psHXfl*Ft-sY<Gp3YH2%LZd3F2_ex+X(1IU29u_Mf{00>DN9n( zKq>$Ws0)Y=%Sc!uC=jSNXhNW=Nh$#pMFYkL#T+7}K?9;Sp{axhn$V1@2`Qnd+#(pp zR0(T{2CZySm74$s4JFzXA(f~+Xi$JQK@czn6p)}~a7Ks}q|hlQl1Xa}7b8H47;Df# z2$GZ00uk7pS_lA0fFcBmE+$10szAWNq!kEIXo^s@fLWkG0E%LO8zH0sY7MQRvV^!P zfJ9Jd15qJNA=Ij&40ep68T5iCB#QRRV?w(KAP@i$fF`I!8DO9&K$$^<5CMzO$SMfc z9dRzn7{fU*MJVUM05CXFOduvP(gPxTfCe52ggTKSUv!o(kgqlj{t#{;xR|Jk{Iv71 zvdJdQemknxhduvTjXV%)H-$RK5V=0=$SKdIjoYY>+zN*$rgrs;IiZssv?=l&ZL!7n zNW+Q_!2~TdN6v1Dkm1VAfXEy(YF!_)-Z4(nelk+8UF~|l{(j;d=NVVfTWq2r{&iW! zW?8ZWc6w-Sd0YgIRvc!A)tm1%VbT<!Lgo-4fC7YpQVgL*!=bG+x>m*yjETPYfrc;v zOe&@zl3-8~RVg$o=1l^aPNy=+BOAYP)uA5<l`Z093z4p(%Lq^xG88F;X^l(DnS~&m zwI&6c*WtvhRZ68$ji3=aSQ#ZNG*4$|Qvd-#Au0d>0001qQ~&_80RR9Pk>j5g|8@WW zVE_MM|NmzH|7ZXIX8-?u|CQ*xP(l?nOk-+;QeheyLX`muM3kyZ6)03$Q<e&a<feg| zVA7~j7a&zgC<Q6hNU5qpRS6-DO(m)UO&FUB!RiV%Vi0Mjs#FM}RH(ALQb0|rvI1Ix zm=F=AVG;_GpOFMaDI^%QG8EoP1*Fa(U4o^Nh_;FffB_R!Qh6DsL5XH)iY(eh*cx8f zYR*g`KuJ*rxezJ<g1iz6MGFlgY?EdQNNrWD4n|^SAV&l)@`}J9wTSFO5+rod8bTe8 zM5RrFFaTB{T9_;#GbRNQz%+?ujEoS7kc0p;F@c#uattV|tiUorM1VR=25|ul1sX#D zX=n{<Q5qUB69jGu8-0W>5ChNy1T<*SG$MLH84C=+thAv@ScIS&XaWWh&{9JnMCHaz z06=t!38f**ju6yQ1`q%s;z%?F8We#U0GJX0u|!5F0ssjRq>M!da-q8pud%Z=j=`yp zv~H*-0M?->xGrKKnOPrplOh?D9)JKc06y2_kq7KY>B*=$>@gi7H!lepH4ps**)~4= zzZ*RkufKcua8p}RtFy)Rp<i;FMPF7WNeo(D7%(a%N+lCYv6Y<3J#7hEc*qDB9xh!l z1M2LprD4obH=st1KyFA7dh37c{^J{7(EUf|n(Bo;4%*J!Vk)~#GS)f(H}(xol57tJ zf-Z)G>TA$hvZ2x#CDo^GE@a?EtwM}~Nsr_~fbb}YF#9B;I!s|W7O^P?M4_4;FbED1 zq64NOD#4&N9n8dvP67%<m8vSD3vlOMr7dI^otUC*3yM~1MuL=5FbO3?l~vTGLU2dt z7y_yy6$+@Rv#L};q1sZY3PzZaN=XV8g+_(CN+5|<g-{1e2rbl^6@uEGNTDWFI-yOa zlxPEpB!CtWv(QPYsv<N~C5;-?g$k=kp%9WZXsWKFZe$visN4z^t)K{vk^o5nn4u1- z60<@=l_9kXjY=pZD50ugA&HokAXQomp*4-PGH1#FrAU(+G^i5IQ-nq&1`hy(Niu;n zfLltHHDD;M6Eq<nZJ=lppg=>|Isg*_2`ySwhKlz{h*>2lB4Y}`fQSI16|4YIqzR96 zb<1vX9s$Wk08ms0X=x}?qG=EXO)UUm3XBAr1Cpf@#R!_3gkXRKAT){~DKNz~!4L%| zlM0lv6X>TXC6vK-J<(gK51}7|skLb}sD+{_N{<wsqYNHNUHKLYpdk|skkp`pHilLW z1rR2k1axU=V0Dz9qFNLUTSr0^ihx4T000088UzAOQVD1%N~{2NBmz_i^z@nrfuPBu zM;N0aHV^<F=!2$0CSP<^lJZl-WYD_`Mt+oqOoIG0*9a-W^FoaEyYoY;RqX?eiJkgv z$xMls4M!*Ukhw`IrIeg49U#MVM1+TQ5rP?zSx;!=Z&05F22PqLyPayAaMyKuo<Zi_ zx;DB;hj&AAbXd%IyH)|~LBQB_Z5)GC!`PU_6(8Ab3UXSkR1`#-hN(Qwgu%olm=bhE zqX89R>@cAOV2l7Tf#5<hOu1%ObmlQ+k#o`@RWywRPz$+6YBAK{h63}sa|DJ`2C5sW zs7i*+paYtyk}Ft}Qb_5Vl2S#3GC7bSrl{&nq!cW)5K=;kSQ$$VNg6a&69fqcL6%BO zv=l_Fgi=jvM4g3OlW*Af2Mie99TEdaN=qsmoo-{)0HviHRP={*gTzLIjFRr|?rso7 zBqaoCMfBx(-uFG8f8oB*>$vXwbAE$?8ff2x22s$^v?M8ml98zh5SWk@WS>}|Vfzi@ zfHGEPElQR^>hY=~w2*O9Gt3A>b<0`8APf@MTLa7Hp;Zk5=UIz^g~_8rXJPnUhJ_jO zWnw5pOhJNFB$6l&uVUUdOinHe$4x)IoEw*43S#W%HwgzyKT8``dHaE!JF7S@SCbKo z#E-NL-1UG&Q;P-KNO7m3SEA>{sHsW`aJDm1U>a#l0YJBeq&7)O7`>iy6mmS7F8Ad$ zD*B#*YU_$I(kKJ;si(OXi;1)57w2Kyg!bXNk->q~={_h<OUIy6(jWm<H-~!XglZC) zy-%d5w=#iplyY*flUMGHY2;)fh7kcrtI}kM1p={fOKz!LWvP3KyX`mX?m*g%(8WL^ z4^^pLg5F><1PzT~QtM2v8bFK-Xc<_|O0Tvnz6<~)@OB5ms=6Sd(~(L~FJ9z+#s9LW z(j4?NRrM%NO4$j-&a+DJGh|uvG4Bp5C(X3chge0EV%O5b=fe(tgI&<4E~f{Lu+Z6+ z*!~nGl)bLfWEg@;<k6&&1}p+?UtdLf2v}g#f#7GjpS_f<LNTcx+cjEY<GSKEU4#!I zWfFhgi)2p1tDJ2uUuBj+bZQ(5xpA00Ba92e@VEB!7n)N(zP4X~6?P?*J@K&)O)#&M zTecpzOaKaHhl>+%%L796k>AM$Nf`N+VaiF=TqH?cB2avynsyoz<vx>8u5@~?VxSMh zWz%>FDIZl_E$?qljHkxSyh0zX)or9|p0=iwH3LrqQox*hNfR`(N;fNS#4;Q^iD#uh zzBdfDL4>NX(Ih%nCSpe+Q7v>rX2H#f@AN~Z6+8l}5$Y_W7{O`gN>PS>RS}#MYrPXp zjI5rXYb0*I8(4@!ij&FM&z1^FYZta=ph%4%h9qCp<jS-lBCK#8`jLHVZZ3M>GJ!Pf zJbf^4BT7dZ4vpoa=EDb+lNGimb@vA|=W1F9;=_~)EXW7nr1`{{;}b!^ayyHy-6WD4 zdfEi&;vjhC0574ZWtcKBU0F9UuQnVmuR08_BiF?Lrc1~-%4{znRYqkIDibPoj^bg> z0HpN_k|1(ss$2N;pfjYQT)e<EgK$EMf+CVMq-Y+<sTeRp8AOW+#Dgi5f$Hy%73GB@ zg`7(SGf!A?Qu;1FNg=S?!4tWMj$G)r1SfF-xq?dq6#)*)6v~?W<VL4LYQ7x51xgtJ zk;DLa?7{E}BdsYfC4nVIl*WI;@b>I|RNUEj3qk)U*Sv^uT}5*9;va)~GfF0REX{C^ z%FUFx)yvF28#DHs1cfmc?~X@TtM8Tr+ytT@h?VA3Mhc6Bz_rEoW(zrmRVQV5K1aeo zh{;Ogaar>>D6+9RZ`?IWYxTWjw{Qp(U-d=5WDb^+Tw=HX6E6BL<t39!SH{HAW{O2J zqn_gYS@I1-EO**L?>xVmXdw~}gK(=R(1H{Mwa%1rvw^VuZ<dTCs-Kd&bML?Z;X$@s z{6#b;>#4);<{UmsJo-na?l|F%-lk%t05-0`!I#0h!2#)5mRqb+@0cr4Br%&)tDkR9 zn^PNw<(8I?udUD*H^?t#Erv+@S?MB!OiF1&qO9Yy41tfeckiDo%D3227{?RUOhaFT zFr-O1K<XvX!>y2fgrP>c_bmaV%k+i4P~<&IibB@H)Jj@d%WD?Zi9(D@8%k8^Djl4R z#f*lPOY-2Lg@jTftgRkHfsajf$utTGvTzK}mmlsPgpo@8BEoia&Ew!)I4cdW=ur<( z<!LRkG10{E#&mHA!~vlqPM#+a#$OH?ZZ?phM&gI$QTR|WSaWrAM}Y{1@ugR!0v)<V zRG@vmF0#66y|sM6JQBSr{6twuI<2;KkIzqY?#g<)46d!-#v)~7=aJ~QwBT-h068_c z?qqE}i>xY0B|MLNmYOD*6)ce(4(Wv^(XNMt^Q`2se_~ea&Z;1Bzy#MCg2Iwep}DH4 z$Y9$*7osG*KmdKHIwb%AoJ|AfDdPv5D&qmVSuFrw3_uZOykbU6A^;b3{9+!TI+D+5 z;ac^+Tz2&GeZ`B*d+Ba+eNX}wfe@i|occZBcwmC?rjQPbTq0<Mtx&1XYu$%?Y7Ao= zWqm|<E|{c+ct>K3y^m|u>X4OYu8%=TH3|9rF~huP_*ky*FV(?`-Zd+Aai9+#_u;1i zf}xCcEz{uTL9?SvujFzjypXrX*5#Mao<@|-u$r(uK>RMhbhL2ezkc!}zTWo+t^5An z@ArRyPcjX;`D6=1q?TE%zQoFfStbDoI-flZ7KSoQrhk1Wsg9u*=4VV+#@VRiKg-Vm z&ZMU~S|-p7TAezAK%{z_rBnUnu`Hn<;&|C(+U8*g*)jZ1Ix-B^FsE1nd$DxOgwklZ zo?4`qLCM!iH7K{Bpkp9cT2dT&_(*KttX#rGaPs2#?j%=&0X<(CEkYJG9|ab`D}*)5 z5)t&13*@Ggnw0HwO_-~}w5SEkk9C_9xe_Xmq{x50;}om2_foMf!7h5>+vmwYVt`6O z_BoUK3NXadq$PpGNj%y(lz0qwJJy6dKU~Ke|NgbJhuA=9oG>t0t%DGzAQ+;6nm6H& zY&NOpV!UVOX$Udgy*fZU%?yz@Q@rZeq$2ELki_HSkiadFnU>7*1e_Y2V%3eo>@y}z zheGm^fodqim%?~<5)kTNU@^j$;5<C5NC%LmzV+~Av6g0pa)L3A>t2<mO|Cs0%C7C~ zV}$R3XHJe!su|?UN*&D`<j}2`s92Aj7-f7yGoo(;jvQ1q=AjED0h9)@<Z}NSK4j#3 zvz}%(8bVmDOSTPrtQ_bd)$%aj<ij(XZ(Jo8!#52P$|V1>u?L;t1u7#vRS7Tg89J{C z%84%s{I~O|BA`9~34ar-xt_Y-9DS*%U;M>e$-XW2J3cEDHN#Z%EiUSL%l>A!gUMZo ztLYs?RbOtbF>sct02zI(86<4w9S>qjR5298BN-N(u^!m0Y~BZ${)~Ui7EoMiy}r>A zt9pf6Q9oUM6ka7)Q^nfn+%DB3c)XdKq(t8JT>hi4kML5k`N`tIQ%?E3%7~6=efY)> zEw4r%myxYwfj>~hB+Z4Kdzd^_Ai*b;S^0!HvDDsYko2wRqgubOo*bV(G}?ZsWe_Tm z$VkH$Oj~d-Y~7c{tlAbODz#S#wie9XuOxjJxiABXkOeul=CV=sX!Wo@0r*RXl_E-- z*-$-WciE(9E~M?;CW<0CIT}e|nVZCc2t$TANTx12*$djS&V$wE>Ajf*`vo&f$$ahh z7UWAn(MHMlE|>ypWU+I-1bawgC|u$N3J({qshKM{oS}b~U>l>>?BAys^Ho4v{#CVu zt?~k&JyQ(4-oZh9HX2A`b0r1keH1R9iE_&%4htnS?BJbAaJuoF_wgB?luZaOR1L}i z)W4Lf(Eas?Z;17>@k_syO<4Y@lJ&OXcM>s)6ci3SX(h;F`J6ZPAiR=V@@tE<`57|7 zQAPmw3CY7$YU-xXtEyU5#Axr#%pa2;2oGt}t($xZ5^^s%h6^bgwD6KMKdz-B$HSzw zo2ZkS(2GpSfK&~CZ7V|%G%|Rz!VW5+m-W;hwC;dV7*K=I=UbYl1Yct$2%g|(U!+M$ zF$tt|!WZQrNLHa>){FcTh$lO8s-z}GTA6CX{<#BoE|{YV;_}m<5Lyxmd#%#$(98Il zdd2|IP59-Sw;Lq-oV7+Jsf#WmoYIr)7|B#{&1oJ5;ku2WAU0&YXb~>W&v^S>Nu|Qr zd*rfZnDdslT3$2z<+K0+TObb8TD{yF15T~xE2j`rBH;$o0jkr*y4?5evpGR6W5H%C zF6Wh-7Qg;=pTvl?4rLrR-SM^T^J$J$_h3oiimkJLp|xZ4`p?^!eVO5fP=9|p7z;xu zRRUuo#iXKp+5Os4x|o;F(TnN?_+PsP1n7z2Vno3pO2(u~DINzG$)Uf8XVC3WG%BID zye0=%nqbD(6PjEXUuvsH2Is1Hwgzj|T3Nr|{FPCY1^iG<Cm-4NSC+wnb^WSA)z2dF z|5A`Z#s8%s_4gE{7bbtp@-Os%)ExJMjyM1QeQ>n5w@*n)adB|QBnq;I>BCqEb@-aK z)?aF@=~o%vkvryRvLH%hFI~&m6H7B2^UwvekrhToj=IQNK?1{R^;ceMw&ISJl|?w- ztOcnACpCr))l#20R)N?o0%;b(Fy({iu$gdutuoU9o{4r=ur!Jh#?kLF%A@KcEy#6Z zMyNJ7tL2+c$ZzJqeIY)k;^h<~)<u-Ny_hxLKBVhQwLxmOVVme2%b3`P)C`I?x^6t3 z#_w4-J(v&0AZQx3Ul>|{*U@(Ty*REPB>dl@Ie#skh=jf4Xt|=x4{-z3O6+KMT+YzA zk8#|sEGqBSXYfv5k=P_3m?gc^AT!zwBuHM7b7$q<x;Z`lE27l%XJgKLq9pvqz_qCq zmx~`bTXHx=j@E{7NY`O<1<ASQN6%vPS&Rbjk|OVWV5$hn%+!|J^x2S1dCk2s2Lg+P zG44}(^oaVGZOJbX(Yxr9SoW1m*`z{-t1Ei|9JTBM5p6n;*q0t3wC}~dz+d_|5AtCG z^h_oInf!~J>F@K@LcGZFpob=<oFQMxYoM4?6iVZfS48NS&U(w*0;SaSwByRwj09tD zo4xi7#*X9hVVO3sW0@a+<P$Ut)qwIIp(6au+VqY(sw0brg-|gPK=Jm@PRhX5Dw%K$ zP8JiLl)6=E(Vn)CY`5KH*16r#hO`ezwESF}i`PNBKi;{4R4Isvm}gf${?R#DH&2)9 zAx=&I8l!WJ_r3Wk!B7pw5zhc#Y<kf=ATR0}mnsQ0m`4S~KQRP42c&V4xU8U*HFM_M z)EcDa9!&D$JGhl9jHP(JjgMCqGK}`M?_C@(;fal<Q_habH_WHzbgrZwGh#1t2JpwZ zgj&Z(Zx+2QD5aL5lrI2Lks*K-I75+H&4W=BmI_WtSb{4qSRFI(G{~sen}9M(PY&Kk zz)9wCI(nEy@9_d<lpcdaNpYhs1V)FzI#4o`@muNemz|@@SK4WjZKE0zXOqgN)U`Xn zkvP=%`O<LhurzC)!Vs_xSNZSYv8+U5JZR2>N<EasS;9elo0C)+4?aLDQRL!F)39Fc zgn}xMlWLw(GVli~I+e4<4uGj$hmTbvC$STFNESt!&|m`k^pA+WkQTtRao1*tNQ9q5 zoUOJFX@VNaHmS<}(>Nmr7!2rk@=S;$v|z&yH)M_Dajl4jG0D~r?<)M82NDZtGmCr4 z)?<%x;;O;vSdf5K3m`wCjFu(-_(*>5I#ZtSDUm`WmsOEAij}io-mvw+yUakNJ|vA- zJG*1M_js|_chUmB&OfkdX~_e`^C2qF>ps{N%M{zEBOuw2_ow_xDIKu*C~OB8Kn9~? zxVQc1yXaE!R|p@)QiZ_c6GNu!swD%MXXfnn?mm5-ETj65N&RY+<A!-lzEMJnDZcAT zt?5sj*erGa!8G6a(x-)e?6r@o8`A>WMZjLfjiDkmi|R(Hf@weiIa8Klbb7G;pl)NN z->3ZFpv#=*P^ov34+9_%txB%`>J&4wur)&Jz6Z+I{`%?>$MS@81GcYZEiZ;=)JPI? z9pXqGn>Og8OO|H?l**k2QCi98C21GZfr5A=Ek*l5k`sz?>fF>}&>>JwtpNC&RA8Vr ze;e-P>9Q1yXYoE1K>0!^*$<+-@}Jz_17Ye#RoKexM{d>9R?dS0C-s7O(%@*+!;}I< z$s0^0I}S9e&Qh~bEq7LzS0kcofDIGscGAWTYD@E7@Pzr(+KuOceH%@{Wz}$lMAC$W z-sw>gi;CM|?4Z<5V9FW`MX?c4{Je4*m&Hr&IBtABYrn9BxI}sJ5?U^3oIY&EO;c5~ zFrC{Bz?Lh7wH#grN{fGD+{b%NSfS_G2js+{NWf@benZ?$J*Q+LSim}rNg&t0l%t$H z(Mt8gR$WVZCj;Q>z~TBCE!`uArL>a+qEX8+l{hOkv7&dhN_0eCxt=&$%IwHF&XlZl zg7sr>%0!O%MJF5`Id|(YG5V=I&@;}$&$$IbhQFUjsL%VpW{>w}%x=SM^+Z;%m@-wG z0=@}jVT8^B>oyLo>c~?xDqX4@{x5lT1zzUq^t4}~^(5n!wfWV7IJT1HOLB3~v#j!% zO`MrOmA0G5l?|NuAQ!Y;uiTVW9WFy<C6vI!^U^Tw?U2Aj={L$VOz|Xf0I&Ou3CMiW zvmf#Cqvp?r|2QtD3Yg51r58#BBy!Wne_paQ&BTg7;N{gQ*P^sk7>O6{&$FX5)gm`@ zc@UnR6mvgWyOAC}y7&ODJ|F!JH9hr)hR}COHrxIuYUM9>YB$f;OaCPppyOjNxHy{* zKDyOHI(5gr7MczgHbVET@~y{z^-sDmp>kkt5=JNcdPFrjifgUvfw^^2Otvsj0P4Yv z!yx4^u!OY1I5|JjhaiD?D0G=OJ0dQPo;N3VcAuQi((G?#r+)ySY`a@y@KeLN@Wbrm z#c^B8RC#*;?P;{#Bel_GGnNv;!cu^VT0WPtaq*7bY_)p53rDyS?PidZRsm<PlK{%w z$%)&-K+Ol}TOydtlWf67OG0H56-c2K#VjoNkQ1xIqOm>9gM~v(L3;DN1`Dc&R3#7r z<mE6@x_`kVc~xC<(J)cij=7~&Vm}j9#6W6~q}2v)uIj1X8UTZ))th|6Q9p+5A!+vX zhOM=l{p$zvZ_SF$hvXxe<r^}2jASg4mRLthHiO{k9F8@iw9le;xr~Nz6%PDi2Pt|6 zq@aSDzy-@X5N5(9tr+E4;0sJQsw|H(h3x7X(o;kz$5MnB#L8_{xXr?Mbw5(F^4pG= z6<{1W?REGn9!3Yq2}aUuC$`QuYLm)I{)Zc;PAou<*LfFci0~+xSy2ke<0uZRgnQr# zR;`f!*3$2|aG>^^AC*ZsDo1D|pB|}%Q^06wV2{DPVZK&kDb0-Ts4k^KFPoR0#J5nA zJ*Bty_$=5G?rkX|QzFC5$TVazkIL(H>63T4^_mHkvxC}~e8Ha5*N$oT$}{EgSRfak z3=>dQu0~g7pzrj+EpkM{p2TplFL0o#<cXlVy}h{3dv6pkfM=J3eh%?i<I31`*EMWS zN$6>s>x!C??2zwvBxhFzYlm^vi}~$+n#8v2qgJ3iTb@B4s%1HU+r>4CU9Mc?{*qOW z`2OnAVBejKDp}!^cGv31F)h(1+BC8^_E+O-QS`J_3N~$E*q`i)`b0`a$~&sJN6+6? z{qV8yn(lmV;&4(`=EtEIH|S|DRFx@TSNq8c^YtZq<7L`Rn!s|Ysdg+2Sj$E%TOfOv zTkuSlRHJq_R)u-V(aY@;U!(J9hS(P)W<u&RDc8bi>;Ky7@(Ygk%|j;hT!;^)^GHtM zuVyMx=M0O~JK9yWrZ&uV<}F1TsPuzg_7yUvEqjB#K<+J~5m%zseYKEN<&%0<7i%?@ zf=9z1#@wnJ+7-%dj%(cLQ6*s{`9z(HVYY&Ri6l}5%q>$G*_?r8DE26T74@R%Nn0p; zMv->hI4lQ`<&*rEXf0Osi)lJuZ8xD;4PIfh!e+rmM3TpH4Wy;-qDFNRBx*IOivv;f zJr%b7<u1ty>1Ny7T&TRvQ4<J#4G%w1Q!5+NDv8}Tf$A$WH!<g-J<-r!$fyUUx|et% zriAxIKjcOjYAT+t^GX_7vGrXc3?{hcKx6E{CGgQ6$~Ol_Z4aaQekFX;9ua;8DxS%6 zigbPGLt0hL0-sms+~@r`(vbc!Je4_5q5@oVt0^t3Be2HfTu_^Q^DySu$UhILU-?Wn z+tp7-0k`dx$V43#HGg8n+seL&dd1SFqUPVA1~Z5!>8aHtg@xy;i)HsNBlL2i`!My~ ztXd>~=v*)8#Dw#klUo71`Ce?wCFF5~*ZD_)Ip=3!Ef#iF;N_L3kZt=gjLGK-_6KbA zNF`ZZorb=XqIYkNQ8bRq)e1a5xEeWn$_4Lot%&=JHB4HdKU^zzC5h6W@N&|1e)&n0 zIca1$)F>P-q4U)XDU`Ek3;ND})E*`{lV9?TR*J_!Vq{`D`+OZcJe~fVq;6+t@8A`F zd7&@V%G|Wi{6LXo`NOu?R_Wy?M})-&M-qC*YRH#YmR9vL{M)3DwARd~lPllhaf^JI z0^+-MCR+-hLW|MUa9&@(QR1{UEQvlzY!DE|IK*Yz-HQ|afSYp-5k2OSYknfEZe0-> z-0K)yyC_N-Gj#H`ax+sgR_v{-U>~DvU4{^Sf<uWDoZC6BxV6MVU~SSm6YDip=(n9D z;3t?p613Hr`!L@D|I*fYUp@4qzRz$FPm1yFmU1B5*npMHZn?Qzl*;HeRI5nLY4LI7 zK4d?vYNfGUeBO2=g3_j^sPQX#_#tJN`zF72I7~FtPGtL%eld_;at_l8Y2x#-Z4h&Q zz~6+P185}`+Wd~w_SVWtYjo%>R{}`U4h`0F$&fseN*y+MR@>c8xN+pl-Z6c4<#~<H zZao*VQR_NCqGUI@J@Q?>`y+ilJ&tYrykdz?2_60}ZsqxdyfL0aI)3BD;+B8NQ}?y! z=ohoUk5}V9FZp*;N~3k8scT8ZoAAS=9wVa1T<6j8Ec9z=zXX~F-ta1SRf2)H6~h^O zlV40R9I!XG3((gr?MiQp0IIZictAP#*L9-8856c_6AvjH>TdtMexPP-g^jp|&1X+E zzP?27?4i$lWf`N#@@CPAKRbpd;mk9WzuY(!kgYT(?_NQ1uU<4MB8C;hUGARyzwx<= zCgPn>Lw}Y|X8-rO$$0kCY^2ses$-GZYqyVqN>*MBzH_d}OGe;dV=xT#m0l=whxhdy z?3iMtwp9t2fieJL%1``s@jl=3A4Pqlk(F~bAISc_HrwN7`ZIgUW$j6SXX9ZD+^i$x z`X%O5ar$cZ%l@kM(Up8ZkD2vjUTsht3u`eL-TSpTeW^Yk-BV@P+NJ(ap<Vq+?3VcB zmMX1YF_x*r>?I>bMRRABwG1+m_V7hyX@<wdd#U6b(b(tE$GvDDC57BG4XULFhR4rV zUr-5xe-nZ64Hgpn$yhs=69=Tk>C;u#m=0HUoYSE3pQGztK#*Q#sG`!FtXATmu9<tG z=S0#WlH}3_ulz*Z4r#RAGm1G7>e;^gPKP5$HUVy5f5ND>9@n2++eD8GFWm*6x&-9N zEzmHy$h~v*$zTvBvZIP_4^2C7fn1CLbFF-*mWBu~p1k#qqQFxFhULc<Fsh7{y}5~4 z=Q~lSvHqL_GE?C=i1Wpg$4sm3^{rqv%wQjDnXSxEZNO&HMFM?5xM3+uZZ|E~D<`!v zAzine$M4`J3IIOS<$Aj*AL>6bYP+P#ru$@5pyBe@-L;_g<;#{qZTwj;72LF=6ON(A z&Wyl|Rdm4ekC;XbHFTyV-@B5!ro_B4#M4;SnHQX?m%Ke39`=Kv<}p3mz+UlP3-pbw z<kQGSNR!99c6fX{K0E#`CB&OUc1<f%x=YU(kP_5S@j?=C@$pMa&DkjyJesclIF^ zv)-dUg~{`B(c7F@7jR8&jZIH)*Ua@tSMl@iV3Nb%k7Dw2Dx67@WybFC$((KRuAMug z3~6V7Be&*Maeoae4RzP`-r?$JGV-#`B>B=h=KTT!zhIUJhdx`4d?5QPX5aaygS7vh zd7kn`A>e-?1_1Eve<4Q0J;W$;w+m&%Bse)ZC1TT^k`fbQ@4GxQ|NTq&5bu(h8s~CE zvI((@8gsW2k8)vyY&Ti{`hENHt(8Vr-Z86$-_RejuyGjsQMR}L`KiwV@wp0{lbnXm z^ev}<LUO{_G|3<NL7yGX45L0%m0ew1ADbig-&N3Y-+kQB?F#=Dx=~Sm^4g+q<6u*1 z`2A&S%wkr@hI19AdRd6cYVYj2c;*DF?2GcKZ|SuJvs8LCzr1OtRLQ?lgGul3q`ukp zgyg7gOMM^tUhfh9BHLSl-uU8+g~fu@tLQ$L@#qZ+4Ks`A5%h$<zKvb{O9G{b;6IJG z8NHoaccwpoe{nP)oO7VS!)Oe1yBmKxgHDep^}M+;$S@vcx*Y|b8DWe<qG*w?<R~$J zGCIEP=30MQuE!kk?dEYtn0!;A@aL{lnHV!)N97Ow0kHplO-28RTP~)D*Tna*UkW^Q zqv-z{&zS)YZ!TR9{X6=EVWNDvfvWiF-@3HkHZw$J$IHgI$lK29<#>bl$dx|ver&YA zjl`Mp+b@(eVqqFCpA;*y{UzFx^j$UOAWB+-HuWQJ*_hXOU`j)R0rrq2Gf~n1hHUrd z;%xSQz2eR@mAk164TS`AllYqb-I%Ov^?3&MI(lB`K0S_ZAWAO8n;j0Yel#giN?F3; zuNt5K($%zu5Z&Sk&e;lv@0_^QXBVd4Z9ZF*v$u#97N`p$CC498|F&(o-TGUycEUC$ zooC4=;K7NYn28V%<f3dRhj0^wV{wu1%E^p5?SU@8TfA#<JA9=0rBA!&NxMR;w~w1k z1B8KbYNp_ONVJm-Vxs6sY&n@S-OHr3{7nqaxsDjAWHa`Mm?2=B(2C0PDCKqBXXbKV zk7c&KfV(zh`(TDUdZYfut0#{FCZ__j9x@Y?=EL7i@#aiUXwTxDFWRFB%VJOC#H6<U zpR`5PhdcPBGo)l5sp)-NK1Ly9HFpea`d>=-p0nz};-B%GI%^xJS2zdNI{x@c@7}zk z?^}Jd)$j{S_3^JAb+~S_1I5aN8D@b!|1&|cM__zcs#ZT!o~H)VoO474G89oCtAAu{ z3J<sqyn2P>U~UPk^{9UG%(R`}kgVnR(V1+#;n29lv&Y=#c3={n^jahwsl!roQ*ziI z-qGCA_x5JY!&kyW`dfNYkgvQ>yzcSS22qpW4di{SoXn&lV~Keg^_yR*4>HCYOJtac z|DG7{q?d$OY;BMX{5Aq-`&PD?NIb!(XZ!_}j{S2HFfGH=M}(4Sx@vdtuWGZr{&Er} zOtl?xJm9-l!N#y#hpdR5`sR7DI`JE8SR;R7;jazdh@W<0B23eB6Ox!0KtW1HUv_vN zE<QEdV%!*W6#m>%UM+))V4tcb8Y>YR$aD?}h%*rCeNYZ=akSG27khp)aMmyT?oS}y zen1c3!D{w@pIBqIdQ$~@D&_3y0qppm_)!=YIr|-Plx4Hrf|{rtg-t_A$2AYNGXqY% zyye2XImgW`zIZ5Qz4*p5c-4QdMx2@Zeh&4J<vBN2w+>aFcE^1HNe3w}-TxXh>GaZ@ z(x(PMF-rSdFP&%owrs~^XLq{O%>nF0dc<Jf2vw@i<dK?(aoS!8TaAv-#-epc&J62A z8wZFnftb<ugE=zsJhZD~vj4}_pFhqe#-k*wxf~NuSB%7_#j`&b4$xWHmv)VHO8*Br zp3GTXj=p*iACd}pK9|a~NI|N4vb`{wDj+LL$$9kgok8x>c3|5+uNk6o38_FE+b$1n zYf@>OH~H9b4lt4etl@?6CtGq}wlhTuNNUmUA|`j$I~j7sV~TH%rb399YtK*$aB-XL z|18e)2B+Sr3MnYO{cG~dCp25Rx8l;IWh(NooRsw2{i;{OT@K9O?4Fj-T>U9l$9J~< zyY_COo&}zc7d#eZ*XI1$%zJn<vNFs;JiB(M=n(rWC5Ef3t8(?O2Nboh_F|?~ofhjw zq682o($f&Mw0xVMB?%gQFoL%stPW8x@BQ@Q$D{E{0Th|1(0umJg=tim<eK_P*tPjm z<$85WSaOI%t)kLX=O@lPU8L#%W%<A9X&yxQdOmMSEinh#H0*K+gg&4(cd+u`vIrV& zwVf|rz*ezwK2svC5Ebf^PVKBPC}<*?kaEcXqR1+)9qDU~{}{9*YN-wY6M1vh==yue zq>gqH>uI~gCQpUT*S-65zlaX$Zh0~A<jqS$4hBwixEFn!wr;0wjWQ?aOg)J*xh1GA zwRDyMDNFlus?QH|SGF5&)3QgSb^NS2wqc(c5YU{tw>PkEN_?k@i^f%>%C5u)VcKT? zz8$Nt&$bCshbu$uPNr_BpBTUGQF;2Ye|nBbPNet9_~A~11t?A^#z4cmJH?{9_w9Sr zjSrXJ?SoVQDxcR=+O8c9;C4)IvzD$>?tD)Z#Emr;;vIfymq-donlfIX>mtHLemI{Z z3q|bFhq3PM@tYD*>FpOxON)9R{9<1GXi=eJei~9UW&b^vg1+e4^S)~@Z`t`WqrP{U zFW{X2ekoiBA6~2nl|K0_v%!YP0|cxRp<XlD;xTTEEVAI~rq9`@)-O9x?a<$H0F>+Z zk&k)CI1HhiG=smQXVN7`q$y)(Zr>cwrZ{)*xD26rkIFgKEGVY=*l0LbMN!TK{9pH{ zfTPtysq9~ve2vHwz4`chTf;Fl!C*XqEigTAkL}fO(GG@V@^k$Qjw?H0@SaHwU$bm9 zB2H3JDT@E(liAk4f`VMn9Z_SIgw}yNmBwC&yF$dCwGM$FU2d>rKIzF`;L}`|7yo)K z#N}qam&qh(x=OW;f*eaUi0c)<Hkc_`LqzNnfPVDk^Y$Sk)M^r|R6Unf-{)KN#A-Py z=W6f@HQ_1RajBv^6B5!9lxP)T<-2p17f;T;rh_G+7HPAi+}h&RE6n>o{kbM!dT;6p zbxAFf=(XwNvaZ9~7XfW|r2+pq$8n?2QV%d(mTDSh3mFyIU9P_y=(0b7tH(ui-7}B; zH(QyM)RsUKrF_vk{}EdCG+oLJ>yq&IRR>O1fIh_k;8kjq<zEO{AQov+iyXyK`q+Ms zW~gXPAT5bg7^_yf#8KohIoqVv@U$CvYLcysIDH}b&OCvc@*8H>9M%<g0Z}AEgdrl# z!kV<+%BqrDl+8pIbR_OPkUn3LI`V!eijds6SREk)&)Q1y(WLQy(n3+~;se?_O(EX7 zP;M0~^)O!MqDjX_E=RT^Jo_(;fdmP`2KT6oXCXOmC0fQPy!?K`H2GQ3#z;o<q?sQ; zOrc-6Ru)1&XPt+JPEFIY2)oZ(oUkpPZfn%;yoc-3CVx%&QG!x$q0r7r?m73<5UvXT z_|UT`)r<+{A>J&D?Uw>tqaiu(BJXvx;1`y<9`m+Lk;B7SgABL*@c1VY8#z4&vppM4 zF?Hvk6|N=iN&$`PV1(1|8*gq=+MQ=?3oP7DzWj7qYcs=ik~AF)b0dZq=})Ade&r-J zZeXN|Y<UC6qjKCHMyP?fk7{}&6)_3oY=d#vW=~0e%ld0!#IsN9?4f#5h*A8x$@9sn z=A}(vFo^_~JJ0Bon<1${9wtepwGA^427KKu^hfu}W&bx+>fATn`Ci8Hlv#tg@sv1b z^}i38`1fp2!jwL~aM2C`;-f|EU35m;FxMVAA6|NL(HK2j=6{g>s*7(I_tV?=a%9KZ zW+x)CW{gaQ0yC~l=V02pc=G#(9FO)k=eyWtk<Uq96pL<$r1q~ytE|Uwq2)?uS@-|Y zEd6%V>X^aTEp`it481-nCNs!p66_G?dvsXeImC6Wb-d@Z>~+l9pyY58+j$i^dfr@j zM60rY8zY#QM!ty_iXTo~?&+JF@kD!<i^!uVsQ#YbJZ@(wzim|@6fjNXY<vP}`?3zn zt9&dW`t_6xYvHhx3m2R(VAY6gM}!3jMk2_2w|*2cB-PW|mp@=K9M#vZ7M23p%=x7+ zy%AB-FQ&siP;r3t@xG}U1T8e~NC+44|EB?aPA`ms11eU<Kuo13(AIgapyEJbeEh&X zuSTj*bzPR@?Ky0qpviB$%&YS(uS`hYefi^c?B21z!haP!3)wC535lKL*IsY{l3o^b zC$Hcle7JdikdB|g)W{+P3$yM_ZgEz&WBmdjqiCotieFlyGE|jJ8I%6l>1Tq~<1s!< z-h>HK3Kbm4kTO``ICmnWd3pzLgzLmIMR;dggGc&zyMz$PUp7N*#ZOPOdx$s4=pi-l z*7JP&;>cZHE^@w<3f*nUKlaSXZ$ODa%MG0G%U5lV#rGu%Tm)bMJ)_E%woGNyx1!B# z-S`dy$9A^`S9STvof)Q@A+MX{yRPID4KN$Mu5H5wnusE%{5g6-fjaQIKBz}Rr722S zo<7?>_B|Dn$l3HROV)?7yMA6lVQdgN(M-FGWf!TYtgE#atlY;J_6znGXU#M-rcbEF zu;@{5oc`lz*psNVVJ-f%uTrmI<-GTb2LRY+@w|$*+{5`2cOR;pO)?DFrLE!Jw0&42 zmXp|d!LqOdVNat{KYn=|<j<l}C6~l(n8f`9StE<Ft2LtdT7%(H;ak*@q7$sIv%YS% z@fJ2kZY{bGxtV<m`8boEo^=M#nKg&>;E^oggNJP+V009lhaL?OdL6yqb5k%<S{R*J z|3gL1Z{0#s!zBj*rhMa@mfl?aO@@1GprE4C_Gi9r6U)HJ6GfO*kmV^$X($gf&pywf z?K}D|H&OmR!%WzzPKA@$AI@Z;wP4xGEDa3Ev&#J}OBt0(TR!@tkUh1cVPuV8k$XTD zZu+u-$($SYSCM><!_3l{oag&?u;ts4AC@;U=2snLN$D8}l)?WVUu&y!+hxH<)81^J zdUD80eVEX)y+7O=zxy$E_AI6wT253m6ni0|>gyX7MLKd;9~u7xKba5XSkQT>guy1} z^Qxqt{i_yd_~zBlW#yd~J*<ky)@ymL%d=bzo)Y~}dn88gA-R9rTFC9W8mn(u>j!q@ zOwW{XDnfEv*SUt6RL`_^sHS_e+$&|Lr*4xY9HBRr9kmnDB6;v@!=?5rm$)qVo&$Fd zztP(9=PTO4{J4B}5KNf6+jA-U!4n^yo2P$T{@S$@zbxHSY{Me*x&0CaVlr6=uV+;A zodYLQ+wAu;iLx9sW2F=ABowo?e`*Eyx(G@oezcyOuC`gFp^1C_gX^g`?@~_JCgF41 zW&k^7nJ;e6x!6ro@WsyASBsGgjeK+y3-;e2uQy}jo9g(3V}?7OSd#*!!Jx=UmECa} z?=~&Lu%0ApHIg8Hs~&ilUE{5rs^&WJ-8-4lOc}{9!a_kEJcnY!27;val4a3!MA+V3 zEB+#}?<gWH?9yQ{UNlMo?6^zebj^$0Y5vrS>Unc(p8thyx(xs%ih5<mQ)^K38MvjM zPa^8$-+WM%=+`OK^7cLBCmGP{HUk)2!~lhgWW5@go^9Q8-#1?xc4=0xX+{HSD=w(T z9R>zxgw*cXM*ui-vJWVDxoBYmS2&|VF@Vsu$T3eqFe^Htol?OL`2QJ${r@tC#(TzK z(7qeb>R|8e5*K?97XJNn`S%ZXU-jYQ<>}#pO-*IL3KU;)VJ;L5$Y`QX$H>{`GZFr@ z@gHFqkHG|k#h=j|gJJoBu33H$24Eq0&%c*Xh-Uj#4a41evd}jZL=O#JV?I!j7}1R& z*K+Igm`m6zv5-$t3K9-s8$FuWB3Y?>g))J^ndyK;iQ>txooJg#YCfp5fC~;N-01Kh zesoo>3Cs<iD%xZxkbZ=WF=<D^2Iop+%}L5w<iv9u!Vaz@a_r`WFv8gRu%Z%${?Y`U z+~nRk!yh=G5Om+X^;<AoKe)xZ`d2ybc4mVJ_#5KaljLo%&L8+Nc_gj+Pp#e4U2ku7 zbwO)GDe8cW@fTwhq51HU@gKs{!f&!okI21jc%}%~ReETF!qig!_CO&1>%-L!1kKDW zOIbQyaA6UBk!r9b&{hj0fiDQj9uxbnnUon6pG0=?OLgj-zu$su_=z<FEhp_Ly5b6J zSM1!iW~6yRORwl+LW5thD;@cBY@)k|H)T@oZ^`yO{huM>hZ9^a1hzK%XoqQlo<Yd; z>*r0>R*D=LgQwMEC+);kl+|{*zx`-<7-Dm*8<4PKLkOV9$0l{}H+4^Ksf)gK>^-{> zy4C8caKD@X@l=d*yzAqu^JHmKg+pJ#3I(r!M|lYdO?tbl@0NFDW|0s<!4fGUF3Ch( zUbG4M9G`{NN#}3A{_m#RF7i6MAFW@VN6Pn=e>rptZktpKYJ;!8WNqHbZuMb~hDaBC zG}Y!GTcIhOT5IPv<1TF(n`qwOhl8+*iA%Obtw~+j@jTW~O7ARQ)r0O|v#WY8^Ip4V zC9dn#(a7oJ;cWA`>fl=PkqUc){I$*0M{quPS}I}ZP@zBZ9F$6zc?TUvb=yZ~ryH>a z#8<Hn6V!XeA4Gztj?1?u;xGUu^(NKph+S#LOTn#Ht)#Ox;m-9irz6^zX(c0KZTlDP zhok^`rUKn<u=M_KLrO&k(K*B#wFiHTFv``m0fYK8{et{W7c`sf;aj)EkVKkmjyf4m zrmCXe6!DYuZ?H)r#=+6oIb!09?-940u@O%!+)r3pOSEhO;e9kbK}cjI2mx2u3d;#3 zBZ1kbdqpG4x53{B8l61^WnkDd%lp`27T+CkyTALCQ7KajuNeQBfK!TcZRX)`%k4pW zwl>=aPU8;l3r^xnoOlzOwULr^5K&@|dq|$C>?i$HUGlsEw)@Z#QkWT+TJ>j%B6jj_ zE*#fs(xOz!v4%AdaTW=e7-%YD8kQ>SfZ;H^w26?kvW0>FlHv(l2n}9mv|{+4U_hz^ z_)`Wf%J3kqo=%=dE}&5A$WIe1Qt55wZ&a4L6jyq2^xQU$(sL|6f+Rky3FN_pxt1`C zrHlZy!VB4Yerswyiuf4Q4{tsw$l0wC&-nNMAotZ@^0Hrx&yx{8<1e7q$R&T+VZ&Dn zQ~PMODFVAGr6j#>_I5f}J|t!F%ZDGy3*foN_^Tzjez&MMaaej(%3*aNc+jeTM(v}< zX{*j}J>!<98N@RN*EChbLU7rf1<*bZZE8tEOC>-UhDMX5hh42=a9Gy71RTN4XAcU5 z7a>tzyoS<(%G%tyl}*(66;@6Yw)cBF9d1;bvhX}%NFkDhI}$5GQBEp;@1hUJ=hjpc z;FHv$g$XV|m~>&qC0t<gnM$mLa!??Eh!on2KTr$SqQyuNLifujQgh`F&g--@#*X`D zzM-VrkKZU(AzCLsZmX^fHZ~P;@G=`2Ez@nXc9OdKza86wK=X1l>J~=<!$+e|>!Nd8 zZT6HjvaBZ7H^)DJ)YW;(XtZTc7hN&nu_aspa)@o&b?#%vSCg07yMv$+4zVugqYDZJ zsOOZq&mMG`X>Fe<g$<L4*H<3IbE*mL^$GtsW4C$zS#vhXMM3;b;gZAIHE{plt!jT$ z&4XbCav3HRp)$pzNYZ>kYGKirg7i#w7*f8xUP?KQ&{7S^ec1Zz_V>+!41e=3BsY-Q zyYI;fF?H|DZ>Cgf50|}9leQ9#M6#aby&t2_@VS+Du=-bzh{-xhAEqd*(rarTTBy1# zDMIppCJvwH=m<5JLR(%WTxh?Z0%kOP|0PDp{l&{Inlw1;T7DqLLHu|@0!=%dtN0b} zW2?y=n;yOxWF4Q+@+Q*pUMeLIW496$R|h^LtP^0f;aM-t;H|e_@Ae^ue!>^i)SXS2 zQq4C&_Po|`q1b$678jfEIj%S3Rr8nGU39{P#gQ(Gliban0irNe>VK6-Q5pzlk6aFJ zZ3-2JsG#X+liB9MK<<fb`_NcJhEYCwEEJJj8mpM+Bs<>+q^C!ysaKL1L`16>lNgpb z)2px<)S{EfMWhn&4O9UMXb7PS0!>cD-Jm4`Ah+(-)IyM$Xa>`Bg-_?^73q^2CUJ>r z@tJ6X>LW|OhC*5B@sdM>dlDNB8AusJ80}nW(d1wTOYm%wXha^8dI<!uOfxl5j)Vf5 zS<$(<Q10Ty5Oe_`1!Ox5<8?qXOECcPg9G1)R=Pw-4+X)EioVvKF6R}#i@xz;*z}w> zsJ`L|l}GR|5$4I0Wy1Ru^DQ7;B@p^7(>2OS(sdf%0yWXf0cPP75{Z&Tojt?BC_FLY z0-|e`MeZPceVl@aL2@!@0e;TI(9oC|LMsd5H!u=e2h4D4wWV-J3!b_N>@{LZ6{N%& zmLOdF717^=Q~OyHWBgOmw*P~jMitHAQ17IG<d-eEwI7_#FndCb2p_iw%fhOxBHjYN z+>)Q9L~ETAex!?nm{-jv>j6>>07%;F*612YL+U*RLZ|d%#GU9W+XGUlOA0(hvuFm* zt-lA%txQL}XjbVW7*AG&+sJ)L2`O7p%eyIOnzLwcJfjjC+GciI6V0$tZ>x7u%u|X% zaQOs=l1mqJlbuSr=%(eN=OqM8@a^T-G0^iU%MbxmSU%iDGAHUCYqGKvKZk~KEOQ_U zX&x<@UrRpv8CP#mbC>&l@daf)&Ai=wnvu}^zcO{2Lh-11r`6ds^kGk;_N6{+utQR$ z0_$$=wjzd_T@AT|t!~|AU65Wtooj}%Y8ArDDCFvqKhglfwj-)8;501KqLIPld+0uN zf7X@KRZUvWL3lcPR1cECN;+-_AQ8F0TSE0MiWi5u(fyW$_<AA(?LE`II7~4@n*?WT zqzs)bpXQ=J02xRm!;=JsOli3c7Zw%@CD?`g=%e{T2P5<pcr+FKn%X?nG--U|C@j2~ zBxRI&8qL7U<p55KQH4J<qBmisp&zAJMuBN&2(*2OLYp}Otc4UA<RLNm{fJxYGVet= zMxyo<(!IQ9t|grs&WcC(m7383M)V(jkm5s70l}yIMr_(XY=&}KyG3lQh{&g*E%)IN zpZ<36XRC!GD-M%#&zAy5(IS?weuXufl=q7Mt>P?w02cr(@}Z6~s@!C9NgA-ppxbC< zW7aT{h=xQyqs1xzVbiye$0DeW_w!-a9}lQ$7Q7d8X8W35HbNX@BB^Oq#mIhFu08)5 zDSgYD-iVMkA;-DW20niYo<9|$<WEyN<60r`LXOC!4$=f-Xeuj{@Bo3c6MfF6(R&fH zMpYGUuYJCw9slkAJJuII`(j-)HuGb=eY~U*2YDBH=--jJ*u0-NU5kI*c78SKe{na- zIxZN1elPX-q>&_1eP{67YZ~oL_lrP{|5^f;8dP-s4kuJ_u_-%tc;0<K3H|@|hu{6i zJKXOg`nSHZ!${HF&w$;^taN0Ya?zG}<QVw^se;sf%$LsnuI~JGh)qg^i}VmP;bTK` z!5Las81zNFxs*3vu9>`Ju6T$Zvo7l(a3lK5Lf+qJZx@TW{I6U}SjV9BP1qCN^GxHZ zk*%XO&uxE?;lknJMPb@IP21xIUfrj!4x_)cia)mVQ9lp=m2UeJH~&HD(U%)jcK=06 z>o{~AqO?(-GQPVvf9tqpMc0Y9(r6)^+zwe*Dm_`KMsE5{(3Jmh^;0Xm=eXGxyZn;y zciKUoX>C}h5o$i4sGNeHuwOe21+fVVL_?RK*y$1y5yA}bRZb<PC8X6nc`yf*O(E&L zG-5AbjK#HZ0h@IkN3Yt=4lsXN3skn!sD)bFEpA#DmVAfV%}$aVd>K!i%Z(BrBa_=n zb@XjfcBItf$`okIE(a)oE?!I*aQVjFv>>d!Ul(-6V4X=cm6m)#A2mFsrq>zK@y0uX z_|WV%33a0QB#nHPvmhKRHE|dta`Z3m?D5aIZ#5`VHABtA-H@-Jp_>iQB=U*5a+Z6Y z+WQJ~LY{tO9w!`_q2ek+PU>$ZevmNR?f;a?F5WyOs(ndb+;sPoMwEFqRXoFus0HG6 z<T`hlCd@)1yeNe%aj-Bet7B*BdZ&Nst)M%?XKg=tHr5hRC*{s+_r_Xx(f;Mc?SEqL z1<=HoZ>sL*IA3$zZ@);OCmGS{nbXe7PdUF+GCmI>`91gOMfmkMiEX9bd=aAu(wlR( zYVb7n<h|wfh~2Z4MNb2#SD$YcK1?CAD1&ceg~{6+9wpivNPKUw=e6bpuH%|b>jm0A zGHuZy6X?>(ccS^sCi14?e*(Y8`3D@}zoUqt46r>))tlX9VC;d8hWusD_~V~k_`dCk zw)~^mlWFGm<%!$oTEWb3?^xE`=D??-5@vtD-cBLRtX}<W!7=MWo_jB>C7AojkurUq zlU!P8-7&m94Kl21S~&C$pI@Tji!l2;9sAttujdJ+*3aktGz}AqxI5W~J;~Ro%rcSP z)~{-M0fknQAAqic0ONxX4~=l*!mKqDE;f%PGjw-<T5YnWPnwNI+f)d&nzck*m=iCm z6w|GK{Y950_@{^N`8%44nv`oahxpc`5$vWp>lVkK1;aH(UgsO#>DuRjaXeFBy`V$0 zT3xBLh0yZ{58j!sV}FU|$IrEdFuPRu5{KDzw^P#ovm7o?N1yxC^B?;%eQ)3Ue(dq& zPeridGa7>bEPRwUDjhOUDx_b?z5Y=ZG?1m8Y~i&r%zpIAFq~|6rp1O|-2Pb;@lvkd zZ@@OiP7%Scv&|!V{+}$eZ+{KQ1?-%dzHjtc@funCLmhT7K7=-1UFbV3cWO8OX}Gvc z<N0prXkWde>+i2wQ;Vnmh7%V-p>C#TpG24mKZ-|Ti-IqF&jSsUFVPBJ?hD$HPu#Yk zkQuwLoYM2B9hcnD_W=seL;Q~7LekZSQhN^7;{rZV9n$!}k@|C>NJjR^vzJzgaGav& zfY2iM-FIj~dm7E3vq6S0Z~ysMg>=-O|EK8jwTe3I^E(b!IUb?+?+-_;8cegS_r^<P z&e}Y3qp#jZ{))ZrhSAqnF3W~|UOsU!Ik0;n%xPN@ATC&~>LVT&UMXn6|GD8$SQ!=T z^ONgaeVq9hi)yp~ewu24FOxbl9?05U)&3d*g@)+<yz}7uCUkd=b$#TS`V_C7rKd;Q z?DouvBddeA!(VM+Ebg##Y}E7p0MgznV6wK=ZiWS+MBVhcN8_V$nW^xU?$m?(=yiBm z+*WzbPlt*D`&n~9SlI`vNg)k$E#J&UbDIM1TN)d-*CxXG2|iP|dvgC#<ygrJHCc-d z3$$TR;ReGCj{QQ!F#GeLnz`7$X!bvZskz9`-+LjPKD2BkGq|$sm;W!av-{2eQj4a0 zYC(HMOv03&nwFC0f{n+1Nc{J&;@>}y|0xg&-=<h_D%!jhk;{bT%Vj$J*(0Wst-26u zVA?!mP~iFfBV=pxy5;cQ@UQYybmQVl6ak^yPUr6op}q_8wkgvM*LNQ{H@A`u(^%;x zLP=uZ-)u)u{Q(>PdkP9(>Uib%v;9MWd;0a%Kfm=);v5qvvptOtdMZ=D=3ufqGGv_V zAM9VS@$-IM%1w2<3OF6|jTeSp%MW^c)9a(^DP|6w$j+-4BkZS(MJX|zYqHr2siBZj zg@`|_$8M%+uW&MtRA=G?6uZ?j*2B}^I=-U3>a5vSh}~<j`Jk{+&Ko^s2VgW(hnkFS zEj<aJd-%%KDe$B8N#~HzKc=!T)3f`s0y*9KTNNe^P2tmjeeJs-?UrZW$D4T%UR5`{ z=#g!RbPTTe(}gu#@!TM9?4$1%QsNnajQ1VFkK_5g2Ko8#7Q(F0cpscjyxCCFsYkyn zuA{{KcUbkZ!AOd-{6^NAz0=^u^_yE)4$fP~TjsZ;uRgH<V)WYEW8D&;P=8;q|NRdx zu-B*A<q~UGOL|&Y<?i$}?g5LV^)^S9GfT{)AF?Yu&ZEsc%%kloq2tb7)84jrZ@E8H zU2+2L+O+#U2tMm@DhYS7{mNH^0p>|&ekez7_3S>2G@?sN+c*u`{CrYIEm?PX*d32x zEP{{aL5#Cq+p<flyT~FSet-2Fn~cV{65}vRz`v^eWHC3&R|h>DgDyh(h|-PJXNdV9 zRg23eUB_rokv6t+%-0<z^!{y<zu|nd8$cw32|5@NASCPOft_jHIqYox(<ljl|LkAw z1gJ$~`1Gw(ReJg6Oaoy#3F72o@bUX!5<xKe4C%hVqm%WwZKE+lA8x4(>fO2qO3f;+ zj{Ncz?0L?W5h-O#x2BhA0c#86hS~ptdIpmK52(K}{~rLmKt#Xg4t<?)vqD@nS{q;q zM;!_&u*_uGhSB#{+1gQ7mS6wR#Q5#2%eRJc2}>@j)zr0I)P<(y;0hZy&GWSMcf79G zJ26VtD$SO+&e~A$sSMbGkpu+(WN${YW@)|V(MaU8L?+GBxu7x0;*rJN(pn>ep|q;D z(<XUbmu?2yBX|l6S142tZrJ5OR~8?zjC8D8->kfBsU8pdYQ@Tt^!-xt(tVs{hb`AB zH&kb)K+jK{aXLA!G`ewprO}k=7%t=)!xq3w=A;rA7$*>EHm`KToQj|Ix0O_Kd{hr} z@I%(JtXF&6N3T#cuhyNHqgP*QYwua{9>+qpu#F$rRcP>QzWnP9J2pH)fS9*XlJ}cA zZf{-S+;qLI^icYTnXQ#+@hMBc5blt?iCd`2+Q-JmznoFBJG-I7YXv5L!6xQ9vafUd zaF^U6OnLQpNF?{)HrfFE75Ui#IBxah6e97#5mri%;-~R$&ag!vhrG&nSy#4;_SAXr za_t_xd|>U5<Gc3gH9IRS33}}qfFa-a8-B#EiX68u*2lv=*)lZ+G85Jkj(vHJ+5CWK zda_R~Xi1~krGML-VXgbMTx`snta%@)8<v?C6(Fc22DE)~YkFSTY}Zr=^8awOfV|<* zO572_!3zQNTezM+B0HE+$=~6{<JkM-`Ag=Pg(x_*Rz{YMU+T4s<7iji^_b1}b?<R2 z%s$=}(RH+eJdH)+z~j2=)q>TqA?|7|J8DJiukm)!G_qg~AwB~ZGULKH+aHqNHxQ=l zL1o`N4jSP~iu1)NYrP$9+{tRBHGc=*wrS;hY9~CnT~yc6Ip=n8FrOB;Q~~S_?c|Cx z>4R5r_lB@{MUd%%GkxiSdmWm0%A!M4-dZw`;uyDmm<(-95fOz0IWg&0R3`7(tT3mr zBr{AK*BIm@G}k8?jzB-U?!Ra3Ly{?-_J3G?)-{MCiW=KC--?4h%ZsK!%k_&???;rX z5H_X$8(GrPkyk2r^*8uGKYG0X&uz6!^NMViV7?p-0Q3#R=qGxfRQ+JHXbjB-vze&% zgWW4#h0JkA-NG}naQofdDUSJ29@4gsIgqk&NSO{@C++U39!KqP1q4{_$OnBTLt>lv z`zAX=&bQb{>A7JSY!ZBipycVjq8eIRtjAXd=9<n_DfKMNxUe~Rc=4lh*B0Wh$HyZ< z_4mlW2du2IM)1Q39WQXWLf4v0^8otxLwIV=69p^`Djn{E2=_U&jRK10BbP6R?92?Y z=X{w>R`x7r<b4$`quDZ!P+jx#B@eA|Sj9vX6{n^Q$a0LRiF3Vgp|4%KT!S1|oskNu zlu{-qf9q?u$dR2&w#9_yRZ0nIL&KQ_0Kib&d{E2@UiYxvZtY4wrBj`9ll*~Y+p75w z4^2Jq+~XClXv5ixwHf2cCSyJ9CUfTNqxvPx=R!(c$QpiYJ>-HZPsYB_UV}+jKD)L7 zN`tjx&|;Vs8;o052urq5b>G<g9`v8*I2BzqXXWl1#kmV%{23e`>H@hDo6$^bVK+Vj zPJP}F)Gf5qKBx-j-*GFnx&ozKiCE_~_wF?-Y>_nDqkFq!jR~c?Sb;LSQ|BVC_UI>h z<UbKr^#!_is+FlcT}xx{UA~QOKXq`>MzsR<jiFQ{g)+3Fje4C*taGRpA@G&w7F7*= zz9Y~^pYZh)sa^l7)@cNNO@wYWowPSNrI%wB0<Eemb6*#S4|z1=!QuS(4q8|8h0kL7 zd`B$9RA@GU?RV{L#-~RnBFB`X%P3bsAD<d@y7)eB^(GXPQa{x;N+E&JVYp3Y*AVzQ zN45@=_bN$zn0s(gQ(w~)N{KCdOs&T}9zRz%q1BCrC|V$_4Y%^1x{N(SB;UV2&Q+<$ z;vl0TTU`|qNl9U~x~}U6JE=x@MZEQ0f9={+FI{C@v)D$GN_5O^mHvIPhOiY~Oj`6A z7tS!&DD=Sp;yqR2B99_pnd7g;L%RP%H!W6OBvm3D_qD>vhz%f*{4txXv7mJ$wxo77 zw&5~4!_ju+Os|juwB&s%5vLx7jtfD6y9WM2@XxW;{GdJg9?14p!x;_$w2xP090dVF z*d5+lCU@4DPc&`M;yn4yrA|8A3t_*cSxz+o8U6<}bjVC5kdd#jJp36tWXc<X*paVV zdl*K`*(B=u&pvyuG%G~<^<W=m#NK46Ee<U@BrzR{ov~w`^VDa%1_N{=BPauFm<1iM zr9$eS)5i)x5^N3=ge<m1M5sCg008cIBC*1*5`KU90+tsC%GKl+%Hr)f>yfSOqT0Cj zhn>dI1=Fj;!?Xo<IWr&3KF^TvN#-fO(4RKHx}b)8$4VzRCk&AtC|ahqviKS%MTtOO zZNR)!Bb?D0!XZA$1PvgyM~EOFQ5wS244h|4Dy1Q0=HVbEY!Ja+&~ihy6d8}loc+H| zn-B4_ZyToPfGh{LK^=Qj7c~z(L%`L1Fo(d$NFXcGrwux62ameyBPyD6YxQ~{6sFae zs}Sp5wQ*=I8Htlp?s1ri(BVR<y+MtuLrOt~Lp_Lg7LhiQrPzqU6_H_K-qNv0cZWNL zS*&P1aqF0iW_<s{Mc>4R?-Yko>*Cw?Mpd!}DJR8Ao}f!8S88pE)f=Sl>&2CYMckxX zST<}j+BMYVD(AG3G6yZ^vP>tswNvtp=m70>i(*7M>=d`It8R6)BYkuq=1u`qSN2>L z2(ea>jFKmV3UPter_H*p`Fo?9V}^?gPO|&zeMQ?1EUMuza7ZTOeX+CpN>_yJfP$T~ zX-Y63DBb$H?C=tv_=>%+s(XisDk)suh)W_aRnJv-aZo*%I793hDk!rP)iYL?sCJBU z6gxsNK00U64|{ggDo!{jb;4FavyNzUOa8D5`CW@sD2im^+HckF)_-9Q64D6KJ3UM> z$zlaasTI>@Z?}R!Zj<B^zaEdh4`^P3)9C{K_cL(LTqcks`Kb<zKu`N*Spz8=<fAPg zTAwl&+CN&|(~c~IcOj~^9JxumzKgOr(WYX;&KAj?4Bd`+jGh4f2hbTmD5ZXkpu!(L zmXU19Cb)Efuvya7J(vUlKr2#D03VvRC&bYR&eFHzeK7>Q0>+_VGBi2O@VFfbdZBBW zSjj3hA7*gF@InjVJgvK^Cubkte3#n}M$Hmn^ut@fXtdCNWo0)N1siw{vxx>z8wOL+ zf`2f0y~0q)d3mXd1k}jmMuW-qoN7c2n(*KY@Iq|eY-CEW1IEo9ZG*{rX;%~=J>_}e zbN-yCKM@AJp{F+036sbsUwzS)flvu=?;}9yysG`WT9ImD=8?!o;o+?a3f1UP@8Kdc z*&Q(s_~=^7i2a)O_0`^4a{>$-CHybIX0o&tE2t4F>QKf(A1v!z{fHKHSbJy8TLhte zAzx1uU!>0Kbv`b<x|@ByX$9Xj?;47drwo5mP`CnyYu2H?gwPRX2c%{Z0uZlstcg}t zMR*~C%F6Ln;GA0JMmM7ZItR~U8Fyr((Dp%7rgQk}%Wwws#=7_pARR4`mSAr_Hc*#f zcG`dF!4*A%v9#}d@1?Je6(>VP2CKtsn06o43BhzV#pJs>PH&Nyf1j$1ZS{e7=xe;| zwKaNG$U4Oxx|R#F(UVB-{IFe!U^@iNqTAd*d(iJIW9$dIBGMe3TV@>Qnr9qE7?Hty zJfv4`3pwdszhvL{zL1}+VoZ$HA7nJB{c=~Jro;bFIdTQRXqXs)vPGnt<f`F?gWG+? zyO!W6i_Q``P=aCa1!MsTD!@WThp^249sG`TSdi>&0=@^7U`;L@$jDb*I}B<%CYb># zM^lQw<2AC$8XOF*Wgn|h4lAS1Jqqz4l|^wbsAVBV99I2zu%2}{#JHt-S@u2b3mQu4 zYnYu<Ocs@yU82e|L>3!1q60+aa8(8X0HEN@wVd?_Ca`Xh1%Eeh44O+eN%X$rA1}<C z%%kbJO$BX~8P%nDQmh%C`WJ?<cNkjZU17D9`pta_uTAmaE18P5d@k=pkeNdBIiB>C zX>7dE=1V${IRY`1^Ze~}of5LZ-x{r}2X#LhSj9$wT$r`YM$W{fZZ;_~K-UJ|OQQeb zaV_a0061J%)W#>S|NiH?n^j$}dtPVR)i|X>b*V)=pSW9!t~VHJFYg;9mGExTDt4t% zRrTh`9#vKKh{%Yt)3K;Z!t<$yxiZR5O+doAN1%<UC}g}6KAQWDPyLE^LfKr6l@Z}0 z4?9I!og(dE(>Bd*=t@%!Q+dSHx;+n{*5s~PxiqQNDaLgbcXYkT>vOG^z>BQ;*bvMn zSYffX<o89Qy!i6WiJAV~;Kq#{65Y|Wx#7--Xerw_4}!xSEH%wu?@XUOT2x$l=s5%G zQYI_aarpzffqSZFx*1#cj>;`sZwG4I-`^+uxx6_i+QassTy`XV=Dy&{%;e%AXC4&4 z#YqXj%nDTP`GXY0o_=jXeBQ<CXYKVZKIL)b?m7i|xf&C4M6%=V%W@_byIj!Zbl2;m z$v&63byoB-QU010dKCEM9)r_?J%OYVqSxOjrN{P^PZ+`Jh+_cHEFU0pp+{0EV1RrO zQ=Z+`QZ@91;9*ymp4s?>?ea{X71|y}lVMO24~^k&HmYhJtkGNfyLk{AIt|Uc=Z0wI z0#9dWQvd+KktzTH0001qQ~&_D0RRBpId*yz|Nnvi|8@WWegFTY|NoT#|ET}|_tSJs z776r>${iPhk@c~%(UAky4i8bRImVQKf6gt!nzDd8aY$WdQPcCtSI^{5m?MEsm%Mad zNZrO{hEj?NFjR~>ovT-}lOTt+5!pt#I|Bd!z>wh+KF!e!7q8V(P1LiF44(X@x=n40 zZvNNYOb6pNkNyY>?+}z^kz*`zI}AlCE*8$`TK-z>i-!U?^Y@AB+Sm(xL)(cqT3np7 znbtJF<#mZ+ySx&7t-O>YaSJ6VTrv`e*(USq?_iy;+gHt4?J%|J#ZXn)c+~jPbi8zX zj)6@L4W_e;nN~ssCw5WAqaZCmck}%EwC-c48r${Zc&>AT>RQayt@Rtgbtj5wp{llu zx>dE|+VH)bqNq0dJ$gkYOuPQ@W$1*O-ab>d*LMcT3s^`kx!J7anu2r-sq)mYG1i~n zcqDv%eB|qhuYX3{@uQp4cI>r$pA4t)9DS^8h5b8mO=qflFLtf3=7zoqbLD+ZLlbDS z;?UYUdkDd?7b4mYqb9;vjb^Reb_+L#>U>{v0xs{K3nh;$q}fD0=CqqVY`(?omcE=# ze$jAMw>vJeeb?doJL076;CcA3TH(=C<o(|FMNYY#)Vj(W^=od4*j=e$eaSs9SB6+~ zD>8G|ht`NzF!kf5iHWuAzO9O=xh>-pqm_>l*C}z_IdEj4oVq9gyo~16u&<{kdrlak zCmC1q6OcSEYgbUqRmNl_bbse!H4nC%@l`)MCMhI<#2xy5W6e~8()vWtWRJ3`JMfGX zx2p`AcNG}GojSWfM^wIIl29XwXhSu?kt!3qI7R!@W3hQ7!T!lc3JFU<vQAakURq7m znApPAQt2L=TmYU26m-d1JBT&f<|AgH7yg{=n^PLd$iLR%g-8MU;`0kg_Qjkbxx-rd z$}n3s!jXnK55`!TSWACYO}U?BlJwmvpofh%Y$X#)$4IIJLXj;bYa^mWgu6PE005wz zkvr71dYqRGd~$uz-)HyEWJ0P>vsR?sl}Zp4+Y|e`ho7?L85e>qN{%dWH9woNhgMtP zI#D@tyzPr)Q0msZZ<(L*`Uu3yUO-$4X`7TUsbJM?Fd@caa;PpYS;Me_*E~$Od1p%X znqz1SA}>(Z#=Zh({gf$;BcG;OLz<dHP-(=b6HSXKIVQM1gov!c2+#;?-5os+y6Vy` zb-inM+}x<Wb0430h?<cowSk2W*!t%$C#Bwfl+4$Uk`5=Vbi(mOuPb8LUOH4&y{pFo zf6r#OYT{PnfiM+cN7T@&wq$LyW?xuu>pWVws$DgEgdbUg_KU0bSd)XuUxpMM;i$?c zcki6aRHpKD^BmtQbjx7hnkl_^gPpt7Fs8nOA*K1x4n1Zrk1Z|gkjuL9$w0YMYJX$T zI3ydfLJd!XL+=Lf{^4>TU3&N84Rd8|SFT&FXF?#87nkvQ?m({3CYPM}te0fkr|Epg z47<g((?@plhr__>%XmtmbZeH#s%e()>r`@$S+C5?(u*`pe~tYx@d1+=bhkWH4^``h zYToJad2jDz(5f!tgi#P{J?Ho)xEzx9J%{|gunM3PE@htuR6`>2aWXs!cR!C)9kcws zHg~FKF|$<{EevW<SCprjs~-6qCkEO)jakaHRd(LB(yA#XVba?$YU!=;+@%|1?yQ-0 zOM7MQ-=zDyzD5EhdfxXlW}fF!q(#9}>$v!fzEAFpD&$19<0np2i!SXE-&w0`V#ai3 zze2M=n~|OGlqQ6E0Z_9JV|rcrw@~^>$clkdN;Ointu1bIL|7Tpl}P{q!qN(#ywYC0 ziXA?q3*@R;rT|;^n=aNxC*Rh`CH&3K_uvqD-=HWM5OHgKN@5#$IUb|Z;hpiS?U8we zK^qU4hqbvCTL$aU{!zgC&7nXYMPP(mz%_rTAlBjYp@w&%Y_sr1LDZb^mMKE6TP99M zTuX5wFgl!yc%zobznih@fuFb^iJK)p8oF6J;b#A{bM3kf)%v+0oR(GjW%2*y`c;yH z`|7LGptzDmnnE&On`kKyB1O1W%5W6~>!RK_Dnr{r)b90>o|Wfjv3t;KJ01EFr+%nI zsc1#Fu6KkL`ns~2!BNt3Xja@B;!w--xq}DW|Fj%2qD5UNAv)6}Qnje9{<toxttr%I zxQ2Z}PUW4Mm3UrHQQ0{<0$3Fn@u7xN_(CfOPg<gNbEOx#Zpa!f!>Ix<p%5bbAas}2 zU1DTZ`KL`T88f}r8S0jvCUvx5$sucoh9&z<s(y7yNvhGa`$rO2AxRCzY>l>ap^vgM zr1T@-i%(5YA(Py*mgE32_pCT$=3h+KcCK}NV^4M2)31HklGCPKZF=^`C+#06Zx6=6 z94K)tdHb+gk^I><3ntFPv(xpOy}mBCf)pwv*1xlj<I>}><>PO*b}C#(XErlUaTEx& zf^3Y3erGCowa7H98+EF1morOT!Na-de`-GM2MTMxX+f4mdBsESJZn;jkrwtVJwwjt znT4WzGW0fWe92@Zb|0OiIM%B^stF_j9ym1Yh%5u+f$De=DA<}*3ChY;U4PhrSF}vY zY&LGSoYd-cUj05QAF<CQW8Ccf@BWH3+MELw?6qUf<*lgHWVJ7=0xEEIf}oTEH2rg8 z&);nC(Q6Gkw*V#}BbO2p?vfb*0L>bIkvWV`M{9j~Wwf{6;`LVlj)R--)x{gCi@kZ% z{#&&UgHD8awnI%W=Aqts(0UN}b^g~ea`Uf8ey)I+F-fpPX-jBf%A@E)BGnhjKbqkK zqPzyvc`2}2JJk`Kjc$GU%IiJDNGcCqyv$Bo9&cIsHwpZgHebFU*S-eZAG%J_i&4;g zEuJXisn&G5k#Vx+K-W}x7N2e1fN@@Bk#ps1&Mh@P_QO?Jsq4G)ka8VbZE!4HdvM$8 z=p@!vHqG!!d%RsYL$(?xaug$kD>`0Oszga^_xjJ<*M^{cZVe8;UJpCg{kc}h*}k0^ z=k0Ciu&?!tJtADZmid@g1rtEgT=l9;v4n+vceQFAv{nR$OHj1kphsBy<m$0{1%WoP zv>~Xa*U8Debw&hP%kONGnqAed*WDd{@Z5XT_7S_{BHe}D^}@EE?R!#c@|-wK>F>@S z*VAj(stvbvn*B1>UR?T<zUZRMT<tzG@g9>*9Z&8ZxcXgPA?M%!o_mh+hBva(7FiqZ zH{O2L=Y5&hL7WyH$vqDy@m``o7$Dm4vT?6Kf389Y+9JMpw0&M%;ZDAF3%cRK<dSBH zY0HOmcnYm~F6LW&T;iA}d7=V#OD1o(*1sAdu5Uwlmzt*@^Hr`;y;g_m`aniiVFvt7 zEh*@bqf<y3l(qNK4pnHIJsHdqo!Vw0-h0G!RVfRVLuG7q25nrI*)Vo%-zg7k5x(>s zZH8nZMi4s4xMPvJ#)v&n3dR3!Q33up6l{ZhydbSCMv=tiHkif_Qe~S5HU9LO$R)Hg zAN>d#MPh5$i8Hk@%W%l87OZ@gmjVf-HRP%>=KWQrOQ07ls=$N_P@(2q(!ytFM1-x{ zt5NsP9@li6#fZ$_GqMW<Q4>&X<Pz4p$S#;k0Dzdx2|V0<`=%Hx&Ky^;;ulsO+BEW% z+;|?Z&R_oP555d554F{vj8cpSo)iLzv_8>W_J6mb{F+jC?tYma4u8pA+i0jzt{CtC z(rjhl726hLR>Qn(>u4~^?aJ^IjdgX+TmN)oHyyqDInfxhqx8PWZ{l_VQ@$~+|F%dP z`f}N<MRl;p<L`*W!}vjzJm@Z+iv;bezv~R~Lcis>h93GfO4HZ|t>hVo2A93iV_At& zz$)5;Gfwehq|YBo;<4)R@IV#I%H`?mrgA}~CwLG)R!)43(`C~&s34Ape_3ziI4wWf z(w*zC*0LMxHtMQpNBXLK?!WK#%@UPGYa8A@R&KBFtfu{MJ7|7NFt%ajqwj%jNAioO z2a`PDeH$*l=$6{&W6#vWcMDqQ;jm`y7N`a2mUP#ncx|Pp1`TN|ru=q7m$!bb%<J}L z9}_J>OV9@ve6Nmt&uKNXKBmY>wKOr!?mY9e2uNNJj>RO29nC=n?mm?S=Zrda_ypu| zTfB36GP?kGvn1KX(MO4kQW<g%DJz|ak)twOvKi)<tboYQ6tpfAN||n6!2smu6vH}o z1nMp&q;#pY4ulyqrQjgYFj$aKuWG<d(K=C~$qa-!sBC0GPEis;tvW-uq45x{q3`<^ zNQbL46oe2<h(rjS0XQgvtRxLlga!yP5q@xX2*TD#Rcl}!=|ErmJ`OcTwibOKBbC+_ z2@N0sJ~(t@hRoi~Kp;WB`p{U6dVy@bG)9l==tU&Olwuupq!<v9`xQ-`YxOS0yuwe8 znD2Q;hXm+BV|Dsg0)G0~LNNe43@Yp}V8PTzWl`<`uqU%6XPcwgT*43`gkS(*IBiyQ zBHb_*h3Snf{Y_PqvAFLvNhIQ_sD%k%2y|D7@r#Tm)tScAU0DJg6}ja-3>z)E%S;kV zjaypREtz-YH53??Tl&W>h+GchOgTXC+Fjv`!RAxh!gKwi3ONHYN>QN8%i$nE9cIi- z0<KDSbAa;eSRH2$Qk@HteT=nviJ7sVCoXiDO$knAb_p)seHy-z5i2D^{r}WO;oUS2 z$HX5t@AeBR7vg13`809A6*45W1sT;xL-j%VXR;cbS~+BF?D%|p#11`y6Lx6)x?L`9 zSrxyq;TQ6<U#SKm+RCq;Tsb%&4XIOC(u1>j?TWDFWOa>%<W=`$G&iqj@8IC*x_Z|m ze5_4xm9<6tr855pU%PMJ0mXWAx7Dogo#fc{<=CrjD~DR#3|6Tqg4U$NQ^n2B{k{6> z9)@)_Dp%nhJ{ztzq|?GpP;p*+?zj|>)IFw@S7Vby%<fd8{ReME)9w%?j^Gk;9O=}l zKgF}d-5t_mC;m*y|L5BdompdFB*vG?E*aAlu?4wR{z^p!%-ocjCwBfILveMAj3~j1 zq@XDSD2|{=g)R`lQ;Vt$+A61pgrvqKYQzkn&KwXC>#6}oV6AWgr+g?QZEC9+T4+d8 z510f3HG%|m5P%Fg0+?bFh&F>05-}6$475g;04NC}L<%xY1rh)RG-Gar7=oa5Qd%e) z$O&kH226lJ0#!>9CPV;%fEk7egir}05b8px&k<dWeT<?~V06^#L_;kKz~G#&lo(>e zz2TJ$PywFk^Rk3YZze@HFa#C_n3$P<DAkAz3Z_pFxfZ!bDN|e&LL$w|;GC4Tb?fQ; zJF8P<Tq{6=FyNs>Q?gXxS_h%F^$&JNSFQb)QU#<MFZ29i_vX^a;knkxS9X4wRjiE? zC2V#NB7;h126(ZyP$8U68fIy5sXI9!RLG*raUQ`klQ>Nmh#ODF)l<H6tsN*XLE3bO zZf=noJuDo$LaRb~R}>5csxPjeSM$qu-K2N{?LZb3T0C*6$L88MWZ{@Rvimm<ahfjL z3OjVID%Mq~d4&%d8vkBmXi!MM9BOE><VQ&gU*i>m3P*)}jl#D>>i?qGgQ?zC&o6q( zcu!|%Qvd<LsVV>f0001qQ~&_E0RR9J#J$WC|EmB0vH$<f|Npc9|H%LUxBoAVH7(E? z-i2qqt+UnF^7nn2kE6QcXmJ1Ui`&1?I(NlwrAG*#w%S))tlxZWXnE(g^9LUX5%qPf zj7_^o2OmRODki+8#fsFfL_a`_Tlvu=SnCEoJi8awEM@Sw+z;xxBTwFVwL)R*EUzN8 zrwoMhDd5}YMvD)_f{%P0{@?#S>KyOaH9hTPI4_*yf)SqWJHfeOx?Wo%MmXCXmj;|U zX+=E~T^g%bK>|(E!f3F`kx>0PM>OU{8#qOZoU=S+VMxujkEz5*P%+E6pckSkj~!;= zS>)u)ChSIz(V=n+b6pDNpypAeQsq?^V3MxP;0APsIkaR+3@{-q0vhOH5~!M=1T9$` z7dnxZ92Y<pbXjDf2#ah^mmrfM0|p4RB*Vyc3Ur+#=m;TTSOky`(jwr@h8QEOAc9O* zGyx(*hyjWbAn@2KghF5nAOK)VMTr89P&PE$2uh2Pq=+t-OeRDi8iEj7Tww;x1P~}K zAhbpkc{CM-AX+h~O;=ojXfe@{Wznc90{|#ToR;$-zzi~B0ssJ4pcg?bXlQ&fetLyV zy-)%E=kp+ewHqkNPdksp#(K!=qL4CEbw9M0`{gZ6<$n!Dl*NMV`SCuox<A1Q#u*43 zVlKouch6jTtR>F1viJLkuZ)%pVDyU!2GW-?7pvF-7oZQ*3nY7<NsP@lN|dlRTxAGX zW&$uw=u%*Mp=j?3WzV>SAIJOB#zBoHg9t_ghi=*qQD?hg3Cek`=^Yx7Iz|Lo878U? z)v6iV2tD)1si-dBp}SSa;oXy4$>r!}3^YPULngS&K2*~M!b3*X$}y0mQY5s<AASn{ zb0wI6m69uy0(UT^l`X<Ro&2TYvLW=r_>|OIpT3+9YFo57=ECKF)00^Xt5P?<TI7{d zk!jI@g2O@&3cX})?~Vq;Ct_q%)DDDlRnZ~SghIPU@X9VdO8BDDh@O9;mBU$Tp<s6W zjPhSBq~Pe_(3N=(P3=XwuG&{zH;N^~nv+5!Zg~Fk`D-gB7hhfcHi)0E@RJnphlJ+Z zp~~^Q6-Pd<=OTOuQZb&DSND}Q(Vc17$CU_=IEbh_W(u>_FJuu&$W{hO5e8~`kb@<d zl9aK6&s;|bNDb+I!okkfW+I$Wg1mT6fiP(>cZf!b)WK9;JiIt>+{CtlMlu&Wwfd-S z*_dkwQ_1LH>kL(nX<V>~CGw1^G)U%EqOKxIFR;P_E&$x1QDZkKn58^qkdm{J!_r6w zOc6@B8;QyYK%K){Kytc(2*9eu5dbA|1aRcgSvWx}Xs8?@2CFkEJfuP*nY0@Ow9pz_ zA!(R`<Ya;YFrYz-1_**8Fbr6$(0G#`TUsK8C<YZ_Xo=7e7k3m;s!W?B8IddifEv&+ zO#n~;G=u<P05l*01*isf#2TW`1hj{U5MTx&nX88gD8o6bXrTh2761(-RS!UtE+I4? zji!mAr;o7_&=idV9{@i1^E89>O}V7ZoXXzEV983bJ<!pib{>WzUs^WBkTMR@LN)XE z3ezLcZJxb$$$bBQgqISc2t@r6ECU58!QO(I-i|ek#2N-bm6IqVa5ok(XaK+mWMGyr ziSW`|uoFr#2Vl1~|2X?#f3(&t_tp;ZT(S)fmkCXo8C=u9H%fspmM*ThhIpK;D%rbb zpM%&#bJDwrb9dj?M7K{sipf#k8!5Kv5cYis2L)*v4tT)f?uz%~!8y>^%U<~t?u}3y zv;^B@U4n~uW=c-uz-z9u91HWsXNUO(JT9a-xPM!U=~XF^aZ9x>3(x|Y;lgW#i{CAa z>1y?|Fc_)IhcO#X1HPpwzy)!IEAq#$EOY!dc@&W})I8I34i#8~mfd*pYA*GIXdN~q zwHX>0&6|4jgf7(XOKrN`FBK&XG*TzC=r7RfLepSk#B|pKDk8NQQ0ocnfkf~r&TPpQ zF-`fxn%Jv-cb(3krK?S&iIpQMX15Q<Z9DwL@8{5ewrZ{Gy8J3yCw~K~gR1VUdK?7D zKwqm{+BXMV=vFNfI;Jk}Cyh3a^=xF!?I40-9~^o>)792+GlI4+c76In!pLRdwlJ?@ zTP8~vNb49iuSiU%hw?LOT=vt+JIYYWysHsybNgpkNwEyc>G$o^MS1RNS^4xwb~}ny zW-6go%}|%2O_sW=5Qpw|eHw9K%3(#<V_ia35(hd5h>#vBK{^w;FjBgaiAb1<BnTk@ zut{hD5$Xal%4jVv000t(OfZ2pf|XE4AWy)AF`*Q!f+&zM1q75p3lw2%qW3Cq^U{)X z%Bz{zDgcZz2`B;*20(yZ03iybh(IR51T>ULn2`t+4T)fcDndXGLlFuPfe9#pfd*v) z0_X$~V4_+9jmD{nkTY}#;-~}xC_n%JL;__5qg4Trlt74$^QH`%IMl}|1_f#Wpb>x` z9{6)2!pt|VnmtnePogl25~h6tI{37!a_>be&nTT8MM*Kt4Q)NZVs;P6`pjZP)VT}M z_s}~kF+!p*KQI(!z-~|~Km|0X4eJTOAtJPtUEx4sHp@fnpOle3Ghj2V^oc#R*c=h= z8tSgh1VG#!v*}PO=-W@8&cCRzP;PBhe45A#!kmctY5{7@qC_H!UIb_!MB&J4jUiAi zr*gd&n;UCxWg{DEVZ!yytsv)XgilxW<Xu`~D-__v>(xM~?#W&l&~adb>dLf#e}e39 zxpB2{LB1I*S&AsF2G*A0JQS=MWB29{>}hTys@l-3ODNO`Jc~(>X607X`4$RiVh+U= zbbT_ws#4^vUz&-=gTRlAWZvulZ_VIZKM^B^NcCvAZMvvcdhLtm^5yyMmtI{hFE6dE zdzwxBq*Q40Xh=M3)OJ!K6*^oIN4s{1&Rvgo`gU!sujm=c%Uyd|ClJU(#ew26);c^| z_TI)}UJj!k94r1d8lD~@b4>HcOJwHZLD4&a^82LlPVMK>`s?Gtsoh!Efrt!dcVsjL zp7ELjwnRkuekwN}aAgkbjeY(4^&+2(O%|fw@YrFT2Yf^?W6HLz@4(KDWlU9_HZ;$U zR&+F~Gc<ZL^x1dHhXB>Bz-jtlf6xMs9l5#fO$Wo;kS)ka;0z_feK61)CWp&Z3eQ!k zp2Sj3qLtVoITR=u0FguqN+k_rkz61Ia2i1oAQWJd0ze=j00V>qZ44M7MgX8Sj6|s5 z0w@4cGSU!dpbSD701bdJ045j!M%|H)h}IFx=$Xd0l?Q-?rjUvvCZJ$VVNPfT5&)4C zS}Otdx&aTm1QpgWC_-Wq)Fhzf6)-?T0Q3Z`8XyH10|3N15{ZD|(L;frbKy;j2dE@U z;6b}_e?7aA0zEx&0lxQRxI$i=2H7H$UHo}CK-vS8%v^jPM8-!iE3Xg#?Tj^*ON0Xl z^Y<Sk<5(7XSqBS`hCQ#dg$lJykvSX0|Mm-DB!dr-T4{<8b0I@?{Ru&?@H6w@_irJI zToFSs%ym!8-Wkh&dG^sWOEy{RSZHQja<mAD5+Neor86^7kW}4F^{XvRo>Ax8f6gWJ z?$mY*O<k#Ir5-t$xQ8cg%FV;>aKALpv)SeifdOkx!)q%nU9OI+?Qqp78<!92lpDTW z0X3PlL)BlV(|xyG%KIaY7tE`Ukfw>NtRL#R=$rQ_N?zXUFZ98s$dVL4baX`|pYWm< zQ?*0?ZST`qE3AP7xJLc{<-_&%y=*6JuP)7+h*jFVqu;OfjPj~qygG^+{n#x<P|M1^ z!w*W|ccpm_5ieJRcszjyH)Rz1HFNbN59GA~fh_=V=xp*FwfhnMf_(k$qnCj9AK%&) z?^YS17>lAa)tk?59;w^;Vjo|l=wN%AS!R#t!rxrD&nL-hXXLu<jXYL8c}rW1)mlfr zoxitD$3ZG?w^(o8gO>SqV;BbpZ6Tx?fkbl_lY>Oo!U_bl`>C!cCOskM*qcUxI8;gO zpe1Vsh%#vvMXR_XDVA#MNpXS}wYs2IJ649baD1Ip#hLsZ7ffjqneU!|fs;nUl$Bw^ z%-Kq28ABj5<xmq_B}w!P1!u?n!aT$}bLdd43q0yj)|}LEKtLE!l0716wNi+H1VE-V zp=Ak&V5f+X0?}e{B2++BX|p6JBoho|XUIuVg-|2|0Fs3R7N9@~hOn5lz|e`^?q}Z? z0tqo96a-E!6o4QA00goK1r2DS2w(zvG$8^ZV1Nh&fIt8tW`x8*h>GxOp%7X$A)uN; z;87<O%A->r^++Kt8VXGzg#rj5fCc~&NFD&JJ#_#>@0dVn5c@^|dI&(@z!m_W_rp5F zNo+#2J6cFG_U8RC(Sun7i<ViJ&x<xOOXQQ^06m%U-E*~1<{#x<>%*$6Y3phtC18tA zW+~OC#|VO9z%T^vAf|E6KVVC#bfB`*wCk`lW`{Yj5%ZO^fC30xG25V&Y)f``Rd;1( zNC?+^T=-5{{6duyV<r@pmG6E-$XT&f6_5p6Ur$hj7fhGF<*S#!+7pp@FeD^TLQ#5x z<L&<wZom4q-p=(+K5PTaZN}<cNQ+ug3f+}tw0w#BG+bcLrN5GCUMjr$cY@>BPez}z z4UA*m3J)#cZS@~qYOjqq*E2}44TMHTtRo1@fi?XWWCKHn0;U%Ck=2^wnifFOTjT1x zlM-rBBSY$LtEb`?{ANH#nnnClslLH;QO*MyY@)>_KzfdFemPvX1XhMZyj7a{;z!7o z+|sY>52STp1xM=#9t$2TSa%Co{I?vToA*+^9jl_;)^^e7b0H`{-yc3jxH53V(5rpj zd3&}ddUW4<po~7$gA8G+3UHo~$eJMcqk0o2FC7sqAQMwA^pUgfvqh`7DwSI2X@J|* zv=uU3rwb2ksg8a`NiW<h9&y|e6Iz^EkR*l0cZdFe$Bwpd_XB3cNE|(^7V;p@rml{5 ztS+%W_s$L|EOS=+VWU{zDXF^}3gXTjDH<mtE=j!R`eFdS5qp)m0&`~Jt3It(9%7MG zM8K37M(aSp1ikSP5dtC)NGl@{g|Z<s!4xTDZHELgNCXV94q6LDAP015K;?iFAj~Wj z1PT_S6@p--if|E-5K#_+07B33+6$HefRM_Npj{NG1XNcPiiA>jyCaCkMIRZ^IEKi6 zkeCsthzAfT=n+H%N?-sWFbP<7s|N)z0wTtMh8UqW$Q(+i;GrC2WJe+Z1*!l>MK3or zG_l=?y+B061Vo?*7S`j5Bq#wI2S`hVyq{zld2Ve0g7!NAfQX3m$16p=DE8h@xen>G zYpweaO36x@SuBYFn=bA>FT_}FK3ksP8dfq3#9*ZZpoThUMQOE>FhFeNq07l)vmIbX zU_u+CZ=ul&AcqY%cxX7q%%E$z9JWhCA8%!Z)VP=;GeD5J_J!cCBj;Y1#$J(j_I7Tx zxh<r7a)%yCG=OoYJT+{;6_9_POUgU+S;91X7ys<x?3m{)>ub}BaZcYk?AU&&p=e`$ zK>U980r{*ZsEB4TG|@=YeTjL?V9?)xTscm$i0#OL#ltjMrDDqKU|eEHOM)c}VY{M` z*^rf6f~O`=XJ=CY0YJbi000000Etup0J;GH0EW0TaT@>Ib8~KNZEJFqkB4lHg8%<P z|Nk5R|1tmnQ`|5miw$iGiLtVB)S*7Oqpb!rycQOhR>mx!|NgI5no+=1K$fl9>^sU@ zRvN$MvtM4KluP~c>aV%tKgXxl@@oHXl+T`(Yt;eshj$hS0VEO(p5#-_kMEoxqBzaA za^Kc@6=liGy*{xo(u4MHO{{Ed`n^^EJ8T_3(Ons@*ZDSxT1*}XN{Y~x_x*6!t&xYv zLP}052V$zN&f|QJ*Z+>!DLojG*w96@mtyUfA8`ASo2U52%&qmZx2S%`#2zZB!c=7> zQoC?lpn_Jkw7z4rFo_6IC=L(TLmRruoSPZ2a!$EXY3kF*kgLMj!cEx0juv*b95+5a zdoKTYDU!duu-nTIlT?>i$3^wI8a@F*N@CT>m<$`p%o!a#m=m7tOk>a5gm6esiDVHr zS%U&7!kiK&gn$v;n9x8X!9uH)5eZt>l^hZjOPi3%kwgPdT7bxAEk%$;PLo<7gcg{J zN))5B+B70Sz@!KPfFTT_Z~B@#P+*u%#DpQ51a&4xs+=S#B6)~{fCA=~Kp+A!V5k-? z!{!*Rr=V34LTwU3ETO<GXaNNfVu3_t06^d%Qdw(ZGeVJI49zmO0JLvfLQ4iHV#1`@ zSwo{~ghq=V4Mczn69C-lSaqFC2*i><9O+zh888z_{*T#!C5y3GA1O3NVgK2pD2?D= zAww16rB^e1YBdsSGn+FNlKU%NEmUp;3L^RWpchS*&qU8cL8RJ>=>kLLOe#lKE^;x- zC^r#MHI8gLZAy_MT4N0%p&WD_gn=-F1^nsQ?wT86vsN(*<e}MhQs*R%L2|?+2bsc0 z#c)MP@*Kbab_PUBQ?_HZ)pbBWF7_sp3@PM(&s|>dNxPGFth_+G<Gh~l>;+RVG0HvZ z*=3OMd&7_$6p##2xJRH+xTs`+C~eRbA;F-mr0;Rg12qWU)Zt+8dKCnKLY&MlQ&1-( zCHebh*uzd6%q%TJvoFh9_FTERdDEs}@Th6CGJ*`cMSSfz5}|fak?z#JmRO-wrI6dw ziW+83;qS#7kP&EP+8{9trL+n&qlSTmkbq=Cfd)FGMoucik+J|311<dNNOkn40qSFs zPjVi1C*g<_m91nHXY7Ktx<b>a>+A9$#^W6idPOyLt-9G$=o5WSx9bnBIn+i7+q$1S zgh#FoYqY6HOswGu#j!?@uuU;cnhl*)IwO{nYKd$M;P7nHbq^Add<m)x<qYKIgkVZx zpkQ!^sv{4D%;a2B+IH^nH;h#b%^=B<tTB0d?4J5Wbtd48D2+Nrc`C&IUm9PH9Ly>- zH0dm&$}Wzjlhi{Sl#Ytp;?f1$k{h5cqE76XXlAX1v=0abI^#)Kl-2+eB&^CKG3X-{ z>P&Ev5Q0ou?D3|{FaT{ne?}ohBot!}=cL{>I6ijr=TO9Cu$a!CxeMlIgJGd-yf#A@ z%BItC;vkfsEZd+=*;03zCKXLo1w;!`5lb|ULz^1H$v97vR1De@k0b~h5ZX#~YdBQ( zu>cJ6U}LA7G?8+UC^XqLZMIyoCRzUNJ)=qMlPrRQqDv$3#2*tI4FobO{kZ&itHQ6F zQMJvfHJ$QVXNWY6Tt8S8^XgM(v$I?W;7D~2l0EqTbX)aEdvLUr9c_|A(=ds^pmQ38 z0tx+4X^THJgYUdv?D<U9Z5g?V`omtWvMtRPx;OIe<D$0m)-sW8=jf(~IQxvwkukL} zX{|yOcixy}6I=C!{v)s1UtMH$g8{S1;{6&+7bUEVQp2?i**x5EO)Lp&v@n|eAl_pc z7a)x+R~#UeWzvPJN~7w0TpW40`Z~2VyFoS5f9$L?DLPA~YG<k)(JJLa<e=82Ix|2a z8cqik2E_}IQg^|59R|e<K<X|z<~{yn#8ezCwJ1b!MTN;?1;u6I$nAQZP7@MJBJ0%Y z343N(SZ2zr6AXa2{lCiVAsdPy;Vc-l3DhdKks%nH2|5eG!HO_oBZ}+aU5hJJ0%j^_ zKqkrvCQYS{2}jcD$RnXp%kYkHZK$QDP9r&D1Yt_46&x7}muQ0sga8~4^#gEmY4TM* z8ig}(bs3`TynK}{^qt|5GRm0ZpinXLpzX9HPccF&svuFhYa$)OV4Yo=Wv<j&$vTl( zFhS}~lBYm`8sZ00S)?22mdQXAQw^d92xJq;rW+)UPB4*kREvedWJ$nj2um={$j=={ zbf1C<8WquP(<Ev%K?+D?u_VCXNAv-mL?kDVGI|<53<_CFK~7Egq5SRr&siOV^$$sC zP7}MrbaaWI(G3BbPY(i+P{J8wI*pYo3KAlsx*%5pF~oFJht?*IsEn17HYh--rM=^o zv0I>xbIKT$)}4gX2Q?jORR$f<gfd5l0|fT84j4i#)$75>Aa1}AZ0)t~>r@;nX6))J z6v^nhn`h=unPsWIk$KYHoCsVpZURoOgS7|au2`{g>&;FC&`k+O0Am7?rd*I|`(0`| zoV$s!BBoLp!4xl;PMFeIsZ>8eHMK?r)1&i7K8x5V1DF{li4NIWm)afbs%_bJRimM) zXG&|U!-e3y0RcQJLFE{*aD^M4pg|MC-nly8kt(JWnX$Q0N-C6&J%T(Uj3d;GR3a%Y z3vbK??qm7<>Sey)BU*uC>@^}%PQsV~97)60)Qk{8F(Q?L=~M!M#*p&6U;)-lqtHZM z6NSde(AJ=;6wp+wv5};zCNx!&63szK#a(d%Vzkz|0QOM<`dRg-zM0R;k+hfk<u>DI zHEw-5pO=I3QmM2tc`H_|biRX)(BAilmGtbJo-uEbrZe?Wr%v?3JJV1ffix^iT8w2? zIui8Aq@^O{Y$+wrv|vVn79C`pa}K3R6{-vX04jR%{m~<vSIJUzs3(4#i0qB(Iq&nR zeFP<|QtC8c%6WUszSAZ5>+tcvZ~eA*qgSx@nHwn&CwV-dphuaTskd!(m)`l>#+#Nu zO5I+8A|q2kV2bHRCTxU)SqX*@q7=-^K!{2~6uM9`!idQf3e{&)luGp}7*i1<DO3Uj zg$N<3BzWLJNlaj1kR(A8R7)ilLQO&;j06-)DAj~QRj^trp;29jCQ>u0kyO=GSV(4; zQL3?0Nt$RPpdeKxsgWR6Qc(j5D2SCDg~+7TiFE-^C5NkXpj2|?VZ=e82onKF0i~KC zBB?3`gc49?!44>-&?s0<DI|@NlT-#xZBm(LMvP2ogD5Q&Qw&B7Rtp8pBuS$JG+~+o z3XnuY1eyRqF_2D?j0oHYh=|llRiUJ0$;47!un;V%lt~fMgpnpq5QHj`RI<7TC9@O} zW22OZ(nV#8CLxtdD5N9>b6a*2B@j{okVc?TQ$#RPQ5h6PL_tGCC}U=757DZXQDGj8 z+KJMsv-ZO<%<t8qT8WX87#vHXX-lbM+tk@nM2oke%m!y_l4+nOhDZt?K<6V?!gj=2 zy^(x6v9%>J#{RYi=$>JvaeaQUYM`j1x(eZ8RUUmNdsvDQ03rZB>s_x?W@iHBBx-F> zUcK`+PScr8lsi#tG0CgqkXRd_DrjLz1=qgW2P4L#PN@E#nppk5Rz|8=w}|M`N*{<- z`s5j4ODQGOthH7{hF}5!008dk7eDC;4eikb8!<C{+}PrruM(|j@;BR+-uy>$udP4* zm^b?9FILf4quu<K+}vW6pUNXOp&GLqF_^3r3W*pb%}ir35tT^|1QDk63T#xTPNS)) zv3J5Dw;LJWY}^*dN|j`&6R|3(YmC@PB?Uq#i8ZJSC?Y8^GsmikM5t@%MBxgsQd3pL zYAU4ejZh(}*1@VmC|y*dWzu4D5~b8cRS-2K)mcRlD>Xur66#V(5JIKGKomv@4`UZf z6=g&-C6Oc{!XiMa)G8!|x>5%@6KSHJCQ})iR24!+bdD8J3IWzcsSu5dR44T?O(-ma zY5)zIDO*Gu!igxBIzTc(1PCeAC7>%=s*+Sjg^)^<6AdtEX%WSN@Mtxk^5AGBg&NcV z>L4N&mMj&3p>qi^wF03~S4yR4EIC;c6BH${s9-E6XqrmdsIe=U0R;z8DCC7MGJ%}H zsU-y&aZ#rh3&g6%s<jf5MrsTr15>CGwS^*1sIVGf4XGbFAL?oqNr!(K4p0FCC?!xZ z3>YBPqN!9R2tyP^x2<+}?UZbAq8JZ=XgbAGG&PK^2(*O~W}uWHG#Ob+hyh9<5bRh1 z0eb=fzRI1qDf3gOq0t3++K!}RhiNRQc^V=kI>I5eg}e^hFo0bXG7)n!M~ii|6?yQ- zPhnTA4q|@qdoo3FArYA!6%Hd(dw>koNgEqVDWxx@qx1#1TN@hERR|IQ08Hhos^(Cg zH)6V|q-<sh&2mb%cqXhPmdbRuNXOHy+7R}|H~AKx;BcuP5`D(sB`OGUkn-PkIYhgM zEDk9Yy2oT?U__R*B88Hy2E}YP0;1SBXJZaXf<TR_B{+m^O$)eb&4EA@a0DTqP!Y|T z3^6h?COjZRAYdj43Kb!2UQ!=z(FcOUhf>keITa`gDuO$q#W)@iO%$V=sK<{cW@1T- zj?T4I(GanMAxR^vafk#9jS3c8$wCSy89{~=#*!r|f`}?wsniO|Fr^??Kve;#B62B1 zDv+dQDI#dW9Ij9(RY0IfSw;bp5FtP)k~V|YSXC-JL5(Hi5Y*aA6(uVqnYxHWFbL;f zxU@iW#HgL2ArvtSfu_aEtZIs>Nue;e5))G|;Xw~GN)lphER{=(84wj&<AFxuAr<BT zAhTSGkTQq?q$CX?5v`Rhtiu7#QUqj7)K(+k!Gfd!l;|YVBxz9;<C%iiM!Aq>nFi>X za*0W0j3ltGiV#~hh75{op!@<<D+SZUfYLBP#8lQui@}(rjquq)thTdIfT<}E)DSe8 zhgof4fiewXVbKB|RD|M_4va=ZpqK!lBOQZ{hq)h1<OD)EW)4i_5=a2v${p9Kv~#yb z;S^<U!&mM!k4>6~DGH}3Ya6+icON1EDQK_AXbw}PeljyZWZ6YZSgkDNhA4@SilNKR z>8OGs`+|&81(H0#o^yquM7CBIVZ()B004mTQMyjkwq^<-(X}$_Gzc~C|J-xG{#Qs^ zD$)UKXqAgRI*B~^sTk8J9(5UPV_-@!MWy7XjG&;zd!GW;lr@g<drNf$2@D274*@2o zQW1p}C;$d*=>(I)V314(mBa+bn2LNVg$i^Wg0ThCAr=wFKrN*^Y-)Lu8VJEgFW2ZO zquU?nf_w_Kg+P`>N42m$wL!FVk!l#LX(T9FMFXpgq-X`0SSwXkRD@Kjfh06j2qlqV zg#bvY-iaWjk{Id=Fe!wp5UNUIR)C?}Xk-9^La4E1?j)Fq3nV&IHY$|rB@{}f7-P!x z4EYiTm9H+kQ0S^kg@~4&sS5@(K!8vYBGnZN0YxK&A$M-W#N33Y%9R&52mw$K-4J9l z3M5#`Lfu$UGhn7QXvjk&4@%w*xlNJ~kpz;RAUm-MLd-fB#2(5trbW)2#t^ct=q$rI zs)8I1lQF?lTQ_^qc?cW^7{fH71%x10Y9j{=70oqB711U|msFG-l3`K;GR&S3k5-_~ z9{LR}7@9#%7#gA#VA7<~05*||4mO6H)FJ{p1b~_bKu>39Qvd-#;3@zB0001qQ~&_G z0RRANPyvh=Cjb99|Nk}r|2+TyL;wFt|Nlb&|04fmn?!?(h6E)60cZ(me<<ewJ3xD) z9MDM;#m2V51W*MUh(rhh0A5;c>liyP;6${ImR8#|mf1WVn3;0h$ZJTiq%T0$RWi3B zqsu|3pHSg2H*35{t}XLLAP@>!EZrWUZkRShDWxnVlR2){N65%XnMy=1kzM9Q2qpml zz=59?Db^~NEgj`DQptO#nXYo_9ET|a$WwjOz|`b#i9DoSoFksJp_T8GK1>w;^n{(_ z0;pp%W@TbJ@Py9_m~N)im~;dbN2jw9lcbVjN>D1#M?omK6{ZBck<o=T+NOK5$ckg} z_rl1g;HU>(bUm*@P(4=$s!B;}f>odz1e$6>QmJH8lc^^Q6_qY2g{rQE0t!+vM^r+P zLP#}|f|Q!7sR$JnHL0R5iJ=BnHK9bEg<I2a*ta*j-C%S$Mvat~b{hjm3S)GRZfOLB zAI<0*9n#X>79}Mu4Js%gsVJag@$x+HdmQh-@I9{k_}=$<UDx?BKv6S-M@(v9qgk}b zDFDe%<_3Z$9qKgLwCBsrVlMzL5oR%*Gkw}PZ}L!~Rl`Hdy-EaUxll^LaW9thvv6~m zq==^{OUN2Ms0^+{YY7u|OpQ<V8cf;PW3>b+hu9%FDU4grSWy=YY8{4HC{QB(#GfhL zB$xFK;*y}K>jZ<18&Zku)^$j`c}qE3dJpQU2lTyI{F}sAM#1%>)^ekdo9D{7Lpsd@ z(BTiNj|0-(l1{WB@tbohcx~S#^nri<XjGhKNsuULU%>94k_9Jx`=(-|j_44!m;6p5 zg<?X63u<^(@>elxB&?HhDu9iv1XI9IqI?(CnV2X7<(JCsG15>L79p*lW8ia|iFo;& zI6vRHGLX(hmSbs0M~%B+-E*!ViWioTK)|vv@%vVa%2JYoBbVZ@Cq#Nme!ynv7fK*Y zy-lNLoMo&4DRME#7f)nZ(uv+L%$m$9iU_y=BhYpB(#4B~lPKjFs&~amr$$FP{U&)j zOEo0;>pt_8cjt@%EK8brGb$hTwtX!x>_7f;(}bF*PXfYP7)E;3!zP`kpA&lR7tr0) zAqHIP)*(|7kq&M*N)juop*z;Y3n?D&lE|+51&D*p#e-t=RE|u^;8MxVf|wF_>Qbb= z;1HCmjK3~WDYk(>7YU*=j@A~C%mI+aY4IKG_?q^t5Hy`>M-UFJE{RZ8p&;Z|ASgsb zSJgfqL`k+B3<87sqN)w460iw5*!mb~3`JdVMIp+qVG5N?oe92qYGpTw#n+-5F!3U^ zrXm9D2XzLhwsTmS_v9#h>ts|**9Qu8IROhcQG)nQOLg^@9>XewR<JtxNYN(gr_5;S zSMryV6!Zebtb<_Y(7>X15~i3u_mXJ-3M2n9IJm#Cu8Wb}!{dQe)&rwXy^}lxv?xK{ zX1VDmaQ?Z{{DQv7LJ2l{deq&X7?&|sXy&kLrA{dU`CDWFw(5-ez<_1i0vV<DNSBkK zGq9n;H*2zm_(TFh3Fjv05|Q^LO2?hRHV3H_whR}D_eE6L!-E*1SfN`*zCo?0R9&%y z_=C0$Oq@PcXSKZ`q{QT-V(g7*(wSgj@w&QjX?GHLK0npTnG?4ULZ<N6za=F^KEsk3 zQ3F7le`~eWZ_xu@6qP=yvG)=DAd$eR=$4=HWWB;#Stful9Suv|=pOe}e@y=X5N?!f zarYa7J7T$GSgVM#cY@km&h2CJbZGH<j}`+zoS9P+m4JznPW~+x=v7LG?HTCY<U^-t zk2KTC-6;D2-{f>ZDP|i9(g}pY!uYmwKC@Y0J^dJjO{nD-8VTDz;TgN%q-vIQ%Y9r) zKo|{=U_l>!p0p!njowaJSp0@zN__maU^<PfSb!|vQWNBqECpJb<|N%rJ**|8LB@eb z^~B62F=X0~B$>4;xk!@ActAqlBAsYUU5{)5p~>09&~IX%W5wz&WTW{<LXM}_a;{i8 zRo%SyLIs7hF5_g+fgw`s6Tb{Hn;)owGd(nv*2qj`bf)tIYB$t1>I4cdZB8-7;4Dlz z^_*-hGuuZ8-dT2|2x}gmRPVPT1<+eYOTj4{(zzi9{dc}Ep1KW+4<^i6bx3pnqwWw< zX>67&Fc$P{<Q{8ihBnl~n!pvlr1XMv)}l0m&K`3JILTfvU{b&t!)`juRy1D$5y?XN zH{t`kGN0+R(ohGPh4!2FP!8vPq&@O_o9ATQV&*<nYw>Q~mm$7TZa28*O7c)TXOZ1? z#eLofP4C`I&LABB6iC>WKVW*IbyhN@<Sa$ql_kq1NVKfVcgxY$IHbX2=kEDe^X7|~ z4?Gu$%8ZsiA0{E!v>)<V%bvPV^NS<_u(%qSEnak8Fc~aU67C{RjU(#LkmAUOfzxa6 zw@6+alS%?#xR)L;?z4xh<`N;qO&+agPphfvDL;3`LXlJdpULkPL;;>E3|QIfXA>X5 zE-ubCp|7W%@_~QHM@2;LqDymYG2kc@B`~Gda&-4A*?{!V3jsa-qyvm#Y3u)~nMVbw zULUID>{ztRKL!;G+S1{?x&*G-kQvL)DZ6`_joOil34D(a{O41Owd*sL=A^)Zh7a0; zi>Qrw)<_yZJSz+B+2f8?e^Fl~yKpE-NA+E~!$dEc6-99q0sa#rDakf1!m%OvYISt; zEPC`hLn4t8FdNvz0Jau$h?jn<chGL@lZC+s_gNMjE5D7$MeAtv-h_Y$X>7TR&mhT6 zrG>5QK^~d&6%#>ndICxhED<CQQ<C~08F;G%mN1@3OuJyMn%?FyasY>m;j7aU-Jxsf zOD-B{qF%^NbBY{TNqVni9RjQDsXAHmSQ?&O&x{ftJdrut5;<zTBh+#<)Iu+^AB8V@ zJ<LV7&&c1I*uW?^(+{`JoV+cuW6<(2Mwp1_HZrB}sAJ^b#g(EQsedVEOVW2q^LIX9 zZ2z_W@^buYo3v12m>916#dI{$$oZ{`&5!kgL`r&Xa=Nd0Y+`}2E#2I~mS)k%53kwE zO#%=b{klXp^esYscCAhcMFBXN=q6BjQoybqN1mEhaFN-gfUH0yxd$}rG~(;``@J=f z@gDlAxz*VP`OnGOD98ZA(DajM)<5qwI#4*vRj|c}>Q&`Rt}vR;(o?&Z-YoE1($Nij zhCIvqeGb9b<O9``ZGJ!3E?@Qdg2#C(FE*&^YZVHIiMy~<>;;GZWB^2s!A5F&eRE0@ zb}3$S%iKk?A7G(~LrGm>M@EEFF4jvz5e7qL-qgy3r+AcLY)5gNjd047OvS=#tp~(9 zp57PE__govI~XemC2Y=bakhQU-T{OUcr2cYB=9=;QN&-#J!}&7t?1ci&8clFtM>~i zIOpz3=($fGI~2xc=%lC|){=PWLH%9~-PsGh7H{NDAah*2-D;?JC-y|GkaDhFm<x>b z+IIiS^ZTm6QkBKh40m$8bd_G`Qq@TJW4-;rd0trqmp?Vz{oNEqb8l(l6jy19($>Ki zi0H_r!aOQ@rP*stMVv64&1rl_K_>C-2?n3ZMcWM1(tUonuh@<+v=MB&8x@X_{C=|Q zd2=Eg%&Vo(<SSdy9Xg5C5#Xk`me+F9D~`YVTVOo~O~E<o-0f?Y#-5FpKBRA7d$5~x z#5_53fpgaMd{U^+r+O>Li}X-hj_=_~&FvmCbWQ3ZZo!i(sQRi7^}K33qKgsH>J5Ji zKzc3C!wRjgTYmf$SDC});zkad0U!$2m{zN|aR+g$=S=VHdnxgrFfXK$A;gfv7Vm0& zIlVt!aU0@M?#Z7biWpU3YOFp7?ab)9lH#0$FQymZ@|h~FaVNf$mQn+UD~|6Z?E)9- z=>zh``e?!(`6mt3iLzQRRPx;1?w2@naXB8)Z3$%!`6y5B1&*;pM`@LgtILv&Iid0C z*7l)v`k;%4zMm%+me%xd8?^)9g>rB7V+<IB;keD@$II=d4!J|q(U0oIcf$ZtNm6qK zB6t2)qvj%}<jVFkX8ss}9MJ01_b_oin(-ztOTqX%HJ#Fj2%%N5^xbg4FiSC?|88c? z|6F!zpLPK4uT8sl50^)N>G*C6bMkzZ>me?ey21zMh#s?&Jb!HOi0|NET#J_4=!!Q1 zE#%~-;Z<v?AkktJ2XA&)!L3YwUG)-1y>zi})666Gsj2$Zrte1}gR+S#jNlbq?e#(L zue;qfxK78xtaDzTC&rK9OwFI;RnqEe3Cm_RATe{lts}2DIw7|O;7e~!)Y+)X`aMhx zS0ZBe1M9S6U~1+@vI`4FRtr;sdr~%zK``$?(Y&cBf$rrcIjO9Jm|F(o{_USCk@b%x za&FTLD={!j+P?JoTNIQ#p5ddRtyLUcyb+yRnrqfI<=fsb6u~=u8sNl$&Fm!qb-|n9 z&geWLE}KwxWvJA6EZy3nvtZPIBm5se0urlvbsJeK#I>JWb$!g-9j+x^EZh<)E+|#j z3tO2l1rIYT@iVgxh>S-oiFTp7H%O!fGD8e%=vi1QDF6%L$p(*hc2#P6i-iM^8)rBK z`wpi@5LUPM*I@F=Mb_Z48_f-=*hb@QdBKF_IJ&U{KLz8VY72&pC`mzpLL#qw))-wH z)Fpl(n@XHbxjl2?YTZ|hv#}GizyQtz6m&=xM7w6gSq)QFpJ6Cb9q)j1ELKX))s>1T z_i44mobJwsz3(%6GfxN3T?bH8mnEyxhexAj{z2)FHquL6R(A-@nBOpl25&9fza%dM zyMRFwNV2d4vp7nX#1lM4#|q_<oi*&W#i2C*8z3|oG?us6P3zyz%Lf}Kr@pBhiJHHE z^0o&Y9owXqY)^X8udt<CvN;k}nlzWM?k&4tmHv9FrxUPX6y0C1yYRQGO+_LnO<N39 zQ^YK(TrkXs7B)^1Q%1K_lj0$%>VA^T_PB)ud#+sXp~5qY7X(+<h0y~387FGh29qs; zOZy0YlbOAt+Vgrf{brI6v-KVs@ATFwphpS<9XQSeY-1Xt!MJ<Rp4W=Erd)k)$!VhE zJjYo&$N+ef$y>?4xL~N!skLYl>vf0+JN?LNrj|8=26?oLDscpM#b~I;1c5wB`AX5O zPzh%X${~~=TH_eu!EwHbW%l;W@#yQ=gr&*mO@m>$aSk)%K~O$nrT<N9njo;rVT@Xe zrX;5TRtMI~p;=D7fn_u%Xn_v~1lQqp1;Aa}D-rHfFnbd}se^DrkvkRQDGk98XF51Z z<<LC@U`78c(}<V`(njjPAbA&T56#DKKkLpI)JrKxmbx;y%WEu0v5-Sb_(oI7IO0Qi z*=v!8p2}dk@;4Je6chFEPsd53tRknnFhc5e0tb_DKV<=5@ghaCX2PjX7$fMf_uatn zjJUHBvIoTw=S6K-L4_$weo|R45#f?^nPE3JX!<dNJ|bi7(``UmL+Q9@A(v8xlDo+2 z27_+*N8d?3XuOf&m529;=kfh_CZtYw4kn$DgQwqmj=4l}wD;t+npp&&EAe-JAdx!y zWPeDam&g)Ja6}0W<ze~wq<YZp;2mkQ|EU%8TR%_dc^`SGkYZlGqE(D<YF@P=oqHzn z&(9ivp5b!!C1kQQc5>d@wle16V_QFVanu0;!p5nZ^6?GFa#6x5TxNC7%@1V>$iSuH zi(<MZtd6I8lXff^g2G!2W{uSngspFqZ%Su!>T}QuOOb@Bd5(KF5A-MQy_T|0Z@w0m zH(8#=jljq}zX%k(&Gk9<n|7Y}xP4zkB+nF`YaUo`@&5?NpZ`xdp4||RroufbmTT4P zYvuo)$v|IU-@U$8y1v%CzJ6cPOR_6#uJ<`Xo-uc6VTYYky7COZiIG?qGGS)UaCrI} z+iQa6u;8>*j;b*|?y_X3wqcds^oX$P+OW^%*|(h+c}Cw2moda)x~l??7W{gu)Iws8 zm;+Zn3x+1~zL9$RaKgm4I&|0YHk$K+o1D?u&`uV#mjae)#H@7@#cFDv7|axAPm_$X zHTFqrO5>tKMiymO#Z8n?v8sfips5@-Awk;qoiXjJ5<>^Ign|k&YJGU(F1%i)okuv% zpj6Lhj!r?}HAS)tGB9nya+<(J*g?`GV6JNgcg<sKyjM5Mvyjqt>J(V2#!(9QtN^z_ zNaj;PxEZ~JN@ZHTrl(w?sc2hWLdsNLd#ixc^FxTANVXB!++(V&jC%2QfRyJ9=!ZLr zu)83U1fbE!{Ct(UeD=*f(q>w~yQ1gmR;lskX_DPWHk(;yr}EZ1!sX)1JvA+-6Wy2e zI-UqSle#2`2IYAP`<Gg-^OTCmN-Cx?1M_J!)1~bFpE(&lfBXOm>pL}QN_x05>PT4_ zCeMK76X{rQ8d_0C^te^sqO4nY6CK0N@K_GjcB$pv@?yik9Pr44dLTZ=_s(yYVDex1 z3WZwDZ!gniy{L?TaJAukHC=d~yuPR8OeR}I-wWraskFLP@$d7xl|oGSKQd+%CVeXO zp~6N9$-WY!T25|qDxi~|;sogW-D{AK%0AVQ>LigzN8i%MEdqYcJ;RXau63<_+Hm{; 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%0An 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 dV093LEi$c7W(3;f|dKQki|gE_b) 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%0DVU`V98o_%%8nNzbvFf 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 ?PJ;8Mp5^gG=k?_%`~lf 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�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 h?oaPG91MTCp66S6I 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ࣼMfk+B_^{`|prC;J8g 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∨J{Z(8lwB0@+guJ_ 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%0ATmcO<eZ(8g_l2J2O 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�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 ^#A4kIUbP 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 T?s3r-;}Z;7l3}99B!T|{bu+Q# literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/sounds/button_click.pcm b/plugins/snes9x_gx/source/sounds/button_click.pcm new file mode 100644 index 0000000000000000000000000000000000000000..de3d55e3bfe93b57942bea05e10832a4faec5a5b GIT binary patch literal 7204 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 literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/sounds/button_over.pcm b/plugins/snes9x_gx/source/sounds/button_over.pcm new file mode 100644 index 0000000000000000000000000000000000000000..777fbc569982781ceb5eb6c614e1bea023900ed5 GIT binary patch literal 2876 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 MaWFJxUR0I;11V@^NB{r; literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/sounds/enter.ogg b/plugins/snes9x_gx/source/sounds/enter.ogg new file mode 100644 index 0000000000000000000000000000000000000000..3f74df8eb31778d1644df9fbb6febeb520422f6d GIT binary patch literal 59779 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 CEV0`F literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/sounds/exit.ogg b/plugins/snes9x_gx/source/sounds/exit.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f792cb5666a90eb29ecc958be1c3fa463a757970 GIT binary patch literal 51898 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 GpbY?!1M>3# literal 0 HcmV?d00001 diff --git a/plugins/snes9x_gx/source/sram.cpp b/plugins/snes9x_gx/source/sram.cpp new file mode 100644 index 00000000..5ae9c96d --- /dev/null +++ b/plugins/snes9x_gx/source/sram.cpp @@ -0,0 +1,173 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * crunchy2 April 2007-July 2007 + * Michniewski 2008 + * Tantric 2008-2010 + * + * sram.cpp + * + * SRAM save/load/import/export handling + ***************************************************************************/ + +#include <gccore.h> +#include <stdio.h> +#include <string.h> +#include <ogcsys.h> + +#include "snes9xgx.h" +#include "menu.h" +#include "fileop.h" +#include "filebrowser.h" +#include "input.h" +#include "snes9x/snes9x.h" +#include "snes9x/memmap.h" +#include "snes9x/srtc.h" + +/**************************************************************************** + * Load SRAM + ***************************************************************************/ +bool +LoadSRAM (char * filepath, bool silent) +{ + int len = 0; + int device; + bool result = false; + + if(!FindDevice(filepath, &device)) + return 0; + + Memory.ClearSRAM(); + + int size = Memory.SRAMSize ? (1 << (Memory.SRAMSize + 3)) * 128 : 0; + + if (size > 0x20000) + size = 0x20000; + + if (size) + { + len = LoadFile((char *)Memory.SRAM, filepath, size, silent); + + if (len > 0) + { + if (len - size == 512) + memmove(Memory.SRAM, Memory.SRAM + 512, size); + + if (Settings.SRTC || Settings.SPC7110RTC) + { + int pathlen = strlen(filepath); + filepath[pathlen-3] = 'r'; + filepath[pathlen-2] = 't'; + filepath[pathlen-1] = 'c'; + LoadFile((char *)RTCData.reg, filepath, 20, silent); + } + result = true; + } + else if(!silent) + { + // if we reached here, nothing was done! + ErrorPrompt("SRAM file not found"); + } + S9xSoftReset(); + } + return result; +} + +bool +LoadSRAMAuto (bool silent) +{ + char filepath[MAXPATHLEN]; + + // look for Auto save file + if(!MakeFilePath(filepath, FILE_SRAM, Memory.ROMFilename, 0)) + return false; + + if (LoadSRAM(filepath, silent)) + return true; + + // look for file with no number or Auto appended + if(!MakeFilePath(filepath, FILE_SRAM, Memory.ROMFilename, -1)) + return false; + + if(LoadSRAM(filepath, silent)) + return true; + + return false; +} + +/**************************************************************************** + * Save SRAM + ***************************************************************************/ +bool +SaveSRAM (char * filepath, bool silent) +{ + bool retval = false; + int offset = 0; + int device; + + if(!FindDevice(filepath, &device)) + return 0; + + if (Settings.SuperFX && Memory.ROMType < 0x15) // doesn't have SRAM + return true; + + if (Settings.SA1 && Memory.ROMType == 0x34) // doesn't have SRAM + return true; + + // determine SRAM size + int size = Memory.SRAMSize ? (1 << (Memory.SRAMSize + 3)) * 128 : 0; + + if (size > 0x20000) + size = 0x20000; + + if (size > 0) + { + offset = SaveFile((char *)Memory.SRAM, filepath, size, silent); + + if (Settings.SRTC || Settings.SPC7110RTC) + { + int pathlen = strlen(filepath); + filepath[pathlen-3] = 'r'; + filepath[pathlen-2] = 't'; + filepath[pathlen-1] = 'c'; + SaveFile((char *)RTCData.reg, filepath, 20, silent); + } + + if (offset > 0) + { + if (!silent) + InfoPrompt("Save successful"); + retval = true; + } + } + else + { + if(!silent) + ErrorPrompt("No SRAM data to save!"); + } + return retval; +} + +bool +SaveSRAMAuto (bool silent) +{ + char filepath[1024]; + + // look for file with no number or Auto appended + if(!MakeFilePath(filepath, FILE_SRAM, Memory.ROMFilename, -1)) + return false; + + FILE * fp = fopen (filepath, "rb"); + + if(fp) // file found + { + fclose (fp); + } + else + { + if(!MakeFilePath(filepath, FILE_SRAM, Memory.ROMFilename, 0)) + return false; + } + + return SaveSRAM(filepath, silent); +} diff --git a/plugins/snes9x_gx/source/sram.h b/plugins/snes9x_gx/source/sram.h new file mode 100644 index 00000000..dc345e90 --- /dev/null +++ b/plugins/snes9x_gx/source/sram.h @@ -0,0 +1,16 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * crunchy2 April 2007-July 2007 + * Michniewski 2008 + * Tantric 2008-2010 + * + * sram.cpp + * + * SRAM save/load/import/export handling + ***************************************************************************/ + +bool SaveSRAM (char * filepath, bool silent); +bool SaveSRAMAuto (bool silent); +bool LoadSRAM (char * filepath, bool silent); +bool LoadSRAMAuto (bool silent); diff --git a/plugins/snes9x_gx/source/utils/FreeTypeGX.cpp b/plugins/snes9x_gx/source/utils/FreeTypeGX.cpp new file mode 100644 index 00000000..8c2f9365 --- /dev/null +++ b/plugins/snes9x_gx/source/utils/FreeTypeGX.cpp @@ -0,0 +1,667 @@ +/* + * FreeTypeGX is a wrapper class for libFreeType which renders a compiled + * FreeType parsable font into a GX texture for Wii homebrew development. + * Copyright (C) 2008 Armin Tamzarian + * Modified by Tantric, 2009 + * + * This file is part of FreeTypeGX. + * + * FreeTypeGX is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * FreeTypeGX is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with FreeTypeGX. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "FreeTypeGX.h" + +static FT_Library ftLibrary; /**< FreeType FT_Library instance. */ +static FT_Face ftFace; /**< FreeType reusable FT_Face typographic object. */ +static FT_GlyphSlot ftSlot; /**< FreeType reusable FT_GlyphSlot glyph container object. */ + +FreeTypeGX *fontSystem[MAX_FONT_SIZE+1]; + +void InitFreeType(uint8_t* fontBuffer, FT_Long bufferSize) +{ + FT_Init_FreeType(&ftLibrary); + FT_New_Memory_Face(ftLibrary, (FT_Byte *)fontBuffer, bufferSize, 0, &ftFace); + ftSlot = ftFace->glyph; + + for(int i=0; i<50; i++) + fontSystem[i] = NULL; +} + +void DeinitFreeType() +{ + ClearFontData(); + FT_Done_FreeType(ftLibrary); + ftLibrary = NULL; +} + +void ChangeFontSize(FT_UInt pixelSize) +{ + FT_Set_Pixel_Sizes(ftFace, 0, pixelSize); +} + +void ClearFontData() +{ + for(int i=0; i<50; i++) + { + if(fontSystem[i]) + delete fontSystem[i]; + fontSystem[i] = NULL; + } +} + +/** + * Convert a short char string to a wide char string. + * + * This routine converts a supplied shot character string into a wide character string. + * Note that it is the user's responsibility to clear the returned buffer once it is no longer needed. + * + * @param strChar Character string to be converted. + * @return Wide character representation of supplied character string. + */ + +wchar_t* charToWideChar(const char* strChar) +{ + wchar_t *strWChar = new wchar_t[strlen(strChar) + 1]; + if(!strWChar) + return NULL; + + int bt = mbstowcs(strWChar, strChar, strlen(strChar)); + if (bt > 0) + { + strWChar[bt] = (wchar_t)'\0'; + return strWChar; + } + + wchar_t *tempDest = strWChar; + while((*tempDest++ = *strChar++)); + + return strWChar; +} + +/** + * Default constructor for the FreeTypeGX class. + * + * @param vertexIndex Optional vertex format index (GX_VTXFMT*) of the glyph textures as defined by the libogc gx.h header file. If not specified default value is GX_VTXFMT1. + */ +FreeTypeGX::FreeTypeGX(FT_UInt pixelSize, uint8_t vertexIndex) +{ + this->setVertexFormat(vertexIndex); + this->setCompatibilityMode(FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_PASSCLR | FTGX_COMPATIBILITY_DEFAULT_VTXDESC_GX_NONE); + this->ftPointSize = pixelSize; + this->ftKerningEnabled = FT_HAS_KERNING(ftFace); +} + +/** + * Default destructor for the FreeTypeGX class. + */ +FreeTypeGX::~FreeTypeGX() +{ + this->unloadFont(); +} + +/** + * Setup the vertex attribute formats for the glyph textures. + * + * This function sets up the vertex format for the glyph texture on the specified vertex format index. + * Note that this function should not need to be called except if the vertex formats are cleared or the specified + * vertex format index is modified. + * + * @param vertexIndex Vertex format index (GX_VTXFMT*) of the glyph textures as defined by the libogc gx.h header file. +*/ +void FreeTypeGX::setVertexFormat(uint8_t vertexIndex) +{ + this->vertexIndex = vertexIndex; + GX_SetVtxAttrFmt(this->vertexIndex, GX_VA_POS, GX_POS_XY, GX_S16, 0); + GX_SetVtxAttrFmt(this->vertexIndex, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0); + GX_SetVtxAttrFmt(this->vertexIndex, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0); +} + +/** + * Sets the TEV and VTX rendering compatibility requirements for the class. + * + * This sets up the default TEV opertion and VTX descriptions rendering values for the class. This ensures that FreeTypeGX + * can remain compatible with external liraries or project code. Certain external libraries or code by design or lack of + * foresight assume that the TEV opertion and VTX descriptions values will remain constant or are always returned to a + * certain value. This will enable compatibility with those libraries and any other code which cannot or will not be changed. + * + * @param compatibilityMode Compatibility descritor (FTGX_COMPATIBILITY_*) as defined in FreeTypeGX.h +*/ +void FreeTypeGX::setCompatibilityMode(uint32_t compatibilityMode) +{ + this->compatibilityMode = compatibilityMode; +} + +/** + * Sets the TEV operation and VTX descriptor values after texture rendering it complete. + * + * This function calls the GX_SetTevOp and GX_SetVtxDesc functions with the compatibility parameters specified + * in setCompatibilityMode. + */ +void FreeTypeGX::setDefaultMode() +{ + if(this->compatibilityMode) + { + switch(this->compatibilityMode & 0x00FF) + { + case FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_MODULATE: + GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE); + break; + case FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_DECAL: + GX_SetTevOp(GX_TEVSTAGE0, GX_DECAL); + break; + case FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_BLEND: + GX_SetTevOp(GX_TEVSTAGE0, GX_BLEND); + break; + case FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_REPLACE: + GX_SetTevOp(GX_TEVSTAGE0, GX_REPLACE); + break; + case FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_PASSCLR: + GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR); + break; + default: + break; + } + + switch(this->compatibilityMode & 0xFF00) + { + case FTGX_COMPATIBILITY_DEFAULT_VTXDESC_GX_NONE: + GX_SetVtxDesc(GX_VA_TEX0, GX_NONE); + break; + case FTGX_COMPATIBILITY_DEFAULT_VTXDESC_GX_DIRECT: + GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT); + break; + case FTGX_COMPATIBILITY_DEFAULT_VTXDESC_GX_INDEX8: + GX_SetVtxDesc(GX_VA_TEX0, GX_INDEX8); + break; + case FTGX_COMPATIBILITY_DEFAULT_VTXDESC_GX_INDEX16: + GX_SetVtxDesc(GX_VA_TEX0, GX_INDEX16); + break; + default: + break; + } + } +} + +/** + * Clears all loaded font glyph data. + * + * This routine clears all members of the font map structure and frees all allocated memory back to the system. + */ +void FreeTypeGX::unloadFont() +{ + if(this->fontData.size() == 0) + return; + for(std::map<wchar_t, ftgxCharData>::iterator i = this->fontData.begin(), iEnd = this->fontData.end(); i != iEnd; ++i) + free(i->second.glyphDataTexture); + this->fontData.clear(); +} + +uint16_t FreeTypeGX::adjustTextureWidth(uint16_t textureWidth) +{ + uint16_t alignment = 4; + return textureWidth % alignment == 0 ? textureWidth : alignment + textureWidth - (textureWidth % alignment); +} + +uint16_t FreeTypeGX::adjustTextureHeight(uint16_t textureHeight) +{ + uint16_t alignment = 4; + return textureHeight % alignment == 0 ? textureHeight : alignment + textureHeight - (textureHeight % alignment); +} + +/** + * Caches the given font glyph in the instance font texture buffer. + * + * This routine renders and stores the requested glyph's bitmap and relevant information into its own quickly addressible + * structure within an instance-specific map. + * + * @param charCode The requested glyph's character code. + * @return A pointer to the allocated font structure. + */ +ftgxCharData *FreeTypeGX::cacheGlyphData(wchar_t charCode) +{ + FT_UInt gIndex; + uint16_t textureWidth = 0, textureHeight = 0; + + gIndex = FT_Get_Char_Index( ftFace, charCode ); + if (!FT_Load_Glyph(ftFace, gIndex, FT_LOAD_DEFAULT | FT_LOAD_RENDER )) + { + if(ftSlot->format == FT_GLYPH_FORMAT_BITMAP) + { + FT_Bitmap *glyphBitmap = &ftSlot->bitmap; + + textureWidth = adjustTextureWidth(glyphBitmap->width); + textureHeight = adjustTextureHeight(glyphBitmap->rows); + + this->fontData[charCode] = (ftgxCharData){ + ftSlot->bitmap_left, + ftSlot->advance.x >> 6, + gIndex, + textureWidth, + textureHeight, + ftSlot->bitmap_top, + ftSlot->bitmap_top, + glyphBitmap->rows - ftSlot->bitmap_top, + NULL + }; + this->loadGlyphData(glyphBitmap, &this->fontData[charCode]); + + return &this->fontData[charCode]; + } + } + return NULL; +} + +/** + * Locates each character in this wrapper's configured font face and proccess them. + * + * This routine locates each character in the configured font face and renders the glyph's bitmap. + * Each bitmap and relevant information is loaded into its own quickly addressible structure within an instance-specific map. + */ +uint16_t FreeTypeGX::cacheGlyphDataComplete() +{ + uint32_t i = 0; + FT_UInt gIndex; + FT_ULong charCode = FT_Get_First_Char( ftFace, &gIndex ); + while ( gIndex != 0 ) + { + if(this->cacheGlyphData(charCode) != NULL) + ++i; + charCode = FT_Get_Next_Char( ftFace, charCode, &gIndex ); + } + return (uint16_t)(i); +} + +/** + * Loads the rendered bitmap into the relevant structure's data buffer. + * + * This routine does a simple byte-wise copy of the glyph's rendered 8-bit grayscale bitmap into the structure's buffer. + * Each byte is converted from the bitmap's intensity value into the a uint32_t RGBA value. + * + * @param bmp A pointer to the most recently rendered glyph's bitmap. + * @param charData A pointer to an allocated ftgxCharData structure whose data represent that of the last rendered glyph. + * + * Optimized for RGBA8 use by Dimok. + */ +void FreeTypeGX::loadGlyphData(FT_Bitmap *bmp, ftgxCharData *charData) +{ + int length = charData->textureWidth * charData->textureHeight * 4; + + uint8_t * glyphData = (uint8_t *) memalign(32, length); + if(!glyphData) + return; + + memset(glyphData, 0x00, length); + + uint8_t *src = (uint8_t *)bmp->buffer; + uint32_t offset; + + for (int imagePosY = 0; imagePosY < bmp->rows; ++imagePosY) + { + for (int imagePosX = 0; imagePosX < bmp->width; ++imagePosX) + { + offset = ((((imagePosY >> 2) * (charData->textureWidth >> 2) + (imagePosX >> 2)) << 5) + ((imagePosY & 3) << 2) + (imagePosX & 3)) << 1; + glyphData[offset] = *src; + glyphData[offset+1] = *src; + glyphData[offset+32] = *src; + glyphData[offset+33] = *src; + ++src; + } + } + DCFlushRange(glyphData, length); + charData->glyphDataTexture = (uint32_t *) glyphData; +} + +/** + * Determines the x offset of the rendered string. + * + * This routine calculates the x offset of the rendered string based off of a supplied positional format parameter. + * + * @param width Current pixel width of the string. + * @param format Positional format of the string. + */ +int16_t FreeTypeGX::getStyleOffsetWidth(uint16_t width, uint16_t format) +{ + if (format & FTGX_JUSTIFY_LEFT) + return 0; + else if (format & FTGX_JUSTIFY_CENTER) + return -(width >> 1); + else if (format & FTGX_JUSTIFY_RIGHT) + return -width; + return 0; +} + +/** + * Determines the y offset of the rendered string. + * + * This routine calculates the y offset of the rendered string based off of a supplied positional format parameter. + * + * @param offset Current pixel offset data of the string. + * @param format Positional format of the string. + */ +int16_t FreeTypeGX::getStyleOffsetHeight(ftgxDataOffset *offset, uint16_t format) +{ + switch(format & FTGX_ALIGN_MASK) + { + case FTGX_ALIGN_TOP: + return offset->ascender; + + default: + case FTGX_ALIGN_MIDDLE: + return (offset->ascender + offset->descender + 1) >> 1; + + case FTGX_ALIGN_BOTTOM: + return offset->descender; + + case FTGX_ALIGN_BASELINE: + return 0; + + case FTGX_ALIGN_GLYPH_TOP: + return offset->max; + + case FTGX_ALIGN_GLYPH_MIDDLE: + return (offset->max + offset->min + 1) >> 1; + + case FTGX_ALIGN_GLYPH_BOTTOM: + return offset->min; + } + return 0; +} + +/** + * Processes the supplied text string and prints the results at the specified coordinates. + * + * This routine processes each character of the supplied text string, loads the relevant preprocessed bitmap buffer, + * a texture from said buffer, and loads the resultant texture into the EFB. + * + * @param x Screen X coordinate at which to output the text. + * @param y Screen Y coordinate at which to output the text. Note that this value corresponds to the text string origin and not the top or bottom of the glyphs. + * @param text NULL terminated string to output. + * @param color Optional color to apply to the text characters. If not specified default value is ftgxWhite: (GXColor){0xff, 0xff, 0xff, 0xff} + * @param textStyle Flags which specify any styling which should be applied to the rendered string. + * @return The number of characters printed. + */ +uint16_t FreeTypeGX::drawText(int16_t x, int16_t y, wchar_t *text, GXColor color, uint16_t textStyle) +{ + uint16_t x_pos = x, printed = 0; + uint16_t x_offset = 0, y_offset = 0; + GXTexObj glyphTexture; + FT_Vector pairDelta; + ftgxDataOffset offset; + + if(textStyle & FTGX_JUSTIFY_MASK) + { + x_offset = this->getStyleOffsetWidth(this->getWidth(text), textStyle); + } + if(textStyle & FTGX_ALIGN_MASK) + { + this->getOffset(text, &offset); + y_offset = this->getStyleOffsetHeight(&offset, textStyle); + } + + int i = 0; + while (text[i]) + { + ftgxCharData* glyphData = NULL; + if (this->fontData.find(text[i]) != this->fontData.end()) + { + glyphData = &this->fontData[text[i]]; + } + else + { + glyphData = this->cacheGlyphData(text[i]); + } + + if (glyphData != NULL) + { + if (this->ftKerningEnabled && i) + { + FT_Get_Kerning(ftFace, this->fontData[text[i - 1]].glyphIndex, glyphData->glyphIndex, FT_KERNING_DEFAULT, &pairDelta); + x_pos += pairDelta.x >> 6; + } + + GX_InitTexObj(&glyphTexture, glyphData->glyphDataTexture, glyphData->textureWidth, glyphData->textureHeight, GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE); + this->copyTextureToFramebuffer(&glyphTexture, glyphData->textureWidth, glyphData->textureHeight, x_pos + glyphData->renderOffsetX + x_offset, y - glyphData->renderOffsetY + y_offset, color); + + x_pos += glyphData->glyphAdvanceX; + ++printed; + } + ++i; + } + + if(textStyle & FTGX_STYLE_MASK) + { + this->getOffset(text, &offset); + this->drawTextFeature(x + x_offset, y + y_offset, this->getWidth(text), &offset, textStyle, color); + } + + return printed; +} + +/** + * \overload + */ +uint16_t FreeTypeGX::drawText(int16_t x, int16_t y, wchar_t const *text, GXColor color, uint16_t textStyle) +{ + return this->drawText(x, y, (wchar_t *)text, color, textStyle); +} + +void FreeTypeGX::drawTextFeature(int16_t x, int16_t y, uint16_t width, ftgxDataOffset *offsetData, uint16_t format, GXColor color) +{ + uint16_t featureHeight = this->ftPointSize >> 4 > 0 ? this->ftPointSize >> 4 : 1; + + if (format & FTGX_STYLE_UNDERLINE) + this->copyFeatureToFramebuffer(width, featureHeight, x, y + 1, color); + + if (format & FTGX_STYLE_STRIKE) + this->copyFeatureToFramebuffer(width, featureHeight, x, y - ((offsetData->max) >> 1), color); +} + +/** + * Processes the supplied string and return the width of the string in pixels. + * + * This routine processes each character of the supplied text string and calculates the width of the entire string. + * Note that if precaching of the entire font set is not enabled any uncached glyph will be cached after the call to this function. + * + * @param text NULL terminated string to calculate. + * @return The width of the text string in pixels. + */ +uint16_t FreeTypeGX::getWidth(wchar_t *text) +{ + uint16_t strWidth = 0; + FT_Vector pairDelta; + + int i = 0; + while (text[i]) + { + ftgxCharData* glyphData = NULL; + if (this->fontData.find(text[i]) != this->fontData.end()) + { + glyphData = &this->fontData[text[i]]; + } + else + { + glyphData = this->cacheGlyphData(text[i]); + } + + if (glyphData != NULL) + { + if (this->ftKerningEnabled && (i > 0)) + { + FT_Get_Kerning(ftFace, this->fontData[text[i - 1]].glyphIndex, glyphData->glyphIndex, FT_KERNING_DEFAULT, &pairDelta); + strWidth += pairDelta.x >> 6; + } + + strWidth += glyphData->glyphAdvanceX; + } + ++i; + } + return strWidth; +} + +/** + * + * \overload + */ +uint16_t FreeTypeGX::getWidth(wchar_t const *text) +{ + return this->getWidth((wchar_t *)text); +} + +/** + * Processes the supplied string and return the height of the string in pixels. + * + * This routine processes each character of the supplied text string and calculates the height of the entire string. + * Note that if precaching of the entire font set is not enabled any uncached glyph will be cached after the call to this function. + * + * @param text NULL terminated string to calculate. + * @return The height of the text string in pixels. + */ +uint16_t FreeTypeGX::getHeight(wchar_t *text) +{ + ftgxDataOffset offset; + this->getOffset(text, &offset); + return offset.max - offset.min; +} + +/** + * + * \overload + */ +uint16_t FreeTypeGX::getHeight(wchar_t const *text) +{ + return this->getHeight((wchar_t *)text); +} + +/** + * Get the maximum offset above and minimum offset below the font origin line. + * + * This function calculates the maximum pixel height above the font origin line and the minimum + * pixel height below the font origin line and returns the values in an addressible structure. + * + * @param text NULL terminated string to calculate. + * @param offset returns the max and min values above and below the font origin line + * + */ +void FreeTypeGX::getOffset(wchar_t *text, ftgxDataOffset* offset) +{ + int16_t strMax = 0, strMin = 9999; + + int i = 0; + while (text[i]) + { + ftgxCharData* glyphData = NULL; + if (this->fontData.find(text[i]) != this->fontData.end()) + { + glyphData = &this->fontData[text[i]]; + } + else + { + glyphData = this->cacheGlyphData(text[i]); + } + + if(glyphData != NULL) + { + strMax = glyphData->renderOffsetMax > strMax ? glyphData->renderOffsetMax : strMax; + strMin = glyphData->renderOffsetMin < strMin ? glyphData->renderOffsetMin : strMin; + } + ++i; + } + offset->ascender = ftFace->size->metrics.ascender>>6; + offset->descender = ftFace->size->metrics.descender>>6; + offset->max = strMax; + offset->min = strMin; +} + +/** + * + * \overload + */ +void FreeTypeGX::getOffset(wchar_t const *text, ftgxDataOffset* offset) +{ + this->getOffset(text, offset); +} + +/** + * Copies the supplied texture quad to the EFB. + * + * This routine uses the in-built GX quad builder functions to define the texture bounds and location on the EFB target. + * + * @param texObj A pointer to the glyph's initialized texture object. + * @param texWidth The pixel width of the texture object. + * @param texHeight The pixel height of the texture object. + * @param screenX The screen X coordinate at which to output the rendered texture. + * @param screenY The screen Y coordinate at which to output the rendered texture. + * @param color Color to apply to the texture. + */ +void FreeTypeGX::copyTextureToFramebuffer(GXTexObj *texObj, f32 texWidth, f32 texHeight, int16_t screenX, int16_t screenY, GXColor color) +{ + GX_LoadTexObj(texObj, GX_TEXMAP0); + GX_InvalidateTexAll(); + + GX_SetTevOp (GX_TEVSTAGE0, GX_MODULATE); + GX_SetVtxDesc (GX_VA_TEX0, GX_DIRECT); + + GX_Begin(GX_QUADS, this->vertexIndex, 4); + GX_Position2s16(screenX, screenY); + GX_Color4u8(color.r, color.g, color.b, color.a); + GX_TexCoord2f32(0.0f, 0.0f); + + GX_Position2s16(texWidth + screenX, screenY); + GX_Color4u8(color.r, color.g, color.b, color.a); + GX_TexCoord2f32(1.0f, 0.0f); + + GX_Position2s16(texWidth + screenX, texHeight + screenY); + GX_Color4u8(color.r, color.g, color.b, color.a); + GX_TexCoord2f32(1.0f, 1.0f); + + GX_Position2s16(screenX, texHeight + screenY); + GX_Color4u8(color.r, color.g, color.b, color.a); + GX_TexCoord2f32(0.0f, 1.0f); + GX_End(); + + this->setDefaultMode(); +} + +/** + * Creates a feature quad to the EFB. + * + * This function creates a simple quad for displaying underline or strikeout text styling. + * + * @param featureWidth The pixel width of the quad. + * @param featureHeight The pixel height of the quad. + * @param screenX The screen X coordinate at which to output the quad. + * @param screenY The screen Y coordinate at which to output the quad. + * @param color Color to apply to the texture. + */ +void FreeTypeGX::copyFeatureToFramebuffer(f32 featureWidth, f32 featureHeight, int16_t screenX, int16_t screenY, GXColor color) +{ + GX_SetTevOp (GX_TEVSTAGE0, GX_PASSCLR); + GX_SetVtxDesc (GX_VA_TEX0, GX_NONE); + + GX_Begin(GX_QUADS, this->vertexIndex, 4); + GX_Position2s16(screenX, screenY); + GX_Color4u8(color.r, color.g, color.b, color.a); + + GX_Position2s16(featureWidth + screenX, screenY); + GX_Color4u8(color.r, color.g, color.b, color.a); + + GX_Position2s16(featureWidth + screenX, featureHeight + screenY); + GX_Color4u8(color.r, color.g, color.b, color.a); + + GX_Position2s16(screenX, featureHeight + screenY); + GX_Color4u8(color.r, color.g, color.b, color.a); + GX_End(); + + this->setDefaultMode(); +} diff --git a/plugins/snes9x_gx/source/utils/FreeTypeGX.h b/plugins/snes9x_gx/source/utils/FreeTypeGX.h new file mode 100644 index 00000000..b5910f19 --- /dev/null +++ b/plugins/snes9x_gx/source/utils/FreeTypeGX.h @@ -0,0 +1,168 @@ +/* + * FreeTypeGX is a wrapper class for libFreeType which renders a compiled + * FreeType parsable font into a GX texture for Wii homebrew development. + * Copyright (C) 2008 Armin Tamzarian + * Modified by Tantric, 2009-2010 + * + * This file is part of FreeTypeGX. + * + * FreeTypeGX is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * FreeTypeGX is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with FreeTypeGX. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef FREETYPEGX_H_ +#define FREETYPEGX_H_ + +#include <gccore.h> +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_BITMAP_H + +#include <malloc.h> +#include <string.h> +#include <wchar.h> +#include <map> + +#define MAX_FONT_SIZE 100 + +/*! \struct ftgxCharData_ + * + * Font face character glyph relevant data structure. + */ +typedef struct ftgxCharData_ { + int16_t renderOffsetX; /**< Texture X axis bearing offset. */ + uint16_t glyphAdvanceX; /**< Character glyph X coordinate advance in pixels. */ + uint16_t glyphIndex; /**< Charachter glyph index in the font face. */ + + uint16_t textureWidth; /**< Texture width in pixels/bytes. */ + uint16_t textureHeight; /**< Texture glyph height in pixels/bytes. */ + + int16_t renderOffsetY; /**< Texture Y axis bearing offset. */ + int16_t renderOffsetMax; /**< Texture Y axis bearing maximum value. */ + int16_t renderOffsetMin; /**< Texture Y axis bearing minimum value. */ + + uint32_t* glyphDataTexture; /**< Glyph texture bitmap data buffer. */ +} ftgxCharData; + +/*! \struct ftgxDataOffset_ + * + * Offset structure which hold both a maximum and minimum value. + */ +typedef struct ftgxDataOffset_ { + int16_t ascender; /**< Maximum data offset. */ + int16_t descender; /**< Minimum data offset. */ + int16_t max; /**< Maximum data offset. */ + int16_t min; /**< Minimum data offset. */ +} ftgxDataOffset; + +typedef struct ftgxCharData_ ftgxCharData; +typedef struct ftgxDataOffset_ ftgxDataOffset; + +#define _TEXT(t) L ## t /**< Unicode helper macro. */ + +#define FTGX_NULL 0x0000 +#define FTGX_JUSTIFY_LEFT 0x0001 +#define FTGX_JUSTIFY_CENTER 0x0002 +#define FTGX_JUSTIFY_RIGHT 0x0004 +#define FTGX_JUSTIFY_MASK 0x000f + +#define FTGX_ALIGN_TOP 0x0010 +#define FTGX_ALIGN_MIDDLE 0x0020 +#define FTGX_ALIGN_BOTTOM 0x0040 +#define FTGX_ALIGN_BASELINE 0x0080 +#define FTGX_ALIGN_GLYPH_TOP 0x0100 +#define FTGX_ALIGN_GLYPH_MIDDLE 0x0200 +#define FTGX_ALIGN_GLYPH_BOTTOM 0x0400 +#define FTGX_ALIGN_MASK 0x0ff0 + +#define FTGX_STYLE_UNDERLINE 0x1000 +#define FTGX_STYLE_STRIKE 0x2000 +#define FTGX_STYLE_MASK 0xf000 + +#define FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_MODULATE 0X0001 +#define FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_DECAL 0X0002 +#define FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_BLEND 0X0004 +#define FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_REPLACE 0X0008 +#define FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_PASSCLR 0X0010 + +#define FTGX_COMPATIBILITY_DEFAULT_VTXDESC_GX_NONE 0X0100 +#define FTGX_COMPATIBILITY_DEFAULT_VTXDESC_GX_DIRECT 0X0200 +#define FTGX_COMPATIBILITY_DEFAULT_VTXDESC_GX_INDEX8 0X0400 +#define FTGX_COMPATIBILITY_DEFAULT_VTXDESC_GX_INDEX16 0X0800 + +#define FTGX_COMPATIBILITY_NONE 0x0000 +#define FTGX_COMPATIBILITY_GRRLIB FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_PASSCLR | FTGX_COMPATIBILITY_DEFAULT_VTXDESC_GX_NONE +#define FTGX_COMPATIBILITY_LIBWIISPRITE FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_MODULATE | FTGX_COMPATIBILITY_DEFAULT_VTXDESC_GX_DIRECT + +const GXColor ftgxWhite = (GXColor){0xff, 0xff, 0xff, 0xff}; /**< Constant color value used only to sanitize Doxygen documentation. */ + +void InitFreeType(uint8_t* fontBuffer, FT_Long bufferSize); +void DeinitFreeType(); +void ChangeFontSize(FT_UInt pixelSize); +wchar_t* charToWideChar(const char* p); +void ClearFontData(); + +/*! \class FreeTypeGX + * \brief Wrapper class for the libFreeType library with GX rendering. + * \author Armin Tamzarian + * \version 0.2.4 + * + * FreeTypeGX acts as a wrapper class for the libFreeType library. It supports precaching of transformed glyph data into + * a specified texture format. Rendering of the data to the EFB is accomplished through the application of high performance + * GX texture functions resulting in high throughput of string rendering. + */ +class FreeTypeGX { + + private: + FT_UInt ftPointSize; /**< Requested size of the rendered font. */ + bool ftKerningEnabled; /**< Flag indicating the availability of font kerning data. */ + uint8_t vertexIndex; /**< Vertex format descriptor index. */ + uint32_t compatibilityMode; /**< Compatibility mode for default tev operations and vertex descriptors. */ + std::map<wchar_t, ftgxCharData> fontData; /**< Map which holds the glyph data structures for the corresponding characters. */ + + static uint16_t adjustTextureWidth(uint16_t textureWidth); + static uint16_t adjustTextureHeight(uint16_t textureHeight); + + static int16_t getStyleOffsetWidth(uint16_t width, uint16_t format); + static int16_t getStyleOffsetHeight(ftgxDataOffset *offset, uint16_t format); + + void unloadFont(); + ftgxCharData *cacheGlyphData(wchar_t charCode); + uint16_t cacheGlyphDataComplete(); + void loadGlyphData(FT_Bitmap *bmp, ftgxCharData *charData); + + void setDefaultMode(); + + void drawTextFeature(int16_t x, int16_t y, uint16_t width, ftgxDataOffset *offsetData, uint16_t format, GXColor color); + void copyTextureToFramebuffer(GXTexObj *texObj, f32 texWidth, f32 texHeight, int16_t screenX, int16_t screenY, GXColor color); + void copyFeatureToFramebuffer(f32 featureWidth, f32 featureHeight, int16_t screenX, int16_t screenY, GXColor color); + + public: + FreeTypeGX(FT_UInt pixelSize, uint8_t vertexIndex = GX_VTXFMT1); + ~FreeTypeGX(); + + void setVertexFormat(uint8_t vertexIndex); + void setCompatibilityMode(uint32_t compatibilityMode); + + uint16_t drawText(int16_t x, int16_t y, wchar_t *text, GXColor color = ftgxWhite, uint16_t textStyling = FTGX_NULL); + uint16_t drawText(int16_t x, int16_t y, wchar_t const *text, GXColor color = ftgxWhite, uint16_t textStyling = FTGX_NULL); + + uint16_t getWidth(wchar_t *text); + uint16_t getWidth(wchar_t const *text); + uint16_t getHeight(wchar_t *text); + uint16_t getHeight(wchar_t const *text); + void getOffset(wchar_t *text, ftgxDataOffset* offset); + void getOffset(wchar_t const *text, ftgxDataOffset* offset); +}; + +#endif /* FREETYPEGX_H_ */ diff --git a/plugins/snes9x_gx/source/utils/gettext.cpp b/plugins/snes9x_gx/source/utils/gettext.cpp new file mode 100644 index 00000000..628b58cc --- /dev/null +++ b/plugins/snes9x_gx/source/utils/gettext.cpp @@ -0,0 +1,290 @@ +#include <stdlib.h> +#include <string.h> +#include <stdio.h> +#include <gctypes.h> +#include <unistd.h> + +#include "gettext.h" +#include "filelist.h" +#include "snes9xgx.h" + +typedef struct _MSG +{ + u32 id; + char* msgstr; + struct _MSG *next; +} MSG; +static MSG *baseMSG = 0; + +#define HASHWORDBITS 32 + +/* Defines the so called `hashpjw' function by P.J. Weinberger + [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools, + 1986, 1987 Bell Telephone Laboratories, Inc.] */ +static inline u32 hash_string(const char *str_param) +{ + u32 hval, g; + const char *str = str_param; + + /* Compute the hash value for the given string. */ + hval = 0; + while (*str != '\0') + { + hval <<= 4; + hval += (u8) * str++; + g = hval & ((u32) 0xf << (HASHWORDBITS - 4)); + if (g != 0) + { + hval ^= g >> (HASHWORDBITS - 8); + hval ^= g; + } + } + return hval; +} + +/* Expand some escape sequences found in the argument string. */ +static char * +expand_escape(const char *str) +{ + char *retval, *rp; + const char *cp = str; + + retval = (char *) malloc(strlen(str) + 1); + if (retval == NULL) + return NULL; + rp = retval; + + while (cp[0] != '\0' && cp[0] != '\\') + *rp++ = *cp++; + if (cp[0] == '\0') + goto terminate; + do + { + + /* Here cp[0] == '\\'. */ + switch (*++cp) + { + case '\"': /* " */ + *rp++ = '\"'; + ++cp; + break; + case 'a': /* alert */ + *rp++ = '\a'; + ++cp; + break; + case 'b': /* backspace */ + *rp++ = '\b'; + ++cp; + break; + case 'f': /* form feed */ + *rp++ = '\f'; + ++cp; + break; + case 'n': /* new line */ + *rp++ = '\n'; + ++cp; + break; + case 'r': /* carriage return */ + *rp++ = '\r'; + ++cp; + break; + case 't': /* horizontal tab */ + *rp++ = '\t'; + ++cp; + break; + case 'v': /* vertical tab */ + *rp++ = '\v'; + ++cp; + break; + case '\\': + *rp = '\\'; + ++cp; + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + { + int ch = *cp++ - '0'; + + if (*cp >= '0' && *cp <= '7') + { + ch *= 8; + ch += *cp++ - '0'; + + if (*cp >= '0' && *cp <= '7') + { + ch *= 8; + ch += *cp++ - '0'; + } + } + *rp = ch; + } + break; + default: + *rp = '\\'; + break; + } + + while (cp[0] != '\0' && cp[0] != '\\') + *rp++ = *cp++; + } while (cp[0] != '\0'); + + /* Terminate string. */ + terminate: *rp = '\0'; + return retval; +} + +static MSG *findMSG(u32 id) +{ + MSG *msg; + for (msg = baseMSG; msg; msg = msg->next) + { + if (msg->id == id) + return msg; + } + return NULL; +} + +static MSG *setMSG(const char *msgid, const char *msgstr) +{ + u32 id = hash_string(msgid); + MSG *msg = findMSG(id); + if (!msg) + { + msg = (MSG *) malloc(sizeof(MSG)); + msg->id = id; + msg->msgstr = NULL; + msg->next = baseMSG; + baseMSG = msg; + } + if (msg) + { + if (msgstr) + { + if (msg->msgstr) + free(msg->msgstr); + + msg->msgstr = expand_escape(msgstr); + } + return msg; + } + return NULL; +} + +static void gettextCleanUp(void) +{ + while (baseMSG) + { + MSG *nextMsg = baseMSG->next; + free(baseMSG->msgstr); + free(baseMSG); + baseMSG = nextMsg; + } +} + +static char * memfgets(char * dst, int maxlen, char * src) +{ + if(!src || !dst || maxlen <= 0) + return NULL; + + char * newline = strchr(src, '\n'); + + if(newline == NULL) + return NULL; + + memcpy(dst, src, (newline-src)); + dst[(newline-src)] = 0; + return ++newline; +} + +bool LoadLanguage() +{ + char line[200]; + char *lastID = NULL; + + char *file, *eof; + + switch(GCSettings.language) + { + case LANG_JAPANESE: file = (char *)jp_lang; eof = file + jp_lang_size; break; + case LANG_ENGLISH: file = (char *)en_lang; eof = file + en_lang_size; break; + case LANG_GERMAN: file = (char *)de_lang; eof = file + de_lang_size; break; + case LANG_FRENCH: file = (char *)fr_lang; eof = file + fr_lang_size; break; + case LANG_SPANISH: file = (char *)es_lang; eof = file + es_lang_size; break; + case LANG_ITALIAN: file = (char *)it_lang; eof = file + it_lang_size; break; + case LANG_DUTCH: file = (char *)nl_lang; eof = file + nl_lang_size; break; + case LANG_SIMP_CHINESE: + case LANG_TRAD_CHINESE: file = (char *)zh_lang; eof = file + zh_lang_size; break; + case LANG_KOREAN: file = (char *)ko_lang; eof = file + ko_lang_size; break; + case LANG_PORTUGUESE: file = (char *)pt_lang; eof = file + pt_lang_size; break; + case LANG_BRAZILIAN_PORTUGUESE: file = (char *)pt_br_lang; eof = file + pt_br_lang_size; break; + case LANG_CATALAN: file = (char *)ca_lang; eof = file + ca_lang_size; break; + case LANG_TURKISH: file = (char *)tr_lang; eof = file + tr_lang_size; break; + default: return false; + } + + gettextCleanUp(); + + while (file && file < eof) + { + file = memfgets(line, sizeof(line), file); + + if(!file) + break; + + // lines starting with # are comments + if (line[0] == '#') + continue; + + if (strncmp(line, "msgid \"", 7) == 0) + { + char *msgid, *end; + if (lastID) + { + free(lastID); + lastID = NULL; + } + msgid = &line[7]; + end = strrchr(msgid, '"'); + if (end && end - msgid > 1) + { + *end = 0; + lastID = strdup(msgid); + } + } + else if (strncmp(line, "msgstr \"", 8) == 0) + { + char *msgstr, *end; + + if (lastID == NULL) + continue; + + msgstr = &line[8]; + end = strrchr(msgstr, '"'); + if (end && end - msgstr > 1) + { + *end = 0; + setMSG(lastID, msgstr); + } + free(lastID); + lastID = NULL; + } + } + return true; +} + +const char *gettext(const char *msgid) +{ + MSG *msg = findMSG(hash_string(msgid)); + + if (msg && msg->msgstr) + { + return msg->msgstr; + } + return msgid; +} diff --git a/plugins/snes9x_gx/source/utils/gettext.h b/plugins/snes9x_gx/source/utils/gettext.h new file mode 100644 index 00000000..1309e934 --- /dev/null +++ b/plugins/snes9x_gx/source/utils/gettext.h @@ -0,0 +1,12 @@ +#ifndef _GETTEXT_H_ +#define _GETTEXT_H_ + +bool LoadLanguage(); + +/* + * input msg = a text in ASCII + * output = the translated msg in utf-8 + */ +const char *gettext(const char *msg); + +#endif /* _GETTEXT_H_ */ diff --git a/plugins/snes9x_gx/source/utils/http.cpp b/plugins/snes9x_gx/source/utils/http.cpp new file mode 100644 index 00000000..ae52301c --- /dev/null +++ b/plugins/snes9x_gx/source/utils/http.cpp @@ -0,0 +1,411 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * Tantric December 2008 + * + * http.cpp + * + * HTTP operations + * Written by dhewg/bushing, modified by Tantric + ***************************************************************************/ + +#ifdef HW_RVL + +#include <malloc.h> +#include <string.h> +#include <stdio.h> +#include <unistd.h> +#include <ogcsys.h> +#include <network.h> +#include <ogc/lwp_watchdog.h> +#include <sys/types.h> +#include <sys/errno.h> +#include <fcntl.h> + +#include "menu.h" +#include "http.h" + +#define TCP_CONNECT_TIMEOUT 4000 // 4 secs to make a connection +#define TCP_SEND_SIZE (32 * 1024) +#define TCP_RECV_SIZE (32 * 1024) +#define TCP_BLOCK_RECV_TIMEOUT 4000 // 4 secs to receive +#define TCP_BLOCK_SEND_TIMEOUT 4000 // 4 secs to send +#define TCP_BLOCK_SIZE 1024 +#define HTTP_TIMEOUT 10000 // 10 secs to get an http response +#define IOS_O_NONBLOCK 0x04 + +static s32 tcp_socket(void) +{ + s32 s, res; + + s = net_socket(PF_INET, SOCK_STREAM, IPPROTO_IP); + if (s < 0) + return s; + + // Switch off Nagle with TCP_NODELAY + u32 nodelay = 1; + net_setsockopt(s,IPPROTO_TCP,TCP_NODELAY,&nodelay,sizeof(nodelay)); + + res = net_fcntl(s, F_GETFL, 0); + if (res < 0) + { + net_close(s); + return res; + } + + res = net_fcntl(s, F_SETFL, res | IOS_O_NONBLOCK); + if (res < 0) + { + net_close(s); + return res; + } + + return s; +} + +static s32 tcp_connect(char *host, const u16 port) +{ + struct hostent *hp; + struct sockaddr_in sa; + struct in_addr val; + s32 s, res; + u64 t1; + + s = tcp_socket(); + if (s < 0) + return s; + + memset(&sa, 0, sizeof(struct sockaddr_in)); + sa.sin_family= PF_INET; + sa.sin_len = sizeof(struct sockaddr_in); + sa.sin_port= htons(port); + + if(strlen(host) < 16 && inet_aton(host, &val)) + { + sa.sin_addr.s_addr = val.s_addr; + } + else + { + hp = net_gethostbyname (host); + if (!hp || !(hp->h_addrtype == PF_INET)) + return errno; + + memcpy((char *) &sa.sin_addr, hp->h_addr_list[0], hp->h_length); + } + + t1=ticks_to_secs(gettime()); + do + { + res = net_connect(s,(struct sockaddr*) &sa, sizeof (sa)); + if(ticks_to_secs(gettime())-t1 > TCP_CONNECT_TIMEOUT*1000) break; + usleep(500); + }while(res != -EISCONN); + if(res != -EISCONN) + { + net_close(s); + return -1; + } + + + return s; +} + +static int tcp_readln(const s32 s, char *buf, const u16 max_length) +{ + s32 res = -1; + s32 ret; + u64 start_time = gettime(); + u16 c = 0; + + while (c < max_length) + { + if (ticks_to_millisecs(diff_ticks(start_time, gettime())) > HTTP_TIMEOUT) + break; + + ret = net_read(s, &buf[c], 1); + + if (ret == -EAGAIN) + { + usleep(20 * 1000); + continue; + } + + if (ret <= 0) + break; + + if (c > 0 && buf[c - 1] == '\r' && buf[c] == '\n') + { + res = 0; + buf[c-1] = 0; + break; + } + c++; + start_time = gettime(); + usleep(100); + } + return res; +} + +static u32 tcp_read(const s32 s, u8 *buffer, const u32 length) +{ + char *p; + u32 left, block, received, step=0; + u64 t; + s32 res; + + p = (char *)buffer; + left = length; + received = 0; + + t = gettime(); + while (left) + { + if (ticks_to_millisecs(diff_ticks(t, gettime())) + > TCP_BLOCK_RECV_TIMEOUT) + { + break; + } + + block = left; + if (block > TCP_RECV_SIZE) + block = TCP_RECV_SIZE; + + res = net_read(s, p, block); + + if (res == -EAGAIN) + { + usleep(20 * 1000); + continue; + } + + if(res<=0) break; + + received += res; + left -= res; + p += res; + usleep(1000); + + if ((received / TCP_BLOCK_SIZE) > step) + { + t = gettime (); + step++; + } + } + return received; +} + +static u32 tcp_write(const s32 s, const u8 *buffer, const u32 length) +{ + const u8 *p; + u32 left, block, sent, step=0; + s64 t; + s32 res; + + p = buffer; + left = length; + sent = 0; + + t = gettime(); + while (left) + { + if (ticks_to_millisecs(diff_ticks(t, gettime())) + > TCP_BLOCK_SEND_TIMEOUT) + { + break; + } + + block = left; + if (block > TCP_SEND_SIZE) + block = TCP_SEND_SIZE; + + res = net_write(s, p, block); + + if ((res == 0) || (res == -56)) + { + usleep(20 * 1000); + continue; + } + + if (res < 0) + break; + + sent += res; + left -= res; + p += res; + usleep(100); + + if ((sent / TCP_BLOCK_SIZE) > step) + { + t = gettime (); + step++; + } + } + + return left == 0; +} + +static bool http_split_url(char *host, char *path, const char *url) +{ + const char *p; + char *c; + + if (strncasecmp(url, "http://", 7)) + return false; + + p = url + 7; + c = strchr(p, '/'); + + if (c == NULL || c[0] == 0) + return false; + + snprintf(host, c-p+1, "%s", p); + strcpy(path, c); + return true; +} + +#define MAX_SIZE (1024*1024*15) + +/**************************************************************************** + * http_request + * Retrieves the specified URL, and stores it in the specified file or buffer + ***************************************************************************/ +int http_request(const char *url, FILE *hfile, u8 *buffer, u32 maxsize, bool silent) +{ + int res = 0; + char http_host[1024]; + char http_path[1024]; + u16 http_port; + + http_res result; + u32 http_status; + u32 sizeread = 0, content_length = 0; + + int linecount; + + if(maxsize > MAX_SIZE) + return 0; + + if (url == NULL || (hfile == NULL && buffer == NULL)) + return 0; + + if (!http_split_url(http_host, http_path, url)) + return 0; + + http_port = 80; + http_status = 404; + + int s = tcp_connect(http_host, http_port); + + if (s < 0) + { + result = HTTPR_ERR_CONNECT; + return 0; + } + + char request[1024]; + char *r = request; + + r += sprintf(r, "GET %s HTTP/1.1\r\n", http_path); + r += sprintf(r, "Host: %s\r\n", http_host); + r += sprintf(r, "Cache-Control: no-cache\r\n\r\n"); + + res = tcp_write(s, (u8 *) request, strlen(request)); + + char line[256]; + + for (linecount = 0; linecount < 32; linecount++) + { + if (tcp_readln(s, line, 255) != 0) + { + http_status = 404; + result = HTTPR_ERR_REQUEST; + break; + } + + if (strlen(line) < 1) + break; + + sscanf(line, "HTTP/1.%*u %u", &http_status); + sscanf(line, "Content-Length: %u", &content_length); + } + + if (http_status != 200) + { + result = HTTPR_ERR_STATUS; + net_close(s); + return 0; + } + + // length unknown - just read as much as we can + if(content_length == 0) + { + content_length = maxsize; + } + else if (content_length > maxsize) + { + result = HTTPR_ERR_TOOBIG; + net_close(s); + return 0; + } + + if (buffer != NULL) + { + if(!silent) + ShowAction("Downloading..."); + + sizeread = tcp_read(s, buffer, content_length); + + if(!silent) + CancelAction(); + } + else + { + // read into file + u32 bufSize = (1024 * 32); + u32 bytesLeft = content_length; + u32 readSize; + + if(!silent) + ShowProgress("Downloading...", 0, content_length); + u8 * fbuffer = (u8 *) malloc(bufSize); + if(fbuffer) + { + while (bytesLeft > 0) + { + if (bytesLeft < bufSize) + readSize = bytesLeft; + else + readSize = bufSize; + + res = tcp_read(s, fbuffer, readSize); + if (!res) + break; + + sizeread += res; + bytesLeft -= res; + + res = fwrite(fbuffer, 1, res, hfile); + if (!res) + break; + + if(!silent) + ShowProgress("Downloading...", (content_length - bytesLeft), content_length); + } + free(fbuffer); + } + if(!silent) + CancelAction(); + } + + net_close(s); + + if (content_length < maxsize && sizeread != content_length) + { + result = HTTPR_ERR_RECEIVE; + return 0; + } + + result = HTTPR_OK; + return sizeread; +} +#endif diff --git a/plugins/snes9x_gx/source/utils/http.h b/plugins/snes9x_gx/source/utils/http.h new file mode 100644 index 00000000..41501afc --- /dev/null +++ b/plugins/snes9x_gx/source/utils/http.h @@ -0,0 +1,25 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * Tantric 2008-2010 + * + * http.h + * + * HTTP operations + ***************************************************************************/ + +#ifndef _HTTP_H_ +#define _HTTP_H_ + +typedef enum { + HTTPR_OK, + HTTPR_ERR_CONNECT, + HTTPR_ERR_REQUEST, + HTTPR_ERR_STATUS, + HTTPR_ERR_TOOBIG, + HTTPR_ERR_RECEIVE +} http_res; + +int http_request (const char *url, FILE * hfile, u8 * buffer, const u32 max_size, bool silent); + +#endif diff --git a/plugins/snes9x_gx/source/utils/oggplayer.c b/plugins/snes9x_gx/source/utils/oggplayer.c new file mode 100644 index 00000000..3f7de9a9 --- /dev/null +++ b/plugins/snes9x_gx/source/utils/oggplayer.c @@ -0,0 +1,546 @@ +/* + Copyright (c) 2008 Francisco Muñoz 'Hermes' <www.elotrolado.net> + All rights reserved. + + Proper (standard) vorbis usage by Tantric, 2009 + Threading modifications/corrections by Tantric, 2009 + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + - Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - The names of the contributors may not be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef NO_SOUND + +#include <asndlib.h> +#include <tremor/ivorbiscodec.h> +#include <tremor/ivorbisfile.h> +#include <gccore.h> +#include <unistd.h> +#include <string.h> + +#include "oggplayer.h" + +/* functions to read the Ogg file from memory */ + +static struct +{ + char *mem; + int size; + int pos; +} file[4]; + +static int f_read(void * punt, int bytes, int blocks, int *f) +{ + int b; + int c = 0; + int d; + + if (bytes * blocks <= 0) + return 0; + + blocks *= bytes; + + while (blocks > 0) + { + b = blocks; + if (b > 4096) + b = 4096; + + d = (*f) - 0x666; + if((unsigned)(d) <= (0x669 - 0x666)) + { + if (file[d].size == 0) + return -1; + if ((file[d].pos + b) > file[d].size) + b = file[d].size - file[d].pos; + if (b > 0) + { + memcpy(punt, file[d].mem + file[d].pos, b); + file[d].pos += b; + } + } + else + b = read(*f, ((char *) punt) + c, b); + + if (b <= 0) + { + return c / bytes; + } + c += b; + blocks -= b; + } + return c / bytes; +} + +static int f_seek(int *f, ogg_int64_t offset, int mode) +{ + if(f==NULL) return(-1); + + int k; + mode &= 3; + + int d = (*f) - 0x666; + if((unsigned)(d) <= (0x669 - 0x666)) + { + k = 0; + + if (file[d].size == 0) + return -1; + + if (mode == 0) + { + if ((offset) >= file[d].size) + { + file[d].pos = file[d].size; + k = -1; + } + else if ((offset) < 0) + { + file[d].pos = 0; + k = -1; + } + else + file[d].pos = offset; + } + else if (mode == 1) + { + if ((file[d].pos + offset) >= file[d].size) + { + file[d].pos = file[d].size; + k = -1; + } + else if ((file[d].pos + offset) < 0) + { + file[d].pos = 0; + k = -1; + } + else + file[d].pos += offset; + } + else if (mode == 2) + { + + if ((file[d].size + offset) >= file[d].size) + { + file[d].pos = file[d].size; + k = -1; + } + else if ((file[d].size + offset) < 0) + { + file[d].pos = 0; + k = -1; + } + else + file[d].pos = file[d].size + offset; + } + + } + else + k = lseek(*f, (int) offset, mode); + + if (k < 0) + k = -1; + else + k = 0; + return k; +} + +static int f_close(int *f) +{ + int d = (*f) - 0x666; + if((unsigned)(d) <= (0x669 - 0x666)) + { + file[d].size = 0; + file[d].pos = 0; + if (file[d].mem) + { + file[d].mem = (void *) 0; + } + return 0; + } + else + return close(*f); + return 0; +} + +static long f_tell(int *f) +{ + int k; + + int d = (*f) - 0x666; + if((unsigned)(d) <= (0x669 - 0x666)) + { + k = file[d].pos; + } + else + k = lseek(*f, 0, 1); + + return (long) k; +} + +static int mem_open(char * ogg, int size) +{ + static int one = 1; + int n; + if (one) + { + one = 0; + + file[0].size = 0; + file[1].size = 0; + file[2].size = 0; + file[3].size = 0; + file[0].mem = ogg; + file[0].size = size; + file[0].pos = 0; + return (0x666); + } + + for (n = 0; n < 4; n++) + { + if (file[n].size == 0) + { + file[n].mem = ogg; + file[n].size = size; + file[n].pos = 0; + return (0x666 + n); + } + } + return -1; +} + +static int mem_close(int fd) +{ + if((unsigned)((fd) - 0x666) <= (0x669 - 0x666)) // it is a memory file descriptor? + { + fd -= 0x666; + file[fd].size = 0; + return 0; + } + else + return f_close(&fd); +} + +static ov_callbacks callbacks = { + (size_t (*)(void *, size_t, size_t, void *)) f_read, + (int (*)(void *, ogg_int64_t, int)) f_seek, + (int (*)(void *)) f_close, + (long (*)(void *)) f_tell +}; + +/* OGG control */ + +#define READ_SAMPLES 4096 // samples that it must read before to send +#define MAX_PCMOUT 4096 // minimum size to read ogg samples +typedef struct +{ + OggVorbis_File vf; + vorbis_info *vi; + int current_section; + + // OGG file operation + int fd; + int mode; + int eof; + int flag; + int volume; + int seek_time; + + /* OGG buffer control */ + short pcmout[2][READ_SAMPLES + MAX_PCMOUT * 2]; /* take 4k out of the data segment, not the stack */ + int pcmout_pos; + int pcm_indx; + +} private_data_ogg; + +static private_data_ogg private_ogg; + +// OGG thread control + +#define STACKSIZE 8192 + +static u8 oggplayer_stack[STACKSIZE]; +static lwpq_t oggplayer_queue = LWP_TQUEUE_NULL; +static lwp_t h_oggplayer = LWP_THREAD_NULL; +static int ogg_thread_running = 0; + +static void ogg_add_callback(int voice) +{ + if (!ogg_thread_running) + { + ASND_StopVoice(0); + return; + } + + if (private_ogg.flag & 128) + return; // Ogg is paused + + if (private_ogg.pcm_indx >= READ_SAMPLES) + { + if (ASND_AddVoice(0, + (void *) private_ogg.pcmout[private_ogg.pcmout_pos], + private_ogg.pcm_indx << 1) == 0) + { + private_ogg.pcmout_pos ^= 1; + private_ogg.pcm_indx = 0; + private_ogg.flag = 0; + LWP_ThreadSignal(oggplayer_queue); + } + } + else + { + if (private_ogg.flag & 64) + { + private_ogg.flag &= ~64; + LWP_ThreadSignal(oggplayer_queue); + } + } +} + +static void * ogg_player_thread(private_data_ogg * priv) +{ + int first_time = 1; + long ret; + + //init + LWP_InitQueue(&oggplayer_queue); + + priv[0].vi = ov_info(&priv[0].vf, -1); + + ASND_Pause(0); + + priv[0].pcm_indx = 0; + priv[0].pcmout_pos = 0; + priv[0].eof = 0; + priv[0].flag = 0; + priv[0].current_section = 0; + + ogg_thread_running = 1; + + while (!priv[0].eof && ogg_thread_running) + { + if (priv[0].flag) + LWP_ThreadSleep(oggplayer_queue); // wait only when i have samples to send + + if (priv[0].flag == 0) // wait to all samples are sent + { + if (ASND_TestPointer(0, priv[0].pcmout[priv[0].pcmout_pos]) + && ASND_StatusVoice(0) != SND_UNUSED) + { + priv[0].flag |= 64; + continue; + } + if (priv[0].pcm_indx < READ_SAMPLES) + { + priv[0].flag = 3; + + if (priv[0].seek_time >= 0) + { + ov_time_seek(&priv[0].vf, priv[0].seek_time); + priv[0].seek_time = -1; + } + + ret = ov_read( + &priv[0].vf, + (void *) &priv[0].pcmout[priv[0].pcmout_pos][priv[0].pcm_indx], + MAX_PCMOUT,/*0,2,1,*/&priv[0].current_section); + priv[0].flag &= 192; + if (ret == 0) + { + /* EOF */ + if (priv[0].mode & 1) + ov_time_seek(&priv[0].vf, 0); // repeat + else + priv[0].eof = 1; // stops + } + else if (ret < 0) + { + /* error in the stream. Not a problem, just reporting it in + case we (the app) cares. In this case, we don't. */ + if (ret != OV_HOLE) + { + if (priv[0].mode & 1) + ov_time_seek(&priv[0].vf, 0); // repeat + else + priv[0].eof = 1; // stops + } + } + else + { + /* we don't bother dealing with sample rate changes, etc, but + you'll have to*/ + priv[0].pcm_indx += ret >> 1; //get 16 bits samples + } + } + else + priv[0].flag = 1; + } + + if (priv[0].flag == 1) + { + if (ASND_StatusVoice(0) == SND_UNUSED || first_time) + { + first_time = 0; + if (priv[0].vi->channels == 2) + { + ASND_SetVoice(0, VOICE_STEREO_16BIT, priv[0].vi->rate, 0, + (void *) priv[0].pcmout[priv[0].pcmout_pos], + priv[0].pcm_indx << 1, priv[0].volume, + priv[0].volume, ogg_add_callback); + priv[0].pcmout_pos ^= 1; + priv[0].pcm_indx = 0; + priv[0].flag = 0; + } + else + { + ASND_SetVoice(0, VOICE_MONO_16BIT, priv[0].vi->rate, 0, + (void *) priv[0].pcmout[priv[0].pcmout_pos], + priv[0].pcm_indx << 1, priv[0].volume, + priv[0].volume, ogg_add_callback); + priv[0].pcmout_pos ^= 1; + priv[0].pcm_indx = 0; + priv[0].flag = 0; + } + } + } + usleep(100); + } + ov_clear(&priv[0].vf); + priv[0].fd = -1; + priv[0].pcm_indx = 0; + + return 0; +} + +void StopOgg() +{ + ASND_StopVoice(0); + ogg_thread_running = 0; + + if(h_oggplayer != LWP_THREAD_NULL) + { + if(oggplayer_queue != LWP_TQUEUE_NULL) + LWP_ThreadSignal(oggplayer_queue); + LWP_JoinThread(h_oggplayer, NULL); + h_oggplayer = LWP_THREAD_NULL; + } + if(oggplayer_queue != LWP_TQUEUE_NULL) + { + LWP_CloseQueue(oggplayer_queue); + oggplayer_queue = LWP_TQUEUE_NULL; + } +} + +int PlayOgg(const void *buffer, s32 len, int time_pos, int mode) +{ + StopOgg(); + + private_ogg.fd = mem_open((char *)buffer, len); + + if (private_ogg.fd < 0) + { + private_ogg.fd = -1; + return -1; + } + + private_ogg.mode = mode; + private_ogg.eof = 0; + private_ogg.volume = 127; + private_ogg.flag = 0; + private_ogg.seek_time = -1; + + if (time_pos > 0) + private_ogg.seek_time = time_pos; + + if (ov_open_callbacks((void *) &private_ogg.fd, &private_ogg.vf, NULL, 0, callbacks) < 0) + { + mem_close(private_ogg.fd); // mem_close() can too close files from devices + private_ogg.fd = -1; + ogg_thread_running = 0; + return -1; + } + + if (LWP_CreateThread(&h_oggplayer, (void *) ogg_player_thread, + &private_ogg, oggplayer_stack, STACKSIZE, 80) == -1) + { + ogg_thread_running = 0; + ov_clear(&private_ogg.vf); + private_ogg.fd = -1; + return -1; + } + return 0; +} + +void PauseOgg(int pause) +{ + if (pause) + { + private_ogg.flag |= 128; + } + else + { + if (private_ogg.flag & 128) + { + private_ogg.flag |= 64; + private_ogg.flag &= ~128; + if (ogg_thread_running > 0) + { + LWP_ThreadSignal(oggplayer_queue); + } + } + } +} + +int StatusOgg() +{ + if (ogg_thread_running == 0) + return -1; // Error + else if (private_ogg.eof) + return 255; // EOF + else if (private_ogg.flag & 128) + return 2; // paused + return 1; // running +} + +void SetVolumeOgg(int volume) +{ + private_ogg.volume = volume; + ASND_ChangeVolumeVoice(0, volume, volume); +} + +s32 GetTimeOgg() +{ + int ret; + if (ogg_thread_running == 0 || private_ogg.fd < 0) + return -1; + ret = ((s32) ov_time_tell(&private_ogg.vf)); + + return ret; +} + +void SetTimeOgg(s32 time_pos) +{ + if (time_pos >= 0) + private_ogg.seek_time = time_pos; +} + +#endif diff --git a/plugins/snes9x_gx/source/utils/oggplayer.h b/plugins/snes9x_gx/source/utils/oggplayer.h new file mode 100644 index 00000000..c5050403 --- /dev/null +++ b/plugins/snes9x_gx/source/utils/oggplayer.h @@ -0,0 +1,112 @@ +/* + Copyright (c) 2008 Francisco Muñoz 'Hermes' <www.elotrolado.net> + All rights reserved. + + Proper (standard) vorbis usage by Tantric, 2009 + Threading modifications/corrections by Tantric, 2009 + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + - Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - The names of the contributors may not be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __OGGPLAYER_H__ +#define __OGGPLAYER_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define OGG_ONE_TIME 0 +#define OGG_INFINITE_TIME 1 + +#define OGG_STATUS_RUNNING 1 +#define OGG_STATUS_ERR -1 +#define OGG_STATUS_PAUSED 2 +#define OGG_STATUS_EOF 255 + +/**************************************************************************** + * PlayOgg + * + * Creates a thread that starts playing from the specific Ogg buffer + * buffer - pointer to the start of the Ogg data + * len - length of Ogg file + * time_pos - initial time position at which to start playback + * mode - playback mode (OGG_ONE_TIME or OGG_INFINITE_TIME) + * returns: -1 on error, 0 on success + ***************************************************************************/ +int PlayOgg(const void *buffer, s32 len, int time_pos, int mode); + +/**************************************************************************** + * StopOgg + * + * Stops playback. The player thread is shut down. + ***************************************************************************/ +void StopOgg(); + +/**************************************************************************** + * PauseOgg + * + * Pauses playback. 0 -> continue, 1-> pause + ***************************************************************************/ +void PauseOgg(int pause); + +/**************************************************************************** + * StatusOgg + * + * Returns the Ogg player's status + * returns: + * OGG_STATUS_RUNNING + * OGG_STATUS_ERR -> not initialized + * OGG_STATUS_PAUSED + * OGG_STATUS_EOF -> player stopped by End Of File + ***************************************************************************/ +int StatusOgg(); + +/**************************************************************************** + * SetVolumeOgg + * + * Sets the Ogg playback volume (0 to 255 (max)) + ***************************************************************************/ +void SetVolumeOgg(int volume); + +/**************************************************************************** + * GetTimeOgg + * + * Gets current Ogg position + * returns -1 on error, or the time in milliseconds from the start + ***************************************************************************/ +s32 GetTimeOgg(); + +/**************************************************************************** + * SetTimeOgg + * + * Sets the time position + * time_pos: time position (in milliseconds) to advance + ***************************************************************************/ +void SetTimeOgg(s32 time_pos); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/plugins/snes9x_gx/source/utils/pngu.c b/plugins/snes9x_gx/source/utils/pngu.c new file mode 100644 index 00000000..52ff7d9b --- /dev/null +++ b/plugins/snes9x_gx/source/utils/pngu.c @@ -0,0 +1,755 @@ +/**************************************************************************** + * + * PNGU + * + * Original author: frontier (http://frontier-dev.net) + * Modified by Tantric, 2009-2010 + * + ***************************************************************************/ + +#include <stdio.h> +#include <malloc.h> +#include "pngu.h" +#include <png.h> + +// Constants +#define PNGU_SOURCE_BUFFER 1 +#define PNGU_SOURCE_DEVICE 2 + +// Return codes +#define PNGU_OK 0 +#define PNGU_ODD_WIDTH 1 +#define PNGU_ODD_STRIDE 2 +#define PNGU_INVALID_WIDTH_OR_HEIGHT 3 +#define PNGU_FILE_IS_NOT_PNG 4 +#define PNGU_UNSUPPORTED_COLOR_TYPE 5 +#define PNGU_NO_FILE_SELECTED 6 +#define PNGU_CANT_OPEN_FILE 7 +#define PNGU_CANT_READ_FILE 8 +#define PNGU_LIB_ERROR 9 + +// Color types +#define PNGU_COLOR_TYPE_GRAY 1 +#define PNGU_COLOR_TYPE_GRAY_ALPHA 2 +#define PNGU_COLOR_TYPE_PALETTE 3 +#define PNGU_COLOR_TYPE_RGB 4 +#define PNGU_COLOR_TYPE_RGB_ALPHA 5 +#define PNGU_COLOR_TYPE_UNKNOWN 6 + +// PNGU Image context struct +struct _IMGCTX +{ + int source; + void *buffer; + char *filename; + u32 cursor; + + u32 propRead; + PNGUPROP prop; + + u32 infoRead; + png_structp png_ptr; + png_infop info_ptr; + FILE *fd; + + png_bytep *row_pointers; + png_bytep img_data; +}; + +// PNGU Implementation + +static void pngu_free_info (IMGCTX ctx) +{ + if (ctx->infoRead) + { + if (ctx->source == PNGU_SOURCE_DEVICE) + fclose (ctx->fd); + + png_destroy_read_struct (&(ctx->png_ptr), &(ctx->info_ptr), (png_infopp)NULL); + + ctx->infoRead = 0; + } +} + +// Custom data provider function used for reading from memory buffers. +static void pngu_read_data_from_buffer (png_structp png_ptr, png_bytep data, png_size_t length) +{ + IMGCTX ctx = (IMGCTX) png_get_io_ptr (png_ptr); + memcpy (data, ctx->buffer + ctx->cursor, length); + ctx->cursor += length; +} + +// Custom data writer function used for writing to memory buffers. +static void pngu_write_data_to_buffer (png_structp png_ptr, png_bytep data, png_size_t length) +{ + IMGCTX ctx = (IMGCTX) png_get_io_ptr (png_ptr); + memcpy (ctx->buffer + ctx->cursor, data, length); + ctx->cursor += length; +} + +// Custom data flusher function used for writing to memory buffers. +static void pngu_flush_data_to_buffer (png_structp png_ptr) +{ + // Nothing to do here +} + +static int pngu_info (IMGCTX ctx) +{ + png_byte magic[8]; + png_uint_32 width; + png_uint_32 height; + png_color_16p background; + png_bytep trans; + png_color_16p trans_values; + int scale, i; + + // Check if there is a file selected and if it is a valid .png + if (ctx->source == PNGU_SOURCE_BUFFER) + memcpy (magic, ctx->buffer, 8); + + else if (ctx->source == PNGU_SOURCE_DEVICE) + { + // Open file + if (!(ctx->fd = fopen (ctx->filename, "rb"))) + return PNGU_CANT_OPEN_FILE; + + // Load first 8 bytes into magic buffer + if (fread (magic, 1, 8, ctx->fd) != 8) + { + fclose (ctx->fd); + return PNGU_CANT_READ_FILE; + } + } + + else + return PNGU_NO_FILE_SELECTED;; + + if (png_sig_cmp(magic, 0, 8) != 0) + { + if (ctx->source == PNGU_SOURCE_DEVICE) + fclose (ctx->fd); + return PNGU_FILE_IS_NOT_PNG; + } + + // Allocation of libpng structs + ctx->png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if (!(ctx->png_ptr)) + { + if (ctx->source == PNGU_SOURCE_DEVICE) + fclose (ctx->fd); + return PNGU_LIB_ERROR; + } + + ctx->info_ptr = png_create_info_struct (ctx->png_ptr); + if (!(ctx->info_ptr)) + { + if (ctx->source == PNGU_SOURCE_DEVICE) + fclose (ctx->fd); + png_destroy_read_struct (&(ctx->png_ptr), (png_infopp)NULL, (png_infopp)NULL); + return PNGU_LIB_ERROR; + } + + if (ctx->source == PNGU_SOURCE_BUFFER) + { + // Installation of our custom data provider function + ctx->cursor = 0; + png_set_read_fn (ctx->png_ptr, ctx, pngu_read_data_from_buffer); + } + else if (ctx->source == PNGU_SOURCE_DEVICE) + { + // Default data provider uses function fread, so it needs to use our FILE* + png_init_io (ctx->png_ptr, ctx->fd); + png_set_sig_bytes (ctx->png_ptr, 8); // We have read 8 bytes already to check PNG authenticity + } + + // Read png header + png_read_info (ctx->png_ptr, ctx->info_ptr); + + // Query image properties if they have not been queried before + if (!ctx->propRead) + { + int ctxNumTrans; + + png_get_IHDR(ctx->png_ptr, ctx->info_ptr, &width, &height, + (int *) &(ctx->prop.imgBitDepth), + (int *) &(ctx->prop.imgColorType), + NULL, NULL, NULL); + + ctx->prop.imgWidth = width; + ctx->prop.imgHeight = height; + switch (ctx->prop.imgColorType) + { + case PNG_COLOR_TYPE_GRAY: + ctx->prop.imgColorType = PNGU_COLOR_TYPE_GRAY; + break; + case PNG_COLOR_TYPE_GRAY_ALPHA: + ctx->prop.imgColorType = PNGU_COLOR_TYPE_GRAY_ALPHA; + break; + case PNG_COLOR_TYPE_PALETTE: + ctx->prop.imgColorType = PNGU_COLOR_TYPE_PALETTE; + break; + case PNG_COLOR_TYPE_RGB: + ctx->prop.imgColorType = PNGU_COLOR_TYPE_RGB; + break; + case PNG_COLOR_TYPE_RGB_ALPHA: + ctx->prop.imgColorType = PNGU_COLOR_TYPE_RGB_ALPHA; + break; + default: + ctx->prop.imgColorType = PNGU_COLOR_TYPE_UNKNOWN; + break; + } + + // Constant used to scale 16 bit values to 8 bit values + scale = 0; + if (ctx->prop.imgBitDepth == 16) + scale = 8; + + // Query background color, if any. + ctx->prop.validBckgrnd = 0; + + switch(ctx->prop.imgColorType) + { + case PNGU_COLOR_TYPE_RGB: + case PNGU_COLOR_TYPE_RGB_ALPHA: + { + if(png_get_bKGD (ctx->png_ptr, ctx->info_ptr, &background)){ + ctx->prop.validBckgrnd = 1; + ctx->prop.bckgrnd.r = background->red >> scale; + ctx->prop.bckgrnd.g = background->green >> scale; + ctx->prop.bckgrnd.b = background->blue >> scale; + } + + // Query list of transparent colors, if any. + ctx->prop.numTrans = 0; + ctx->prop.trans = NULL; + + if(png_get_tRNS (ctx->png_ptr, ctx->info_ptr, &trans, (int *) &(ctx->prop.numTrans), &trans_values)){ + ctxNumTrans = ctx->prop.numTrans; + if(ctxNumTrans){ + ctx->prop.trans = malloc (sizeof (PNGUCOLOR) * ctxNumTrans); + if (ctx->prop.trans) + for (i = 0; i < ctxNumTrans; i++) + { + ctx->prop.trans[i].r = trans_values[i].red >> scale; + ctx->prop.trans[i].g = trans_values[i].green >> scale; + ctx->prop.trans[i].b = trans_values[i].blue >> scale; + } + else + ctx->prop.numTrans = 0; + } + } + + } + break; + + case PNGU_COLOR_TYPE_GRAY: + case PNGU_COLOR_TYPE_GRAY_ALPHA: + { + if(png_get_bKGD (ctx->png_ptr, ctx->info_ptr, &background)){ + ctx->prop.validBckgrnd = 1; + ctx->prop.bckgrnd.r = + ctx->prop.bckgrnd.g = + ctx->prop.bckgrnd.b = background->gray >> scale; + } + + // Query list of transparent colors, if any. + ctx->prop.numTrans = 0; + ctx->prop.trans = NULL; + + if(png_get_tRNS (ctx->png_ptr, ctx->info_ptr, &trans, (int *) &(ctx->prop.numTrans), &trans_values)){ + ctxNumTrans = ctx->prop.numTrans; + if(ctxNumTrans){ + ctx->prop.trans = malloc (sizeof (PNGUCOLOR) * ctxNumTrans); + if (ctx->prop.trans) + for (i = 0; i < ctxNumTrans; i++) + ctx->prop.trans[i].r = + ctx->prop.trans[i].g = + ctx->prop.trans[i].b = trans_values[i].gray >> scale; + else + ctx->prop.numTrans = 0; + } + } + + } + break; + + default: + + // It was none of those things, + { + // Query list of transparent colors, if any. + ctx->prop.numTrans = 0; + ctx->prop.trans = NULL; + } + break; + } + + ctx->propRead = 1; + } + + // Success + ctx->infoRead = 1; + + return PNGU_OK; +} + +static int pngu_decode (IMGCTX ctx, u32 width, u32 height, u32 stripAlpha) +{ + png_uint_32 rowbytes; + png_uint_32 i, propImgHeight; + + // Read info if it hasn't been read before + if (!ctx->infoRead) + { + int c = pngu_info (ctx); + if (c != PNGU_OK) + return c; + } + + // Check if the user has specified the real width and height of the image + if ( (ctx->prop.imgWidth != width) || (ctx->prop.imgHeight != height) ) + return PNGU_INVALID_WIDTH_OR_HEIGHT; + + // Check if color type is supported by PNGU + if (ctx->prop.imgColorType == PNGU_COLOR_TYPE_UNKNOWN) + return PNGU_UNSUPPORTED_COLOR_TYPE; + + // Scale 16 bit samples to 8 bit + if (ctx->prop.imgBitDepth == 16) + png_set_strip_16 (ctx->png_ptr); + + // Remove alpha channel if we don't need it + if (stripAlpha && ((ctx->prop.imgColorType == PNGU_COLOR_TYPE_RGB_ALPHA) || (ctx->prop.imgColorType == PNGU_COLOR_TYPE_GRAY_ALPHA))) + png_set_strip_alpha (ctx->png_ptr); + + // Expand 1, 2 and 4 bit samples to 8 bit + if (ctx->prop.imgBitDepth < 8) + png_set_packing (ctx->png_ptr); + + // Transform grayscale images to RGB + if ( (ctx->prop.imgColorType == PNGU_COLOR_TYPE_GRAY) || (ctx->prop.imgColorType == PNGU_COLOR_TYPE_GRAY_ALPHA) ) + png_set_gray_to_rgb (ctx->png_ptr); + + // Transform palette images to RGB + if (ctx->prop.imgColorType == PNGU_COLOR_TYPE_PALETTE) + png_set_palette_to_rgb(ctx->png_ptr); + + // Flush transformations + png_read_update_info (ctx->png_ptr, ctx->info_ptr); + + // Allocate memory to store the image + rowbytes = png_get_rowbytes (ctx->png_ptr, ctx->info_ptr); + + if (rowbytes & 3) + rowbytes = ((rowbytes >> 2) + 1) << 2; // Add extra padding so each row starts in a 4 byte boundary + + ctx->img_data = malloc (rowbytes * ctx->prop.imgHeight); + if (!ctx->img_data) + { + pngu_free_info (ctx); + return PNGU_LIB_ERROR; + } + + ctx->row_pointers = malloc (sizeof (png_bytep) * ctx->prop.imgHeight); + if (!ctx->row_pointers) + { + free (ctx->img_data); + pngu_free_info (ctx); + return PNGU_LIB_ERROR; + } + + propImgHeight = ctx->prop.imgHeight; + for (i = 0; i < propImgHeight; ++i) + ctx->row_pointers[i] = ctx->img_data + (i * rowbytes); + + // Transform the image and copy it to our allocated memory + png_read_image (ctx->png_ptr, ctx->row_pointers); + + // Free resources + pngu_free_info (ctx); + + // Success + return PNGU_OK; +} + +static inline u32 coordsRGBA8(u32 x, u32 y, u32 w) +{ + return ((((y >> 2) * (w >> 2) + (x >> 2)) << 5) + ((y & 3) << 2) + (x & 3)) << 1; +} + +static u8 * PNGU_DecodeTo4x4RGBA8 (IMGCTX ctx, u32 width, u32 height, int * dstWidth, int * dstHeight, u8 *dstPtr, int maxWidth, int maxHeight) +{ + u8 default_alpha = 255; + u8 *dst; + int x, y, x2, y2, offset; + int xRatio = 0, yRatio = 0; + png_byte *pixel; + + if (pngu_decode (ctx, width, height, 0) != PNGU_OK) + return NULL; + + int newWidth = width; + int newHeight = height; + + if((maxWidth > 0 && width > maxWidth) || (maxHeight > 0 && height > maxHeight)) + { + float ratio = (float)width/(float)height; + + newWidth = maxWidth; + newHeight = maxWidth/ratio; + + if(newHeight > maxHeight) + { + newWidth = maxHeight*ratio; + newHeight = maxHeight; + } + xRatio = (int)((width<<16)/newWidth)+1; + yRatio = (int)((height<<16)/newHeight)+1; + } + + int padWidth = newWidth; + int padHeight = newHeight; + if(padWidth%4) padWidth += (4-padWidth%4); + if(padHeight%4) padHeight += (4-padHeight%4); + + int len = (padWidth * padHeight) << 2; + if(len%32) len += (32-len%32); + + if(dstPtr) + dst = dstPtr; // use existing allocation + else + dst = memalign (32, len); + + if(!dst) + return NULL; + + for (y = 0; y < padHeight; y++) + { + for (x = 0; x < padWidth; x++) + { + offset = coordsRGBA8(x, y, padWidth); + + if(y >= newHeight || x >= newWidth) + { + dst[offset] = 0; + dst[offset+1] = 255; + dst[offset+32] = 255; + dst[offset+33] = 255; + } + else + { + if(xRatio > 0) + { + x2 = ((x*xRatio)>>16); + y2 = ((y*yRatio)>>16); + } + + if (ctx->prop.imgColorType == PNGU_COLOR_TYPE_GRAY_ALPHA || + ctx->prop.imgColorType == PNGU_COLOR_TYPE_RGB_ALPHA) + { + if(xRatio > 0) + pixel = &(ctx->row_pointers[y2][x2*4]); + else + pixel = &(ctx->row_pointers[y][x*4]); + + dst[offset] = pixel[3]; // Alpha + dst[offset+1] = pixel[0]; // Red + dst[offset+32] = pixel[1]; // Green + dst[offset+33] = pixel[2]; // Blue + } + else + { + if(xRatio > 0) + pixel = &(ctx->row_pointers[y2][x2*3]); + else + pixel = &(ctx->row_pointers[y][x*3]); + + dst[offset] = default_alpha; // Alpha + dst[offset+1] = pixel[0]; // Red + dst[offset+32] = pixel[1]; // Green + dst[offset+33] = pixel[2]; // Blue + } + } + } + } + + // Free resources + free (ctx->img_data); + free (ctx->row_pointers); + + *dstWidth = padWidth; + *dstHeight = padHeight; + DCFlushRange(dst, len); + return dst; +} + +IMGCTX PNGU_SelectImageFromBuffer (const void *buffer) +{ + IMGCTX ctx = NULL; + + if (!buffer) + return NULL; + + ctx = malloc (sizeof (struct _IMGCTX)); + if (!ctx) + return NULL; + + ctx->buffer = (void *) buffer; + ctx->source = PNGU_SOURCE_BUFFER; + ctx->cursor = 0; + ctx->filename = NULL; + ctx->propRead = 0; + ctx->infoRead = 0; + + return ctx; +} + +IMGCTX PNGU_SelectImageFromDevice (const char *filename) +{ + IMGCTX ctx = NULL; + + if (!filename) + return NULL; + + ctx = malloc (sizeof (struct _IMGCTX)); + if (!ctx) + return NULL; + + ctx->buffer = NULL; + ctx->source = PNGU_SOURCE_DEVICE; + ctx->cursor = 0; + + ctx->filename = malloc (strlen (filename) + 1); + if (!ctx->filename) + { + free (ctx); + return NULL; + } + strcpy(ctx->filename, filename); + + ctx->propRead = 0; + ctx->infoRead = 0; + + return ctx; +} + +void PNGU_ReleaseImageContext (IMGCTX ctx) +{ + if (!ctx) + return; + + if (ctx->filename) + free (ctx->filename); + + if ((ctx->propRead) && (ctx->prop.trans)) + free (ctx->prop.trans); + + pngu_free_info (ctx); + free (ctx); +} + +int PNGU_GetImageProperties (IMGCTX ctx, PNGUPROP *imgprop) +{ + int res; + + if (!ctx->propRead) + { + res = pngu_info (ctx); + if (res != PNGU_OK) + return res; + } + + *imgprop = ctx->prop; + return PNGU_OK; +} + +u8 * DecodePNG(const u8 *src, int * width, int * height, u8 *dstPtr, int maxwidth, int maxheight) +{ + PNGUPROP imgProp; + IMGCTX ctx = PNGU_SelectImageFromBuffer(src); + u8 *dst = NULL; + + if(!ctx) + return NULL; + + if(PNGU_GetImageProperties(ctx, &imgProp) == PNGU_OK) + dst = PNGU_DecodeTo4x4RGBA8 (ctx, imgProp.imgWidth, imgProp.imgHeight, width, height, dstPtr, maxwidth, maxheight); + + PNGU_ReleaseImageContext (ctx); + return dst; +} + +int PNGU_EncodeFromRGB (IMGCTX ctx, u32 width, u32 height, void *buffer, u32 stride) +{ + png_uint_32 rowbytes; + u32 y; + + // Erase from the context any readed info + pngu_free_info (ctx); + ctx->propRead = 0; + + // Check if the user has selected a file to write the image + if (ctx->source == PNGU_SOURCE_BUFFER); + + else if (ctx->source == PNGU_SOURCE_DEVICE) + { + // Open file + if (!(ctx->fd = fopen (ctx->filename, "wb"))) + return PNGU_CANT_OPEN_FILE; + } + + else + return PNGU_NO_FILE_SELECTED; + + // Allocation of libpng structs + ctx->png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if (!(ctx->png_ptr)) + { + if (ctx->source == PNGU_SOURCE_DEVICE) + fclose (ctx->fd); + return PNGU_LIB_ERROR; + } + + ctx->info_ptr = png_create_info_struct (ctx->png_ptr); + if (!(ctx->info_ptr)) + { + png_destroy_write_struct (&(ctx->png_ptr), (png_infopp)NULL); + if (ctx->source == PNGU_SOURCE_DEVICE) + fclose (ctx->fd); + return PNGU_LIB_ERROR; + } + + if (ctx->source == PNGU_SOURCE_BUFFER) + { + // Installation of our custom data writer function + ctx->cursor = 0; + png_set_write_fn (ctx->png_ptr, ctx, pngu_write_data_to_buffer, pngu_flush_data_to_buffer); + } + else if (ctx->source == PNGU_SOURCE_DEVICE) + { + // Default data writer uses function fwrite, so it needs to use our FILE* + png_init_io (ctx->png_ptr, ctx->fd); + } + + // Setup output file properties + png_set_IHDR (ctx->png_ptr, ctx->info_ptr, width, height, 8, PNG_COLOR_TYPE_RGB, + PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); + + // Allocate memory to store the image in RGB format + rowbytes = width * 3; + if (rowbytes % 4) + rowbytes = ((rowbytes >>2) + 1) <<2; // Add extra padding so each row starts in a 4 byte boundary + + ctx->img_data = malloc(rowbytes * height); + + if (!ctx->img_data) + { + png_destroy_write_struct (&(ctx->png_ptr), (png_infopp)NULL); + if (ctx->source == PNGU_SOURCE_DEVICE) + fclose (ctx->fd); + return PNGU_LIB_ERROR; + } + + memset(ctx->img_data, 0, rowbytes * height); + ctx->row_pointers = malloc (sizeof (png_bytep) * height); + + if (!ctx->row_pointers) + { + png_destroy_write_struct (&(ctx->png_ptr), (png_infopp)NULL); + if (ctx->source == PNGU_SOURCE_DEVICE) + fclose (ctx->fd); + return PNGU_LIB_ERROR; + } + + memset(ctx->row_pointers, 0, sizeof (png_bytep) * height); + + for (y = 0; y < height; ++y) + { + ctx->row_pointers[y] = buffer + (y * rowbytes); + } + + // Tell libpng where is our image data + png_set_rows (ctx->png_ptr, ctx->info_ptr, ctx->row_pointers); + + // Write file header and image data + png_write_png (ctx->png_ptr, ctx->info_ptr, PNG_TRANSFORM_IDENTITY, NULL); + + // Tell libpng we have no more data to write + png_write_end (ctx->png_ptr, (png_infop) NULL); + + // Free resources + free (ctx->img_data); + free (ctx->row_pointers); + png_destroy_write_struct (&(ctx->png_ptr), &(ctx->info_ptr)); + if (ctx->source == PNGU_SOURCE_DEVICE) + fclose (ctx->fd); + + // Success + return ctx->cursor; +} + +int PNGU_EncodeFromGXTexture (IMGCTX ctx, u32 width, u32 height, void *buffer, u32 stride) +{ + int res; + u32 x, y, tmpy1, tmpy2, tmpyWid, tmpxy; + + unsigned char * ptr = (unsigned char*)buffer; + unsigned char * tmpbuffer = malloc(width*height*3); + + if(!tmpbuffer) + return PNGU_LIB_ERROR; + + memset(tmpbuffer, 0, width*height*3); + png_uint_32 offset; + + for(y=0; y < height; y++) + { + tmpy1 = y * 640*3; + tmpy2 = y%4 << 2; + tmpyWid = (((y >> 2)<<4)*width); + + for(x=0; x < width; x++) + { + offset = tmpyWid + ((x >> 2)<<6) + ((tmpy2+ x%4 ) << 1); + tmpxy = x * 3 + tmpy1; + + tmpbuffer[tmpxy ] = ptr[offset+1]; // R + tmpbuffer[tmpxy+1] = ptr[offset+32]; // G + tmpbuffer[tmpxy+2] = ptr[offset+33]; // B + } + } + + res = PNGU_EncodeFromRGB (ctx, width, height, tmpbuffer, stride); + free(tmpbuffer); + return res; +} + +int PNGU_EncodeFromEFB (IMGCTX ctx, u32 width, u32 height) +{ + int res; + u32 x, y, tmpy1, tmpxy; + GXColor color; + + unsigned char * tmpbuffer = malloc(width*height*3); + + if(!tmpbuffer) + return PNGU_LIB_ERROR; + + for(y=0; y < height; y++) + { + tmpy1 = y * width * 3; + + for(x=0; x < width; x++) + { + tmpxy = x * 3 + tmpy1; + GX_PeekARGB(x, y, &color); + tmpbuffer[tmpxy ] = color.r; // R + tmpbuffer[tmpxy+1] = color.g; // G + tmpbuffer[tmpxy+2] = color.b; // B + } + } + + res = PNGU_EncodeFromRGB (ctx, width, height, tmpbuffer, 0); + free(tmpbuffer); + return res; +} diff --git a/plugins/snes9x_gx/source/utils/pngu.h b/plugins/snes9x_gx/source/utils/pngu.h new file mode 100644 index 00000000..fa896501 --- /dev/null +++ b/plugins/snes9x_gx/source/utils/pngu.h @@ -0,0 +1,75 @@ +/******************************************************************************************** +* +* PNGU +* +* Original author: frontier (http://frontier-dev.net) +* Modified by Tantric, 2009-2010 +* +********************************************************************************************/ + +#ifndef __PNGU__ +#define __PNGU__ + +#include <gccore.h> + +#ifdef __cplusplus + extern "C" { +#endif + +typedef struct +{ + u8 r; + u8 g; + u8 b; +} PNGUCOLOR; + +typedef struct +{ + u32 imgWidth; // In pixels + u32 imgHeight; // In pixels + u32 imgBitDepth; // In bitx + u32 imgColorType; // PNGU_COLOR_TYPE_* + u32 validBckgrnd; // Non zero if there is a background color + PNGUCOLOR bckgrnd; // Background color + u32 numTrans; // Number of transparent colors + PNGUCOLOR *trans; // Transparent colors +} PNGUPROP; + +// Image context, always initialize with SelectImageFrom* and free with ReleaseImageContext +struct _IMGCTX; +typedef struct _IMGCTX *IMGCTX; + +/**************************************************************************** +* Image context handling * +****************************************************************************/ + +// Selects a PNG file, previously loaded into a buffer, and creates an image context for subsequent processing. +IMGCTX PNGU_SelectImageFromBuffer (const void *buffer); + +// Selects a PNG file, from any devoptab device, and creates an image context for subsequent processing. +IMGCTX PNGU_SelectImageFromDevice (const char *filename); + +// Frees resources associated with an image context. Always call this function when you no longer need the IMGCTX. +void PNGU_ReleaseImageContext (IMGCTX ctx); + +/**************************************************************************** +* Miscellaneous * +****************************************************************************/ + +// Retrieves info from selected PNG file, including image dimensions, color format, background and transparency colors. +int PNGU_GetImageProperties (IMGCTX ctx, PNGUPROP *fileproperties); + +/**************************************************************************** +* Image conversion * +****************************************************************************/ + +u8 * DecodePNG(const u8 *src, int *width, int *height, u8 *dst, int maxwidth, int maxheight); +int PNGU_EncodeFromRGB (IMGCTX ctx, u32 width, u32 height, void *buffer, u32 stride); +int PNGU_EncodeFromGXTexture (IMGCTX ctx, u32 width, u32 height, void *buffer, u32 stride); +int PNGU_EncodeFromEFB (IMGCTX ctx, u32 width, u32 height); + +#ifdef __cplusplus + } +#endif + +#endif diff --git a/plugins/snes9x_gx/source/utils/sz/7zAlloc.c b/plugins/snes9x_gx/source/utils/sz/7zAlloc.c new file mode 100644 index 00000000..d5da81b1 --- /dev/null +++ b/plugins/snes9x_gx/source/utils/sz/7zAlloc.c @@ -0,0 +1,70 @@ +/* 7zAlloc.c */ + +#include <stdlib.h> +#include "7zAlloc.h" + +/* #define _SZ_ALLOC_DEBUG */ +/* use _SZ_ALLOC_DEBUG to debug alloc/free operations */ + +#ifdef _SZ_ALLOC_DEBUG + +#ifdef _WIN32 +#include <windows.h> +#endif +#include <stdio.h> +int g_allocCount = 0; +int g_allocCountTemp = 0; +#endif + +void *SzAlloc(size_t size) +{ + if (size == 0) + return 0; + #ifdef _SZ_ALLOC_DEBUG + fprintf(stderr, "\nAlloc %10d bytes; count = %10d", size, g_allocCount); + g_allocCount++; + #endif + return malloc(size); +} + +void SzFree(void *address) +{ + #ifdef _SZ_ALLOC_DEBUG + if (address != 0) + { + g_allocCount--; + fprintf(stderr, "\nFree; count = %10d", g_allocCount); + } + #endif + free(address); +} + +void *SzAllocTemp(size_t size) +{ + if (size == 0) + return 0; + #ifdef _SZ_ALLOC_DEBUG + fprintf(stderr, "\nAlloc_temp %10d bytes; count = %10d", size, g_allocCountTemp); + g_allocCountTemp++; + #ifdef _WIN32 + return HeapAlloc(GetProcessHeap(), 0, size); + #endif + #endif + return malloc(size); +} + +void SzFreeTemp(void *address) +{ + #ifdef _SZ_ALLOC_DEBUG + if (address != 0) + { + g_allocCountTemp--; + fprintf(stderr, "\nFree_temp; count = %10d", g_allocCountTemp); + } + #ifdef _WIN32 + HeapFree(GetProcessHeap(), 0, address); + return; + #endif + #endif + free(address); +} diff --git a/plugins/snes9x_gx/source/utils/sz/7zAlloc.h b/plugins/snes9x_gx/source/utils/sz/7zAlloc.h new file mode 100644 index 00000000..b02c1dea --- /dev/null +++ b/plugins/snes9x_gx/source/utils/sz/7zAlloc.h @@ -0,0 +1,20 @@ +/* 7zAlloc.h */ + +#ifndef __7Z_ALLOC_H +#define __7Z_ALLOC_H + +#include <stddef.h> + +typedef struct _ISzAlloc +{ + void *(*Alloc)(size_t size); + void (*Free)(void *address); /* address can be 0 */ +} ISzAlloc; + +void *SzAlloc(size_t size); +void SzFree(void *address); + +void *SzAllocTemp(size_t size); +void SzFreeTemp(void *address); + +#endif diff --git a/plugins/snes9x_gx/source/utils/sz/7zBuffer.c b/plugins/snes9x_gx/source/utils/sz/7zBuffer.c new file mode 100644 index 00000000..8bc8e067 --- /dev/null +++ b/plugins/snes9x_gx/source/utils/sz/7zBuffer.c @@ -0,0 +1,29 @@ +/* 7zBuffer.c */ + +#include "7zBuffer.h" +#include "7zAlloc.h" + +void SzByteBufferInit(CSzByteBuffer *buffer) +{ + buffer->Capacity = 0; + buffer->Items = 0; +} + +int SzByteBufferCreate(CSzByteBuffer *buffer, size_t newCapacity, void * (*allocFunc)(size_t size)) +{ + buffer->Capacity = newCapacity; + if (newCapacity == 0) + { + buffer->Items = 0; + return 1; + } + buffer->Items = (Byte *)allocFunc(newCapacity); + return (buffer->Items != 0); +} + +void SzByteBufferFree(CSzByteBuffer *buffer, void (*freeFunc)(void *)) +{ + freeFunc(buffer->Items); + buffer->Items = 0; + buffer->Capacity = 0; +} diff --git a/plugins/snes9x_gx/source/utils/sz/7zBuffer.h b/plugins/snes9x_gx/source/utils/sz/7zBuffer.h new file mode 100644 index 00000000..afea3ca8 --- /dev/null +++ b/plugins/snes9x_gx/source/utils/sz/7zBuffer.h @@ -0,0 +1,19 @@ +/* 7zBuffer.h */ + +#ifndef __7Z_BUFFER_H +#define __7Z_BUFFER_H + +#include <stddef.h> +#include "7zTypes.h" + +typedef struct _CSzByteBuffer +{ + size_t Capacity; + Byte *Items; +}CSzByteBuffer; + +void SzByteBufferInit(CSzByteBuffer *buffer); +int SzByteBufferCreate(CSzByteBuffer *buffer, size_t newCapacity, void * (*allocFunc)(size_t size)); +void SzByteBufferFree(CSzByteBuffer *buffer, void (*freeFunc)(void *)); + +#endif diff --git a/plugins/snes9x_gx/source/utils/sz/7zCrc.c b/plugins/snes9x_gx/source/utils/sz/7zCrc.c new file mode 100644 index 00000000..6dc7dd32 --- /dev/null +++ b/plugins/snes9x_gx/source/utils/sz/7zCrc.c @@ -0,0 +1,76 @@ +/* 7zCrc.c */ + +#include "7zCrc.h" + +#define kCrcPoly 0xEDB88320 + +UInt32 g_CrcTable[256]; + +void InitCrcTable() +{ + UInt32 i; + for (i = 0; i < 256; i++) + { + UInt32 r = i; + int j; + for (j = 0; j < 8; j++) + if (r & 1) + r = (r >> 1) ^ kCrcPoly; + else + r >>= 1; + g_CrcTable[i] = r; + } +} + +void CrcInit(UInt32 *crc) { *crc = 0xFFFFFFFF; } +UInt32 CrcGetDigest(UInt32 *crc) { return *crc ^ 0xFFFFFFFF; } + +void CrcUpdateByte(UInt32 *crc, Byte b) +{ + *crc = g_CrcTable[((Byte)(*crc)) ^ b] ^ (*crc >> 8); +} + +void CrcUpdateUInt16(UInt32 *crc, UInt16 v) +{ + CrcUpdateByte(crc, (Byte)v); + CrcUpdateByte(crc, (Byte)(v >> 8)); +} + +void CrcUpdateUInt32(UInt32 *crc, UInt32 v) +{ + int i; + for (i = 0; i < 4; i++) + CrcUpdateByte(crc, (Byte)(v >> (8 * i))); +} + +void CrcUpdateUInt64(UInt32 *crc, UInt64 v) +{ + int i; + for (i = 0; i < 8; i++) + { + CrcUpdateByte(crc, (Byte)(v)); + v >>= 8; + } +} + +void CrcUpdate(UInt32 *crc, const void *data, size_t size) +{ + UInt32 v = *crc; + const Byte *p = (const Byte *)data; + for (; size > 0 ; size--, p++) + v = g_CrcTable[((Byte)(v)) ^ *p] ^ (v >> 8); + *crc = v; +} + +UInt32 CrcCalculateDigest(const void *data, size_t size) +{ + UInt32 crc; + CrcInit(&crc); + CrcUpdate(&crc, data, size); + return CrcGetDigest(&crc); +} + +int CrcVerifyDigest(UInt32 digest, const void *data, size_t size) +{ + return (CrcCalculateDigest(data, size) == digest); +} diff --git a/plugins/snes9x_gx/source/utils/sz/7zCrc.h b/plugins/snes9x_gx/source/utils/sz/7zCrc.h new file mode 100644 index 00000000..bac26b14 --- /dev/null +++ b/plugins/snes9x_gx/source/utils/sz/7zCrc.h @@ -0,0 +1,24 @@ +/* 7zCrc.h */ + +#ifndef __7Z_CRC_H +#define __7Z_CRC_H + +#include <stddef.h> + +#include "7zTypes.h" + +extern UInt32 g_CrcTable[256]; +void InitCrcTable(); + +void CrcInit(UInt32 *crc); +UInt32 CrcGetDigest(UInt32 *crc); +void CrcUpdateByte(UInt32 *crc, Byte v); +void CrcUpdateUInt16(UInt32 *crc, UInt16 v); +void CrcUpdateUInt32(UInt32 *crc, UInt32 v); +void CrcUpdateUInt64(UInt32 *crc, UInt64 v); +void CrcUpdate(UInt32 *crc, const void *data, size_t size); + +UInt32 CrcCalculateDigest(const void *data, size_t size); +int CrcVerifyDigest(UInt32 digest, const void *data, size_t size); + +#endif diff --git a/plugins/snes9x_gx/source/utils/sz/7zDecode.c b/plugins/snes9x_gx/source/utils/sz/7zDecode.c new file mode 100644 index 00000000..a1207249 --- /dev/null +++ b/plugins/snes9x_gx/source/utils/sz/7zDecode.c @@ -0,0 +1,361 @@ +/* 7zDecode.c */ + +#include "7zDecode.h" +#ifdef _SZ_ONE_DIRECTORY +#include "LzmaDecode.h" +#else +#include "../../Compress/LZMA_C/LzmaDecode.h" +#endif + +#ifdef _LZMA_OUT_READ +#include <string.h> // for memcpy +#endif + +CMethodID k_Copy = { { 0x0 }, 1 }; +CMethodID k_LZMA = { { 0x3, 0x1, 0x1 }, 3 }; + +#ifdef _LZMA_IN_CB + +typedef struct _CLzmaInCallbackImp +{ + ILzmaInCallback InCallback; + ISzInStream *InStream; + size_t Size; +} CLzmaInCallbackImp; + +int LzmaReadImp(void *object, const unsigned char **buffer, SizeT *size) +{ + CLzmaInCallbackImp *cb = (CLzmaInCallbackImp *)object; + size_t processedSize; + SZ_RESULT res; + *size = 0; + res = cb->InStream->Read((void *)cb->InStream, (void **)buffer, cb->Size, &processedSize); + *size = (SizeT)processedSize; + if (processedSize > cb->Size) + return (int)SZE_FAIL; + cb->Size -= processedSize; + if (res == SZ_OK) + return 0; + return (int)res; +} + +#endif + +SZ_RESULT SzDecode(const CFileSize *packSizes, const CFolder *folder, + #ifdef _LZMA_IN_CB + ISzInStream *inStream, + #else + const Byte *inBuffer, + #endif + Byte *outBuffer, size_t outSize, + size_t *outSizeProcessed, ISzAlloc *allocMain) +{ + UInt32 si; + size_t inSize = 0; + CCoderInfo *coder; + if (folder->NumPackStreams != 1) + return SZE_NOTIMPL; + if (folder->NumCoders != 1) + return SZE_NOTIMPL; + coder = folder->Coders; + *outSizeProcessed = 0; + + for (si = 0; si < folder->NumPackStreams; si++) + inSize += (size_t)packSizes[si]; + + if (AreMethodsEqual(&coder->MethodID, &k_Copy)) + { + size_t i; + if (inSize != outSize) + return SZE_DATA_ERROR; + #ifdef _LZMA_IN_CB + for (i = 0; i < inSize;) + { + size_t j; + Byte *inBuffer; + size_t bufferSize; + RINOK(inStream->Read((void *)inStream, (void **)&inBuffer, inSize - i, &bufferSize)); + if (bufferSize == 0) + return SZE_DATA_ERROR; + if (bufferSize > inSize - i) + return SZE_FAIL; + *outSizeProcessed += bufferSize; + for (j = 0; j < bufferSize && i < inSize; j++, i++) + outBuffer[i] = inBuffer[j]; + } + #else + for (i = 0; i < inSize; i++) + outBuffer[i] = inBuffer[i]; + *outSizeProcessed = inSize; + #endif + return SZ_OK; + } + + if (AreMethodsEqual(&coder->MethodID, &k_LZMA)) + { + #ifdef _LZMA_IN_CB + CLzmaInCallbackImp lzmaCallback; + #else + SizeT inProcessed; + #endif + + CLzmaDecoderState state; /* it's about 24-80 bytes structure, if int is 32-bit */ + int result; + SizeT outSizeProcessedLoc; + + #ifdef _LZMA_IN_CB + lzmaCallback.Size = inSize; + lzmaCallback.InStream = inStream; + lzmaCallback.InCallback.Read = LzmaReadImp; + #endif + + if (LzmaDecodeProperties(&state.Properties, coder->Properties.Items, + coder->Properties.Capacity) != LZMA_RESULT_OK) + return SZE_FAIL; + + state.Probs = (CProb *)allocMain->Alloc(LzmaGetNumProbs(&state.Properties) * sizeof(CProb)); + if (state.Probs == 0) + return SZE_OUTOFMEMORY; + + #ifdef _LZMA_OUT_READ + if (state.Properties.DictionarySize == 0) + state.Dictionary = 0; + else + { + state.Dictionary = (unsigned char *)allocMain->Alloc(state.Properties.DictionarySize); + if (state.Dictionary == 0) + { + allocMain->Free(state.Probs); + return SZE_OUTOFMEMORYDIC; + } + } + LzmaDecoderInit(&state); + #endif + + result = LzmaDecode(&state, + #ifdef _LZMA_IN_CB + &lzmaCallback.InCallback, + #else + inBuffer, (SizeT)inSize, &inProcessed, + #endif + outBuffer, (SizeT)outSize, &outSizeProcessedLoc); + *outSizeProcessed = (size_t)outSizeProcessedLoc; + allocMain->Free(state.Probs); + #ifdef _LZMA_OUT_READ + allocMain->Free(state.Dictionary); + #endif + if (result == LZMA_RESULT_DATA_ERROR) + return SZE_DATA_ERROR; + if (result != LZMA_RESULT_OK) + return SZE_FAIL; + return SZ_OK; + } + return SZE_NOTIMPL; +} + +#ifdef _LZMA_OUT_READ +// like SzDecode but uses less memory +SZ_RESULT SzDecode2(const CFileSize *packSizes, const CFolder *folder, + ISzInStream *inStream, + Byte *outBuffer, size_t outSize, + size_t *outSizeProcessed, ISzAlloc *allocMain, + size_t *fileOffset, size_t *fileSize) +{ + UInt32 si; + size_t inSize = 0; + CCoderInfo *coder; + if (folder->NumPackStreams != 1) + return SZE_NOTIMPL; + if (folder->NumCoders != 1) + return SZE_NOTIMPL; + coder = folder->Coders; + *outSizeProcessed = 0; + + for (si = 0; si < folder->NumPackStreams; si++) + inSize += (size_t)packSizes[si]; + + if (AreMethodsEqual(&coder->MethodID, &k_Copy)) + { + size_t i; + if (inSize != outSize) + return SZE_DATA_ERROR; + #ifdef _LZMA_IN_CB + for (i = 0; i < inSize;) + { + size_t j; + Byte *inBuffer; + size_t bufferSize; + RINOK(inStream->Read((void *)inStream, (void **)&inBuffer, inSize - i, &bufferSize)); + if (bufferSize == 0) + return SZE_DATA_ERROR; + if (bufferSize > inSize - i) + return SZE_FAIL; + *outSizeProcessed += bufferSize; + for (j = 0; j < bufferSize && i < inSize; j++, i++) + outBuffer[i] = inBuffer[j]; + } + #else + for (i = 0; i < inSize; i++) + outBuffer[i] = inBuffer[i]; + *outSizeProcessed = inSize; + #endif + return SZ_OK; + } + + if (AreMethodsEqual(&coder->MethodID, &k_LZMA)) + { + #ifdef _LZMA_IN_CB + CLzmaInCallbackImp lzmaCallback; + #else + SizeT inProcessed; + #endif + + CLzmaDecoderState state; /* it's about 24-80 bytes structure, if int is 32-bit */ + int result; + SizeT outSizeProcessedLoc; + + #ifdef _LZMA_IN_CB + lzmaCallback.Size = inSize; + lzmaCallback.InStream = inStream; + lzmaCallback.InCallback.Read = LzmaReadImp; + #endif + + if (LzmaDecodeProperties(&state.Properties, coder->Properties.Items, + coder->Properties.Capacity) != LZMA_RESULT_OK) + return SZE_FAIL; + + state.Probs = (CProb *)allocMain->Alloc(LzmaGetNumProbs(&state.Properties) * sizeof(CProb)); + if (state.Probs == 0) + return SZE_OUTOFMEMORY; + + if (state.Properties.DictionarySize == 0) + state.Dictionary = 0; + else + { + state.Dictionary = (unsigned char *)allocMain->Alloc(state.Properties.DictionarySize); + if (state.Dictionary == 0) + { + allocMain->Free(state.Probs); + return SZE_OUTOFMEMORYDIC; + } + } + LzmaDecoderInit(&state); + + // allocate memory for the temporary buffer + Byte *tmpBuffer = (Byte *)allocMain->Alloc(_LZMA_TEMP_BUFFER_SIZE); + + // variables containing the number of the first and the last bytes of the buffer + size_t bufferStart, bufferEnd; + bufferStart = bufferEnd = 0; + + // integers contains the offset, the size and the already copied data which will be + // copied from the tmpBuffer to outBuffer + size_t copyOffset, copySize, copyDone; + copyOffset = copySize = copyDone = 0; + + UInt32 i = 0; + int bytesToCopy = 0; + + // decompress data in _LZMA_TEMP_BUFFER_SIZE byte steps and copy the wanted file to outBuffer + do + { + if((*fileSize - copyDone) >= _LZMA_TEMP_BUFFER_SIZE) + bytesToCopy = _LZMA_TEMP_BUFFER_SIZE; + else + bytesToCopy = (*fileSize - copyDone); + + // decompress next bytes + result = LzmaDecode(&state, + #ifdef _LZMA_IN_CB + &lzmaCallback.InCallback, + #else + //inBuffer, (SizeT)inSize, &inProcessed, //TODO! + #endif + tmpBuffer, bytesToCopy, &outSizeProcessedLoc + ); + + // check result + if(result == LZMA_RESULT_DATA_ERROR) + { + return SZE_DATA_ERROR; + } + if(result != LZMA_RESULT_OK) + { + return SZE_FAIL; + } + + // normally this should never happen + if(outSizeProcessedLoc > _LZMA_TEMP_BUFFER_SIZE) + { + return SZE_FAIL; + } + + // update bufferStart and bufferEnd + bufferStart = _LZMA_TEMP_BUFFER_SIZE * i; + bufferEnd = bufferStart + outSizeProcessedLoc; + i++; + + // calculate copy offset and size + if(*fileOffset > bufferEnd) + { + // we haven't reached the start of the file yet + continue; + } + + // calculate offset + if(*fileOffset < bufferStart) + { + // the file has already started before this decompression step + copyOffset = 0; + } + else + { + // the file starts somewhere inside this buffer + copyDone = 0; + copyOffset = _LZMA_TEMP_BUFFER_SIZE - (bufferEnd - *fileOffset); + } + + // calculate size + if((*fileOffset + *fileSize) > bufferEnd) + { + // we'll need the whole buffer after copyOffset + copySize = _LZMA_TEMP_BUFFER_SIZE - copyOffset; + } + else + { + // we'll stop somewhere inside the buffer + copySize = (*fileOffset + *fileSize) - (bufferStart + copyOffset); + } + + // copy bytes to the real output buffer + if(copySize == 0) + { + continue; + } + // printf("memcpy(outBuffer + %d, tmpBuffer + %d, %d)\n", copyDone, copyOffset, copySize); + memcpy(outBuffer + copyDone, tmpBuffer + copyOffset, copySize); + copyDone += copySize; + } + while((*fileOffset + *fileSize) > bufferEnd); + + /* result = LzmaDecode(&state, + #ifdef _LZMA_IN_CB + &lzmaCallback.InCallback, + #else + inBuffer, (SizeT)inSize, &inProcessed, + #endif + outBuffer, (SizeT)outSize, &outSizeProcessedLoc);*/ + //*outSizeProcessed = (size_t)outSizeProcessedLoc; + *outSizeProcessed = copyDone; + allocMain->Free(tmpBuffer); // free the temporary buffer again + allocMain->Free(state.Probs); + allocMain->Free(state.Dictionary); + /* if (result == LZMA_RESULT_DATA_ERROR) + return SZE_DATA_ERROR; + if (result != LZMA_RESULT_OK) + return SZE_FAIL;*/ + return SZ_OK; + } + return SZE_NOTIMPL; + } + #endif diff --git a/plugins/snes9x_gx/source/utils/sz/7zDecode.h b/plugins/snes9x_gx/source/utils/sz/7zDecode.h new file mode 100644 index 00000000..9f15ba16 --- /dev/null +++ b/plugins/snes9x_gx/source/utils/sz/7zDecode.h @@ -0,0 +1,37 @@ +/* 7zDecode.h */ + +#if defined(_LZMA_OUT_READ) && !defined(_LZMA_IN_CB) +#error "Fixme: _LZMA_OUT_READ && _LZMA_IN_CB isn't currently possible!" +#endif + +#ifndef __7Z_DECODE_H +#define __7Z_DECODE_H + +#include "7zItem.h" +#include "7zAlloc.h" +#ifdef _LZMA_IN_CB +#include "7zIn.h" +#endif + +SZ_RESULT SzDecode(const CFileSize *packSizes, const CFolder *folder, + #ifdef _LZMA_IN_CB + ISzInStream *stream, + #else + const Byte *inBuffer, + #endif + Byte *outBuffer, size_t outSize, + size_t *outSizeProcessed, ISzAlloc *allocMain); + +#ifdef _LZMA_OUT_READ +#ifndef _LZMA_TEMP_BUFFER_SIZE +#define _LZMA_TEMP_BUFFER_SIZE (2048) // size of the temporary buffer in bytes +#endif + +SZ_RESULT SzDecode2(const CFileSize *packSizes, const CFolder *folder, + ISzInStream *stream, + Byte *outBuffer, size_t outSize, + size_t *outSizeProcessed, ISzAlloc *allocMain, + size_t *fileOffset, size_t *fileSize); +#endif // #ifdef _LZMA_OUT_READ + +#endif diff --git a/plugins/snes9x_gx/source/utils/sz/7zExtract.c b/plugins/snes9x_gx/source/utils/sz/7zExtract.c new file mode 100644 index 00000000..d7401460 --- /dev/null +++ b/plugins/snes9x_gx/source/utils/sz/7zExtract.c @@ -0,0 +1,254 @@ +/* 7zExtract.c */ + +#include "7zExtract.h" +#include "7zDecode.h" +#include "7zCrc.h" + +SZ_RESULT SzExtract( + ISzInStream *inStream, + CArchiveDatabaseEx *db, + UInt32 fileIndex, + UInt32 *blockIndex, + Byte **outBuffer, + size_t *outBufferSize, + size_t *offset, + size_t *outSizeProcessed, + ISzAlloc *allocMain, + ISzAlloc *allocTemp) +{ + UInt32 folderIndex = db->FileIndexToFolderIndexMap[fileIndex]; + SZ_RESULT res = SZ_OK; + *offset = 0; + *outSizeProcessed = 0; + if (folderIndex == (UInt32)-1) + { + allocMain->Free(*outBuffer); + *blockIndex = folderIndex; + *outBuffer = 0; + *outBufferSize = 0; + return SZ_OK; + } + + if (*outBuffer == 0 || *blockIndex != folderIndex) + { + CFolder *folder = db->Database.Folders + folderIndex; + CFileSize unPackSize = SzFolderGetUnPackSize(folder); + #ifndef _LZMA_IN_CB + CFileSize packSize = SzArDbGetFolderFullPackSize(db, folderIndex); + Byte *inBuffer = 0; + size_t processedSize; + #endif + *blockIndex = folderIndex; + allocMain->Free(*outBuffer); + *outBuffer = 0; + + RINOK(inStream->Seek(inStream, SzArDbGetFolderStreamPos(db, folderIndex, 0))); + + #ifndef _LZMA_IN_CB + if (packSize != 0) + { + inBuffer = (Byte *)allocTemp->Alloc((size_t)packSize); + if (inBuffer == 0) + return SZE_OUTOFMEMORY; + } + res = inStream->Read(inStream, inBuffer, (size_t)packSize, &processedSize); + if (res == SZ_OK && processedSize != (size_t)packSize) + res = SZE_FAIL; + #endif + if (res == SZ_OK) + { + *outBufferSize = (size_t)unPackSize; + if (unPackSize != 0) + { + *outBuffer = (Byte *)allocMain->Alloc((size_t)unPackSize); + if (*outBuffer == 0) + res = SZE_OUTOFMEMORY; + } + if (res == SZ_OK) + { + size_t outRealSize; + res = SzDecode(db->Database.PackSizes + + db->FolderStartPackStreamIndex[folderIndex], folder, + #ifdef _LZMA_IN_CB + inStream, + #else + inBuffer, + #endif + *outBuffer, (size_t)unPackSize, &outRealSize, allocTemp); + if (res == SZ_OK) + { + if (outRealSize == (size_t)unPackSize) + { + if (folder->UnPackCRCDefined) + { + if (!CrcVerifyDigest(folder->UnPackCRC, *outBuffer, (size_t)unPackSize)) + res = SZE_FAIL; + } + } + else + res = SZE_FAIL; + } + } + } + #ifndef _LZMA_IN_CB + allocTemp->Free(inBuffer); + #endif + } + if (res == SZ_OK) + { + UInt32 i; + CFileItem *fileItem = db->Database.Files + fileIndex; + *offset = 0; + for(i = db->FolderStartFileIndex[folderIndex]; i < fileIndex; i++) + *offset += (UInt32)db->Database.Files[i].Size; + *outSizeProcessed = (size_t)fileItem->Size; + if (*offset + *outSizeProcessed > *outBufferSize) + return SZE_FAIL; + { + if (fileItem->IsFileCRCDefined) + { + if (!CrcVerifyDigest(fileItem->FileCRC, *outBuffer + *offset, *outSizeProcessed)) + res = SZE_FAIL; + } + } + } + return res; +} + +#ifdef _LZMA_OUT_READ +// similar to SzExtract but needs less memory +SZ_RESULT SzExtract2( + ISzInStream *inStream, + CArchiveDatabaseEx *db, + UInt32 fileIndex, + UInt32 *blockIndex, + Byte **outBuffer, + size_t *outBufferSize, + size_t *offset, + size_t *outSizeProcessed, + ISzAlloc *allocMain, + ISzAlloc *allocTemp) +{ + UInt32 folderIndex = db->FileIndexToFolderIndexMap[fileIndex]; + SZ_RESULT res = SZ_OK; + *offset = 0; + *outSizeProcessed = 0; + if (folderIndex == (UInt32)-1) + { + *blockIndex = folderIndex; + #ifndef GEKKO + allocMain->Free(*outBuffer); + *outBuffer = 0; + #endif + *outBufferSize = 0; + return SZ_OK; + } + +// if (*outBuffer == 0 || *blockIndex != folderIndex) +// { + CFolder *folder = db->Database.Folders + folderIndex; + CFileSize unPackSize = SzFolderGetUnPackSize(folder); + #ifndef _LZMA_IN_CB + CFileSize packSize = SzArDbGetFolderFullPackSize(db, folderIndex); + Byte *inBuffer = 0; + size_t processedSize; + #endif + *blockIndex = folderIndex; + #ifndef GEKKO + allocMain->Free(*outBuffer); + *outBuffer = 0; + #endif + + RINOK(inStream->Seek(inStream, SzArDbGetFolderStreamPos(db, folderIndex, 0))); + + #ifndef _LZMA_IN_CB + if (packSize != 0) + { + inBuffer = (Byte *)allocTemp->Alloc((size_t)packSize); + if (inBuffer == 0) + return SZE_OUTOFMEMORY; + } + res = inStream->Read(inStream, inBuffer, (size_t)packSize, &processedSize); + if (res == SZ_OK && processedSize != (size_t)packSize) + res = SZE_FAIL; + #endif + if (res == SZ_OK) + { + // calculate file offset and filesize + CFileItem *fileItem = db->Database.Files + fileIndex; + UInt32 i; + *offset = 0; + for(i = db->FolderStartFileIndex[folderIndex]; i < fileIndex; i++) + *offset += (UInt32)db->Database.Files[i].Size; + *outSizeProcessed = (size_t)fileItem->Size; + *outBufferSize = (size_t)fileItem->Size; + if (unPackSize != 0) + { + #ifndef GEKKO + *outBuffer = (Byte *)allocMain->Alloc((size_t)fileItem->Size); + if (*outBuffer == 0) + res = SZE_OUTOFMEMORY; + #endif + } + if (res == SZ_OK) + { + + size_t outRealSize; + res = SzDecode2(db->Database.PackSizes + + db->FolderStartPackStreamIndex[folderIndex], folder, + #ifdef _LZMA_IN_CB + inStream, + #else + inBuffer, + #endif + *outBuffer, (size_t)unPackSize, &outRealSize, allocTemp, + offset, outSizeProcessed + ); + *outSizeProcessed = outRealSize; +/* if (res == SZ_OK) // we can't validate the CRC of the whole data stream because we only extracted the wanted file + { + if (outRealSize == (size_t)unPackSize) + { + if (folder->UnPackCRCDefined) + { + if (!CrcVerifyDigest(folder->UnPackCRC, *outBuffer, (size_t)unPackSize)) + res = SZE_FAIL; + } + } + else + res = SZE_FAIL; + }*/ + } +// } + #ifndef _LZMA_IN_CB + allocTemp->Free(inBuffer); + #endif + } + if (res == SZ_OK) + { +/* UInt32 i; + CFileItem *fileItem = db->Database.Files + fileIndex; + *offset = 0; + for(i = db->FolderStartFileIndex[folderIndex]; i < fileIndex; i++) + *offset += (UInt32)db->Database.Files[i].Size; + *outSizeProcessed = (size_t)fileItem->Size;*/ + //CFileItem *fileItem = db->Database.Files + fileIndex; + if (/**offset +*/ *outSizeProcessed > *outBufferSize) + return SZE_FAIL; + { + //if (fileItem->IsFileCRCDefined) + //{ + // if (!CrcVerifyDigest(fileItem->FileCRC, *outBuffer/* + *offset*/, *outSizeProcessed)) + // res = SZE_CRC_ERROR; // why does SzExtract return SZE_FAIL when we can return SZE_CRC_ERROR? + //} + } + } + + // change *offset to 0 because SzExtract normally decompresses the whole solid block + // and sets *offset to the offset of the wanted file. + // SzDecode2 does only copy the needed file to the output buffer and has to set *offset + // to 0 to ensure compatibility with SzExtract + *offset = 0; + return res; +} +#endif diff --git a/plugins/snes9x_gx/source/utils/sz/7zExtract.h b/plugins/snes9x_gx/source/utils/sz/7zExtract.h new file mode 100644 index 00000000..7f7e07ee --- /dev/null +++ b/plugins/snes9x_gx/source/utils/sz/7zExtract.h @@ -0,0 +1,60 @@ +/* 7zExtract.h */ + +#if defined(_LZMA_OUT_READ) && !defined(_LZMA_IN_CB) +#error "Fixme: _LZMA_OUT_READ && _LZMA_IN_CB isn't currently possible!" +#endif + +#ifndef __7Z_EXTRACT_H +#define __7Z_EXTRACT_H + +#include "7zIn.h" + +/* + SzExtract extracts file from archive + + SzExtract2 does the same but needs less memory + + *outBuffer must be 0 before first call for each new archive. + + Extracting cache: + If you need to decompress more than one file, you can send + these values from previous call: + *blockIndex, + *outBuffer, + *outBufferSize + You can consider "*outBuffer" as cache of solid block. If your archive is solid, + it will increase decompression speed. + + If you use external function, you can declare these 3 cache variables + (blockIndex, outBuffer, outBufferSize) as static in that external function. + + Free *outBuffer and set *outBuffer to 0, if you want to flush cache. +*/ + +SZ_RESULT SzExtract( + ISzInStream *inStream, + CArchiveDatabaseEx *db, + UInt32 fileIndex, /* index of file */ + UInt32 *blockIndex, /* index of solid block */ + Byte **outBuffer, /* pointer to pointer to output buffer (allocated with allocMain) */ + size_t *outBufferSize, /* buffer size for output buffer */ + size_t *offset, /* offset of stream for required file in *outBuffer */ + size_t *outSizeProcessed, /* size of file in *outBuffer */ + ISzAlloc *allocMain, + ISzAlloc *allocTemp); + +#ifdef _LZMA_OUT_READ +SZ_RESULT SzExtract2( + ISzInStream *inStream, + CArchiveDatabaseEx *db, + UInt32 fileIndex, /* index of file */ + UInt32 *blockIndex, /* index of solid block */ + Byte **outBuffer, /* pointer to pointer to output buffer (allocated with allocMain) */ + size_t *outBufferSize, /* buffer size for output buffer */ + size_t *offset, /* offset of stream for required file in *outBuffer */ + size_t *outSizeProcessed, /* size of file in *outBuffer */ + ISzAlloc *allocMain, + ISzAlloc *allocTemp); +#endif + +#endif diff --git a/plugins/snes9x_gx/source/utils/sz/7zHeader.c b/plugins/snes9x_gx/source/utils/sz/7zHeader.c new file mode 100644 index 00000000..e26c0143 --- /dev/null +++ b/plugins/snes9x_gx/source/utils/sz/7zHeader.c @@ -0,0 +1,5 @@ +/* 7zHeader.c */ + +#include "7zHeader.h" + +Byte k7zSignature[k7zSignatureSize] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C}; diff --git a/plugins/snes9x_gx/source/utils/sz/7zHeader.h b/plugins/snes9x_gx/source/utils/sz/7zHeader.h new file mode 100644 index 00000000..7edf640f --- /dev/null +++ b/plugins/snes9x_gx/source/utils/sz/7zHeader.h @@ -0,0 +1,55 @@ +/* 7zHeader.h */ + +#ifndef __7Z_HEADER_H +#define __7Z_HEADER_H + +#include "7zTypes.h" + +#define k7zSignatureSize 6 +extern Byte k7zSignature[k7zSignatureSize]; + +#define k7zMajorVersion 0 + +#define k7zStartHeaderSize 0x20 + +enum EIdEnum +{ + k7zIdEnd, + + k7zIdHeader, + + k7zIdArchiveProperties, + + k7zIdAdditionalStreamsInfo, + k7zIdMainStreamsInfo, + k7zIdFilesInfo, + + k7zIdPackInfo, + k7zIdUnPackInfo, + k7zIdSubStreamsInfo, + + k7zIdSize, + k7zIdCRC, + + k7zIdFolder, + + k7zIdCodersUnPackSize, + k7zIdNumUnPackStream, + + k7zIdEmptyStream, + k7zIdEmptyFile, + k7zIdAnti, + + k7zIdName, + k7zIdCreationTime, + k7zIdLastAccessTime, + k7zIdLastWriteTime, + k7zIdWinAttributes, + k7zIdComment, + + k7zIdEncodedHeader, + + k7zIdStartPos +}; + +#endif diff --git a/plugins/snes9x_gx/source/utils/sz/7zIn.c b/plugins/snes9x_gx/source/utils/sz/7zIn.c new file mode 100644 index 00000000..b3e9ea27 --- /dev/null +++ b/plugins/snes9x_gx/source/utils/sz/7zIn.c @@ -0,0 +1,1281 @@ +/* 7zIn.c */ + +#include "7zIn.h" +#include "7zCrc.h" +#include "7zDecode.h" + +#define RINOM(x) { if((x) == 0) return SZE_OUTOFMEMORY; } + +void SzArDbExInit(CArchiveDatabaseEx *db) +{ + SzArchiveDatabaseInit(&db->Database); + db->FolderStartPackStreamIndex = 0; + db->PackStreamStartPositions = 0; + db->FolderStartFileIndex = 0; + db->FileIndexToFolderIndexMap = 0; +} + +void SzArDbExFree(CArchiveDatabaseEx *db, void (*freeFunc)(void *)) +{ + freeFunc(db->FolderStartPackStreamIndex); + freeFunc(db->PackStreamStartPositions); + freeFunc(db->FolderStartFileIndex); + freeFunc(db->FileIndexToFolderIndexMap); + SzArchiveDatabaseFree(&db->Database, freeFunc); + SzArDbExInit(db); +} + +/* +CFileSize GetFolderPackStreamSize(int folderIndex, int streamIndex) const +{ + return PackSizes[FolderStartPackStreamIndex[folderIndex] + streamIndex]; +} + +CFileSize GetFilePackSize(int fileIndex) const +{ + int folderIndex = FileIndexToFolderIndexMap[fileIndex]; + if (folderIndex >= 0) + { + const CFolder &folderInfo = Folders[folderIndex]; + if (FolderStartFileIndex[folderIndex] == fileIndex) + return GetFolderFullPackSize(folderIndex); + } + return 0; +} +*/ + +#define MY_ALLOC(T, p, size, allocFunc) { if ((size) == 0) p = 0; else \ + if ((p = (T *)allocFunc((size) * sizeof(T))) == 0) return SZE_OUTOFMEMORY; } + +SZ_RESULT SzArDbExFill(CArchiveDatabaseEx *db, void * (*allocFunc)(size_t size)) +{ + UInt32 startPos = 0; + CFileSize startPosSize = 0; + UInt32 i; + UInt32 folderIndex = 0; + UInt32 indexInFolder = 0; + MY_ALLOC(UInt32, db->FolderStartPackStreamIndex, db->Database.NumFolders, allocFunc); + for(i = 0; i < db->Database.NumFolders; i++) + { + db->FolderStartPackStreamIndex[i] = startPos; + startPos += db->Database.Folders[i].NumPackStreams; + } + + MY_ALLOC(CFileSize, db->PackStreamStartPositions, db->Database.NumPackStreams, allocFunc); + + for(i = 0; i < db->Database.NumPackStreams; i++) + { + db->PackStreamStartPositions[i] = startPosSize; + startPosSize += db->Database.PackSizes[i]; + } + + MY_ALLOC(UInt32, db->FolderStartFileIndex, db->Database.NumFolders, allocFunc); + MY_ALLOC(UInt32, db->FileIndexToFolderIndexMap, db->Database.NumFiles, allocFunc); + + for (i = 0; i < db->Database.NumFiles; i++) + { + CFileItem *file = db->Database.Files + i; + int emptyStream = !file->HasStream; + if (emptyStream && indexInFolder == 0) + { + db->FileIndexToFolderIndexMap[i] = (UInt32)-1; + continue; + } + if (indexInFolder == 0) + { + /* + v3.13 incorrectly worked with empty folders + v4.07: Loop for skipping empty folders + */ + while(1) + { + if (folderIndex >= db->Database.NumFolders) + return SZE_ARCHIVE_ERROR; + db->FolderStartFileIndex[folderIndex] = i; + if (db->Database.Folders[folderIndex].NumUnPackStreams != 0) + break; + folderIndex++; + } + } + db->FileIndexToFolderIndexMap[i] = folderIndex; + if (emptyStream) + continue; + indexInFolder++; + if (indexInFolder >= db->Database.Folders[folderIndex].NumUnPackStreams) + { + folderIndex++; + indexInFolder = 0; + } + } + return SZ_OK; +} + + +CFileSize SzArDbGetFolderStreamPos(CArchiveDatabaseEx *db, UInt32 folderIndex, UInt32 indexInFolder) +{ + return db->ArchiveInfo.DataStartPosition + + db->PackStreamStartPositions[db->FolderStartPackStreamIndex[folderIndex] + indexInFolder]; +} + +CFileSize SzArDbGetFolderFullPackSize(CArchiveDatabaseEx *db, UInt32 folderIndex) +{ + UInt32 packStreamIndex = db->FolderStartPackStreamIndex[folderIndex]; + CFolder *folder = db->Database.Folders + folderIndex; + CFileSize size = 0; + UInt32 i; + for (i = 0; i < folder->NumPackStreams; i++) + size += db->Database.PackSizes[packStreamIndex + i]; + return size; +} + + +/* +SZ_RESULT SzReadTime(const CObjectVector<CSzByteBuffer> &dataVector, + CObjectVector<CFileItem> &files, UInt64 type) +{ + CBoolVector boolVector; + RINOK(ReadBoolVector2(files.Size(), boolVector)) + + CStreamSwitch streamSwitch; + RINOK(streamSwitch.Set(this, &dataVector)); + + for(int i = 0; i < files.Size(); i++) + { + CFileItem &file = files[i]; + CArchiveFileTime fileTime; + bool defined = boolVector[i]; + if (defined) + { + UInt32 low, high; + RINOK(SzReadUInt32(low)); + RINOK(SzReadUInt32(high)); + fileTime.dwLowDateTime = low; + fileTime.dwHighDateTime = high; + } + switch(type) + { + case k7zIdCreationTime: + file.IsCreationTimeDefined = defined; + if (defined) + file.CreationTime = fileTime; + break; + case k7zIdLastWriteTime: + file.IsLastWriteTimeDefined = defined; + if (defined) + file.LastWriteTime = fileTime; + break; + case k7zIdLastAccessTime: + file.IsLastAccessTimeDefined = defined; + if (defined) + file.LastAccessTime = fileTime; + break; + } + } + return SZ_OK; +} +*/ + +SZ_RESULT SafeReadDirect(ISzInStream *inStream, Byte *data, size_t size) +{ + #ifdef _LZMA_IN_CB + while (size > 0) + { + Byte *inBuffer; + size_t processedSize; + RINOK(inStream->Read(inStream, (void **)&inBuffer, size, &processedSize)); + if (processedSize == 0 || processedSize > size) + return SZE_FAIL; + size -= processedSize; + do + { + *data++ = *inBuffer++; + } + while (--processedSize != 0); + } + #else + size_t processedSize; + RINOK(inStream->Read(inStream, data, size, &processedSize)); + if (processedSize != size) + return SZE_FAIL; + #endif + return SZ_OK; +} + +SZ_RESULT SafeReadDirectByte(ISzInStream *inStream, Byte *data) +{ + return SafeReadDirect(inStream, data, 1); +} + +SZ_RESULT SafeReadDirectUInt32(ISzInStream *inStream, UInt32 *value) +{ + int i; + *value = 0; + for (i = 0; i < 4; i++) + { + Byte b; + RINOK(SafeReadDirectByte(inStream, &b)); + *value |= ((UInt32)b << (8 * i)); + } + return SZ_OK; +} + +SZ_RESULT SafeReadDirectUInt64(ISzInStream *inStream, UInt64 *value) +{ + int i; + *value = 0; + for (i = 0; i < 8; i++) + { + Byte b; + RINOK(SafeReadDirectByte(inStream, &b)); + *value |= ((UInt32)b << (8 * i)); + } + return SZ_OK; +} + +int TestSignatureCandidate(Byte *testBytes) +{ + size_t i; + for (i = 0; i < k7zSignatureSize; i++) + if (testBytes[i] != k7zSignature[i]) + return 0; + return 1; +} + +typedef struct _CSzState +{ + Byte *Data; + size_t Size; +}CSzData; + +SZ_RESULT SzReadByte(CSzData *sd, Byte *b) +{ + if (sd->Size == 0) + return SZE_ARCHIVE_ERROR; + sd->Size--; + *b = *sd->Data++; + return SZ_OK; +} + +SZ_RESULT SzReadBytes(CSzData *sd, Byte *data, size_t size) +{ + size_t i; + for (i = 0; i < size; i++) + { + RINOK(SzReadByte(sd, data + i)); + } + return SZ_OK; +} + +SZ_RESULT SzReadUInt32(CSzData *sd, UInt32 *value) +{ + int i; + *value = 0; + for (i = 0; i < 4; i++) + { + Byte b; + RINOK(SzReadByte(sd, &b)); + *value |= ((UInt32)(b) << (8 * i)); + } + return SZ_OK; +} + +SZ_RESULT SzReadNumber(CSzData *sd, UInt64 *value) +{ + Byte firstByte; + Byte mask = 0x80; + int i; + RINOK(SzReadByte(sd, &firstByte)); + *value = 0; + for (i = 0; i < 8; i++) + { + Byte b; + if ((firstByte & mask) == 0) + { + UInt64 highPart = firstByte & (mask - 1); + *value += (highPart << (8 * i)); + return SZ_OK; + } + RINOK(SzReadByte(sd, &b)); + *value |= ((UInt64)b << (8 * i)); + mask >>= 1; + } + return SZ_OK; +} + +SZ_RESULT SzReadSize(CSzData *sd, CFileSize *value) +{ + UInt64 value64; + RINOK(SzReadNumber(sd, &value64)); + *value = (CFileSize)value64; + return SZ_OK; +} + +SZ_RESULT SzReadNumber32(CSzData *sd, UInt32 *value) +{ + UInt64 value64; + RINOK(SzReadNumber(sd, &value64)); + if (value64 >= 0x80000000) + return SZE_NOTIMPL; + if (value64 >= ((UInt64)(1) << ((sizeof(size_t) - 1) * 8 + 2))) + return SZE_NOTIMPL; + *value = (UInt32)value64; + return SZ_OK; +} + +SZ_RESULT SzReadID(CSzData *sd, UInt64 *value) +{ + return SzReadNumber(sd, value); +} + +SZ_RESULT SzSkeepDataSize(CSzData *sd, UInt64 size) +{ + if (size > sd->Size) + return SZE_ARCHIVE_ERROR; + sd->Size -= (size_t)size; + sd->Data += (size_t)size; + return SZ_OK; +} + +SZ_RESULT SzSkeepData(CSzData *sd) +{ + UInt64 size; + RINOK(SzReadNumber(sd, &size)); + return SzSkeepDataSize(sd, size); +} + +SZ_RESULT SzReadArchiveProperties(CSzData *sd) +{ + while(1) + { + UInt64 type; + RINOK(SzReadID(sd, &type)); + if (type == k7zIdEnd) + break; + SzSkeepData(sd); + } + return SZ_OK; +} + +SZ_RESULT SzWaitAttribute(CSzData *sd, UInt64 attribute) +{ + while(1) + { + UInt64 type; + RINOK(SzReadID(sd, &type)); + if (type == attribute) + return SZ_OK; + if (type == k7zIdEnd) + return SZE_ARCHIVE_ERROR; + RINOK(SzSkeepData(sd)); + } +} + +SZ_RESULT SzReadBoolVector(CSzData *sd, size_t numItems, Byte **v, void * (*allocFunc)(size_t size)) +{ + Byte b = 0; + Byte mask = 0; + size_t i; + MY_ALLOC(Byte, *v, numItems, allocFunc); + for(i = 0; i < numItems; i++) + { + if (mask == 0) + { + RINOK(SzReadByte(sd, &b)); + mask = 0x80; + } + (*v)[i] = (Byte)(((b & mask) != 0) ? 1 : 0); + mask >>= 1; + } + return SZ_OK; +} + +SZ_RESULT SzReadBoolVector2(CSzData *sd, size_t numItems, Byte **v, void * (*allocFunc)(size_t size)) +{ + Byte allAreDefined; + size_t i; + RINOK(SzReadByte(sd, &allAreDefined)); + if (allAreDefined == 0) + return SzReadBoolVector(sd, numItems, v, allocFunc); + MY_ALLOC(Byte, *v, numItems, allocFunc); + for(i = 0; i < numItems; i++) + (*v)[i] = 1; + return SZ_OK; +} + +SZ_RESULT SzReadHashDigests( + CSzData *sd, + size_t numItems, + Byte **digestsDefined, + UInt32 **digests, + void * (*allocFunc)(size_t size)) +{ + size_t i; + RINOK(SzReadBoolVector2(sd, numItems, digestsDefined, allocFunc)); + MY_ALLOC(UInt32, *digests, numItems, allocFunc); + for(i = 0; i < numItems; i++) + if ((*digestsDefined)[i]) + { + RINOK(SzReadUInt32(sd, (*digests) + i)); + } + return SZ_OK; +} + +SZ_RESULT SzReadPackInfo( + CSzData *sd, + CFileSize *dataOffset, + UInt32 *numPackStreams, + CFileSize **packSizes, + Byte **packCRCsDefined, + UInt32 **packCRCs, + void * (*allocFunc)(size_t size)) +{ + UInt32 i; + RINOK(SzReadSize(sd, dataOffset)); + RINOK(SzReadNumber32(sd, numPackStreams)); + + RINOK(SzWaitAttribute(sd, k7zIdSize)); + + MY_ALLOC(CFileSize, *packSizes, (size_t)*numPackStreams, allocFunc); + + for(i = 0; i < *numPackStreams; i++) + { + RINOK(SzReadSize(sd, (*packSizes) + i)); + } + + while(1) + { + UInt64 type; + RINOK(SzReadID(sd, &type)); + if (type == k7zIdEnd) + break; + if (type == k7zIdCRC) + { + RINOK(SzReadHashDigests(sd, (size_t)*numPackStreams, packCRCsDefined, packCRCs, allocFunc)); + continue; + } + RINOK(SzSkeepData(sd)); + } + if (*packCRCsDefined == 0) + { + MY_ALLOC(Byte, *packCRCsDefined, (size_t)*numPackStreams, allocFunc); + MY_ALLOC(UInt32, *packCRCs, (size_t)*numPackStreams, allocFunc); + for(i = 0; i < *numPackStreams; i++) + { + (*packCRCsDefined)[i] = 0; + (*packCRCs)[i] = 0; + } + } + return SZ_OK; +} + +SZ_RESULT SzReadSwitch(CSzData *sd) +{ + Byte external; + RINOK(SzReadByte(sd, &external)); + return (external == 0) ? SZ_OK: SZE_ARCHIVE_ERROR; +} + +SZ_RESULT SzGetNextFolderItem(CSzData *sd, CFolder *folder, void * (*allocFunc)(size_t size)) +{ + UInt32 numCoders; + UInt32 numBindPairs; + UInt32 numPackedStreams; + UInt32 i; + UInt32 numInStreams = 0; + UInt32 numOutStreams = 0; + RINOK(SzReadNumber32(sd, &numCoders)); + folder->NumCoders = numCoders; + + MY_ALLOC(CCoderInfo, folder->Coders, (size_t)numCoders, allocFunc); + + for (i = 0; i < numCoders; i++) + SzCoderInfoInit(folder->Coders + i); + + for (i = 0; i < numCoders; i++) + { + Byte mainByte; + CCoderInfo *coder = folder->Coders + i; + { + RINOK(SzReadByte(sd, &mainByte)); + coder->MethodID.IDSize = (Byte)(mainByte & 0xF); + RINOK(SzReadBytes(sd, coder->MethodID.ID, coder->MethodID.IDSize)); + if ((mainByte & 0x10) != 0) + { + RINOK(SzReadNumber32(sd, &coder->NumInStreams)); + RINOK(SzReadNumber32(sd, &coder->NumOutStreams)); + } + else + { + coder->NumInStreams = 1; + coder->NumOutStreams = 1; + } + if ((mainByte & 0x20) != 0) + { + UInt64 propertiesSize = 0; + RINOK(SzReadNumber(sd, &propertiesSize)); + if (!SzByteBufferCreate(&coder->Properties, (size_t)propertiesSize, allocFunc)) + return SZE_OUTOFMEMORY; + RINOK(SzReadBytes(sd, coder->Properties.Items, (size_t)propertiesSize)); + } + } + while ((mainByte & 0x80) != 0) + { + RINOK(SzReadByte(sd, &mainByte)); + RINOK(SzSkeepDataSize(sd, (mainByte & 0xF))); + if ((mainByte & 0x10) != 0) + { + UInt32 n; + RINOK(SzReadNumber32(sd, &n)); + RINOK(SzReadNumber32(sd, &n)); + } + if ((mainByte & 0x20) != 0) + { + UInt64 propertiesSize = 0; + RINOK(SzReadNumber(sd, &propertiesSize)); + RINOK(SzSkeepDataSize(sd, propertiesSize)); + } + } + numInStreams += (UInt32)coder->NumInStreams; + numOutStreams += (UInt32)coder->NumOutStreams; + } + + numBindPairs = numOutStreams - 1; + folder->NumBindPairs = numBindPairs; + + + MY_ALLOC(CBindPair, folder->BindPairs, (size_t)numBindPairs, allocFunc); + + for (i = 0; i < numBindPairs; i++) + { + CBindPair *bindPair = folder->BindPairs + i;; + RINOK(SzReadNumber32(sd, &bindPair->InIndex)); + RINOK(SzReadNumber32(sd, &bindPair->OutIndex)); + } + + numPackedStreams = numInStreams - (UInt32)numBindPairs; + + folder->NumPackStreams = numPackedStreams; + MY_ALLOC(UInt32, folder->PackStreams, (size_t)numPackedStreams, allocFunc); + + if (numPackedStreams == 1) + { + UInt32 j; + UInt32 pi = 0; + for (j = 0; j < numInStreams; j++) + if (SzFolderFindBindPairForInStream(folder, j) < 0) + { + folder->PackStreams[pi++] = j; + break; + } + } + else + for(i = 0; i < numPackedStreams; i++) + { + RINOK(SzReadNumber32(sd, folder->PackStreams + i)); + } + return SZ_OK; +} + +SZ_RESULT SzReadUnPackInfo( + CSzData *sd, + UInt32 *numFolders, + CFolder **folders, /* for allocFunc */ + void * (*allocFunc)(size_t size), + ISzAlloc *allocTemp) +{ + UInt32 i; + RINOK(SzWaitAttribute(sd, k7zIdFolder)); + RINOK(SzReadNumber32(sd, numFolders)); + { + RINOK(SzReadSwitch(sd)); + + MY_ALLOC(CFolder, *folders, (size_t)*numFolders, allocFunc); + + for(i = 0; i < *numFolders; i++) + SzFolderInit((*folders) + i); + + for(i = 0; i < *numFolders; i++) + { + RINOK(SzGetNextFolderItem(sd, (*folders) + i, allocFunc)); + } + } + + RINOK(SzWaitAttribute(sd, k7zIdCodersUnPackSize)); + + for(i = 0; i < *numFolders; i++) + { + UInt32 j; + CFolder *folder = (*folders) + i; + UInt32 numOutStreams = SzFolderGetNumOutStreams(folder); + + MY_ALLOC(CFileSize, folder->UnPackSizes, (size_t)numOutStreams, allocFunc); + + for(j = 0; j < numOutStreams; j++) + { + RINOK(SzReadSize(sd, folder->UnPackSizes + j)); + } + } + + while(1) + { + UInt64 type; + RINOK(SzReadID(sd, &type)); + if (type == k7zIdEnd) + return SZ_OK; + if (type == k7zIdCRC) + { + SZ_RESULT res; + Byte *crcsDefined = 0; + UInt32 *crcs = 0; + res = SzReadHashDigests(sd, *numFolders, &crcsDefined, &crcs, allocTemp->Alloc); + if (res == SZ_OK) + { + for(i = 0; i < *numFolders; i++) + { + CFolder *folder = (*folders) + i; + folder->UnPackCRCDefined = crcsDefined[i]; + folder->UnPackCRC = crcs[i]; + } + } + allocTemp->Free(crcs); + allocTemp->Free(crcsDefined); + RINOK(res); + continue; + } + RINOK(SzSkeepData(sd)); + } +} + +SZ_RESULT SzReadSubStreamsInfo( + CSzData *sd, + UInt32 numFolders, + CFolder *folders, + UInt32 *numUnPackStreams, + CFileSize **unPackSizes, + Byte **digestsDefined, + UInt32 **digests, + ISzAlloc *allocTemp) +{ + UInt64 type = 0; + UInt32 i; + UInt32 si = 0; + UInt32 numDigests = 0; + + for(i = 0; i < numFolders; i++) + folders[i].NumUnPackStreams = 1; + *numUnPackStreams = numFolders; + + while(1) + { + RINOK(SzReadID(sd, &type)); + if (type == k7zIdNumUnPackStream) + { + *numUnPackStreams = 0; + for(i = 0; i < numFolders; i++) + { + UInt32 numStreams; + RINOK(SzReadNumber32(sd, &numStreams)); + folders[i].NumUnPackStreams = numStreams; + *numUnPackStreams += numStreams; + } + continue; + } + if (type == k7zIdCRC || type == k7zIdSize) + break; + if (type == k7zIdEnd) + break; + RINOK(SzSkeepData(sd)); + } + + if (*numUnPackStreams == 0) + { + *unPackSizes = 0; + *digestsDefined = 0; + *digests = 0; + } + else + { + *unPackSizes = (CFileSize *)allocTemp->Alloc((size_t)*numUnPackStreams * sizeof(CFileSize)); + RINOM(*unPackSizes); + *digestsDefined = (Byte *)allocTemp->Alloc((size_t)*numUnPackStreams * sizeof(Byte)); + RINOM(*digestsDefined); + *digests = (UInt32 *)allocTemp->Alloc((size_t)*numUnPackStreams * sizeof(UInt32)); + RINOM(*digests); + } + + for(i = 0; i < numFolders; i++) + { + /* + v3.13 incorrectly worked with empty folders + v4.07: we check that folder is empty + */ + CFileSize sum = 0; + UInt32 j; + UInt32 numSubstreams = folders[i].NumUnPackStreams; + if (numSubstreams == 0) + continue; + if (type == k7zIdSize) + for (j = 1; j < numSubstreams; j++) + { + CFileSize size; + RINOK(SzReadSize(sd, &size)); + (*unPackSizes)[si++] = size; + sum += size; + } + (*unPackSizes)[si++] = SzFolderGetUnPackSize(folders + i) - sum; + } + if (type == k7zIdSize) + { + RINOK(SzReadID(sd, &type)); + } + + for(i = 0; i < *numUnPackStreams; i++) + { + (*digestsDefined)[i] = 0; + (*digests)[i] = 0; + } + + + for(i = 0; i < numFolders; i++) + { + UInt32 numSubstreams = folders[i].NumUnPackStreams; + if (numSubstreams != 1 || !folders[i].UnPackCRCDefined) + numDigests += numSubstreams; + } + + + si = 0; + while(1) + { + if (type == k7zIdCRC) + { + int digestIndex = 0; + Byte *digestsDefined2 = 0; + UInt32 *digests2 = 0; + SZ_RESULT res = SzReadHashDigests(sd, numDigests, &digestsDefined2, &digests2, allocTemp->Alloc); + if (res == SZ_OK) + { + for (i = 0; i < numFolders; i++) + { + CFolder *folder = folders + i; + UInt32 numSubstreams = folder->NumUnPackStreams; + if (numSubstreams == 1 && folder->UnPackCRCDefined) + { + (*digestsDefined)[si] = 1; + (*digests)[si] = folder->UnPackCRC; + si++; + } + else + { + UInt32 j; + for (j = 0; j < numSubstreams; j++, digestIndex++) + { + (*digestsDefined)[si] = digestsDefined2[digestIndex]; + (*digests)[si] = digests2[digestIndex]; + si++; + } + } + } + } + allocTemp->Free(digestsDefined2); + allocTemp->Free(digests2); + RINOK(res); + } + else if (type == k7zIdEnd) + return SZ_OK; + else + { + RINOK(SzSkeepData(sd)); + } + RINOK(SzReadID(sd, &type)); + } +} + + +SZ_RESULT SzReadStreamsInfo( + CSzData *sd, + CFileSize *dataOffset, + CArchiveDatabase *db, + UInt32 *numUnPackStreams, + CFileSize **unPackSizes, /* allocTemp */ + Byte **digestsDefined, /* allocTemp */ + UInt32 **digests, /* allocTemp */ + void * (*allocFunc)(size_t size), + ISzAlloc *allocTemp) +{ + while(1) + { + UInt64 type; + RINOK(SzReadID(sd, &type)); + if ((UInt64)(int)type != type) + return SZE_FAIL; + switch((int)type) + { + case k7zIdEnd: + return SZ_OK; + case k7zIdPackInfo: + { + RINOK(SzReadPackInfo(sd, dataOffset, &db->NumPackStreams, + &db->PackSizes, &db->PackCRCsDefined, &db->PackCRCs, allocFunc)); + break; + } + case k7zIdUnPackInfo: + { + RINOK(SzReadUnPackInfo(sd, &db->NumFolders, &db->Folders, allocFunc, allocTemp)); + break; + } + case k7zIdSubStreamsInfo: + { + RINOK(SzReadSubStreamsInfo(sd, db->NumFolders, db->Folders, + numUnPackStreams, unPackSizes, digestsDefined, digests, allocTemp)); + break; + } + default: + return SZE_FAIL; + } + } +} + +Byte kUtf8Limits[5] = { 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; + +SZ_RESULT SzReadFileNames(CSzData *sd, UInt32 numFiles, CFileItem *files, + void * (*allocFunc)(size_t size)) +{ + UInt32 i; + for(i = 0; i < numFiles; i++) + { + UInt32 len = 0; + UInt32 pos = 0; + CFileItem *file = files + i; + while(pos + 2 <= sd->Size) + { + int numAdds; + UInt32 value = (UInt32)(sd->Data[pos] | (((UInt32)sd->Data[pos + 1]) << 8)); + pos += 2; + len++; + if (value == 0) + break; + if (value < 0x80) + continue; + if (value >= 0xD800 && value < 0xE000) + { + UInt32 c2; + if (value >= 0xDC00) + return SZE_ARCHIVE_ERROR; + if (pos + 2 > sd->Size) + return SZE_ARCHIVE_ERROR; + c2 = (UInt32)(sd->Data[pos] | (((UInt32)sd->Data[pos + 1]) << 8)); + pos += 2; + if (c2 < 0xDC00 || c2 >= 0xE000) + return SZE_ARCHIVE_ERROR; + value = ((value - 0xD800) << 10) | (c2 - 0xDC00); + } + for (numAdds = 1; numAdds < 5; numAdds++) + if (value < (((UInt32)1) << (numAdds * 5 + 6))) + break; + len += numAdds; + } + + MY_ALLOC(char, file->Name, (size_t)len, allocFunc); + + len = 0; + while(2 <= sd->Size) + { + int numAdds; + UInt32 value = (UInt32)(sd->Data[0] | (((UInt32)sd->Data[1]) << 8)); + SzSkeepDataSize(sd, 2); + if (value < 0x80) + { + file->Name[len++] = (char)value; + if (value == 0) + break; + continue; + } + if (value >= 0xD800 && value < 0xE000) + { + UInt32 c2 = (UInt32)(sd->Data[0] | (((UInt32)sd->Data[1]) << 8)); + SzSkeepDataSize(sd, 2); + value = ((value - 0xD800) << 10) | (c2 - 0xDC00); + } + for (numAdds = 1; numAdds < 5; numAdds++) + if (value < (((UInt32)1) << (numAdds * 5 + 6))) + break; + file->Name[len++] = (char)(kUtf8Limits[numAdds - 1] + (value >> (6 * numAdds))); + do + { + numAdds--; + file->Name[len++] = (char)(0x80 + ((value >> (6 * numAdds)) & 0x3F)); + } + while(numAdds > 0); + + len += numAdds; + } + } + return SZ_OK; +} + +SZ_RESULT SzReadHeader2( + CSzData *sd, + CArchiveDatabaseEx *db, /* allocMain */ + CFileSize **unPackSizes, /* allocTemp */ + Byte **digestsDefined, /* allocTemp */ + UInt32 **digests, /* allocTemp */ + Byte **emptyStreamVector, /* allocTemp */ + Byte **emptyFileVector, /* allocTemp */ + ISzAlloc *allocMain, + ISzAlloc *allocTemp) +{ + UInt64 type; + UInt32 numUnPackStreams = 0; + UInt32 numFiles = 0; + CFileItem *files = 0; + UInt32 numEmptyStreams = 0; + UInt32 i; + + RINOK(SzReadID(sd, &type)); + + if (type == k7zIdArchiveProperties) + { + RINOK(SzReadArchiveProperties(sd)); + RINOK(SzReadID(sd, &type)); + } + + + if (type == k7zIdMainStreamsInfo) + { + RINOK(SzReadStreamsInfo(sd, + &db->ArchiveInfo.DataStartPosition, + &db->Database, + &numUnPackStreams, + unPackSizes, + digestsDefined, + digests, allocMain->Alloc, allocTemp)); + db->ArchiveInfo.DataStartPosition += db->ArchiveInfo.StartPositionAfterHeader; + RINOK(SzReadID(sd, &type)); + } + + if (type == k7zIdEnd) + return SZ_OK; + if (type != k7zIdFilesInfo) + return SZE_ARCHIVE_ERROR; + + RINOK(SzReadNumber32(sd, &numFiles)); + db->Database.NumFiles = numFiles; + + MY_ALLOC(CFileItem, files, (size_t)numFiles, allocMain->Alloc); + + db->Database.Files = files; + for(i = 0; i < numFiles; i++) + SzFileInit(files + i); + + while(1) + { + UInt64 type; + UInt64 size; + RINOK(SzReadID(sd, &type)); + if (type == k7zIdEnd) + break; + RINOK(SzReadNumber(sd, &size)); + + if ((UInt64)(int)type != type) + { + RINOK(SzSkeepDataSize(sd, size)); + } + else + switch((int)type) + { + case k7zIdName: + { + RINOK(SzReadSwitch(sd)); + RINOK(SzReadFileNames(sd, numFiles, files, allocMain->Alloc)) + break; + } + case k7zIdEmptyStream: + { + RINOK(SzReadBoolVector(sd, numFiles, emptyStreamVector, allocTemp->Alloc)); + numEmptyStreams = 0; + for (i = 0; i < numFiles; i++) + if ((*emptyStreamVector)[i]) + numEmptyStreams++; + break; + } + case k7zIdEmptyFile: + { + RINOK(SzReadBoolVector(sd, numEmptyStreams, emptyFileVector, allocTemp->Alloc)); + break; + } + default: + { + RINOK(SzSkeepDataSize(sd, size)); + } + } + } + + { + UInt32 emptyFileIndex = 0; + UInt32 sizeIndex = 0; + for(i = 0; i < numFiles; i++) + { + CFileItem *file = files + i; + file->IsAnti = 0; + if (*emptyStreamVector == 0) + file->HasStream = 1; + else + file->HasStream = (Byte)((*emptyStreamVector)[i] ? 0 : 1); + if(file->HasStream) + { + file->IsDirectory = 0; + file->Size = (*unPackSizes)[sizeIndex]; + file->FileCRC = (*digests)[sizeIndex]; + file->IsFileCRCDefined = (Byte)(*digestsDefined)[sizeIndex]; + sizeIndex++; + } + else + { + if (*emptyFileVector == 0) + file->IsDirectory = 1; + else + file->IsDirectory = (Byte)((*emptyFileVector)[emptyFileIndex] ? 0 : 1); + emptyFileIndex++; + file->Size = 0; + file->IsFileCRCDefined = 0; + } + } + } + return SzArDbExFill(db, allocMain->Alloc); +} + +SZ_RESULT SzReadHeader( + CSzData *sd, + CArchiveDatabaseEx *db, + ISzAlloc *allocMain, + ISzAlloc *allocTemp) +{ + CFileSize *unPackSizes = 0; + Byte *digestsDefined = 0; + UInt32 *digests = 0; + Byte *emptyStreamVector = 0; + Byte *emptyFileVector = 0; + SZ_RESULT res = SzReadHeader2(sd, db, + &unPackSizes, &digestsDefined, &digests, + &emptyStreamVector, &emptyFileVector, + allocMain, allocTemp); + allocTemp->Free(unPackSizes); + allocTemp->Free(digestsDefined); + allocTemp->Free(digests); + allocTemp->Free(emptyStreamVector); + allocTemp->Free(emptyFileVector); + return res; +} + +SZ_RESULT SzReadAndDecodePackedStreams2( + ISzInStream *inStream, + CSzData *sd, + CSzByteBuffer *outBuffer, + CFileSize baseOffset, + CArchiveDatabase *db, + CFileSize **unPackSizes, + Byte **digestsDefined, + UInt32 **digests, + #ifndef _LZMA_IN_CB + Byte **inBuffer, + #endif + ISzAlloc *allocTemp) +{ + + UInt32 numUnPackStreams = 0; + CFileSize dataStartPos; + CFolder *folder; + #ifndef _LZMA_IN_CB + CFileSize packSize = 0; + UInt32 i = 0; + #endif + CFileSize unPackSize; + size_t outRealSize; + SZ_RESULT res; + + RINOK(SzReadStreamsInfo(sd, &dataStartPos, db, + &numUnPackStreams, unPackSizes, digestsDefined, digests, + allocTemp->Alloc, allocTemp)); + + dataStartPos += baseOffset; + if (db->NumFolders != 1) + return SZE_ARCHIVE_ERROR; + + folder = db->Folders; + unPackSize = SzFolderGetUnPackSize(folder); + + RINOK(inStream->Seek(inStream, dataStartPos)); + + #ifndef _LZMA_IN_CB + for (i = 0; i < db->NumPackStreams; i++) + packSize += db->PackSizes[i]; + + MY_ALLOC(Byte, *inBuffer, (size_t)packSize, allocTemp->Alloc); + + RINOK(SafeReadDirect(inStream, *inBuffer, (size_t)packSize)); + #endif + + if (!SzByteBufferCreate(outBuffer, (size_t)unPackSize, allocTemp->Alloc)) + return SZE_OUTOFMEMORY; + + res = SzDecode(db->PackSizes, folder, + #ifdef _LZMA_IN_CB + inStream, + #else + *inBuffer, + #endif + outBuffer->Items, (size_t)unPackSize, + &outRealSize, allocTemp); + RINOK(res) + if (outRealSize != (UInt32)unPackSize) + return SZE_FAIL; + if (folder->UnPackCRCDefined) + if (!CrcVerifyDigest(folder->UnPackCRC, outBuffer->Items, (size_t)unPackSize)) + return SZE_FAIL; + return SZ_OK; +} + +SZ_RESULT SzReadAndDecodePackedStreams( + ISzInStream *inStream, + CSzData *sd, + CSzByteBuffer *outBuffer, + CFileSize baseOffset, + ISzAlloc *allocTemp) +{ + CArchiveDatabase db; + CFileSize *unPackSizes = 0; + Byte *digestsDefined = 0; + UInt32 *digests = 0; + #ifndef _LZMA_IN_CB + Byte *inBuffer = 0; + #endif + SZ_RESULT res; + SzArchiveDatabaseInit(&db); + res = SzReadAndDecodePackedStreams2(inStream, sd, outBuffer, baseOffset, + &db, &unPackSizes, &digestsDefined, &digests, + #ifndef _LZMA_IN_CB + &inBuffer, + #endif + allocTemp); + SzArchiveDatabaseFree(&db, allocTemp->Free); + allocTemp->Free(unPackSizes); + allocTemp->Free(digestsDefined); + allocTemp->Free(digests); + #ifndef _LZMA_IN_CB + allocTemp->Free(inBuffer); + #endif + return res; +} + +SZ_RESULT SzArchiveOpen2( + ISzInStream *inStream, + CArchiveDatabaseEx *db, + ISzAlloc *allocMain, + ISzAlloc *allocTemp) +{ + Byte signature[k7zSignatureSize]; + Byte version; + UInt32 crcFromArchive; + UInt64 nextHeaderOffset; + UInt64 nextHeaderSize; + UInt32 nextHeaderCRC; + UInt32 crc; + CFileSize pos = 0; + CSzByteBuffer buffer; + CSzData sd; + SZ_RESULT res; + + RINOK(SafeReadDirect(inStream, signature, k7zSignatureSize)); + + if (!TestSignatureCandidate(signature)) + return SZE_ARCHIVE_ERROR; + + /* + db.Clear(); + db.ArchiveInfo.StartPosition = _arhiveBeginStreamPosition; + */ + RINOK(SafeReadDirectByte(inStream, &version)); + if (version != k7zMajorVersion) + return SZE_ARCHIVE_ERROR; + RINOK(SafeReadDirectByte(inStream, &version)); + + RINOK(SafeReadDirectUInt32(inStream, &crcFromArchive)); + + CrcInit(&crc); + RINOK(SafeReadDirectUInt64(inStream, &nextHeaderOffset)); + CrcUpdateUInt64(&crc, nextHeaderOffset); + RINOK(SafeReadDirectUInt64(inStream, &nextHeaderSize)); + CrcUpdateUInt64(&crc, nextHeaderSize); + RINOK(SafeReadDirectUInt32(inStream, &nextHeaderCRC)); + CrcUpdateUInt32(&crc, nextHeaderCRC); + + pos = k7zStartHeaderSize; + db->ArchiveInfo.StartPositionAfterHeader = pos; + + if (CrcGetDigest(&crc) != crcFromArchive) + return SZE_ARCHIVE_ERROR; + + if (nextHeaderSize == 0) + return SZ_OK; + + RINOK(inStream->Seek(inStream, (CFileSize)(pos + nextHeaderOffset))); + + if (!SzByteBufferCreate(&buffer, (size_t)nextHeaderSize, allocTemp->Alloc)) + return SZE_OUTOFMEMORY; + + res = SafeReadDirect(inStream, buffer.Items, (size_t)nextHeaderSize); + if (res == SZ_OK) + { + if (CrcVerifyDigest(nextHeaderCRC, buffer.Items, (UInt32)nextHeaderSize)) + { + while (1) + { + UInt64 type; + sd.Data = buffer.Items; + sd.Size = buffer.Capacity; + res = SzReadID(&sd, &type); + if (res != SZ_OK) + break; + if (type == k7zIdHeader) + { + res = SzReadHeader(&sd, db, allocMain, allocTemp); + break; + } + if (type != k7zIdEncodedHeader) + { + res = SZE_ARCHIVE_ERROR; + break; + } + { + CSzByteBuffer outBuffer; + res = SzReadAndDecodePackedStreams(inStream, &sd, &outBuffer, + db->ArchiveInfo.StartPositionAfterHeader, + allocTemp); + if (res != SZ_OK) + { + SzByteBufferFree(&outBuffer, allocTemp->Free); + break; + } + SzByteBufferFree(&buffer, allocTemp->Free); + buffer.Items = outBuffer.Items; + buffer.Capacity = outBuffer.Capacity; + } + } + } + } + SzByteBufferFree(&buffer, allocTemp->Free); + return res; +} + +SZ_RESULT SzArchiveOpen( + ISzInStream *inStream, + CArchiveDatabaseEx *db, + ISzAlloc *allocMain, + ISzAlloc *allocTemp) +{ + SZ_RESULT res = SzArchiveOpen2(inStream, db, allocMain, allocTemp); + if (res != SZ_OK) + SzArDbExFree(db, allocMain->Free); + return res; +} diff --git a/plugins/snes9x_gx/source/utils/sz/7zIn.h b/plugins/snes9x_gx/source/utils/sz/7zIn.h new file mode 100644 index 00000000..8ded0ecc --- /dev/null +++ b/plugins/snes9x_gx/source/utils/sz/7zIn.h @@ -0,0 +1,55 @@ +/* 7zIn.h */ + +#ifndef __7Z_IN_H +#define __7Z_IN_H + +#include "7zHeader.h" +#include "7zItem.h" +#include "7zAlloc.h" + +typedef struct _CInArchiveInfo +{ + CFileSize StartPositionAfterHeader; + CFileSize DataStartPosition; +}CInArchiveInfo; + +typedef struct _CArchiveDatabaseEx +{ + CArchiveDatabase Database; + CInArchiveInfo ArchiveInfo; + UInt32 *FolderStartPackStreamIndex; + CFileSize *PackStreamStartPositions; + UInt32 *FolderStartFileIndex; + UInt32 *FileIndexToFolderIndexMap; +}CArchiveDatabaseEx; + +void SzArDbExInit(CArchiveDatabaseEx *db); +void SzArDbExFree(CArchiveDatabaseEx *db, void (*freeFunc)(void *)); +CFileSize SzArDbGetFolderStreamPos(CArchiveDatabaseEx *db, UInt32 folderIndex, UInt32 indexInFolder); +CFileSize SzArDbGetFolderFullPackSize(CArchiveDatabaseEx *db, UInt32 folderIndex); + +typedef struct _ISzInStream +{ + #ifdef _LZMA_IN_CB + SZ_RESULT (*Read)( + void *object, /* pointer to ISzInStream itself */ + void **buffer, /* out: pointer to buffer with data */ + size_t maxRequiredSize, /* max required size to read */ + size_t *processedSize); /* real processed size. + processedSize can be less than maxRequiredSize. + If processedSize == 0, then there are no more + bytes in stream. */ + #else + SZ_RESULT (*Read)(void *object, void *buffer, size_t size, size_t *processedSize); + #endif + SZ_RESULT (*Seek)(void *object, CFileSize pos); +} ISzInStream; + + +int SzArchiveOpen( + ISzInStream *inStream, + CArchiveDatabaseEx *db, + ISzAlloc *allocMain, + ISzAlloc *allocTemp); + +#endif diff --git a/plugins/snes9x_gx/source/utils/sz/7zItem.c b/plugins/snes9x_gx/source/utils/sz/7zItem.c new file mode 100644 index 00000000..5f9a37f6 --- /dev/null +++ b/plugins/snes9x_gx/source/utils/sz/7zItem.c @@ -0,0 +1,133 @@ +/* 7zItem.c */ + +#include "7zItem.h" +#include "7zAlloc.h" + +void SzCoderInfoInit(CCoderInfo *coder) +{ + SzByteBufferInit(&coder->Properties); +} + +void SzCoderInfoFree(CCoderInfo *coder, void (*freeFunc)(void *p)) +{ + SzByteBufferFree(&coder->Properties, freeFunc); + SzCoderInfoInit(coder); +} + +void SzFolderInit(CFolder *folder) +{ + folder->NumCoders = 0; + folder->Coders = 0; + folder->NumBindPairs = 0; + folder->BindPairs = 0; + folder->NumPackStreams = 0; + folder->PackStreams = 0; + folder->UnPackSizes = 0; + folder->UnPackCRCDefined = 0; + folder->UnPackCRC = 0; + folder->NumUnPackStreams = 0; +} + +void SzFolderFree(CFolder *folder, void (*freeFunc)(void *p)) +{ + UInt32 i; + for (i = 0; i < folder->NumCoders; i++) + SzCoderInfoFree(&folder->Coders[i], freeFunc); + freeFunc(folder->Coders); + freeFunc(folder->BindPairs); + freeFunc(folder->PackStreams); + freeFunc(folder->UnPackSizes); + SzFolderInit(folder); +} + +UInt32 SzFolderGetNumOutStreams(CFolder *folder) +{ + UInt32 result = 0; + UInt32 i; + for (i = 0; i < folder->NumCoders; i++) + result += folder->Coders[i].NumOutStreams; + return result; +} + +int SzFolderFindBindPairForInStream(CFolder *folder, UInt32 inStreamIndex) +{ + UInt32 i; + for(i = 0; i < folder->NumBindPairs; i++) + if (folder->BindPairs[i].InIndex == inStreamIndex) + return i; + return -1; +} + + +int SzFolderFindBindPairForOutStream(CFolder *folder, UInt32 outStreamIndex) +{ + UInt32 i; + for(i = 0; i < folder->NumBindPairs; i++) + if (folder->BindPairs[i].OutIndex == outStreamIndex) + return i; + return -1; +} + +CFileSize SzFolderGetUnPackSize(CFolder *folder) +{ + int i = (int)SzFolderGetNumOutStreams(folder); + if (i == 0) + return 0; + for (i--; i >= 0; i--) + if (SzFolderFindBindPairForOutStream(folder, i) < 0) + return folder->UnPackSizes[i]; + /* throw 1; */ + return 0; +} + +/* +int FindPackStreamArrayIndex(int inStreamIndex) const +{ + for(int i = 0; i < PackStreams.Size(); i++) + if (PackStreams[i] == inStreamIndex) + return i; + return -1; +} +*/ + +void SzFileInit(CFileItem *fileItem) +{ + fileItem->IsFileCRCDefined = 0; + fileItem->HasStream = 1; + fileItem->IsDirectory = 0; + fileItem->IsAnti = 0; + fileItem->Name = 0; +} + +void SzFileFree(CFileItem *fileItem, void (*freeFunc)(void *p)) +{ + freeFunc(fileItem->Name); + SzFileInit(fileItem); +} + +void SzArchiveDatabaseInit(CArchiveDatabase *db) +{ + db->NumPackStreams = 0; + db->PackSizes = 0; + db->PackCRCsDefined = 0; + db->PackCRCs = 0; + db->NumFolders = 0; + db->Folders = 0; + db->NumFiles = 0; + db->Files = 0; +} + +void SzArchiveDatabaseFree(CArchiveDatabase *db, void (*freeFunc)(void *)) +{ + UInt32 i; + for (i = 0; i < db->NumFolders; i++) + SzFolderFree(&db->Folders[i], freeFunc); + for (i = 0; i < db->NumFiles; i++) + SzFileFree(&db->Files[i], freeFunc); + freeFunc(db->PackSizes); + freeFunc(db->PackCRCsDefined); + freeFunc(db->PackCRCs); + freeFunc(db->Folders); + freeFunc(db->Files); + SzArchiveDatabaseInit(db); +} diff --git a/plugins/snes9x_gx/source/utils/sz/7zItem.h b/plugins/snes9x_gx/source/utils/sz/7zItem.h new file mode 100644 index 00000000..e59b73f0 --- /dev/null +++ b/plugins/snes9x_gx/source/utils/sz/7zItem.h @@ -0,0 +1,90 @@ +/* 7zItem.h */ + +#ifndef __7Z_ITEM_H +#define __7Z_ITEM_H + +#include "7zMethodID.h" +#include "7zHeader.h" +#include "7zBuffer.h" + +typedef struct _CCoderInfo +{ + UInt32 NumInStreams; + UInt32 NumOutStreams; + CMethodID MethodID; + CSzByteBuffer Properties; +}CCoderInfo; + +void SzCoderInfoInit(CCoderInfo *coder); +void SzCoderInfoFree(CCoderInfo *coder, void (*freeFunc)(void *p)); + +typedef struct _CBindPair +{ + UInt32 InIndex; + UInt32 OutIndex; +}CBindPair; + +typedef struct _CFolder +{ + UInt32 NumCoders; + CCoderInfo *Coders; + UInt32 NumBindPairs; + CBindPair *BindPairs; + UInt32 NumPackStreams; + UInt32 *PackStreams; + CFileSize *UnPackSizes; + int UnPackCRCDefined; + UInt32 UnPackCRC; + + UInt32 NumUnPackStreams; +}CFolder; + +void SzFolderInit(CFolder *folder); +CFileSize SzFolderGetUnPackSize(CFolder *folder); +int SzFolderFindBindPairForInStream(CFolder *folder, UInt32 inStreamIndex); +UInt32 SzFolderGetNumOutStreams(CFolder *folder); +CFileSize SzFolderGetUnPackSize(CFolder *folder); + +/* #define CArchiveFileTime UInt64 */ + +typedef struct _CFileItem +{ + /* + CArchiveFileTime LastWriteTime; + CFileSize StartPos; + UInt32 Attributes; + */ + CFileSize Size; + UInt32 FileCRC; + char *Name; + + Byte IsFileCRCDefined; + Byte HasStream; + Byte IsDirectory; + Byte IsAnti; + /* + int AreAttributesDefined; + int IsLastWriteTimeDefined; + int IsStartPosDefined; + */ +}CFileItem; + +void SzFileInit(CFileItem *fileItem); + +typedef struct _CArchiveDatabase +{ + UInt32 NumPackStreams; + CFileSize *PackSizes; + Byte *PackCRCsDefined; + UInt32 *PackCRCs; + UInt32 NumFolders; + CFolder *Folders; + UInt32 NumFiles; + CFileItem *Files; +}CArchiveDatabase; + +void SzArchiveDatabaseInit(CArchiveDatabase *db); +void SzArchiveDatabaseFree(CArchiveDatabase *db, void (*freeFunc)(void *)); + + +#endif diff --git a/plugins/snes9x_gx/source/utils/sz/7zMethodID.c b/plugins/snes9x_gx/source/utils/sz/7zMethodID.c new file mode 100644 index 00000000..9daf39c2 --- /dev/null +++ b/plugins/snes9x_gx/source/utils/sz/7zMethodID.c @@ -0,0 +1,14 @@ +/* 7zMethodID.c */ + +#include "7zMethodID.h" + +int AreMethodsEqual(CMethodID *a1, CMethodID *a2) +{ + int i; + if (a1->IDSize != a2->IDSize) + return 0; + for (i = 0; i < a1->IDSize; i++) + if (a1->ID[i] != a2->ID[i]) + return 0; + return 1; +} diff --git a/plugins/snes9x_gx/source/utils/sz/7zMethodID.h b/plugins/snes9x_gx/source/utils/sz/7zMethodID.h new file mode 100644 index 00000000..4d886899 --- /dev/null +++ b/plugins/snes9x_gx/source/utils/sz/7zMethodID.h @@ -0,0 +1,18 @@ +/* 7zMethodID.h */ + +#ifndef __7Z_METHOD_ID_H +#define __7Z_METHOD_ID_H + +#include "7zTypes.h" + +#define kMethodIDSize 15 + +typedef struct _CMethodID +{ + Byte ID[kMethodIDSize]; + Byte IDSize; +} CMethodID; + +int AreMethodsEqual(CMethodID *a1, CMethodID *a2); + +#endif diff --git a/plugins/snes9x_gx/source/utils/sz/7zTypes.h b/plugins/snes9x_gx/source/utils/sz/7zTypes.h new file mode 100644 index 00000000..e6f25767 --- /dev/null +++ b/plugins/snes9x_gx/source/utils/sz/7zTypes.h @@ -0,0 +1,72 @@ +/* 7zTypes.h */ + +#ifndef __COMMON_TYPES_H +#define __COMMON_TYPES_H + +#ifndef _7ZIP_BYTE_DEFINED +#define _7ZIP_BYTE_DEFINED +#ifndef ZCONF_H +typedef unsigned char Byte; +#endif +#endif + +#ifndef _7ZIP_UINT16_DEFINED +#define _7ZIP_UINT16_DEFINED +typedef unsigned short UInt16; +#endif + +#ifndef _7ZIP_UINT32_DEFINED +#define _7ZIP_UINT32_DEFINED +#ifdef _LZMA_UINT32_IS_ULONG +typedef unsigned long UInt32; +#else +typedef unsigned int UInt32; +#endif +#endif + +/* #define _SZ_NO_INT_64 */ +/* define it your compiler doesn't support long long int */ + +#ifndef _7ZIP_UINT64_DEFINED +#define _7ZIP_UINT64_DEFINED +#ifdef _SZ_NO_INT_64 +typedef unsigned long UInt64; +#else +#ifdef _MSC_VER +typedef unsigned __int64 UInt64; +#else +typedef unsigned long long int UInt64; +#endif +#endif +#endif + + +/* #define _SZ_FILE_SIZE_64 */ +/* Use _SZ_FILE_SIZE_64 if you need support for files larger than 4 GB*/ + +#ifndef CFileSize +#ifdef _SZ_FILE_SIZE_64 +typedef UInt64 CFileSize; +#else +typedef UInt32 CFileSize; +#endif +#endif + +#define SZ_RESULT int + +#define SZ_OK (0) +#define SZE_DATA_ERROR (1) +#define SZE_OUTOFMEMORY (2) +#define SZE_CRC_ERROR (3) + +#define SZE_NOTIMPL (4) +#define SZE_FAIL (5) +#define SZE_FAILREAD (6) + +#define SZE_ARCHIVE_ERROR (7) + +#define SZE_OUTOFMEMORYDIC (8) + +#define RINOK(x) { int __result_ = (x); if(__result_ != 0) return __result_; } + +#endif diff --git a/plugins/snes9x_gx/source/utils/sz/LzmaDecode.c b/plugins/snes9x_gx/source/utils/sz/LzmaDecode.c new file mode 100644 index 00000000..71c62c47 --- /dev/null +++ b/plugins/snes9x_gx/source/utils/sz/LzmaDecode.c @@ -0,0 +1,584 @@ +/* + LzmaDecode.c + LZMA Decoder (optimized for Speed version) + + LZMA SDK 4.40 Copyright (c) 1999-2006 Igor Pavlov (2006-05-01) + http://www.7-zip.org/ + + LZMA SDK is licensed under two licenses: + 1) GNU Lesser General Public License (GNU LGPL) + 2) Common Public License (CPL) + It means that you can select one of these two licenses and + follow rules of that license. + + SPECIAL EXCEPTION: + Igor Pavlov, as the author of this Code, expressly permits you to + statically or dynamically link your Code (or bind by name) to the + interfaces of this file without subjecting your linked Code to the + terms of the CPL or GNU LGPL. Any modifications or additions + to this file, however, are subject to the LGPL or CPL terms. +*/ + +#include "LzmaDecode.h" + +#define kNumTopBits 24 +#define kTopValue ((UInt32)1 << kNumTopBits) + +#define kNumBitModelTotalBits 11 +#define kBitModelTotal (1 << kNumBitModelTotalBits) +#define kNumMoveBits 5 + +#define RC_READ_BYTE (*Buffer++) + +#define RC_INIT2 Code = 0; Range = 0xFFFFFFFF; \ + { int i; for(i = 0; i < 5; i++) { RC_TEST; Code = (Code << 8) | RC_READ_BYTE; }} + +#ifdef _LZMA_IN_CB + +#define RC_TEST { if (Buffer == BufferLim) \ + { SizeT size; int result = InCallback->Read(InCallback, &Buffer, &size); if (result != LZMA_RESULT_OK) return result; \ + BufferLim = Buffer + size; if (size == 0) return LZMA_RESULT_DATA_ERROR; }} + +#define RC_INIT Buffer = BufferLim = 0; RC_INIT2 + +#else + +#define RC_TEST { if (Buffer == BufferLim) return LZMA_RESULT_DATA_ERROR; } + +#define RC_INIT(buffer, bufferSize) Buffer = buffer; BufferLim = buffer + bufferSize; RC_INIT2 + +#endif + +#define RC_NORMALIZE if (Range < kTopValue) { RC_TEST; Range <<= 8; Code = (Code << 8) | RC_READ_BYTE; } + +#define IfBit0(p) RC_NORMALIZE; bound = (Range >> kNumBitModelTotalBits) * *(p); if (Code < bound) +#define UpdateBit0(p) Range = bound; *(p) += (kBitModelTotal - *(p)) >> kNumMoveBits; +#define UpdateBit1(p) Range -= bound; Code -= bound; *(p) -= (*(p)) >> kNumMoveBits; + +#define RC_GET_BIT2(p, mi, A0, A1) IfBit0(p) \ + { UpdateBit0(p); mi <<= 1; A0; } else \ + { UpdateBit1(p); mi = (mi + mi) + 1; A1; } + +#define RC_GET_BIT(p, mi) RC_GET_BIT2(p, mi, ; , ;) + +#define RangeDecoderBitTreeDecode(probs, numLevels, res) \ + { int i = numLevels; res = 1; \ + do { CProb *p = probs + res; RC_GET_BIT(p, res) } while(--i != 0); \ + res -= (1 << numLevels); } + + +#define kNumPosBitsMax 4 +#define kNumPosStatesMax (1 << kNumPosBitsMax) + +#define kLenNumLowBits 3 +#define kLenNumLowSymbols (1 << kLenNumLowBits) +#define kLenNumMidBits 3 +#define kLenNumMidSymbols (1 << kLenNumMidBits) +#define kLenNumHighBits 8 +#define kLenNumHighSymbols (1 << kLenNumHighBits) + +#define LenChoice 0 +#define LenChoice2 (LenChoice + 1) +#define LenLow (LenChoice2 + 1) +#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits)) +#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits)) +#define kNumLenProbs (LenHigh + kLenNumHighSymbols) + + +#define kNumStates 12 +#define kNumLitStates 7 + +#define kStartPosModelIndex 4 +#define kEndPosModelIndex 14 +#define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) + +#define kNumPosSlotBits 6 +#define kNumLenToPosStates 4 + +#define kNumAlignBits 4 +#define kAlignTableSize (1 << kNumAlignBits) + +#define kMatchMinLen 2 + +#define IsMatch 0 +#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax)) +#define IsRepG0 (IsRep + kNumStates) +#define IsRepG1 (IsRepG0 + kNumStates) +#define IsRepG2 (IsRepG1 + kNumStates) +#define IsRep0Long (IsRepG2 + kNumStates) +#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax)) +#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits)) +#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex) +#define LenCoder (Align + kAlignTableSize) +#define RepLenCoder (LenCoder + kNumLenProbs) +#define Literal (RepLenCoder + kNumLenProbs) + +#if Literal != LZMA_BASE_SIZE +StopCompilingDueBUG +#endif + +int LzmaDecodeProperties(CLzmaProperties *propsRes, const unsigned char *propsData, int size) +{ + unsigned char prop0; + if (size < LZMA_PROPERTIES_SIZE) + return LZMA_RESULT_DATA_ERROR; + prop0 = propsData[0]; + if (prop0 >= (9 * 5 * 5)) + return LZMA_RESULT_DATA_ERROR; + { + for (propsRes->pb = 0; prop0 >= (9 * 5); propsRes->pb++, prop0 -= (9 * 5)); + for (propsRes->lp = 0; prop0 >= 9; propsRes->lp++, prop0 -= 9); + propsRes->lc = prop0; + /* + unsigned char remainder = (unsigned char)(prop0 / 9); + propsRes->lc = prop0 % 9; + propsRes->pb = remainder / 5; + propsRes->lp = remainder % 5; + */ + } + + #ifdef _LZMA_OUT_READ + { + int i; + propsRes->DictionarySize = 0; + for (i = 0; i < 4; i++) + propsRes->DictionarySize += (UInt32)(propsData[1 + i]) << (i * 8); + if (propsRes->DictionarySize == 0) + propsRes->DictionarySize = 1; + } + #endif + return LZMA_RESULT_OK; +} + +#define kLzmaStreamWasFinishedId (-1) + +int LzmaDecode(CLzmaDecoderState *vs, + #ifdef _LZMA_IN_CB + ILzmaInCallback *InCallback, + #else + const unsigned char *inStream, SizeT inSize, SizeT *inSizeProcessed, + #endif + unsigned char *outStream, SizeT outSize, SizeT *outSizeProcessed) +{ + CProb *p = vs->Probs; + SizeT nowPos = 0; + Byte previousByte = 0; + UInt32 posStateMask = (1 << (vs->Properties.pb)) - 1; + UInt32 literalPosMask = (1 << (vs->Properties.lp)) - 1; + int lc = vs->Properties.lc; + + #ifdef _LZMA_OUT_READ + + UInt32 Range = vs->Range; + UInt32 Code = vs->Code; + #ifdef _LZMA_IN_CB + const Byte *Buffer = vs->Buffer; + const Byte *BufferLim = vs->BufferLim; + #else + const Byte *Buffer = inStream; + const Byte *BufferLim = inStream + inSize; + #endif + int state = vs->State; + UInt32 rep0 = vs->Reps[0], rep1 = vs->Reps[1], rep2 = vs->Reps[2], rep3 = vs->Reps[3]; + int len = vs->RemainLen; + UInt32 globalPos = vs->GlobalPos; + UInt32 distanceLimit = vs->DistanceLimit; + + Byte *dictionary = vs->Dictionary; + UInt32 dictionarySize = vs->Properties.DictionarySize; + UInt32 dictionaryPos = vs->DictionaryPos; + + Byte tempDictionary[4]; + + #ifndef _LZMA_IN_CB + *inSizeProcessed = 0; + #endif + *outSizeProcessed = 0; + if (len == kLzmaStreamWasFinishedId) + return LZMA_RESULT_OK; + + if (dictionarySize == 0) + { + dictionary = tempDictionary; + dictionarySize = 1; + tempDictionary[0] = vs->TempDictionary[0]; + } + + if (len == kLzmaNeedInitId) + { + { + UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + vs->Properties.lp)); + UInt32 i; + for (i = 0; i < numProbs; i++) + p[i] = kBitModelTotal >> 1; + rep0 = rep1 = rep2 = rep3 = 1; + state = 0; + globalPos = 0; + distanceLimit = 0; + dictionaryPos = 0; + dictionary[dictionarySize - 1] = 0; + #ifdef _LZMA_IN_CB + RC_INIT; + #else + RC_INIT(inStream, inSize); + #endif + } + len = 0; + } + while(len != 0 && nowPos < outSize) + { + UInt32 pos = dictionaryPos - rep0; + if (pos >= dictionarySize) + pos += dictionarySize; + outStream[nowPos++] = dictionary[dictionaryPos] = dictionary[pos]; + if (++dictionaryPos == dictionarySize) + dictionaryPos = 0; + len--; + } + if (dictionaryPos == 0) + previousByte = dictionary[dictionarySize - 1]; + else + previousByte = dictionary[dictionaryPos - 1]; + + #else /* if !_LZMA_OUT_READ */ + + int state = 0; + UInt32 rep0 = 1, rep1 = 1, rep2 = 1, rep3 = 1; + int len = 0; + const Byte *Buffer; + const Byte *BufferLim; + UInt32 Range; + UInt32 Code; + + #ifndef _LZMA_IN_CB + *inSizeProcessed = 0; + #endif + *outSizeProcessed = 0; + + { + UInt32 i; + UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + vs->Properties.lp)); + for (i = 0; i < numProbs; i++) + p[i] = kBitModelTotal >> 1; + } + + #ifdef _LZMA_IN_CB + RC_INIT; + #else + RC_INIT(inStream, inSize); + #endif + + #endif /* _LZMA_OUT_READ */ + + while(nowPos < outSize) + { + CProb *prob; + UInt32 bound; + int posState = (int)( + (nowPos + #ifdef _LZMA_OUT_READ + + globalPos + #endif + ) + & posStateMask); + + prob = p + IsMatch + (state << kNumPosBitsMax) + posState; + IfBit0(prob) + { + int symbol = 1; + UpdateBit0(prob) + prob = p + Literal + (LZMA_LIT_SIZE * + ((( + (nowPos + #ifdef _LZMA_OUT_READ + + globalPos + #endif + ) + & literalPosMask) << lc) + (previousByte >> (8 - lc)))); + + if (state >= kNumLitStates) + { + int matchByte; + #ifdef _LZMA_OUT_READ + UInt32 pos = dictionaryPos - rep0; + if (pos >= dictionarySize) + pos += dictionarySize; + matchByte = dictionary[pos]; + #else + matchByte = outStream[nowPos - rep0]; + #endif + do + { + int bit; + CProb *probLit; + matchByte <<= 1; + bit = (matchByte & 0x100); + probLit = prob + 0x100 + bit + symbol; + RC_GET_BIT2(probLit, symbol, if (bit != 0) break, if (bit == 0) break) + } + while (symbol < 0x100); + } + while (symbol < 0x100) + { + CProb *probLit = prob + symbol; + RC_GET_BIT(probLit, symbol) + } + previousByte = (Byte)symbol; + + outStream[nowPos++] = previousByte; + #ifdef _LZMA_OUT_READ + if (distanceLimit < dictionarySize) + distanceLimit++; + + dictionary[dictionaryPos] = previousByte; + if (++dictionaryPos == dictionarySize) + dictionaryPos = 0; + #endif + if (state < 4) state = 0; + else if (state < 10) state -= 3; + else state -= 6; + } + else + { + UpdateBit1(prob); + prob = p + IsRep + state; + IfBit0(prob) + { + UpdateBit0(prob); + rep3 = rep2; + rep2 = rep1; + rep1 = rep0; + state = state < kNumLitStates ? 0 : 3; + prob = p + LenCoder; + } + else + { + UpdateBit1(prob); + prob = p + IsRepG0 + state; + IfBit0(prob) + { + UpdateBit0(prob); + prob = p + IsRep0Long + (state << kNumPosBitsMax) + posState; + IfBit0(prob) + { + #ifdef _LZMA_OUT_READ + UInt32 pos; + #endif + UpdateBit0(prob); + + #ifdef _LZMA_OUT_READ + if (distanceLimit == 0) + #else + if (nowPos == 0) + #endif + return LZMA_RESULT_DATA_ERROR; + + state = state < kNumLitStates ? 9 : 11; + #ifdef _LZMA_OUT_READ + pos = dictionaryPos - rep0; + if (pos >= dictionarySize) + pos += dictionarySize; + previousByte = dictionary[pos]; + dictionary[dictionaryPos] = previousByte; + if (++dictionaryPos == dictionarySize) + dictionaryPos = 0; + #else + previousByte = outStream[nowPos - rep0]; + #endif + outStream[nowPos++] = previousByte; + #ifdef _LZMA_OUT_READ + if (distanceLimit < dictionarySize) + distanceLimit++; + #endif + + continue; + } + else + { + UpdateBit1(prob); + } + } + else + { + UInt32 distance; + UpdateBit1(prob); + prob = p + IsRepG1 + state; + IfBit0(prob) + { + UpdateBit0(prob); + distance = rep1; + } + else + { + UpdateBit1(prob); + prob = p + IsRepG2 + state; + IfBit0(prob) + { + UpdateBit0(prob); + distance = rep2; + } + else + { + UpdateBit1(prob); + distance = rep3; + rep3 = rep2; + } + rep2 = rep1; + } + rep1 = rep0; + rep0 = distance; + } + state = state < kNumLitStates ? 8 : 11; + prob = p + RepLenCoder; + } + { + int numBits, offset; + CProb *probLen = prob + LenChoice; + IfBit0(probLen) + { + UpdateBit0(probLen); + probLen = prob + LenLow + (posState << kLenNumLowBits); + offset = 0; + numBits = kLenNumLowBits; + } + else + { + UpdateBit1(probLen); + probLen = prob + LenChoice2; + IfBit0(probLen) + { + UpdateBit0(probLen); + probLen = prob + LenMid + (posState << kLenNumMidBits); + offset = kLenNumLowSymbols; + numBits = kLenNumMidBits; + } + else + { + UpdateBit1(probLen); + probLen = prob + LenHigh; + offset = kLenNumLowSymbols + kLenNumMidSymbols; + numBits = kLenNumHighBits; + } + } + RangeDecoderBitTreeDecode(probLen, numBits, len); + len += offset; + } + + if (state < 4) + { + int posSlot; + state += kNumLitStates; + prob = p + PosSlot + + ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << + kNumPosSlotBits); + RangeDecoderBitTreeDecode(prob, kNumPosSlotBits, posSlot); + if (posSlot >= kStartPosModelIndex) + { + int numDirectBits = ((posSlot >> 1) - 1); + rep0 = (2 | ((UInt32)posSlot & 1)); + if (posSlot < kEndPosModelIndex) + { + rep0 <<= numDirectBits; + prob = p + SpecPos + rep0 - posSlot - 1; + } + else + { + numDirectBits -= kNumAlignBits; + do + { + RC_NORMALIZE + Range >>= 1; + rep0 <<= 1; + if (Code >= Range) + { + Code -= Range; + rep0 |= 1; + } + } + while (--numDirectBits != 0); + prob = p + Align; + rep0 <<= kNumAlignBits; + numDirectBits = kNumAlignBits; + } + { + int i = 1; + int mi = 1; + do + { + CProb *prob3 = prob + mi; + RC_GET_BIT2(prob3, mi, ; , rep0 |= i); + i <<= 1; + } + while(--numDirectBits != 0); + } + } + else + rep0 = posSlot; + if (++rep0 == (UInt32)(0)) + { + /* it's for stream version */ + len = kLzmaStreamWasFinishedId; + break; + } + } + + len += kMatchMinLen; + #ifdef _LZMA_OUT_READ + if (rep0 > distanceLimit) + #else + if (rep0 > nowPos) + #endif + return LZMA_RESULT_DATA_ERROR; + + #ifdef _LZMA_OUT_READ + if (dictionarySize - distanceLimit > (UInt32)len) + distanceLimit += len; + else + distanceLimit = dictionarySize; + #endif + + do + { + #ifdef _LZMA_OUT_READ + UInt32 pos = dictionaryPos - rep0; + if (pos >= dictionarySize) + pos += dictionarySize; + previousByte = dictionary[pos]; + dictionary[dictionaryPos] = previousByte; + if (++dictionaryPos == dictionarySize) + dictionaryPos = 0; + #else + previousByte = outStream[nowPos - rep0]; + #endif + len--; + outStream[nowPos++] = previousByte; + } + while(len != 0 && nowPos < outSize); + } + } + RC_NORMALIZE; + + #ifdef _LZMA_OUT_READ + vs->Range = Range; + vs->Code = Code; + vs->DictionaryPos = dictionaryPos; + vs->GlobalPos = globalPos + (UInt32)nowPos; + vs->DistanceLimit = distanceLimit; + vs->Reps[0] = rep0; + vs->Reps[1] = rep1; + vs->Reps[2] = rep2; + vs->Reps[3] = rep3; + vs->State = state; + vs->RemainLen = len; + vs->TempDictionary[0] = tempDictionary[0]; + #endif + + #ifdef _LZMA_IN_CB + vs->Buffer = Buffer; + vs->BufferLim = BufferLim; + #else + *inSizeProcessed = (SizeT)(Buffer - inStream); + #endif + *outSizeProcessed = nowPos; + return LZMA_RESULT_OK; +} diff --git a/plugins/snes9x_gx/source/utils/sz/LzmaDecode.h b/plugins/snes9x_gx/source/utils/sz/LzmaDecode.h new file mode 100644 index 00000000..8382fa85 --- /dev/null +++ b/plugins/snes9x_gx/source/utils/sz/LzmaDecode.h @@ -0,0 +1,113 @@ +/* + LzmaDecode.h + LZMA Decoder interface + + LZMA SDK 4.40 Copyright (c) 1999-2006 Igor Pavlov (2006-05-01) + http://www.7-zip.org/ + + LZMA SDK is licensed under two licenses: + 1) GNU Lesser General Public License (GNU LGPL) + 2) Common Public License (CPL) + It means that you can select one of these two licenses and + follow rules of that license. + + SPECIAL EXCEPTION: + Igor Pavlov, as the author of this code, expressly permits you to + statically or dynamically link your code (or bind by name) to the + interfaces of this file without subjecting your linked code to the + terms of the CPL or GNU LGPL. Any modifications or additions + to this file, however, are subject to the LGPL or CPL terms. +*/ + +#ifndef __LZMADECODE_H +#define __LZMADECODE_H + +#include "LzmaTypes.h" + +/* #define _LZMA_IN_CB */ +/* Use callback for input data */ + +/* #define _LZMA_OUT_READ */ +/* Use read function for output data */ + +/* #define _LZMA_PROB32 */ +/* It can increase speed on some 32-bit CPUs, + but memory usage will be doubled in that case */ + +/* #define _LZMA_LOC_OPT */ +/* Enable local speed optimizations inside code */ + +#ifdef _LZMA_PROB32 +#define CProb UInt32 +#else +#define CProb UInt16 +#endif + +#define LZMA_RESULT_OK 0 +#define LZMA_RESULT_DATA_ERROR 1 + +#ifdef _LZMA_IN_CB +typedef struct _ILzmaInCallback +{ + int (*Read)(void *object, const unsigned char **buffer, SizeT *bufferSize); +} ILzmaInCallback; +#endif + +#define LZMA_BASE_SIZE 1846 +#define LZMA_LIT_SIZE 768 + +#define LZMA_PROPERTIES_SIZE 5 + +typedef struct _CLzmaProperties +{ + int lc; + int lp; + int pb; + #ifdef _LZMA_OUT_READ + UInt32 DictionarySize; + #endif +}CLzmaProperties; + +int LzmaDecodeProperties(CLzmaProperties *propsRes, const unsigned char *propsData, int size); + +#define LzmaGetNumProbs(Properties) (LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((Properties)->lc + (Properties)->lp))) + +#define kLzmaNeedInitId (-2) + +typedef struct _CLzmaDecoderState +{ + CLzmaProperties Properties; + CProb *Probs; + + #ifdef _LZMA_IN_CB + const unsigned char *Buffer; + const unsigned char *BufferLim; + #endif + + #ifdef _LZMA_OUT_READ + unsigned char *Dictionary; + UInt32 Range; + UInt32 Code; + UInt32 DictionaryPos; + UInt32 GlobalPos; + UInt32 DistanceLimit; + UInt32 Reps[4]; + int State; + int RemainLen; + unsigned char TempDictionary[4]; + #endif +} CLzmaDecoderState; + +#ifdef _LZMA_OUT_READ +#define LzmaDecoderInit(vs) { (vs)->RemainLen = kLzmaNeedInitId; } +#endif + +int LzmaDecode(CLzmaDecoderState *vs, + #ifdef _LZMA_IN_CB + ILzmaInCallback *inCallback, + #else + const unsigned char *inStream, SizeT inSize, SizeT *inSizeProcessed, + #endif + unsigned char *outStream, SizeT outSize, SizeT *outSizeProcessed); + +#endif diff --git a/plugins/snes9x_gx/source/utils/sz/LzmaTypes.h b/plugins/snes9x_gx/source/utils/sz/LzmaTypes.h new file mode 100644 index 00000000..4a1f7db4 --- /dev/null +++ b/plugins/snes9x_gx/source/utils/sz/LzmaTypes.h @@ -0,0 +1,45 @@ +/* +LzmaTypes.h + +Types for LZMA Decoder + +This file written and distributed to public domain by Igor Pavlov. +This file is part of LZMA SDK 4.40 (2006-05-01) +*/ + +#ifndef __LZMATYPES_H +#define __LZMATYPES_H + +#ifndef _7ZIP_BYTE_DEFINED +#define _7ZIP_BYTE_DEFINED +typedef unsigned char Byte; +#endif + +#ifndef _7ZIP_UINT16_DEFINED +#define _7ZIP_UINT16_DEFINED +typedef unsigned short UInt16; +#endif + +#ifndef _7ZIP_UINT32_DEFINED +#define _7ZIP_UINT32_DEFINED +#ifdef _LZMA_UINT32_IS_ULONG +typedef unsigned long UInt32; +#else +typedef unsigned int UInt32; +#endif +#endif + +/* #define _LZMA_SYSTEM_SIZE_T */ +/* Use system's size_t. You can use it to enable 64-bit sizes supporting */ + +#ifndef _7ZIP_SIZET_DEFINED +#define _7ZIP_SIZET_DEFINED +#ifdef _LZMA_SYSTEM_SIZE_T +#include <stddef.h> +typedef size_t SizeT; +#else +typedef UInt32 SizeT; +#endif +#endif + +#endif diff --git a/plugins/snes9x_gx/source/utils/unzip/crypt.h b/plugins/snes9x_gx/source/utils/unzip/crypt.h new file mode 100644 index 00000000..f14a628b --- /dev/null +++ b/plugins/snes9x_gx/source/utils/unzip/crypt.h @@ -0,0 +1,132 @@ +/* crypt.h -- base code for crypt/uncrypt ZIPfile + + + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant + + This code is a modified version of crypting code in Infozip distribution + + The encryption/decryption parts of this source code (as opposed to the + non-echoing password parts) were originally written in Europe. The + whole source package can be freely distributed, including from the USA. + (Prior to January 2000, re-export from the US was a violation of US law.) + + This encryption code is a direct transcription of the algorithm from + Roger Schlafly, described by Phil Katz in the file appnote.txt. This + file (appnote.txt) is distributed with the PKZIP program (even in the + version without encryption capabilities). + + If you don't need crypting in your application, just define symbols + NOCRYPT and NOUNCRYPT. + + This code support the "Traditional PKWARE Encryption". + + The new AES encryption added on Zip format by Winzip (see the page + http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong + Encryption is not supported. +*/ + +#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8)) + +/*********************************************************************** + * Return the next byte in the pseudo-random sequence + */ +static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab) +{ + unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an + * unpredictable manner on 16-bit systems; not a problem + * with any known compiler so far, though */ + + temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2; + return (int)(((temp * (temp ^ 1)) >> 8) & 0xff); +} + +/*********************************************************************** + * Update the encryption keys with the next byte of plain text + */ +static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c) +{ + (*(pkeys+0)) = CRC32((*(pkeys+0)), c); + (*(pkeys+1)) += (*(pkeys+0)) & 0xff; + (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1; + { + register int keyshift = (int)((*(pkeys+1)) >> 24); + (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift); + } + return c; +} + + +/*********************************************************************** + * Initialize the encryption keys and the random header according to + * the given password. + */ +static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab) +{ + *(pkeys+0) = 305419896L; + *(pkeys+1) = 591751049L; + *(pkeys+2) = 878082192L; + while (*passwd != '\0') { + update_keys(pkeys,pcrc_32_tab,(int)*passwd); + passwd++; + } +} + +#define zdecode(pkeys,pcrc_32_tab,c) \ + (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab))) + +#define zencode(pkeys,pcrc_32_tab,c,t) \ + (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c)) + +#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED + +#define RAND_HEAD_LEN 12 + /* "last resort" source for second part of crypt seed pattern */ +# ifndef ZCR_SEED2 +# define ZCR_SEED2 3141592654UL /* use PI as default pattern */ +# endif + +static int crypthead(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting) + const char *passwd; /* password string */ + unsigned char *buf; /* where to write header */ + int bufSize; + unsigned long* pkeys; + const unsigned long* pcrc_32_tab; + unsigned long crcForCrypting; +{ + int n; /* index in random header */ + int t; /* temporary */ + int c; /* random byte */ + unsigned char header[RAND_HEAD_LEN-2]; /* random header */ + static unsigned calls = 0; /* ensure different random header each time */ + + if (bufSize<RAND_HEAD_LEN) + return 0; + + /* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the + * output of rand() to get less predictability, since rand() is + * often poorly implemented. + */ + if (++calls == 1) + { + srand((unsigned)(time(NULL) ^ ZCR_SEED2)); + } + init_keys(passwd, pkeys, pcrc_32_tab); + for (n = 0; n < RAND_HEAD_LEN-2; n++) + { + c = (rand() >> 7) & 0xff; + header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t); + } + /* Encrypt random header (last two bytes is high word of crc) */ + init_keys(passwd, pkeys, pcrc_32_tab); + for (n = 0; n < RAND_HEAD_LEN-2; n++) + { + buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t); + } + buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t); + buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t); + return n; +} + +#endif diff --git a/plugins/snes9x_gx/source/utils/unzip/ioapi.c b/plugins/snes9x_gx/source/utils/unzip/ioapi.c new file mode 100644 index 00000000..7f20c182 --- /dev/null +++ b/plugins/snes9x_gx/source/utils/unzip/ioapi.c @@ -0,0 +1,177 @@ +/* ioapi.c -- IO base function header for compress/uncompress .zip + files using zlib + zip or unzip API + + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant +*/ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "zlib.h" +#include "ioapi.h" + + + +/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ + +#ifndef SEEK_CUR +#define SEEK_CUR 1 +#endif + +#ifndef SEEK_END +#define SEEK_END 2 +#endif + +#ifndef SEEK_SET +#define SEEK_SET 0 +#endif + +voidpf ZCALLBACK fopen_file_func OF(( + voidpf opaque, + const char* filename, + int mode)); + +uLong ZCALLBACK fread_file_func OF(( + voidpf opaque, + voidpf stream, + void* buf, + uLong size)); + +uLong ZCALLBACK fwrite_file_func OF(( + voidpf opaque, + voidpf stream, + const void* buf, + uLong size)); + +long ZCALLBACK ftell_file_func OF(( + voidpf opaque, + voidpf stream)); + +long ZCALLBACK fseek_file_func OF(( + voidpf opaque, + voidpf stream, + uLong offset, + int origin)); + +int ZCALLBACK fclose_file_func OF(( + voidpf opaque, + voidpf stream)); + +int ZCALLBACK ferror_file_func OF(( + voidpf opaque, + voidpf stream)); + + +voidpf ZCALLBACK fopen_file_func (opaque, filename, mode) + voidpf opaque; + const char* filename; + int mode; +{ + FILE* file = NULL; + const char* mode_fopen = NULL; + if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) + mode_fopen = "rb"; + else + if (mode & ZLIB_FILEFUNC_MODE_EXISTING) + mode_fopen = "r+b"; + else + if (mode & ZLIB_FILEFUNC_MODE_CREATE) + mode_fopen = "wb"; + + if ((filename!=NULL) && (mode_fopen != NULL)) + file = fopen(filename, mode_fopen); + return file; +} + + +uLong ZCALLBACK fread_file_func (opaque, stream, buf, size) + voidpf opaque; + voidpf stream; + void* buf; + uLong size; +{ + uLong ret; + ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream); + return ret; +} + + +uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size) + voidpf opaque; + voidpf stream; + const void* buf; + uLong size; +{ + uLong ret; + ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream); + return ret; +} + +long ZCALLBACK ftell_file_func (opaque, stream) + voidpf opaque; + voidpf stream; +{ + long ret; + ret = ftell((FILE *)stream); + return ret; +} + +long ZCALLBACK fseek_file_func (opaque, stream, offset, origin) + voidpf opaque; + voidpf stream; + uLong offset; + int origin; +{ + int fseek_origin=0; + long ret; + switch (origin) + { + case ZLIB_FILEFUNC_SEEK_CUR : + fseek_origin = SEEK_CUR; + break; + case ZLIB_FILEFUNC_SEEK_END : + fseek_origin = SEEK_END; + break; + case ZLIB_FILEFUNC_SEEK_SET : + fseek_origin = SEEK_SET; + break; + default: return -1; + } + ret = 0; + fseek((FILE *)stream, offset, fseek_origin); + return ret; +} + +int ZCALLBACK fclose_file_func (opaque, stream) + voidpf opaque; + voidpf stream; +{ + int ret; + ret = fclose((FILE *)stream); + return ret; +} + +int ZCALLBACK ferror_file_func (opaque, stream) + voidpf opaque; + voidpf stream; +{ + int ret; + ret = ferror((FILE *)stream); + return ret; +} + +void fill_fopen_filefunc (pzlib_filefunc_def) + zlib_filefunc_def* pzlib_filefunc_def; +{ + pzlib_filefunc_def->zopen_file = fopen_file_func; + pzlib_filefunc_def->zread_file = fread_file_func; + pzlib_filefunc_def->zwrite_file = fwrite_file_func; + pzlib_filefunc_def->ztell_file = ftell_file_func; + pzlib_filefunc_def->zseek_file = fseek_file_func; + pzlib_filefunc_def->zclose_file = fclose_file_func; + pzlib_filefunc_def->zerror_file = ferror_file_func; + pzlib_filefunc_def->opaque = NULL; +} diff --git a/plugins/snes9x_gx/source/utils/unzip/ioapi.h b/plugins/snes9x_gx/source/utils/unzip/ioapi.h new file mode 100644 index 00000000..e73a3b2b --- /dev/null +++ b/plugins/snes9x_gx/source/utils/unzip/ioapi.h @@ -0,0 +1,75 @@ +/* ioapi.h -- IO base function header for compress/uncompress .zip + files using zlib + zip or unzip API + + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant +*/ + +#ifndef _ZLIBIOAPI_H +#define _ZLIBIOAPI_H + + +#define ZLIB_FILEFUNC_SEEK_CUR (1) +#define ZLIB_FILEFUNC_SEEK_END (2) +#define ZLIB_FILEFUNC_SEEK_SET (0) + +#define ZLIB_FILEFUNC_MODE_READ (1) +#define ZLIB_FILEFUNC_MODE_WRITE (2) +#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3) + +#define ZLIB_FILEFUNC_MODE_EXISTING (4) +#define ZLIB_FILEFUNC_MODE_CREATE (8) + + +#ifndef ZCALLBACK + +#if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) +#define ZCALLBACK CALLBACK +#else +#define ZCALLBACK +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode)); +typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size)); +typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); +typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream)); +typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); +typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream)); +typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); + +typedef struct zlib_filefunc_def_s +{ + open_file_func zopen_file; + read_file_func zread_file; + write_file_func zwrite_file; + tell_file_func ztell_file; + seek_file_func zseek_file; + close_file_func zclose_file; + testerror_file_func zerror_file; + voidpf opaque; +} zlib_filefunc_def; + + + +void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); + +#define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size)) +#define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size)) +#define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream)) +#define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode)) +#define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream)) +#define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream)) + + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/plugins/snes9x_gx/source/utils/unzip/miniunz.cpp b/plugins/snes9x_gx/source/utils/unzip/miniunz.cpp new file mode 100644 index 00000000..945c970c --- /dev/null +++ b/plugins/snes9x_gx/source/utils/unzip/miniunz.cpp @@ -0,0 +1,324 @@ +/* + miniunz.c + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant +*/ + + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> +#include <errno.h> +#include <fcntl.h> +#include <unistd.h> +#include <utime.h> + +#include "unzip.h" +#include "menu.h" + +#define CASESENSITIVITY (0) +#define WRITEBUFFERSIZE (1024*256) +#define MAXFILENAME (256) + +// used to display unzip progress +static uLong total_size; +static uLong total_unzipped; + +static int mymkdir(const char* dirname) +{ + int ret=0; + ret = mkdir (dirname,0775); + return ret; +} + +int makedir (char *newdir) +{ + char *buffer ; + char *p; + int len = (int)strlen(newdir); + + if (len <= 0) + return 0; + + buffer = (char*)malloc(len+1); + strcpy(buffer,newdir); + + if (buffer[len-1] == '/') { + buffer[len-1] = '\0'; + } + if (mymkdir(buffer) == 0) + { + free(buffer); + return 1; + } + + p = buffer+1; + while (1) + { + char hold; + + while(*p && *p != '\\' && *p != '/') + p++; + hold = *p; + *p = 0; + if ((mymkdir(buffer) == -1) && (errno == ENOENT)) + { + //printf("couldn't create directory %s\n",buffer); + free(buffer); + return 0; + } + if (hold == 0) + break; + *p++ = hold; + } + free(buffer); + return 1; +} + +static int do_extract_currentfile(unzFile uf,const int* popt_extract_without_path,int* popt_overwrite,const char* password) +{ + char filename_inzip[256]; + char* filename_withoutpath; + char* p; + int err=UNZ_OK; + FILE *fout=NULL; + void* buf; + uInt size_buf; + + unz_file_info file_info; + err = unzGetCurrentFileInfo(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0); + + if (err!=UNZ_OK) + { + //printf("error %d with zipfile in unzGetCurrentFileInfo\n",err); + return err; + } + + size_buf = WRITEBUFFERSIZE; + buf = (void*)malloc(size_buf); + if (buf==NULL) + { + //printf("Error allocating memory\n"); + return UNZ_INTERNALERROR; + } + + p = filename_withoutpath = filename_inzip; + while ((*p) != '\0') + { + if (((*p)=='/') || ((*p)=='\\')) + filename_withoutpath = p+1; + p++; + } + + if ((*filename_withoutpath)=='\0') + { + if ((*popt_extract_without_path)==0) + { + //printf("creating directory: %s\n",filename_inzip); + mymkdir(filename_inzip); + } + } + else + { + char* write_filename; + int skip=0; + + if ((*popt_extract_without_path)==0) + write_filename = filename_inzip; + else + write_filename = filename_withoutpath; + + err = unzOpenCurrentFilePassword(uf,password); + if (err!=UNZ_OK) + { + //printf("error %d with zipfile in unzOpenCurrentFilePassword\n",err); + } + + if (((*popt_overwrite)==0) && (err==UNZ_OK)) + { + char rep=0; + FILE* ftestexist; + ftestexist = fopen(write_filename,"rb"); + if (ftestexist!=NULL) + { + fclose(ftestexist); + do + { + char answer[128]; + int ret; + + printf("The file %s exists. Overwrite ? [y]es, [n]o, [A]ll: ",write_filename); + ret = scanf("%1s",answer); + if (ret != 1) + { + exit(EXIT_FAILURE); + } + rep = answer[0] ; + if ((rep>='a') && (rep<='z')) + rep -= 0x20; + } + while ((rep!='Y') && (rep!='N') && (rep!='A')); + } + + if (rep == 'N') + skip = 1; + + if (rep == 'A') + *popt_overwrite=1; + } + + if ((skip==0) && (err==UNZ_OK)) + { + fout=fopen(write_filename,"wb"); + + /* some zipfile don't contain directory alone before file */ + if ((fout==NULL) && ((*popt_extract_without_path)==0) && + (filename_withoutpath!=(char*)filename_inzip)) + { + char c=*(filename_withoutpath-1); + *(filename_withoutpath-1)='\0'; + makedir(write_filename); + *(filename_withoutpath-1)=c; + fout=fopen(write_filename,"wb"); + } + + if (fout==NULL) + { + //printf("error opening %s\n",write_filename); + } + } + + if (fout!=NULL) + { + //printf(" extracting: %s\n",write_filename); + + do + { + err = unzReadCurrentFile(uf,buf,size_buf); + if (err<0) + { + //printf("error %d with zipfile in unzReadCurrentFile\n",err); + break; + } + if (err>0) + if (fwrite(buf,err,1,fout)!=1) + { + //printf("error in writing extracted file\n"); + err=UNZ_ERRNO; + break; + } + total_unzipped += size_buf; + // show progress + ShowProgress("Unzipping...", total_unzipped, total_size); + } + while (err>0); + if (fout) + fclose(fout); + + } + + if (err==UNZ_OK) + { + err = unzCloseCurrentFile (uf); + if (err!=UNZ_OK) + { + //printf("error %d with zipfile in unzCloseCurrentFile\n",err); + } + } + else + unzCloseCurrentFile(uf); /* don't lose the error */ + } + + free(buf); + return err; +} + +static uLong zipSize(unzFile uf) +{ + uLong i; + unz_global_info gi; + int err; + + uLong total = 0; + + unz_file_info file_info; + char filename_inzip[256]; + + err = unzGetGlobalInfo (uf,&gi); + + for (i=0;i<gi.number_entry;i++) + { + err = unzGetCurrentFileInfo(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0); + + if (err!=UNZ_OK) + return err; + + total += file_info.uncompressed_size; + + if ((i+1)<gi.number_entry) + { + err = unzGoToNextFile(uf); + if (err!=UNZ_OK) + return err; + } + } + + err = unzGoToFirstFile(uf); + if (err!=UNZ_OK) + return err; + + return total; +} + +int extractZip(unzFile uf,int opt_extract_without_path,int opt_overwrite,const char* password) +{ + uLong i; + unz_global_info gi; + int err; + + total_size = zipSize(uf); + total_unzipped = 0; + ShowProgress("Unzipping...", total_unzipped, total_size); + + err = unzGetGlobalInfo (uf,&gi); + //if (err!=UNZ_OK) + // printf("error %d with zipfile in unzGetGlobalInfo \n",err); + + for (i=0;i<gi.number_entry;i++) + { + if (do_extract_currentfile(uf,&opt_extract_without_path, + &opt_overwrite, + password) != UNZ_OK) + break; + + if ((i+1)<gi.number_entry) + { + err = unzGoToNextFile(uf); + if (err!=UNZ_OK) + { + //printf("error %d with zipfile in unzGoToNextFile\n",err); + break; + } + } + } + CancelAction(); + return 0; +} + +int extractZipOnefile(unzFile uf,const char* filename,int opt_extract_without_path,int opt_overwrite,const char* password) +{ + if (unzLocateFile(uf,filename,CASESENSITIVITY)!=UNZ_OK) + { + //printf("file %s not found in the zipfile\n",filename); + return 2; + } + + if (do_extract_currentfile(uf,&opt_extract_without_path, + &opt_overwrite, + password) == UNZ_OK) + return 0; + else + return 1; +} diff --git a/plugins/snes9x_gx/source/utils/unzip/miniunz.h b/plugins/snes9x_gx/source/utils/unzip/miniunz.h new file mode 100644 index 00000000..751fd842 --- /dev/null +++ b/plugins/snes9x_gx/source/utils/unzip/miniunz.h @@ -0,0 +1,9 @@ + +#ifndef _miniunz_H +#define _miniunz_H + +int extractZip(unzFile uf,int opt_extract_without_path,int opt_overwrite,const char* password); +int extractZipOnefile(unzFile uf,const char* filename,int opt_extract_without_path,int opt_overwrite,const char* password); +int makedir(char *newdir); + +#endif diff --git a/plugins/snes9x_gx/source/utils/unzip/unzip.c b/plugins/snes9x_gx/source/utils/unzip/unzip.c new file mode 100644 index 00000000..eda77d51 --- /dev/null +++ b/plugins/snes9x_gx/source/utils/unzip/unzip.c @@ -0,0 +1,1598 @@ +/* unzip.c -- IO for uncompress .zip files using zlib + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant + + Read unzip.h for more info +*/ + +/* Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of +compatibility with older software. The following is from the original crypt.c. Code +woven in by Terry Thorsen 1/2003. +*/ +/* + Copyright (c) 1990-2000 Info-ZIP. All rights reserved. + + See the accompanying file LICENSE, version 2000-Apr-09 or later + (the contents of which are also included in zip.h) for terms of use. + If, for some reason, all these files are missing, the Info-ZIP license + also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html +*/ +/* + crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h] + + The encryption/decryption parts of this source code (as opposed to the + non-echoing password parts) were originally written in Europe. The + whole source package can be freely distributed, including from the USA. + (Prior to January 2000, re-export from the US was a violation of US law.) + */ + +/* + This encryption code is a direct transcription of the algorithm from + Roger Schlafly, described by Phil Katz in the file appnote.txt. This + file (appnote.txt) is distributed with the PKZIP program (even in the + version without encryption capabilities). + */ + + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "zlib.h" +#include "unzip.h" + +#ifdef STDC +# include <stddef.h> +# include <string.h> +# include <stdlib.h> +#endif +#ifdef NO_ERRNO_H + extern int errno; +#else +# include <errno.h> +#endif + + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + + +#ifndef CASESENSITIVITYDEFAULT_NO +# if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) +# define CASESENSITIVITYDEFAULT_NO +# endif +#endif + + +#ifndef UNZ_BUFSIZE +#define UNZ_BUFSIZE (1024*256) +#endif + +#ifndef UNZ_MAXFILENAMEINZIP +#define UNZ_MAXFILENAMEINZIP (256) +#endif + +#ifndef ALLOC +# define ALLOC(size) (malloc(size)) +#endif +#ifndef TRYFREE +# define TRYFREE(p) {if (p) free(p);} +#endif + +#define SIZECENTRALDIRITEM (0x2e) +#define SIZEZIPLOCALHEADER (0x1e) + +/* unz_file_info_interntal contain internal info about a file in zipfile*/ +typedef struct unz_file_info_internal_s +{ + uLong offset_curfile;/* relative offset of local header 4 bytes */ +} unz_file_info_internal; + + +/* file_in_zip_read_info_s contain internal information about a file in zipfile, + when reading and decompress it */ +typedef struct +{ + char *read_buffer; /* internal buffer for compressed data */ + z_stream stream; /* zLib stream structure for inflate */ + + uLong pos_in_zipfile; /* position in byte on the zipfile, for fseek*/ + uLong stream_initialised; /* flag set if stream structure is initialised*/ + + uLong offset_local_extrafield;/* offset of the local extra field */ + uInt size_local_extrafield;/* size of the local extra field */ + uLong pos_local_extrafield; /* position in the local extra field in read*/ + + uLong crc32; /* crc32 of all data uncompressed */ + uLong crc32_wait; /* crc32 we must obtain after decompress all */ + uLong rest_read_compressed; /* number of byte to be decompressed */ + uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/ + zlib_filefunc_def z_filefunc; + voidpf filestream; /* io structore of the zipfile */ + uLong compression_method; /* compression method (0==store) */ + uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + int raw; +} file_in_zip_read_info_s; + + +/* unz_s contain internal information about the zipfile +*/ +typedef struct +{ + zlib_filefunc_def z_filefunc; + voidpf filestream; /* io structore of the zipfile */ + unz_global_info gi; /* public global information */ + uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + uLong num_file; /* number of the current file in the zipfile*/ + uLong pos_in_central_dir; /* pos of the current file in the central dir*/ + uLong current_file_ok; /* flag about the usability of the current file*/ + uLong central_pos; /* position of the beginning of the central dir*/ + + uLong size_central_dir; /* size of the central directory */ + uLong offset_central_dir; /* offset of start of central directory with + respect to the starting disk number */ + + unz_file_info cur_file_info; /* public info about the current file in zip*/ + unz_file_info_internal cur_file_info_internal; /* private info about it*/ + file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current + file if we are decompressing it */ + int encrypted; +# ifndef NOUNCRYPT + unsigned long keys[3]; /* keys defining the pseudo-random sequence */ + const unsigned long* pcrc_32_tab; +# endif +} unz_s; + + +#ifndef NOUNCRYPT +#include "crypt.h" +#endif + +/* =========================================================================== + Read a byte from a gz_stream; update next_in and avail_in. Return EOF + for end of file. + IN assertion: the stream s has been sucessfully opened for reading. +*/ + + +local int unzlocal_getByte OF(( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream, + int *pi)); + +local int unzlocal_getByte(pzlib_filefunc_def,filestream,pi) + const zlib_filefunc_def* pzlib_filefunc_def; + voidpf filestream; + int *pi; +{ + unsigned char c; + int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1); + if (err==1) + { + *pi = (int)c; + return UNZ_OK; + } + else + { + if (ZERROR(*pzlib_filefunc_def,filestream)) + return UNZ_ERRNO; + else + return UNZ_EOF; + } +} + + +/* =========================================================================== + Reads a long in LSB order from the given gz_stream. Sets +*/ +local int unzlocal_getShort OF(( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX)); + +local int unzlocal_getShort (pzlib_filefunc_def,filestream,pX) + const zlib_filefunc_def* pzlib_filefunc_def; + voidpf filestream; + uLong *pX; +{ + uLong x ; + int i = 0; + int err; + + err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==UNZ_OK) + err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<8; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int unzlocal_getLong OF(( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX)); + +local int unzlocal_getLong (pzlib_filefunc_def,filestream,pX) + const zlib_filefunc_def* pzlib_filefunc_def; + voidpf filestream; + uLong *pX; +{ + uLong x ; + int i = 0; + int err; + + err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==UNZ_OK) + err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<8; + + if (err==UNZ_OK) + err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<16; + + if (err==UNZ_OK) + err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<24; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + + +/* My own strcmpi / strcasecmp */ +local int strcmpcasenosensitive_internal (fileName1,fileName2) + const char* fileName1; + const char* fileName2; +{ + for (;;) + { + char c1=*(fileName1++); + char c2=*(fileName2++); + if ((c1>='a') && (c1<='z')) + c1 -= 0x20; + if ((c2>='a') && (c2<='z')) + c2 -= 0x20; + if (c1=='\0') + return ((c2=='\0') ? 0 : -1); + if (c2=='\0') + return 1; + if (c1<c2) + return -1; + if (c1>c2) + return 1; + } +} + + +#ifdef CASESENSITIVITYDEFAULT_NO +#define CASESENSITIVITYDEFAULTVALUE 2 +#else +#define CASESENSITIVITYDEFAULTVALUE 1 +#endif + +#ifndef STRCMPCASENOSENTIVEFUNCTION +#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal +#endif + +/* + Compare two filename (fileName1,fileName2). + If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + or strcasecmp) + If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + (like 1 on Unix, 2 on Windows) + +*/ +extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivity) + const char* fileName1; + const char* fileName2; + int iCaseSensitivity; +{ + if (iCaseSensitivity==0) + iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; + + if (iCaseSensitivity==1) + return strcmp(fileName1,fileName2); + + return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); +} + +#ifndef BUFREADCOMMENT +#define BUFREADCOMMENT (0x400) +#endif + +/* + Locate the Central directory of a zipfile (at the end, just before + the global comment) +*/ +local uLong unzlocal_SearchCentralDir OF(( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream)); + +local uLong unzlocal_SearchCentralDir(pzlib_filefunc_def,filestream) + const zlib_filefunc_def* pzlib_filefunc_def; + voidpf filestream; +{ + unsigned char* buf; + uLong uSizeFile; + uLong uBackRead; + uLong uMaxBack=0xffff; /* maximum size of global comment */ + uLong uPosFound=0; + + if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + + uSizeFile = ZTELL(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackRead<uMaxBack) + { + uLong uReadSize,uReadPos ; + int i; + if (uBackRead+BUFREADCOMMENT>uMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uSizeFile-uReadPos); + if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && + ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) + { + uPosFound = uReadPos+i; + break; + } + + if (uPosFound!=0) + break; + } + TRYFREE(buf); + return uPosFound; +} + +/* + Open a Zip file. path contain the full pathname (by example, + on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer + "zlib/zlib114.zip". + If the zipfile cannot be opened (file doesn't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. +*/ +extern unzFile ZEXPORT unzOpen2 (path, pzlib_filefunc_def) + const char *path; + zlib_filefunc_def* pzlib_filefunc_def; +{ + unz_s us; + unz_s *s; + uLong central_pos,uL; + + uLong number_disk; /* number of the current dist, used for + spaning ZIP, unsupported, always 0*/ + uLong number_disk_with_CD; /* number the the disk with central dir, used + for spaning ZIP, unsupported, always 0*/ + uLong number_entry_CD; /* total number of entries in + the central dir + (same than number_entry on nospan) */ + + int err=UNZ_OK; + + if (pzlib_filefunc_def==NULL) + fill_fopen_filefunc(&us.z_filefunc); + else + us.z_filefunc = *pzlib_filefunc_def; + + us.filestream= (*(us.z_filefunc.zopen_file))(us.z_filefunc.opaque, + path, + ZLIB_FILEFUNC_MODE_READ | + ZLIB_FILEFUNC_MODE_EXISTING); + if (us.filestream==NULL) + return NULL; + + central_pos = unzlocal_SearchCentralDir(&us.z_filefunc,us.filestream); + if (central_pos==0) + err=UNZ_ERRNO; + + if (ZSEEK(us.z_filefunc, us.filestream, + central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; + + /* the signature, already checked */ + if (unzlocal_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of this disk */ + if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of the disk with the start of the central directory */ + if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central dir on this disk */ + if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central dir */ + if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + if ((number_entry_CD!=us.gi.number_entry) || + (number_disk_with_CD!=0) || + (number_disk!=0)) + err=UNZ_BADZIPFILE; + + /* size of the central directory */ + if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK) + err=UNZ_ERRNO; + + /* offset of start of central directory with respect to the + starting disk number */ + if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK) + err=UNZ_ERRNO; + + /* zipfile comment length */ + if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK) + err=UNZ_ERRNO; + + if ((central_pos<us.offset_central_dir+us.size_central_dir) && + (err==UNZ_OK)) + err=UNZ_BADZIPFILE; + + if (err!=UNZ_OK) + { + ZCLOSE(us.z_filefunc, us.filestream); + return NULL; + } + + us.byte_before_the_zipfile = central_pos - + (us.offset_central_dir+us.size_central_dir); + us.central_pos = central_pos; + us.pfile_in_zip_read = NULL; + us.encrypted = 0; + + + s=(unz_s*)ALLOC(sizeof(unz_s)); + *s=us; + unzGoToFirstFile((unzFile)s); + return (unzFile)s; +} + + +extern unzFile ZEXPORT unzOpen (path) + const char *path; +{ + return unzOpen2(path, NULL); +} + +/* + Close a ZipFile opened with unzipOpen. + If there is files inside the .Zip opened with unzipOpenCurrentFile (see later), + these files MUST be closed with unzipCloseCurrentFile before call unzipClose. + return UNZ_OK if there is no problem. */ +extern int ZEXPORT unzClose (file) + unzFile file; +{ + unz_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + + if (s->pfile_in_zip_read!=NULL) + unzCloseCurrentFile(file); + + ZCLOSE(s->z_filefunc, s->filestream); + TRYFREE(s); + return UNZ_OK; +} + + +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. */ +extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info) + unzFile file; + unz_global_info *pglobal_info; +{ + unz_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + *pglobal_info=s->gi; + return UNZ_OK; +} + + +/* + Translate date/time from Dos format to tm_unz (readable more easilty) +*/ +local void unzlocal_DosDateToTmuDate (ulDosDate, ptm) + uLong ulDosDate; + tm_unz* ptm; +{ + uLong uDate; + uDate = (uLong)(ulDosDate>>16); + ptm->tm_mday = (uInt)(uDate&0x1f) ; + ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; + ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; + + ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); + ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; + ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; +} + +/* + Get Info about the current file in the zipfile, with internal only info +*/ +local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file, + unz_file_info *pfile_info, + unz_file_info_internal + *pfile_info_internal, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); + +local int unzlocal_GetCurrentFileInfoInternal (file, + pfile_info, + pfile_info_internal, + szFileName, fileNameBufferSize, + extraField, extraFieldBufferSize, + szComment, commentBufferSize) + unzFile file; + unz_file_info *pfile_info; + unz_file_info_internal *pfile_info_internal; + char *szFileName; + uLong fileNameBufferSize; + void *extraField; + uLong extraFieldBufferSize; + char *szComment; + uLong commentBufferSize; +{ + unz_s* s; + unz_file_info file_info; + unz_file_info_internal file_info_internal; + int err=UNZ_OK; + uLong uMagic; + long lSeek=0; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + if (ZSEEK(s->z_filefunc, s->filestream, + s->pos_in_central_dir+s->byte_before_the_zipfile, + ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; + + + /* we check the magic */ + if (err==UNZ_OK) + { + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) + err=UNZ_ERRNO; + else if (uMagic!=0x02014b50) + err=UNZ_BADZIPFILE; + } + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK) + err=UNZ_ERRNO; + + unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date); + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK) + err=UNZ_ERRNO; + + lSeek+=file_info.size_filename; + if ((err==UNZ_OK) && (szFileName!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_filename<fileNameBufferSize) + { + *(szFileName+file_info.size_filename)='\0'; + uSizeRead = file_info.size_filename; + } + else + uSizeRead = fileNameBufferSize; + + if ((file_info.size_filename>0) && (fileNameBufferSize>0)) + if (ZREAD(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + lSeek -= uSizeRead; + } + + + if ((err==UNZ_OK) && (extraField!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_file_extra<extraFieldBufferSize) + uSizeRead = file_info.size_file_extra; + else + uSizeRead = extraFieldBufferSize; + + if (lSeek!=0) + { + if (ZSEEK(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + } + + if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) + if (ZREAD(s->z_filefunc, s->filestream,extraField,uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + lSeek += file_info.size_file_extra - uSizeRead; + } + else + lSeek+=file_info.size_file_extra; + + + if ((err==UNZ_OK) && (szComment!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_file_comment<commentBufferSize) + { + *(szComment+file_info.size_file_comment)='\0'; + uSizeRead = file_info.size_file_comment; + } + else + uSizeRead = commentBufferSize; + + if (lSeek!=0) + { + if (ZSEEK(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + } + + if ((file_info.size_file_comment>0) && (commentBufferSize>0)) + if (ZREAD(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + lSeek+=file_info.size_file_comment - uSizeRead; + } + else + lSeek+=file_info.size_file_comment; + + if ((err==UNZ_OK) && (pfile_info!=NULL)) + *pfile_info=file_info; + + if ((err==UNZ_OK) && (pfile_info_internal!=NULL)) + *pfile_info_internal=file_info_internal; + + return err; +} + + + +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. +*/ +extern int ZEXPORT unzGetCurrentFileInfo (file, + pfile_info, + szFileName, fileNameBufferSize, + extraField, extraFieldBufferSize, + szComment, commentBufferSize) + unzFile file; + unz_file_info *pfile_info; + char *szFileName; + uLong fileNameBufferSize; + void *extraField; + uLong extraFieldBufferSize; + char *szComment; + uLong commentBufferSize; +{ + return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL, + szFileName,fileNameBufferSize, + extraField,extraFieldBufferSize, + szComment,commentBufferSize); +} + +/* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem +*/ +extern int ZEXPORT unzGoToFirstFile (file) + unzFile file; +{ + int err=UNZ_OK; + unz_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + s->pos_in_central_dir=s->offset_central_dir; + s->num_file=0; + err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + +/* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. +*/ +extern int ZEXPORT unzGoToNextFile (file) + unzFile file; +{ + unz_s* s; + int err; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */ + if (s->num_file+1==s->gi.number_entry) + return UNZ_END_OF_LIST_OF_FILE; + + s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + + s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; + s->num_file++; + err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + + +/* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzipStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found +*/ +extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity) + unzFile file; + const char *szFileName; + int iCaseSensitivity; +{ + unz_s* s; + int err; + + /* We remember the 'current' position in the file so that we can jump + * back there if we fail. + */ + unz_file_info cur_file_infoSaved; + unz_file_info_internal cur_file_info_internalSaved; + uLong num_fileSaved; + uLong pos_in_central_dirSaved; + + + if (file==NULL) + return UNZ_PARAMERROR; + + if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP) + return UNZ_PARAMERROR; + + s=(unz_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + + /* Save the current state */ + num_fileSaved = s->num_file; + pos_in_central_dirSaved = s->pos_in_central_dir; + cur_file_infoSaved = s->cur_file_info; + cur_file_info_internalSaved = s->cur_file_info_internal; + + err = unzGoToFirstFile(file); + + while (err == UNZ_OK) + { + char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; + err = unzGetCurrentFileInfo(file,NULL, + szCurrentFileName,sizeof(szCurrentFileName)-1, + NULL,0,NULL,0); + if (err == UNZ_OK) + { + if (unzStringFileNameCompare(szCurrentFileName, + szFileName,iCaseSensitivity)==0) + return UNZ_OK; + err = unzGoToNextFile(file); + } + } + + /* We failed, so restore the state of the 'current file' to where we + * were. + */ + s->num_file = num_fileSaved ; + s->pos_in_central_dir = pos_in_central_dirSaved ; + s->cur_file_info = cur_file_infoSaved; + s->cur_file_info_internal = cur_file_info_internalSaved; + return err; +} + + +/* +/////////////////////////////////////////// +// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net) +// I need random access +// +// Further optimization could be realized by adding an ability +// to cache the directory in memory. The goal being a single +// comprehensive file read to put the file I need in a memory. +*/ + +/* +typedef struct unz_file_pos_s +{ + uLong pos_in_zip_directory; // offset in file + uLong num_of_file; // # of file +} unz_file_pos; +*/ + +extern int ZEXPORT unzGetFilePos(file, file_pos) + unzFile file; + unz_file_pos* file_pos; +{ + unz_s* s; + + if (file==NULL || file_pos==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + + file_pos->pos_in_zip_directory = s->pos_in_central_dir; + file_pos->num_of_file = s->num_file; + + return UNZ_OK; +} + +extern int ZEXPORT unzGoToFilePos(file, file_pos) + unzFile file; + unz_file_pos* file_pos; +{ + unz_s* s; + int err; + + if (file==NULL || file_pos==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + + /* jump to the right spot */ + s->pos_in_central_dir = file_pos->pos_in_zip_directory; + s->num_file = file_pos->num_of_file; + + /* set the current file */ + err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + /* return results */ + s->current_file_ok = (err == UNZ_OK); + return err; +} + +/* +// Unzip Helper Functions - should be here? +/////////////////////////////////////////// +*/ + +/* + Read the local header of the current zipfile + Check the coherency of the local header and info in the end of central + directory about this file + store in *piSizeVar the size of extra info in local header + (filename and size of extra field data) +*/ +local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar, + poffset_local_extrafield, + psize_local_extrafield) + unz_s* s; + uInt* piSizeVar; + uLong *poffset_local_extrafield; + uInt *psize_local_extrafield; +{ + uLong uMagic,uData,uFlags; + uLong size_filename; + uLong size_extra_field; + int err=UNZ_OK; + + *piSizeVar = 0; + *poffset_local_extrafield = 0; + *psize_local_extrafield = 0; + + if (ZSEEK(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile + + s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + + if (err==UNZ_OK) + { + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) + err=UNZ_ERRNO; + else if (uMagic!=0x04034b50) + err=UNZ_BADZIPFILE; + } + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) + err=UNZ_ERRNO; +/* + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) + err=UNZ_BADZIPFILE; +*/ + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method)) + err=UNZ_BADZIPFILE; + + if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) && + (s->cur_file_info.compression_method!=Z_DEFLATED)) + err=UNZ_BADZIPFILE; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */ + err=UNZ_ERRNO; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */ + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && + ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */ + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && + ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */ + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && + ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK) + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename)) + err=UNZ_BADZIPFILE; + + *piSizeVar += (uInt)size_filename; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK) + err=UNZ_ERRNO; + *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile + + SIZEZIPLOCALHEADER + size_filename; + *psize_local_extrafield = (uInt)size_extra_field; + + *piSizeVar += (uInt)size_extra_field; + + return err; +} + +/* + Open for reading data the current file in the zipfile. + If there is no error and the file is opened, the return value is UNZ_OK. +*/ +extern int ZEXPORT unzOpenCurrentFile3 (file, method, level, raw, password) + unzFile file; + int* method; + int* level; + int raw; + const char* password; +{ + int err=UNZ_OK; + uInt iSizeVar; + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + uLong offset_local_extrafield; /* offset of the local extra field */ + uInt size_local_extrafield; /* size of the local extra field */ +# ifndef NOUNCRYPT + char source[12]; +# else + if (password != NULL) + return UNZ_PARAMERROR; +# endif + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + if (!s->current_file_ok) + return UNZ_PARAMERROR; + + if (s->pfile_in_zip_read != NULL) + unzCloseCurrentFile(file); + + if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar, + &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK) + return UNZ_BADZIPFILE; + + pfile_in_zip_read_info = (file_in_zip_read_info_s*) + ALLOC(sizeof(file_in_zip_read_info_s)); + if (pfile_in_zip_read_info==NULL) + return UNZ_INTERNALERROR; + + pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE); + pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; + pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; + pfile_in_zip_read_info->pos_local_extrafield=0; + pfile_in_zip_read_info->raw=raw; + + if (pfile_in_zip_read_info->read_buffer==NULL) + { + TRYFREE(pfile_in_zip_read_info); + return UNZ_INTERNALERROR; + } + + pfile_in_zip_read_info->stream_initialised=0; + + if (method!=NULL) + *method = (int)s->cur_file_info.compression_method; + + if (level!=NULL) + { + *level = 6; + switch (s->cur_file_info.flag & 0x06) + { + case 6 : *level = 1; break; + case 4 : *level = 2; break; + case 2 : *level = 9; break; + } + } + + if ((s->cur_file_info.compression_method!=0) && + (s->cur_file_info.compression_method!=Z_DEFLATED)) + err=UNZ_BADZIPFILE; + + pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc; + pfile_in_zip_read_info->crc32=0; + pfile_in_zip_read_info->compression_method = + s->cur_file_info.compression_method; + pfile_in_zip_read_info->filestream=s->filestream; + pfile_in_zip_read_info->z_filefunc=s->z_filefunc; + pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile; + + pfile_in_zip_read_info->stream.total_out = 0; + + if ((s->cur_file_info.compression_method==Z_DEFLATED) && + (!raw)) + { + pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; + pfile_in_zip_read_info->stream.zfree = (free_func)0; + pfile_in_zip_read_info->stream.opaque = (voidpf)0; + pfile_in_zip_read_info->stream.next_in = (voidpf)0; + pfile_in_zip_read_info->stream.avail_in = 0; + + err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); + if (err == Z_OK) + pfile_in_zip_read_info->stream_initialised=1; + else + { + TRYFREE(pfile_in_zip_read_info); + return err; + } + /* windowBits is passed < 0 to tell that there is no zlib header. + * Note that in this case inflate *requires* an extra "dummy" byte + * after the compressed stream in order to complete decompression and + * return Z_STREAM_END. + * In unzip, i don't wait absolutely Z_STREAM_END because I known the + * size of both compressed and uncompressed data + */ + } + pfile_in_zip_read_info->rest_read_compressed = + s->cur_file_info.compressed_size ; + pfile_in_zip_read_info->rest_read_uncompressed = + s->cur_file_info.uncompressed_size ; + + + pfile_in_zip_read_info->pos_in_zipfile = + s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + + iSizeVar; + + pfile_in_zip_read_info->stream.avail_in = (uInt)0; + + s->pfile_in_zip_read = pfile_in_zip_read_info; + +# ifndef NOUNCRYPT + if (password != NULL) + { + int i; + s->pcrc_32_tab = get_crc_table(); + init_keys(password,s->keys,s->pcrc_32_tab); + if (ZSEEK(s->z_filefunc, s->filestream, + s->pfile_in_zip_read->pos_in_zipfile + + s->pfile_in_zip_read->byte_before_the_zipfile, + SEEK_SET)!=0) + return UNZ_INTERNALERROR; + if(ZREAD(s->z_filefunc, s->filestream,source, 12)<12) + return UNZ_INTERNALERROR; + + for (i = 0; i<12; i++) + zdecode(s->keys,s->pcrc_32_tab,source[i]); + + s->pfile_in_zip_read->pos_in_zipfile+=12; + s->encrypted=1; + } +# endif + + + return UNZ_OK; +} + +extern int ZEXPORT unzOpenCurrentFile (file) + unzFile file; +{ + return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL); +} + +extern int ZEXPORT unzOpenCurrentFilePassword (file, password) + unzFile file; + const char* password; +{ + return unzOpenCurrentFile3(file, NULL, NULL, 0, password); +} + +extern int ZEXPORT unzOpenCurrentFile2 (file,method,level,raw) + unzFile file; + int* method; + int* level; + int raw; +{ + return unzOpenCurrentFile3(file, method, level, raw, NULL); +} + +/* + Read bytes from the current file. + buf contain buffer where data must be copied + len the size of buf. + + return the number of byte copied if somes bytes are copied + return 0 if the end of file was reached + return <0 with error code if there is an error + (UNZ_ERRNO for IO error, or zLib error for uncompress error) +*/ +extern int ZEXPORT unzReadCurrentFile (file, buf, len) + unzFile file; + voidp buf; + unsigned len; +{ + int err=UNZ_OK; + uInt iRead = 0; + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + + if ((pfile_in_zip_read_info->read_buffer == NULL)) + return UNZ_END_OF_LIST_OF_FILE; + if (len==0) + return 0; + + pfile_in_zip_read_info->stream.next_out = (Bytef*)buf; + + pfile_in_zip_read_info->stream.avail_out = (uInt)len; + + if ((len>pfile_in_zip_read_info->rest_read_uncompressed) && + (!(pfile_in_zip_read_info->raw))) + pfile_in_zip_read_info->stream.avail_out = + (uInt)pfile_in_zip_read_info->rest_read_uncompressed; + + if ((len>pfile_in_zip_read_info->rest_read_compressed+ + pfile_in_zip_read_info->stream.avail_in) && + (pfile_in_zip_read_info->raw)) + pfile_in_zip_read_info->stream.avail_out = + (uInt)pfile_in_zip_read_info->rest_read_compressed+ + pfile_in_zip_read_info->stream.avail_in; + + while (pfile_in_zip_read_info->stream.avail_out>0) + { + if ((pfile_in_zip_read_info->stream.avail_in==0) && + (pfile_in_zip_read_info->rest_read_compressed>0)) + { + uInt uReadThis = UNZ_BUFSIZE; + if (pfile_in_zip_read_info->rest_read_compressed<uReadThis) + uReadThis = (uInt)pfile_in_zip_read_info->rest_read_compressed; + if (uReadThis == 0) + return UNZ_EOF; + if (ZSEEK(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->pos_in_zipfile + + pfile_in_zip_read_info->byte_before_the_zipfile, + ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + if (ZREAD(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->read_buffer, + uReadThis)!=uReadThis) + return UNZ_ERRNO; + + +# ifndef NOUNCRYPT + if(s->encrypted) + { + uInt i; + for(i=0;i<uReadThis;i++) + pfile_in_zip_read_info->read_buffer[i] = + zdecode(s->keys,s->pcrc_32_tab, + pfile_in_zip_read_info->read_buffer[i]); + } +# endif + + + pfile_in_zip_read_info->pos_in_zipfile += uReadThis; + + pfile_in_zip_read_info->rest_read_compressed-=uReadThis; + + pfile_in_zip_read_info->stream.next_in = + (Bytef*)pfile_in_zip_read_info->read_buffer; + pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis; + } + + if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw)) + { + uInt uDoCopy,i ; + + if ((pfile_in_zip_read_info->stream.avail_in == 0) && + (pfile_in_zip_read_info->rest_read_compressed == 0)) + return (iRead==0) ? UNZ_EOF : iRead; + + if (pfile_in_zip_read_info->stream.avail_out < + pfile_in_zip_read_info->stream.avail_in) + uDoCopy = pfile_in_zip_read_info->stream.avail_out ; + else + uDoCopy = pfile_in_zip_read_info->stream.avail_in ; + + for (i=0;i<uDoCopy;i++) + *(pfile_in_zip_read_info->stream.next_out+i) = + *(pfile_in_zip_read_info->stream.next_in+i); + + pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, + pfile_in_zip_read_info->stream.next_out, + uDoCopy); + pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; + pfile_in_zip_read_info->stream.avail_in -= uDoCopy; + pfile_in_zip_read_info->stream.avail_out -= uDoCopy; + pfile_in_zip_read_info->stream.next_out += uDoCopy; + pfile_in_zip_read_info->stream.next_in += uDoCopy; + pfile_in_zip_read_info->stream.total_out += uDoCopy; + iRead += uDoCopy; + } + else + { + uLong uTotalOutBefore,uTotalOutAfter; + const Bytef *bufBefore; + uLong uOutThis; + int flush=Z_SYNC_FLUSH; + + uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; + bufBefore = pfile_in_zip_read_info->stream.next_out; + + /* + if ((pfile_in_zip_read_info->rest_read_uncompressed == + pfile_in_zip_read_info->stream.avail_out) && + (pfile_in_zip_read_info->rest_read_compressed == 0)) + flush = Z_FINISH; + */ + err=inflate(&pfile_in_zip_read_info->stream,flush); + + if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL)) + err = Z_DATA_ERROR; + + uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; + uOutThis = uTotalOutAfter-uTotalOutBefore; + + pfile_in_zip_read_info->crc32 = + crc32(pfile_in_zip_read_info->crc32,bufBefore, + (uInt)(uOutThis)); + + pfile_in_zip_read_info->rest_read_uncompressed -= + uOutThis; + + iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); + + if (err==Z_STREAM_END) + return (iRead==0) ? UNZ_EOF : iRead; + if (err!=Z_OK) + break; + } + } + + if (err==Z_OK) + return iRead; + return err; +} + + +/* + Give the current position in uncompressed data +*/ +extern z_off_t ZEXPORT unztell (file) + unzFile file; +{ + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + return (z_off_t)pfile_in_zip_read_info->stream.total_out; +} + + +/* + return 1 if the end of file was reached, 0 elsewhere +*/ +extern int ZEXPORT unzeof (file) + unzFile file; +{ + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + if (pfile_in_zip_read_info->rest_read_uncompressed == 0) + return 1; + else + return 0; +} + + + +/* + Read extra field from the current file (opened by unzOpenCurrentFile) + This is the local-header version of the extra field (sometimes, there is + more info in the local-header version than in the central-header) + + if buf==NULL, it return the size of the local extra field that can be read + + if buf!=NULL, len is the size of the buffer, the extra header is copied in + buf. + the return value is the number of bytes copied in buf, or (if <0) + the error code +*/ +extern int ZEXPORT unzGetLocalExtrafield (file,buf,len) + unzFile file; + voidp buf; + unsigned len; +{ + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + uInt read_now; + uLong size_to_read; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + size_to_read = (pfile_in_zip_read_info->size_local_extrafield - + pfile_in_zip_read_info->pos_local_extrafield); + + if (buf==NULL) + return (int)size_to_read; + + if (len>size_to_read) + read_now = (uInt)size_to_read; + else + read_now = (uInt)len ; + + if (read_now==0) + return 0; + + if (ZSEEK(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->offset_local_extrafield + + pfile_in_zip_read_info->pos_local_extrafield, + ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + if (ZREAD(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + buf,read_now)!=read_now) + return UNZ_ERRNO; + + return (int)read_now; +} + +/* + Close the file in zip opened with unzipOpenCurrentFile + Return UNZ_CRCERROR if all the file was read but the CRC is not good +*/ +extern int ZEXPORT unzCloseCurrentFile (file) + unzFile file; +{ + int err=UNZ_OK; + + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + + if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) && + (!pfile_in_zip_read_info->raw)) + { + if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) + err=UNZ_CRCERROR; + } + + + TRYFREE(pfile_in_zip_read_info->read_buffer); + pfile_in_zip_read_info->read_buffer = NULL; + if (pfile_in_zip_read_info->stream_initialised) + inflateEnd(&pfile_in_zip_read_info->stream); + + pfile_in_zip_read_info->stream_initialised = 0; + TRYFREE(pfile_in_zip_read_info); + + s->pfile_in_zip_read=NULL; + + return err; +} + + +/* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 +*/ +extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf) + unzFile file; + char *szComment; + uLong uSizeBuf; +{ + unz_s* s; + uLong uReadThis ; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + + uReadThis = uSizeBuf; + if (uReadThis>s->gi.size_comment) + uReadThis = s->gi.size_comment; + + if (ZSEEK(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + if (uReadThis>0) + { + *szComment='\0'; + if (ZREAD(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis) + return UNZ_ERRNO; + } + + if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) + *(szComment+s->gi.size_comment)='\0'; + return (int)uReadThis; +} + +/* Additions by RX '2004 */ +extern uLong ZEXPORT unzGetOffset (file) + unzFile file; +{ + unz_s* s; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + if (!s->current_file_ok) + return 0; + if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff) + if (s->num_file==s->gi.number_entry) + return 0; + return s->pos_in_central_dir; +} + +extern int ZEXPORT unzSetOffset (file, pos) + unzFile file; + uLong pos; +{ + unz_s* s; + int err; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + + s->pos_in_central_dir = pos; + s->num_file = s->gi.number_entry; /* hack */ + err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} diff --git a/plugins/snes9x_gx/source/utils/unzip/unzip.h b/plugins/snes9x_gx/source/utils/unzip/unzip.h new file mode 100644 index 00000000..c3206a05 --- /dev/null +++ b/plugins/snes9x_gx/source/utils/unzip/unzip.h @@ -0,0 +1,354 @@ +/* unzip.h -- IO for uncompress .zip files using zlib + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant + + This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g + WinZip, InfoZip tools and compatible. + + Multi volume ZipFile (span) are not supported. + Encryption compatible with pkzip 2.04g only supported + Old compressions used by old PKZip 1.x are not supported + + + I WAIT FEEDBACK at mail info@winimage.com + Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution + + Condition of use and distribution are the same than zlib : + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + +*/ + +/* for more info about .ZIP format, see + http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip + http://www.info-zip.org/pub/infozip/doc/ + PkWare has also a specification at : + ftp://ftp.pkware.com/probdesc.zip +*/ + +#ifndef _unz_H +#define _unz_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _ZLIB_H +#include "zlib.h" +#endif + +#ifndef _ZLIBIOAPI_H +#include "ioapi.h" +#endif + +#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) +/* like the STRICT of WIN32, we define a pointer that cannot be converted + from (void*) without cast */ +typedef struct TagunzFile__ { int unused; } unzFile__; +typedef unzFile__ *unzFile; +#else +typedef voidp unzFile; +#endif + + +#define UNZ_OK (0) +#define UNZ_END_OF_LIST_OF_FILE (-100) +#define UNZ_ERRNO (Z_ERRNO) +#define UNZ_EOF (0) +#define UNZ_PARAMERROR (-102) +#define UNZ_BADZIPFILE (-103) +#define UNZ_INTERNALERROR (-104) +#define UNZ_CRCERROR (-105) + +/* tm_unz contain date/time info */ +typedef struct tm_unz_s +{ + uInt tm_sec; /* seconds after the minute - [0,59] */ + uInt tm_min; /* minutes after the hour - [0,59] */ + uInt tm_hour; /* hours since midnight - [0,23] */ + uInt tm_mday; /* day of the month - [1,31] */ + uInt tm_mon; /* months since January - [0,11] */ + uInt tm_year; /* years - [1980..2044] */ +} tm_unz; + +/* unz_global_info structure contain global data about the ZIPfile + These data comes from the end of central dir */ +typedef struct unz_global_info_s +{ + uLong number_entry; /* total number of entries in + the central dir on this disk */ + uLong size_comment; /* size of the global comment of the zipfile */ +} unz_global_info; + + +/* unz_file_info contain information about a file in the zipfile */ +typedef struct unz_file_info_s +{ + uLong version; /* version made by 2 bytes */ + uLong version_needed; /* version needed to extract 2 bytes */ + uLong flag; /* general purpose bit flag 2 bytes */ + uLong compression_method; /* compression method 2 bytes */ + uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ + uLong crc; /* crc-32 4 bytes */ + uLong compressed_size; /* compressed size 4 bytes */ + uLong uncompressed_size; /* uncompressed size 4 bytes */ + uLong size_filename; /* filename length 2 bytes */ + uLong size_file_extra; /* extra field length 2 bytes */ + uLong size_file_comment; /* file comment length 2 bytes */ + + uLong disk_num_start; /* disk number start 2 bytes */ + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ + + tm_unz tmu_date; +} unz_file_info; + +extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, + const char* fileName2, + int iCaseSensitivity)); +/* + Compare two filename (fileName1,fileName2). + If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + or strcasecmp) + If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + (like 1 on Unix, 2 on Windows) +*/ + + +extern unzFile ZEXPORT unzOpen OF((const char *path)); +/* + Open a Zip file. path contain the full pathname (by example, + on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer + "zlib/zlib113.zip". + If the zipfile cannot be opened (file don't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. +*/ + +extern unzFile ZEXPORT unzOpen2 OF((const char *path, + zlib_filefunc_def* pzlib_filefunc_def)); +/* + Open a Zip file, like unzOpen, but provide a set of file low level API + for read/write the zip file (see ioapi.h) +*/ + +extern int ZEXPORT unzClose OF((unzFile file)); +/* + Close a ZipFile opened with unzipOpen. + If there is files inside the .Zip opened with unzOpenCurrentFile (see later), + these files MUST be closed with unzipCloseCurrentFile before call unzipClose. + return UNZ_OK if there is no problem. */ + +extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, + unz_global_info *pglobal_info)); +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. */ + + +extern int ZEXPORT unzGetGlobalComment OF((unzFile file, + char *szComment, + uLong uSizeBuf)); +/* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 +*/ + + +/***************************************************************************/ +/* Unzip package allow you browse the directory of the zipfile */ + +extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); +/* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem +*/ + +extern int ZEXPORT unzGoToNextFile OF((unzFile file)); +/* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. +*/ + +extern int ZEXPORT unzLocateFile OF((unzFile file, + const char *szFileName, + int iCaseSensitivity)); +/* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found +*/ + + +/* ****************************************** */ +/* Ryan supplied functions */ +/* unz_file_info contain information about a file in the zipfile */ +typedef struct unz_file_pos_s +{ + uLong pos_in_zip_directory; /* offset in zip file directory */ + uLong num_of_file; /* # of file */ +} unz_file_pos; + +extern int ZEXPORT unzGetFilePos( + unzFile file, + unz_file_pos* file_pos); + +extern int ZEXPORT unzGoToFilePos( + unzFile file, + unz_file_pos* file_pos); + +/* ****************************************** */ + +extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, + unz_file_info *pfile_info, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); +/* + Get Info about the current file + if pfile_info!=NULL, the *pfile_info structure will contain somes info about + the current file + if szFileName!=NULL, the filemane string will be copied in szFileName + (fileNameBufferSize is the size of the buffer) + if extraField!=NULL, the extra field information will be copied in extraField + (extraFieldBufferSize is the size of the buffer). + This is the Central-header version of the extra field + if szComment!=NULL, the comment string of the file will be copied in szComment + (commentBufferSize is the size of the buffer) +*/ + +/***************************************************************************/ +/* for reading the content of the current zipfile, you can open it, read data + from it, and close it (you can close it before reading all the file) + */ + +extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); +/* + Open for reading data the current file in the zipfile. + If there is no error, the return value is UNZ_OK. +*/ + +extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, + const char* password)); +/* + Open for reading data the current file in the zipfile. + password is a crypting password + If there is no error, the return value is UNZ_OK. +*/ + +extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, + int* method, + int* level, + int raw)); +/* + Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) + if raw==1 + *method will receive method of compression, *level will receive level of + compression + note : you can set level parameter as NULL (if you did not want known level, + but you CANNOT set method parameter as NULL +*/ + +extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, + int* method, + int* level, + int raw, + const char* password)); +/* + Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) + if raw==1 + *method will receive method of compression, *level will receive level of + compression + note : you can set level parameter as NULL (if you did not want known level, + but you CANNOT set method parameter as NULL +*/ + + +extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); +/* + Close the file in zip opened with unzOpenCurrentFile + Return UNZ_CRCERROR if all the file was read but the CRC is not good +*/ + +extern int ZEXPORT unzReadCurrentFile OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read bytes from the current file (opened by unzOpenCurrentFile) + buf contain buffer where data must be copied + len the size of buf. + + return the number of byte copied if somes bytes are copied + return 0 if the end of file was reached + return <0 with error code if there is an error + (UNZ_ERRNO for IO error, or zLib error for uncompress error) +*/ + +extern z_off_t ZEXPORT unztell OF((unzFile file)); +/* + Give the current position in uncompressed data +*/ + +extern int ZEXPORT unzeof OF((unzFile file)); +/* + return 1 if the end of file was reached, 0 elsewhere +*/ + +extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read extra field from the current file (opened by unzOpenCurrentFile) + This is the local-header version of the extra field (sometimes, there is + more info in the local-header version than in the central-header) + + if buf==NULL, it return the size of the local extra field + + if buf!=NULL, len is the size of the buffer, the extra header is copied in + buf. + the return value is the number of bytes copied in buf, or (if <0) + the error code +*/ + +/***************************************************************************/ + +/* Get the current file offset */ +extern uLong ZEXPORT unzGetOffset (unzFile file); + +/* Set the current file offset */ +extern int ZEXPORT unzSetOffset (unzFile file, uLong pos); + + + +#ifdef __cplusplus +} +#endif + +#endif /* _unz_H */ diff --git a/plugins/snes9x_gx/source/video.cpp b/plugins/snes9x_gx/source/video.cpp new file mode 100644 index 00000000..74c8e002 --- /dev/null +++ b/plugins/snes9x_gx/source/video.cpp @@ -0,0 +1,1068 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * softdev July 2006 + * crunchy2 May 2007 + * Michniewski 2008 + * Tantric 2008-2010 + * + * video.cpp + * + * Video routines + ***************************************************************************/ + +#include <gccore.h> +#include <ogcsys.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <ogc/texconv.h> + +#include "snes9xgx.h" +#include "menu.h" +#include "filter.h" +#include "filelist.h" +#include "audio.h" +#include "gui/gui.h" +#include "input.h" + +#include "snes9x/snes9x.h" +#include "snes9x/memmap.h" + +extern void UpdatePlaybackRate(void); + +/*** Snes9x GFX Buffer ***/ +#define SNES9XGFX_SIZE (EXT_PITCH*EXT_HEIGHT) +#define FILTERMEM_SIZE (512*MAX_SNES_HEIGHT*4) + +static unsigned char * snes9xgfx = NULL; +unsigned char * filtermem = NULL; // only want ((512*2) X (239*2)) + +/*** 2D Video ***/ +static unsigned int *xfb[2] = { NULL, NULL }; // Double buffered +static int whichfb = 0; // Switch +GXRModeObj *vmode = NULL; // Current video mode +int screenheight = 480; +int screenwidth = 640; +static int oldRenderMode = -1; // set to GCSettings.render when changing (temporarily) to another mode +int CheckVideo = 0; // for forcing video reset + +/*** GX ***/ +#define TEX_WIDTH 512 +#define TEX_HEIGHT 512 +#define TEXTUREMEM_SIZE TEX_WIDTH*(TEX_HEIGHT+8)*2 +static unsigned char texturemem[TEXTUREMEM_SIZE] ATTRIBUTE_ALIGN (32); + +#define DEFAULT_FIFO_SIZE 256 * 1024 +static unsigned int copynow = GX_FALSE; +static unsigned char gp_fifo[DEFAULT_FIFO_SIZE] ATTRIBUTE_ALIGN (32); +static GXTexObj texobj; +static Mtx view; +static Mtx GXmodelView2D; +static int vwidth, vheight, oldvwidth, oldvheight; + +u8 * gameScreenPng = NULL; +int gameScreenPngSize = 0; + +u32 FrameTimer = 0; + +bool vmode_60hz = true; +int timerstyle = 0; +bool progressive = 0; + +#define HASPECT 320 +#define VASPECT 240 + +/* New texture based scaler */ +typedef struct tagcamera +{ + guVector pos; + guVector up; + guVector view; +} +camera; + +/*** Square Matrix + This structure controls the size of the image on the screen. + Think of the output as a -80 x 80 by -60 x 60 graph. +***/ +s16 square[] ATTRIBUTE_ALIGN (32) = +{ + /* + * X, Y, Z + * Values set are for roughly 4:3 aspect + */ + -HASPECT, VASPECT, 0, // 0 + HASPECT, VASPECT, 0, // 1 + HASPECT, -VASPECT, 0, // 2 + -HASPECT, -VASPECT, 0 // 3 +}; + + +static camera cam = { + {0.0F, 0.0F, 0.0F}, + {0.0F, 0.5F, 0.0F}, + {0.0F, 0.0F, -0.5F} +}; + + +/*** +*** Custom Video modes (used to emulate original console video modes) +***/ + +/** Original SNES PAL Resolutions: **/ + +/* 239 lines progressive (PAL 50Hz) */ +static GXRModeObj TV_239p = +{ + VI_TVMODE_PAL_DS, // viDisplayMode + 512, // fbWidth + 239, // efbHeight + 239, // xfbHeight + (VI_MAX_WIDTH_PAL - 640)/2, // viXOrigin + (VI_MAX_HEIGHT_PAL/2 - 478/2)/2, // viYOrigin + 640, // viWidth + 478, // viHeight + VI_XFBMODE_SF, // xFBmode + GX_FALSE, // field_rendering + GX_FALSE, // aa + + // sample points arranged in increasing Y order + { + {6,6},{6,6},{6,6}, // pix 0, 3 sample points, 1/12 units, 4 bits each + {6,6},{6,6},{6,6}, // pix 1 + {6,6},{6,6},{6,6}, // pix 2 + {6,6},{6,6},{6,6} // pix 3 + }, + + // vertical filter[7], 1/64 units, 6 bits each + { + 0, // line n-1 + 0, // line n-1 + 21, // line n + 22, // line n + 21, // line n + 0, // line n+1 + 0 // line n+1 + } +}; + +/* 478 lines interlaced (PAL 50Hz, Deflicker) */ +static GXRModeObj TV_478i = +{ + VI_TVMODE_PAL_INT, // viDisplayMode + 512, // fbWidth + 478, // efbHeight + 478, // xfbHeight + (VI_MAX_WIDTH_PAL - 640)/2, // viXOrigin + (VI_MAX_HEIGHT_PAL - 478)/2, // viYOrigin + 640, // viWidth + 478, // viHeight + VI_XFBMODE_DF, // xFBmode + GX_FALSE, // field_rendering + GX_FALSE, // aa + + // sample points arranged in increasing Y order + { + {6,6},{6,6},{6,6}, // pix 0, 3 sample points, 1/12 units, 4 bits each + {6,6},{6,6},{6,6}, // pix 1 + {6,6},{6,6},{6,6}, // pix 2 + {6,6},{6,6},{6,6} // pix 3 + }, + + // vertical filter[7], 1/64 units, 6 bits each + { + 8, // line n-1 + 8, // line n-1 + 10, // line n + 12, // line n + 10, // line n + 8, // line n+1 + 8 // line n+1 + } +}; + +/** Original SNES NTSC Resolutions: **/ + +/* 224 lines progressive (NTSC or PAL 60Hz) */ +static GXRModeObj TV_224p = +{ + VI_TVMODE_EURGB60_DS, // viDisplayMode + 512, // fbWidth + 224, // efbHeight + 224, // xfbHeight + (VI_MAX_WIDTH_NTSC - 640)/2, // viXOrigin + (VI_MAX_HEIGHT_NTSC/2 - 448/2)/2, // viYOrigin + 640, // viWidth + 448, // viHeight + VI_XFBMODE_SF, // xFBmode + GX_FALSE, // field_rendering + GX_FALSE, // aa + + // sample points arranged in increasing Y order + { + {6,6},{6,6},{6,6}, // pix 0, 3 sample points, 1/12 units, 4 bits each + {6,6},{6,6},{6,6}, // pix 1 + {6,6},{6,6},{6,6}, // pix 2 + {6,6},{6,6},{6,6} // pix 3 + }, + + // vertical filter[7], 1/64 units, 6 bits each + { + 0, // line n-1 + 0, // line n-1 + 21, // line n + 22, // line n + 21, // line n + 0, // line n+1 + 0 // line n+1 + } +}; + +/* 448 lines interlaced (NTSC or PAL 60Hz, Deflicker) */ +static GXRModeObj TV_448i = +{ + VI_TVMODE_EURGB60_INT, // viDisplayMode + 512, // fbWidth + 448, // efbHeight + 448, // xfbHeight + (VI_MAX_WIDTH_NTSC - 640)/2, // viXOrigin + (VI_MAX_HEIGHT_NTSC - 448)/2, // viYOrigin + 640, // viWidth + 448, // viHeight + VI_XFBMODE_DF, // xFBmode + GX_FALSE, // field_rendering + GX_FALSE, // aa + + + // sample points arranged in increasing Y order + { + {6,6},{6,6},{6,6}, // pix 0, 3 sample points, 1/12 units, 4 bits each + {6,6},{6,6},{6,6}, // pix 1 + {6,6},{6,6},{6,6}, // pix 2 + {6,6},{6,6},{6,6} // pix 3 + }, + + // vertical filter[7], 1/64 units, 6 bits each + { + 8, // line n-1 + 8, // line n-1 + 10, // line n + 12, // line n + 10, // line n + 8, // line n+1 + 8 // line n+1 + } +}; + +static GXRModeObj TV_Custom; + +/* TV Modes table */ +static GXRModeObj *tvmodes[4] = { + &TV_239p, &TV_478i, /* Snes PAL video modes */ + &TV_224p, &TV_448i, /* Snes NTSC video modes */ +}; + +/**************************************************************************** + * VideoThreading + ***************************************************************************/ +#define TSTACK 16384 +static lwp_t vbthread = LWP_THREAD_NULL; +static unsigned char vbstack[TSTACK]; + +/**************************************************************************** + * vbgetback + * + * This callback enables the emulator to keep running while waiting for a + * vertical blank. + * + * Putting LWP to good use :) + ***************************************************************************/ +static void * +vbgetback (void *arg) +{ + while (1) + { + VIDEO_WaitVSync (); /**< Wait for video vertical blank */ + LWP_SuspendThread (vbthread); + } + return NULL; +} + +/**************************************************************************** + * copy_to_xfb + * + * Stock code to copy the GX buffer to the current display mode. + * Also increments the frameticker, as it's called for each vb. + ***************************************************************************/ +static inline void +copy_to_xfb (u32 arg) +{ + if (copynow == GX_TRUE) + { + GX_CopyDisp (xfb[whichfb], GX_TRUE); + GX_Flush (); + copynow = GX_FALSE; + } + ++FrameTimer; +} + +/**************************************************************************** + * Scaler Support Functions + ***************************************************************************/ +static inline void +draw_init () +{ + GX_ClearVtxDesc (); + GX_SetVtxDesc (GX_VA_POS, GX_INDEX8); + GX_SetVtxDesc (GX_VA_CLR0, GX_INDEX8); + GX_SetVtxDesc (GX_VA_TEX0, GX_DIRECT); + + GX_SetVtxAttrFmt (GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_S16, 0); + GX_SetVtxAttrFmt (GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0); + GX_SetVtxAttrFmt (GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0); + + GX_SetArray (GX_VA_POS, square, 3 * sizeof (s16)); + + GX_SetNumTexGens (1); + GX_SetNumChans (0); + + GX_SetTexCoordGen (GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY); + + GX_SetTevOp (GX_TEVSTAGE0, GX_REPLACE); + GX_SetTevOrder (GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLORNULL); + + memset (&view, 0, sizeof (Mtx)); + guLookAt(view, &cam.pos, &cam.up, &cam.view); + GX_LoadPosMtxImm (view, GX_PNMTX0); + + GX_InvVtxCache (); // update vertex cache +} + +static inline void +draw_vert (u8 pos, u8 c, f32 s, f32 t) +{ + GX_Position1x8 (pos); + GX_Color1x8 (c); + GX_TexCoord2f32 (s, t); +} + +static inline void +draw_square (Mtx v) +{ + Mtx m; // model matrix. + Mtx mv; // modelview matrix. + + guMtxIdentity (m); + guMtxTransApply (m, m, 0, 0, -100); + guMtxConcat (v, m, mv); + + GX_LoadPosMtxImm (mv, GX_PNMTX0); + GX_Begin (GX_QUADS, GX_VTXFMT0, 4); + draw_vert (0, 0, 0.0, 0.0); + draw_vert (1, 0, 1.0, 0.0); + draw_vert (2, 0, 1.0, 1.0); + draw_vert (3, 0, 0.0, 1.0); + GX_End (); +} + +/**************************************************************************** + * StopGX + * + * Stops GX (when exiting) + ***************************************************************************/ +void StopGX() +{ + GX_AbortFrame(); + GX_Flush(); + + VIDEO_SetBlack(TRUE); + VIDEO_Flush(); +} + +/**************************************************************************** + * FindVideoMode + * + * Finds the optimal video mode, or uses the user-specified one + * Also configures original video modes + ***************************************************************************/ +static GXRModeObj * FindVideoMode() +{ + GXRModeObj * mode; + + // choose the desired video mode + switch(GCSettings.videomode) + { + case 1: // NTSC (480i) + mode = &TVNtsc480IntDf; + break; + case 2: // Progressive (480p) + mode = &TVNtsc480Prog; + break; + case 3: // PAL (50Hz) + mode = &TVPal576IntDfScale; + break; + case 4: // PAL (60Hz) + mode = &TVEurgb60Hz480IntDf; + break; + default: + mode = VIDEO_GetPreferredMode(NULL); + + #ifdef HW_DOL + /* we have component cables, but the preferred mode is interlaced + * why don't we switch into progressive? + * on the Wii, the user can do this themselves on their Wii Settings */ + if(VIDEO_HaveComponentCable()) + mode = &TVNtsc480Prog; + #endif + + break; + } + + // configure original modes + switch (mode->viTVMode >> 2) + { + case VI_PAL: + // 576 lines (PAL 50Hz) + vmode_60hz = false; + + // Original Video modes (forced to PAL 50Hz) + // set video signal mode + TV_224p.viTVMode = VI_TVMODE_PAL_DS; + TV_448i.viTVMode = VI_TVMODE_PAL_INT; + // set VI position + TV_224p.viYOrigin = (VI_MAX_HEIGHT_PAL/2 - 448/2)/2; + TV_448i.viYOrigin = (VI_MAX_HEIGHT_PAL - 448)/2; + break; + + case VI_NTSC: + // 480 lines (NTSC 60Hz) + vmode_60hz = true; + + // Original Video modes (forced to NTSC 60hz) + // set video signal mode + TV_239p.viTVMode = VI_TVMODE_NTSC_DS; + TV_478i.viTVMode = VI_TVMODE_NTSC_INT; + TV_224p.viTVMode = VI_TVMODE_NTSC_DS; + TV_448i.viTVMode = VI_TVMODE_NTSC_INT; + // set VI position + TV_239p.viYOrigin = (VI_MAX_HEIGHT_NTSC/2 - 478/2)/2; + TV_478i.viYOrigin = (VI_MAX_HEIGHT_NTSC - 478)/2; + TV_224p.viYOrigin = (VI_MAX_HEIGHT_NTSC/2 - 448/2)/2; + TV_448i.viYOrigin = (VI_MAX_HEIGHT_NTSC - 448)/2; + break; + + default: + // 480 lines (PAL 60Hz) + vmode_60hz = true; + + // Original Video modes (forced to PAL 60hz) + // set video signal mode + TV_239p.viTVMode = VI_TVMODE(mode->viTVMode >> 2, VI_NON_INTERLACE); + TV_478i.viTVMode = VI_TVMODE(mode->viTVMode >> 2, VI_INTERLACE); + TV_224p.viTVMode = VI_TVMODE(mode->viTVMode >> 2, VI_NON_INTERLACE); + TV_448i.viTVMode = VI_TVMODE(mode->viTVMode >> 2, VI_INTERLACE); + // set VI position + TV_239p.viYOrigin = (VI_MAX_HEIGHT_NTSC/2 - 478/2)/2; + TV_478i.viYOrigin = (VI_MAX_HEIGHT_NTSC - 478)/2; + TV_224p.viYOrigin = (VI_MAX_HEIGHT_NTSC/2 - 448/2)/2; + TV_448i.viYOrigin = (VI_MAX_HEIGHT_NTSC - 448)/2; + break; + } + + // check for progressive scan + if (mode->viTVMode == VI_TVMODE_NTSC_PROG) + progressive = true; + else + progressive = false; + + #ifdef HW_RVL + if (CONF_GetAspectRatio() == CONF_ASPECT_16_9) + mode->viWidth = 678; + else + mode->viWidth = 672; + + if (vmode_60hz) + { + mode->viXOrigin = (VI_MAX_WIDTH_NTSC - mode->viWidth) / 2; + mode->viYOrigin = (VI_MAX_HEIGHT_NTSC - mode->viHeight) / 2; + } + else + { + mode->viXOrigin = (VI_MAX_WIDTH_PAL - mode->viWidth) / 2; + mode->viYOrigin = (VI_MAX_HEIGHT_PAL - mode->viHeight) / 2; + } + #endif + return mode; +} + +/**************************************************************************** + * SetupVideoMode + * + * Sets up the given video mode + ***************************************************************************/ +static void SetupVideoMode(GXRModeObj * mode) +{ + if(vmode == mode) + return; + + VIDEO_SetPostRetraceCallback (NULL); + copynow = GX_FALSE; + VIDEO_Configure (mode); + VIDEO_Flush(); + + // Clear framebuffers etc. + VIDEO_ClearFrameBuffer (mode, xfb[0], COLOR_BLACK); + VIDEO_ClearFrameBuffer (mode, xfb[1], COLOR_BLACK); + VIDEO_SetNextFramebuffer (xfb[0]); + + VIDEO_SetBlack (FALSE); + VIDEO_Flush (); + VIDEO_WaitVSync (); + + if (mode->viTVMode & VI_NON_INTERLACE) + VIDEO_WaitVSync(); + else + while (VIDEO_GetNextField()) + VIDEO_WaitVSync(); + + VIDEO_SetPostRetraceCallback ((VIRetraceCallback)copy_to_xfb); + vmode = mode; +} + +/**************************************************************************** + * InitGCVideo + * + * This function MUST be called at startup. + * - also sets up menu video mode + ***************************************************************************/ + +void +InitGCVideo () +{ + VIDEO_Init(); + + // Allocate the video buffers + xfb[0] = (u32 *) memalign(32, 640*576*2); + xfb[1] = (u32 *) memalign(32, 640*576*2); + DCInvalidateRange(xfb[0], 640*576*2); + DCInvalidateRange(xfb[1], 640*576*2); + xfb[0] = (u32 *) MEM_K0_TO_K1 (xfb[0]); + xfb[1] = (u32 *) MEM_K0_TO_K1 (xfb[1]); + + GXRModeObj *rmode = FindVideoMode(); + SetupVideoMode(rmode); +#ifdef HW_RVL + InitLUTs(); // init LUTs for hq2x +#endif + LWP_CreateThread (&vbthread, vbgetback, NULL, vbstack, TSTACK, 68); + + // Initialize GX + GXColor background = { 0, 0, 0, 0xff }; + memset (&gp_fifo, 0, DEFAULT_FIFO_SIZE); + GX_Init (&gp_fifo, DEFAULT_FIFO_SIZE); + GX_SetCopyClear (background, 0x00ffffff); + GX_SetDispCopyGamma (GX_GM_1_0); + GX_SetCullMode (GX_CULL_NONE); + + vwidth = 100; + vheight = 100; +} + +void ResetFbWidth(int width, GXRModeObj *rmode) +{ + if(rmode->fbWidth == width) + return; + + rmode->fbWidth = width; + + if(rmode != vmode) + return; + + GX_InvVtxCache(); + VIDEO_Configure(rmode); + VIDEO_Flush(); +} + +/**************************************************************************** + * ResetVideo_Emu + * + * Reset the video/rendering mode for the emulator rendering +****************************************************************************/ +void +ResetVideo_Emu () +{ + GXRModeObj *rmode; + Mtx44 p; + int i = -1; + + // original render mode or hq2x + if (GCSettings.render == 0) + { + for (int j=0; j<4; j++) + { + if (tvmodes[j]->efbHeight == vheight) + { + i = j; + break; + } + } + } + + if(i >= 0) // we found a matching original mode + { + rmode = tvmodes[i]; + + // hack to fix video output for hq2x (only when actually filtering; h<=239, w<=256) + if (GCSettings.FilterMethod != FILTER_NONE && vheight <= 239 && vwidth <= 256) + { + memcpy(&TV_Custom, tvmodes[i], sizeof(TV_Custom)); + rmode = &TV_Custom; + + rmode->fbWidth = 512; + rmode->efbHeight *= 2; + rmode->xfbHeight *= 2; + rmode->xfbMode = VI_XFBMODE_DF; + rmode->viTVMode |= VI_INTERLACE; + } + Settings.SoundInputRate = 31894; + UpdatePlaybackRate(); + } + else + { + rmode = FindVideoMode(); + + if (GCSettings.widescreen) + ResetFbWidth(640, rmode); + else + ResetFbWidth(512, rmode); + + Settings.SoundInputRate = 31953; + UpdatePlaybackRate(); + } + + SetupVideoMode(rmode); // reconfigure VI + + GXColor background = {0, 0, 0, 255}; + GX_SetCopyClear (background, 0x00ffffff); + + GX_SetViewport (0, 0, rmode->fbWidth, rmode->efbHeight, 0, 1); + GX_SetDispCopyYScale ((f32) rmode->xfbHeight / (f32) rmode->efbHeight); + GX_SetScissor (0, 0, rmode->fbWidth, rmode->efbHeight); + + GX_SetDispCopySrc (0, 0, rmode->fbWidth, rmode->efbHeight); + GX_SetDispCopyDst (rmode->fbWidth, rmode->xfbHeight); + GX_SetCopyFilter(rmode->aa, rmode->sample_pattern, (rmode->xfbMode == VI_XFBMODE_SF) ? GX_FALSE : GX_TRUE, rmode->vfilter); + + GX_SetFieldMode (rmode->field_rendering, ((rmode->viHeight == 2 * rmode->xfbHeight) ? GX_ENABLE : GX_DISABLE)); + + if (rmode->aa) + GX_SetPixelFmt(GX_PF_RGB565_Z16, GX_ZC_LINEAR); + else + GX_SetPixelFmt(GX_PF_RGB8_Z24, GX_ZC_LINEAR); + + GX_SetZMode (GX_TRUE, GX_LEQUAL, GX_TRUE); + GX_SetColorUpdate (GX_TRUE); + + guOrtho(p, rmode->efbHeight/2, -(rmode->efbHeight/2), -(rmode->fbWidth/2), rmode->fbWidth/2, 100, 1000); // matrix, t, b, l, r, n, f + GX_LoadProjectionMtx (p, GX_ORTHOGRAPHIC); + + draw_init (); +} + +/**************************************************************************** + * MakeTexture + * + * Modified for a buffer with an offset (border) + ***************************************************************************/ +void +MakeTexture (const void *src, void *dst, s32 width, s32 height) +{ + register u32 tmp0=0,tmp1=0,tmp2=0,tmp3=0; + + __asm__ __volatile__ ( + " srwi %6,%6,2\n" + " srwi %7,%7,2\n" + " subi %3,%4,4\n" + " mr %4,%3\n" + " subi %4,%4,4\n" + + "2: mtctr %6\n" + " mr %0,%5\n" + // + "1: lwz %1,0(%5)\n" //1 + " stwu %1,8(%4)\n" + " lwz %2,4(%5)\n" //1 + " stwu %2,8(%3)\n" + " lwz %1,1032(%5)\n" //2 + " stwu %1,8(%4)\n" + " lwz %2,1036(%5)\n" //2 + " stwu %2,8(%3)\n" + " lwz %1,2064(%5)\n" //3 + " stwu %1,8(%4)\n" + " lwz %2,2068(%5)\n" //3 + " stwu %2,8(%3)\n" + " lwz %1,3096(%5)\n" //4 + " stwu %1,8(%4)\n" + " lwz %2,3100(%5)\n" //4 + " stwu %2,8(%3)\n" + " addi %5,%5,8\n" + " bdnz 1b\n" + " addi %5,%0,4128\n" //5 + " subic. %7,%7,1\n" + " bne 2b" + // 0 1 2 3 4 5 6 7 + : "=&b"(tmp0), "=&b"(tmp1), "=&b"(tmp2), "=&b"(tmp3), "+b"(dst) : "b"(src), "b"(width), "b"(height) + ); +} + +/**************************************************************************** + * Update Video + ***************************************************************************/ +uint32 prevRenderedFrameCount = 0; +int fscale = 1; + +void +update_video (int width, int height) +{ + vwidth = width; + vheight = height; + + if(CheckVideo == 2 && IPPU.RenderedFramesCount == prevRenderedFrameCount) + return; // we haven't rendered any frames yet, so we can't draw anything! + + // Ensure previous vb has complete + while ((LWP_ThreadIsSuspended (vbthread) == 0) || (copynow == GX_TRUE)) + usleep (50); + + whichfb ^= 1; + + if (oldvheight != vheight || oldvwidth != vwidth) // if rendered width/height changes, update scaling + CheckVideo = 1; + + if (CheckVideo) // if we get back from the menu, and have rendered at least 1 frame + { + int xscale, yscale; +#ifdef HW_RVL + if(vwidth <= 256) + fscale = GetFilterScale((RenderFilter)GCSettings.FilterMethod); + else + fscale = 1; +#endif + ResetVideo_Emu (); // reset video to emulator rendering settings + + /** Update scaling **/ + if (GCSettings.render == 0) // original render mode + { + if (GCSettings.FilterMethod != FILTER_NONE && vheight <= 239 && vwidth <= 256) + { // filters; normal operation + xscale = vwidth; + yscale = vheight; + } + else + { // no filtering + fscale = 1; + xscale = 256; + yscale = vheight / 2; + } + } + else // unfiltered and filtered mode + { + xscale = 256; + + if(vheight == 224 || vheight == 448) + yscale = 224; + else + yscale = 239; + } + + if (GCSettings.widescreen) + { + if(GCSettings.render == 0) + xscale = (3*xscale)/4; + else + xscale = 256; // match the original console's width for "widescreen" to prevent flickering + } + + xscale *= GCSettings.zoomHor; + yscale *= GCSettings.zoomVert; + + square[6] = square[3] = xscale + GCSettings.xshift; + square[0] = square[9] = -xscale + GCSettings.xshift; + square[4] = square[1] = yscale - GCSettings.yshift; + square[7] = square[10] = -yscale - GCSettings.yshift; + DCFlushRange (square, 32); // update memory BEFORE the GPU accesses it! + draw_init (); + + // initialize the texture obj we are going to use + GX_InitTexObj (&texobj, texturemem, vwidth*fscale, vheight*fscale, GX_TF_RGB565, GX_CLAMP, GX_CLAMP, GX_FALSE); + + if (GCSettings.render == 0 || GCSettings.render == 2) + GX_InitTexObjLOD(&texobj,GX_NEAR,GX_NEAR_MIP_NEAR,2.5,9.0,0.0,GX_FALSE,GX_FALSE,GX_ANISO_1); // original/unfiltered video mode: force texture filtering OFF + + GX_LoadTexObj (&texobj, GX_TEXMAP0); // load texture object so its ready to use + + oldvwidth = vwidth; + oldvheight = vheight; + CheckVideo = 0; + } +#ifdef HW_RVL + // convert image to texture + if (GCSettings.FilterMethod != FILTER_NONE && vheight <= 239 && vwidth <= 256) // don't do filtering on game textures > 256 x 239 + { + FilterMethod ((uint8*) GFX.Screen, EXT_PITCH, (uint8*) filtermem, vwidth*fscale*2, vwidth, vheight); + MakeTexture565((char *) filtermem, (char *) texturemem, vwidth*fscale, vheight*fscale); + } + else +#endif + { + MakeTexture((char *) GFX.Screen, (char *) texturemem, vwidth, vheight); + } + + DCFlushRange (texturemem, TEXTUREMEM_SIZE); // update the texture memory + GX_InvalidateTexAll (); + + draw_square (view); // draw the quad + + GX_DrawDone (); + + if(ScreenshotRequested) + { + if(GCSettings.render == 0) // we can't take a screenshot in Original mode + { + oldRenderMode = 0; + GCSettings.render = 2; // switch to unfiltered mode + CheckVideo = 1; // request the switch + } + else + { + ScreenshotRequested = 0; + TakeScreenshot(); + if(oldRenderMode != -1) + { + GCSettings.render = oldRenderMode; + oldRenderMode = -1; + } + ConfigRequested = 1; + } + } + + VIDEO_SetNextFramebuffer (xfb[whichfb]); + VIDEO_Flush (); + copynow = GX_TRUE; + + // Return to caller, don't waste time waiting for vb + LWP_ResumeThread (vbthread); +} + +void AllocGfxMem() +{ + snes9xgfx = (unsigned char *)memalign(32, SNES9XGFX_SIZE); + memset(snes9xgfx, 0, SNES9XGFX_SIZE); + +#ifdef HW_RVL + filtermem = (unsigned char *)memalign(32, FILTERMEM_SIZE); + memset(filtermem, 0, FILTERMEM_SIZE); +#endif + + GFX.Pitch = EXT_PITCH; + GFX.Screen = (uint16*)(snes9xgfx + EXT_OFFSET); +} + +/**************************************************************************** + * setGFX + * + * Setup the global GFX information for Snes9x + ***************************************************************************/ +void +setGFX () +{ + GFX.Pitch = EXT_PITCH; +} + +/**************************************************************************** + * TakeScreenshot + * + * Copies the current screen into a GX texture + ***************************************************************************/ +void TakeScreenshot() +{ + IMGCTX pngContext = PNGU_SelectImageFromBuffer(savebuffer); + + if (pngContext != NULL) + { + gameScreenPngSize = PNGU_EncodeFromEFB(pngContext, vmode->fbWidth, vmode->efbHeight); + PNGU_ReleaseImageContext(pngContext); + gameScreenPng = (u8 *)malloc(gameScreenPngSize); + memcpy(gameScreenPng, savebuffer, gameScreenPngSize); + } +} + +/**************************************************************************** + * ResetVideo_Menu + * + * Reset the video/rendering mode for the menu +****************************************************************************/ +void +ResetVideo_Menu () +{ + Mtx44 p; + f32 yscale; + u32 xfbHeight; + GXRModeObj * rmode = FindVideoMode(); + + SetupVideoMode(rmode); // reconfigure VI + + // clears the bg to color and clears the z buffer + GXColor background = {0, 0, 0, 255}; + GX_SetCopyClear (background, 0x00ffffff); + + yscale = GX_GetYScaleFactor(vmode->efbHeight,vmode->xfbHeight); + xfbHeight = GX_SetDispCopyYScale(yscale); + GX_SetScissor(0,0,vmode->fbWidth,vmode->efbHeight); + GX_SetDispCopySrc(0,0,vmode->fbWidth,vmode->efbHeight); + GX_SetDispCopyDst(vmode->fbWidth,xfbHeight); + GX_SetCopyFilter(vmode->aa,vmode->sample_pattern,GX_TRUE,vmode->vfilter); + GX_SetFieldMode(vmode->field_rendering,((vmode->viHeight==2*vmode->xfbHeight)?GX_ENABLE:GX_DISABLE)); + + if (vmode->aa) + GX_SetPixelFmt(GX_PF_RGB565_Z16, GX_ZC_LINEAR); + else + GX_SetPixelFmt(GX_PF_RGB8_Z24, GX_ZC_LINEAR); + + // setup the vertex descriptor + // tells the flipper to expect direct data + GX_ClearVtxDesc(); + GX_InvVtxCache (); + GX_InvalidateTexAll(); + + GX_SetVtxDesc(GX_VA_TEX0, GX_NONE); + GX_SetVtxDesc(GX_VA_POS, GX_DIRECT); + GX_SetVtxDesc (GX_VA_CLR0, GX_DIRECT); + + GX_SetVtxAttrFmt (GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); + GX_SetVtxAttrFmt (GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0); + GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0); + GX_SetZMode (GX_FALSE, GX_LEQUAL, GX_TRUE); + + GX_SetNumChans(1); + GX_SetNumTexGens(1); + GX_SetTevOp (GX_TEVSTAGE0, GX_PASSCLR); + GX_SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0); + GX_SetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY); + + guMtxIdentity(GXmodelView2D); + guMtxTransApply (GXmodelView2D, GXmodelView2D, 0.0F, 0.0F, -50.0F); + GX_LoadPosMtxImm(GXmodelView2D,GX_PNMTX0); + + guOrtho(p,0,479,0,639,0,300); + GX_LoadProjectionMtx(p, GX_ORTHOGRAPHIC); + + GX_SetViewport(0,0,vmode->fbWidth,vmode->efbHeight,0,1); + GX_SetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_CLEAR); + GX_SetAlphaUpdate(GX_TRUE); +} + +/**************************************************************************** + * Menu_Render + * + * Renders everything current sent to GX, and flushes video + ***************************************************************************/ +void Menu_Render() +{ + whichfb ^= 1; // flip framebuffer + GX_SetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE); + GX_SetColorUpdate(GX_TRUE); + GX_CopyDisp(xfb[whichfb],GX_TRUE); + GX_DrawDone(); + VIDEO_SetNextFramebuffer(xfb[whichfb]); + VIDEO_Flush(); + VIDEO_WaitVSync(); +} + +/**************************************************************************** + * Menu_DrawImg + * + * Draws the specified image on screen using GX + ***************************************************************************/ +void Menu_DrawImg(f32 xpos, f32 ypos, u16 width, u16 height, u8 data[], + f32 degrees, f32 scaleX, f32 scaleY, u8 alpha) +{ + if(data == NULL) + return; + + GXTexObj texObj; + + GX_InitTexObj(&texObj, data, width,height, GX_TF_RGBA8,GX_CLAMP, GX_CLAMP,GX_FALSE); + GX_LoadTexObj(&texObj, GX_TEXMAP0); + GX_InvalidateTexAll(); + + GX_SetTevOp (GX_TEVSTAGE0, GX_MODULATE); + GX_SetVtxDesc (GX_VA_TEX0, GX_DIRECT); + + Mtx m,m1,m2, mv; + width >>= 1; + height >>= 1; + + guMtxIdentity (m1); + guMtxScaleApply(m1,m1,scaleX,scaleY,1.0); + guVector axis = (guVector) {0 , 0, 1 }; + guMtxRotAxisDeg (m2, &axis, degrees); + guMtxConcat(m2,m1,m); + + guMtxTransApply(m,m, xpos+width,ypos+height,0); + guMtxConcat (GXmodelView2D, m, mv); + GX_LoadPosMtxImm (mv, GX_PNMTX0); + + GX_Begin(GX_QUADS, GX_VTXFMT0,4); + GX_Position3f32(-width, -height, 0); + GX_Color4u8(0xFF,0xFF,0xFF,alpha); + GX_TexCoord2f32(0, 0); + + GX_Position3f32(width, -height, 0); + GX_Color4u8(0xFF,0xFF,0xFF,alpha); + GX_TexCoord2f32(1, 0); + + GX_Position3f32(width, height, 0); + GX_Color4u8(0xFF,0xFF,0xFF,alpha); + GX_TexCoord2f32(1, 1); + + GX_Position3f32(-width, height, 0); + GX_Color4u8(0xFF,0xFF,0xFF,alpha); + GX_TexCoord2f32(0, 1); + GX_End(); + GX_LoadPosMtxImm (GXmodelView2D, GX_PNMTX0); + + GX_SetTevOp (GX_TEVSTAGE0, GX_PASSCLR); + GX_SetVtxDesc (GX_VA_TEX0, GX_NONE); +} + +/**************************************************************************** + * Menu_DrawRectangle + * + * Draws a rectangle at the specified coordinates using GX + ***************************************************************************/ +void Menu_DrawRectangle(f32 x, f32 y, f32 width, f32 height, GXColor color, u8 filled) +{ + long n = 4; + f32 x2 = x+width; + f32 y2 = y+height; + guVector v[] = {{x,y,0.0f}, {x2,y,0.0f}, {x2,y2,0.0f}, {x,y2,0.0f}, {x,y,0.0f}}; + u8 fmt = GX_TRIANGLEFAN; + + if(!filled) + { + fmt = GX_LINESTRIP; + n = 5; + } + + GX_Begin(fmt, GX_VTXFMT0, n); + for(long i=0; i<n; ++i) + { + GX_Position3f32(v[i].x, v[i].y, v[i].z); + GX_Color4u8(color.r, color.g, color.b, color.a); + } + GX_End(); +} + diff --git a/plugins/snes9x_gx/source/video.h b/plugins/snes9x_gx/source/video.h new file mode 100644 index 00000000..83a46a13 --- /dev/null +++ b/plugins/snes9x_gx/source/video.h @@ -0,0 +1,43 @@ +/**************************************************************************** + * Snes9x Nintendo Wii/Gamecube Port + * + * softdev July 2006 + * Michniewski 2008 + * Tantric 2008-2010 + * + * video.h + * + * Video routines + ***************************************************************************/ + +#ifndef _GCVIDEOH_ +#define _GCVIDEOH_ + +#include <ogcsys.h> + +#include "snes9x/snes9x.h" + +void AllocGfxMem(); +void InitGCVideo (); +void StopGX(); +void ResetVideo_Emu(); +void setGFX(); +void update_video (int width, int height); +void ResetVideo_Menu(); +void TakeScreenshot(); +void Menu_Render(); +void Menu_DrawImg(f32 xpos, f32 ypos, u16 width, u16 height, u8 data[], f32 degrees, f32 scaleX, f32 scaleY, u8 alphaF ); +void Menu_DrawRectangle(f32 x, f32 y, f32 width, f32 height, GXColor color, u8 filled); + +extern GXRModeObj *vmode; +extern int screenheight; +extern int screenwidth; +extern bool progressive; +extern u8 * gameScreenPng; +extern int gameScreenPngSize; +extern u32 FrameTimer; +extern bool vmode_60hz; +extern int timerstyle; +extern int CheckVideo; + +#endif diff --git a/plugins/snes9x_gx/source/xenon/README b/plugins/snes9x_gx/source/xenon/README new file mode 100644 index 00000000..93e08e73 --- /dev/null +++ b/plugins/snes9x_gx/source/xenon/README @@ -0,0 +1,7 @@ +This is a very early port to the xbox 360 using the libxenon library, +available from http://www.free60.org/wiki/Libxenon + +It doesn't yet have sound, a graphical menu, but will load the file +"SNES9XGX.SMC" from the first available USB storage device, and run that. + +Controls are using the first wired controller. diff --git a/plugins/snes9x_gx/source/xenon/ffs_content.c b/plugins/snes9x_gx/source/xenon/ffs_content.c new file mode 100644 index 00000000..47b0f006 --- /dev/null +++ b/plugins/snes9x_gx/source/xenon/ffs_content.c @@ -0,0 +1,45 @@ +static unsigned char content_datapspsu[] = { +0x10, 0x2a, 0x11, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x4b, +0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x30, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0xab, 0xab, 0x00, 0x04, 0x00, 0x0c, +0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, +0x40, 0x40, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0xab, 0xab, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x21, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0xf0, 0x50, 0x00, 0x01, 0x10, 0x02, 0x00, 0x00, 0x12, 0x00, 0xc4, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x03, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x01, +0x1f, 0x1f, 0xf6, 0x88, 0x00, 0x00, 0x40, 0x00, 0xc8, 0x0f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; +static unsigned char content_datavsvsu[] = { +0x10, 0x2a, 0x11, 0x01, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x23, +0xff, 0xfe, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x1c, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, +0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0xab, 0xab, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, +0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x21, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x90, +0x00, 0x10, 0x00, 0x03, 0x00, 0x30, 0x50, 0x04, 0x00, 0x00, 0xf0, 0x50, 0x00, 0x00, 0x10, 0x06, +0x30, 0x05, 0x20, 0x03, 0x00, 0x00, 0x12, 0x00, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x05, +0x00, 0x00, 0x12, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x06, 0x00, 0x00, 0x22, 0x00, +0x00, 0x00, 0x00, 0x00, 0x05, 0xf8, 0x10, 0x00, 0x00, 0x00, 0x06, 0x88, 0x00, 0x00, 0x00, 0x00, +0x05, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x06, 0x88, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x0f, 0x80, 0x3e, +0x00, 0x00, 0x00, 0x00, 0xe2, 0x01, 0x01, 0x00, 0xc8, 0x0f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + + +struct ffs_s +{ + const char *filename; + int size; + void *content; +} ffs_files[] = { + {"ps.psu", 224, content_datapspsu}, + {"vs.vsu", 240, content_datavsvsu}, + {0, 0, 0}, +}; diff --git a/plugins/snes9x_gx/source/xenon/filebrowser.h b/plugins/snes9x_gx/source/xenon/filebrowser.h new file mode 100644 index 00000000..e69de29b diff --git a/plugins/snes9x_gx/source/xenon/fileop.h b/plugins/snes9x_gx/source/xenon/fileop.h new file mode 100644 index 00000000..e69de29b diff --git a/plugins/snes9x_gx/source/xenon/freeze.cpp b/plugins/snes9x_gx/source/xenon/freeze.cpp new file mode 100644 index 00000000..15d86006 --- /dev/null +++ b/plugins/snes9x_gx/source/xenon/freeze.cpp @@ -0,0 +1,70 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "snes9x.h" +#include "memmap.h" +#include "soundux.h" +#include "snapshot.h" +#include "srtc.h" + +int +GetMem (char *buffer, int len) +{ + printf("%s:%d\n", __FILE__, __LINE__); while (1); +} + +void +NGCFreezeBlock (char *name, uint8 * block, int size) +{ + printf("%s:%d\n", __FILE__, __LINE__); while (1); +} + +/**************************************************************************** + * NGCFreezeMembuffer + * + * Copies a snapshot of Snes9x state into memory + ***************************************************************************/ +static int +NGCFreezeMemBuffer () +{ + printf("%s:%d\n", __FILE__, __LINE__); while (1); + + return 0; +} + + +/**************************************************************************** + * NGCFreezeGame + * + * Do freeze game for Nintendo Gamecube + ***************************************************************************/ +int +NGCFreezeGame (char * filepath, int method, bool silent) +{ + printf("%s:%d\n", __FILE__, __LINE__); while (1); +} + +int +NGCFreezeGameAuto (int method, bool silent) +{ + printf("%s:%d\n", __FILE__, __LINE__); while (1); +} + +/**************************************************************************** + * NGCUnFreezeBlock + ***************************************************************************/ +int +NGCUnFreezeBlock (char *name, uint8 * block, int size) +{ + printf("%s:%d\n", __FILE__, __LINE__); while (1); +} + +/**************************************************************************** + * NGCUnfreezeGame + ***************************************************************************/ +int +NGCUnfreezeGame (char * filepath, int method, bool silent) +{ + printf("%s:%d\n", __FILE__, __LINE__); while (1); +} diff --git a/plugins/snes9x_gx/source/xenon/freeze.h b/plugins/snes9x_gx/source/xenon/freeze.h new file mode 100644 index 00000000..e69de29b diff --git a/plugins/snes9x_gx/source/xenon/gccore.h b/plugins/snes9x_gx/source/xenon/gccore.h new file mode 100644 index 00000000..e69de29b diff --git a/plugins/snes9x_gx/source/xenon/main.cpp b/plugins/snes9x_gx/source/xenon/main.cpp new file mode 100644 index 00000000..065d732e --- /dev/null +++ b/plugins/snes9x_gx/source/xenon/main.cpp @@ -0,0 +1,382 @@ +#include <stdio.h> +#include <malloc.h> + +#include "s9xconfig.h" + +#include "snes9x.h" +#include "memmap.h" +#include "s9xdebug.h" +#include "cpuexec.h" +#include "ppu.h" +#include "apu.h" +#include "display.h" +#include "gfx.h" +#include "soundux.h" +#include "spc700.h" +#include "spc7110.h" +#include "controls.h" + +#include <console/console.h> +#include <diskio/diskio.h> +#include <xenos/xenos.h> +#include <xenon_sound/sound.h> +#include <xenon_soc/xenon_power.h> + +//#include "smc.h" + +#include "video.h" + +extern unsigned long SNESROMSize; + +extern void S9xInitSync(); + +void ExitApp(void) +{ + printf(" *** ExitApp\n"); + while (1); +} + +int ResetRequested = 1, ConfigRequested; + +extern "C" { + void usb_do_poll(void); + void kmem_init(void); + void usb_init(void); + +#include <input/input.h> +}; + +#include <stdint.h> +#include <unistd.h> +#include <fcntl.h> + +static inline uint32_t bswap_32(uint32_t t) +{ + return ((t & 0xFF) << 24) | ((t & 0xFF00) << 8) | ((t & 0xFF0000) >> 8) | ((t & 0xFF000000) >> 24); +} + +void +emulate () +{ + while(1) // emulation loop + { + int ctrl; + for (ctrl = 0; ctrl < 4; ++ctrl) + { + struct controller_data_s c; + if (get_controller_data(&c, ctrl)) + { + // printf("got controller data!\n"); + int offset = 0x10 + ctrl * 0x10; + // printf("a=%d, b=%d, x=%d, y=%d, lb=%d, rb=%d, start=%d, select=%d, up=%d, down=%d, left=%d, right=%d\n", + // c.a, c.b, c.x, c.y, c.lb, c.rb, c.start, c.select, c.up, c.down, c.left, c.right); + + S9xReportButton (offset + 0, c.b); + S9xReportButton (offset + 1, c.a); + S9xReportButton (offset + 2, c.x); + S9xReportButton (offset + 3, c.y); + + S9xReportButton (offset + 4, c.lb); + S9xReportButton (offset + 5, c.rb); + + S9xReportButton (offset + 6, c.start); + S9xReportButton (offset + 7, c.select); + + S9xReportButton (offset + 8, c.up); + S9xReportButton (offset + 9, c.down); + S9xReportButton (offset + 10, c.left); + S9xReportButton (offset + 11, c.right); + } + } + S9xMainLoop (); + + usb_do_poll(); + + if(ResetRequested) + { + S9xSoftReset (); // reset game + ResetRequested = 0; + } + if (ConfigRequested) + { + ConfigRequested = 0; + break; + } + + + /* this all isn't that great... */ + int sample_rate = 48000 * 2; + int samples_per_frame = Settings.PAL ? sample_rate / 50 : sample_rate / 60; + + int samples_guard = 16384; + + if (xenon_sound_get_unplayed() < samples_guard) + { + so.samples_mixed_so_far = so.play_position = 0; + + unsigned char buffer[2048]; + +#if 0 + int req_samples = xenon_sound_get_unplayed(); + if ((req_samples + samples_per_frame) < samples_guard) + req_samples = samples_guard + samples_per_frame; + else + req_samples = samples_per_frame; +#endif + int req_samples = samples_per_frame; + + S9xMixSamples(buffer, req_samples); + + int i; + for (i = 0; i < req_samples * 2; i += 4) + *(int*)(buffer + i) = bswap_32(*(int*)(buffer + i)); + xenon_sound_submit(buffer, req_samples * 2); + + } + + + } // main loop +} + +#define ASSIGN_BUTTON_TRUE( keycode, snescmd ) \ + S9xMapButton( keycode, cmd = S9xGetCommandT(snescmd), true) + +#define ASSIGN_BUTTON_FALSE( keycode, snescmd ) \ + S9xMapButton( keycode, cmd = S9xGetCommandT(snescmd), false) + +void SetDefaultButtonMap () +{ + int maxcode = 0x10; + s9xcommand_t cmd; + + /*** Joypad 1 ***/ + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad1 A"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad1 B"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad1 X"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad1 Y"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad1 L"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad1 R"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad1 Start"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad1 Select"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad1 Up"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad1 Down"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad1 Left"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad1 Right"); + + maxcode = 0x20; + /*** Joypad 2 ***/ + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad2 A"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad2 B"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad2 X"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad2 Y"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad2 L"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad2 R"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad2 Start"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad2 Select"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad2 Up"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad2 Down"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad2 Left"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad2 Right"); + + maxcode = 0x30; + /*** Joypad 3 ***/ + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad3 A"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad3 B"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad3 X"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad3 Y"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad3 L"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad3 R"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad3 Start"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad3 Select"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad3 Up"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad3 Down"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad3 Left"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad3 Right"); + + maxcode = 0x40; + /*** Joypad 4 ***/ + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad4 A"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad4 B"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad4 X"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad4 Y"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad4 L"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad4 R"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad4 Start"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad4 Select"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad4 Up"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad4 Down"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad4 Left"); + ASSIGN_BUTTON_FALSE (maxcode++, "Joypad4 Right"); + + maxcode = 0x50; + /*** Superscope ***/ + ASSIGN_BUTTON_FALSE (maxcode++, "Superscope Fire"); + ASSIGN_BUTTON_FALSE (maxcode++, "Superscope AimOffscreen"); + ASSIGN_BUTTON_FALSE (maxcode++, "Superscope Cursor"); + ASSIGN_BUTTON_FALSE (maxcode++, "Superscope ToggleTurbo"); + ASSIGN_BUTTON_FALSE (maxcode++, "Superscope ToggleTurbo"); + ASSIGN_BUTTON_FALSE (maxcode++, "Superscope Pause"); + + maxcode = 0x60; + /*** Mouse ***/ + ASSIGN_BUTTON_FALSE (maxcode++, "Mouse1 L"); + ASSIGN_BUTTON_FALSE (maxcode++, "Mouse1 R"); + ASSIGN_BUTTON_FALSE (maxcode++, "Mouse2 L"); + ASSIGN_BUTTON_FALSE (maxcode++, "Mouse2 R"); + + maxcode = 0x70; + /*** Justifier ***/ + ASSIGN_BUTTON_FALSE (maxcode++, "Justifier1 Trigger"); + ASSIGN_BUTTON_FALSE (maxcode++, "Justifier1 AimOffscreen"); + ASSIGN_BUTTON_FALSE (maxcode++, "Justifier1 Start"); + ASSIGN_BUTTON_FALSE (maxcode++, "Justifier2 Trigger"); + ASSIGN_BUTTON_FALSE (maxcode++, "Justifier2 AimOffscreen"); + ASSIGN_BUTTON_FALSE (maxcode++, "Justifier2 Start"); + + maxcode = 0x80; + S9xMapPointer(maxcode++, S9xGetCommandT("Pointer Superscope"), false); + S9xMapPointer(maxcode++, S9xGetCommandT("Pointer Mouse1"), false); + S9xMapPointer(maxcode++, S9xGetCommandT("Pointer Mouse2"), false); + S9xMapPointer(maxcode++, S9xGetCommandT("Pointer Justifier1"), false); + S9xMapPointer(maxcode++, S9xGetCommandT("Pointer Justifier2"), false); + + maxcode = 0x90; + ASSIGN_BUTTON_FALSE (maxcode++, "Screenshot"); + + // Plugin 2 Joypads by default + S9xSetController (0, CTL_JOYPAD, 0, 0, 0, 0); + S9xSetController (1, CTL_JOYPAD, 1, 0, 0, 0); + S9xVerifyControllers(); +} + + +int main(void) +{ + extern void xenos_init(); + xenos_init(); + console_init(); + + xenon_thread_startup(); + xenon_make_it_faster(XENON_SPEED_FULL); + xenon_sleep_thread(1); + xenon_sleep_thread(2); + xenon_sleep_thread(3); + xenon_sleep_thread(4); + xenon_sleep_thread(5); + + printf("SNES9x GX\n"); + + kmem_init(); + usb_init(); + // Set defaults + DefaultSettings (); + + S9xUnmapAllControls (); + SetDefaultButtonMap (); + + // Allocate SNES Memory + if (!Memory.Init ()) + ExitApp(); + + // Allocate APU + if (!S9xInitAPU ()) + ExitApp(); + + // Set Pixel Renderer to match 565 + S9xSetRenderPixelFormat (RGB565); + + // Initialise Snes Sound System + S9xInitSound (5, TRUE, 1024); + + // Initialise Graphics + +// setGFX (); + videoInit(); + + if (!S9xGraphicsInit ()) + ExitApp(); + + S9xSetSoundMute (TRUE); + S9xInitSync(); // initialize frame sync + + // Plugin 2 Joypads by default + S9xSetController (0, CTL_JOYPAD, 0, 0, 0, 0); + S9xSetController (1, CTL_JOYPAD, 1, 0, 0, 0); + S9xVerifyControllers(); + + printf("Waiting for USB storage...\n"); + + extern void xenos_init(); + int fd; + + do { + usb_do_poll(); + + fd = open("uda:/SNES9X.SMC", O_RDONLY); + } while (fd < 0); + + struct stat stat; + fstat(fd, &stat); + + SNESROMSize = stat.st_size; + if (read(fd, Memory.ROM, SNESROMSize) != SNESROMSize) + { + printf("Failed to read rom\n"); + while (1); + } + +// memcpy(Memory.ROM, smc, SNESROMSize = sizeof(smc)); + + Memory.LoadROM ("BLANK.SMC"); + Memory.LoadSRAM ("BLANK"); + + console_close(); + + emulate(); // main loop + + while (1); + return 0; +} + +extern "C" { + +char* getcwd(char*, size_t) +{ + return 0; +} + +int chdir(const char *f) +{ + return -1; +} + + +uid_t getuid(void) +{ + return 0; +} + +gid_t getgid(void) +{ + return 0; +} + +int chown(const char*, uid_t, gid_t) +{ +} + +int stat(const char*, struct stat*) +{ + return -1; +} + +int unlink(const char*) +{ + return -1; +} + +void gettimeofday() +{ +} + +} diff --git a/plugins/snes9x_gx/source/xenon/png.h b/plugins/snes9x_gx/source/xenon/png.h new file mode 100644 index 00000000..e69de29b diff --git a/plugins/snes9x_gx/source/xenon/pngu/pngu.h b/plugins/snes9x_gx/source/xenon/pngu/pngu.h new file mode 100644 index 00000000..e69de29b diff --git a/plugins/snes9x_gx/source/xenon/s9xconfig.cpp b/plugins/snes9x_gx/source/xenon/s9xconfig.cpp new file mode 100644 index 00000000..61567eb4 --- /dev/null +++ b/plugins/snes9x_gx/source/xenon/s9xconfig.cpp @@ -0,0 +1,159 @@ +/**************************************************************************** + * Snes9x 1.51 Nintendo Wii/Gamecube Port + * + * softdev July 2006 + * crunchy2 May 2007 + * Michniewski 2008 + * Tantric 2008-2009 + * + * s9xconfig.cpp + * + * Configuration parameters are here for easy maintenance. + * Refer to Snes9x.h for all combinations. + * The defaults used here are taken directly from porting.html + ***************************************************************************/ + +#include "snes9x.h" + +// struct SGCSettings GCSettings; + +/**************************************************************************** + * FixInvalidSettings + * + * Attempts to correct at least some invalid settings - the ones that + * might cause crashes + ***************************************************************************/ +void FixInvalidSettings() +{ + +/* if(!(GCSettings.ZoomLevel > 0.5 && GCSettings.ZoomLevel < 1.5)) + GCSettings.ZoomLevel = 1.0; + if(!(GCSettings.xshift > -50 && GCSettings.xshift < 50)) + GCSettings.xshift = 0; + if(!(GCSettings.yshift > -50 && GCSettings.yshift < 50)) + GCSettings.yshift = 0; + if(!(GCSettings.MusicVolume >= 0 && GCSettings.MusicVolume <= 100)) + GCSettings.MusicVolume = 40; + if(!(GCSettings.SFXVolume >= 0 && GCSettings.SFXVolume <= 100)) + GCSettings.SFXVolume = 40; + if(GCSettings.Controller > CTRL_PAD4 || GCSettings.Controller < CTRL_MOUSE) + GCSettings.Controller = CTRL_PAD2; + if(!(GCSettings.render >= 0 && GCSettings.render < 3)) + GCSettings.render = 2; + if(!(GCSettings.videomode >= 0 && GCSettings.videomode < 5)) + GCSettings.videomode = 0; */ +} + +/**************************************************************************** + * DefaultSettings + * + * Sets all the defaults! + ***************************************************************************/ +void +DefaultSettings () +{ +#if 0 + /************** GameCube/Wii Settings *********************/ + ResetControls(); // controller button mappings + + GCSettings.LoadMethod = METHOD_AUTO; // Auto, SD, DVD, USB, Network (SMB) + GCSettings.SaveMethod = METHOD_AUTO; // Auto, SD, Memory Card Slot A, Memory Card Slot B, USB, Network (SMB) + sprintf (GCSettings.LoadFolder,"snes9x/roms"); // Path to game files + sprintf (GCSettings.SaveFolder,"snes9x/saves"); // Path to save files + sprintf (GCSettings.CheatFolder,"snes9x/cheats"); // Path to cheat files + GCSettings.AutoLoad = 1; + GCSettings.AutoSave = 1; + + GCSettings.VerifySaves = 0; + + // custom SMB settings + strncpy (GCSettings.smbip, "", 15); // IP Address of share server + strncpy (GCSettings.smbuser, "", 19); // Your share user + strncpy (GCSettings.smbpwd, "", 19); // Your share user password + strncpy (GCSettings.smbshare, "", 19); // Share name on server + + GCSettings.smbip[15] = 0; + GCSettings.smbuser[19] = 0; + GCSettings.smbpwd[19] = 0; + GCSettings.smbshare[19] = 0; + + GCSettings.Controller = CTRL_PAD2; + + GCSettings.videomode = 0; // automatic video mode detection + GCSettings.ZoomLevel = 1.0; // zoom level + GCSettings.render = 2; // Unfiltered + GCSettings.widescreen = 0; // no aspect ratio correction + GCSettings.FilterMethod = FILTER_NONE; // no hq2x + + GCSettings.xshift = 0; // horizontal video shift + GCSettings.yshift = 0; // vertical video shift + + GCSettings.WiimoteOrientation = 0; + GCSettings.ExitAction = 0; + GCSettings.MusicVolume = 40; + GCSettings.SFXVolume = 40; + GCSettings.Rumble = 1; +#endif + + /****************** SNES9x Settings ***********************/ + + // Default ALL to false + memset (&Settings, 0, sizeof (Settings)); + + // General + + Settings.MouseMaster = false; + Settings.SuperScopeMaster = false; + Settings.MultiPlayer5Master = false; + Settings.JustifierMaster = false; + Settings.ShutdownMaster = true; // needs to be on for ActRaiser 2 + Settings.ApplyCheats = true; + + Settings.BlockInvalidVRAMAccess = false; + Settings.HDMATimingHack = 100; + + // Sound defaults. On GC this is 32Khz/16bit/Stereo/InterpolatedSound + Settings.APUEnabled = true; + Settings.NextAPUEnabled = true; + Settings.SoundPlaybackRate = 32000; + Settings.Stereo = true; + Settings.SixteenBitSound = true; + Settings.SoundEnvelopeHeightReading = true; + Settings.SoundSync = true; + Settings.FixFrequency = false; + Settings.DisableSampleCaching = true; + Settings.InterpolatedSound = true; + Settings.ReverseStereo = true; + + // Graphics + Settings.Transparency = true; + Settings.SupportHiRes = true; + Settings.SkipFrames = AUTO_FRAMERATE; + Settings.TurboSkipFrames = 19; + Settings.DisplayFrameRate = false; + Settings.AutoDisplayMessages = 0; + Settings.InitialInfoStringTimeout = 200; // # frames to display messages for + + // Frame timings in 50hz and 60hz cpu mode + Settings.FrameTimePAL = 20000; + Settings.FrameTimeNTSC = 16667; + + // SDD1 - Star Ocean Returns + Settings.SDD1Pack = true; + + Settings.ForceNTSC = 0; + Settings.ForcePAL = 0; + Settings.ForceHiROM = 0; + Settings.ForceLoROM = 0; + Settings.ForceHeader = 0; + Settings.ForceNoHeader = 0; + Settings.ForceTransparency = 0; + Settings.ForceInterleaved = 0; + Settings.ForceInterleaved2 = 0; + Settings.ForceInterleaveGD24 = 0; + Settings.ForceNotInterleaved = 0; + Settings.ForceNoSuperFX = 0; + Settings.ForceSuperFX = 0; + Settings.ForceDSP1 = 0; + Settings.ForceNoDSP1 = 0; +} diff --git a/plugins/snes9x_gx/source/xenon/s9xconfig.h b/plugins/snes9x_gx/source/xenon/s9xconfig.h new file mode 100644 index 00000000..d2551086 --- /dev/null +++ b/plugins/snes9x_gx/source/xenon/s9xconfig.h @@ -0,0 +1,22 @@ +/**************************************************************************** + * Snes9x 1.51 Nintendo Wii/Gamecube Port + * + * softdev July 2006 + * crunchy2 May 2007 + * Michniewski 2008 + * Tantric 2008-2009 + * + * s9xconfig.h + * + * Configuration parameters are here for easy maintenance. + * Refer to Snes9x.h for all combinations. + * The defaults used here are taken directly from porting.html + ***************************************************************************/ + +#ifndef _S9XCONFIG_ +#define _S9XCONFIG_ + +void FixInvalidSettings(); +void DefaultSettings(); + +#endif diff --git a/plugins/snes9x_gx/source/xenon/s9xsupport.cpp b/plugins/snes9x_gx/source/xenon/s9xsupport.cpp new file mode 100644 index 00000000..0e5fe64c --- /dev/null +++ b/plugins/snes9x_gx/source/xenon/s9xsupport.cpp @@ -0,0 +1,288 @@ +#include "snes9x.h" +#include "memmap.h" +#include "s9xdebug.h" +#include "cpuexec.h" +#include "ppu.h" +#include "apu.h" +#include "display.h" +#include "gfx.h" +#include "soundux.h" +#include "spc700.h" +#include "spc7110.h" +#include "controls.h" + +#include "video.h" + + +#include <time/time.h> +#include <ppc/timebase.h> +#include <xenon_sound/sound.h> + +int FrameTimer, timerstyle = 1; +unsigned long long prev, now; + +unsigned long long gettime(void) +{ + return mftb(); +} + +int diff_usec(unsigned long long prev, unsigned long long now) +{ + return (now - prev) /(PPC_TIMEBASE_FREQ/1000000); +} + + +extern void S9xSetInfoString (const char *string); + +/*** Miscellaneous Functions ***/ +void S9xMessage(int /*type */, int /*number */, const char *message) +{ +#define MAX_MESSAGE_LEN (36 * 3) + + static char buffer[MAX_MESSAGE_LEN + 1]; + strncpy(buffer, message, MAX_MESSAGE_LEN); + buffer[MAX_MESSAGE_LEN] = 0; + S9xSetInfoString(buffer); +} + +void S9xExit() +{ + printf(" *** EXIT\n"); + while (1); +} + +/*** File based functions ***/ +const char * +S9xChooseFilename(bool8 read_only) +{ + return NULL; +} + +const char * +S9xChooseMovieFilename(bool8 read_only) +{ + return NULL; +} + +const char * +S9xGetDirectory(enum s9x_getdirtype dirtype) +{ + return NULL; +} + +const char * +S9xGetFilename(const char *ex, enum s9x_getdirtype dirtype) +{ + return NULL; +} + +const char * +S9xGetFilenameInc(const char *e, enum s9x_getdirtype dirtype) +{ + return NULL; +} + +/*** Memory based functions ***/ +void S9xAutoSaveSRAM() +{ + +} + +/*** Sound based functions ***/ +void S9xToggleSoundChannel(int c) +{ + if (c == 8) + so.sound_switch = 255; + else + so.sound_switch ^= 1 << c; + S9xSetSoundControl(so.sound_switch); +} + +/**************************************************************************** + * OpenSoundDevice + * + * Main initialisation for NGC sound system + ***************************************************************************/ +bool8 S9xOpenSoundDevice(int mode, bool8 stereo, int buffer_size) +{ + so.stereo = TRUE; + so.playback_rate = 48000; + so.sixteen_bit = TRUE; + so.encoded = 0; + so.buffer_size = 4096; + so.sound_switch = 255; + S9xSetPlaybackRate(so.playback_rate); + +// init audio + + xenon_sound_init(); + + return TRUE; +} + +/*** Deprecated function. NGC uses threaded sound ***/ +void S9xGenerateSound() +{ +} + +/* eke-eke */ +void S9xInitSync() +{ + FrameTimer = 0; + prev = gettime(); +} + +/*** Synchronisation ***/ + +void S9xSyncSpeed () +{ + uint32 skipFrms = Settings.SkipFrames; + + if (Settings.TurboMode) + skipFrms = Settings.TurboSkipFrames; + + if (timerstyle == 0) /* use NGC vertical sync (VSYNC) with NTSC roms */ + { + while (FrameTimer == 0) + { + udelay(50); + } + + if (FrameTimer > skipFrms) + FrameTimer = skipFrms; + + if ((FrameTimer > 1) && (IPPU.SkippedFrames < skipFrms)) + { + IPPU.SkippedFrames++; + IPPU.RenderThisFrame = FALSE; + } + else + { + IPPU.SkippedFrames = 0; + IPPU.RenderThisFrame = TRUE; + } + } + else /* use internal timer for PAL roms */ + { + unsigned int timediffallowed = Settings.TurboMode ? 0 : Settings.FrameTime; + now = gettime(); + + if (diff_usec(prev, now) > timediffallowed) + { + printf("L\n"); + /* Timer has already expired */ + if (IPPU.SkippedFrames < skipFrms) + { + IPPU.SkippedFrames++; + IPPU.RenderThisFrame = FALSE; + } + else + { + IPPU.SkippedFrames = 0; + IPPU.RenderThisFrame = TRUE; + } + } + else + { + /*** Ahead - so hold up ***/ + while (diff_usec(prev, now) < timediffallowed) + { + now = gettime(); + udelay(50); + } + IPPU.RenderThisFrame = TRUE; + IPPU.SkippedFrames = 0; + } + + prev = now; + } + + if (!Settings.TurboMode) + FrameTimer--; + return; +} + +/*** Video / Display related functions ***/ +bool8 S9xInitUpdate() +{ + return (TRUE); +} + +bool8 S9xDeinitUpdate(int Width, int Height) +{ +// update_video(Width, Height); + videoBlit(Width, Height); + return (TRUE); +} + +bool8 S9xContinueUpdate(int Width, int Height) +{ + return (TRUE); +} + +void S9xSetPalette() +{ + return; +} + +/*** Input functions ***/ +void S9xHandlePortCommand(s9xcommand_t cmd, int16 data1, int16 data2) +{ + return; +} + +bool S9xPollButton(uint32 id, bool * pressed) +{ + return 0; +} + +bool S9xPollAxis(uint32 id, int16 * value) +{ + return 0; +} + +bool S9xPollPointer(uint32 id, int16 * x, int16 * y) +{ + return 0; +} + +void S9xLoadSDD1Data() +{ + Memory.FreeSDD1Data(); + + Settings.SDD1Pack = FALSE; + + if (strncmp(Memory.ROMName, "Star Ocean", 10) == 0) + Settings.SDD1Pack = TRUE; + + if (strncmp(Memory.ROMName, "STREET FIGHTER ALPHA2", 21) == 0) + Settings.SDD1Pack = TRUE; + + return; +} + +/**************************************************************************** + * Note that these are DUMMY functions, and only allow Snes9x to + * compile. Where possible, they will return an error signal. + ***************************************************************************/ + +/*** splitpath function ***/ +void _splitpath(char const *buffer, char *drive, char *dir, char *fname, + char *ext) +{ + return; // Do nothing - NGC code should NEVER call a function which relies on it +} + +void _makepath(char *filename, const char *drive, const char *dir, + const char *fname, const char *ext) +{ + return; // Do nothing - NGC code should NEVER call a function which relies on it +} + +char * +S9xBasename(char *name) +{ + return name; +} + +unsigned long SNESROMSize = 0; diff --git a/plugins/snes9x_gx/source/xenon/snes9xGX.h b/plugins/snes9x_gx/source/xenon/snes9xGX.h new file mode 100644 index 00000000..e69de29b diff --git a/plugins/snes9x_gx/source/xenon/video.cpp b/plugins/snes9x_gx/source/xenon/video.cpp new file mode 100644 index 00000000..43a458ae --- /dev/null +++ b/plugins/snes9x_gx/source/xenon/video.cpp @@ -0,0 +1,160 @@ +#include <xenos/xe.h> +#include <stdio.h> + +#include "gfx.h" + +extern "C" void do_edram_foo(struct XenosDevice *xe, int complete); + +struct XenosSurface *gfxplane; +struct XenosDevice _xe, *xe; +struct XenosShader *sh_ps, *sh_vs; +struct XenosVertexBuffer *vb; +struct XenosIndexBuffer *ib; + +static unsigned char content_datapspsu[] = { +0x10, 0x2a, 0x11, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x4b, +0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x30, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0xab, 0xab, 0x00, 0x04, 0x00, 0x0c, +0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, +0x40, 0x40, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0xab, 0xab, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x21, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0xf0, 0x50, 0x00, 0x01, 0x10, 0x02, 0x00, 0x00, 0x12, 0x00, 0xc4, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x03, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x01, +0x1f, 0x1f, 0xf6, 0x88, 0x00, 0x00, 0x40, 0x00, 0xc8, 0x0f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char content_datavsvsu[] = { +0x10, 0x2a, 0x11, 0x01, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x23, +0xff, 0xfe, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x1c, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, +0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0xab, 0xab, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, +0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x21, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x90, +0x00, 0x10, 0x00, 0x03, 0x00, 0x30, 0x50, 0x04, 0x00, 0x00, 0xf0, 0x50, 0x00, 0x00, 0x10, 0x06, +0x30, 0x05, 0x20, 0x03, 0x00, 0x00, 0x12, 0x00, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x05, +0x00, 0x00, 0x12, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x06, 0x00, 0x00, 0x22, 0x00, +0x00, 0x00, 0x00, 0x00, 0x05, 0xf8, 0x10, 0x00, 0x00, 0x00, 0x06, 0x88, 0x00, 0x00, 0x00, 0x00, +0x05, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x06, 0x88, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x0f, 0x80, 0x3e, +0x00, 0x00, 0x00, 0x00, 0xe2, 0x01, 0x01, 0x00, 0xc8, 0x0f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +void videoInit(void) +{ + xe = &_xe; + /* initialize the GPU */ + Xe_Init(xe); + + gfxplane = Xe_CreateTexture(xe, MAX_SNES_WIDTH, MAX_SNES_HEIGHT, 1, 4 | 0x40, 0); + + GFX.Screen = (uint16*)(((unsigned char*)gfxplane->base) + gfxplane->pitch * 2 + 2 * 2); + GFX.Pitch = gfxplane->pitch; + + /* create a render target (the framebuffer) */ + struct XenosSurface *fb = Xe_GetFramebufferSurface(xe); + Xe_SetRenderTarget(xe, fb); + + printf("framebuffer at: %p, pitch %d\n", fb->base, fb->pitch); + + /* let's define a vertex buffer format */ + static const struct XenosVBFFormat vbf = + { + 2, { + {XE_USAGE_POSITION, 0, XE_TYPE_FLOAT2}, + {XE_USAGE_TEXCOORD, 0, XE_TYPE_FLOAT2}, + } + }; + + float rect[] = { + -1, 1, 0, 0, + -1, -1, 0, 1, + 1, 1, 1, 0, + 1, -1, 1, 1 + }; + + unsigned short rect_indices[] = {0, 2, 1, 1, 2, 3}; + + printf("loading pixel shader...\n"); + /* load pixel shader */ + sh_ps = Xe_LoadShaderFromMemory(xe, content_datapspsu); + Xe_InstantiateShader(xe, sh_ps, 0); + + printf("loading vertex shader...\n"); + /* load vertex shader */ + sh_vs = Xe_LoadShaderFromMemory(xe, content_datavsvsu); + Xe_InstantiateShader(xe, sh_vs, 0); + Xe_ShaderApplyVFetchPatches(xe, sh_vs, 0, &vbf); + + printf("create vb...\n"); + /* create and fill vertex buffer */ + vb = Xe_CreateVertexBuffer(xe, sizeof(rect)); + void *v = Xe_VB_Lock(xe, vb, 0, sizeof(rect), XE_LOCK_WRITE); + memcpy(v, rect, sizeof(rect)); + Xe_VB_Unlock(xe, vb); + + printf("create ib...\n"); + /* create and fill index buffer */ + ib = Xe_CreateIndexBuffer(xe, sizeof(rect_indices), XE_FMT_INDEX16); + unsigned short *i = (unsigned short*)Xe_IB_Lock(xe, ib, 0, sizeof(rect_indices), XE_LOCK_WRITE); + memcpy(i, rect_indices, sizeof(rect_indices)); + Xe_IB_Unlock(xe, ib); + + do_edram_foo(xe, 1); +} + + +/* void waitVBlank(void) +{ + while (!Xe_IsVBlank(xe)); +} */ + +void videoBlit(int xres, int yres) +{ + /* flush cache */ + Xe_Surface_LockRect(xe, gfxplane, 0, 0, 0, 0, XE_LOCK_WRITE); + Xe_Surface_Unlock(xe, gfxplane); + + + /* we don't want the border. Note that because of interpolation, some fractional pixel values might get through. */ + float *v = (float*)Xe_VB_Lock(xe, vb, 0, 16*4, XE_LOCK_WRITE); + v[2] = v[6] = 2.0 / xres; + v[3] = v[11] = 2.0 / yres; + Xe_VB_Unlock(xe, vb); + + /* create new surface with right size */ + XenosSurface surface = *gfxplane; + surface.width = xres; + surface.height = yres; + /* begin a new frame, i.e. reset all renderstates to the default */ + Xe_InvalidateState(xe); + + int max_vertices = 4; + int nr_primitives = 2; + + /* draw cube */ + Xe_SetShader(xe, SHADER_TYPE_PIXEL, sh_ps, 0); + Xe_SetShader(xe, SHADER_TYPE_VERTEX, sh_vs, 0); + Xe_SetStreamSource(xe, 0, vb, 0, 4); /* using this vertex buffer */ + Xe_SetIndices(xe, ib); /* ... this index buffer... */ + Xe_SetTexture(xe, 0, &surface); /* ... and this texture */ + Xe_DrawIndexedPrimitive(xe, XE_PRIMTYPE_TRIANGLELIST, 0, 0, max_vertices, 0, nr_primitives); + + /* clear to white */ + Xe_SetClearColor(xe, ~0); + +// waitVBlank(); + + /* resolve (and clear) */ + Xe_Resolve(xe); + + /* wait for render finish */ + Xe_Sync(xe); +} + diff --git a/plugins/snes9x_gx/source/xenon/video.h b/plugins/snes9x_gx/source/xenon/video.h new file mode 100644 index 00000000..9f0111a7 --- /dev/null +++ b/plugins/snes9x_gx/source/xenon/video.h @@ -0,0 +1,4 @@ + +void videoInit(void); +void videoBlit(int xres, int yres); + diff --git a/plugins/snes9x_gx/update.xml b/plugins/snes9x_gx/update.xml new file mode 100644 index 00000000..258cb9d1 --- /dev/null +++ b/plugins/snes9x_gx/update.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<app version="4.3.4"> +<file url="http://snes9x-gx.googlecode.com/files/Snes9x%20GX%204.3.2.zip"></file> +</app> diff --git a/plugins/snes9x_gx/wfsnesplugin.pnproj b/plugins/snes9x_gx/wfsnesplugin.pnproj new file mode 100644 index 00000000..150aeb31 --- /dev/null +++ b/plugins/snes9x_gx/wfsnesplugin.pnproj @@ -0,0 +1 @@ +<Project name="wfsnesplugin"><MagicFolder excludeFolders="CVS;.svn;build_wii;executables;hbc" filter="*" name="snes" path=""><MagicFolder excludeFolders="CVS;.svn;build_wii;executables;hbc" filter="*" name="portlibs" path="portlibs\"><MagicFolder excludeFolders="CVS;.svn;build_wii;executables;hbc" filter="*" name="include" path="include\"><MagicFolder excludeFolders="CVS;.svn;build_wii;executables;hbc" filter="*" name="freetype2" path="freetype2\"><MagicFolder excludeFolders="CVS;.svn;build_wii;executables;hbc" filter="*" name="freetype" path="freetype\"><MagicFolder excludeFolders="CVS;.svn;build_wii;executables;hbc" filter="*" name="config" path="config\"><File path="ftconfig.h"></File><File path="ftheader.h"></File><File path="ftmodule.h"></File><File path="ftoption.h"></File><File path="ftstdlib.h"></File></MagicFolder><File path="freetype.h"></File><File path="ftadvanc.h"></File><File path="ftbbox.h"></File><File path="ftbdf.h"></File><File path="ftbitmap.h"></File><File path="ftcache.h"></File><File path="ftchapters.h"></File><File path="ftcid.h"></File><File path="fterrdef.h"></File><File path="fterrors.h"></File><File path="ftgasp.h"></File><File path="ftglyph.h"></File><File path="ftgxval.h"></File><File path="ftgzip.h"></File><File path="ftimage.h"></File><File path="ftincrem.h"></File><File path="ftlcdfil.h"></File><File path="ftlist.h"></File><File path="ftlzw.h"></File><File path="ftmac.h"></File><File path="ftmm.h"></File><File path="ftmodapi.h"></File><File path="ftmoderr.h"></File><File path="ftotval.h"></File><File path="ftoutln.h"></File><File path="ftpfr.h"></File><File path="ftrender.h"></File><File path="ftsizes.h"></File><File path="ftsnames.h"></File><File path="ftstroke.h"></File><File path="ftsynth.h"></File><File path="ftsystem.h"></File><File path="fttrigon.h"></File><File path="fttypes.h"></File><File path="ftwinfnt.h"></File><File path="ftxf86.h"></File><File path="t1tables.h"></File><File path="ttnameid.h"></File><File path="tttables.h"></File><File path="tttags.h"></File><File path="ttunpat.h"></File></MagicFolder></MagicFolder><MagicFolder excludeFolders="CVS;.svn;build_wii;executables;hbc" filter="*" name="libunrar" path="libunrar\"><File path="archive.hpp"></File><File path="array.hpp"></File><File path="cmddata.hpp"></File><File path="coder.hpp"></File><File path="compress.hpp"></File><File path="consio.hpp"></File><File path="crc.hpp"></File><File path="crypt.hpp"></File><File path="dll.hpp"></File><File path="encname.hpp"></File><File path="errhnd.hpp"></File><File path="extinfo.hpp"></File><File path="extract.hpp"></File><File path="filcreat.hpp"></File><File path="file.hpp"></File><File path="filefn.hpp"></File><File path="filestr.hpp"></File><File path="find.hpp"></File><File path="getbits.hpp"></File><File path="global.hpp"></File><File path="headers.hpp"></File><File path="isnt.hpp"></File><File path="list.hpp"></File><File path="loclang.hpp"></File><File path="log.hpp"></File><File path="match.hpp"></File><File path="model.hpp"></File><File path="options.hpp"></File><File path="os.hpp"></File><File path="pathfn.hpp"></File><File path="rar.hpp"></File><File path="rardefs.hpp"></File><File path="rarlang.hpp"></File><File path="raros.hpp"></File><File path="rartypes.hpp"></File><File path="rarvm.hpp"></File><File path="rawread.hpp"></File><File path="rdwrfn.hpp"></File><File path="recvol.hpp"></File><File path="resource.hpp"></File><File path="rijndael.hpp"></File><File path="rs.hpp"></File><File path="savepos.hpp"></File><File path="scantree.hpp"></File><File path="sha1.hpp"></File><File path="smallfn.hpp"></File><File path="strfn.hpp"></File><File path="strlist.hpp"></File><File path="suballoc.hpp"></File><File path="system.hpp"></File><File path="timefn.hpp"></File><File path="ulinks.hpp"></File><File path="unicode.hpp"></File><File path="unpack.hpp"></File><File path="version.hpp"></File><File path="volume.hpp"></File></MagicFolder><MagicFolder excludeFolders="CVS;.svn;build_wii;executables;hbc" filter="*" name="mupdf" path="mupdf\"><File path="fitz.h"></File><File path="fitz_base.h"></File><File path="fitz_draw.h"></File><File path="fitz_res.h"></File><File path="fitz_stream.h"></File><File path="mupdf.h"></File><File path="pdftool.h"></File></MagicFolder><MagicFolder excludeFolders="CVS;.svn;build_wii;executables;hbc" filter="*" name="sevenzip" path="sevenzip\"><File path="7zAlloc.h"></File><File path="7zBuf.h"></File><File path="7zCrc.h"></File><File path="7zDecode.h"></File><File path="7zExtract.h"></File><File path="7zFile.h"></File><File path="7zHeader.h"></File><File path="7zIn.h"></File><File path="7zItem.h"></File><File path="7zVersion.h"></File><File path="Bcj2.h"></File><File path="Bra.h"></File><File path="CpuArch.h"></File><File path="LzmaDec.h"></File><File path="Types.h"></File></MagicFolder><MagicFolder excludeFolders="CVS;.svn;build_wii;executables;hbc" filter="*" name="tremor" path="tremor\"><File path="config_types.h"></File><File path="ivorbiscodec.h"></File><File path="ivorbisfile.h"></File><File path="ogg.h"></File><File path="os_types.h"></File></MagicFolder><MagicFolder excludeFolders="CVS;.svn;build_wii;executables;hbc" filter="*" name="wupc" path="wupc\"><File path="wupc.h"></File></MagicFolder><MagicFolder excludeFolders="CVS;.svn;build_wii;executables;hbc" filter="*" name="zip" path="zip\"><File path="ioapi.h"></File><File path="unzip.h"></File><File path="zip.h"></File></MagicFolder><File path="ext2.h"></File><File path="ft2build.h"></File><File path="gd.h"></File><File path="gdfx.h"></File><File path="gd_io.h"></File><File path="jconfig.h"></File><File path="jerror.h"></File><File path="jmorecfg.h"></File><File path="jpeglib.h"></File><File path="mxml.h"></File><File path="nfs.h"></File><File path="ntfs.h"></File><File path="png.h"></File><File path="pngconf.h"></File><File path="pnglibconf.h"></File><File path="tiff.h"></File><File path="tiffconf.h"></File><File path="tiffio.h"></File><File path="tiffvers.h"></File><File path="tif_config.h"></File><File path="zconf.h"></File><File path="zlib.h"></File></MagicFolder><MagicFolder excludeFolders="CVS;.svn;build_wii;executables;hbc" filter="*" name="lib" path="lib\"><File path="libext2fs.a"></File><File path="libfreetype.a"></File><File path="libgd.a"></File><File path="libjpeg.a"></File><File path="libmupdf.a"></File><File path="libmxml.a"></File><File path="libnfs.a"></File><File path="libntfs.a"></File><File path="libpng.a"></File><File path="libsevenzip.a"></File><File path="libtiff.a"></File><File path="libunrar.a"></File><File path="libvorbisidec.a"></File><File path="libwupc.a"></File><File path="libz.a"></File><File path="libzip.a"></File></MagicFolder></MagicFolder><MagicFolder excludeFolders="CVS;.svn;build_wii;executables;hbc" filter="*" name="source" path="source\"><MagicFolder excludeFolders="CVS;.svn;build_wii;executables;hbc" filter="*" name="fonts" path="fonts\"><File path="font.ttf"></File></MagicFolder><MagicFolder excludeFolders="CVS;.svn;build_wii;executables;hbc" filter="*" name="gui" path="gui\"><File path="gui.h"></File><File path="gui_button.cpp"></File><File path="gui_element.cpp"></File><File path="gui_filebrowser.cpp"></File><File path="gui_image.cpp"></File><File path="gui_imagedata.cpp"></File><File path="gui_keyboard.cpp"></File><File path="gui_optionbrowser.cpp"></File><File path="gui_savebrowser.cpp"></File><File path="gui_sound.cpp"></File><File path="gui_text.cpp"></File><File path="gui_trigger.cpp"></File><File path="gui_window.cpp"></File></MagicFolder><MagicFolder excludeFolders="CVS;.svn;build_wii;executables;hbc" filter="*" name="images" path="images\"><File path="battery.png"></File><File path="battery_bar.png"></File><File path="battery_red.png"></File><File path="bg_bottom.png"></File><File path="bg_game_selection.png"></File><File path="bg_game_selection_entry.png"></File><File path="bg_options.png"></File><File path="bg_options_entry.png"></File><File path="bg_preview.png"></File><File path="bg_top.png"></File><File path="button.png"></File><File path="button_arrow_down.png"></File><File path="button_arrow_down_over.png"></File><File path="button_arrow_left.png"></File><File path="button_arrow_left_over.png"></File><File path="button_arrow_right.png"></File><File path="button_arrow_right_over.png"></File><File path="button_arrow_up.png"></File><File path="button_arrow_up_over.png"></File><File path="button_gamesave.png"></File><File path="button_gamesave_blank.png"></File><File path="button_gamesave_over.png"></File><File path="button_large.png"></File><File path="button_large_over.png"></File><File path="button_long.png"></File><File path="button_long_over.png"></File><File path="button_over.png"></File><File path="button_prompt.png"></File><File path="button_prompt_over.png"></File><File path="button_short.png"></File><File path="button_short_over.png"></File><File path="button_small.png"></File><File path="button_small_over.png"></File><File path="credits_box.png"></File><File path="dialogue_box.png"></File><File path="icon_dvd.png"></File><File path="icon_folder.png"></File><File path="icon_game_cheats.png"></File><File path="icon_game_controllers.png"></File><File path="icon_game_load.png"></File><File path="icon_game_reset.png"></File><File path="icon_game_save.png"></File><File path="icon_game_settings.png"></File><File path="icon_home.png"></File><File path="icon_sd.png"></File><File path="icon_settings.png"></File><File path="icon_settings_classic.png"></File><File path="icon_settings_file.png"></File><File path="icon_settings_gamecube.png"></File><File path="icon_settings_justifier.png"></File><File path="icon_settings_mappings.png"></File><File path="icon_settings_menu.png"></File><File path="icon_settings_mouse.png"></File><File path="icon_settings_network.png"></File><File path="icon_settings_nunchuk.png"></File><File path="icon_settings_screenshot.png"></File><File path="icon_settings_snescontroller.png"></File><File path="icon_settings_superscope.png"></File><File path="icon_settings_video.png"></File><File path="icon_settings_wiimote.png"></File><File path="icon_settings_wiiupro.png"></File><File path="icon_smb.png"></File><File path="icon_usb.png"></File><File path="keyboard_key.png"></File><File path="keyboard_key_over.png"></File><File path="keyboard_largekey.png"></File><File path="keyboard_largekey_over.png"></File><File path="keyboard_mediumkey.png"></File><File path="keyboard_mediumkey_over.png"></File><File path="keyboard_textbox.png"></File><File path="logo.png"></File><File path="logo_over.png"></File><File path="player1_grab.png"></File><File path="player1_point.png"></File><File path="player2_grab.png"></File><File path="player2_point.png"></File><File path="player3_grab.png"></File><File path="player3_point.png"></File><File path="player4_grab.png"></File><File path="player4_point.png"></File><File path="progressbar.png"></File><File path="progressbar_empty.png"></File><File path="progressbar_outline.png"></File><File path="screen_position.png"></File><File path="scrollbar.png"></File><File path="scrollbar_arrowdown.png"></File><File path="scrollbar_arrowdown_over.png"></File><File path="scrollbar_arrowup.png"></File><File path="scrollbar_arrowup_over.png"></File><File path="scrollbar_box.png"></File><File path="scrollbar_box_over.png"></File><File path="throbber.png"></File></MagicFolder><MagicFolder excludeFolders="CVS;.svn;build_wii;executables;hbc" filter="*" name="lang" path="lang\"><File path="ca.lang"></File><File path="de.lang"></File><File path="en.lang"></File><File path="es.lang"></File><File path="fr.lang"></File><File path="it.lang"></File><File path="jp.lang"></File><File path="ko.lang"></File><File path="nl.lang"></File><File path="pt.lang"></File><File path="pt_br.lang"></File><File path="tr.lang"></File><File path="zh.lang"></File></MagicFolder><MagicFolder excludeFolders="CVS;.svn;build_wii;executables;hbc" filter="*" name="snes9x" path="snes9x\"><MagicFolder excludeFolders="CVS;.svn;build_wii;executables;hbc" filter="*" name="apu" path="apu\"><File path="apu.cpp"></File><File path="apu.h"></File><File path="blargg_common.h"></File><File path="blargg_config.h"></File><File path="blargg_endian.h"></File><File path="blargg_source.h"></File><File path="hermite_resampler.h"></File><File path="license.txt"></File><File path="linear_resampler.h"></File><File path="resampler.h"></File><File path="ring_buffer.h"></File><File path="SNES_SPC.cpp"></File><File path="SNES_SPC.h"></File><File path="SNES_SPC_misc.cpp"></File><File path="SNES_SPC_state.cpp"></File><File path="SPC_CPU.h"></File><File path="SPC_DSP.cpp"></File><File path="SPC_DSP.h"></File><File path="SPC_Filter.cpp"></File><File path="SPC_Filter.h"></File></MagicFolder><File path="65c816.h"></File><File path="bsx.cpp"></File><File path="bsx.h"></File><File path="c4.cpp"></File><File path="c4.h"></File><File path="c4emu.cpp"></File><File path="cheats.cpp"></File><File path="cheats.h"></File><File path="cheats2.cpp"></File><File path="clip.cpp"></File><File path="controls.cpp"></File><File path="controls.h"></File><File path="cpu.cpp"></File><File path="cpuaddr.h"></File><File path="cpuexec.cpp"></File><File path="cpuexec.h"></File><File path="cpumacro.h"></File><File path="cpuops.cpp"></File><File path="cpuops.h"></File><File path="crosshairs.cpp"></File><File path="crosshairs.h"></File><File path="display.h"></File><File path="dma.cpp"></File><File path="dma.h"></File><File path="dsp.cpp"></File><File path="dsp.h"></File><File path="dsp1.cpp"></File><File path="dsp2.cpp"></File><File path="dsp3.cpp"></File><File path="dsp4.cpp"></File><File path="font.h"></File><File path="fxdbg.cpp"></File><File path="fxemu.cpp"></File><File path="fxemu.h"></File><File path="fxinst.cpp"></File><File path="fxinst.h"></File><File path="getset.h"></File><File path="gfx.cpp"></File><File path="gfx.h"></File><File path="globals.cpp"></File><File path="language.h"></File><File path="logger.cpp"></File><File path="logger.h"></File><File path="memmap.cpp"></File><File path="memmap.h"></File><File path="messages.h"></File><File path="missing.h"></File><File path="movie.cpp"></File><File path="movie.h"></File><File path="obc1.cpp"></File><File path="obc1.h"></File><File path="pixform.h"></File><File path="port.h"></File><File path="ppu.cpp"></File><File path="ppu.h"></File><File path="reader.cpp"></File><File path="reader.h"></File><File path="sa1.cpp"></File><File path="sa1.h"></File><File path="sa1cpu.cpp"></File><File path="sar.h"></File><File path="screenshot.cpp"></File><File path="screenshot.h"></File><File path="sdd1.cpp"></File><File path="sdd1.h"></File><File path="sdd1emu.cpp"></File><File path="sdd1emu.h"></File><File path="seta.cpp"></File><File path="seta.h"></File><File path="seta010.cpp"></File><File path="seta011.cpp"></File><File path="seta018.cpp"></File><File path="snapshot.cpp"></File><File path="snapshot.h"></File><File path="snes9x.h"></File><File path="spc7110.cpp"></File><File path="spc7110.h"></File><File path="spc7110dec.cpp"></File><File path="spc7110dec.h"></File><File path="spc7110emu.cpp"></File><File path="spc7110emu.h"></File><File path="srtc.cpp"></File><File path="srtc.h"></File><File path="srtcemu.cpp"></File><File path="srtcemu.h"></File><File path="tile.cpp"></File><File path="tile.h"></File></MagicFolder><MagicFolder excludeFolders="CVS;.svn;build_wii;executables;hbc" filter="*" name="sounds" path="sounds\"><File path="bg_music.ogg"></File><File path="button_click.pcm"></File><File path="button_over.pcm"></File><File path="enter.ogg"></File><File path="exit.ogg"></File></MagicFolder><MagicFolder excludeFolders="CVS;.svn;build_wii;executables;hbc" filter="*" name="utils" path="utils\"><MagicFolder excludeFolders="CVS;.svn;build_wii;executables;hbc" filter="*" name="sz" path="sz\"><File path="7zAlloc.c"></File><File path="7zAlloc.h"></File><File path="7zBuffer.c"></File><File path="7zBuffer.h"></File><File path="7zCrc.c"></File><File path="7zCrc.h"></File><File path="7zDecode.c"></File><File path="7zDecode.h"></File><File path="7zExtract.c"></File><File path="7zExtract.h"></File><File path="7zHeader.c"></File><File path="7zHeader.h"></File><File path="7zIn.c"></File><File path="7zIn.h"></File><File path="7zItem.c"></File><File path="7zItem.h"></File><File path="7zMethodID.c"></File><File path="7zMethodID.h"></File><File path="7zTypes.h"></File><File path="LzmaDecode.c"></File><File path="LzmaDecode.h"></File><File path="LzmaTypes.h"></File></MagicFolder><MagicFolder excludeFolders="CVS;.svn;build_wii;executables;hbc" filter="*" name="unzip" path="unzip\"><File path="crypt.h"></File><File path="ioapi.c"></File><File path="ioapi.h"></File><File path="miniunz.cpp"></File><File path="miniunz.h"></File><File path="unzip.c"></File><File path="unzip.h"></File></MagicFolder><File path="FreeTypeGX.cpp"></File><File path="FreeTypeGX.h"></File><File path="gettext.cpp"></File><File path="gettext.h"></File><File path="http.cpp"></File><File path="http.h"></File><File path="oggplayer.c"></File><File path="oggplayer.h"></File><File path="pngu.c"></File><File path="pngu.h"></File></MagicFolder><MagicFolder excludeFolders="CVS;.svn;build_wii;executables;hbc" filter="*" name="xenon" path="xenon\"><MagicFolder excludeFolders="CVS;.svn;build_wii;executables;hbc" filter="*" name="pngu" path="pngu\"><File path="pngu.h"></File></MagicFolder><File path="ffs_content.c"></File><File path="filebrowser.h"></File><File path="fileop.h"></File><File path="freeze.cpp"></File><File path="freeze.h"></File><File path="gccore.h"></File><File path="main.cpp"></File><File path="png.h"></File><File path="README"></File><File path="s9xconfig.cpp"></File><File path="s9xconfig.h"></File><File path="s9xsupport.cpp"></File><File path="snes9xGX.h"></File><File path="video.cpp"></File><File path="video.h"></File></MagicFolder><File path="audio.cpp"></File><File path="audio.h"></File><File path="button_mapping.c"></File><File path="button_mapping.h"></File><File path="cheatmgr.cpp"></File><File path="filebrowser.cpp"></File><File path="filebrowser.h"></File><File path="filelist.h"></File><File path="fileop.cpp"></File><File path="fileop.h"></File><File path="filter.cpp"></File><File path="filter.h"></File><File path="freeze.cpp"></File><File path="freeze.h"></File><File path="gcunzip.cpp"></File><File path="gcunzip.h"></File><File path="input.cpp"></File><File path="input.h"></File><File path="mem2.cpp"></File><File path="mem2.h"></File><File path="menu.cpp"></File><File path="menu.h"></File><File path="networkop.cpp"></File><File path="networkop.h"></File><File path="preferences.cpp"></File><File path="preferences.h"></File><File path="s9xsupport.cpp"></File><File path="snes9xgx.cpp"></File><File path="snes9xgx.h"></File><File path="sram.cpp"></File><File path="sram.h"></File><File path="video.cpp"></File><File path="video.h"></File></MagicFolder><File path="compile.cmd"></File><File path="Makefile"></File><File path="Makefile.gc"></File><File path="Makefile.xenon"></File><File path="Makefile1"></File><File path="readme.txt"></File><File path="update.xml"></File><File path="wfsnesplugin.pnproj"></File><File path="wfsnesplugin.pnps"></File></MagicFolder></Project> \ No newline at end of file diff --git a/plugins/snes9x_gx/wfsnesplugin.pnps b/plugins/snes9x_gx/wfsnesplugin.pnps new file mode 100644 index 00000000..53242a55 --- /dev/null +++ b/plugins/snes9x_gx/wfsnesplugin.pnps @@ -0,0 +1 @@ +<pd><ViewState><e p="wfsnesplugin\snes\portlibs" x="false"></e><e p="wfsnesplugin\snes\source\gui" x="false"></e><e p="wfsnesplugin\snes\source\images" x="false"></e><e p="wfsnesplugin\snes\source" x="true"></e><e p="wfsnesplugin\snes\source\snes9x" x="false"></e><e p="wfsnesplugin\snes\source\sounds" x="false"></e><e p="wfsnesplugin\snes\source\utils" x="false"></e><e p="wfsnesplugin" x="true"></e><e p="wfsnesplugin\snes" x="true"></e><e p="wfsnesplugin\snes\source\fonts" x="false"></e><e p="wfsnesplugin\snes\source\lang" x="false"></e><e p="wfsnesplugin\snes\source\xenon" x="false"></e></ViewState></pd> \ No newline at end of file