From 850b4987cc4aec28cef1f0de062026083cb202c0 Mon Sep 17 00:00:00 2001 From: Kamila Szewczyk Date: Sun, 8 Oct 2023 18:33:37 +0200 Subject: [PATCH] check in rabbitsign/tilem --- .gitignore | 2 + Makefile | 24 +- README.md | 22 +- tool/rabbitsign-src/app8x.c | 445 ++ tool/rabbitsign-src/app9x.c | 297 + tool/rabbitsign-src/apps.c | 85 + tool/rabbitsign-src/autokey.c | 241 + tool/rabbitsign-src/autokeys.h | 47 + tool/rabbitsign-src/cmdline.c | 112 + tool/rabbitsign-src/error.c | 131 + tool/rabbitsign-src/graphlink.c | 118 + tool/rabbitsign-src/header.c | 169 + tool/rabbitsign-src/input.c | 520 ++ tool/rabbitsign-src/internal.h | 111 + tool/rabbitsign-src/keys.c | 234 + tool/rabbitsign-src/md5.c | 419 ++ tool/rabbitsign-src/md5.h | 146 + tool/rabbitsign-src/mem.c | 73 + tool/rabbitsign-src/mpz.c | 1026 +++ tool/rabbitsign-src/mpz.h | 123 + tool/rabbitsign-src/os8x.c | 298 + tool/rabbitsign-src/output.c | 39 + tool/rabbitsign-src/output8x.c | 248 + tool/rabbitsign-src/output9x.c | 96 + tool/rabbitsign-src/program.c | 187 + tool/rabbitsign-src/rabbitsign.c | 463 ++ tool/rabbitsign-src/rabbitsign.h | 342 + tool/rabbitsign-src/rabin.c | 425 ++ tool/rabbitsign-src/rsa.c | 137 + tool/rabbitsign-src/typestr.c | 161 + tool/tilem-src/CHANGELOG | 316 + tool/tilem-src/COPYING | 674 ++ tool/tilem-src/INSTALL | 53 + tool/tilem-src/KEYS | 270 + tool/tilem-src/Makefile.in | 91 + tool/tilem-src/NEWS | 73 + tool/tilem-src/README | 92 + tool/tilem-src/THANKS | 37 + tool/tilem-src/TODO | 7 + tool/tilem-src/aclocal.m4 | 173 + tool/tilem-src/config.h.in | 91 + tool/tilem-src/configure | 6127 +++++++++++++++++ tool/tilem-src/configure.ac | 172 + tool/tilem-src/data/Makefile.in | 114 + tool/tilem-src/data/desktop/tilem2.desktop | 10 + tool/tilem-src/data/desktop/tilem2.xml | 322 + tool/tilem-src/data/icons-svg/breakpoint.svg | 123 + tool/tilem-src/data/icons-svg/pc-arrow.svg | 159 + .../tilem-src/data/icons-svg/stepicons-16.svg | 217 + .../tilem-src/data/icons-svg/stepicons-24.svg | 389 ++ .../hicolor/16x16/actions/tilem-db-finish.png | Bin 0 -> 472 bytes .../16x16/actions/tilem-db-step-over.png | Bin 0 -> 490 bytes .../hicolor/16x16/actions/tilem-db-step.png | Bin 0 -> 498 bytes .../data/icons/hicolor/16x16/apps/tilem.png | Bin 0 -> 679 bytes .../16x16/status/tilem-disasm-break-pc.png | Bin 0 -> 592 bytes .../16x16/status/tilem-disasm-break.png | Bin 0 -> 534 bytes .../hicolor/16x16/status/tilem-disasm-pc.png | Bin 0 -> 269 bytes .../data/icons/hicolor/22x22/apps/tilem.png | Bin 0 -> 1001 bytes .../hicolor/24x24/actions/tilem-db-finish.png | Bin 0 -> 978 bytes .../24x24/actions/tilem-db-step-over.png | Bin 0 -> 959 bytes .../hicolor/24x24/actions/tilem-db-step.png | Bin 0 -> 1073 bytes .../data/icons/hicolor/24x24/apps/tilem.png | Bin 0 -> 1004 bytes .../data/icons/hicolor/32x32/apps/tilem.png | Bin 0 -> 1355 bytes .../data/icons/hicolor/48x48/apps/tilem.png | Bin 0 -> 1838 bytes tool/tilem-src/data/icons/hicolor/index.theme | 44 + tool/tilem-src/data/keybindings.ini | 555 ++ tool/tilem-src/data/skins/README | 45 + tool/tilem-src/data/skins/ti76.skn | Bin 0 -> 342274 bytes tool/tilem-src/data/skins/ti81.skn | Bin 0 -> 77418 bytes tool/tilem-src/data/skins/ti82.skn | Bin 0 -> 231162 bytes tool/tilem-src/data/skins/ti82stats.skn | Bin 0 -> 198808 bytes tool/tilem-src/data/skins/ti83.skn | Bin 0 -> 291972 bytes tool/tilem-src/data/skins/ti83p.skn | Bin 0 -> 285916 bytes tool/tilem-src/data/skins/ti83pfr.skn | Bin 0 -> 274760 bytes tool/tilem-src/data/skins/ti84p.skn | Bin 0 -> 88935 bytes tool/tilem-src/data/skins/ti84p2.skn | Bin 0 -> 201136 bytes tool/tilem-src/data/skins/ti86.skn | Bin 0 -> 127830 bytes tool/tilem-src/data/symbols/ti82.sym | 939 +++ tool/tilem-src/data/symbols/ti83.sym | 1307 ++++ tool/tilem-src/data/symbols/ti83p.sym | 2327 +++++++ tool/tilem-src/data/symbols/ti85.sym | 254 + tool/tilem-src/data/symbols/ti86.sym | 1112 +++ tool/tilem-src/db/Makefile.in | 59 + tool/tilem-src/db/disasm.c | 1084 +++ tool/tilem-src/db/listing.c | 379 + tool/tilem-src/db/lstfile.c | 384 ++ tool/tilem-src/db/tilemdb.h | 149 + tool/tilem-src/emu/Makefile.in | 218 + tool/tilem-src/emu/calcs.c | 186 + tool/tilem-src/emu/cert.c | 136 + tool/tilem-src/emu/flash.c | 326 + tool/tilem-src/emu/graycolor.c | 90 + tool/tilem-src/emu/grayimage.c | 324 + tool/tilem-src/emu/graylcd.c | 263 + tool/tilem-src/emu/graylcd.h | 57 + tool/tilem-src/emu/keypad.c | 91 + tool/tilem-src/emu/lcd.c | 268 + tool/tilem-src/emu/link.c | 456 ++ tool/tilem-src/emu/md5.c | 86 + tool/tilem-src/emu/monolcd.c | 148 + tool/tilem-src/emu/rom.c | 118 + tool/tilem-src/emu/scancodes.h | 85 + tool/tilem-src/emu/state.c | 892 +++ tool/tilem-src/emu/tilem.h | 950 +++ tool/tilem-src/emu/tilemint.h | 12 + tool/tilem-src/emu/timers.c | 231 + tool/tilem-src/emu/x1/x1.h | 53 + tool/tilem-src/emu/x1/x1_init.c | 50 + tool/tilem-src/emu/x1/x1_io.c | 237 + tool/tilem-src/emu/x1/x1_memory.c | 71 + tool/tilem-src/emu/x1/x1_subcore.c | 56 + tool/tilem-src/emu/x2/x2.h | 51 + tool/tilem-src/emu/x2/x2_init.c | 46 + tool/tilem-src/emu/x2/x2_io.c | 207 + tool/tilem-src/emu/x2/x2_memory.c | 70 + tool/tilem-src/emu/x2/x2_subcore.c | 57 + tool/tilem-src/emu/x3/x3.h | 50 + tool/tilem-src/emu/x3/x3_init.c | 48 + tool/tilem-src/emu/x3/x3_io.c | 210 + tool/tilem-src/emu/x3/x3_memory.c | 64 + tool/tilem-src/emu/x3/x3_subcore.c | 71 + tool/tilem-src/emu/x4/x4.h | 105 + tool/tilem-src/emu/x4/x4_init.c | 87 + tool/tilem-src/emu/x4/x4_io.c | 747 ++ tool/tilem-src/emu/x4/x4_memory.c | 207 + tool/tilem-src/emu/x4/x4_subcore.c | 65 + tool/tilem-src/emu/x5/x5.h | 49 + tool/tilem-src/emu/x5/x5_init.c | 49 + tool/tilem-src/emu/x5/x5_io.c | 183 + tool/tilem-src/emu/x5/x5_memory.c | 68 + tool/tilem-src/emu/x5/x5_subcore.c | 58 + tool/tilem-src/emu/x6/x6.h | 49 + tool/tilem-src/emu/x6/x6_init.c | 49 + tool/tilem-src/emu/x6/x6_io.c | 183 + tool/tilem-src/emu/x6/x6_memory.c | 68 + tool/tilem-src/emu/x6/x6_subcore.c | 57 + tool/tilem-src/emu/x7/x7.h | 56 + tool/tilem-src/emu/x7/x7_init.c | 59 + tool/tilem-src/emu/x7/x7_io.c | 247 + tool/tilem-src/emu/x7/x7_memory.c | 132 + tool/tilem-src/emu/x7/x7_subcore.c | 72 + tool/tilem-src/emu/xn/xn.h | 105 + tool/tilem-src/emu/xn/xn_init.c | 88 + tool/tilem-src/emu/xn/xn_io.c | 881 +++ tool/tilem-src/emu/xn/xn_memory.c | 204 + tool/tilem-src/emu/xn/xn_subcore.c | 73 + tool/tilem-src/emu/xp/xp.h | 62 + tool/tilem-src/emu/xp/xp_init.c | 67 + tool/tilem-src/emu/xp/xp_io.c | 284 + tool/tilem-src/emu/xp/xp_memory.c | 135 + tool/tilem-src/emu/xp/xp_subcore.c | 73 + tool/tilem-src/emu/xs/xs.h | 101 + tool/tilem-src/emu/xs/xs_init.c | 91 + tool/tilem-src/emu/xs/xs_io.c | 658 ++ tool/tilem-src/emu/xs/xs_memory.c | 213 + tool/tilem-src/emu/xs/xs_subcore.c | 73 + tool/tilem-src/emu/xz/xz.h | 105 + tool/tilem-src/emu/xz/xz_init.c | 89 + tool/tilem-src/emu/xz/xz_io.c | 747 ++ tool/tilem-src/emu/xz/xz_memory.c | 207 + tool/tilem-src/emu/xz/xz_subcore.c | 73 + tool/tilem-src/emu/z80.c | 990 +++ tool/tilem-src/emu/z80.h | 110 + tool/tilem-src/emu/z80cb.h | 426 ++ tool/tilem-src/emu/z80cmds.h | 840 +++ tool/tilem-src/emu/z80ddfd.h | 343 + tool/tilem-src/emu/z80ed.h | 457 ++ tool/tilem-src/emu/z80main.h | 893 +++ tool/tilem-src/gui/Makefile.in | 263 + tool/tilem-src/gui/address.c | 242 + tool/tilem-src/gui/animatedgif.c | 251 + tool/tilem-src/gui/animation.c | 594 ++ tool/tilem-src/gui/animation.h | 88 + tool/tilem-src/gui/breakpoints.c | 1060 +++ tool/tilem-src/gui/charmap.c | 127 + tool/tilem-src/gui/charmap.h | 22 + tool/tilem-src/gui/config.c | 338 + tool/tilem-src/gui/debugger.c | 1420 ++++ tool/tilem-src/gui/debugger.h | 164 + tool/tilem-src/gui/disasmview.c | 1200 ++++ tool/tilem-src/gui/disasmview.h | 73 + tool/tilem-src/gui/emucore.c | 436 ++ tool/tilem-src/gui/emucore.h | 95 + tool/tilem-src/gui/emulator.c | 899 +++ tool/tilem-src/gui/emulator.h | 263 + tool/tilem-src/gui/emuwin.c | 621 ++ tool/tilem-src/gui/emuwin.h | 78 + tool/tilem-src/gui/event.c | 436 ++ tool/tilem-src/gui/filedlg.c | 1039 +++ tool/tilem-src/gui/filedlg.h | 91 + tool/tilem-src/gui/files.c | 270 + tool/tilem-src/gui/files.h | 42 + tool/tilem-src/gui/fixedtreeview.c | 165 + tool/tilem-src/gui/fixedtreeview.h | 40 + tool/tilem-src/gui/gifencod.c | 326 + tool/tilem-src/gui/gifencod.h | 200 + tool/tilem-src/gui/gtk-compat.h | 11 + tool/tilem-src/gui/gui.h | 386 ++ tool/tilem-src/gui/icons.c | 71 + tool/tilem-src/gui/icons.h | 20 + tool/tilem-src/gui/keybindings.c | 255 + tool/tilem-src/gui/keypaddlg.c | 305 + tool/tilem-src/gui/link.c | 1301 ++++ tool/tilem-src/gui/macro.c | 274 + tool/tilem-src/gui/memmodel.c | 529 ++ tool/tilem-src/gui/memmodel.h | 77 + tool/tilem-src/gui/memory.c | 101 + tool/tilem-src/gui/memview.c | 291 + tool/tilem-src/gui/menu.c | 318 + tool/tilem-src/gui/msgbox.h | 67 + tool/tilem-src/gui/pbar.c | 156 + tool/tilem-src/gui/preferences.c | 270 + tool/tilem-src/gui/rcvmenu.c | 665 ++ tool/tilem-src/gui/screenshot.c | 810 +++ tool/tilem-src/gui/sendfile.c | 526 ++ tool/tilem-src/gui/skinops.c | 299 + tool/tilem-src/gui/skinops.h | 133 + tool/tilem-src/gui/ti81prg.c | 410 ++ tool/tilem-src/gui/ti81prg.h | 89 + tool/tilem-src/gui/tilem2.c | 309 + tool/tilem-src/gui/tilem2.ico | Bin 0 -> 23558 bytes tool/tilem-src/gui/tilem2.rc.in | 32 + tool/tilem-src/gui/tool.c | 433 ++ tool/tilem-src/install-sh | 520 ++ tool/tilem-src/installer/win32/COPYING-PIXMAN | 39 + tool/tilem-src/installer/win32/COPYING-ZLIB | 23 + tool/tilem-src/installer/win32/Makefile.in | 184 + tool/tilem-src/installer/win32/gtkrc | 75 + .../installer/win32/installer.nsi.in | 82 + 229 files changed, 62035 insertions(+), 14 deletions(-) create mode 100644 tool/rabbitsign-src/app8x.c create mode 100644 tool/rabbitsign-src/app9x.c create mode 100644 tool/rabbitsign-src/apps.c create mode 100644 tool/rabbitsign-src/autokey.c create mode 100644 tool/rabbitsign-src/autokeys.h create mode 100644 tool/rabbitsign-src/cmdline.c create mode 100644 tool/rabbitsign-src/error.c create mode 100644 tool/rabbitsign-src/graphlink.c create mode 100644 tool/rabbitsign-src/header.c create mode 100644 tool/rabbitsign-src/input.c create mode 100644 tool/rabbitsign-src/internal.h create mode 100644 tool/rabbitsign-src/keys.c create mode 100644 tool/rabbitsign-src/md5.c create mode 100644 tool/rabbitsign-src/md5.h create mode 100644 tool/rabbitsign-src/mem.c create mode 100644 tool/rabbitsign-src/mpz.c create mode 100644 tool/rabbitsign-src/mpz.h create mode 100644 tool/rabbitsign-src/os8x.c create mode 100644 tool/rabbitsign-src/output.c create mode 100644 tool/rabbitsign-src/output8x.c create mode 100644 tool/rabbitsign-src/output9x.c create mode 100644 tool/rabbitsign-src/program.c create mode 100644 tool/rabbitsign-src/rabbitsign.c create mode 100644 tool/rabbitsign-src/rabbitsign.h create mode 100644 tool/rabbitsign-src/rabin.c create mode 100644 tool/rabbitsign-src/rsa.c create mode 100644 tool/rabbitsign-src/typestr.c create mode 100644 tool/tilem-src/CHANGELOG create mode 100644 tool/tilem-src/COPYING create mode 100644 tool/tilem-src/INSTALL create mode 100644 tool/tilem-src/KEYS create mode 100644 tool/tilem-src/Makefile.in create mode 100644 tool/tilem-src/NEWS create mode 100644 tool/tilem-src/README create mode 100644 tool/tilem-src/THANKS create mode 100644 tool/tilem-src/TODO create mode 100644 tool/tilem-src/aclocal.m4 create mode 100644 tool/tilem-src/config.h.in create mode 100755 tool/tilem-src/configure create mode 100644 tool/tilem-src/configure.ac create mode 100644 tool/tilem-src/data/Makefile.in create mode 100644 tool/tilem-src/data/desktop/tilem2.desktop create mode 100644 tool/tilem-src/data/desktop/tilem2.xml create mode 100644 tool/tilem-src/data/icons-svg/breakpoint.svg create mode 100644 tool/tilem-src/data/icons-svg/pc-arrow.svg create mode 100644 tool/tilem-src/data/icons-svg/stepicons-16.svg create mode 100644 tool/tilem-src/data/icons-svg/stepicons-24.svg create mode 100644 tool/tilem-src/data/icons/hicolor/16x16/actions/tilem-db-finish.png create mode 100644 tool/tilem-src/data/icons/hicolor/16x16/actions/tilem-db-step-over.png create mode 100644 tool/tilem-src/data/icons/hicolor/16x16/actions/tilem-db-step.png create mode 100644 tool/tilem-src/data/icons/hicolor/16x16/apps/tilem.png create mode 100644 tool/tilem-src/data/icons/hicolor/16x16/status/tilem-disasm-break-pc.png create mode 100644 tool/tilem-src/data/icons/hicolor/16x16/status/tilem-disasm-break.png create mode 100644 tool/tilem-src/data/icons/hicolor/16x16/status/tilem-disasm-pc.png create mode 100644 tool/tilem-src/data/icons/hicolor/22x22/apps/tilem.png create mode 100644 tool/tilem-src/data/icons/hicolor/24x24/actions/tilem-db-finish.png create mode 100644 tool/tilem-src/data/icons/hicolor/24x24/actions/tilem-db-step-over.png create mode 100644 tool/tilem-src/data/icons/hicolor/24x24/actions/tilem-db-step.png create mode 100644 tool/tilem-src/data/icons/hicolor/24x24/apps/tilem.png create mode 100644 tool/tilem-src/data/icons/hicolor/32x32/apps/tilem.png create mode 100644 tool/tilem-src/data/icons/hicolor/48x48/apps/tilem.png create mode 100644 tool/tilem-src/data/icons/hicolor/index.theme create mode 100644 tool/tilem-src/data/keybindings.ini create mode 100644 tool/tilem-src/data/skins/README create mode 100644 tool/tilem-src/data/skins/ti76.skn create mode 100644 tool/tilem-src/data/skins/ti81.skn create mode 100644 tool/tilem-src/data/skins/ti82.skn create mode 100644 tool/tilem-src/data/skins/ti82stats.skn create mode 100644 tool/tilem-src/data/skins/ti83.skn create mode 100644 tool/tilem-src/data/skins/ti83p.skn create mode 100644 tool/tilem-src/data/skins/ti83pfr.skn create mode 100644 tool/tilem-src/data/skins/ti84p.skn create mode 100644 tool/tilem-src/data/skins/ti84p2.skn create mode 100644 tool/tilem-src/data/skins/ti86.skn create mode 100644 tool/tilem-src/data/symbols/ti82.sym create mode 100644 tool/tilem-src/data/symbols/ti83.sym create mode 100644 tool/tilem-src/data/symbols/ti83p.sym create mode 100644 tool/tilem-src/data/symbols/ti85.sym create mode 100644 tool/tilem-src/data/symbols/ti86.sym create mode 100644 tool/tilem-src/db/Makefile.in create mode 100644 tool/tilem-src/db/disasm.c create mode 100644 tool/tilem-src/db/listing.c create mode 100644 tool/tilem-src/db/lstfile.c create mode 100644 tool/tilem-src/db/tilemdb.h create mode 100644 tool/tilem-src/emu/Makefile.in create mode 100644 tool/tilem-src/emu/calcs.c create mode 100644 tool/tilem-src/emu/cert.c create mode 100644 tool/tilem-src/emu/flash.c create mode 100644 tool/tilem-src/emu/graycolor.c create mode 100644 tool/tilem-src/emu/grayimage.c create mode 100644 tool/tilem-src/emu/graylcd.c create mode 100644 tool/tilem-src/emu/graylcd.h create mode 100644 tool/tilem-src/emu/keypad.c create mode 100644 tool/tilem-src/emu/lcd.c create mode 100644 tool/tilem-src/emu/link.c create mode 100644 tool/tilem-src/emu/md5.c create mode 100644 tool/tilem-src/emu/monolcd.c create mode 100644 tool/tilem-src/emu/rom.c create mode 100644 tool/tilem-src/emu/scancodes.h create mode 100644 tool/tilem-src/emu/state.c create mode 100644 tool/tilem-src/emu/tilem.h create mode 100644 tool/tilem-src/emu/tilemint.h create mode 100644 tool/tilem-src/emu/timers.c create mode 100644 tool/tilem-src/emu/x1/x1.h create mode 100644 tool/tilem-src/emu/x1/x1_init.c create mode 100644 tool/tilem-src/emu/x1/x1_io.c create mode 100644 tool/tilem-src/emu/x1/x1_memory.c create mode 100644 tool/tilem-src/emu/x1/x1_subcore.c create mode 100644 tool/tilem-src/emu/x2/x2.h create mode 100644 tool/tilem-src/emu/x2/x2_init.c create mode 100644 tool/tilem-src/emu/x2/x2_io.c create mode 100644 tool/tilem-src/emu/x2/x2_memory.c create mode 100644 tool/tilem-src/emu/x2/x2_subcore.c create mode 100644 tool/tilem-src/emu/x3/x3.h create mode 100644 tool/tilem-src/emu/x3/x3_init.c create mode 100644 tool/tilem-src/emu/x3/x3_io.c create mode 100644 tool/tilem-src/emu/x3/x3_memory.c create mode 100644 tool/tilem-src/emu/x3/x3_subcore.c create mode 100644 tool/tilem-src/emu/x4/x4.h create mode 100644 tool/tilem-src/emu/x4/x4_init.c create mode 100644 tool/tilem-src/emu/x4/x4_io.c create mode 100644 tool/tilem-src/emu/x4/x4_memory.c create mode 100644 tool/tilem-src/emu/x4/x4_subcore.c create mode 100644 tool/tilem-src/emu/x5/x5.h create mode 100644 tool/tilem-src/emu/x5/x5_init.c create mode 100644 tool/tilem-src/emu/x5/x5_io.c create mode 100644 tool/tilem-src/emu/x5/x5_memory.c create mode 100644 tool/tilem-src/emu/x5/x5_subcore.c create mode 100644 tool/tilem-src/emu/x6/x6.h create mode 100644 tool/tilem-src/emu/x6/x6_init.c create mode 100644 tool/tilem-src/emu/x6/x6_io.c create mode 100644 tool/tilem-src/emu/x6/x6_memory.c create mode 100644 tool/tilem-src/emu/x6/x6_subcore.c create mode 100644 tool/tilem-src/emu/x7/x7.h create mode 100644 tool/tilem-src/emu/x7/x7_init.c create mode 100644 tool/tilem-src/emu/x7/x7_io.c create mode 100644 tool/tilem-src/emu/x7/x7_memory.c create mode 100644 tool/tilem-src/emu/x7/x7_subcore.c create mode 100644 tool/tilem-src/emu/xn/xn.h create mode 100644 tool/tilem-src/emu/xn/xn_init.c create mode 100644 tool/tilem-src/emu/xn/xn_io.c create mode 100644 tool/tilem-src/emu/xn/xn_memory.c create mode 100644 tool/tilem-src/emu/xn/xn_subcore.c create mode 100644 tool/tilem-src/emu/xp/xp.h create mode 100644 tool/tilem-src/emu/xp/xp_init.c create mode 100644 tool/tilem-src/emu/xp/xp_io.c create mode 100644 tool/tilem-src/emu/xp/xp_memory.c create mode 100644 tool/tilem-src/emu/xp/xp_subcore.c create mode 100644 tool/tilem-src/emu/xs/xs.h create mode 100644 tool/tilem-src/emu/xs/xs_init.c create mode 100644 tool/tilem-src/emu/xs/xs_io.c create mode 100644 tool/tilem-src/emu/xs/xs_memory.c create mode 100644 tool/tilem-src/emu/xs/xs_subcore.c create mode 100644 tool/tilem-src/emu/xz/xz.h create mode 100644 tool/tilem-src/emu/xz/xz_init.c create mode 100644 tool/tilem-src/emu/xz/xz_io.c create mode 100644 tool/tilem-src/emu/xz/xz_memory.c create mode 100644 tool/tilem-src/emu/xz/xz_subcore.c create mode 100644 tool/tilem-src/emu/z80.c create mode 100644 tool/tilem-src/emu/z80.h create mode 100644 tool/tilem-src/emu/z80cb.h create mode 100644 tool/tilem-src/emu/z80cmds.h create mode 100644 tool/tilem-src/emu/z80ddfd.h create mode 100644 tool/tilem-src/emu/z80ed.h create mode 100644 tool/tilem-src/emu/z80main.h create mode 100644 tool/tilem-src/gui/Makefile.in create mode 100644 tool/tilem-src/gui/address.c create mode 100644 tool/tilem-src/gui/animatedgif.c create mode 100644 tool/tilem-src/gui/animation.c create mode 100644 tool/tilem-src/gui/animation.h create mode 100644 tool/tilem-src/gui/breakpoints.c create mode 100644 tool/tilem-src/gui/charmap.c create mode 100644 tool/tilem-src/gui/charmap.h create mode 100644 tool/tilem-src/gui/config.c create mode 100644 tool/tilem-src/gui/debugger.c create mode 100644 tool/tilem-src/gui/debugger.h create mode 100644 tool/tilem-src/gui/disasmview.c create mode 100644 tool/tilem-src/gui/disasmview.h create mode 100644 tool/tilem-src/gui/emucore.c create mode 100644 tool/tilem-src/gui/emucore.h create mode 100644 tool/tilem-src/gui/emulator.c create mode 100644 tool/tilem-src/gui/emulator.h create mode 100644 tool/tilem-src/gui/emuwin.c create mode 100644 tool/tilem-src/gui/emuwin.h create mode 100644 tool/tilem-src/gui/event.c create mode 100644 tool/tilem-src/gui/filedlg.c create mode 100644 tool/tilem-src/gui/filedlg.h create mode 100644 tool/tilem-src/gui/files.c create mode 100644 tool/tilem-src/gui/files.h create mode 100644 tool/tilem-src/gui/fixedtreeview.c create mode 100644 tool/tilem-src/gui/fixedtreeview.h create mode 100644 tool/tilem-src/gui/gifencod.c create mode 100644 tool/tilem-src/gui/gifencod.h create mode 100644 tool/tilem-src/gui/gtk-compat.h create mode 100644 tool/tilem-src/gui/gui.h create mode 100644 tool/tilem-src/gui/icons.c create mode 100644 tool/tilem-src/gui/icons.h create mode 100644 tool/tilem-src/gui/keybindings.c create mode 100644 tool/tilem-src/gui/keypaddlg.c create mode 100644 tool/tilem-src/gui/link.c create mode 100644 tool/tilem-src/gui/macro.c create mode 100644 tool/tilem-src/gui/memmodel.c create mode 100644 tool/tilem-src/gui/memmodel.h create mode 100644 tool/tilem-src/gui/memory.c create mode 100644 tool/tilem-src/gui/memview.c create mode 100644 tool/tilem-src/gui/menu.c create mode 100644 tool/tilem-src/gui/msgbox.h create mode 100644 tool/tilem-src/gui/pbar.c create mode 100644 tool/tilem-src/gui/preferences.c create mode 100644 tool/tilem-src/gui/rcvmenu.c create mode 100644 tool/tilem-src/gui/screenshot.c create mode 100644 tool/tilem-src/gui/sendfile.c create mode 100644 tool/tilem-src/gui/skinops.c create mode 100644 tool/tilem-src/gui/skinops.h create mode 100644 tool/tilem-src/gui/ti81prg.c create mode 100644 tool/tilem-src/gui/ti81prg.h create mode 100644 tool/tilem-src/gui/tilem2.c create mode 100644 tool/tilem-src/gui/tilem2.ico create mode 100644 tool/tilem-src/gui/tilem2.rc.in create mode 100644 tool/tilem-src/gui/tool.c create mode 100755 tool/tilem-src/install-sh create mode 100644 tool/tilem-src/installer/win32/COPYING-PIXMAN create mode 100644 tool/tilem-src/installer/win32/COPYING-ZLIB create mode 100644 tool/tilem-src/installer/win32/Makefile.in create mode 100644 tool/tilem-src/installer/win32/gtkrc create mode 100644 tool/tilem-src/installer/win32/installer.nsi.in diff --git a/.gitignore b/.gitignore index 70d0b71..c8bf649 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,5 @@ main.8xk main.bin ti83pv116.sav + +tool/rabbitsign diff --git a/Makefile b/Makefile index ae18967..4b54f14 100644 --- a/Makefile +++ b/Makefile @@ -1,15 +1,19 @@ -CC=sdcc -CFLAGS=-Ilib83 -c -mz80 --std-sdcc2x --no-std-crt0 --reserve-regs-iy --opt-code-size +SDCC=sdcc +SDCCFLAGS=-Ilib83 -c -mz80 --std-sdcc2x --no-std-crt0 --reserve-regs-iy --opt-code-size OBJS=_crt0.rel clrscr.rel putchar.rel puts.rel exit.rel gotoxy.rel __assert_fail.rel \ getchar.rel put_int.rel ctype.rel memcpy.rel memset.rel memmove.rel memcmp.rel \ strcpy.rel strlen.rel strncpy.rel \ main.rel -.PHONY: all clean try +.PHONY: all clean try init all: main.8xk +init: + @echo "Compiling rabbitsign..." + @$(CC) tool/rabbitsign-src/*.c -o tool/rabbitsign -O2 -g -w -DPROTOTYPES + clean: @rm -f obj/* main.ihx main.bin main.8xk @@ -17,16 +21,16 @@ try: main.8xk @tilem2 --rom=ti83pv116.bin %.rel: lib83/%.c - @echo "(lib) CC $<" - @$(CC) $(CFLAGS) $< -o obj/$@ + @echo "(lib) SDCC $<" + @$(SDCC) $(SDCCFLAGS) $< -o obj/$@ %.rel: %.c - @echo "CC $<" - @$(CC) $(CFLAGS) $< -o obj/$@ + @echo "SDCC $<" + @$(SDCC) $(SDCCFLAGS) $< -o obj/$@ obj/main.ihx: $(OBJS) - @echo "LD $@" - @cd obj && $(CC) -mz80 --no-std-crt0 --code-loc 0x4000 --code-size 0x4000 --xram-loc 0x9D95 --xram-size 0x6060 $^ -o ../$@ && cd .. + @echo "SDCCLD $@" + @cd obj && $(SDCC) -mz80 --no-std-crt0 --code-loc 0x4000 --code-size 0x4000 --xram-loc 0x9D95 --xram-size 0x6060 $^ -o ../$@ && cd .. main.bin: obj/main.ihx @echo "IHX->BIN $@" @@ -35,5 +39,5 @@ main.bin: obj/main.ihx main.8xk: main.bin @echo "SIGN $@" - @rabbitsign -P -p -t 8xk -g $< + @tool/rabbitsign -P -p -t 8xk -g $< diff --git a/README.md b/README.md index 6a07a85..9a53d1e 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,25 @@ A C programming SDK for the TI-83 calculator. Includes pre-configured build syst ## Requirements -- SDCC -- GNU Make -- TilEm -- RabbitSign +- A GNU/Linux system. ## Status WIP. + +## Usage + +Initialise the build environment: + +```bash +git clone https://git.palaiologos.rocks/Palaiologos/ti83-sdk +cd ti83-sdk +make init +make +``` + +Run the pre-supplied program: + +```bash +make try +``` diff --git a/tool/rabbitsign-src/app8x.c b/tool/rabbitsign-src/app8x.c new file mode 100644 index 0000000..d114178 --- /dev/null +++ b/tool/rabbitsign-src/app8x.c @@ -0,0 +1,445 @@ +/* + * RabbitSign - Tools for signing TI graphing calculator software + * Copyright (C) 2009 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include "rabbitsign.h" +#include "internal.h" +#include "md5.h" + +/* + * Check/fix Flash app header and data. + * + * This function checks various parts of the application header which, + * if incorrect, are known to cause applications to be rejected by the + * calculator. Depending on the flags, this function will also fix + * incorrect header fields. + * + * Note that this function can also add padding to the end of the app. + * The entire signature must be stored on one page, so if there is not + * enough room on the final page of the app, an extra page needs to be + * added to hold the signature. + * + * In addition, some versions of the boot code have a bug which + * results in incorrect MD5 hashes for applications that are 55 bytes + * long mod 64; this function will add an extra padding byte to avoid + * that case. + */ +int rs_repair_ti8x_app(RSProgram* app, /* app to repair */ + unsigned int flags) /* flags */ +{ + unsigned long length, hdrstart, hdrsize, fieldstart, fieldsize, i; + unsigned char* hdr; + unsigned char dummy = 0; + int e, pagecount, addedpage = 0; + + /* Various parts of the OS, as well as other software on the + calculator and PC, expect that every application begins with the + bytes 80 0F -- a "long" field. Some things may work for apps + with an 80 0E (or even 80 0D) field, but not everything. Please + stick with 80 0F. */ + + if (app->length < 6 + || app->data[0] != 0x80 + || app->data[1] != 0x0f) { + rs_error(NULL, app, "no app header found"); + return RS_ERR_MISSING_HEADER; + } + + /* Determine application length */ + + length = app->length; + rs_get_field_size(app->data, &hdrstart, &hdrsize); + + /* If requested, remove the old signature (truncate the application + to its stated length.) */ + + if (flags & RS_REMOVE_OLD_SIGNATURE) { + if (length < hdrstart + hdrsize) { + rs_warning(NULL, app, "provided app data too short"); + } + else { + if (length > hdrstart + hdrsize + 96) + rs_warning(NULL, app, "re-signing discards %lu bytes", + length - hdrstart - hdrsize); + length = hdrstart + hdrsize; + } + } + else if (hdrsize && hdrstart + hdrsize != length) { + rs_warning(NULL, app, "application length incorrect"); + rs_warning(NULL, app, "(perhaps you meant to use -r?)"); + } + + /* If necessary, add an extra page to ensure that the signature + doesn't span a page boundary. */ + + if (((length + 69 + 0x3fff) >> 14) != ((length + 0x3fff) >> 14)) { + if (flags & (RS_ZEALOUSLY_PAD_APP | RS_IGNORE_ALL_WARNINGS)) { + rs_warning(NULL, app, "adding an extra page to hold app signature"); + length = ((length + 0x4000) & ~0x3fff) + 1; + addedpage = 1; + } + else { + rs_error(NULL, app, "application ends too close to a page boundary"); + return RS_ERR_FINAL_PAGE_TOO_LONG; + } + } + + if ((e = rs_program_set_length(app, length))) + return e; + + /* If the length is 55 mod 64, add an extra byte. (Note that, with + 512-bit keys, this can never cause a page overflow.) We use zero + for the padding value, rather than FF, so that our output matches + that of other tools. */ + + if ((length % 64) == 55) { + length++; + rs_message(2, NULL, app, "adding an extra byte due to boot code bugs"); + if ((e = rs_program_append_data(app, &dummy, 1))) + return e; + } + + /* Set app size header to the correct value */ + + hdrsize = length - hdrstart; + if (rs_set_field_size(app->data, hdrsize)) { + if (flags & RS_IGNORE_ALL_WARNINGS) + rs_warning(NULL, app, "application length header too small"); + else { + rs_error(NULL, app, "application length header too small"); + return RS_ERR_FIELD_TOO_SMALL; + } + } + + /* Check/fix page count. This field is required to be present and + contain the correct number of pages. It must be one byte long + (some parts of the OS don't even check the length and assume it + is one byte long.) */ + + hdr = app->data + hdrstart; + if (hdrsize > 128) + hdrsize = 128; + + if (rs_find_app_field(0x8080, hdr, hdrsize, + NULL, &fieldstart, &fieldsize)) { + if (flags & RS_IGNORE_ALL_WARNINGS) + rs_warning(NULL, app, "application has no page count field"); + else { + rs_error(NULL, app, "application has no page count field"); + return RS_ERR_MISSING_PAGE_COUNT; + } + } + else if (fieldsize != 1) { + if (flags & RS_IGNORE_ALL_WARNINGS) + rs_warning(NULL, app, "application has an invalid page count field"); + else { + rs_error(NULL, app, "application has an invalid page count field"); + return RS_ERR_INCORRECT_PAGE_COUNT; + } + } + else { + pagecount = ((length + 0x3fff) >> 14); + + if (flags & RS_FIX_PAGE_COUNT) { + hdr[fieldstart] = pagecount; + } + else if (addedpage && hdr[fieldstart] == pagecount - 1) { + hdr[fieldstart] = pagecount; + } + else if (hdr[fieldstart] != pagecount) { + if (flags & RS_IGNORE_ALL_WARNINGS) { + rs_warning(NULL, app, + "application has an incorrect page count (actual: %lu)", + ((length + 0x3fff) >> 14)); + hdr[fieldstart] = pagecount; + } + else { + rs_error(NULL, app, + "application has an incorrect page count (actual: %lu)", + ((length + 0x3fff) >> 14)); + return RS_ERR_INCORRECT_PAGE_COUNT; + } + } + } + + /* Check for key ID. This field is required to be present; it + determines which public key is used for validation. (The + contents of this field are usually thought of as a big-endian + integer, but to be more precise, they're really treated as a + binary string.) */ + + if (rs_find_app_field(0x8010, hdr, hdrsize, NULL, NULL, NULL)) { + if (flags & RS_IGNORE_ALL_WARNINGS) + rs_warning(NULL, app, "application has no key ID"); + else { + rs_error(NULL, app, "application has no key ID"); + return RS_ERR_MISSING_KEY_ID; + } + } + + /* Check for date stamp. This seems to be required -- the OS will + use it to update its last-known date stamp if necessary -- and + should consist of an 032x field containing an 090x field, + followed by an 020x field containing the date stamp signature. + (The contents of the latter only matter if the date stamp is + "new.") */ + + if (rs_find_app_field(0x0320, hdr, hdrsize, + NULL, &fieldstart, &fieldsize)) { + if (flags & RS_IGNORE_ALL_WARNINGS) + rs_warning(NULL, app, "application has no date stamp"); + else { + rs_error(NULL, app, "application has no date stamp"); + return RS_ERR_MISSING_DATE_STAMP; + } + } + else if (rs_find_app_field(0x0900, hdr + fieldstart, fieldsize, + NULL, NULL, NULL)) { + if (flags & RS_IGNORE_ALL_WARNINGS) + rs_warning(NULL, app, "application has no date stamp"); + else { + rs_error(NULL, app, "application has no date stamp"); + return RS_ERR_MISSING_DATE_STAMP; + } + } + else if (hdr[fieldstart + fieldsize] != 0x02 + || (hdr[fieldstart + fieldsize + 1] & 0xf0) != 0) { + if (flags & RS_IGNORE_ALL_WARNINGS) + rs_warning(NULL, app, "application has no date stamp signature"); + else { + rs_error(NULL, app, "application has no date stamp signature"); + return RS_ERR_MISSING_DATE_STAMP; + } + } + + /* Check for program image field. This field indicates the end of + the header and the start of application code. Note, however, + that the OS handles this field in an exceedingly broken way. To + be safe, this must always be the last field of the header, and + should always be written as 80 7F followed by four length bytes. + The length bytes may be anything you like -- they're ignored. */ + + if (rs_find_app_field(0x8070, hdr, hdrsize, + NULL, NULL, NULL)) { + if (flags & RS_IGNORE_ALL_WARNINGS) + rs_warning(NULL, app, "application has no program image field"); + else { + rs_error(NULL, app, "application has no program image field"); + return RS_ERR_MISSING_PROGRAM_IMAGE; + } + } + + /* Check for invalid pages (those beginning with FF.) An OS bug + means that such pages will end up being erased completely if + defragmenting requires the application to be moved in Flash. */ + + e = RS_SUCCESS; + + for (i = 0; i < app->length; i += 0x4000) { + if (app->data[i] == 0xff) { + if (flags & RS_IGNORE_ALL_WARNINGS) + rs_warning(NULL, app, "page %ld begins with FFh", (i >> 14)); + else { + rs_error(NULL, app, "page %ld begins with FFh", (i >> 14)); + e = RS_ERR_INVALID_PROGRAM_DATA; + } + } + } + + return e; +} + +/* + * Compute signature for a Flash app. + * + * The app header should be checked and/or repaired by + * rs_repair_ti8x_app() prior to calling this function. + * + * There are four equally valid Rabin signatures for any application; + * rootnum determines which of the four should be used. + */ +int rs_sign_ti8x_app(RSProgram* app, /* app to sign */ + RSKey* key, /* signing key */ + int rootnum) /* signature number */ +{ + md5_uint32 hash[4]; + mpz_t hashv, sigv; + int f; + unsigned int lastpagelength; + unsigned char sigdata[512]; + size_t siglength; + int e; + + /* Check if app length is risky */ + + if ((app->length % 64) == 55) { + rs_warning(NULL, app, "application has length 55 mod 64"); + rs_warning(NULL, app, "(this will fail to validate on TI-83+ BE)"); + } + + /* Compute signature */ + + md5_buffer((char*) app->data, app->length, hash); + + mpz_init(hashv); + mpz_init(sigv); + + mpz_import(hashv, 16, -1, 1, 0, 0, hash); + rs_message(2, NULL, app, "hash = %ZX", hashv); + + if ((e = rs_sign_rabin(sigv, &f, hashv, rootnum, key))) { + mpz_clear(hashv); + mpz_clear(sigv); + return e; + } + + rs_message(2, NULL, app, "sig = %ZX", sigv); + rs_message(2, NULL, app, "f = %d", f); + + /* Write the square root value as an 022D field... */ + + sigdata[0] = 0x02; + sigdata[1] = 0x2d; + mpz_export(sigdata + 3, &siglength, -1, 1, 0, 0, sigv); + sigdata[2] = siglength & 0xff; + siglength += 3; + + mpz_clear(hashv); + mpz_clear(sigv); + + /* ...and append the f value as a big integer */ + + if (f == 0) { + sigdata[siglength++] = 0; + } + else { + sigdata[siglength++] = 1; + sigdata[siglength++] = f; + } + + /* Add padding, but not too much (it seems to make some link + programs happier) */ + + lastpagelength = app->length & 0x3fff; + + while (siglength < 96 && (lastpagelength + siglength) < 0x3fff) + sigdata[siglength++] = 0xff; + + return rs_program_append_data(app, sigdata, siglength); +} + +/* + * Validate a Flash app signature. + */ +int rs_validate_ti8x_app(const RSProgram* app, /* app to validate */ + const RSKey* key) /* signing key */ +{ + unsigned long length, hdrstart, hdrsize, fieldstart, fieldsize, i; + const unsigned char *hdr, *sig; + md5_uint32 hash[4]; + mpz_t hashv, sigv; + int f, e, e2 = RS_SUCCESS; + + if (app->length < 6) { + rs_error(NULL, app, "no app header found"); + return RS_ERR_MISSING_HEADER; + } + + rs_get_field_size(app->data, &hdrstart, &hdrsize); + length = hdrstart + hdrsize; + hdr = app->data + hdrstart; + if (hdrsize > 128) + hdrsize = 128; + + if (((length + 0x3fff) >> 14) != ((app->length + 0x3fff) >> 14) + || length + 4 > app->length || length + 96 < app->length) { + rs_error(NULL, app, "incorrect application length"); + return RS_ERR_INCORRECT_PROGRAM_SIZE; + } + + if (rs_find_app_field(0x8070, hdr, hdrsize, + NULL, NULL, NULL)) { + rs_warning(NULL, app, "application has no program image field"); + e2 = RS_ERR_MISSING_PROGRAM_IMAGE; + } + + if (rs_find_app_field(0x8080, hdr, hdrsize, + NULL, &fieldstart, &fieldsize)) { + rs_warning(NULL, app, "application has no no page count field"); + e2 = RS_ERR_MISSING_PAGE_COUNT; + } + else if (fieldsize != 1) { + rs_warning(NULL, app, "application has an invalid page count field"); + e2 = RS_ERR_INCORRECT_PAGE_COUNT; + } + else if (hdr[fieldstart] != ((length + 0x3fff) >> 14)) { + rs_warning(NULL, app, "application has an incorrect page count field"); + e2 = RS_ERR_INCORRECT_PAGE_COUNT; + } + + if ((length % 64) == 55) { + rs_warning(NULL, app, "application has length 55 mod 64"); + rs_warning(NULL, app, "(this will fail to validate on TI-83+ BE)"); + e2 = RS_ERR_INVALID_PROGRAM_SIZE; + } + + for (i = 0; i < app->length; i += 0x4000) { + if (app->data[i] == 0xff) { + rs_warning(NULL, app, "page %ld begins with FFh", (i >> 14)); + e2 = RS_ERR_INVALID_PROGRAM_DATA; + } + } + + md5_buffer((char*) app->data, length, &hash); + + sig = app->data + length; + if (sig[0] != 0x02 || sig[1] != 0x2d) { + rs_error(NULL, app, "application does not have a Rabin signature"); + return RS_ERR_MISSING_RABIN_SIGNATURE; + } + rs_get_field_size(sig, &fieldstart, &fieldsize); + + mpz_init(sigv); + mpz_init(hashv); + + mpz_import(hashv, 16, -1, 1, 0, 0, hash); + rs_message(2, NULL, app, "hash = %ZX", hashv); + + mpz_import(sigv, fieldsize, -1, 1, 0, 0, sig + fieldstart); + rs_message(2, NULL, app, "sig = %ZX", sigv); + + if (sig[fieldstart + fieldsize] == 0) + f = 0; + else + f = sig[fieldstart + fieldsize + 1]; + rs_message(2, NULL, app, "f = %d", f); + + e = rs_validate_rabin(sigv, f, hashv, key); + if (e == RS_SIGNATURE_INCORRECT) + rs_message(0, NULL, app, "application signature incorrect"); + + mpz_clear(sigv); + mpz_clear(hashv); + return (e ? e : e2); +} + diff --git a/tool/rabbitsign-src/app9x.c b/tool/rabbitsign-src/app9x.c new file mode 100644 index 0000000..9d0dda9 --- /dev/null +++ b/tool/rabbitsign-src/app9x.c @@ -0,0 +1,297 @@ +/* + * RabbitSign - Tools for signing TI graphing calculator software + * Copyright (C) 2009 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include "rabbitsign.h" +#include "internal.h" +#include "md5.h" + +/* + * Check/fix app/OS header and data. + * + * (This is something of a work in progress; a lot more + * experimentation would be useful to determine what exactly is + * required of app and OS headers on the 68k calculators.) + */ +static int repair_app(RSProgram* app, /* app to repair */ + unsigned int flags, /* flags */ + unsigned int type) /* field type */ +{ + unsigned long length, hdrstart, hdrsize, fieldhead, + fieldstart, fieldsize; + unsigned char *hdr; + int e; + + if (app->length < 6 + || app->data[0] != type + || (app->data[1] & 0xf0) != 0) { + rs_error(NULL, app, "no app header found"); + return RS_ERR_MISSING_HEADER; + } + + /* Determine application length */ + + length = app->length; + rs_get_field_size(app->data, &hdrstart, &hdrsize); + + /* If requested, remove the old signature (truncate the application + to its stated length.) */ + + if (flags & RS_REMOVE_OLD_SIGNATURE) { + if (length < hdrstart + hdrsize) { + rs_warning(NULL, app, "provided app data too short"); + } + else { + if (length > hdrstart + hdrsize + 67) + rs_warning(NULL, app, "re-signing discards %lu bytes", + length - hdrstart - hdrsize); + length = hdrstart + hdrsize; + } + } + else if (hdrsize && hdrstart + hdrsize != length) { + rs_warning(NULL, app, "application length incorrect"); + rs_warning(NULL, app, "(perhaps you meant to use -r?)"); + } + + if ((e = rs_program_set_length(app, length))) + return e; + + /* Set app size header to the correct value */ + + hdrsize = length - hdrstart; + if (rs_set_field_size(app->data, hdrsize)) { + if (flags & RS_IGNORE_ALL_WARNINGS) + rs_warning(NULL, app, "cannot set application length"); + else { + rs_error(NULL, app, "cannot set application length"); + return RS_ERR_FIELD_TOO_SMALL; + } + } + + /* Check for key ID */ + + hdr = app->data + hdrstart; + if (hdrsize > 128) + hdrsize = 128; + + if (rs_find_app_field((type << 8) | 0x10, hdr, hdrsize, + NULL, NULL, NULL)) { + if (flags & RS_IGNORE_ALL_WARNINGS) + rs_warning(NULL, app, "application has no key ID"); + else { + rs_error(NULL, app, "application has no key ID"); + return RS_ERR_MISSING_KEY_ID; + } + } + + /* Check for date stamp (note: I haven't actually tested whether + this is required, but it always seems to be present in both 68k + apps and OSes, and it is required for TI-83+ apps) */ + + if (rs_find_app_field(0x0320, hdr, hdrsize, + NULL, &fieldstart, &fieldsize)) { + if (flags & RS_IGNORE_ALL_WARNINGS) + rs_warning(NULL, app, "application has no date stamp"); + else { + rs_error(NULL, app, "application has no date stamp"); + return RS_ERR_MISSING_DATE_STAMP; + } + } + else if (rs_find_app_field(0x0900, hdr + fieldstart, fieldsize, + NULL, NULL, NULL)) { + if (flags & RS_IGNORE_ALL_WARNINGS) + rs_warning(NULL, app, "application has no date stamp"); + else { + rs_error(NULL, app, "application has no date stamp"); + return RS_ERR_MISSING_DATE_STAMP; + } + } + else if (hdr[fieldstart + fieldsize] != 0x02 + || (hdr[fieldstart + fieldsize + 1] & 0xf0) != 0) { + if (flags & RS_IGNORE_ALL_WARNINGS) + rs_warning(NULL, app, "application has no date stamp signature"); + else { + rs_error(NULL, app, "application has no date stamp signature"); + return RS_ERR_MISSING_DATE_STAMP; + } + } + + /* Check for program image field and fix length */ + + if (rs_find_app_field((type << 8) | 0x70, hdr, hdrsize, + &fieldhead, &fieldstart, &fieldsize)) { + if (flags & RS_IGNORE_ALL_WARNINGS) + rs_warning(NULL, app, "application has no program image field"); + else { + rs_error(NULL, app, "application has no program image field"); + return RS_ERR_MISSING_PROGRAM_IMAGE; + } + } + else { + if ((fieldstart + hdrstart) % 2) { + /* The OS appears to align apps so the start of the app header + is at an even address; if the application code itself is at + an odd address, bad stuff will happen. */ + if (flags & RS_IGNORE_ALL_WARNINGS) + rs_warning(NULL, app, "application header is not a multiple of 2 bytes"); + else { + rs_error(NULL, app, "application header is not a multiple of 2 bytes"); + return RS_ERR_MISALIGNED_PROGRAM_IMAGE; + } + } + + if (fieldsize && fieldstart + fieldsize != length - hdrstart) + rs_warning(NULL, app, "program image length incorrect"); + + if (rs_set_field_size(hdr + fieldhead, length - hdrstart - fieldstart)) { + rs_error(NULL, app, "cannot set program image length"); + return RS_ERR_FIELD_TOO_SMALL; + } + } + + return RS_SUCCESS; +} + +/* + * Check/fix Flash app header and data. + */ +int rs_repair_ti9x_app(RSProgram* app, /* app to repair */ + unsigned int flags) /* flags */ +{ + return repair_app(app, flags, 0x81); +} + +/* + * Check/fix OS header and data. + */ +int rs_repair_ti9x_os(RSProgram* app, /* app to repair */ + unsigned int flags) /* flags */ +{ + return repair_app(app, flags, 0x80); +} + +/* + * Compute signature for a 68k app/OS. + * + * The app header should be checked and/or repaired by + * rs_repair_ti9x_app() prior to calling this function. + */ +int rs_sign_ti9x_app(RSProgram* app, /* app to sign */ + RSKey* key) /* signing key */ +{ + md5_uint32 hash[4]; + mpz_t hashv, sigv; + unsigned char sigdata[512]; + size_t siglength; + int e; + + md5_buffer((char*) app->data, app->length, &hash); + + mpz_init(hashv); + mpz_init(sigv); + + mpz_import(hashv, 16, -1, 1, 0, 0, hash); + rs_message(2, NULL, app, "hash = %ZX", hashv); + + if ((e = rs_sign_rsa(sigv, hashv, key))) { + mpz_clear(hashv); + mpz_clear(sigv); + return e; + } + + rs_message(2, NULL, app, "sig = %ZX", sigv); + + sigdata[0] = 0x02; + sigdata[1] = 0x0d; + mpz_export(sigdata + 3, &siglength, -1, 1, 0, 0, sigv); + sigdata[2] = siglength & 0xff; + siglength += 3; + + return rs_program_append_data(app, sigdata, siglength); +} + +/* + * Validate app/OS signature. + */ +int rs_validate_ti9x_app(const RSProgram* app, /* app to validate */ + const RSKey* key) /* signing key */ +{ + unsigned long length, hdrstart, hdrsize, fieldstart, fieldsize; + const unsigned char *hdr, *sig; + md5_uint32 hash[4]; + mpz_t hashv, sigv; + int e, e2 = RS_SUCCESS; + + if (app->length < 6) { + rs_error(NULL, app, "no app header found"); + return RS_ERR_MISSING_HEADER; + } + + rs_get_field_size(app->data, &hdrstart, &hdrsize); + length = hdrstart + hdrsize; + hdr = app->data + hdrstart; + if (hdrsize > 128) + hdrsize = 128; + + if (length + 4 > app->length || length + 67 < app->length) { + rs_error(NULL, app, "incorrect application length"); + return RS_ERR_INCORRECT_PROGRAM_SIZE; + } + + if (rs_find_app_field((app->data[0] << 8) | 0x70, hdr, hdrsize, + NULL, &fieldstart, &fieldsize)) { + rs_warning(NULL, app, "application has no program image field"); + e2 = RS_ERR_MISSING_PROGRAM_IMAGE; + } + else if ((fieldstart + hdrstart) % 2) { + rs_warning(NULL, app, "application header is not a multiple of 2 bytes"); + e2 = RS_ERR_MISALIGNED_PROGRAM_IMAGE; + } + + md5_buffer((char*) app->data, length, &hash); + + sig = app->data + length; + if (sig[0] != 0x02 || (sig[1] & 0xf0) != 0x00) { + rs_error(NULL, app, "application does not have an RSA signature"); + return RS_ERR_MISSING_RSA_SIGNATURE; + } + rs_get_field_size(sig, &fieldstart, &fieldsize); + + mpz_init(sigv); + mpz_init(hashv); + + mpz_import(hashv, 16, -1, 1, 0, 0, hash); + rs_message(2, NULL, app, "hash = %ZX", hashv); + + mpz_import(sigv, fieldsize, -1, 1, 0, 0, sig + fieldstart); + rs_message(2, NULL, app, "sig = %ZX", sigv); + + e = rs_validate_rsa(sigv, hashv, key); + if (e == RS_SIGNATURE_INCORRECT) + rs_message(0, NULL, app, "application signature incorrect"); + + mpz_clear(sigv); + mpz_clear(hashv); + return (e ? e : e2); +} + diff --git a/tool/rabbitsign-src/apps.c b/tool/rabbitsign-src/apps.c new file mode 100644 index 0000000..896674d --- /dev/null +++ b/tool/rabbitsign-src/apps.c @@ -0,0 +1,85 @@ +/* + * RabbitSign - Tools for signing TI graphing calculator software + * Copyright (C) 2009 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include "rabbitsign.h" +#include "internal.h" + +/* + * Check/fix program header and data. + */ +int rs_repair_program(RSProgram* prgm, /* app to repair */ + unsigned int flags) /* flags */ +{ + if (rs_calc_is_ti8x(prgm->calctype)) { + if (prgm->datatype == RS_DATA_OS) + return rs_repair_ti8x_os(prgm, flags); + else if (prgm->datatype == RS_DATA_APP) + return rs_repair_ti8x_app(prgm, flags); + } + + if (rs_calc_is_ti9x(prgm->calctype)) { + if (prgm->datatype == RS_DATA_OS) + return rs_repair_ti9x_os(prgm, flags); + else if (prgm->datatype == RS_DATA_APP) + return rs_repair_ti9x_app(prgm, flags); + } + + rs_error(NULL, prgm, "calc/data type (%X/%X) unrecognized", + prgm->calctype, prgm->datatype); + return RS_ERR_UNKNOWN_PROGRAM_TYPE; +} + +/* + * Add a signature to the program. + */ +int rs_sign_program(RSProgram* prgm, /* app to sign */ + RSKey* key, /* signing key */ + int rootnum) /* signature number */ +{ + if (rs_calc_is_ti8x(prgm->calctype)) { + if (prgm->datatype == RS_DATA_OS) + return rs_sign_ti8x_os(prgm, key); + else if (prgm->datatype == RS_DATA_APP) + return rs_sign_ti8x_app(prgm, key, rootnum); + } + + return rs_sign_ti9x_app(prgm, key); +} + +/* + * Validate program signature. + */ +int rs_validate_program(const RSProgram* prgm, /* app to validate */ + const RSKey* key) /* signing key */ +{ + if (rs_calc_is_ti8x(prgm->calctype)) { + if (prgm->datatype == RS_DATA_OS) + return rs_validate_ti8x_os(prgm, key); + else if (prgm->datatype == RS_DATA_APP) + return rs_validate_ti8x_app(prgm, key); + } + + return rs_validate_ti9x_app(prgm, key); +} + diff --git a/tool/rabbitsign-src/autokey.c b/tool/rabbitsign-src/autokey.c new file mode 100644 index 0000000..23b4a5f --- /dev/null +++ b/tool/rabbitsign-src/autokey.c @@ -0,0 +1,241 @@ +/* + * RabbitSign - Tools for signing TI graphing calculator software + * Copyright (C) 2009 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#ifdef HAVE_STDLIB_H +# include +#endif + +#ifdef HAVE_STRING_H +# include +#else +# ifdef HAVE_STRINGS_H +# include +# endif +#endif + +#include "rabbitsign.h" +#include "internal.h" +#include "autokeys.h" + +/* + * Get key ID for the given program. + */ +unsigned long rs_program_get_key_id(const RSProgram* prgm) +{ + const unsigned char* hdr; + unsigned long hdrstart, hdrsize; + + if (prgm->header_length > 0) { + hdr = prgm->header; + hdrsize = prgm->header_length; + } + else if (prgm->length > 0) { + hdr = prgm->data; + hdrsize = prgm->length; + if (hdrsize > 128) + hdrsize = 128; + } + else + return 0; + + rs_get_field_size(hdr, &hdrstart, NULL); + hdrsize -= hdrstart; + + if (hdr[0] == 0x81) + return rs_get_numeric_field(0x8110, hdr + hdrstart, hdrsize); + else + return rs_get_numeric_field(0x8010, hdr + hdrstart, hdrsize); +} + +/* + * Try to load key from a file. + */ +static int try_key_file(RSKey* key, /* key structure to store result */ + const char* a, /* first path element */ + const char* b, /* second path element */ + const char* c) /* third path element */ +{ + char* s; + FILE* f; + int e; + + s = rs_malloc(strlen(a) + strlen(b) + strlen(c) + 1); + if (!s) + return RS_ERR_OUT_OF_MEMORY; + strcpy(s, a); + strcat(s, b); + strcat(s, c); + + f = fopen(s, "rt"); + if (!f) { + rs_free(s); + return RS_ERR_KEY_NOT_FOUND; + } + + if ((e = rs_read_key_file(key, f, s, 1))) { + fclose(f); + rs_free(s); + return e; + } + + fclose(f); + rs_free(s); + return RS_SUCCESS; +} + +/* + * Try to locate a given key file. + */ +static int find_key_file(RSKey* key, /* key structure to + store result */ + const char* filename) /* file name to search + for */ +{ + const char* p; + int e; + + e = try_key_file(key, "", "", filename); + if (e != RS_ERR_KEY_NOT_FOUND) + return e; + + if ((p = getenv("RABBITSIGN_KEY_DIR"))) { +#if defined(__MSDOS__) || defined(__WIN32__) + e = try_key_file(key, p, "\\", filename); +#else + e = try_key_file(key, p, "/", filename); +#endif + if (e != RS_ERR_KEY_NOT_FOUND) + return e; + } + +#if defined(__MSDOS__) || defined(__WIN32__) + if ((p = getenv("TI83PLUSDIR"))) { + e = try_key_file(key, p, "\\Utils\\", filename); + if (e != RS_ERR_KEY_NOT_FOUND) + return e; + } +#endif + +#ifdef SHARE_DIR + e = try_key_file(key, SHARE_DIR, "", filename); + if (e != RS_ERR_KEY_NOT_FOUND) + return e; +#endif + + return RS_ERR_KEY_NOT_FOUND; +} + +/* + * Find key file for the given ID. + */ +int rs_key_find_for_id(RSKey* key, /* key structure to store + result */ + unsigned long keyid, /* key ID to search for */ + int publiconly) /* 1 = search for public + key only */ +{ + static const char* fmts[] = { "%02lx.%s", "%02lX.%s", + "%04lx.%s", "%04lX.%s", NULL }; + char buf[16]; + int i, e; + + mpz_set_ui(key->p, 0); + mpz_set_ui(key->q, 0); + mpz_set_ui(key->qinv, 0); + mpz_set_ui(key->d, 0); + + if (keyid > 0xFF) + sprintf(buf, "%04lX", keyid); + else + sprintf(buf, "%02lX", keyid); + + for (i = 0; known_priv_keys[i].n; i++) { + if (keyid == known_priv_keys[i].id) { + if ((e = rs_parse_key_value(key->n, known_priv_keys[i].n))) + return e; + + if (known_priv_keys[i].p + && (e = rs_parse_key_value(key->p, known_priv_keys[i].p))) + return e; + if (known_priv_keys[i].q + && (e = rs_parse_key_value(key->q, known_priv_keys[i].q))) + return e; + if (known_priv_keys[i].d + && (e = rs_parse_key_value(key->d, known_priv_keys[i].d))) + return e; + + rs_message(2, key, NULL, "Loaded builtin private key %s:", buf); + rs_message(2, key, NULL, " n = %ZX", key->n); + if (mpz_sgn(key->p)) + rs_message(2, key, NULL, " p = %ZX", key->p); + if (mpz_sgn(key->q)) + rs_message(2, key, NULL, " q = %ZX", key->q); + if (mpz_sgn(key->d)) + rs_message(2, key, NULL, " d = %ZX", key->d); + + key->id = keyid; + return 0; + } + } + + if (publiconly) { + for (i = 0; known_pub_keys[i].n; i++) { + if (keyid == known_pub_keys[i].id) { + if ((e = rs_parse_key_value(key->n, known_pub_keys[i].n))) + return e; + + rs_message(2, key, NULL, "Loaded builtin public key %s:", buf); + rs_message(2, key, NULL, " n = %ZX", key->n); + + key->id = keyid; + return 0; + } + } + } + + for (i = 0; fmts[i]; i++) { + sprintf(buf, fmts[i], keyid, "key"); + e = find_key_file(key, buf); + if (e != RS_ERR_KEY_NOT_FOUND) { + if (e == 0 && !key->id) + key->id = keyid; + return e; + } + } + + if (publiconly) { + for (i = 0; fmts[i]; i++) { + sprintf(buf, fmts[i], keyid, "pub"); + e = find_key_file(key, buf); + if (e != RS_ERR_KEY_NOT_FOUND) { + if (e == 0 && !key->id) + key->id = keyid; + return e; + } + } + } + + rs_error(NULL, NULL, "cannot find key file %s", buf); + return RS_ERR_KEY_NOT_FOUND; +} diff --git a/tool/rabbitsign-src/autokeys.h b/tool/rabbitsign-src/autokeys.h new file mode 100644 index 0000000..9880eab --- /dev/null +++ b/tool/rabbitsign-src/autokeys.h @@ -0,0 +1,47 @@ +/* + * RabbitSign - Tools for signing TI graphing calculator software + * Copyright (C) 2009 Benjamin Moody + * + * 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 . + */ + +struct pubkeyinfo { + unsigned long id; + const char* n; +} known_pub_keys[] = + {{ 0x0101, "406104CDFAD955D41F1ECCB9B622007FE8BC75E8B28DA178334755FEF27C564D47B04FD82498C163B762991C68CF64E29236BC41A4C1BCB9793B6EE965407C74BC" }, + { 0x0102, "4085F11FF810591B84875FDE4C92A5961CDD233A9B7ED76E8CFF65128C71420FCCC80E375DC8D2A8551AE2BEB9FD41654CE7B0A95E32BE9997750407904560BEFC" }, + { 0x0103, "40ED0236FD3D8B0CBA88C1CECFA549F8A838CDBAC487F9253F6C67F20C9627984FEA0D0A0BA035424C7B9F5E702286CEDCC66D2DA93320F7071BF2C93C59DE6B91" }, + { 0x010A, "4005D1EB8485AA14C983FFA04031B27C89950C3D7F4181FE603A353F48DE0933DFE1173BDD2E14FEB7325BAA35A12F21804DCFD30E56119C1305D348A77BCF448F" }, + { 0x01, "40F78D55E9A40A92D11D5C1446BFCEA74C8368BE1A81B6BA1596970E6D5932D933B86FF3CEA6B381CE65F5E383BDB02C82F33B8190375D0B40DEF2F1FE3CCA49AD" }, + { 0x02, "4081396D55C0989BC949FA30821FFE61C9441EDC3827D0E89EEE16DDEF697634B8E10B8B7F42FE7CC1A7478606D6D09F6FE96365E71E3D2AAA7C8D91068F1DFAF3" }, + { 0x03, "40E7C21F66BD1116F2F4F691121F3330060E24C8C7A1858D49636E24E80015F3AA25C2F6033AB39067D453945ABD8A5F4CFAFADABAF8BA2BFB88895A04B5D47689" }, + { 0x04, "408FE528B340EB1C88B505B2354BAADF47F3616D92CB532E7E5A2A0DFF1C4E4283CEEA2B2F7AD5F28B7E4BE4F3F4C99CABA0D98A8E5F2BE15E2AAC7CED0940EF82" }, + { 0x08, "40110510EE17B0A300E2BB27441F266843EDB541BAC1077AC203CF18ABB7800F8F0E259495F80D863C49C4EE7E9FB1FE03488A140C7CD5A54CE148C8CE22B00783" }, + { 0x0A, "40B11C71D4EA2C13C9AB2E501C6085FEC87FF3B88BFD783EAC43351E1B10F65AD31C79C1268F75051DC8FC008EBF593AE5912E8B653975C13127E2B60A0BEF5FEF" }, + { 0, 0 }}; + +struct privkeyinfo { + unsigned long id; + const char* n; + const char* p; + const char* q; + const char* d; +} known_priv_keys[] = + {{ 0x0104, "40AD2431DA2297E4175EAC61A3154FA3D847115794DD330AB7FF36BA59FEDA195FEA7C16743BD7BCED8A0DA885E5E5C34D5BF20D0AB3EF9181ED39BA2C4D898E87", + "205B2E54E9B5C1FE26CE93261478D3873F3FC41BFFF1F5F934D7A5793A43C1C21C", "2197F7707B94079B73858720BF6D4909AB3BEDA1BA9B93112B041340A16ED597B604", 0 }, + { 0x05, "406BABF27E9BF1826FD46CBF934E3360EF1F1D3D09D6C74E9DF78049D01A42F584BD383A10E64330C2EE6F1B1C5162789E91E94677900F85D98E7D99F49B30A2BF", + /* "20F59BA0274F1CA6231A882B053AAD9A2B80EBE9D2B6E9FD1CDCFCE1AD9D9414D3", "20DFED657A28DE2BFF75DE4F1AEBB7555859779DA38A671B7C76F81B50F02A6AE8", */ + 0, 0, "40E131D6636091E0F0EB3F6444FA2DABB7744FD4DDCF54018AD906C38A0789180D05C7A9275A9149819B05F279F357CEF3A0C53855AF90992572E0F09E3DC2B970" }, + { 0, 0, 0, 0, 0 }}; diff --git a/tool/rabbitsign-src/cmdline.c b/tool/rabbitsign-src/cmdline.c new file mode 100644 index 0000000..af4cb45 --- /dev/null +++ b/tool/rabbitsign-src/cmdline.c @@ -0,0 +1,112 @@ +/* + * RabbitSign - Tools for signing TI graphing calculator software + * Copyright (C) 2009 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#ifdef HAVE_STRING_H +# include +#else +# ifdef HAVE_STRINGS_H +# include +# endif +#endif + +#include "rabbitsign.h" +#include "internal.h" + +#if !defined(strchr) && !defined(HAVE_STRCHR) && defined(HAVE_INDEX) +# define strchr index +#endif + +/* + * Parse and return next command line option. + */ +int rs_parse_cmdline(int argc, char** argv, const char* optstring, + int* i, int* j, const char** arg) +{ + char c; + char* p; + + if (*i >= argc) + return RS_CMDLINE_FINISHED; + + if (argv[*i][0] != '-' || argv[*i][1] == 0) { + *arg = argv[*i]; + (*i)++; + *j = 1; + return RS_CMDLINE_FILENAME; + } + + if (argv[*i][1] == '-') { + if (!strcasecmp(argv[*i], "--help")) { + (*i)++; + *j = 1; + return RS_CMDLINE_HELP; + } + else if (!strcasecmp(argv[*i], "--version")) { + (*i)++; + *j = 1; + return RS_CMDLINE_VERSION; + } + else { + rs_error(NULL, NULL, "unrecognized option %s (try --help)", argv[*i]); + return RS_CMDLINE_ERROR; + } + } + + c = argv[*i][*j]; + + if (c == ':' || !(p = strchr(optstring, c))) { + rs_error(NULL, NULL, "unrecognized option -%c (try --help)", c); + return RS_CMDLINE_ERROR; + } + + if (p[1] == ':') { + if (argv[*i][*j + 1]) { + *arg = &argv[*i][*j + 1]; + (*i)++; + *j = 1; + return c; + } + else { + (*i) += 2; + *j = 1; + if (*i > argc) { + rs_error(NULL, NULL, "-%c: requires an argument", c); + return RS_CMDLINE_ERROR; + } + *arg = argv[*i - 1]; + return c; + } + } + else { + if (argv[*i][*j + 1]) { + (*j)++; + } + else { + (*i)++; + *j = 1; + } + *arg = NULL; + return c; + } +} diff --git a/tool/rabbitsign-src/error.c b/tool/rabbitsign-src/error.c new file mode 100644 index 0000000..031f2a0 --- /dev/null +++ b/tool/rabbitsign-src/error.c @@ -0,0 +1,131 @@ +/* + * RabbitSign - Tools for signing TI graphing calculator software + * Copyright (C) 2009 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#ifdef HAVE_STRING_H +# include +#else +# ifdef HAVE_STRINGS_H +# include +# endif +#endif + +#include "rabbitsign.h" +#include "internal.h" + +static const char* progname; +static int verbose; +static RSMessageFunc errorfunc, messagefunc; +static void *errorfuncdata, *messagefuncdata; + +void rs_set_progname(s) + const char* s; +{ + progname = s; +} + +void rs_set_verbose(v) + int v; +{ + verbose = v; +} + +void rs_set_error_func(RSMessageFunc func, void* data) +{ + errorfunc = func; + errorfuncdata = data; +} + +void rs_set_message_func(RSMessageFunc func, void* data) +{ + messagefunc = func; + messagefuncdata = data; +} + +static void print_message(const RSKey* key, const RSProgram* prgm, + const char* msg) +{ + if (prgm && prgm->filename) + fprintf(stderr, "%s: ", prgm->filename); + else if (key && key->filename) + fprintf(stderr, "%s: ", key->filename); + else if (progname) + fprintf(stderr, "%s: ", progname); + fputs(msg, stderr); + fputc('\n', stderr); +} + +/* Display a critical error */ +void rs_error(const RSKey* key, const RSProgram* prgm, const char* fmt, ...) +{ + char msg[512]; + va_list ap; + + va_start(ap, fmt); + strcpy(msg, "error: "); + rs_vsnprintf(msg + 7, sizeof(msg) - 7, fmt, ap); + va_end(ap); + + if (errorfunc) + (*errorfunc)(key, prgm, msg, errorfuncdata); + else + print_message(key, prgm, msg); +} + +/* Display a warning message */ +void rs_warning(const RSKey* key, const RSProgram* prgm, const char* fmt, ...) +{ + char msg[512]; + va_list ap; + + va_start(ap, fmt); + strcpy(msg, "warning: "); + rs_vsnprintf(msg + 9, sizeof(msg) - 9, fmt, ap); + va_end(ap); + + if (errorfunc) + (*errorfunc)(key, prgm, msg, errorfuncdata); + else + print_message(key, prgm, msg); +} + +/* Display an informative message */ +void rs_message(int level, const RSKey* key, const RSProgram* prgm, + const char* fmt, ...) +{ + char msg[512]; + va_list ap; + + if (level > verbose) + return; + + va_start(ap, fmt); + rs_vsnprintf(msg, sizeof(msg), fmt, ap); + va_end(ap); + + if (messagefunc) + (*messagefunc)(key, prgm, msg, messagefuncdata); + else + print_message(key, prgm, msg); +} diff --git a/tool/rabbitsign-src/graphlink.c b/tool/rabbitsign-src/graphlink.c new file mode 100644 index 0000000..06e6e3f --- /dev/null +++ b/tool/rabbitsign-src/graphlink.c @@ -0,0 +1,118 @@ +/* + * RabbitSign - Tools for signing TI graphing calculator software + * Copyright (C) 2009 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#ifdef HAVE_STRING_H +# include +#else +# ifdef HAVE_STRINGS_H +# include +# endif +#endif + +#ifdef TIME_WITH_SYS_TIME +# include +# include +#else +# ifdef TM_IN_SYS_TIME +# include +# else +# include +# endif +#endif + +#include "rabbitsign.h" +#include "internal.h" + +#define BCD(x) ((x) + 6 * ((x)/10)) + +/* + * Write a TIFL header to a file. + */ +int rs_write_tifl_header(FILE* outfile, /* file to write to */ + int is_hex, /* is file in hex format? */ + int major, /* major version # */ + int minor, /* minor version # */ + int month, /* current month */ + int day, /* current day */ + int year, /* current year */ + const char* name, /* name of program */ + int calctype, /* calculator type */ + int datatype, /* data type */ + unsigned long filesize) /* size of data */ +{ + unsigned char buf[78]; + time_t t; + struct tm* tm; + + memset(buf, 0, 78); + + strcpy((char*) buf, "**TIFL**"); + + buf[8] = major; + buf[9] = minor; + + if (is_hex) { + buf[10] = 0x01; + buf[11] = 0x88; + } + else { + buf[10] = 0; + buf[11] = 0; + } + + if (!month && !day && !year) { + time(&t); + tm = localtime(&t); + month = tm->tm_mon + 1; + day = tm->tm_mday; + year = tm->tm_year + 1900; + } + + buf[12] = BCD(month); + buf[13] = BCD(day); + buf[14] = BCD(year / 100); + buf[15] = BCD(year % 100); + + buf[16] = strlen(name); + if (buf[16] > 8) + buf[16] = 8; + + strncpy((char*) buf + 17, name, 8); + + buf[48] = calctype; + buf[49] = datatype; + + buf[74] = filesize & 0xff; + buf[75] = (filesize >> 8) & 0xff; + buf[76] = (filesize >> 16) & 0xff; + buf[77] = (filesize >> 24) & 0xff; + + if (fwrite(buf, 1, 78, outfile) != 78) { + rs_error(NULL, NULL, "file I/O error"); + return RS_ERR_FILE_IO; + } + + return RS_SUCCESS; +} + diff --git a/tool/rabbitsign-src/header.c b/tool/rabbitsign-src/header.c new file mode 100644 index 0000000..36bbe5b --- /dev/null +++ b/tool/rabbitsign-src/header.c @@ -0,0 +1,169 @@ +/* + * RabbitSign - Tools for signing TI graphing calculator software + * Copyright (C) 2009 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include "rabbitsign.h" +#include "internal.h" + +/* + * Get length of a header field. + */ +void rs_get_field_size (const unsigned char* data, /* Data */ + unsigned long* fieldstart, /* Offset to start + of field + contents */ + unsigned long* fieldsize) /* Length of field + contents */ +{ + switch (data[1] & 0x0f) { + case 0x0D: + if (fieldstart) *fieldstart = 3; + if (fieldsize) *fieldsize = data[2]; + break; + + case 0x0E: + if (fieldstart) *fieldstart = 4; + if (fieldsize) *fieldsize = ((data[2] << 8) | data[3]); + break; + + case 0x0F: + if (fieldstart) *fieldstart = 6; + if (fieldsize) { + *fieldsize = (((unsigned long) data[2] << 24) + | ((unsigned long) data[3] << 16) + | ((unsigned long) data[4] << 8) + | (unsigned long) data[5]); + } + break; + + default: + if (fieldstart) *fieldstart = 2; + if (fieldsize) *fieldsize = (data[1] & 0x0f); + break; + } +} + +/* Set length of a header field. */ +int rs_set_field_size (unsigned char* data, + unsigned long fieldsize) +{ + switch (data[1] & 0x0f) { + case 0x0D: + if (fieldsize > 0xff) + return -1; + data[2] = fieldsize; + return 0; + + case 0x0E: + if (fieldsize > 0xfffful) + return -1; + data[2] = (fieldsize >> 8) & 0xff; + data[3] = fieldsize & 0xff; + return 0; + + case 0x0F: + if (fieldsize > 0xfffffffful) + return -1; + data[2] = (fieldsize >> 24) & 0xff; + data[3] = (fieldsize >> 16) & 0xff; + data[4] = (fieldsize >> 8) & 0xff; + data[5] = fieldsize & 0xff; + return 0; + + default: + if (fieldsize > 0x0C) + return -1; + data[1] = (data[1] & 0xf0) | fieldsize; + return 0; + } +} + +/* + * Find a given header field in the data. + */ +int rs_find_app_field(unsigned int type, /* Type of field to + search for (e.g., + 0x8040 to search + for the name) */ + const unsigned char* data, /* Data to search */ + unsigned long length, /* Maximum length of + data to search */ + unsigned long* fieldhead, /* Offset to field + type bytes, if + found */ + unsigned long* fieldstart, /* Offset to start of + field contents, if + found */ + unsigned long* fieldsize) /* Length of field + contents, if + found */ +{ + unsigned char b1, b2; + unsigned long pos = 0; + unsigned long fstart, fsize; + + b1 = ((type >> 8) & 0xff); + b2 = (type & 0xf0); + + while (pos < length) { + if (data[pos] == b1 && (data[pos + 1] & 0xf0) == b2) { + rs_get_field_size(data + pos, &fstart, fieldsize); + if (fieldhead) *fieldhead = pos; + if (fieldstart) *fieldstart = pos + fstart; + return 0; + } + + rs_get_field_size(data + pos, &fstart, &fsize); + pos += fstart + fsize; + } + + return -1; +} + +/* + * Get value of a numeric header field. + * + * Return 0 if field is not found, or if its contents are longer than + * 4 bytes. + */ +unsigned long rs_get_numeric_field (unsigned int type, + const unsigned char* data, + unsigned long length) +{ + unsigned long fstart, fsize, value; + + if (rs_find_app_field(type, data, length, NULL, &fstart, &fsize)) + return 0; + + if (fsize > 4) + return 0; + + value = 0; + while (fsize > 0) { + value <<= 8; + value |= data[fstart]; + fstart++; + fsize--; + } + return value; +} diff --git a/tool/rabbitsign-src/input.c b/tool/rabbitsign-src/input.c new file mode 100644 index 0000000..2f0ce37 --- /dev/null +++ b/tool/rabbitsign-src/input.c @@ -0,0 +1,520 @@ +/* + * RabbitSign - Tools for signing TI graphing calculator software + * Copyright (C) 2009 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#ifdef HAVE_STRING_H +# include +#else +# ifdef HAVE_STRINGS_H +# include +# endif +#endif + +#include "rabbitsign.h" +#include "internal.h" + +/* + * Determine the type of an unknown program, if possible. + */ +static void guess_type(RSProgram* prgm, int is_hex) +{ + const unsigned char* hdr; + unsigned long hdrstart, hdrsize, keyid, fieldstart, fieldsize; + + /* Z80 OSes have a detached program header */ + + if (prgm->header_length > 2 && prgm->header[0] == 0x80) { + rs_get_field_size(prgm->header, &hdrstart, NULL); + hdr = prgm->header + hdrstart; + hdrsize = prgm->header_length - hdrstart; + keyid = rs_get_numeric_field(0x8010, hdr, hdrsize); + + prgm->datatype = RS_DATA_OS; + + if ((keyid & 0xff) == 0x02) { + prgm->calctype = RS_CALC_TI73; + } + else { + prgm->calctype = RS_CALC_TI83P; + } + } + else if (prgm->length > 2) { + rs_get_field_size(prgm->data, &hdrstart, NULL); + hdr = prgm->data + hdrstart; + hdrsize = prgm->length - hdrstart; + if (hdrsize > 128) + hdrsize = 128; + + /* Z80 apps and 68k OSes have field type 0x8000 */ + + if (prgm->data[0] == 0x80 && (prgm->data[1] & 0xf0) == 0x00) { + keyid = rs_get_numeric_field(0x8010, hdr, hdrsize); + + switch (keyid & 0xff) { + case 0x02: + prgm->calctype = RS_CALC_TI73; + prgm->datatype = RS_DATA_APP; + break; + + case 0x04: + case 0x0A: + prgm->calctype = RS_CALC_TI83P; + prgm->datatype = RS_DATA_APP; + break; + + case 0x03: + case 0x09: + prgm->calctype = RS_CALC_TI89; + prgm->datatype = RS_DATA_OS; + break; + + case 0x01: + case 0x08: + prgm->calctype = RS_CALC_TI92P; + prgm->datatype = RS_DATA_OS; + break; + + default: + if (is_hex) { + prgm->calctype = RS_CALC_TI83P; + prgm->datatype = RS_DATA_APP; + } + break; + } + } + + /* 68k apps have field type 0x8100 */ + + else if (prgm->data[0] == 0x81 && (prgm->data[1] & 0xf0) == 0x00) { + keyid = rs_get_numeric_field(0x8110, hdr, hdrsize); + prgm->datatype = RS_DATA_APP; + + switch (keyid & 0xff) { + case 0x03: + case 0x09: + prgm->calctype = RS_CALC_TI89; + break; + + case 0x01: + case 0x08: + prgm->calctype = RS_CALC_TI92P; + break; + } + } + + /* Certificates have field type 0x0300 */ + + else if (prgm->data[0] == 0x03 && (prgm->data[1] & 0xf0) == 0x00) { + prgm->datatype = RS_DATA_CERT; + + if (!rs_find_app_field(0x0400, hdr, hdrsize, + NULL, &fieldstart, &fieldsize) + && fieldsize >= 1) { + switch (hdr[fieldstart]) { + case 0x02: + prgm->calctype = RS_CALC_TI73; + break; + + case 0x04: + case 0x0A: + prgm->calctype = RS_CALC_TI83P; + break; + + case 0x03: + case 0x09: + prgm->calctype = RS_CALC_TI89; + break; + + case 0x01: + case 0x08: + prgm->calctype = RS_CALC_TI92P; + break; + } + } + } + } +} + +/* + * Read the contents of a binary file into an RSProgram. + */ +static int read_file_binary(RSProgram* prgm, + FILE* f, + unsigned long filesize) +{ + unsigned char buf[1024]; + size_t count; + + if (filesize) { + while (filesize > 0) { + if (filesize > 1024) + count = fread(buf, 1, 1024, f); + else + count = fread(buf, 1, filesize, f); + + if (count > 0) + rs_program_append_data(prgm, buf, count); + else + break; + + filesize -= count; + } + } + else { + do { + count = fread(buf, 1, 1024, f); + if (count > 0) { + rs_program_append_data(prgm, buf, count); + } + } while (count > 0); + } + + if (!prgm->calctype || !prgm->datatype) + guess_type(prgm, 0); + return RS_SUCCESS; +} + +/* + * Find a given page in the list of page numbers (or add it to the + * end.) + */ +static int getpageidx(RSProgram* prgm, /* program */ + unsigned int pagenum) /* page number */ +{ + int i; + unsigned int* array; + + for (i = 0; i < prgm->npagenums; i++) + if (prgm->pagenums[i] == pagenum) + return i; + + if (!(array = rs_realloc(prgm->pagenums, (i + 1) * sizeof(unsigned int)))) + return 0; + prgm->pagenums = array; + prgm->npagenums = i + 1; + prgm->pagenums[i] = pagenum; + return i; +} + +/* + * Read an Intel/TI hex file into an RSProgram. + * + * Note that the first ':' is assumed to have been read already. + */ +static int read_file_hex(RSProgram* prgm, + FILE* f, + unsigned int flags) +{ + int c; + unsigned int nbytes, addr, rectype, sum, i, b, value; + unsigned int pagenum = 0, pageidx = 0, lastaddr = 0; + unsigned long offset; + unsigned char data[256]; + unsigned char* sigp; + int nparts = 0; + int possibly_os_header = 1; + + rs_free(prgm->pagenums); + if (!(prgm->pagenums = rs_malloc(sizeof(unsigned int)))) + return RS_ERR_OUT_OF_MEMORY; + prgm->pagenums[0] = 0; + prgm->npagenums = 1; + + while (!feof(f) && !ferror(f)) { + if (3 > fscanf(f, "%2X%4X%2X", &nbytes, &addr, &rectype)) { + rs_error(NULL, prgm, "invalid hex data (following %X:%X)", + pagenum, lastaddr); + return RS_ERR_HEX_SYNTAX; + } + + /* Read data bytes */ + + sum = nbytes + addr + (addr >> 8) + rectype; + value = 0; + for (i = 0; i < nbytes; i++) { + if (1 > fscanf(f, "%2X", &b)) { + rs_error(NULL, prgm, "invalid hex data (at %X:%X)", + pagenum, addr); + return RS_ERR_HEX_SYNTAX; + } + data[i] = b; + sum += b; + value = (value << 8) + b; + } + + /* Read checksum */ + + c = fgetc(f); + if (c == 'X') { + c = fgetc(f); + if (c != 'X') { + rs_error(NULL, prgm, "invalid hex data (at %X:%X)", + pagenum, addr); + return RS_ERR_HEX_SYNTAX; + } + } + else { + ungetc(c, f); + if (1 > fscanf(f, "%2X", &b)) { + rs_error(NULL, prgm, "invalid hex data (at %X:%X)", + pagenum, addr); + return RS_ERR_HEX_SYNTAX; + } + sum += b; + if (sum & 0xff) + rs_warning(NULL, prgm, "incorrect checksum (at %X:%X)", + pagenum, addr); + } + + if (rectype == 0 && nbytes > 0) { + /* Record type 0: program data */ + + if (addr & 0xff00) + possibly_os_header = 0; + + addr &= 0x3fff; + + /* if program does not start at addr 0000 (or 4000), assume + unsorted */ + if (addr && prgm->length == 0) + flags &= ~RS_INPUT_SORTED; + + if ((flags & RS_INPUT_SORTED) && !addr && lastaddr) { + /* automatically switch to next page */ + pagenum++; + pageidx = getpageidx(prgm, pagenum); + if (!pageidx) + return RS_ERR_OUT_OF_MEMORY; + } + else if (addr < lastaddr) + flags &= ~RS_INPUT_SORTED; + + if (nparts == 2 && prgm->header_length) { + /* Reading an OS signature */ + if (addr + nbytes > prgm->signature_length) { + if (!(sigp = rs_realloc(prgm->signature, addr + nbytes))) + return RS_ERR_OUT_OF_MEMORY; + + prgm->signature = sigp; + if (addr > prgm->signature_length) { + memset(prgm->signature + prgm->signature_length, 0xff, + addr - prgm->signature_length); + } + prgm->signature_length = addr + nbytes; + } + memcpy(prgm->signature + addr, data, nbytes); + } + else { + /* Reading normal program data */ + offset = ((unsigned long) pageidx << 14) | addr; + if (offset + nbytes <= prgm->length) { + memcpy(prgm->data + offset, data, nbytes); + } + else { + rs_program_set_length(prgm, offset); + rs_program_append_data(prgm, data, nbytes); + } + } + + lastaddr = addr; + } + else if (rectype == 1) { + /* Record type 1: "end of file" */ + nparts++; + if (nparts == 3 && prgm->header_length) + break; + } + else if (rectype == 2 || rectype == 4) { + /* Record type 2 or 4: extended address */ + possibly_os_header = 0; + flags &= ~RS_INPUT_SORTED; + if (nparts < 2) { + pagenum = value; + pageidx = getpageidx(prgm, pagenum); + if (pagenum && !pageidx) + return RS_ERR_OUT_OF_MEMORY; + } + } + + do { + c = fgetc(f); + } while (c == '\n' || c == '\r' || c == ' '); + + if (c == EOF) + break; + else if (c != ':') { + if (rectype == 1) + break; + else { + rs_error(NULL, prgm, "invalid hex data (following %X:%X)", + pagenum, lastaddr); + return RS_ERR_HEX_SYNTAX; + } + } + + if (rectype == 1 && nparts == 1 && prgm->length > 0 + && possibly_os_header) { + /* Just finished reading OS header */ + flags &= ~RS_INPUT_SORTED; + pagenum = pageidx = 0; + + rs_free(prgm->header); + if (!(prgm->header = rs_malloc(prgm->length))) + return RS_ERR_OUT_OF_MEMORY; + + memcpy(prgm->header, prgm->data, prgm->length); + prgm->header_length = prgm->length; + prgm->length = 0; + possibly_os_header = 0; + } + } + + if (!prgm->calctype || !prgm->datatype) + guess_type(prgm, 1); + return RS_SUCCESS; +} + +/* + * Check if calc/data type matches expected type (or any recognized + * type, if none was specified.) + */ +static int check_tifl_type(int calctype, + int datatype, + int calctype_expected, + int datatype_expected) +{ + if (calctype_expected) { + if (calctype_expected != calctype) + return 0; + } + else { + if (calctype != RS_CALC_TI73 && calctype != RS_CALC_TI83P + && calctype != RS_CALC_TI89 && calctype != RS_CALC_TI92P) + return 0; + } + + if (datatype_expected) { + if (datatype_expected != datatype) + return 0; + } + else { + if (datatype != RS_DATA_APP && datatype != RS_DATA_OS) + return 0; + } + + return 1; +} + +/* + * Read program contents from a file. + * + * Various file formats are supported: + * + * - Raw binary (must begin with the value 0x80 or 0x81) + * - Plain Intel/TI hex + * - Binary TIFL (89k, 89u, ...) + * - Hex TIFL (8xk, 8xu, ...) + * + * Note: on platforms where it matters, all input files must be opened + * in "binary" mode. + */ +int rs_read_program_file(RSProgram* prgm, /* program */ + FILE* f, /* file */ + const char* fname, /* file name */ + unsigned int flags) /* option flags */ +{ + int c; + unsigned char tiflbuf[78]; + unsigned long tiflsize, i; + int e; + + rs_program_set_length(prgm, 0); + prgm->header_length = 0; + prgm->signature_length = 0; + prgm->npagenums = 0; + + rs_free(prgm->filename); + prgm->filename = rs_strdup(fname); + if (fname && !prgm->filename) + return RS_ERR_OUT_OF_MEMORY; + + if (flags & RS_INPUT_BINARY) + return read_file_binary(prgm, f, 0); + + c = fgetc(f); + if (c == 0x80 || c == 0x81) { + tiflbuf[0] = c; + if ((e = rs_program_append_data(prgm, tiflbuf, 1))) + return e; + return read_file_binary(prgm, f, 0); + } + + while (!feof(f) && !ferror(f)) { + if (c == ':') { + return read_file_hex(prgm, f, flags); + } + else if (c == '*') { + if (fread(tiflbuf, 1, 78, f) < 78 + || strncmp((char*) tiflbuf, "*TIFL**", 7)) { + rs_error(NULL, prgm, "unknown input file format"); + return RS_ERR_UNKNOWN_FILE_FORMAT; + } + + tiflsize = ((unsigned long) tiflbuf[73] + | ((unsigned long) tiflbuf[74] << 8) + | ((unsigned long) tiflbuf[75] << 16) + | ((unsigned long) tiflbuf[76] << 24)); + + if (check_tifl_type(tiflbuf[47], tiflbuf[48], + prgm->calctype, prgm->datatype)) { + prgm->calctype = tiflbuf[47]; + prgm->datatype = tiflbuf[48]; + + if (tiflbuf[77] == ':') + return read_file_hex(prgm, f, 0); + else { + if ((e = rs_program_append_data(prgm, tiflbuf + 77, 1))) + return e; + return read_file_binary(prgm, f, tiflsize ? tiflsize - 1 : 0); + } + } + else { + /* extra data (license, certificate, etc.) -- ignore */ + if (fseek(f, tiflsize - 1, SEEK_CUR)) { + for (i = 0; i < tiflsize - 1; i++) { + if (fgetc(f) == EOF) { + rs_error(NULL, prgm, "unexpected EOF"); + return RS_ERR_UNKNOWN_FILE_FORMAT; + } + } + } + } + } + + c = fgetc(f); + } + + rs_error(NULL, prgm, "unknown input file format"); + return RS_ERR_UNKNOWN_FILE_FORMAT; +} + diff --git a/tool/rabbitsign-src/internal.h b/tool/rabbitsign-src/internal.h new file mode 100644 index 0000000..d3fc1b5 --- /dev/null +++ b/tool/rabbitsign-src/internal.h @@ -0,0 +1,111 @@ +/* + * RabbitSign - Tools for signing TI graphing calculator software + * Copyright (C) 2009 Benjamin Moody + * + * 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 . + */ + +#ifndef __RABBITSIGN_INTERNAL_H__ +#define __RABBITSIGN_INTERNAL_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/**** Memory management (mem.c) ****/ + +#define rs_malloc(nnn) rs_realloc(0, (nnn)) +#define rs_free(ppp) rs_realloc((ppp), 0) +void* rs_realloc (void* ptr, unsigned long count) RS_ATTR_MALLOC; +char* rs_strdup (const char* str) RS_ATTR_MALLOC; + + +/**** Rabin signature functions (rabin.c) ****/ + +/* Compute a Rabin signature and the useful value of f. */ +RSStatus rs_sign_rabin (mpz_t res, int* f, const mpz_t hash, + int rootnum, RSKey* key); + +/* Check that the given Rabin signature is valid. */ +RSStatus rs_validate_rabin (const mpz_t sig, int f, const mpz_t hash, + const RSKey* key); + + +/**** RSA signature functions (rsa.c) ****/ + +/* Compute an RSA signature. */ +RSStatus rs_sign_rsa (mpz_t res, const mpz_t hash, RSKey* key); + +/* Check that the given RSA signature is valid. */ +RSStatus rs_validate_rsa (const mpz_t sig, const mpz_t hash, + const RSKey* key); + + +/**** TIFL file output (graphlink.c) ****/ + +/* Write TIFL header to a file. */ +RSStatus rs_write_tifl_header (FILE* f, int is_hex, int major, int minor, + int month, int day, int year, + const char* name, int calctype, int datatype, + unsigned long filesize); + + +/**** Type <-> string conversions (typestr.c) ****/ + +/* Get default file suffix for a given calc/data type. */ +const char* rs_type_to_suffix (RSCalcType calctype, RSDataType datatype, + int hexonly); + +/* Get implied calc/data type for a given file suffix. */ +int rs_suffix_to_type (const char* suff, RSCalcType* calctype, + RSDataType* datatype); + +/* Get a human-readable description of a calculator type. */ +const char* rs_calc_type_to_string (RSCalcType calctype); + +/* Get a human-readable description of a data type. */ +const char* rs_data_type_to_string (RSDataType datatype); + + +/**** Command line option parsing (cmdline.c) ****/ + +#define RS_CMDLINE_FINISHED 0 +#define RS_CMDLINE_FILENAME '#' +#define RS_CMDLINE_HELP '!' +#define RS_CMDLINE_VERSION '@' +#define RS_CMDLINE_ERROR '?' + +int rs_parse_cmdline(int argc, char** argv, const char* optstring, + int* i, int* j, const char** arg); + + +/**** Error/message logging (error.c) ****/ + +/* Display an error message */ +void rs_error (const RSKey* key, const RSProgram* prgm, + const char* fmt, ...) RS_ATTR_PRINTF(3,4); + +/* Display a warning message */ +void rs_warning (const RSKey* key, const RSProgram* prgm, + const char* fmt, ...) RS_ATTR_PRINTF(3,4); + +/* Display an informational message */ +void rs_message (int level, const RSKey* key, const RSProgram* prgm, + const char* fmt, ...) /*RS_ATTR_PRINTF(4,5)*/; + +#ifdef __cplusplus +} +#endif + +#endif /* __RABBITSIGN_INTERNAL_H__ */ diff --git a/tool/rabbitsign-src/keys.c b/tool/rabbitsign-src/keys.c new file mode 100644 index 0000000..d92f36b --- /dev/null +++ b/tool/rabbitsign-src/keys.c @@ -0,0 +1,234 @@ +/* + * RabbitSign - Tools for signing TI graphing calculator software + * Copyright (C) 2009 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#ifdef HAVE_STRING_H +# include +#else +# ifdef HAVE_STRINGS_H +# include +# endif +#endif + +#include "rabbitsign.h" +#include "internal.h" + +/* + * Create a new key. + */ +RSKey* rs_key_new() +{ + RSKey* key = rs_malloc(sizeof(RSKey)); + + if (!key) + return NULL; + + key->filename = NULL; + key->id = 0; + mpz_init(key->n); + mpz_init(key->p); + mpz_init(key->q); + mpz_init(key->qinv); + mpz_init(key->d); + + return key; +} + +/* + * Free a key. + */ +void rs_key_free(RSKey* key) +{ + if (!key) + return; + + rs_free(key->filename); + mpz_clear(key->n); + mpz_clear(key->p); + mpz_clear(key->q); + mpz_clear(key->qinv); + mpz_clear(key->d); + rs_free(key); +} + +/* + * Parse a number written in TI's hexadecimal key format. + */ +static int parse_value(mpz_t dest, /* mpz to store result */ + const char* str) /* string to parse */ +{ + unsigned int count, b, i; + int n; + unsigned char buf[256]; + + if (1 > sscanf(str, "%2X%n", &count, &n) || n != 2 + || (count * 2 + 2) > strlen(str)) + return 1; + + for (i = 0; i < count; i++) { + if (1 > sscanf(str + 2 + 2 * i, "%2X%n", &b, &n) || n != 2) + return 1; + buf[i] = b; + } + + mpz_import(dest, i, -1, 1, 0, 0, buf); + return 0; +} + +/* + * Read key from a file. + * + * Two formats of key file are supported: + * + * "Rabin" style (the type used by the TI-83 Plus SDK) consists of + * three lines: the public key (n) followed by its two factors (p and + * q.) + * + * "RSA" style (the type used by the TI-89/92 Plus SDK) also consists + * of three lines: the key ID, the public key (n), and the signing + * exponent (d). + * + * In either case, if we are only interested in validating signatures, + * the private key may be omitted. + * + * Note that "Rabin" style key files can be used to generate RSA + * signatures, but not vice versa. + */ +int rs_read_key_file(RSKey* key, /* key structure */ + FILE* f, /* file to read */ + const char* fname, /* file name */ + int verify) /* 1 = check key validity */ +{ + char buf[1024]; + mpz_t tmp; + + rs_free(key->filename); + key->filename = rs_strdup(fname); + if (fname && !key->filename) + return RS_ERR_OUT_OF_MEMORY; + + if (!fgets(buf, sizeof(buf), f)) { + rs_error(key, NULL, "invalid key file syntax"); + return RS_ERR_KEY_SYNTAX; + } + + if (strlen(buf) < 11) { + if (1 > sscanf(buf, "%lX", &key->id)) { + rs_error(key, NULL, "invalid key file syntax"); + return RS_ERR_KEY_SYNTAX; + } + + if (!fgets(buf, sizeof(buf), f) + || parse_value(key->n, buf)) { + rs_error(key, NULL, "invalid key file syntax"); + return RS_ERR_KEY_SYNTAX; + } + + if (!fgets(buf, sizeof(buf), f) + || parse_value(key->d, buf)) + mpz_set_ui(key->d, 0); + else if (verify) { + /* We can't truly verify the key without factoring n (which is + possible, given d, but would take a bit of work.) Instead, + test the key by performing a single RSA encryption and + decryption. */ + mpz_init(tmp); + mpz_set_ui(tmp, 17); + mpz_powm(tmp, tmp, tmp, key->n); + mpz_powm(tmp, tmp, key->d, key->n); + if (mpz_cmp_ui(tmp, 17)) { + mpz_clear(tmp); + rs_error(key, NULL, "private key incorrect (de != 1 mod phi(n))"); + return RS_ERR_INVALID_KEY; + } + mpz_clear(tmp); + } + + mpz_set_ui(key->p, 0); + mpz_set_ui(key->q, 0); + mpz_set_ui(key->qinv, 0); + } + else { + if (parse_value(key->n, buf)) { + rs_error(key, NULL, "invalid key file"); + return RS_ERR_KEY_SYNTAX; + } + + if (!fgets(buf, sizeof(buf), f) + || parse_value(key->p, buf) + || !fgets(buf, sizeof(buf), f) + || parse_value(key->q, buf)) { + mpz_set_ui(key->p, 0); + mpz_set_ui(key->q, 0); + } + else if (verify) { + /* Verify that p * q = n (of course, that doesn't guarantee that + these are the only factors of n.) */ + mpz_init(tmp); + mpz_mul(tmp, key->p, key->q); + if (mpz_cmp(tmp, key->n)) { + mpz_clear(tmp); + rs_error(key, NULL, "private key incorrect (pq != n)"); + return RS_ERR_INVALID_KEY; + } + mpz_clear(tmp); + } + + mpz_set_ui(key->qinv, 0); + mpz_set_ui(key->d, 0); + key->id = 0; + } + + if (mpz_sgn(key->p) && mpz_sgn(key->q)) { + rs_message(2, key, NULL, "Loaded Rabin/RSA private key:"); + rs_message(2, key, NULL, " n = %ZX", key->n); + rs_message(2, key, NULL, " p = %ZX", key->p); + rs_message(2, key, NULL, " q = %ZX", key->q); + } + else if (mpz_sgn(key->d)) { + rs_message(2, key, NULL, "Loaded RSA private key:"); + rs_message(2, key, NULL, " n = %ZX", key->n); + rs_message(2, key, NULL, " d = %ZX", key->d); + } + else { + rs_message(2, key, NULL, "Loaded public key:"); + rs_message(2, key, NULL, " n = %ZX", key->n); + } + + return RS_SUCCESS; +} + +/* + * Parse a number written in TI's hexadecimal key format. + */ +int rs_parse_key_value(mpz_t dest, /* mpz to store result */ + const char* str) /* string to parse */ +{ + if (parse_value(dest, str)) { + rs_error(NULL, NULL, "invalid key value syntax"); + return RS_ERR_KEY_SYNTAX; + } + else { + return RS_SUCCESS; + } +} diff --git a/tool/rabbitsign-src/md5.c b/tool/rabbitsign-src/md5.c new file mode 100644 index 0000000..d742c54 --- /dev/null +++ b/tool/rabbitsign-src/md5.c @@ -0,0 +1,419 @@ +/* md5.c - Functions to compute MD5 message digest of files or memory blocks + according to the definition of MD5 in RFC 1321 from April 1992. + Copyright (C) 1995, 1996 Free Software Foundation, Inc. + NOTE: The canonical source of this file is maintained with the GNU C + Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu. + + 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 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. + + 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. */ + +/* Written by Ulrich Drepper , 1995. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#if STDC_HEADERS || defined _LIBC +# include +# include +#else +# ifndef HAVE_MEMCPY +# define memcpy(d, s, n) bcopy ((s), (d), (n)) +# endif +#endif + +#include "md5.h" + +#ifdef _LIBC +# include +# if __BYTE_ORDER == __BIG_ENDIAN +# define WORDS_BIGENDIAN 1 +# endif +#endif + +#ifdef WORDS_BIGENDIAN +# define SWAP(n) \ + (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24)) +#else +# define SWAP(n) (n) +#endif + + +/* This array contains the bytes used to pad the buffer to the next + 64-byte boundary. (RFC 1321, 3.1: Step 1) */ +static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ }; + + +/* Initialize structure containing state of computation. + (RFC 1321, 3.3: Step 3) */ +void +md5_init_ctx (ctx) + struct md5_ctx *ctx; +{ + ctx->A = 0x67452301; + ctx->B = 0xefcdab89; + ctx->C = 0x98badcfe; + ctx->D = 0x10325476; + + ctx->total[0] = ctx->total[1] = 0; + ctx->buflen = 0; +} + +/* Put result from CTX in first 16 bytes following RESBUF. The result + must be in little endian byte order. + + IMPORTANT: On some systems it is required that RESBUF is correctly + aligned for a 32 bits value. */ +void * +md5_read_ctx (ctx, resbuf) + const struct md5_ctx *ctx; + void *resbuf; +{ + ((md5_uint32 *) resbuf)[0] = SWAP (ctx->A); + ((md5_uint32 *) resbuf)[1] = SWAP (ctx->B); + ((md5_uint32 *) resbuf)[2] = SWAP (ctx->C); + ((md5_uint32 *) resbuf)[3] = SWAP (ctx->D); + + return resbuf; +} + +/* Process the remaining bytes in the internal buffer and the usual + prolog according to the standard and write the result to RESBUF. + + IMPORTANT: On some systems it is required that RESBUF is correctly + aligned for a 32 bits value. */ +void * +md5_finish_ctx (ctx, resbuf) + struct md5_ctx *ctx; + void *resbuf; +{ + /* Take yet unprocessed bytes into account. */ + md5_uint32 bytes = ctx->buflen; + size_t pad; + + /* Now count remaining bytes. */ + ctx->total[0] += bytes; + if (ctx->total[0] < bytes) + ++ctx->total[1]; + + pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes; + memcpy (&ctx->buffer[bytes], fillbuf, pad); + + /* Put the 64-bit file length in *bits* at the end of the buffer. */ + *(md5_uint32 *) &ctx->buffer[bytes + pad] = SWAP (ctx->total[0] << 3); + *(md5_uint32 *) &ctx->buffer[bytes + pad + 4] = SWAP ((ctx->total[1] << 3) | + (ctx->total[0] >> 29)); + + /* Process last bytes. */ + md5_process_block (ctx->buffer, bytes + pad + 8, ctx); + + return md5_read_ctx (ctx, resbuf); +} + +/* Compute MD5 message digest for bytes read from STREAM. The + resulting message digest number will be written into the 16 bytes + beginning at RESBLOCK. */ +int +md5_stream (stream, resblock) + FILE *stream; + void *resblock; +{ + /* Important: BLOCKSIZE must be a multiple of 64. */ +#define BLOCKSIZE 4096 + struct md5_ctx ctx; + char buffer[BLOCKSIZE + 72]; + size_t sum; + + /* Initialize the computation context. */ + md5_init_ctx (&ctx); + + /* Iterate over full file contents. */ + while (1) + { + /* We read the file in blocks of BLOCKSIZE bytes. One call of the + computation function processes the whole buffer so that with the + next round of the loop another block can be read. */ + size_t n; + sum = 0; + + /* Read block. Take care for partial reads. */ + do + { + n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream); + + sum += n; + } + while (sum < BLOCKSIZE && n != 0); + if (n == 0 && ferror (stream)) + return 1; + + /* If end of file is reached, end the loop. */ + if (n == 0) + break; + + /* Process buffer with BLOCKSIZE bytes. Note that + BLOCKSIZE % 64 == 0 + */ + md5_process_block (buffer, BLOCKSIZE, &ctx); + } + + /* Add the last bytes if necessary. */ + if (sum > 0) + md5_process_bytes (buffer, sum, &ctx); + + /* Construct result in desired memory. */ + md5_finish_ctx (&ctx, resblock); + return 0; +} + +/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The + result is always in little endian byte order, so that a byte-wise + output yields to the wanted ASCII representation of the message + digest. */ +void * +md5_buffer (buffer, len, resblock) + const char *buffer; + size_t len; + void *resblock; +{ + struct md5_ctx ctx; + + /* Initialize the computation context. */ + md5_init_ctx (&ctx); + + /* Process whole buffer but last len % 64 bytes. */ + md5_process_bytes (buffer, len, &ctx); + + /* Put result in desired memory area. */ + return md5_finish_ctx (&ctx, resblock); +} + + +void +md5_process_bytes (buffer, len, ctx) + const void *buffer; + size_t len; + struct md5_ctx *ctx; +{ + /* When we already have some bits in our internal buffer concatenate + both inputs first. */ + if (ctx->buflen != 0) + { + size_t left_over = ctx->buflen; + size_t add = 128 - left_over > len ? len : 128 - left_over; + + memcpy (&ctx->buffer[left_over], buffer, add); + ctx->buflen += add; + + if (left_over + add > 64) + { + md5_process_block (ctx->buffer, (left_over + add) & ~63, ctx); + /* The regions in the following copy operation cannot overlap. */ + memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63], + (left_over + add) & 63); + ctx->buflen = (left_over + add) & 63; + } + + buffer = (const char *) buffer + add; + len -= add; + } + + /* Process available complete blocks. */ + if (len > 64) + { + md5_process_block (buffer, len & ~63, ctx); + buffer = (const char *) buffer + (len & ~63); + len &= 63; + } + + /* Move remaining bytes in internal buffer. */ + if (len > 0) + { + memcpy (ctx->buffer, buffer, len); + ctx->buflen = len; + } +} + + +/* These are the four functions used in the four steps of the MD5 algorithm + and defined in the RFC 1321. The first function is a little bit optimized + (as found in Colin Plumbs public domain implementation). */ +/* #define FF(b, c, d) ((b & c) | (~b & d)) */ +#define FF(b, c, d) (d ^ (b & (c ^ d))) +#define FG(b, c, d) FF (d, b, c) +#define FH(b, c, d) (b ^ c ^ d) +#define FI(b, c, d) (c ^ (b | ~d)) + +/* Process LEN bytes of BUFFER, accumulating context into CTX. + It is assumed that LEN % 64 == 0. */ + +void +md5_process_block (buffer, len, ctx) + const void *buffer; + size_t len; + struct md5_ctx *ctx; +{ + md5_uint32 correct_words[16]; + const md5_uint32 *words = buffer; + size_t nwords = len / sizeof (md5_uint32); + const md5_uint32 *endp = words + nwords; + md5_uint32 A = ctx->A; + md5_uint32 B = ctx->B; + md5_uint32 C = ctx->C; + md5_uint32 D = ctx->D; + + /* First increment the byte count. RFC 1321 specifies the possible + length of the file up to 2^64 bits. Here we only compute the + number of bytes. Do a double word increment. */ + ctx->total[0] += len; + if (ctx->total[0] < len) + ++ctx->total[1]; + + /* Process all bytes in the buffer with 64 bytes in each round of + the loop. */ + while (words < endp) + { + md5_uint32 *cwp = correct_words; + md5_uint32 A_save = A; + md5_uint32 B_save = B; + md5_uint32 C_save = C; + md5_uint32 D_save = D; + + /* First round: using the given function, the context and a constant + the next context is computed. Because the algorithms processing + unit is a 32-bit word and it is determined to work on words in + little endian byte order we perhaps have to change the byte order + before the computation. To reduce the work for the next steps + we store the swapped words in the array CORRECT_WORDS. */ + +#define OP(a, b, c, d, s, T) \ + do \ + { \ + a += FF (b, c, d) + (*cwp++ = SWAP (*words)) + T; \ + ++words; \ + CYCLIC (a, s); \ + a += b; \ + } \ + while (0) + + /* It is unfortunate that C does not provide an operator for + cyclic rotation. Hope the C compiler is smart enough. */ +#define CYCLIC(w, s) (w = (w << s) | (w >> (32 - s))) + + /* Before we start, one word to the strange constants. + They are defined in RFC 1321 as + + T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64 + */ + + /* Round 1. */ + OP (A, B, C, D, 7, 0xd76aa478); + OP (D, A, B, C, 12, 0xe8c7b756); + OP (C, D, A, B, 17, 0x242070db); + OP (B, C, D, A, 22, 0xc1bdceee); + OP (A, B, C, D, 7, 0xf57c0faf); + OP (D, A, B, C, 12, 0x4787c62a); + OP (C, D, A, B, 17, 0xa8304613); + OP (B, C, D, A, 22, 0xfd469501); + OP (A, B, C, D, 7, 0x698098d8); + OP (D, A, B, C, 12, 0x8b44f7af); + OP (C, D, A, B, 17, 0xffff5bb1); + OP (B, C, D, A, 22, 0x895cd7be); + OP (A, B, C, D, 7, 0x6b901122); + OP (D, A, B, C, 12, 0xfd987193); + OP (C, D, A, B, 17, 0xa679438e); + OP (B, C, D, A, 22, 0x49b40821); + + /* For the second to fourth round we have the possibly swapped words + in CORRECT_WORDS. Redefine the macro to take an additional first + argument specifying the function to use. */ +#undef OP +#define OP(f, a, b, c, d, k, s, T) \ + do \ + { \ + a += f (b, c, d) + correct_words[k] + T; \ + CYCLIC (a, s); \ + a += b; \ + } \ + while (0) + + /* Round 2. */ + OP (FG, A, B, C, D, 1, 5, 0xf61e2562); + OP (FG, D, A, B, C, 6, 9, 0xc040b340); + OP (FG, C, D, A, B, 11, 14, 0x265e5a51); + OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa); + OP (FG, A, B, C, D, 5, 5, 0xd62f105d); + OP (FG, D, A, B, C, 10, 9, 0x02441453); + OP (FG, C, D, A, B, 15, 14, 0xd8a1e681); + OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8); + OP (FG, A, B, C, D, 9, 5, 0x21e1cde6); + OP (FG, D, A, B, C, 14, 9, 0xc33707d6); + OP (FG, C, D, A, B, 3, 14, 0xf4d50d87); + OP (FG, B, C, D, A, 8, 20, 0x455a14ed); + OP (FG, A, B, C, D, 13, 5, 0xa9e3e905); + OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8); + OP (FG, C, D, A, B, 7, 14, 0x676f02d9); + OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a); + + /* Round 3. */ + OP (FH, A, B, C, D, 5, 4, 0xfffa3942); + OP (FH, D, A, B, C, 8, 11, 0x8771f681); + OP (FH, C, D, A, B, 11, 16, 0x6d9d6122); + OP (FH, B, C, D, A, 14, 23, 0xfde5380c); + OP (FH, A, B, C, D, 1, 4, 0xa4beea44); + OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9); + OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60); + OP (FH, B, C, D, A, 10, 23, 0xbebfbc70); + OP (FH, A, B, C, D, 13, 4, 0x289b7ec6); + OP (FH, D, A, B, C, 0, 11, 0xeaa127fa); + OP (FH, C, D, A, B, 3, 16, 0xd4ef3085); + OP (FH, B, C, D, A, 6, 23, 0x04881d05); + OP (FH, A, B, C, D, 9, 4, 0xd9d4d039); + OP (FH, D, A, B, C, 12, 11, 0xe6db99e5); + OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8); + OP (FH, B, C, D, A, 2, 23, 0xc4ac5665); + + /* Round 4. */ + OP (FI, A, B, C, D, 0, 6, 0xf4292244); + OP (FI, D, A, B, C, 7, 10, 0x432aff97); + OP (FI, C, D, A, B, 14, 15, 0xab9423a7); + OP (FI, B, C, D, A, 5, 21, 0xfc93a039); + OP (FI, A, B, C, D, 12, 6, 0x655b59c3); + OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92); + OP (FI, C, D, A, B, 10, 15, 0xffeff47d); + OP (FI, B, C, D, A, 1, 21, 0x85845dd1); + OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f); + OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0); + OP (FI, C, D, A, B, 6, 15, 0xa3014314); + OP (FI, B, C, D, A, 13, 21, 0x4e0811a1); + OP (FI, A, B, C, D, 4, 6, 0xf7537e82); + OP (FI, D, A, B, C, 11, 10, 0xbd3af235); + OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb); + OP (FI, B, C, D, A, 9, 21, 0xeb86d391); + + /* Add the starting values of the context. */ + A += A_save; + B += B_save; + C += C_save; + D += D_save; + } + + /* Put checksum in context given as argument. */ + ctx->A = A; + ctx->B = B; + ctx->C = C; + ctx->D = D; +} diff --git a/tool/rabbitsign-src/md5.h b/tool/rabbitsign-src/md5.h new file mode 100644 index 0000000..ad97efc --- /dev/null +++ b/tool/rabbitsign-src/md5.h @@ -0,0 +1,146 @@ +/* md5.h - Declaration of functions and data types used for MD5 sum + computing library functions. + Copyright (C) 1995, 1996 Free Software Foundation, Inc. + NOTE: The canonical source of this file is maintained with the GNU C + Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu. + + 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 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. + + 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 _MD5_H +#define _MD5_H 1 + +#include + +#if defined HAVE_LIMITS_H || _LIBC +# include +#endif + +/* The following contortions are an attempt to use the C preprocessor + to determine an unsigned integral type that is 32 bits wide. An + alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but + doing that would require that the configure script compile and *run* + the resulting executable. Locally running cross-compiled executables + is usually not possible. */ + +#ifdef _LIBC +# include +typedef u_int32_t md5_uint32; +#else +# if defined __STDC__ && __STDC__ +# define UINT_MAX_32_BITS 4294967295U +# else +# define UINT_MAX_32_BITS 0xFFFFFFFF +# endif + +/* If UINT_MAX isn't defined, assume it's a 32-bit type. + This should be valid for all systems GNU cares about because + that doesn't include 16-bit systems, and only modern systems + (that certainly have ) have 64+-bit integral types. */ + +# ifndef UINT_MAX +# define UINT_MAX UINT_MAX_32_BITS +# endif + +# if UINT_MAX == UINT_MAX_32_BITS + typedef unsigned int md5_uint32; +# else +# if USHRT_MAX == UINT_MAX_32_BITS + typedef unsigned short md5_uint32; +# else +# if ULONG_MAX == UINT_MAX_32_BITS + typedef unsigned long md5_uint32; +# else + /* The following line is intended to evoke an error. + Using #error is not portable enough. */ + "Cannot determine unsigned 32-bit data type." +# endif +# endif +# endif +#endif + +#undef __P +#if defined (__STDC__) && __STDC__ +#define __P(x) x +#else +#define __P(x) () +#endif + +/* Structure to save state of computation between the single steps. */ +struct md5_ctx +{ + md5_uint32 A; + md5_uint32 B; + md5_uint32 C; + md5_uint32 D; + + md5_uint32 total[2]; + md5_uint32 buflen; + char buffer[128]; +}; + +/* + * The following three functions are build up the low level used in + * the functions `md5_stream' and `md5_buffer'. + */ + +/* Initialize structure containing state of computation. + (RFC 1321, 3.3: Step 3) */ +extern void md5_init_ctx __P ((struct md5_ctx *ctx)); + +/* Starting with the result of former calls of this function (or the + initialization function update the context for the next LEN bytes + starting at BUFFER. + It is necessary that LEN is a multiple of 64!!! */ +extern void md5_process_block __P ((const void *buffer, size_t len, + struct md5_ctx *ctx)); + +/* Starting with the result of former calls of this function (or the + initialization function update the context for the next LEN bytes + starting at BUFFER. + It is NOT required that LEN is a multiple of 64. */ +extern void md5_process_bytes __P ((const void *buffer, size_t len, + struct md5_ctx *ctx)); + +/* Process the remaining bytes in the buffer and put result from CTX + in first 16 bytes following RESBUF. The result is always in little + endian byte order, so that a byte-wise output yields to the wanted + ASCII representation of the message digest. + + IMPORTANT: On some systems it is required that RESBUF is correctly + aligned for a 32 bits value. */ +extern void *md5_finish_ctx __P ((struct md5_ctx *ctx, void *resbuf)); + + +/* Put result from CTX in first 16 bytes following RESBUF. The result is + always in little endian byte order, so that a byte-wise output yields + to the wanted ASCII representation of the message digest. + + IMPORTANT: On some systems it is required that RESBUF is correctly + aligned for a 32 bits value. */ +extern void *md5_read_ctx __P ((const struct md5_ctx *ctx, void *resbuf)); + + +/* Compute MD5 message digest for bytes read from STREAM. The + resulting message digest number will be written into the 16 bytes + beginning at RESBLOCK. */ +extern int md5_stream __P ((FILE *stream, void *resblock)); + +/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The + result is always in little endian byte order, so that a byte-wise + output yields to the wanted ASCII representation of the message + digest. */ +extern void *md5_buffer __P ((const char *buffer, size_t len, void *resblock)); + +#endif diff --git a/tool/rabbitsign-src/mem.c b/tool/rabbitsign-src/mem.c new file mode 100644 index 0000000..d65064b --- /dev/null +++ b/tool/rabbitsign-src/mem.c @@ -0,0 +1,73 @@ +/* + * RabbitSign - Tools for signing TI graphing calculator software + * Copyright (C) 2009 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#ifdef HAVE_STDLIB_H +# include +#endif + +#ifdef HAVE_STRING_H +# include +#else +# ifdef HAVE_STRINGS_H +# include +# endif +#endif + +#include "rabbitsign.h" +#include "internal.h" + +void* rs_realloc(void* ptr, unsigned long count) +{ + void* p; + + if (!count) { + if (ptr) { + free(ptr); + } + return NULL; + } + + if (ptr) + p = realloc(ptr, count); + else + p = malloc(count); + if (!p) + rs_error(NULL, NULL, "out of memory (need %lu bytes)", count); + return p; +} + +char* rs_strdup(const char* str) +{ + int n; + char* p; + + if (!str) + return NULL; + + n = strlen(str); + p = rs_malloc(n + 1); + if (p) + memcpy(p, str, n + 1); + return p; +} diff --git a/tool/rabbitsign-src/mpz.c b/tool/rabbitsign-src/mpz.c new file mode 100644 index 0000000..2a38ef5 --- /dev/null +++ b/tool/rabbitsign-src/mpz.c @@ -0,0 +1,1026 @@ +/* + * RabbitSign - Tools for signing TI graphing calculator software + * Copyright (C) 2009 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#ifdef HAVE_STDLIB_H +# include +#endif + +#ifdef HAVE_ASSERT_H +# include +#else +# define assert(xxx) if (!(xxx)) { \ + fprintf(stderr, "mpz: assertion \"%s\" failed\n", #xxx); \ + abort(); \ + } +#endif + +#include "mpz.h" + +/* + * This file contains multiple-precision arithmetic functions. These + * are equivalent to the corresponding GMP functions in the ways they + * are used by RabbitSign. + * + * HOWEVER, they are not by any means complete. They do not meet the + * specifications of the GMP functions; for the sake of portability + * and compactness they are vastly less efficient; and they may even + * have bugs. + */ + +/* +#define DBG(args...) if (1) \ + do { \ + gmp_fprintf(stderr, "mpz: " args); \ + fputc('\n', stderr); \ + } while (0) +*/ + +#define IDX(nnn, iii) (nnn)->m[iii] + +/* \ + (*(__extension__ ({ \ + int _ii = (iii); \ + const struct _mpz* _nn = (nnn); \ + assert(_nn->size <= _nn->size_alloc); \ + assert(_ii >= 0); \ + assert(((unsigned) _ii) < (_nn->size)); \ + &(_nn->m[_ii]); }))) +*/ + +static void* xrealloc(p, n) + void* p; + size_t n; +{ + void* res; + + if (n <= 0) + n = 1; + + if (p) + res = realloc(p, n); + else + res = malloc(n); + + if (!res) { + fprintf(stderr,"mpz: out of memory (need %lu bytes)\n", + (unsigned long) n); + abort(); + } + return res; +} + +static inline void allocate_mpz(x) + mpz_t x; +{ + if (x->size_alloc < x->size) { + x->size_alloc = x->size; + x->m = (limb_t*) xrealloc(x->m, x->size_alloc * sizeof(limb_t)); + } +} + +static inline void zero_mpz(x) + mpz_t x; +{ + size_t i; + for (i = 0; i < x->size; i++) + IDX(x, i) = 0; +} + +static inline void copyref_mpz(dest, src) + mpz_t dest; + const mpz_t src; +{ + dest->size = src->size; + dest->size_alloc = src->size_alloc; + dest->m = src->m; + dest->sign = src->sign; +} + +static inline void reduce_mpz(x) + mpz_t x; +{ + while (x->size > 0 && IDX(x, (x->size) - 1) == 0) + x->size--; +} + +/**************** Init / Clear ****************/ + +void mpz_init(x) + mpz_t x; +{ + x->size = 0; + x->size_alloc = 0; + x->m = (limb_t*)0; + x->sign = 1; +} + +void mpz_clear(x) + mpz_t x; +{ + if (x->m) + free(x->m); + mpz_init(x); +} + +/**************** Setting ****************/ + +void mpz_set(dest, src) + mpz_t dest; + const mpz_t src; +{ + size_t i; + + dest->size = src->size; + allocate_mpz(dest); + dest->sign = src->sign; + + for (i = 0; i < src->size; i++) + IDX(dest, i) = IDX(src, i); +} + +void mpz_set_ui(dest, a) + mpz_t dest; + unsigned int a; +{ + if (a) { + dest->size = 1; + allocate_mpz(dest); + IDX(dest, 0) = a; + } + else + dest->size = 0; + dest->sign = 1; +} + +unsigned int mpz_get_ui(a) + const mpz_t a; +{ + return IDX(a, 0); +} + +static void mpz_swap(a, b) + mpz_t a; + mpz_t b; +{ + mpz_t temp; + copyref_mpz(temp, a); + copyref_mpz(a, b); + copyref_mpz(b, temp); +} + +/**************** Import / Export ****************/ + +void mpz_import(dest, count, order, size, endian, nails, op) + mpz_t dest; + size_t count; + int order; /* must be -1 (little endian structure) */ + int size; /* must be 1 (bytes) */ + int endian; /* must be 0 (native endian words, doesn't matter for bytes) */ + size_t nails; /* must be 0 (no nails) */ + const void* op; +{ + size_t i, j; + + assert(order == -1); + assert(size == 1); + assert(endian == 0); + assert(nails == 0); + + dest->size = (count + LIMB_BYTES - 1) / LIMB_BYTES; + allocate_mpz(dest); + dest->sign = 1; + + for (i = 0; i < dest->size; i++) { + IDX(dest, i) = 0; + for (j = 0; j < LIMB_BYTES && ((i * LIMB_BYTES) + j) < count; j++) { + IDX(dest, i) |= ((unsigned char*)op)[(i * LIMB_BYTES) + j] << 8 * j; + } + } +} + +void mpz_export(dest, count, order, size, endian, nails, op) + void* dest; + size_t* count; + int order; /* must be -1 (little endian structure) */ + int size; /* must be 1 (bytes) */ + int endian; /* must be 0 (native endian words, doesn't matter for bytes) */ + size_t nails; /* must be 0 (no nails) */ + const mpz_t op; +{ + size_t i, j; + + assert(order == -1); + assert(size == 1); + assert(endian == 0); + assert(nails == 0); + + for (i = 0; i < op->size; i++) { + for (j = 0; j < LIMB_BYTES; j++) { + ((unsigned char*)dest)[(i * LIMB_BYTES) + j] = IDX(op, i) >> 8 * j; + } + } + *count = op->size * LIMB_BYTES; +} + +/**************** Comparison ****************/ + +int mpz_sgn(a) + const mpz_t a; +{ + size_t i = a->size; + + while (i > 0 && IDX(a, i - 1) == 0) + i--; + + if (i == 0) + return 0; + else + return a->sign; +} + +static int mpz_cmpabs(a, b) + const mpz_t a; + const mpz_t b; +{ + size_t sa = a->size; + size_t sb = b->size; + + while (sa > 0 && IDX(a, sa - 1) == 0) + sa--; + while (sb > 0 && IDX(b, sb - 1) == 0) + sb--; + + if (sa > sb) + return 1; + else if (sb > sa) + return -1; + + while (sa > 0) { + if (IDX(a, sa - 1) > IDX(b, sa - 1)) + return 1; + else if (IDX(a, sa - 1) < IDX(b, sa - 1)) + return -1; + sa--; + } + + return 0; +} + +int mpz_cmp(a, b) + const mpz_t a; + const mpz_t b; +{ + size_t sa = a->size; + size_t sb = b->size; + + while (sa > 0 && IDX(a, sa - 1) == 0) + sa--; + while (sb > 0 && IDX(b, sb - 1) == 0) + sb--; + + if (sa == 0 && sb == 0) + return 0; + else if (sa == 0) + return -(b->sign); + else if (sb == 0) + return a->sign; + else if (a->sign != b->sign) + return a->sign; + + return a->sign * mpz_cmpabs(a, b); +} + +int mpz_cmp_ui(a, b) + const mpz_t a; + unsigned int b; +{ + size_t sa = a->size; + + while (sa > 0 && IDX(a, sa - 1) == 0) + sa--; + + if (sa == 0 && b == 0) + return 0; + + if (sa == 1 && a->sign == 1) { + if (IDX(a, 0) > b) + return 1; + else if (IDX(a, 0) < b) + return -1; + else + return 0; + } + + return (a->sign); +} + +/**************** Addition / Subtraction ****************/ + +static void mpz_addabs(dest, a, b) + mpz_t dest; /* != a, b */ + const mpz_t a; + const mpz_t b; +{ + size_t i; + double_limb_t carry = 0; + + if (a->size > b->size) + dest->size = a->size + 1; + else + dest->size = b->size + 1; + allocate_mpz(dest); + + assert(dest != a); + assert(dest != b); + + for (i = 0; i < a->size && i < b->size; i++) { + carry += IDX(a, i); + carry += IDX(b, i); + IDX(dest, i) = carry & LIMB_MASK; + carry >>= LIMB_BITS; + } + + for (; i < a->size; i++) { + carry += IDX(a, i); + IDX(dest, i) = carry & LIMB_MASK; + carry >>= LIMB_BITS; + } + + for (; i < b->size; i++) { + carry += IDX(b, i); + IDX(dest, i) = carry & LIMB_MASK; + carry >>= LIMB_BITS; + } + IDX(dest, i) = carry; +} + +static void mpz_subabs(dest, a, b) + mpz_t dest; /* != b */ + const mpz_t a; + const mpz_t b; /* must be <= a */ +{ + size_t i; + signed_double_limb_t carry = 0; + dest->size = a->size; + allocate_mpz(dest); + + assert(dest != b); + + for (i = 0; i < a->size && i < b->size; i++) { + carry += IDX(a, i); + carry -= IDX(b, i); + IDX(dest, i) = carry & LIMB_MASK; + carry >>= LIMB_BITS; + } + + for (; i < a->size; i++) { + carry += IDX(a, i); + IDX(dest, i) = carry & LIMB_MASK; + carry >>= LIMB_BITS; + } + + assert(carry == 0); +} + +void mpz_add(dest, a, b) + mpz_t dest; + const mpz_t a; + const mpz_t b; +{ + mpz_t temp; + mpz_init(temp); + + if (a->sign == b->sign) { + temp->sign = a->sign; + mpz_addabs(temp, a, b); + } + else if (mpz_cmpabs(a, b) > 0) { + temp->sign = a->sign; + mpz_subabs(temp, a, b); + } + else { + temp->sign = b->sign; + mpz_subabs(temp, b, a); + } + + reduce_mpz(temp); + mpz_clear(dest); + copyref_mpz(dest, temp); +} + +void mpz_sub(dest, a, b) + mpz_t dest; + const mpz_t a; + const mpz_t b; +{ + mpz_t temp; + mpz_init(temp); + + if (a->sign != b->sign) { + temp->sign = a->sign; + mpz_addabs(temp, a, b); + } + else if (mpz_cmpabs(a, b) > 0) { + temp->sign = a->sign; + mpz_subabs(temp, a, b); + } + else { + temp->sign = -(b->sign); + mpz_subabs(temp, b, a); + } + + reduce_mpz(temp); + mpz_clear(dest); + copyref_mpz(dest, temp); +} + +void mpz_add_ui(dest, a, b) + mpz_t dest; + const mpz_t a; + unsigned int b; +{ + size_t i; + mpz_t temp; + mpz_init(temp); + + temp->size = a->size + 1; + temp->sign = a->sign; + allocate_mpz(temp); + + for (i = 0; i < a->size; i++) { + IDX(temp, i) = IDX(a, i) + b; + b = (IDX(temp, i) < IDX(a, i)) ? 1 : 0; + } + IDX(temp, i) = b; + + reduce_mpz(temp); + mpz_clear(dest); + copyref_mpz(dest, temp); +} + +void mpz_sub_ui(dest, a, b) + mpz_t dest; + const mpz_t a; + unsigned int b; +{ + size_t i; + mpz_t temp; + mpz_init(temp); + + temp->size = a->size; + temp->sign = a->sign; + allocate_mpz(temp); + + for (i = 0; i < a->size; i++) { + IDX(temp, i) = IDX(a, i) - b; + b = (IDX(temp, i) > IDX(a, i)) ? 1 : 0; + } + assert(b == 0); + + reduce_mpz(temp); + mpz_clear(dest); + copyref_mpz(dest, temp); +} + +/**************** Multiplication ****************/ + +void mpz_mul(dest, a, b) + mpz_t dest; + const mpz_t a; + const mpz_t b; +{ + double_limb_t carry = 0, newcarry; + size_t i, j, k; + mpz_t temp; + mpz_init(temp); + + temp->size = a->size + b->size; + temp->sign = a->sign * b->sign; + allocate_mpz(temp); + zero_mpz(temp); + + for (i = 0; i < a->size; i++) { + for (j = 0; j < b->size; j++) { + carry = IDX(a, i); + carry *= IDX(b, j); + for (k = i + j; k < temp->size && carry; k++) { + newcarry = carry + IDX(temp, k); + if (newcarry < carry) { + IDX(temp, k) = newcarry & LIMB_MASK; + carry = (newcarry >> LIMB_BITS) + LIMB_MASK + 1; + } + else { + IDX(temp, k) = newcarry & LIMB_MASK; + carry = (newcarry >> LIMB_BITS); + } + } + assert(carry == 0); + } + } + + reduce_mpz(temp); + mpz_clear(dest); + copyref_mpz(dest, temp); +} + +void mpz_mul_ui(dest, a, b) + mpz_t dest; + const mpz_t a; + unsigned int b; /* must be fairly small */ +{ + double_limb_t carry = 0; + size_t i; + mpz_t temp; + mpz_init(temp); + + temp->size = a->size + 1; + temp->sign = a->sign; + allocate_mpz(temp); + + for (i = 0; i < a->size; i++) { + carry += (double_limb_t) IDX(a, i) * b; + IDX(temp, i) = carry & LIMB_MASK; + carry >>= LIMB_BITS; + } + IDX(temp, i) = carry & LIMB_MASK; + + reduce_mpz(temp); + mpz_clear(dest); + copyref_mpz(dest, temp); +} + +/**************** Division ****************/ + +void mpz_fdiv_q_2exp(dest, a, b) + mpz_t dest; + const mpz_t a; + unsigned int b; /* must be <= LIMB_BITS */ +{ + size_t i; + mpz_t temp; + mpz_init(temp); + + assert(b <= LIMB_BITS); + + temp->size = a->size; + temp->sign = a->sign; + allocate_mpz(temp); + + if (a->size > 0) { + for (i = 0; i < (a->size - 1); i++) { + IDX(temp, i) = (((IDX(a, i) >> b) | (IDX(a, i + 1) << (LIMB_BITS - b))) + & LIMB_MASK); + } + IDX(temp, a->size - 1) = IDX(a, a->size - 1) >> b; + } + + reduce_mpz(temp); + mpz_clear(dest); + copyref_mpz(dest, temp); +} + +/**************** Division / Modulus ****************/ + +static void mpz_setbit(dest, n) + mpz_t dest; + unsigned int n; +{ + size_t i, j; + + i = n / LIMB_BITS + 1; + + if (dest->size < i) { + j = dest->size; + dest->size = i; + allocate_mpz(dest); + while (j < i) { + IDX(dest, j) = 0; + j++; + } + } + + IDX(dest, i - 1) |= (1 << (n % LIMB_BITS)); +} + +static void mpz_fdiv_qr(q, r, num, den) + mpz_t q; + mpz_t r; + const mpz_t num; + const mpz_t den; +{ + size_t shiftct = 0; + size_t i; + mpz_t remainder; + mpz_t quotient; + mpz_t shifted; /* shifted = mod * 2^(shiftct) */ + + mpz_init(remainder); + mpz_init(shifted); + if (q) { + mpz_init(quotient); + quotient->sign = num->sign * den->sign; + } + + shifted->size = num->size; + allocate_mpz(shifted); + + mpz_set(remainder, num); + mpz_set(shifted, den); + + reduce_mpz(shifted); + assert(shifted->size > 0); + + while (mpz_cmpabs(remainder, shifted) > 0) { + shifted->size++; + allocate_mpz(shifted); + for (i = shifted->size - 1; i > 0; i--) + IDX(shifted, i) = IDX(shifted, i - 1); + IDX(shifted, 0) = 0; + shiftct += LIMB_BITS; + } + + while (shiftct != 0) { + if (mpz_cmpabs(remainder, shifted) >= 0) { + mpz_subabs(remainder, remainder, shifted); + reduce_mpz(remainder); + if (q) + mpz_setbit(quotient, shiftct); + } + mpz_fdiv_q_2exp(shifted, shifted, 1); + shiftct--; + } + + if (mpz_cmpabs(remainder, den) >= 0) { + mpz_subabs(remainder, remainder, den); + if (q) + mpz_setbit(quotient, 0); + } + + if (mpz_sgn(remainder) == -1) { + mpz_add(remainder, remainder, den); + if (q) + mpz_sub_ui(quotient, quotient, 1); + } + + mpz_clear(shifted); + reduce_mpz(remainder); + mpz_clear(r); + copyref_mpz(r, remainder); + + if (q) { + reduce_mpz(quotient); + mpz_clear(q); + copyref_mpz(q, quotient); + } +} + +void mpz_mod(dest, a, mod) + mpz_t dest; + const mpz_t a; + const mpz_t mod; +{ + mpz_fdiv_qr(NULL, dest, a, mod); +} + +/**************** Modular exponent ****************/ + +void mpz_powm(dest, base, exp, mod) + mpz_t dest; + const mpz_t base; + const mpz_t exp; + const mpz_t mod; +{ + mpz_t exp_bits; + mpz_t base_power; + mpz_t temp; + mpz_init(exp_bits); + mpz_init(base_power); + mpz_init(temp); + + mpz_set(exp_bits, exp); + mpz_set(base_power, base); + mpz_set_ui(temp, 1); + + reduce_mpz(exp_bits); + assert(exp_bits->sign == 1 || exp_bits->size == 0); + + while (exp_bits->size > 0) { + if (IDX(exp_bits, 0) & 1) { + mpz_mul(temp, temp, base_power); + mpz_mod(temp, temp, mod); + } + mpz_mul(base_power, base_power, base_power); + mpz_mod(base_power, base_power, mod); + mpz_fdiv_q_2exp(exp_bits, exp_bits, 1); + } + + mpz_clear(exp_bits); + mpz_clear(base_power); + reduce_mpz(temp); + mpz_clear(dest); + copyref_mpz(dest, temp); +} + +/**************** Legendre symbol ****************/ + +int mpz_legendre(a, p) + const mpz_t a; + const mpz_t p; +{ + int x; + mpz_t exp; + mpz_t pow; + mpz_init(exp); + mpz_init(pow); + + mpz_set(exp, p); + mpz_sub_ui(exp, exp, 1); + mpz_fdiv_q_2exp(exp, exp, 1); + mpz_powm(pow, a, exp, p); + + if (pow->size == 1 && IDX(pow, 0) == 1) + x = 1; + else if (pow->size == 0) + x = 0; + else + x = -1; + + mpz_clear(exp); + mpz_clear(pow); + + return x; +} + +/**************** GCD ****************/ + +static void mpz_gcdext_main(g, ai, bi, a, b) + mpz_t g; + mpz_t ai; + mpz_t bi; + const mpz_t a; + const mpz_t b; +{ + mpz_t rem_last, rem_cur; + mpz_t ai_last, ai_cur; + mpz_t bi_last, bi_cur; + mpz_t q, temp; + + mpz_init(rem_last); + mpz_init(rem_cur); + mpz_init(q); + + mpz_set(rem_last, a); + mpz_set(rem_cur, b); + + if (ai) { + mpz_init(ai_last); + mpz_init(ai_cur); + mpz_set_ui(ai_last, 1); + } + + if (bi) { + mpz_init(bi_last); + mpz_init(bi_cur); + mpz_set_ui(bi_cur, 1); + } + + assert(a->sign == 1 && a->size > 0); + assert(b->sign == 1 && b->size > 0); + + while (1) { + mpz_fdiv_qr(q, rem_last, rem_last, rem_cur); + mpz_swap(rem_last, rem_cur); + if (!mpz_sgn(rem_cur)) + break; + + if (ai) { + mpz_init(temp); + mpz_mul(temp, q, ai_cur); + mpz_sub(temp, ai_last, temp); + mpz_clear(ai_last); + copyref_mpz(ai_last, ai_cur); + copyref_mpz(ai_cur, temp); + } + + if (bi) { + mpz_init(temp); + mpz_mul(temp, q, bi_cur); + mpz_sub(temp, bi_last, temp); + mpz_clear(bi_last); + copyref_mpz(bi_last, bi_cur); + copyref_mpz(bi_cur, temp); + } + } + + mpz_clear(g); + copyref_mpz(g, rem_last); + mpz_clear(rem_cur); + mpz_clear(q); + + if (ai) { + mpz_clear(ai); + copyref_mpz(ai, ai_cur); + mpz_clear(ai_last); + } + if (bi) { + mpz_clear(bi); + copyref_mpz(bi, bi_cur); + mpz_clear(bi_last); + } +} + +void mpz_gcdext(g, ai, bi, a, b) + mpz_t g; + mpz_t ai; + mpz_t bi; + const mpz_t a; + const mpz_t b; +{ + if (mpz_cmpabs(a, b) > 0) + mpz_gcdext_main(g, ai, bi, a, b); + else + mpz_gcdext_main(g, bi, ai, b, a); +} + +/**************** Output ****************/ + +#define PUTCH(bbb, sss, nnn, ccc) do { \ + if ((sss) > 1) { \ + *(bbb) = (ccc); \ + (bbb)++; \ + (sss)--; \ + } \ + (nnn)++; \ + } while (0) + +static int putnum(char** buf, size_t* size, unsigned long value, + unsigned int base) +{ + unsigned long s; + unsigned int d; + int count = 0; + + if (value == 0) { + PUTCH(*buf, *size, count, '0'); + } + else { + s = value / base; + if (s) + count = putnum(buf, size, value / base, base); + d = value % base; + if (d < 10) + PUTCH(*buf, *size, count, d + '0'); + else + PUTCH(*buf, *size, count, d + 'A' - 10); + } + + return count; +} + +/* Supported conversions: + %% %s %c %d %i %o %u %X %ld %li %lo %lu %lX %ZX + */ + +int rs_vsnprintf(char* buf, size_t size, const char* fmt, va_list ap) +{ + int count = 0; + int argtype, convtype; + const char* strval; + long longval; + struct _mpz *mpval; + limb_t v, d; + size_t i; + int j; + + while (fmt[0]) { + if (fmt[0] != '%') { + PUTCH(buf, size, count, fmt[0]); + fmt++; + } + else if (fmt[1] == '%') { + PUTCH(buf, size, count, '%'); + fmt += 2; + } + else { + if (fmt[1] == 'l' || fmt[1] == 'Z') { + argtype = fmt[1]; + convtype = fmt[2]; + fmt += 3; + } + else { + argtype = 0; + convtype = fmt[1]; + fmt += 2; + } + + if (!convtype) + break; + + if (convtype == 's') { + /* string argument */ + strval = va_arg(ap, const char *); + if (!strval) + strval = "(NULL)"; + while (*strval) { + PUTCH(buf, size, count, *strval); + strval++; + } + } + else if (convtype == 'c' || convtype == 'd' || convtype == 'i' + || convtype == 'u' || convtype == 'x' || convtype == 'X') { + if (argtype == 'Z') { + /* mpz argument -- always print in hexadecimal */ + mpval = va_arg(ap, struct _mpz *); + + if (mpval->sign < 0) + PUTCH(buf, size, count, '-'); + + v = IDX(mpval, mpval->size - 1); + count += putnum(&buf, &size, v, 16); + + for (i = mpval->size - 1; i > 0; i--) { + v = IDX(mpval, i - 1); + for (j = LIMB_BITS - 4; j >= 0; j -= 4) { + d = ((v >> j) & 0x0f); + if (d < 10) + PUTCH(buf, size, count, d + '0'); + else + PUTCH(buf, size, count, d + 'A' - 10); + } + } + } + else { + /* int or long argument */ + if (argtype == 'l') + longval = va_arg(ap, long); + else + longval = va_arg(ap, int); + + if (convtype == 'c') { + PUTCH(buf, size, count, (char) (unsigned char) longval); + } + else if (convtype == 'x' || convtype == 'X') { + count += putnum(&buf, &size, longval, 16); + } + else if (convtype == 'o') { + count += putnum(&buf, &size, longval, 8); + } + else if (convtype == 'u' || longval >= 0) { + count += putnum(&buf, &size, longval, 10); + } + else { + PUTCH(buf, size, count, '-'); + count += putnum(&buf, &size, -longval, 10); + } + } + } + else { + fprintf(stderr, "*** ERROR: mpz: unsupported conversion '%%%c'", + convtype); + if (argtype) + PUTCH(buf, size, count, argtype); + PUTCH(buf, size, count, convtype); + } + } + } + + if (size != 0) + *buf = 0; + + return count; +} + +int rs_snprintf(char* buf, size_t size, const char* fmt, ...) +{ + va_list ap; + int count; + + va_start(ap, fmt); + count = rs_vsnprintf(buf, size, fmt, ap); + va_end(ap); + + return count; +} + diff --git a/tool/rabbitsign-src/mpz.h b/tool/rabbitsign-src/mpz.h new file mode 100644 index 0000000..2eb2667 --- /dev/null +++ b/tool/rabbitsign-src/mpz.h @@ -0,0 +1,123 @@ +/* + * RabbitSign - Tools for signing TI graphing calculator software + * Copyright (C) 2009 Benjamin Moody + * + * 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 . + */ + +#ifndef __RABBITSIGN_MPZ_H__ +#define __RABBITSIGN_MPZ_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#if (SIZEOF_INT != 0) && (SIZEOF_LONG >= 2 * SIZEOF_INT) +typedef unsigned int limb_t; +typedef unsigned long double_limb_t; +typedef signed long signed_double_limb_t; +#else +# if (SIZEOF_SHORT != 0) && (SIZEOF_INT >= 2 * SIZEOF_SHORT) +typedef unsigned short limb_t; +typedef unsigned int double_limb_t; +typedef signed int signed_double_limb_t; +# else +typedef unsigned short limb_t; +typedef unsigned long double_limb_t; +typedef signed long signed_double_limb_t; +# endif +#endif + +#define LIMB_BITS (sizeof(limb_t)*8) +#define LIMB_BYTES (sizeof(limb_t)) +#define LIMB_MASK ((((double_limb_t) 1) << LIMB_BITS) - 1) + +struct _mpz { + size_t size; + size_t size_alloc; + limb_t* m; + int sign; +}; + +typedef struct _mpz mpz_t[1]; + +#undef __P +#ifdef PROTOTYPES +# define __P(x) x +#else +# define __P(x) () +#endif + +void mpz_init __P((mpz_t x)); +void mpz_clear __P((mpz_t x)); + +/* Set */ +void mpz_set __P((mpz_t dest, const mpz_t src)); +void mpz_set_ui __P((mpz_t dest, unsigned int a)); +unsigned int mpz_get_ui __P((const mpz_t a)); + +/* Import/export: assume order=-1, size=1, endian=0, nails=0 */ +void mpz_import __P((mpz_t dest, size_t count, int order, int size, + int endian, size_t nails, const void* op)); +void mpz_export __P((void* dest, size_t* count, int order, int size, + int endian, size_t nails, const mpz_t op)); + +/* Check sign */ +int mpz_sgn __P((const mpz_t a)); + +/* Compare */ +int mpz_cmp __P((const mpz_t a, const mpz_t b)); +int mpz_cmp_ui __P((const mpz_t a, unsigned int b)); + +/* Add */ +void mpz_add __P((mpz_t dest, const mpz_t a, const mpz_t b)); +void mpz_add_ui __P((mpz_t dest, const mpz_t a, unsigned int b)); + +/* Subtract */ +void mpz_sub __P((mpz_t dest, const mpz_t a, const mpz_t b)); +void mpz_sub_ui __P((mpz_t dest, const mpz_t a, unsigned int b)); + +/* Multiply */ +void mpz_mul __P((mpz_t dest, const mpz_t a, const mpz_t b)); +void mpz_mul_ui __P((mpz_t dest, const mpz_t a, unsigned int b)); + +/* Divide: requires b <= LIMB_BITS */ +void mpz_fdiv_q_2exp __P((mpz_t dest, const mpz_t a, unsigned int b)); + +/* Modulus */ +void mpz_mod __P((mpz_t dest, const mpz_t a, const mpz_t mod)); + +/* Modular exponent */ +void mpz_powm __P((mpz_t dest, const mpz_t base, const mpz_t exp, + const mpz_t mod)); + +/* Legendre symbol */ +int mpz_legendre __P((const mpz_t a, const mpz_t p)); + +/* Extended GCD */ +void mpz_gcdext __P((mpz_t g, mpz_t ai, mpz_t bi, + const mpz_t a, const mpz_t b)); + +/* Output */ +int rs_snprintf __P((char* buf, size_t size, const char* fmt, ...)); + +#ifdef va_start +int rs_vsnprintf __P((char* buf, size_t size, const char* fmt, va_list ap)); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/tool/rabbitsign-src/os8x.c b/tool/rabbitsign-src/os8x.c new file mode 100644 index 0000000..b5e9ced --- /dev/null +++ b/tool/rabbitsign-src/os8x.c @@ -0,0 +1,298 @@ +/* + * RabbitSign - Tools for signing TI graphing calculator software + * Copyright (C) 2009 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#ifdef HAVE_STRING_H +# include +#else +# ifdef HAVE_STRINGS_H +# include +# endif +#endif + +#include "rabbitsign.h" +#include "internal.h" +#include "md5.h" + +/* + * Check/fix OS header fields and data. + * + * The OS header is much simpler than an application header, and its + * correctness is not as crucial to validation. The most important + * parts of the OS header are the key ID and (for newer calculators) + * the hardware compatibility level. There is no date stamp required. + * The page count is not required, and if present, is used only to + * display the transfer percentage (when using the 84+ boot code.) + * + * TI only sets the OS and program image size fields in their TI-73 OS + * headers. (Bizarrely, they are set in the true OS header, but not + * in the fake OS header that is transferred to page 1A. Furthermore, + * the OS size field is incorrect.) In any case, these fields appear + * to be ignored by all versions of the boot code. + */ +int rs_repair_ti8x_os(RSProgram* os, /* OS */ + unsigned int flags) /* flags */ +{ + unsigned long hdrstart, hdrsize, fieldhead, fieldstart, + fieldsize, ossize; + unsigned char* hdr; + int i; + + /* Pad the OS to a multiple of 16384. (While strictly speaking we + could get away with only padding each page to a multiple of 256, + such "partial OSes" are not supported by most linking + software.) */ + + rs_program_set_length(os, ((os->length + 0x3fff) & ~0x3fff)); + + /* If no OS header was provided in the input, try to get a header + from page 1A instead */ + + if (os->header_length < 6 + || os->header[0] != 0x80 + || os->header[1] != 0x0f) { + for (i = 0; i < os->npagenums; i++) { + if (os->pagenums[i] == 0x1a) { + rs_free(os->header); + if (!(os->header = rs_malloc(256))) + return RS_ERR_OUT_OF_MEMORY; + memcpy(os->header, os->data + ((unsigned long) i << 14), 256); + os->header_length = 256; + break; + } + } + } + + /* Clear old header/signature (not done on the TI-73 because + official TI-73 OSes contain a fake header; I don't recommend + doing this for third-party OSes) */ + + if (os->calctype != RS_CALC_TI73) + for (i = 0; i < os->npagenums; i++) + if (os->pagenums[i] == 0x1a) + memset(os->data + ((unsigned long) i << 14), 0xff, 512); + + /* Fix header size. OS headers must always begin with an 800x field + and end with an 807x field (TI always uses 800F and 807F, as for + apps; I'm not sure whether it's required.) */ + + if (os->header_length < 6 + || os->header[0] != 0x80 + || (os->header[1] & 0xf0) != 0) { + rs_error(NULL, os, "no OS header found"); + return RS_ERR_MISSING_HEADER; + } + + rs_get_field_size(os->header, &hdrstart, NULL); + hdr = os->header + hdrstart; + hdrsize = os->header_length - hdrstart; + + if (rs_find_app_field(0x8070, hdr, hdrsize, + &fieldhead, &fieldstart, &fieldsize)) { + rs_error(NULL, os, "OS header has no program image field"); + return RS_ERR_MISSING_PROGRAM_IMAGE; + } + + hdrsize = fieldstart; + os->header_length = hdrstart + hdrsize; + + if ((os->header_length % 64) == 55) { + if (flags & RS_IGNORE_ALL_WARNINGS) { + rs_warning(NULL, os, "OS header has length 55 mod 64"); + rs_warning(NULL, os, "(this will fail to validate on TI-83+ BE)"); + } + else { + rs_error(NULL, os, "OS header has length 55 mod 64"); + rs_error(NULL, os, "(this will fail to validate on TI-83+ BE)"); + return RS_ERR_INVALID_PROGRAM_SIZE; + } + } + + /* Fix OS / OS image sizes if requested */ + + if (flags & RS_FIX_OS_SIZE) { + ossize = os->length + hdrsize; + if (rs_set_field_size(os->header, ossize)) { + rs_error(NULL, os, "cannot set OS length"); + return RS_ERR_FIELD_TOO_SMALL; + } + + if (rs_set_field_size(hdr + fieldhead, os->length)) { + rs_error(NULL, os, "cannot set OS image length"); + return RS_ERR_FIELD_TOO_SMALL; + } + } + + /* Check for key ID */ + + if (rs_find_app_field(0x8010, hdr, hdrsize, NULL, NULL, NULL)) { + if (flags & RS_IGNORE_ALL_WARNINGS) + rs_warning(NULL, os, "OS header has no key ID field"); + else { + rs_error(NULL, os, "OS header has no key ID field"); + return RS_ERR_MISSING_KEY_ID; + } + } + + /* Check/fix page count */ + + if (rs_find_app_field(0x8080, hdr, hdrsize, + NULL, &fieldstart, &fieldsize)) { + if (os->length != 14 * 0x4000L) { + rs_warning(NULL, os, "OS header has no page count field"); + } + } + else if (fieldsize != 1) { + rs_warning(NULL, os, "OS header has an invalid page count field"); + } + else if (flags & RS_FIX_PAGE_COUNT) { + hdr[fieldstart] = os->length >> 14; + } + else if (hdr[fieldstart] != (os->length >> 14)) { + rs_warning(NULL, os, "OS header has an incorrect page count field"); + } + + /* Check and reset validation flag bytes */ + + if (os->data[0x56] != 0xff && os->data[0x56] != 0x5a) { + if (flags & RS_IGNORE_ALL_WARNINGS) + rs_warning(NULL, os, "OS has invalid data at 0056h"); + else { + rs_error(NULL, os, "OS has invalid data at 0056h"); + return RS_ERR_INVALID_PROGRAM_DATA; + } + } + + if (os->data[0x56] == 0x5a) + os->data[0x56] = 0xff; + + if (os->data[0x57] != 0xff && os->data[0x57] != 0xa5) { + if (flags & RS_IGNORE_ALL_WARNINGS) + rs_warning(NULL, os, "OS has invalid data at 0057h"); + else { + rs_error(NULL, os, "OS has invalid data at 0057h"); + return RS_ERR_INVALID_PROGRAM_DATA; + } + } + + if (os->data[0x57] == 0xff) + os->data[0x57] = 0xa5; + + return RS_SUCCESS; +} + +/* + * Compute signature for an OS. + */ +int rs_sign_ti8x_os(RSProgram* os, /* OS */ + RSKey* key) /* signing key */ +{ + struct md5_ctx ctx; + md5_uint32 hash[4]; + mpz_t hashv, sigv; + unsigned char sigdata[512]; + size_t siglength; + int e; + + md5_init_ctx(&ctx); + md5_process_bytes(os->header, os->header_length, &ctx); + md5_process_bytes(os->data, os->length, &ctx); + md5_finish_ctx(&ctx, hash); + + mpz_init(hashv); + mpz_init(sigv); + + mpz_import(hashv, 16, -1, 1, 0, 0, hash); + rs_message(2, NULL, os, "hash = %ZX", hashv); + + if ((e = rs_sign_rsa(sigv, hashv, key))) { + mpz_clear(hashv); + mpz_clear(sigv); + return e; + } + + rs_message(2, NULL, os, "sig = %ZX", sigv); + + sigdata[0] = 0x02; + sigdata[1] = 0x0d; + mpz_export(sigdata + 3, &siglength, -1, 1, 0, 0, sigv); + sigdata[2] = siglength & 0xff; + siglength += 3; + + while (siglength < 96) + sigdata[siglength++] = 0xff; + + rs_free(os->signature); + if (!(os->signature = rs_malloc(siglength))) + return RS_ERR_OUT_OF_MEMORY; + + memcpy(os->signature, sigdata, siglength); + os->signature_length = siglength; + return RS_SUCCESS; +} + +/* + * Validate OS signature. + */ +int rs_validate_ti8x_os(const RSProgram* os, + const RSKey* key) +{ + unsigned long fieldstart, fieldsize; + struct md5_ctx ctx; + md5_uint32 hash[4]; + mpz_t hashv, sigv; + int e; + + if (os->signature_length < 3) { + rs_error(NULL, os, "OS does not have a signature"); + return RS_ERR_MISSING_RSA_SIGNATURE; + } + + if (os->signature[0] != 0x02 || (os->signature[1] & 0xf0) != 0x00) { + rs_error(NULL, os, "OS does not have an RSA signature"); + return RS_ERR_MISSING_RSA_SIGNATURE; + } + rs_get_field_size(os->signature, &fieldstart, &fieldsize); + + md5_init_ctx(&ctx); + md5_process_bytes(os->header, os->header_length, &ctx); + md5_process_bytes(os->data, os->length, &ctx); + md5_finish_ctx(&ctx, hash); + + mpz_init(hashv); + mpz_init(sigv); + + mpz_import(hashv, 16, -1, 1, 0, 0, hash); + rs_message(2, NULL, os, "hash = %ZX", hashv); + + mpz_import(sigv, fieldsize, -1, 1, 0, 0, os->signature + fieldstart); + rs_message(2, NULL, os, "sig = %ZX", sigv); + + e = rs_validate_rsa(sigv, hashv, key); + if (e == RS_SIGNATURE_INCORRECT) + rs_message(0, NULL, os, "OS signature incorrect"); + + mpz_clear(hashv); + mpz_clear(sigv); + return e; +} diff --git a/tool/rabbitsign-src/output.c b/tool/rabbitsign-src/output.c new file mode 100644 index 0000000..6004b9b --- /dev/null +++ b/tool/rabbitsign-src/output.c @@ -0,0 +1,39 @@ +/* + * RabbitSign - Tools for signing TI graphing calculator software + * Copyright (C) 2009 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include "rabbitsign.h" + +/* + * Write program contents to a file. + */ +int rs_write_program_file(const RSProgram* prgm, FILE* f, + int month, int day, int year, + unsigned int flags) +{ + if (rs_calc_is_ti8x(prgm->calctype) + && (prgm->datatype == RS_DATA_OS || prgm->datatype == RS_DATA_APP)) + return rs_write_ti8x_file(prgm, f, month, day, year, flags); + else + return rs_write_ti9x_file(prgm, f, month, day, year, flags); +} diff --git a/tool/rabbitsign-src/output8x.c b/tool/rabbitsign-src/output8x.c new file mode 100644 index 0000000..d08f061 --- /dev/null +++ b/tool/rabbitsign-src/output8x.c @@ -0,0 +1,248 @@ +/* + * RabbitSign - Tools for signing TI graphing calculator software + * Copyright (C) 2009 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#ifdef HAVE_STRING_H +# include +#else +# ifdef HAVE_STRINGS_H +# include +# endif +#endif + +#include "rabbitsign.h" +#include "internal.h" + +/* + * Write a single record to an Intel hex file. + */ +static int write_hex_record(FILE* outfile, /* output file */ + unsigned int nbytes, /* number of bytes */ + unsigned int addr, /* address */ + unsigned int type, /* record type */ + unsigned char* data, /* data */ + unsigned int flags, /* flags */ + int final) +{ + char buf[256]; + unsigned int i; + unsigned int sum; + + sum = nbytes + addr + (addr >> 8) + type; + sprintf(buf, ":%02X%04X%02X", nbytes, addr, type); + + for (i = 0; i < nbytes; i++) { + sprintf(buf + 9 + 2 * i, "%02X", data[i]); + sum += data[i]; + } + + sum = ((-sum) & 0xff); + + sprintf(buf + 9 + 2 * i, "%02X", sum); + + if (!final) { + if (flags & RS_OUTPUT_APPSIGN) + strcpy(buf + 11 + 2 * i, "\n"); + else + strcpy(buf + 11 + 2 * i, "\r\n"); + } + + if (fputs(buf, outfile) == EOF) { + rs_error(NULL, NULL, "file I/O error"); + return RS_ERR_FILE_IO; + } + + return RS_SUCCESS; +} + +/* + * Write a chunk of data to an Intel hex file. + */ +static int write_hex_data(FILE* outfile, /* output file */ + unsigned long length, /* number of bytes */ + unsigned long addr, /* starting address */ + unsigned char* data, /* data */ + unsigned int flags) +{ + unsigned int count; + int e; + + while (length > 0) { + if (length < 0x20) + count = length; + else + count = 0x20; + + if ((e = write_hex_record(outfile, count, addr, 0, data, flags, 0))) + return e; + + length -= count; + addr += count; + data += count; + } + + return RS_SUCCESS; +} + +/* + * Write program to a .73k/.73u/.8xk/.8xu or .app file. + * + * If month = day = year = 0, use the current time. + * + * Note: on platforms where it matters, all output files must be + * opened in "binary" mode. + */ +int rs_write_ti8x_file(const RSProgram* prgm, /* program */ + FILE* outfile, /* output file */ + int month, /* timestamp month */ + int day, /* timestamp day */ + int year, /* timestamp year*/ + unsigned int flags) /* flags */ +{ + const unsigned char *hdr; + unsigned long hdrstart, hdrsize, fieldstart, fieldsize; + int major, minor, i; + unsigned long npages, nrecords, hexsize; + char name[9]; + unsigned int pagenum, addr; + unsigned long count; + unsigned char pnbuf[2]; + int e; + + if (!(flags & RS_OUTPUT_HEX_ONLY)) { + if (prgm->header_length) { + hdr = prgm->header; + hdrsize = prgm->header_length; + } + else { + hdr = prgm->data; + hdrsize = prgm->length; + } + + if (hdrsize >= 6) { + rs_get_field_size(hdr, &hdrstart, NULL); + hdr += hdrstart; + hdrsize -= hdrstart; + if (hdrsize > 128) + hdrsize = 128; + + major = rs_get_numeric_field(0x8020, hdr, hdrsize); + minor = rs_get_numeric_field(0x8030, hdr, hdrsize); + + if (prgm->datatype == RS_DATA_OS) { + if (prgm->calctype == RS_CALC_TI73) + strcpy(name, "BASECODE"); + else + strcpy(name, "basecode"); + } + else if (!rs_find_app_field(0x8040, hdr, hdrsize, + NULL, &fieldstart, &fieldsize)) { + if (fieldsize > 8) + fieldsize = 8; + strncpy(name, (char*) hdr + fieldstart, fieldsize); + name[fieldsize] = 0; + } + else { + name[0] = 0; + } + } + else { + major = minor = 0; + name[0] = 0; + } + + npages = ((prgm->length + 0x3fff) >> 14); + nrecords = 1 + npages + ((prgm->length + 0x1f) >> 5); + + if (prgm->header_length) + nrecords += 1 + ((prgm->header_length + 0x1f) >> 5); + if (prgm->signature_length) + nrecords += 1 + ((prgm->signature_length + 0x1f) >> 5); + + if (flags & RS_OUTPUT_APPSIGN) { + hexsize = (npages * 4 + + prgm->length * 2 + + prgm->header_length * 2 + + prgm->signature_length * 2 + + nrecords * 12 - 1); + } + else { + hexsize = (npages * 4 + + prgm->length * 2 + + prgm->header_length * 2 + + prgm->signature_length * 2 + + nrecords * 13 - 2); + } + + if ((e = rs_write_tifl_header(outfile, 1, major, minor, + month, day, year, name, + prgm->calctype, prgm->datatype, + hexsize))) + return e; + } + + if (prgm->header_length) { + if ((e = write_hex_data(outfile, prgm->header_length, 0, + prgm->header, flags))) + return e; + if ((e = write_hex_record(outfile, 0, 0, 1, NULL, flags, 0))) + return e; + } + + for (i = 0; ((unsigned long) i << 14) < prgm->length; i++) { + if (i < prgm->npagenums) + pagenum = prgm->pagenums[i]; + else + pagenum = i; + + if (pagenum == 0 && prgm->header_length) + addr = 0; + else + addr = 0x4000; + + pnbuf[0] = (pagenum >> 8) & 0xff; + pnbuf[1] = pagenum & 0xff; + + if ((e = write_hex_record(outfile, 2, 0, 2, pnbuf, flags, 0))) + return e; + + count = prgm->length - i * 0x4000; + if (count > 0x4000) + count = 0x4000; + + if ((e = write_hex_data(outfile, count, addr, + prgm->data + i * 0x4000, flags))) + return e; + } + + if (prgm->signature_length) { + if ((e = write_hex_record(outfile, 0, 0, 1, NULL, flags, 0))) + return e; + if ((e = write_hex_data(outfile, prgm->signature_length, 0, + prgm->signature, flags))) + return e; + } + + return write_hex_record(outfile, 0, 0, 1, NULL, flags, 1); +} + diff --git a/tool/rabbitsign-src/output9x.c b/tool/rabbitsign-src/output9x.c new file mode 100644 index 0000000..d765abe --- /dev/null +++ b/tool/rabbitsign-src/output9x.c @@ -0,0 +1,96 @@ +/* + * RabbitSign - Tools for signing TI graphing calculator software + * Copyright (C) 2009 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#ifdef HAVE_STRING_H +# include +#else +# ifdef HAVE_STRINGS_H +# include +# endif +#endif + +#include "rabbitsign.h" +#include "internal.h" + +/* + * Write program to a .89k/.89u/.9xk/.9xu file. + * + * If month = day = year = 0, use the current time. + * + * Note: on platforms where it matters, all output files must be + * opened in "binary" mode. + */ +int rs_write_ti9x_file(const RSProgram* prgm, /* program */ + FILE* outfile, /* output file */ + int month, /* timestamp month */ + int day, /* timestamp day */ + int year, /* timestamp year*/ + unsigned int flags RS_ATTR_UNUSED) +{ + const unsigned char *hdr; + unsigned long hdrstart, hdrsize, fieldstart, fieldsize; + char name[9]; + int e; + + if (prgm->length >= 6) { + rs_get_field_size(prgm->data, &hdrstart, &hdrsize); + hdr = prgm->data + hdrstart; + if (hdrsize > 128) + hdrsize = 128; + + if (prgm->datatype == RS_DATA_OS) { + strcpy(name, "basecode"); + } + else if (!rs_find_app_field(0x8140, hdr, hdrsize, + NULL, &fieldstart, &fieldsize)) { + if (fieldsize > 8) + fieldsize = 8; + strncpy(name, (char*) hdr + fieldstart, fieldsize); + name[fieldsize] = 0; + } + else { + name[0] = 0; + } + } + else { + name[0] = 0; + } + + /* Note: the "version" header fields used in TI's 68k apps and + OSes seem to have no relation to the actual version numbers. */ + + if ((e = rs_write_tifl_header(outfile, 0, 0, 0, + month, day, year, name, + prgm->calctype, prgm->datatype, + prgm->length))) + return e; + + if (fwrite(prgm->data, 1, prgm->length, outfile) != prgm->length) { + rs_error(NULL, NULL, "file I/O error"); + return RS_ERR_FILE_IO; + } + + return RS_SUCCESS; +} + diff --git a/tool/rabbitsign-src/program.c b/tool/rabbitsign-src/program.c new file mode 100644 index 0000000..e7cf140 --- /dev/null +++ b/tool/rabbitsign-src/program.c @@ -0,0 +1,187 @@ +/* + * RabbitSign - Tools for signing TI graphing calculator software + * Copyright (C) 2009 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#ifdef HAVE_STRING_H +# include +#else +# ifdef HAVE_STRINGS_H +# include +# endif +#endif + +#include "rabbitsign.h" +#include "internal.h" + +/* + * Create a new program. + */ +RSProgram* rs_program_new() +{ + RSProgram* prgm = rs_malloc(sizeof(RSProgram)); + + if (!prgm) + return NULL; + + prgm->filename = NULL; + prgm->calctype = 0; + prgm->datatype = 0; + prgm->data = NULL; + prgm->length = 0; + prgm->length_a = 0; + prgm->header = NULL; + prgm->header_length = 0; + prgm->signature = NULL; + prgm->signature_length = 0; + prgm->pagenums = NULL; + prgm->npagenums = 0; + + return prgm; +} + +/* + * Create a new program by wrapping an existing data buffer. + * + * If buffer_size is zero, data will be copied from the source buffer + * into the new program. + * + * If buffer_size is nonzero, then the source buffer must have been + * allocated using malloc(); buffer_size is the total amount of memory + * allocated. The data will not be copied, and the new program object + * assumes ownership of the buffer. + */ +RSProgram* rs_program_new_with_data(RSCalcType ctype, /* calc type */ + RSDataType dtype, /* data type */ + void* data, /* source buffer */ + unsigned long length, /* length of data */ + unsigned long buffer_size) /* amount of + memory + allocated */ +{ + RSProgram* prgm = rs_program_new(); + + if (!prgm) + return NULL; + + prgm->calctype = ctype; + prgm->datatype = dtype; + + if (data) { + if (buffer_size) { + prgm->data = data; + prgm->length = length; + prgm->length_a = buffer_size; + } + else { + if (rs_program_append_data(prgm, data, length)) { + rs_program_free(prgm); + return NULL; + } + } + } + + return prgm; +} + +/* + * Free program data. + */ +void rs_program_free(RSProgram* prgm) +{ + if (!prgm) + return; + + rs_free(prgm->filename); + rs_free(prgm->data); + rs_free(prgm->header); + rs_free(prgm->signature); + rs_free(prgm->pagenums); + rs_free(prgm); +} + +/* + * Truncate or extend program. + * + * If length is less than the program's current length, the program is + * truncated. If length is greater than the current size of the + * program, additional space is added. The extra space is padded with + * 0xFF, with the exception of bytes that fall at the start of a page. + */ +int rs_program_set_length(RSProgram* prgm, /* program */ + unsigned long length) /* new length of program */ +{ + unsigned long length_a, i; + unsigned char* dptr; + + if (length <= prgm->length) { + prgm->length = length; + return RS_SUCCESS; + } + else { + if (length > prgm->length_a) { + length_a = length + 16384; + + dptr = rs_realloc(prgm->data, length_a); + if (!dptr) + return RS_ERR_OUT_OF_MEMORY; + prgm->data = dptr; + prgm->length_a = length_a; + } + + memset(prgm->data + prgm->length, 0xff, length - prgm->length); + + for (i = ((prgm->length + 0x3fff) & ~0x3fff); + i < length; + i += 0x4000) + prgm->data[i] = 0x42; + + prgm->length = length; + return RS_SUCCESS; + } +} + +/* + * Add data to the end of the program. + */ +int rs_program_append_data(RSProgram* prgm, /* program */ + const unsigned char* data, /* data */ + unsigned long length) /* size of data */ +{ + unsigned long nlength, length_a; + unsigned char* dptr; + + nlength = prgm->length + length; + if (nlength > prgm->length_a) { + length_a = nlength + 16384; + + dptr = rs_realloc(prgm->data, length_a); + if (!dptr) + return RS_ERR_OUT_OF_MEMORY; + prgm->data = dptr; + prgm->length_a = length_a; + } + + memcpy(prgm->data + prgm->length, data, length); + prgm->length = nlength; + return RS_SUCCESS; +} diff --git a/tool/rabbitsign-src/rabbitsign.c b/tool/rabbitsign-src/rabbitsign.c new file mode 100644 index 0000000..94877de --- /dev/null +++ b/tool/rabbitsign-src/rabbitsign.c @@ -0,0 +1,463 @@ +/* + * RabbitSign - Tools for signing TI graphing calculator software + * Copyright (C) 2009 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#ifdef HAVE_STDLIB_H +# include +#endif + +#ifdef HAVE_STRING_H +# include +#else +# ifdef HAVE_STRINGS_H +# include +# endif +#endif + +#include "rabbitsign.h" +#include "internal.h" + +#if !defined(strcasecmp) && !defined(HAVE_STRCASECMP) +# ifdef HAVE_STRICMP +# define strcasecmp stricmp +# else +# define strcasecmp strcmp +# endif +#endif + +#if !defined(strrchr) && !defined(HAVE_STRRCHR) && defined(HAVE_RINDEX) +# define strrchr rindex +#endif + +static const char* getbasename(const char* f) +{ + const char *p; + + if ((p = strrchr(f, '/'))) + f = p + 1; + +#if defined(__MSDOS__) || defined(__WIN32__) + if ((p = strrchr(f, '\\'))) + f = p + 1; +#endif + + return f; +} + +static const char* usage[]={ + "Usage: %s [options] app-file ...\n", + "Where options may include:\n", + " -a: appsign compatibility mode (Unix-style output)\n", + " -b: read raw binary data (default: auto-detect)\n", + " -c: check existing app signatures rather than signing\n", + " -f: force signing despite errors\n", + " -g: write app in GraphLink (XXk) format\n", + " -k KEYFILE: use specified key file\n", + " -K NUM: use specified key ID (hexadecimal)\n", + " -n: do not alter the app header\n", + " -o OUTFILE: write to specified output file (default is .app\n", + " or .8xk)\n", + " -p: fix the pages field if found\n", + " -P: add an extra page if necessary\n", + " -q: suppress warning messages\n", + " -r: re-sign a previously signed app (i.e. strip off all\n", + " data beyond that indicated by the size header)\n", + " -R R: specify the root to use (0, 1, 2, or 3) (default is 0)\n", + " -t TYPE: specify program type (e.g. 8xk, 73u)\n", + " -u: assume plain hex input is unsorted (default is sorted)\n", + " -v: be verbose (-vv for even more verbosity)\n", + " --help: describe options\n", + " --version: print version info\n", + NULL}; + +int main(int argc, char** argv) +{ + unsigned int flags = (RS_INPUT_SORTED | RS_OUTPUT_HEX_ONLY); + + int rootnum = 0; /* which of the four valid signatures + to generate + + 0 = standard (r,s) + 1 = (-r,s) + 2 = (r,-s) + 3 = (-r,-s) */ + + int rawmode = 0; /* 0 = fix app headers + 1 = sign "raw" data */ + + int valmode = 0; /* 0 = sign apps + 1 = validate apps */ + + const char* infilename; /* file name for input */ + + const char* outfilename = NULL; /* file name for output */ + + const char* keyfilename = NULL; /* file name for key */ + + int verbose = 0; /* -1 = quiet (errors only) + 0 = default (warnings + errors) + 1 = verbose (print file names / status) + 2 = very verbose (details of computation) */ + + static const char optstring[] = "abcfgk:K:no:pPqrR:t:uv"; + const char *progname; + int i, j, c, e; + const char* arg; + char *tempname; + + FILE* infile; + FILE* outfile; + RSKey* key; + RSProgram* prgm; + unsigned long keyid = 0, appkeyid; + RSCalcType ctype = RS_CALC_UNKNOWN; + RSDataType dtype = RS_DATA_UNKNOWN; + + char *ptr; + const char *ext; + int invalidapps = 0; + + progname = getbasename(argv[0]); + rs_set_progname(progname); + + if (argc == 1) { + fprintf(stderr, usage[0], progname); + for (i = 1; usage[i]; i++) + fputs(usage[i], stderr); + return 5; + } + + i = j = 1; + while ((c = rs_parse_cmdline(argc, argv, optstring, &i, &j, &arg))) { + switch (c) { + case RS_CMDLINE_HELP: + printf(usage[0], progname); + for (i = 1; usage[i]; i++) + fputs(usage[i], stdout); + return 0; + + case RS_CMDLINE_VERSION: + printf("rabbitsign\n"); + fputs("Copyright (C) 2009 Benjamin Moody\n", stdout); + fputs("This program is free software. ", stdout); + fputs("There is NO WARRANTY of any kind.\n", stdout); + return 0; + + case 'o': + outfilename = arg; + break; + + case 'k': + keyfilename = arg; + break; + + case 'K': + if (!sscanf(arg, "%lx", &keyid)) { + fprintf(stderr, "%s: -K: invalid argument %s\n", progname, arg); + return 5; + } + break; + + case 'b': + flags |= RS_INPUT_BINARY; + break; + + case 'u': + flags &= ~RS_INPUT_SORTED; + break; + + case 'f': + flags |= RS_IGNORE_ALL_WARNINGS; + break; + + case 'g': + flags &= ~RS_OUTPUT_HEX_ONLY; + break; + + case 'a': + flags |= RS_OUTPUT_APPSIGN; + break; + + case 'R': + if (!sscanf(arg, "%d", &rootnum)) { + fprintf(stderr, "%s: -R: invalid argument %s\n", progname, arg); + return 5; + } + break; + + case 't': + if (rs_suffix_to_type(arg, &ctype, &dtype)) { + fprintf(stderr, "%s: unrecognized file type %s\n", progname, arg); + return 5; + } + break; + + case 'n': + rawmode = 1; + break; + + case 'r': + flags |= RS_REMOVE_OLD_SIGNATURE; + break; + + case 'P': + flags |= RS_ZEALOUSLY_PAD_APP; + break; + + case 'p': + flags |= RS_FIX_PAGE_COUNT; + break; + + case 'c': + valmode = 1; + break; + + case 'v': + verbose++; + break; + + case 'q': + verbose--; + break; + + case RS_CMDLINE_FILENAME: + break; + + case RS_CMDLINE_ERROR: + return 5; + + default: + fprintf(stderr, "%s: internal error: unknown option -%c\n", + progname, c); + abort(); + } + } + + rs_set_verbose(verbose); + + if (outfilename && (ptr = strrchr(outfilename, '.')) + && !rs_suffix_to_type(ptr + 1, NULL, NULL)) + flags &= ~RS_OUTPUT_HEX_ONLY; + + + /* Read key file (if manually specified) */ + + key = rs_key_new(); + + if (keyfilename) { + infile = fopen(keyfilename, "rb"); + if (!infile) { + perror(keyfilename); + rs_key_free(key); + return 3; + } + if (rs_read_key_file(key, infile, keyfilename, 1)) { + fclose(infile); + rs_key_free(key); + return 3; + } + fclose(infile); + } + else if (keyid) { + if (rs_key_find_for_id(key, keyid, valmode)) { + rs_key_free(key); + return 3; + } + } + + /* Process applications */ + + i = j = 1; + while ((c = rs_parse_cmdline(argc, argv, optstring, &i, &j, &arg))) { + if (c != RS_CMDLINE_FILENAME) + continue; + + /* Read input file */ + + if (strcmp(arg, "-")) { + infilename = arg; + infile = fopen(arg, "rb"); + if (!infile) { + perror(arg); + rs_key_free(key); + return 4; + } + } + else { + infilename = "(standard input)"; + infile = stdin; + } + + prgm = rs_program_new(); + + if (ctype && dtype) { + prgm->calctype = ctype; + prgm->datatype = dtype; + } + else if ((ptr = strrchr(infilename, '.'))) { + rs_suffix_to_type(ptr + 1, &prgm->calctype, &prgm->datatype); + } + + if (rs_read_program_file(prgm, infile, infilename, flags)) { + rs_program_free(prgm); + rs_key_free(key); + if (infile != stdin) + fclose(infile); + return 4; + } + if (infile != stdin) + fclose(infile); + + /* Read key file (if automatic) */ + + if (!keyfilename && !keyid) { + appkeyid = rs_program_get_key_id(prgm); + if (!appkeyid) { + fprintf(stderr, "%s: unable to determine key ID\n", infilename); + rs_program_free(prgm); + rs_key_free(key); + return 3; + } + + if (appkeyid != key->id) { + if (rs_key_find_for_id(key, appkeyid, valmode)) { + rs_program_free(prgm); + rs_key_free(key); + return 3; + } + } + } + + if (valmode) { + /* Validate application */ + if (verbose > 0) + fprintf(stderr, "Validating %s %s %s...\n", + rs_calc_type_to_string(prgm->calctype), + rs_data_type_to_string(prgm->datatype), + infilename); + + if (rs_validate_program(prgm, key)) + invalidapps++; + } + else { + /* Sign application */ + if (verbose > 0) + fprintf(stderr, "Signing %s %s %s...\n", + rs_calc_type_to_string(prgm->calctype), + rs_data_type_to_string(prgm->datatype), + infilename); + + if (!rawmode) { + if ((e = rs_repair_program(prgm, flags))) { + if (!(flags & RS_IGNORE_ALL_WARNINGS) + && e < RS_ERR_CRITICAL) + fprintf(stderr, "(use -f to override)\n"); + rs_program_free(prgm); + rs_key_free(key); + return 2; + } + } + if (rs_sign_program(prgm, key, rootnum)) { + rs_program_free(prgm); + rs_key_free(key); + return 2; + } + + /* Generate output file name */ + + if (outfilename) { + if (strcmp(outfilename, "-")) { + outfile = fopen(outfilename, "wb"); + if (!outfile) { + perror(outfilename); + rs_program_free(prgm); + rs_key_free(key); + return 4; + } + } + else { + outfile = stdout; + } + } + else if (infile == stdin) { + outfile = stdout; + } + else { + ext = rs_type_to_suffix(prgm->calctype, prgm->datatype, + (flags & RS_OUTPUT_HEX_ONLY)); + + tempname = rs_malloc(strlen(infilename) + 32); + if (!tempname) { + rs_program_free(prgm); + rs_key_free(key); + return 4; + } + strcpy(tempname, infilename); + + ptr = strrchr(tempname, '.'); + if (!ptr) { + strcat(tempname, "."); + strcat(tempname, ext); + } + else if (strcasecmp(ptr + 1, ext)) { + strcpy(ptr + 1, ext); + } + else { + strcpy(ptr, "-signed."); + strcat(ptr, ext); + } + + outfile = fopen(tempname, "wb"); + if (!outfile) { + perror(tempname); + rs_free(tempname); + rs_program_free(prgm); + rs_key_free(key); + return 4; + } + rs_free(tempname); + } + + /* Write signed application to output file */ + + if (rs_write_program_file(prgm, outfile, 0, 0, 0, flags)) { + if (outfile != stdout) + fclose(outfile); + rs_program_free(prgm); + rs_key_free(key); + return 4; + } + + if (outfile != stdout) + fclose(outfile); + } + rs_program_free(prgm); + } + + rs_key_free(key); + + if (invalidapps) + return 1; + else + return 0; +} diff --git a/tool/rabbitsign-src/rabbitsign.h b/tool/rabbitsign-src/rabbitsign.h new file mode 100644 index 0000000..6c2b7b1 --- /dev/null +++ b/tool/rabbitsign-src/rabbitsign.h @@ -0,0 +1,342 @@ +/* + * RabbitSign - Tools for signing TI graphing calculator software + * Copyright (C) 2009 Benjamin Moody + * + * 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 . + */ + +#ifndef __RABBITSIGN_H__ +#define __RABBITSIGN_H__ + +#ifdef HAVE_GMP_H +# include +# define rs_snprintf gmp_snprintf +# define rs_vsnprintf gmp_vsnprintf +#else +# include "mpz.h" +#endif + +#if __GNUC__ >= 3 +# define RS_ATTR_PURE __attribute__((pure)) +# define RS_ATTR_MALLOC __attribute__((malloc)) +# define RS_ATTR_UNUSED __attribute__((unused)) +# define RS_ATTR_PRINTF(f,i) __attribute__((format(printf,f,i))) +#else +# define RS_ATTR_PURE +# define RS_ATTR_MALLOC +# define RS_ATTR_UNUSED +# define RS_ATTR_PRINTF(f,i) +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Calculator types */ +typedef enum _RSCalcType { + RS_CALC_UNKNOWN = 0, + RS_CALC_TI73 = 0x74, + RS_CALC_TI83P = 0x73, + RS_CALC_TI89 = 0x98, + RS_CALC_TI92P = 0x88 +} RSCalcType; + +#define rs_calc_is_ti8x(ttt) ((ttt) == RS_CALC_TI73 || (ttt) == RS_CALC_TI83P) +#define rs_calc_is_ti9x(ttt) ((ttt) == RS_CALC_TI89 || (ttt) == RS_CALC_TI92P) + +/* Data types */ +typedef enum _RSDataType { + RS_DATA_UNKNOWN = 0, + RS_DATA_OS = 0x23, + RS_DATA_APP = 0x24, + RS_DATA_CERT = 0x25 +} RSDataType; + +/* Flags for app signing */ +typedef enum _RSRepairFlags { + RS_IGNORE_ALL_WARNINGS = 1, + RS_REMOVE_OLD_SIGNATURE = 2, /* Remove existing signature */ + RS_FIX_PAGE_COUNT = 4, /* Fix page count header field */ + RS_FIX_OS_SIZE = 8, /* Fix size in OS header */ + RS_ZEALOUSLY_PAD_APP = 16 /* Pad application with an extra + page if necessary */ +} RSRepairFlags; + +/* Flags for file input */ +typedef enum _RSInputFlags { + RS_INPUT_BINARY = 32, /* Assume input is raw binary + data */ + RS_INPUT_SORTED = 64 /* Assume plain hex input is sorted + (implicit page switch) */ +} RSInputFlags; + +/* Flags for file output */ +typedef enum _RSOutputFlags { + RS_OUTPUT_HEX_ONLY = 128, /* Write plain hex (.app) format */ + RS_OUTPUT_APPSIGN = 256 /* Write hex data in + appsign-compatible format */ +} RSOutputFlags; + +/* Encryption key structure */ +typedef struct _RSKey { + char* filename; /* Filename */ + unsigned long id; /* Key ID */ + mpz_t n; /* Modulus (public key) */ + mpz_t p; /* First factor */ + mpz_t q; /* Second factor */ + mpz_t qinv; /* q^-1 mod p (for Rabin) + (rs_sign_rabin() will calculate + this based on p and q, if + needed) */ + mpz_t d; /* Signing exponent (for RSA) + (rs_sign_rsa() will calculate this + based on p and q, if needed) */ +} RSKey; + +/* Program data structure */ +typedef struct _RSProgram { + char* filename; /* Filename */ + RSCalcType calctype; /* Calculator type */ + RSDataType datatype; /* Program data type */ + unsigned char* data; /* Program data */ + unsigned long length; /* Length of program data */ + unsigned long length_a; /* Size of buffer allocated */ + + /* Additional metadata (only used by TI-8x OS) */ + unsigned char* header; /* OS header */ + unsigned int header_length; /* Length of OS header */ + unsigned char* signature; /* OS signature */ + unsigned int signature_length; /* Length of OS signature */ + unsigned int* pagenums; /* List of page numbers */ + int npagenums; /* Number of page numbers */ +} RSProgram; + +/* Status codes */ +typedef enum _RSStatus { + RS_SUCCESS = 0, + + RS_ERR_MISSING_PAGE_COUNT, + RS_ERR_MISSING_KEY_ID, + RS_ERR_MISSING_DATE_STAMP, + RS_ERR_MISSING_PROGRAM_IMAGE, + RS_ERR_MISALIGNED_PROGRAM_IMAGE, + RS_ERR_INVALID_PROGRAM_DATA, + RS_ERR_INVALID_PROGRAM_SIZE, + RS_ERR_INCORRECT_PAGE_COUNT, + RS_ERR_FINAL_PAGE_TOO_LONG, + RS_ERR_FIELD_TOO_SMALL, + + RS_ERR_CRITICAL = 1000, + + RS_ERR_OUT_OF_MEMORY, + RS_ERR_FILE_IO, + RS_ERR_HEX_SYNTAX, + RS_ERR_UNKNOWN_FILE_FORMAT, + RS_ERR_UNKNOWN_PROGRAM_TYPE, + RS_ERR_MISSING_HEADER, + RS_ERR_MISSING_RABIN_SIGNATURE, + RS_ERR_MISSING_RSA_SIGNATURE, + RS_ERR_INCORRECT_PROGRAM_SIZE, + RS_ERR_KEY_NOT_FOUND, + RS_ERR_KEY_SYNTAX, + RS_ERR_INVALID_KEY, + RS_ERR_MISSING_PUBLIC_KEY, + RS_ERR_MISSING_PRIVATE_KEY, + RS_ERR_UNSUITABLE_RABIN_KEY, + RS_ERR_UNSUITABLE_RSA_KEY, + + RS_SIGNATURE_INCORRECT = -1 +} RSStatus; + + +/**** Key handling (keys.c) ****/ + +/* Create a new key. */ +RSKey* rs_key_new (void) RS_ATTR_MALLOC; + +/* Free a key. */ +void rs_key_free (RSKey* key); + +/* Read key from a file. */ +RSStatus rs_read_key_file (RSKey* key, FILE* f, + const char* fname, int verify); + +/* Parse a number written in TI's hexadecimal key format. */ +RSStatus rs_parse_key_value (mpz_t dest, const char* str); + + +/**** Program data manipulation (program.c) ****/ + +/* Create a new program. */ +RSProgram* rs_program_new (void) RS_ATTR_MALLOC; + +/* Create a new program from an existing data buffer. */ +RSProgram* rs_program_new_with_data (RSCalcType ctype, RSDataType dtype, + void* data, unsigned long length, + unsigned long buffer_size) + RS_ATTR_MALLOC; + +/* Free program data. */ +void rs_program_free (RSProgram* prgm); + +/* Truncate or extend program. */ +RSStatus rs_program_set_length (RSProgram* prgm, unsigned long length); + +/* Add data to the end of the program. */ +RSStatus rs_program_append_data (RSProgram* prgm, const unsigned char* data, + unsigned long length); + + +/**** Search for key file (autokey.c) ****/ + +/* Get key ID for the given program. */ +unsigned long rs_program_get_key_id (const RSProgram* prgm) RS_ATTR_PURE; + +/* Find key file for the given ID. */ +RSStatus rs_key_find_for_id (RSKey* key, unsigned long keyid, int publiconly); + + +/**** Program signing and validation (apps.c) ****/ + +/* Check/fix program header and data. */ +RSStatus rs_repair_program (RSProgram* prgm, RSRepairFlags flags); + +/* Add a signature to the program. */ +RSStatus rs_sign_program (RSProgram* prgm, RSKey* key, int rootnum); + +/* Validate program signature. */ +RSStatus rs_validate_program (const RSProgram* prgm, const RSKey* key); + + +/**** TI-73/83+/84+ app signing (app8x.c) ****/ + +/* Check/fix Flash app header and data. */ +RSStatus rs_repair_ti8x_app (RSProgram* app, RSRepairFlags flags); + +/* Add a signature to a Flash app. */ +RSStatus rs_sign_ti8x_app (RSProgram* app, RSKey* key, int rootnum); + +/* Validate Flash app signature. */ +RSStatus rs_validate_ti8x_app (const RSProgram* app, const RSKey* key); + + +/**** TI-73/83+/84+ OS signing (os8x.c) ****/ + +/* Check/fix OS header and data. */ +RSStatus rs_repair_ti8x_os (RSProgram* os, RSRepairFlags flags); + +/* Add a signature to an OS. */ +RSStatus rs_sign_ti8x_os (RSProgram* os, RSKey* key); + +/* Validate OS signature. */ +RSStatus rs_validate_ti8x_os (const RSProgram* os, const RSKey* key); + + +/**** TI-89/92+ app/OS signing (app9x.c) ****/ + +/* Check/fix Flash app header and data. */ +RSStatus rs_repair_ti9x_app (RSProgram* app, RSRepairFlags flags); + +/* Check/fix OS header and data. */ +RSStatus rs_repair_ti9x_os (RSProgram* app, RSRepairFlags flags); + +/* Add a signature to a 68k app/OS. */ +RSStatus rs_sign_ti9x_app (RSProgram* app, RSKey* key); + +/* Validate app/OS signature. */ +RSStatus rs_validate_ti9x_app (const RSProgram* app, const RSKey* key); + +#define rs_sign_ti9x_os rs_sign_ti9x_app +#define rs_validate_ti9x_os rs_validate_ti9x_app + + +/**** File input (input.c) ****/ + +/* Read program contents from a file. */ +RSStatus rs_read_program_file (RSProgram* prgm, FILE* f, + const char* fname, RSInputFlags flags); + + +/**** File output (output.c) ****/ + +/* Write program contents to a file. */ +RSStatus rs_write_program_file(const RSProgram* prgm, FILE* f, + int month, int day, int year, + RSOutputFlags flags); + + +/**** Hex file output (output8x.c) ****/ + +/* Write program to a .73k/.73u/.8xk/.8xu or .app file. */ +RSStatus rs_write_ti8x_file (const RSProgram* prgm, FILE* f, + int month, int day, int year, + RSOutputFlags flags); + + +/**** Binary file output (output9x.c) ****/ + +/* Write program to a .89k/.89u/.9xk/.9xu file. */ +RSStatus rs_write_ti9x_file (const RSProgram* prgm, FILE* f, + int month, int day, int year, + RSOutputFlags flags); + + +/**** App header/certificate utility functions (header.c) ****/ + +/* Get length of a header field. */ +void rs_get_field_size (const unsigned char* data, + unsigned long* fieldstart, + unsigned long* fieldsize); + +/* Set length of a header field. */ +int rs_set_field_size (unsigned char* data, + unsigned long fieldsize); + +/* Find a given header field in the data. */ +int rs_find_app_field (unsigned int type, + const unsigned char* data, + unsigned long length, + unsigned long* fieldhead, + unsigned long* fieldstart, + unsigned long* fieldsize); + +/* Get value of a numeric header field. */ +unsigned long rs_get_numeric_field (unsigned int type, + const unsigned char* data, + unsigned long length) RS_ATTR_PURE; + + +/**** Error/message logging (error.c) ****/ + +typedef void (*RSMessageFunc) (const RSKey*, const RSProgram*, + const char*, void*); + +/* Set program name */ +void rs_set_progname (const char* s); + +/* Set verbosity level */ +void rs_set_verbose (int v); + +/* Set error logging function */ +void rs_set_error_func (RSMessageFunc func, void* data); + +/* Set message logging function */ +void rs_set_message_func (RSMessageFunc func, void* data); + + +#ifdef __cplusplus +} +#endif + +#endif /* __RABBITSIGN_H__ */ diff --git a/tool/rabbitsign-src/rabin.c b/tool/rabbitsign-src/rabin.c new file mode 100644 index 0000000..aaa599c --- /dev/null +++ b/tool/rabbitsign-src/rabin.c @@ -0,0 +1,425 @@ +/* + * RabbitSign - Tools for signing TI graphing calculator software + * Copyright (C) 2009 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include "rabbitsign.h" +#include "internal.h" + +/* + * Compute square root of x modulo p, where p === 3 (mod 4). + * + * (Assume that (x|p) = 1.) + * + * Notice that: + * + * p = 4k + 3 + * + * x^[(p-1)/2] = x^(2k+1) = (x|p) = 1 + * + * x^(2k+2) = x + * + * [x^(k+1)]^2 = x + * + * so x^(k+1) = x^[(p+1)/4] is a square root of x. + */ +static void mpz_sqrtm_3 (mpz_t res, /* mpz to store result */ + const mpz_t x, /* number to get square root of */ + const mpz_t p) /* prime modulus === 3 (mod 4) */ +{ + mpz_add_ui(res, p, 1); + mpz_fdiv_q_2exp(res, res, 2); /* (p + 1)/4 */ + mpz_powm(res, x, res, p); +} + + +/* + * Compute square root of x modulo p, where p === 5 (mod 8). + * + * (Assume that (x|p) = 1.) + * + * Notice that: + * + * p = 4k + 1 + * + * x^[(p-1)/2] = x^(2k) = (x|p) = 1 + * + * x^[(k+1)/2]^2 * x^(4k-1) = x^(5k) = x^k + * + * Since x^k^2 = 1, x^k = +/- 1. + * + * CASE 1: + * If x^k = 1, x^[(k+1)/2]^2 = x, so x^[(k+1)/2] = x^[(p+3)/8] is + * the square root of x. + * + * CASE 2: + * Otherwise, x^[(k+1)/2]^2 = -x; we need to find a square root of + * -1. + * + * Since (2|p) = -1, 2^[(p-1)/2] = 2^(2k) = -1, so (2^k)^2 = -1 + * + * (x^[(k+1)/2] * 2^k)^2 = -x * -1 = x + * + * so x^[(k+1)/2] * 2^k = x^[(p+3)/8] * 2^[(p-1)/4] is the square + * root of x. + */ +static void mpz_sqrtm_5 (mpz_t res, /* mpz to store result */ + const mpz_t x, /* number to get square root of */ + const mpz_t p) /* prime modulus === 5 (mod 8) */ +{ + mpz_t a, b; + mpz_init(a); + mpz_init(b); + + mpz_add_ui(a, p, 3); + mpz_fdiv_q_2exp(b, a, 3); + mpz_powm(res, x, b, p); /* x ^ (p+3)/8 */ + + /* Check if res^2 = x */ + mpz_mul(a, res, res); + mpz_sub(b, a, x); + mpz_mod(a, b, p); + + if (0 != mpz_sgn(a)) { + mpz_sub_ui(a, p, 1); + mpz_fdiv_q_2exp(b, a, 2); + mpz_set_ui(a, 2); + mpz_powm(a, a, b, p); /* 2 ^ (p-1)/4 */ + mpz_mul(res, res, a); + } + + mpz_clear(a); + mpz_clear(b); +} + + +/* + * Compute square root of x modulo p. + * + * This still won't work with p === 1 mod 8, but then, TI's system + * won't work at all for 50% of apps if one of your factors is 1 mod + * 8. (See the discussion of f values below.) + * + */ +static void mpz_sqrtm (mpz_t res, /* mpz to store result */ + const mpz_t x, /* number to get square root of */ + const mpz_t p) /* prime modulus === 3, 5, or 7 + (mod 8) */ +{ + if ((mpz_get_ui(p) % 8) == 5) + mpz_sqrtm_5(res, x, p); + else + mpz_sqrtm_3(res, x, p); +} + + +/* + * Compute x s.t. x === r (mod p) and x === s (mod q). + * + * We compute this as: + * + * [(r-s) * q^-1 mod p] * q + s + * + */ +static void mpz_crt(mpz_t res, /* mpz to store result */ + const mpz_t r, /* root modulo p */ + const mpz_t s, /* root modulo q */ + const mpz_t p, /* first modulus */ + const mpz_t q, /* second modulus */ + const mpz_t qinv) /* q^(p-2) mod p */ +{ + /* ((r - s) */ + mpz_sub(res, r, s); + + /* * q^-1) */ + mpz_mul(res, res, qinv); + mpz_mod(res, res, p); + + /* * q + s */ + mpz_mul(res, res, q); + mpz_add(res, res, s); +} + +/* + * Compute the T_f transform modulo n. + * + * Because only one quarter of the possible hashes can be signed with + * a given key, we need to transform the hash. First, we want to + * ensure that the result is nonzero, so we shift the hash by 8 bits + * and add a 1 to the end. The resulting number is called m'. + * + * Second, we want to multiply it by a number k whose Legendre symbols + * (k|p) and (k|q) are known, so that (km'|p) = (k|p)(m'|p) = 1 and + * (km'|q) = (k|q)(km'|q) = 1. Since we need both to be true + * simultaneously, regardless of the values of (m'|p) and (m'|q), we + * clearly need four possible values of k. + * + * As it happens, TI's keys all follow a precise format: they all have + * p === 3 and q === 7 (mod 8). As a result, we know that + * + * (-1|p) = (-1|q) = -1 + * + * (2|p) = -1, (2|q) = 1 + * + * So TI has defined the following transformation functions: + * + * T_0(x) = -2x' + * T_1(x) = -x' + * T_2(x) = x' + * T_3(x) = 2x' + * + * where x' = 256x + 1. + * + * In the usual case of p === 3 and q === 7 (mod 8), then, two of the + * possible (T_f(m)|p) will equal 1: + * + * If (m'|p) = 1, then (T_0(m)|p) = (T_2(m)|p) = 1. + * If (m'|p) = -1, then (T_1(m)|p) = (T_3(m)|p) = 1. + * + * Two of the possible (T_f(m)|q) will equal 1: + * + * If (m'|q) = 1, then (T_2(m)|q) = (T_3(m)|q) = 1. + * If (m'|q) = -1, then (T_0(m)|q) = (T_1(m)|q) = 1. + * + * Thus we can choose exactly one f value with + * (T_f(m)|p) = (T_f(m)|q) = 1. + * + * If r === 5 (mod 8) is a prime, (-1|r) = 1, while (2|r) = -1. Thus + * a similar logic holds: + * + * If (m'|r) = 1, then (T_1(m)|r) = (T_2(m)|r) = 1. + * If (m'|r) = -1, then (T_0(m)|r) = (T_3(m)|r) = 1. + * + * So if {p,q} === {3,5}, {5,7}, or {3,7} (mod 8), given any m, we can + * pick an f with (T_f(m)|p) = (T_f(m)|q) = 1. + * + */ +static void applyf(mpz_t res, /* mpz to store result */ + const mpz_t m, /* MD5 hash */ + const mpz_t n, /* public key */ + int f) /* f (0, 1, 2, 3) */ +{ + mpz_mul_ui(res, m, 256); + mpz_add_ui(res, res, 1); + + switch (f) { + case 0: + mpz_add(res, res, res); + case 1: + mpz_sub(res, n, res); + break; + case 2: + break; + case 3: + mpz_add(res, res, res); + break; + } +} + +/* + * Compute the Rabin signature with a given f. + */ +static void rabsigf(mpz_t res, /* mpz to store result */ + const mpz_t m, /* MD5 hash */ + const mpz_t n, /* public key */ + const mpz_t p, /* first factor */ + const mpz_t q, /* second factor */ + const mpz_t qinv, /* q^(p-2) mod p */ + int f, /* f (0, 1, 2, 3) */ + int rootnum) /* root number (0, 1, 2, 3) */ +{ + mpz_t mm; + mpz_t r,s; + + mpz_init(r); + mpz_init(s); + mpz_init(mm); + + applyf(mm, m, n, f); + + mpz_sqrtm(r, mm, p); + mpz_sqrtm(s, mm, q); + + if (rootnum & 1) { + mpz_sub(r, p, r); + } + + if (rootnum & 2) { + mpz_sub(s, q, s); + } + + mpz_crt(res, r, s, p, q, qinv); + + mpz_clear(r); + mpz_clear(s); + mpz_clear(mm); +} + +/* + * Table of f values. + * + * Remember that + * + * f = 0 corresponds to multiplying by -2 + * f = 1 corresponds to multiplying by -1 + * f = 2 corresponds to multiplying by 1 + * f = 3 corresponds to multiplying by 2 + */ +static const int ftab[36] = { + /************* (m'|p) = (m'|q) = 1 */ + /********** (m'|p) = -1, (m'|q) = 1 */ + /****** (m'|p) = 1, (m'|q) = -1 */ + /*** (m'|p) = (m'|q) = -1 */ + + /* p === 3, q === 3 */ + 2, 99, 99,1, /* (-1|p) = (-1|q) = -1 ==> if both -1, multiply by -1 */ + + /* p === 3, q === 5 */ + 2, 1, 0, 3, /* (-1|p) = -1, (-1|q) = 1 ==> if (m'|p) = -1, multiply by -1 */ + /* (-2|p) = 1, (-2|q) = -1 ==> if (m'|q) = -1, multiply by -2 */ + + /* p === 3, q === 7 */ + 2, 3, 0, 1, /* (2|p) = -1, (2|q) = 1 ==> if (m'|p) = -1, multiply by 2 */ + /* (-2|p) = 1, (-2|q) = -1 ==> if (m'|q) = -1, multiply by -2 */ + + /* p === 5, q === 3 */ + 2, 0, 1, 3, + + /* p === 5, q === 5 */ + 2, 99, 99,3, /* (2|p) = (2|q) = -1 ==> if both -1, multiply by 2 */ + + /* p === 5, q === 7 */ + 2, 3, 1, 0, /* (2|p) = -1, (2|q) = 1 ==> if (m'|p) = -1, multiply by 2 */ + /* (-1|p) = 1, (-1|q) = -1 ==> if (m'|q) = -1, multiply by -1 */ + + /* p === 7, q === 3 */ + 2, 0, 3, 1, + + /* p === 7, q === 5 */ + 2, 1, 3, 0, + + /* p === 7, q === 7 */ + 2, 99, 99,1 /* (-1|p) = (-1|q) = -1 ==> if both -1, multiply by -1 */ +}; + +/* + * Compute the Rabin signature and the useful value of f. + */ +int rs_sign_rabin(mpz_t res, /* mpz to store signature */ + int* f, /* f value chosen */ + const mpz_t hash, /* MD5 hash of app */ + int rootnum, /* root number (0, 1, 2, 3) */ + RSKey* key) /* key structure */ +{ + mpz_t mm; + int mLp, mLq; + int pm8, qm8; + + if (!mpz_sgn(key->n)) { + rs_error(key, NULL, "unable to sign: public key missing"); + return RS_ERR_MISSING_PUBLIC_KEY; + } + + if (!mpz_sgn(key->p) || !mpz_sgn(key->q)) { + rs_error(key, NULL, "unable to sign: private key missing"); + return RS_ERR_MISSING_PRIVATE_KEY; + } + + mpz_init(mm); + + /* Calculate q^-1 if necessary */ + + if (!mpz_sgn(key->qinv)) { +#ifndef USE_MPZ_GCDEXT + mpz_sub_ui(mm, key->p, 2); + mpz_powm(key->qinv, key->q, mm, key->p); +#else + mpz_gcdext(mm, key->qinv, NULL, key->q, key->p); + if (mpz_cmp_ui(mm, 1)) { + mpz_clear(mm); + rs_error(key, NULL, "unable to sign: unsuitable key"); + return RS_ERR_UNSUITABLE_RABIN_KEY; + } +#endif + } + + applyf(mm, hash, key->n, 2); + + mLp = mpz_legendre(mm, key->p); + mLq = mpz_legendre(mm, key->q); + + pm8 = mpz_get_ui(key->p) % 8; + qm8 = mpz_get_ui(key->q) % 8; + + if (pm8 == 1 || qm8 == 1 || (pm8 % 2) == 0 || (qm8 % 2) == 0) { + mpz_clear(mm); + rs_error(key, NULL, "unable to sign: unsuitable key"); + return RS_ERR_UNSUITABLE_RABIN_KEY; + } + + *f = ftab[(mLp == 1 ? 0 : 1) + + (mLq == 1 ? 0 : 2) + + (((qm8 - 3) / 2) * 4) + + (((pm8 - 3) / 2) * 12)]; + + if (*f == 99) { + mpz_clear(mm); + rs_error(key, NULL, "unable to sign: unsuitable key"); + return RS_ERR_UNSUITABLE_RABIN_KEY; + } + + rabsigf(res, hash, key->n, key->p, key->q, key->qinv, *f, rootnum); + mpz_clear(mm); + return RS_SUCCESS; +} + +/* Check that the given Rabin signature is valid. */ +int rs_validate_rabin (const mpz_t sig, /* purported signature of app */ + int f, /* f value */ + const mpz_t hash, /* MD5 hash of app */ + const RSKey* key) /* key structure */ +{ + mpz_t a, b; + int result; + + if (!mpz_sgn(key->n)) { + rs_error(key, NULL, "unable to validate: public key missing"); + return RS_ERR_MISSING_PUBLIC_KEY; + } + + if (f < 0 || f > 3) + return RS_SIGNATURE_INCORRECT; + + mpz_init(a); + mpz_init(b); + + mpz_mul(a, sig, sig); + mpz_mod(a, a, key->n); + + applyf(b, hash, key->n, f); + + result = mpz_cmp(a, b); + + mpz_clear(a); + mpz_clear(b); + return (result ? RS_SIGNATURE_INCORRECT : RS_SUCCESS); +} diff --git a/tool/rabbitsign-src/rsa.c b/tool/rabbitsign-src/rsa.c new file mode 100644 index 0000000..05139a9 --- /dev/null +++ b/tool/rabbitsign-src/rsa.c @@ -0,0 +1,137 @@ +/* + * RabbitSign - Tools for signing TI graphing calculator software + * Copyright (C) 2009 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include "rabbitsign.h" +#include "internal.h" + +#define VALIDATION_EXPONENT 17 + +/* + * Calculate the RSA signing exponent. + * + * The validation exponent, e, is 17 for all TI-related RSA + * signatures. The signing exponent, d, depends on n, and is + * calculated so that e * d === 1 (mod (p-1)(q-1)). + * + * (This means that for any number x, + * + * x^(e * d) = x * x^[k0 * (p-1)] === x * 1 (mod p), + * + * and likewise + * + * x^(e * d) = x * x^[k1 * (q-1)] === x * 1 (mod q). + * + * Therefore (Chinese remainder theorem) x^(e * d) === x (mod n). + * + * Note that there is no way of calculating d without knowing the + * factors of n; this is a key point in the security of RSA.) + */ +static int get_exponent(mpz_t res, /* mpz to store result */ + int e, /* validation exponent */ + const mpz_t p, /* first factor */ + const mpz_t q) /* second fatctor */ +{ + mpz_t a, b; + mpz_init(a); + mpz_init(b); + + mpz_sub_ui(a, p, 1); + mpz_sub_ui(b, q, 1); + mpz_mul(a, a, b); + + mpz_set_ui(b, e); + + mpz_gcdext(b, res, NULL, b, a); + if (mpz_cmp_ui(b, 1)) { + mpz_clear(a); + mpz_clear(b); + return RS_ERR_UNSUITABLE_RSA_KEY; + } + + mpz_mod(res, res, a); + + mpz_clear(a); + mpz_clear(b); + return RS_SUCCESS; +} + +/* + * Compute an RSA signature. + * + * This is simply the hash raised to the d-th power mod n (where d is + * defined above.) + */ +int rs_sign_rsa(mpz_t res, /* mpz to store signature */ + const mpz_t hash, /* MD5 hash of app */ + RSKey* key) /* key structure */ +{ + if (!mpz_sgn(key->n)) { + rs_error(key, NULL, "unable to sign: public key missing"); + return RS_ERR_MISSING_PUBLIC_KEY; + } + + if (!mpz_sgn(key->d)) { + if (!mpz_sgn(key->p) || !mpz_sgn(key->q)) { + rs_error(key, NULL, "unable to sign: private key missing"); + return RS_ERR_MISSING_PRIVATE_KEY; + } + if (get_exponent(key->d, VALIDATION_EXPONENT, key->p, key->q)) { + rs_error(key, NULL, "unable to sign: unsuitable key"); + return RS_ERR_UNSUITABLE_RSA_KEY; + } + } + + mpz_powm(res, hash, key->d, key->n); + return RS_SUCCESS; +} + +/* + * Check that the given RSA signature is valid. + * + * To do this, we raise the signature to the 17th power mod n, and see + * if it matches the hash. + */ +int rs_validate_rsa(const mpz_t sig, /* purported signature of app */ + const mpz_t hash, /* MD5 hash of app */ + const RSKey* key) /* key structure */ +{ + mpz_t e, m; + int result; + + if (!mpz_sgn(key->n)) { + rs_error(key, NULL, "unable to validate: public key missing"); + return RS_ERR_MISSING_PUBLIC_KEY; + } + + mpz_init(e); + mpz_init(m); + + mpz_set_ui(e, VALIDATION_EXPONENT); + mpz_powm(m, sig, e, key->n); + result = mpz_cmp(hash, m); + + mpz_clear(e); + mpz_clear(m); + return (result ? RS_SIGNATURE_INCORRECT : RS_SUCCESS); +} diff --git a/tool/rabbitsign-src/typestr.c b/tool/rabbitsign-src/typestr.c new file mode 100644 index 0000000..00bfb92 --- /dev/null +++ b/tool/rabbitsign-src/typestr.c @@ -0,0 +1,161 @@ +/* + * RabbitSign - Tools for signing TI graphing calculator software + * Copyright (C) 2009 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#ifdef HAVE_STRING_H +# include +#else +# ifdef HAVE_STRINGS_H +# include +# endif +#endif + +#include "rabbitsign.h" +#include "internal.h" + +/* + * Get default file suffix for a given calc/data type. + */ +const char* rs_type_to_suffix(RSCalcType calctype, /* calculator type */ + RSDataType datatype, /* program data type */ + int hexonly) /* 1 = plain hex output */ +{ + if (calctype == RS_CALC_TI73) { + if (datatype == RS_DATA_APP) + return (hexonly ? "app" : "73k"); + else if (datatype == RS_DATA_OS) + return (hexonly ? "hex" : "73u"); + else if (datatype == RS_DATA_CERT) + return "73q"; + } + else if (calctype == RS_CALC_TI83P) { + if (datatype == RS_DATA_APP) + return (hexonly ? "app" : "8xk"); + else if (datatype == RS_DATA_OS) + return (hexonly ? "hex" : "8xu"); + else if (datatype == RS_DATA_CERT) + return "8xq"; + } + else if (calctype == RS_CALC_TI89) { + if (datatype == RS_DATA_APP) + return "89k"; + else if (datatype == RS_DATA_OS) + return "89u"; + else if (datatype == RS_DATA_CERT) + return "89q"; + } + else if (calctype == RS_CALC_TI92P) { + if (datatype == RS_DATA_APP) + return "9xk"; + else if (datatype == RS_DATA_OS) + return "9xu"; + else if (datatype == RS_DATA_CERT) + return "9xq"; + } + + return "sig"; +} + +/* + * Get implied calc/data type for a given file suffix. + */ +int rs_suffix_to_type(const char* suff, /* file suffix (not + including .) */ + RSCalcType* calctype, /* implied calculator + type */ + RSDataType* datatype) /* implied program type */ +{ + int calc, data; + + if (strlen(suff) != 3) + return -1; + + if (suff[0] == '7' && suff[1] == '3') + calc = RS_CALC_TI73; + else if (suff[0] == '8' && (suff[1] == 'x' || suff[1] == 'X')) + calc = RS_CALC_TI83P; + else if (suff[0] == '8' && suff[1] == '9') + calc = RS_CALC_TI89; + else if (suff[0] == '9' && (suff[1] == 'x' || suff[1] == 'X')) + calc = RS_CALC_TI92P; + else if ((suff[0] == 'v' || suff[0] == 'V') && suff[1] == '2') + calc = RS_CALC_TI92P; + else + return -1; + + if (suff[2] == 'k' || suff[2] == 'K') + data = RS_DATA_APP; + else if (suff[2] == 'u' || suff[2] == 'U') + data = RS_DATA_OS; + else if (suff[2] == 'q' || suff[2] == 'Q') + data = RS_DATA_CERT; + else + return -1; + + if (calctype) *calctype = calc; + if (datatype) *datatype = data; + return 0; +} + +/* + * Get a human-readable description of a calculator type. + */ +const char* rs_calc_type_to_string(RSCalcType calctype) +{ + switch (calctype) { + case RS_CALC_TI73: + return "TI-73"; + + case RS_CALC_TI83P: + return "TI-83/84 Plus"; + + case RS_CALC_TI89: + return "TI-89"; + + case RS_CALC_TI92P: + return "TI-92 Plus/Voyage 200"; + + default: + return "unknown"; + } +} + +/* + * Get a human-readable description of a data type. + */ +const char* rs_data_type_to_string(RSDataType datatype) +{ + switch (datatype) { + case RS_DATA_OS: + return "OS"; + + case RS_DATA_APP: + return "application"; + + case RS_DATA_CERT: + return "certificate"; + + default: + return "program"; + } +} diff --git a/tool/tilem-src/CHANGELOG b/tool/tilem-src/CHANGELOG new file mode 100644 index 0000000..78a8f7f --- /dev/null +++ b/tool/tilem-src/CHANGELOG @@ -0,0 +1,316 @@ +/* This file only contains the changelog for the gui/doc/data, some things could be missing (core changes...)*/ +/* This changelog was started when I started to work on TilEm2 */ + +/* contra-sh : +* ---18/08/09--- +* - Draw the TI83 +* - Copy from testemu.c : Create the savname, Open the Rom, Get the model, Draw the lcdscreen (no animation for the moment) +* - Function event OnDestroy +* - Modification of the Makefile (I hope it's good !? If you can control this... thx) +* - LEARNING HOW COMMIT !! :D +* ---19/08/09--- +* - New structure TilemCalcSkin : define the different filenames for the SkinSet (4 pieces). +* - Draw the other models _automatically_ . ;D +* ---20/08/09--- +* - Create skin.c +* - Create gui.h (equivalent of tilem.h for the gui directory) +* - Move the code struct in gui.h and TilemCalcSkin* tilem_guess_skin_set(TilemCalc* calc) into skin.c (only one call in the main file to define the skin set) ;D +* - Detect a keyboard event (function keyboard_event() in skin.c actually).No treatment. +* - Detect an event click on mouse +* ---21/08/09--- +* - Get the x and y values when click on mouse (now it will be easy to know how key is click on the pixmap, todo in priority : detect right click) +* ---24/08/09--- +* - Detect right click. +* ---26/08/09--- +* - New function : TilemKeyMap* tilem_guess_key_map(int id).Choose a TilemKeyMap with an id given in parameter. +* ---27/08/09--- +* - Extract the choice of the key_map from the mouse_event function.Execute only one time and it's more properly (and it will be easier to add the possibility to manage many skins and many keymaps). +* ---01/09/09--- +* - Choose automatically the key_list. The TilemKeyList is already included in the TilemKeyMap structure... +* - New structure TilemKeyCoord (old TilemKeyMap).TilemKeyMap already contains TilemKeyCoord and TilemKeyList... +* ---08/09/09--- +* - New function tilem_set_coord to change the keypad coord. +* - New file event.c to group the GDKevent handling. +* - New function tilem_set_skin to change the skin. +* ---10/09/09--- +* - Add the right click menu :D (0 signal connected without OnDestroy).Largely inspired from Tilem 0.973 and http://www.linux-france.org/article/devl/gtk/gtk_tut-11.html was a great inspiration too. +* ---21/09/09--- +* - Aouch I had seen that the left click doesn't work now! Problem : two callback for the only one button_press_event. (sorry for this version...) +* ---22/09/09--- +* - Correction : only one callback now. mouse_event contains the create_menu and the gtk_menu_popup. (lot of time was spent on this problem)* +* ---23/09/09--- +* - Change TilemKeyCoord to the 82 stats skin.Change Event.c too. +* ---06/10/09--- +* - Beginning the correction : change the method for testing coordinates clicks (one line now) . The coordinates will be imported from a file soon. +* ---20/11/09--- +* - After 1 week to learn Tiemu skin format...I have made my own Tilem skin Generator.Inspired from skinedit.It just generate compatible file with 0 coordinates values, and an default lcd coordinates.Not really necessary but very useful for testing and for learning how this f****** skin format works.It will be called skintool for the moment. +* ---27/11/09--- +* - After blocking a problem for a week grrr... I succeed to adapt the TiEmu skinloader to TilEm (skinops.c and skinops.h).Little modifications +* ---28/11/09--- +* - The mouse_event function now use a SKIN_INFOS struct. So delete TilemKeyCoord struct. +* ---02/12/09--- +* - Add a GtkFileSelection (access by right click menu) and try to load another skin with this method. +* ---03/12/09--- +* - Create a GLOBAL_SKIN_INFOS that contains a KEY_LIST struct (old TilemKeyList) and a SKIN_INFOS struct. +* ---04/12/09--- +* - Delete the TilemKeyCoord, TilemKeyMap, TilemCalcSkin and TilemKeyList structs... +* ---05/12/09--- +* - The GtkWidget *pWindow creation was moved from testemu2.c to event.c .The function is called GtkWidget* Draw_Screen(GLOBAL_SKIN_INFOS *gsi); +* ---07/12/09--- +* - New feature : TilEm could load a skin by the right_click_menu ! It use GtkWidget* ReDraw_Screen(GLOBAL_SKIN_INFOS *gsi) in event.c. WAOUH ! +* ---08/12/09--- +* - Move Draw_Screen, ReDraw_Screen and create_menus in a new screen.c file. Change Makefile. +* ---14/12/09--- +* - New feature : add a popup rom type selector (radio button) at the start of tilem. Showed but not used for the moment. +* - Connect the thread (no animation yet). Thanks to the "battle programming" 's spirit (hey bob ^^) +* ---18/12/09--- +* - Launch the interactivity with emulation core. Could print into the draw area. +* ---09/03/10--- +* - Restart working on this program ;D +* ---11/03/10--- +* - I finally succeeded to connect the core. To print something into the lcd screen ! WahoOO ! This day is a great day ! +* - I succeded to type numbers etc... +* - And now it works very well !! (the "button-release-event" is not catched by pWindow but by pLayout) +* ---15/03/10--- +* - Create the scan_click function.Return wich keys was clicked.Print debug infos. +* - Create the debuginfos.h to group the ifdef for debugging. (different level and different type of debug msg) +* ---17/03/10--- +* - Create the rom_choose_popup function to replace choose_rom_type.It use GtkDialog instead of GtkWindow. +* - rom_choose_popup _freeze_ the system... and get wich radio button is selected. So it will be easy to create the good emu.calc (and choose the default skin). +* ---18/03/10--- +* - Resize the (printed) lcd area (gsi->emu->lcdwin) to fit(perfectly) into the skin. +* - Replace a lot of printf by D****_L*_A* to easily switch what debug infos were printed. +* - Try to make a nice debugging output (frames in ASCII ^^) :p +* - WahooOO , load a skin works perfectly.You can easily change skin _while running_, no error, no warning. +* - Could load automatically the good skin and run the good core using the choose_rom_popup() function and choose_skin_filename() function. +* ---30/03/10--- +* - Create skin for following models : 73, 81, 82, 83+ and 84+. +* - Fix bug in tool.c .Modification of tool.c to create radio button more properly. +* ---31/03/10--- +* - Create skin for following model : 83 . Based on my own calc (take a foto with my iphone 3GS :D) +* ---01/04/10--- +* - New feature : Save calc state and load state. State are stored in a separate dir called sav/ . (using benjamin 's function) +* - New feature : Change view to see only the lcd. I finally choose to add it into a GtkLayout. So you can maximize it, but there was problem with add_event. +* ---02/04/10--- +* - Add popup function to just print error message.You must give the message and gsi as parameter, and it run a modal dialog. +* - Some cleaning. +* ---23/04/10--- +* - Add config.c file to manage config.dat (create, read, modif etc...). +* ---31/05/10--- +* - Start from scratch a totally new debugger :D.Just draw button with nice GtkImages.Actually in essai2 directory. +* - Get and resize pixmaps (png) to 36 * 36 pixels for the debugger. +* ---01/06/10--- +* - Add the debugger to tilem. Load registers values. +* - Add a new feature : switch the top level window "borderless".It can be switch by clicking on right click menu entry. +* ---02/06/10--- +* - Create the GtkTreeView (debugger). +* - Refresh register on click. +* ---05/08/10--- +* - More than one month without working on tilem...Only commit old modif, and skn/README file. +* - Refresh stack on click (number of entry is correct but value not) +* ---06/08/10--- +* - Working on a new system of configuration file.The config.dat is now a binary file (as .skn but totally differennt). At start, a CONFIG_INFOS struct is filling, then when clicking on right menu, this struct is modified, then when you stop tilem, config.dat is writed on disc. +* ---09/08/10--- +* - Correction of the SEG_FAULT (never use sizeof(char*) inside malloc, strlen(char*) is better :P). +* ---10/08/10--- +* - Working on a new config file called romconfig.dat (inspired from config.dat) using to do not ask for model each time tilem is started. +* - It works :D +* ---12/08/10--- +* - NEW feature : Can load a file using libticalcs2 (inspired from the wokr of Benjamin Moody). Basically it works, but it's not OK. (many bugs) +* - Drop the deprecated GtkFileSelection.Use GtkFileChooser instead. :) +* ---13/08/10--- +* - NEW feature : Add the screenshot feature. +* ---17/08/10--- +* - Change the ti84plus.skn (old was really ugly). +* - Add doc/ directory : add romconfig_file_format.txt and skinconfig_file_format.txt. +* ---18/08/10--- +* - Correct the bug in link.c (unlock mutex ...) +* - Start working on macro handling : Always do the same things to load and launch a file into an emulator become quickly noisy for the programmer (1 time, 10 times, 30 times, 50 times...argh!). Simply record a sequence and play it to test a program, this is one solution. (feature request from Guillaume Hoffman gh@gmail.com). +* ---19/08/10--- +* - The macro feature works including loading file (very important). The implementation is very basic (record and read a text file) so many bug could (should?) appear. But I wait to see how it will be use. +* ---20/08/10-- +* - Better implementation of GtkFileChooser (to be cleaner). +* - Some work on macro (no seg fault now ^^). +* - Add a Save state... entry in right click menu (no need to stop tilem to save state) +* - Add a Play macro with GtkFileChooser (to play another macro than play.txt). +* - Fix minor bug in GtkFileChooser (forget to init a char* to NULL). +* ---23/08/10--- +* - Add a new args handler using getop library (add -m for macro and -k for skin). +* ---06/09/10--- +* - NEW feature : could print the lcd content into the terminal. So useless but so funny ;) (feature request from Guillaume Hoffman). +* - The output is saved into a file called lcd_content.txt. +* ---08/09/10--- +* - Could choose wich char to display. This not really works as I want, but this is not a really important feature (works 1/2) +* - Add an option at startup (-l). Could now start in skinless mode. +* ---04/10/10--- +* - Start working on animated gif. Some research on GIF file format. Oops it will be hard, file is encoded (!). +* ---09/10/10--- +* - Creation of 1 little static gif file seems working, but always no LZW encoding. +* ---12/10/10--- +* - Finally I decided to use external source to encode the pix data.I use a file called "gifencode.c" by Hans Dinsen-Hansen and Michael A. Mayer. And it works !!! +* ---14/10/10--- +* - It works ! It works !!! Tilem2 is now able to generate animated gif, functions are currently working (but totally buggy) and it successfully create animated gif :) +* - Need to be integrated (and lot of debug).I commit it just to save it...Wait another commit to really use this feature :P +* ---01/02/11--- +* - Starting to work on a new config file using glibc to do not hard code keypad values. +* - And it works !!!! (but only load one keypad model currently) +* - Add the other models into keylist.ini (but the content is completely false). Change scan_click method (correct a bug) to use kp->nb_of_buttons. Only need to give correct value into the keylist.ini file. For the rest it's seems ok. +* ---07/02/11--- +* - Start to work on config.ini. A new generation config file using GKeyFile library (glib). Add some work in essai4 directory. +* ---08/02/11--- +* - Remove romconfig.c romconfig.h config.c config.h (handle binary config file). Remove ROM_CONFIG_INFOS and CONFIG_INFOS from gsi. +* - Add a new config.c and config.h file to handle config (last rom used, default skin to load, etc...). It uses glib GKeyFile library. +* - Fix the macro bug pointed by Benjamin. +* ---15/02/11--- +* - Replace correct copyright/licence informations into skinops.* .Sorry for the inconvenience. +* ---16/02/11--- +* - Fix an important mistake into the gif creator function (palette should be before gif frame information). +* ---18/02/11--- +* - Connect a timer to automatically add frame to a animated screenshot (using screenshot box). +* ---14/03/11--- +* - Improve default skin choice. +* - Define the skin's basedir into the config.ini. Add a universal getter into config.c . +* ---19/03/11--- +* - Add a bouncy progress bar to show the link status (send file). +* - Add a file saver. +* - Create a new TilemCmdlineArgs structure. +* ---07/04/11--- +* - Drop deprecated gtkitemfactory +* - Prepare GT3 migration +* ---10/04/11--- +* - Benjamin add a configure script and all associated things (Makefile.in, config.h etc...). +* - Fix dependency and a lot of cleaning. +* - Benjamin add a lot of function to handle data directory. +* ---13/04/11--- +* - Completely refactoring the screenshot window. New preview possibility. +* - Add some cool features for screenshot menu (replay from file, preview animation, preview screenshot, 2 gtkfilechooserbutton, change default folders etc...). +* - Remove old pix directory. +* - Benjamin begins to work on new debugger.Add a menu, some basic actions. +* ---15/04/11--- +* - Benjamin add a set of function to handle user defined icons. A lot of improvement on the debugger (add step action, pause). +* - Use tilem logo as default background in the screenshot menu, add some pix into the shared data directory. +* - Remove old debugger pix. +* - Add GtkSpinnerAnimation in the screenshot menu. Improve look and feel (fix fill/expand properties for the box, size of the widgets etc...). +* ---17/04/11--- +* - Benjamin add a ti83p symbol file which allow to replace flag values by theirs labels in the debugger (and more other things). Debugger looks like very good. +* ---19/04/11--- +* - I've added a ti83 symbol file (but it could contains some mistakes...). Flags are correctly printed for my loved ti83 regular ;) +* ---27/04/11--- +* - Root window size could be forced (but the ratio could be strand if you specify stanges values ... Because ration is calculated on the start width and heigth). +* ---02/05/11--- +* - Add the icons for the right click menu (stock icons currently). +* - Export all menu related code in a separate file called menu.c. It could maybe be done by UI in the future, but it works fine as it for the moment ;) +* - Add drag and drop support for loading files :) :) :) :) :) (code is currently really ugly) +* ---09/05/11--- +* - Create a new TilemGuiStateFlags structure ot group the running state of the gui (skinless, recording macro, etc...) and export it into TilemCalcEmu instead GLOBAL_SKIN_INFOS. +* - Completely remove GLOBAL_SKIN_INFOS structure from tilem2. +* ---10/05/11--- +* - Change strutures to look like a object oriented model. But in some case it's not really well implemented. +* ---11/05/11--- +* - Refactor a lot of gif header's code. +* ---12/05/11--- +* - I finally found what's wrong in my gif creation. So I can do multicolor gif now. +* ---14/05/11--- +* - We have finally completely reorganized the code to drop GLOBAL_SKIN_INFOS, and rename a lot of stuff including files (emuwin instead screen by example). +* - Benjamin have imported his nice filedlg functions (filedlg.c) from flashbook ui (see it on SF.net). Now use it for the entire code. +* ---14/05/11--- +* - Refactor the gif creation to separate clearly which value can be modified, which one are magic number etc... Create separate functions for each task. +* - Benjamin begins to work on animation (instead of writing file while recording it). It provides a wonderful objects to handle screenshot. +* ---15/05/11--- +* - Add a doxyfile for generating documentation including callgraphs. +* - Improvement to keybindings (Benjamin). +* ---16/05/11--- +* - Add some preliminary work on get var stuff. Only dirlist and allow user to retrieve a var using cmd line but it works. The list is printed in a tree view. +* - Add multi drag and drop feature. +* ---19/05/11--- +* - Add functions for animations (Benjamin). Could now save a animation into a gif file. +* - Improve screenshot menu by setting some buttons inactives depending the current state of screenshot creation. +* - Add combo box for size to screenshot menu. +* ---21/05/11--- +* - A lot of improvement on screenshot menu (Benjamin). Settings are now independent of screenshot dialog. Default directory for output. +* - Add mnemonic label to screenshot menu buttons (Benjamin). +* ---22/05/11--- +* - Benjamin redesign the entire menu popup to use the better GtkAction system. Now there's keybindings for menu and code is really beautiful and shorter. +* - Add grayscale option to screenshot menu (Benjamin). +* ---23/05/11--- +* - Save the last rom opened and use it at startup if no rom is given. +* - Allow user to load another rom while running. +* - Refactor the entire macro creation to separate creation from writing as TilemAnimation does. Code is cleaner and simply better. +* ---25/05/11--- +* - Add an option to change animation speed. The current printed animation is updated on change. +* ---26/05/11--- +* - Add an option to change foreground and background color. No visual feedback. +* ---27/05/11--- +* - Correct some stuff (see mailing list to know why). And add a palette setter in animation.c and a visual feedback when foreground/background color are changed. +* - Some other minor improvement. +* ---19/09/11--- +* - Restart working on tilem2 after holidays:) +* - Add new file getvar.c to handle get var function (receiving var from calc to PC). +* ---20/09/11--- +* - Some improvement to the rcvmenu. +* ---22/09/11--- +* - Add the ti83pfr.skn file. This skin is for ti83plus.fr. The creator is Claude Clerc (aka claudiux). He donates the skin under GPL v3+ licence.Thanks to him !!! +* ---11/10/11--- +* - Correct the getvar.c code to work correctly. Add columns to the tree view. +* - Add app receive handling. Set index column invisible. +* ---12/10/11--- +* - Some corrections : receive dialog is transcient. Receive dialog is not destroyed when closed just hided. New refresh button to refresh var/app list. +* - Use a separate thread to receive files. +* ---14/10/11--- +* - Add a feature to list ti82 and ti85 entries. User must prepare manually the link. Can't save a ti82 or ti85 entry (when selected in the rcvdialog). +* - Lot of bug, code is really ugly. No error handling. The prepare_for_link_receive is not working. etc... +* ---11/11/11--- +* - Benjamin add a totally new prefs dialog. Some unused function (print lcd in terminal by example) are deleted. +* ---12/11/11--- +* - Working on ns silent get var. +* ---14/11/11--- +* - New files : emucore.c and emucore.h . +* - Benjamin adds a totally new core task manager in the gui. Begin to convert the send files function to use it. +* - Use this task manager for macro. There's a little priority problem when a macro load a file. Load a file then run a macro at startup works fine. +* ---15/11/11--- +* - Receive non silent vars : Benjamin get it working! +* - Remove unused getvar.c file. +* ---16/11/11--- +* - Allow multiple selection and multiple receive file. Need to fix a segfault (tomorow... xD). +* ---17/11/11--- +* - Repare the file loading inside a macro (it was broken by new task manager). +* - Delete a lot of unused functions/printf. +* - Remove debuginfo.h file. +* ---22/11/11--- +* - Benjamin finished the last things left to do on receive dialog. Nice! +* ---25/11/11--- +* - New command line parser. Now tilem2 uses g_option from the glib instead of getopt. Easy handling of long options. Do not need to take care about correct parsing. A lot of new options are provided but not implemented ! +* - Delete args.c (old _but working well _ cmd line parser using getopt) and TilemCmdlineArgs structure from gui.h. +* - Add the possibility to getvar a file at startup. I had to use a weird solution to do this with task manager. But it's working :) +* ---12/12/11--- +* - Benjamin do a lot of improvements on file chooser (filters, ...). +* ---22/12/11--- +* - Benjamin fix certificate patching. +* ---19/03/12--- +* - Icons are finally commited into the trunk. These pictures are originaly designed by Scott Zeid and modified by me. No .desktop and icons installer for the moment. +* - Scott, thank you a lot for these wonderful pictures! +* ---21/03/12--- +* - Adding documentation (LaTeX). The documentation is not finished yet. Lot of pictures added. +* ---24/04/12--- +* - Benjamin added some correction to install properly the icons. +* ---27/04/12--- +* - Some modifications on the configure script because something was failing on my debian wheezy. It works fine yet (using squeeze and gtk/glib downgraded packages and some minor modifications on configure scripts). +* ---03/05/12--- +* - Reverting changes on the configure script because it was not the fault of configure script. +* ---07/05/12--- +* - Update doc (add "basic task" chapter). +* - Update .desktop files. +* ---08/05/12--- +* - Benjamin added a rule to install in the $HOME directory. +* - Benjamin added MIME type files. +* ---09/05/12--- +* - Benjamin added a piece of documentation about "getting ROM". +* ---11/05/12--- +* - Add an huge explanation for debugger part into the documentation. +* ---13/05/12--- +* - Add some screenshot documentation. +* ---15/05/12--- +* - Benjamin add README, THANKS and COPYING file. +* - Update screenshot doc. +*/ + diff --git a/tool/tilem-src/COPYING b/tool/tilem-src/COPYING new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/tool/tilem-src/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, 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 +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If 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 convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "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 PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/tool/tilem-src/INSTALL b/tool/tilem-src/INSTALL new file mode 100644 index 0000000..84008d7 --- /dev/null +++ b/tool/tilem-src/INSTALL @@ -0,0 +1,53 @@ + Installing TilEm + ------------------ + +To compile TilEm, you will need: + + * a standard C compiler + + * the GTK+ library, version 2.6.0 or later + + * the libticalcs2 library (part of the TiLP project), and its + dependencies (libticables2, libtifiles2, and libticonv) + +Some OS distributions package the "development files" separately from +the libraries themselves; you need both. If you are using Debian (or +a related distribution, such as Ubuntu or Mint), install the packages +'build-essential', 'libticalcs-dev', and 'libgtk2.0-dev'. + +If these packages aren't available from your package manager, you'll +need to compile them yourself; see the TiLP website for more +information (http://lpg.ticalc.org/prj_tilp/). + +Mac OS X has not been tested by the TilEm team, but if TiLP works, +TilEm should, too. Please let us know if you do get it to work. + +Once the above dependencies are installed, open a terminal and 'cd' to +the directory containing this INSTALL file. Then run + + ./configure + +which will check whether you have all of the necessary software +installed, and figure out how to compile TilEm for your particular +system. If configure is successful, you can then run + + make + +to compile TilEm. Finally, you can run + + sudo make install + +to install it (or run 'make install' as the superuser.) The program +will be installed in '/usr/local/bin/', and data files will be +installed in '/usr/local/share/tilem2/'. Alternatively, you can run + + make install-home + +to install TilEm in your own home directory ('$HOME/bin/', with data +files stored in '$HOME/.local/share/tilem2/'), which does not require +superuser privileges. (If $HOME/bin didn't exist already, you might +have to run 'export PATH=$HOME/bin:$PATH', or log out and log back in, +before running TilEm.) + +Once TilEm is installed, start it by running 'tilem2', or through your +system's applications menu. diff --git a/tool/tilem-src/KEYS b/tool/tilem-src/KEYS new file mode 100644 index 0000000..d547d84 --- /dev/null +++ b/tool/tilem-src/KEYS @@ -0,0 +1,270 @@ +KEYBOARD BINDINGS + + This list shows the default keyboard controls for TilEm. You can + modify these, if you like, by editing 'keybindings.ini'. (Place the + modified version of keybindings.ini in your TilEm configuration + directory - $HOME/.config/tilem2/ on Unix, or + $PROFILE\Local Settings\Application Data\tilem2 on Windows.) + + In the following list: + S = Shift + C = Control + ↑ = 2nd + α = Alpha + + ² in the TI-82/83 column indicates that the key is only for the TI-82. + ³ indicates that it is only for the TI-83/TI-83 Plus/TI-84 Plus. + + Key TI-73 TI-76.fr TI-81 TI-82/83 TI-85/86 + ────────────────────────────────────────────────────────────────────────────── + F12 ON ON ON ON ON + S+F12 ↑ [OFF] ↑ [OFF] ↑ [OFF] ↑ [OFF] ↑ [OFF] + + Up Up Up Up Up Up + Down Down Down Down Down Down + Left Left Left Left Left Left + Right Right Right Right Right Right + S+Up ↑ Up ↑ Up ↑ Up ↑ Up ↑ Up + S+Down ↑ Down ↑ Down ↑ Down ↑ Down ↑ Down + Home ↑ Left ↑ Left ↑ Left ↑ Left + End ↑ Right ↑ Right ↑ Right ↑ Right + PageUp α Up ³ + PageDown α Down ³ + + F1 Y= f(x)= Y= Y= F1 + F2 WINDOW fenêtre RANGE WINDOW F2 + F3 ZOOM zoom ZOOM ZOOM F3 + F4 TRACE trace TRACE TRACE F4 + F5 GRAPH graphe GRAPH GRAPH F5 + S+F1 ↑ [PLOT] ↑ [gr stat] ↑ Y= ↑ [STAT PLT] ↑ [M1] + S+F2 ↑ [TBLSET] ↑ [déf tab] ↑ RANGE ↑ [TBLSET] ↑ [M2] + S+F3 ↑ [FORMAT] ↑ [format] ↑ ZOOM ↑ [FORMAT] ↑ [M3] + S+F4 ↑ TRACE ↑ [calculs] ↑ TRACE ↑ [CALC] ↑ [M4] + S+F5 ↑ [TABLE] ↑ [table] ↑ GRAPH ↑ [TABLE] ↑ [M5] + PageDown MORE + + Tab 2nd 2nde 2nd 2nd 2nd + ' or Menu ↑ [TEXT] texte Alpha Alpha Alpha + + Insert ↑ [INS] ↑ [insérer] INS ↑ [INS] ↑ [INS] + Delete DEL suppr DEL DEL DEL + Backspace Left, DEL Left, suppr Left, DEL Left, DEL Left, DEL + C+Backspace CLEAR annul CLEAR CLEAR CLEAR + or C+Delete + + Escape CLEAR annul CLEAR CLEAR EXIT + S+Escape ↑ [QUIT] ↑ [quitter] ↑ [QUIT] ↑ [QUIT] ↑ [QUIT] + + F6 math MATH MATH GRAPH + F7 APPS angle MATRX MATRX/APPS STAT + F8 PRGM prgm PRGM PRGM PRGM + F9 var VARS VARS CUSTOM + F10 stats STAT + F11 MODE mode MODE MODE ↑ [MODE] + c CONST + d DRAW + l LIST + m MATH + p prgm PRGM PRGM + C+Tab ↑ [CATALOG] ↑ [catalog] ↑ [CATALOG]³ ↑ [CATALOG] + + _ UNIT + | or ½ a/b + f F◂▸D + a Ab/c◂▸d/e + s SIMP + % % + + | ↑ [ABS] ↑ [ABS] ² + s sin SIN SIN + c cos COS COS + t tan TAN TAN + o log LOG LOG + l ln LN LN + + u ↑ [uₙ] ↑ [u] ³ + v ↑ [vₙ] ↑ [v] ³ + w ↑ [wₙ] ↑ [w] ³ + u ↑ [Uₙ₋₁] ² + v ↑ [Vₙ₋₁] ² + n ↑ [n] ² + + C+1 or \ ↑ [x⁻¹] x⁻¹ x⁻¹ x⁻¹ ↑ [x⁻¹] + C+2 or ² x² x² x² x² x² + ( ( ( ( ( ( + ) ) ( ) ) ) + { ↑ [{] ↑ [{] + } ↑ [}] ↑ [}] + [ ↑ [[] ↑ [[] + ] ↑ []] ↑ []] + ^ ^ ^ ^ ^ ^ + / ÷ ÷ ÷ ÷ ÷ + * × × × × × + - - - - - - + + + + + + + + , , , α [,] , , + + > STO▸ STO▸ STO▸ STO▸ STO▸ + < ↑ [RCL] ↑ [rappel] ↑ STO▸ ↑ [RCL] ↑ [RCL] + + 0 - 9 0 - 9 0 - 9 0 - 9 0 - 9 0 - 9 + . . . . . . + ~ or ± (-) (-) (-) (-) (-) + & or € ↑ [EE] ↑ […×10ⁿ] EE ↑ [EE] EE + + x X x,n X|T X,T,θ,n + $ ↑ [ANS] ↑ [rép] ↑ [ANS] ↑ [ANS] ↑ [ANS] + # ↑ [π] ↑ [π] ↑ [π] ↑ [π] ↑ [π] + e ↑ [e] ↑ [e] ³ + i ↑ [i] ³ + + A - Z α [A]-[Z] α [A]-[Z] α [A]-[Z] + a - z ↑α [a]-[z] + Space α [space] α [space] α [space] + @ α [θ] α [θ] + " α ["] α ["] + ? α [?] α [?] + : α [:] ↑ [:] + = α [=] + + Return ENTER entrer ENTER ENTER ENTER + S+Return ↑ [ENTRY] ↑ [précéd] ↑ [ENTRY] ↑ [ENTRY] ↑ [ENTRY] + ────────────────────────────────────────────────────────────────────────────── + + For the TI-83 Plus and TI-84 Plus, in addition to the keys listed + above for the TI-83, pressing Shift+letter while Caps Lock is enabled + will type a lowercase letter (Alpha, Alpha, letter.) Lowercase mode + will need to be enabled on the calculator for this to work; it's not + enabled by default, but there are many assembly programs that can do + so. + + +KEYPAD CHARTS + + TI-73 TI-76.fr + + ╭──────┬──────┬──────┬──────┬──────╮ ╭──────┬──────┬──────┬──────┬──────╮ + │S+F1 │S+F2 │S+F3 │S+F4 │S+F5 │ │S+F1 │S+F2 │S+F3 │S+F4 │S+F5 │ + │F1 │F2 │F3 │F4 │F5 │ │F1 │F2 │F3 │F4 │F5 │ + ╰──────┴──────┴──────┴────┬─┴──┬───╯ ╰──────┴──────┴──────┴────┬─┴──┬───╯ + ╭──────┬──────┬──────╮ │S+Up│ ╭──────┬──────┬──────╮ │S+Up│ + │ │S+Esc │Ins ├────┤Up ├─────╮ │ │S+Esc │Ins ├────┤Up ├─────╮ + │Tab │F11 │Del │Home├────┤End │ │Tab │F11 │Del │Home├────┤End │ + ├──────┼──────┼──────┤Left├────┤Right│ ├──────┼──────┼──────┤Left├────┤Right│ + │' │ │ ├────┤S+Dn├─────╯ │ │ │ ├────┤S+Dn├─────╯ + │m │d │l │ │Down│ │' │x │F10 │ │Down│ + ├──────┼──────┼──────┼────┴─┬──┴───╮ ├──────┼──────┼──────┼────┴─┬──┴───╮ + │ │& │C+Tab │ │ │ │ │ │ │ │ │ + │C+2 │^ │F8 │F7 │Esc │ │F6 │F7 │F8 │F9 │Esc │ + ├──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┤ + │ │\ │# │ │ │ │ │ │ │ │# │ + │_ │| │f │a │c │ │\ │s │c │t │^ │ + ├──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┤ + │ │ │ │ │ │ │ │& │{ │} │e │ + │s │% │( │) │/ │ │C+2 │, │( │) │/ │ + ├──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┤ + │ │ │ │ │ │ │ │u │v │w │ │ + │x │7 │8 │9 │* │ │o │7 │8 │9 │* │ + ├──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┤ + │ │ │ │ │ │ │ │ │ │ │ │ + │, │4 │5 │6 │- │ │l │4 │5 │6 │- │ + ├──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┤ + │< │ │ │ │ │ │< │ │ │ │ │ + │> │1 │2 │3 │+ │ │> │1 │2 │3 │+ │ + ├──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┤ + │S+F12 │ │ │$ │S+Ret │ │S+F12 │C+Tab │ │$ │S+Ret │ + │F12 │0 │. │~ │Ret │ │F12 │0 │. │~ │Ret │ + ╰──────┴──────┴──────┴──────┴──────╯ ╰──────┴──────┴──────┴──────┴──────╯ + + + TI-81 TI-82 + + ╭──────┬──────┬──────┬──────┬──────╮ ╭──────┬──────┬──────┬──────┬──────╮ + │S+F1 │S+F2 │S+F3 │S+F4 │S+F5 │ │S+F1 │S+F2 │S+F3 │S+F4 │S+F5 │ + │F1 │F2 │F3 │F4 │F5 │ │F1 │F2 │F3 │F4 │F5 │ + ╰──────┴──────┴──────┴────┬─┴──┬───╯ ╰──────┴──────┴──────┴────┬─┴──┬───╯ + ╭──────┬──────┬──────╮ │S+Up│ ╭──────┬──────┬──────╮ │S+Up│ + │ │ │ ├────┤Up ├─────╮ │ │S+Esc │Ins ├────┤Up ├─────╮ + │Tab │Ins │Del │ ├────┤ │ │Tab │F11 │Del │Home├────┤End │ + ├──────┼──────┼──────┤Left├────┤Right│ ├──────┼──────┼──────┤Left├────┤Right│ + │ │ │ ├────┤S+Dn├─────╯ │ │ │ ├────┤S+Dn├─────╯ + │' │x │F11 │ │Down│ │' │x │F10 │ │Down│ + ├──────┼──────┼──────┼────┴─┬──┴───╮ ├──────┼──────┼──────┼────┴─┬──┴───╮ + │ │ │ │ │S+Esc │ │ │ │ │ │ │ + │F6 │F7 │F8 │F9 │Esc │ │F6 │F7 │F8 │F9 │Esc │ + ├──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┤ + │| │ │ │ │# │ │| │ │ │ │# │ + │\ │s │c │t │^ │ │\ │s │c │t │^ │ + ├──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┤ + │ │ │ │ │ │ │ │& │{ │} │ │ + │C+2 │& │( │) │/ │ │C+2 │, │( │) │/ │ + ├──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┤ + │ │ │ │ │ │ │ │u │v │n │[ │ + │o │7 │8 │9 │* │ │o │7 │8 │9 │* │ + ├──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┤ + │ │ │ │ │ │ │ │ │ │ │] │ + │l │4 │5 │6 │- │ │l │4 │5 │6 │- │ + ├──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┤ + │< │ │ │ │ │ │< │ │ │ │ │ + │> │1 │2 │3 │+ │ │> │1 │2 │3 │+ │ + ├──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┤ + │S+F12 │ │ │$ │S+Ret │ │S+F12 │ │ │$ │S+Ret │ + │F12 │0 │. │~ │Ret │ │F12 │0 │. │~ │Ret │ + ╰──────┴──────┴──────┴──────┴──────╯ ╰──────┴──────┴──────┴──────┴──────╯ + + Not shown: Not shown: + A-Z Alpha, [A]-[Z] A-Z Alpha, [A]-[Z] + @ Alpha, 3 @ Alpha, 3 + " Alpha, + " Alpha, + + Space Alpha, 0 Space Alpha, 0 + , Alpha, . : Alpha, . + ? Alpha, (-) ? Alpha, (-) + + + TI-83 / TI-83 Plus / TI-84 Plus TI-85 / TI-86 + + ╭──────┬──────┬──────┬──────┬──────╮ ╭──────┬──────┬──────┬──────┬──────╮ + │S+F1 │S+F2 │S+F3 │S+F4 │S+F5 │ │S+F1 │S+F2 │S+F3 │S+F4 │S+F5 │ + │F1 │F2 │F3 │F4 │F5 │ │F1 │F2 │F3 │F4 │F5 │ + ╰──────┴──────┴──────┴────┬─┴──┬───╯ ╰──────┴──────┴──────┴────┬─┴──┬───╯ + ╭──────┬──────┬──────╮ │S+Up│ ╭──────┬──────┬──────╮ │S+Up│ + │ │S+Esc │Ins ├────┤Up ├─────╮ │ │S+Esc │F11 ├────┤Up ├─────╮ + │Tab │F11 │Del │Home├────┤End │ │Tab │Esc │PgDn │Home├────┤End │ + ├──────┼──────┼──────┤Left├────┤Right│ ├──────┼──────┼──────┤Left├────┤Right│ + │ │ │ ├────┤S+Dn├─────╯ │ │ │Ins ├────┤S+Dn├─────╯ + │' │x │F10 │ │Down│ │' │ │Del │ │Down│ + ├──────┼──────┼──────┼────┴─┬──┴───╮ ├──────┼──────┼──────┼────┴─┬──┴───╮ + │ │ │ │ │ │ │ │ │ │C+Tab │ │ + │F6 │F7 │F8 │F9 │Esc │ │F6 │F7 │F8 │F9 │C+BkSp│ + ├──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┤ + │ │ │ │ │# │ │ │ │ │ │# │ + │\ │s │c │t │^ │ │ │ │ │ │^ │ + ├──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┤ + │ │& │{ │} │e │ │ │\ │[ │] │ │ + │C+2 │, │( │) │/ │ │ │& │( │) │/ │ + ├──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┤ + │ │u │v │w │[ │ │ │ │ │ │ │ + │o │7 │8 │9 │* │ │C+2 │7 │8 │9 │* │ + ├──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┤ + │ │ │ │ │] │ │ │ │ │ │ │ + │l │4 │5 │6 │- │ │, │4 │5 │6 │- │ + ├──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┤ + │< │ │ │ │ │ │< │ │ │ │ │ + │> │1 │2 │3 │+ │ │> │1 │2 │3 │+ │ + ├──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┤ + │S+F12 │C+Tab │i │$ │S+Ret │ │S+F12 │ │: │$ │S+Ret │ + │F12 │0 │. │~ │Ret │ │F12 │0 │. │~ │Ret │ + ╰──────┴──────┴──────┴──────┴──────╯ ╰──────┴──────┴──────┴──────┴──────╯ + + Not shown: Not shown: + PageUp Alpha, Up A-Z Alpha, [A]-[Z] + PageDown Alpha, Down a-z 2nd, Alpha, [a]-[z] + A-Z Alpha, [A]-[Z] Space Alpha, (-) + @ Alpha, 3 = Alpha, Sto▸ + " Alpha, + + Space Alpha, 0 + : Alpha, . + ? Alpha, (-) + + TI-83 Plus / TI-84 Plus only: + CapsLock + Shift + a-z = Alpha, Alpha, [a]-[z] diff --git a/tool/tilem-src/Makefile.in b/tool/tilem-src/Makefile.in new file mode 100644 index 0000000..77de808 --- /dev/null +++ b/tool/tilem-src/Makefile.in @@ -0,0 +1,91 @@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ +datarootdir = @datarootdir@ +bindir = @bindir@ +datadir = @datadir@ +pkgdatadir = @datadir@/tilem2 +mandir = @mandir@ + +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +srcdir = @srcdir@ +VPATH = @srcdir@ +@SET_MAKE@ +SHELL = @SHELL@ + +INSTALL = @INSTALL@ + +distname = @PACKAGE_TARNAME@-@PACKAGE_VERSION@ + +distfiles = CHANGELOG COPYING INSTALL KEYS NEWS README THANKS TODO \ + aclocal.m4 config.h.in configure configure.ac install-sh \ + Makefile.in \ + data/Makefile.in \ + data/keybindings.ini \ + data/desktop/*.desktop data/desktop/*.xml \ + data/icons/hicolor/index.theme data/icons/hicolor/*/*/*.png \ + data/icons-svg/*.svg \ + data/skins/README data/skins/*.skn \ + data/symbols/*.sym \ + db/Makefile.in db/*.c db/*.h \ + emu/Makefile.in emu/*.c emu/*.h emu/x*/*.c emu/x*/*.h \ + gui/Makefile.in gui/*.c gui/*.h gui/*.ico gui/*.rc.in \ + installer/win32/Makefile.in \ + installer/win32/installer.nsi.in installer/win32/gtkrc \ + installer/win32/COPYING-ZLIB installer/win32/COPYING-PIXMAN + +all: + cd emu && $(MAKE) + cd db && $(MAKE) + cd gui && $(MAKE) + +clean: + cd emu && $(MAKE) clean + cd db && $(MAKE) clean + cd gui && $(MAKE) clean + cd installer/win32 && $(MAKE) clean + +install: all + cd gui && $(MAKE) install + cd data && $(MAKE) install + +uninstall: + cd gui && $(MAKE) uninstall + cd data && $(MAKE) uninstall + +install-home: all + $(MAKE) install \ + bindir=$(HOME)/bin \ + datarootdir=$${XDG_DATA_HOME:-$(HOME)/.local/share} + +uninstall-home: + $(MAKE) uninstall \ + bindir=$(HOME)/bin \ + datarootdir=$${XDG_DATA_HOME:-$(HOME)/.local/share} + +distclean: clean + rm -f config.status config.log config.h configure.lineno + rm -rf autom4te.cache + rm -f installer/win32/Makefile installer/win32/installer.nsi + rm -f gui/tilem2.rc + rm -f Makefile emu/Makefile db/Makefile gui/Makefile data/Makefile + +dist: + rm -rf $(distname) + mkdir $(distname) + set -e ; files=`cd $(srcdir) ; echo $(distfiles)` ; \ + for f in $$files ; do \ + dir=`echo $(distname)/$$f | sed 's,/[^/]*$$,,'` ; \ + [ -d $$dir ] || $(INSTALL) -d $$dir ; \ + cp -p $(srcdir)/$$f $$dir ; \ + done + tar cv $(distname) | bzip2 -c -9 > $(distname).tar.bz2 + +Makefile: Makefile.in config.status + $(SHELL) ./config.status + +config.status: configure + $(SHELL) ./config.status --recheck + +.PRECIOUS: Makefile config.status +.PHONY: all clean dist distclean install install-home uninstall uninstall-home diff --git a/tool/tilem-src/NEWS b/tool/tilem-src/NEWS new file mode 100644 index 0000000..45ef967 --- /dev/null +++ b/tool/tilem-src/NEWS @@ -0,0 +1,73 @@ + Version History + ----------------- + +2012-06-07 -- version 2.0 + + This is the first official release of the "new" TilEm. Much of the + old TilEm code has been rewritten, and there are many improvements + (and probably some new bugs.) + + Please note, if you have used older versions of TilEm: + + * Your existing ROM files and settings in ~/.TilEm will not be + used (in fact, you can keep TilEm 0.97x installed alongside + TilEm 2.0 if you wish.) TilEm 2.0 no longer uses a "library" of + ROM files; you can store ROM files anywhere you like. + + * TilEm 2.0 uses a new format for calculator state (SAV) files. + State files created by TilEm 0.97x can be loaded by TilEm 2.0, + but if you then save the state, it will be stored in the new + format, which older versions of TilEm will not support. + + New features and bugs fixed since version 0.975 include: + + * All code that was covered by the Z80em license has been removed. + + * Support for the TI-81 (both hardware versions) and TI-76.fr, and + experimental support for the TI-Nspire's TI-84 Plus emulation + mode. + + * Many hardware emulation improvements for all calculator models. + In particular, major improvements have been made concerning Z80 + interrupts, timers, the LCD driver, and the link port. + + * The emulator window uses TiEmu-format skin files. + + * Greatly improved grayscale emulation. + + * Commands for saving still screenshots (in PNG, BMP, JPEG, or GIF + format) and animations (GIF format only.) + + * Keypad macros can be recorded and replayed. + + * Programs and/or ROM files can be loaded from the command line. + + * Link I/O uses libticalcs2, which allows all types of variables, + as well as Flash apps and OSes, to be transferred through the + link port. For the TI-81, PRG files can be transferred to and + from the calculator memory directly. + + * TilEm does not consume 100% of the host CPU when idle. + + * Improved disassembler (macros; distinct "labels" and "romcalls"; + named IY flags.) + + * The debugger offers a "Finish Subroutine" command. In addition, + the "Step Over" command behaves more sensibly. + + * Breakpoints can be set on absolute memory addresses, and on Z80 + opcodes. + + * Many minor improvements. + + Features of 0.975 that are not yet supported in TilEm 2.0 include: + + * External link cables. + + * Custom symbol files in the disassembler. + + * Program counter history tracking. + + Most of the new code is due to Benjamin Moody (floppusmaximus) and + Thibault Duponchelle (contra-sh). See THANKS for a full list of + contributors. diff --git a/tool/tilem-src/README b/tool/tilem-src/README new file mode 100644 index 0000000..bcd613c --- /dev/null +++ b/tool/tilem-src/README @@ -0,0 +1,92 @@ + TilEm + ------- + +TilEm is an emulator and debugger for Texas Instruments Z80-based +graphing calculators. It can emulate any of the following calculator +models: + + TI-73 / TI-73 Explorer + TI-76.fr + TI-81 + TI-82 + TI-82 STATS / TI-82 STATS.fr + TI-83 + TI-83 Plus / TI-83 Plus Silver Edition / TI-83 Plus.fr + TI-84 Plus / TI-84 Plus Silver Edition / TI-84 pocket.fr + TI-85 + TI-86 + +TilEm fully supports all known versions of the above calculators (as +of 2012), and attempts to reproduce the behavior of the original +calculator hardware as faithfully as possible. + +In addition, TilEm can emulate the TI-Nspire's virtual TI-84 Plus +mode. This is currently experimental, and some programs may not work +correctly. + +TilEm runs on the X Window System on GNU/Linux and other Unix-like +platforms, as well as on Microsoft Windows, and any other platform +supported by the GTK+ library. + + + Installation + -------------- +Packages for Microsoft Windows are available from the TilEm project +website (http://lpg.ticalc.org/prj_tilem/). For other platforms, you +will need to compile TilEm from source; please see the file 'INSTALL' +in the source package. + + + Using TilEm + ------------- +TilEm requires a copy of the operating system from the calculator +model(s) you wish to emulate. This file is called a "ROM image", +since the calculator OS was traditionally stored in Read-Only Memory. +ROM images are copyrighted by TI and may not be distributed without +permission. See the TilEm User's Manual for more information about +how to create a ROM image. + +The main TilEm window shows an image of the calculator (if possible - +we are still missing background images for a few models.) Clicking +with the left mouse button presses a key; clicking with the middle +button presses a key and holds it down. Clicking with the right +button, or pressing Shift+F10, opens the menu. + +When you run TilEm for the first time, it will ask you to select a ROM +image to use. The file you select will be used by default the next +time you run TilEm. You can switch to a different ROM image by +right-clicking and selecting "Open Calculator". + +The state of the emulated calculator is not saved by default; to save +the state, right-click and select "Save Calculator". The state is +saved to a ".sav" file, stored in the same directory as the ROM image. + +You can send program and variable files to the emulated calculator, +either by dragging and dropping them from your file manager, or by +right-clicking and selecting "Send File". To retrieve program or +variable files from the calculator, select "Receive File". + +Other features of TilEm include: + + - A debugger for assembly programs + - Capturing screenshots, both normal and animated + - Recording and replaying keystroke macros + +For more information, see the TilEm User's Manual: + http://lpg.ticalc.org/prj_tilem2/doc.html + + + About this program + -------------------- +Many people deserve credit for helping to make this program possible. +See the file 'THANKS'. + +This program is free software, which means that you are allowed to +modify it, and to distribute it (or your modified version) to others. +When you received this program, you should also have been offered a +complete copy of its source code. For more information, see the file +'COPYING'. + +You can contact the authors at . +Please let us know of any problems you encounter, or ideas for how we +could make TilEm better. diff --git a/tool/tilem-src/THANKS b/tool/tilem-src/THANKS new file mode 100644 index 0000000..b76e949 --- /dev/null +++ b/tool/tilem-src/THANKS @@ -0,0 +1,37 @@ + Thanks + -------- +The current maintainers of TilEm are Thibault Duponchelle and Benjamin +Moody, but many other people have played a part in making this program +possible. + +The original TilEm was written in 2001 by Julien Solignac. The +current version is partially based on the original, but large portions +have been rewritten, starting in 2009, by Benjamin Moody and Thibault +Duponchelle. Portions of the hardware emulation code are also due to +Luc Bruant. + +The code for reading skin files is based on code from TiEmu, written +by Julien Blache. The GIF compression code is based on whirlgif, +written by Hans Dinsen-Hansen and Michael A. Mayer. + +Thanks to Claude Clerc for the photo of his TI-83 Plus, and to Danilo +Šegan for the photo of his TI-86, which we have used as skins. Thanks +to Scott Zeid for the design of the program icon. + +TilEm uses the TiLP libraries (libticalcs2, libticables2, libtifiles2, +and libticonv) to send and receive variables. Thanks are due to the +current maintainer of TiLP, Lionel Debroux, for his assistance, as +well as to all of the past maintainers of TiLP, including Romain +Liévin, Kevin Kofler, and Julien Blache. + +Finally, this program would never have been possible without the +efforts of countless programmers and researchers over the years to +discover and document the inner workings of the calculator hardware. +The following people deserve special recognition for their research: +Randy Compton, Tijl Coosemans, Brian Coventry, Dan Eble, Dan +Englender, Dines Justesen, Julien Lasson, Mattias Lindqvist, James +Montelongo, Michael Vincent, Brandon Wilson, and Joerg Woerner. + +(Thibault) In addition of above: +Thanks to Michael Nock and Guillaume Hoffman for testing, feature request and encouragement. +Thanks to Xavier Andreani for his encouragement. diff --git a/tool/tilem-src/TODO b/tool/tilem-src/TODO new file mode 100644 index 0000000..53b4599 --- /dev/null +++ b/tool/tilem-src/TODO @@ -0,0 +1,7 @@ +- Linking between 2 tilem instances +- Sound +- Rewrite macro (parser and tokens). +- Add scripting (lua or something else?) +- Teacher mode (record keys pressed and produce a picture file with keys icons) + + diff --git a/tool/tilem-src/aclocal.m4 b/tool/tilem-src/aclocal.m4 new file mode 100644 index 0000000..af3c83d --- /dev/null +++ b/tool/tilem-src/aclocal.m4 @@ -0,0 +1,173 @@ +# generated automatically by aclocal 1.11.1 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# serial 1 (pkg-config-0.24) +# +# Copyright © 2004 Scott James Remnant . +# +# 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 2 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# PKG_PROG_PKG_CONFIG([MIN-VERSION]) +# ---------------------------------- +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) +m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) +AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) +AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_default([$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PKG_CONFIG="" + fi +fi[]dnl +])# PKG_PROG_PKG_CONFIG + +# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# +# Check to see whether a particular set of modules exists. Similar +# to PKG_CHECK_MODULES(), but does not set variables or print errors. +# +# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +# only at the first occurence in configure.ac, so if the first place +# it's called might be skipped (such as if it is within an "if", you +# have to call PKG_CHECK_EXISTS manually +# -------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_EXISTS], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +if test -n "$PKG_CONFIG" && \ + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then + m4_default([$2], [:]) +m4_ifvaln([$3], [else + $3])dnl +fi]) + +# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +# --------------------------------------------- +m4_define([_PKG_CONFIG], +[if test -n "$$1"; then + pkg_cv_[]$1="$$1" + elif test -n "$PKG_CONFIG"; then + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes ], + [pkg_failed=yes]) + else + pkg_failed=untried +fi[]dnl +])# _PKG_CONFIG + +# _PKG_SHORT_ERRORS_SUPPORTED +# ----------------------------- +AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi[]dnl +])# _PKG_SHORT_ERRORS_SUPPORTED + + +# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +# [ACTION-IF-NOT-FOUND]) +# +# +# Note that if there is a possibility the first call to +# PKG_CHECK_MODULES might not happen, you should be sure to include an +# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac +# +# +# -------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_MODULES], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl + +pkg_failed=no +AC_MSG_CHECKING([for $1]) + +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) + +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS +and $1[]_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details.]) + +if test $pkg_failed = yes; then + AC_MSG_RESULT([no]) + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + + m4_default([$4], [AC_MSG_ERROR( +[Package requirements ($2) were not met: + +$$1_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +_PKG_TEXT])[]dnl + ]) +elif test $pkg_failed = untried; then + AC_MSG_RESULT([no]) + m4_default([$4], [AC_MSG_FAILURE( +[The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +_PKG_TEXT + +To get pkg-config, see .])[]dnl + ]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + $3 +fi[]dnl +])# PKG_CHECK_MODULES + diff --git a/tool/tilem-src/config.h.in b/tool/tilem-src/config.h.in new file mode 100644 index 0000000..f2aa9aa --- /dev/null +++ b/tool/tilem-src/config.h.in @@ -0,0 +1,91 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define if building universal (internal helper macro) */ +#undef AC_APPLE_UNIVERSAL_BUILD + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if the system has the type `uintptr_t'. */ +#undef HAVE_UINTPTR_T + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +# undef WORDS_BIGENDIAN +# endif +#endif + +/* 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 +#undef inline +#endif + +/* Define to the equivalent of the C99 'restrict' keyword, or to + nothing if this is not supported. Do not define if restrict is + supported directly. */ +#undef restrict +/* Work around a bug in Sun C++: it does not support _Restrict or + __restrict__, even though the corresponding Sun C compiler ends up with + "#define restrict _Restrict" or "#define restrict __restrict__" in the + previous line. Perhaps some future version of Sun C++ will work with + restrict; if so, hopefully it defines __RESTRICT like Sun C does. */ +#if defined __SUNPRO_CC && !defined __RESTRICT +# define _Restrict +# define __restrict__ +#endif + +/* Define to the type of an unsigned integer type wide enough to hold a + pointer, if such a type exists, and if the system does not define it. */ +#undef uintptr_t diff --git a/tool/tilem-src/configure b/tool/tilem-src/configure new file mode 100755 index 0000000..cc4e5ad --- /dev/null +++ b/tool/tilem-src/configure @@ -0,0 +1,6127 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.68 for TilEm 2.0. +# +# Report bugs to . +# +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software +# Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + # We cannot yet assume a decent shell, so we have to provide a + # neutralization value for shells without unset; and this also + # works around shells that cannot unset nonexistent variables. + # Preserve -v and -x to the replacement shell. + BASH_ENV=/dev/null + ENV=/dev/null + (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV + export CONFIG_SHELL + case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; + esac + exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and +$0: tilem-devel@lists.sourceforge.net about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='TilEm' +PACKAGE_TARNAME='tilem' +PACKAGE_VERSION='2.0' +PACKAGE_STRING='TilEm 2.0' +PACKAGE_BUGREPORT='tilem-devel@lists.sourceforge.net' +PACKAGE_URL='http://tilem.sourceforge.net/' + +ac_unique_file="emu/tilem.h" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='LTLIBOBJS +LIBOBJS +EGREP +GREP +DLLPATH +TICALCS_BINDIR +GTK_BINDIR +LN_S +MAKENSIS +WINDRES +OBJDUMP +STRIP +TICALCS_LIBS +TICALCS_CFLAGS +gui_extra_objects +GUI_LDFLAGS +GTK_LIBS +GTK_CFLAGS +PKG_CONFIG_LIBDIR +PKG_CONFIG_PATH +PKG_CONFIG +UPDATE_MIME_DATABASE +UPDATE_DESKTOP_DATABASE +SET_MAKE +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +RANLIB +AR_FLAGS +AR +OPT_CFLAGS +CPP +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_gtk_deprecated +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP +OPT_CFLAGS +AR +AR_FLAGS +RANLIB +PKG_CONFIG +PKG_CONFIG_PATH +PKG_CONFIG_LIBDIR +GTK_CFLAGS +GTK_LIBS +TICALCS_CFLAGS +TICALCS_LIBS' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used" >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures TilEm 2.0 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/tilem] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of TilEm 2.0:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-gtk-deprecated + Disable deprecated GTK+ API + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + OPT_CFLAGS Additional C compiler flags used for optimizing critical areas + of the code (default: -O3 if using GCC) + AR Static library archiver + AR_FLAGS Flags to pass to ar to build a static library + RANLIB Program to make a static library linkable + PKG_CONFIG path to pkg-config utility + PKG_CONFIG_PATH + directories to add to pkg-config's search path + PKG_CONFIG_LIBDIR + path overriding pkg-config's built-in search path + GTK_CFLAGS C compiler flags for GTK, overriding pkg-config + GTK_LIBS linker flags for GTK, overriding pkg-config + TICALCS_CFLAGS + C compiler flags for TICALCS, overriding pkg-config + TICALCS_LIBS + linker flags for TICALCS, overriding pkg-config + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +TilEm home page: . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +TilEm configure 2.0 +generated by GNU Autoconf 2.68 + +Copyright (C) 2010 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_type +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by TilEm $as_me 2.0, which was +generated by GNU Autoconf 2.68. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + +# Checks for programs + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +if test "x$GCC" = "xyes" ; then + CFLAGS="$CFLAGS -W -Wall -Wwrite-strings" + if test "x$OPT_CFLAGS" = "x" ; then + OPT_CFLAGS="-O3" + fi +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AR="${ac_tool_prefix}ar" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_AR="ar" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +else + AR="$ac_cv_prog_AR" +fi + + + +if test "x$AR_FLAGS" = "x" ; then + AR_FLAGS=cru +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + + + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + + +# Extract the first word of "update-desktop-database", so it can be a program name with args. +set dummy update-desktop-database; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_UPDATE_DESKTOP_DATABASE+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$UPDATE_DESKTOP_DATABASE"; then + ac_cv_prog_UPDATE_DESKTOP_DATABASE="$UPDATE_DESKTOP_DATABASE" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_UPDATE_DESKTOP_DATABASE="update-desktop-database" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_UPDATE_DESKTOP_DATABASE" && ac_cv_prog_UPDATE_DESKTOP_DATABASE=":" +fi +fi +UPDATE_DESKTOP_DATABASE=$ac_cv_prog_UPDATE_DESKTOP_DATABASE +if test -n "$UPDATE_DESKTOP_DATABASE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UPDATE_DESKTOP_DATABASE" >&5 +$as_echo "$UPDATE_DESKTOP_DATABASE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "update-mime-database", so it can be a program name with args. +set dummy update-mime-database; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_UPDATE_MIME_DATABASE+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$UPDATE_MIME_DATABASE"; then + ac_cv_prog_UPDATE_MIME_DATABASE="$UPDATE_MIME_DATABASE" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_UPDATE_MIME_DATABASE="update-mime-database" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_UPDATE_MIME_DATABASE" && ac_cv_prog_UPDATE_MIME_DATABASE=":" +fi +fi +UPDATE_MIME_DATABASE=$ac_cv_prog_UPDATE_MIME_DATABASE +if test -n "$UPDATE_MIME_DATABASE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UPDATE_MIME_DATABASE" >&5 +$as_echo "$UPDATE_MIME_DATABASE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +# Checks for libraries + + + +# GLib and GTK+ + + + + + + + + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +$as_echo "$PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_PKG_CONFIG"; then + ac_pt_PKG_CONFIG=$PKG_CONFIG + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG +if test -n "$ac_pt_PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +$as_echo "$ac_pt_PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_PKG_CONFIG" = x; then + PKG_CONFIG="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + PKG_CONFIG=$ac_pt_PKG_CONFIG + fi +else + PKG_CONFIG="$ac_cv_path_PKG_CONFIG" +fi + +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=0.9.0 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 +$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + PKG_CONFIG="" + fi +fi + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK" >&5 +$as_echo_n "checking for GTK... " >&6; } + +if test -n "$GTK_CFLAGS"; then + pkg_cv_GTK_CFLAGS="$GTK_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= 2.6.0 + glib-2.0 >= 2.12.0 + gthread-2.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.6.0 + glib-2.0 >= 2.12.0 + gthread-2.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GTK_CFLAGS=`$PKG_CONFIG --cflags "gtk+-2.0 >= 2.6.0 + glib-2.0 >= 2.12.0 + gthread-2.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$GTK_LIBS"; then + pkg_cv_GTK_LIBS="$GTK_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= 2.6.0 + glib-2.0 >= 2.12.0 + gthread-2.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.6.0 + glib-2.0 >= 2.12.0 + gthread-2.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GTK_LIBS=`$PKG_CONFIG --libs "gtk+-2.0 >= 2.6.0 + glib-2.0 >= 2.12.0 + gthread-2.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtk+-2.0 >= 2.6.0 + glib-2.0 >= 2.12.0 + gthread-2.0" 2>&1` + else + GTK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtk+-2.0 >= 2.6.0 + glib-2.0 >= 2.12.0 + gthread-2.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$GTK_PKG_ERRORS" >&5 + + as_fn_error $? "Package requirements (gtk+-2.0 >= 2.6.0 + glib-2.0 >= 2.12.0 + gthread-2.0) were not met: + +$GTK_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +Alternatively, you may set the environment variables GTK_CFLAGS +and GTK_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details." "$LINENO" 5 +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +Alternatively, you may set the environment variables GTK_CFLAGS +and GTK_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details. + +To get pkg-config, see . +See \`config.log' for more details" "$LINENO" 5; } +else + GTK_CFLAGS=$pkg_cv_GTK_CFLAGS + GTK_LIBS=$pkg_cv_GTK_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi + +# Check whether --enable-gtk-deprecated was given. +if test "${enable_gtk_deprecated+set}" = set; then : + enableval=$enable_gtk_deprecated; enable_gtk_deprecated=$enableval +else + enable_gtk_deprecated=yes +fi + +if test "x$enable_gtk_deprecated" = "xno" ; then + GTK_CFLAGS="$GTK_CFLAGS -DG_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED -DGDK_DISABLE_DEPRECATED -DGSEAL_ENABLE" +fi + +# If using the native Windows version of GTK+, be sure to use +# -mms-bitfields for all compilation. Also, use -mwindows for linking +# GUI programs. + +# (If not using pkg-config, you're on your own) + +if test "x$PKG_CONFIG" != "x" ; then + gtk_target=`$PKG_CONFIG --variable=target gtk+-2.0` +fi + +if test "x$gtk_target" = "xwin32" && test "x$GCC" = "xyes" ; then + CFLAGS="$CFLAGS -mms-bitfields" + GUI_LDFLAGS="-mwindows" + LIBS="-lcomdlg32 -lshell32 -lole32 $LIBS" + gui_extra_objects="tilem2rc.o" +else + GUI_LDFLAGS="" + gui_extra_objects="" +fi + + + + + + save_cflags="$CFLAGS" + save_libs="$LIBS" + CFLAGS="$CFLAGS $GTK_CFLAGS" + LIBS="$LIBS $GTK_LIBS" + +ac_fn_c_check_func "$LINENO" "gtk_init" "ac_cv_func_gtk_init" +if test "x$ac_cv_func_gtk_init" = xyes; then : + have_gtk=yes +else + have_gtk=no +fi + + CFLAGS="$save_cflags" + LIBS="$save_libs" + +if test "x$have_gtk" != "xyes" ; then + as_fn_error $? "GTK+ 2.x libraries not found or not usable. +You must install a recent version of GTK+ 2.x, including the +-dev/-devel packages if appropriate." "$LINENO" 5 +fi + +# Libticalcs2 and related libraries + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for TICALCS" >&5 +$as_echo_n "checking for TICALCS... " >&6; } + +if test -n "$TICALCS_CFLAGS"; then + pkg_cv_TICALCS_CFLAGS="$TICALCS_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ticalcs2 ticables2 tifiles2 ticonv\""; } >&5 + ($PKG_CONFIG --exists --print-errors "ticalcs2 ticables2 tifiles2 ticonv") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_TICALCS_CFLAGS=`$PKG_CONFIG --cflags "ticalcs2 ticables2 tifiles2 ticonv" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$TICALCS_LIBS"; then + pkg_cv_TICALCS_LIBS="$TICALCS_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ticalcs2 ticables2 tifiles2 ticonv\""; } >&5 + ($PKG_CONFIG --exists --print-errors "ticalcs2 ticables2 tifiles2 ticonv") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_TICALCS_LIBS=`$PKG_CONFIG --libs "ticalcs2 ticables2 tifiles2 ticonv" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + TICALCS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "ticalcs2 ticables2 tifiles2 ticonv" 2>&1` + else + TICALCS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "ticalcs2 ticables2 tifiles2 ticonv" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$TICALCS_PKG_ERRORS" >&5 + + have_ticalcs=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_ticalcs=no +else + TICALCS_CFLAGS=$pkg_cv_TICALCS_CFLAGS + TICALCS_LIBS=$pkg_cv_TICALCS_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_ticalcs=maybe +fi + +if test "x$have_ticalcs" = "xmaybe" ; then + + save_cflags="$CFLAGS" + save_libs="$LIBS" + CFLAGS="$CFLAGS $TICALCS_CFLAGS" + LIBS="$LIBS $TICALCS_LIBS" + ac_fn_c_check_func "$LINENO" "ticalcs_library_init" "ac_cv_func_ticalcs_library_init" +if test "x$ac_cv_func_ticalcs_library_init" = xyes; then : + have_ticalcs=yes +else + have_ticalcs=no +fi + + CFLAGS="$save_cflags" + LIBS="$save_libs" + +fi + +if test "x$have_ticalcs" != "xyes" ; then + as_fn_error $? "libticalcs2 not found or not usable. + +$TICALCS_PKG_ERRORS + +You must install libticalcs2, libticables2, libtifiles2, and libticonv +(including the -dev/-devel packages if appropriate.) These libraries +are available from . + +If you have installed the libraries in a non-standard location (or if +you're cross-compiling), you will need to add the location of +ticalcs2.pc to your PKG_CONFIG_PATH environment variable, or set the +TICALCS_CFLAGS and TICALCS_LIBS environment variables by hand." "$LINENO" 5 +fi + +# Tools used for building the Windows installer + +if test "x$gtk_target" = "xwin32" ; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="objdump" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. +set dummy ${ac_tool_prefix}windres; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_WINDRES+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$WINDRES"; then + ac_cv_prog_WINDRES="$WINDRES" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_WINDRES="${ac_tool_prefix}windres" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +WINDRES=$ac_cv_prog_WINDRES +if test -n "$WINDRES"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WINDRES" >&5 +$as_echo "$WINDRES" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_WINDRES"; then + ac_ct_WINDRES=$WINDRES + # Extract the first word of "windres", so it can be a program name with args. +set dummy windres; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_WINDRES+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_WINDRES"; then + ac_cv_prog_ac_ct_WINDRES="$ac_ct_WINDRES" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_WINDRES="windres" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_WINDRES=$ac_cv_prog_ac_ct_WINDRES +if test -n "$ac_ct_WINDRES"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_WINDRES" >&5 +$as_echo "$ac_ct_WINDRES" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_WINDRES" = x; then + WINDRES="windres" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + WINDRES=$ac_ct_WINDRES + fi +else + WINDRES="$ac_cv_prog_WINDRES" +fi + + # Extract the first word of "makensis", so it can be a program name with args. +set dummy makensis; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MAKENSIS+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MAKENSIS"; then + ac_cv_prog_MAKENSIS="$MAKENSIS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_MAKENSIS="makensis" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MAKENSIS=$ac_cv_prog_MAKENSIS +if test -n "$MAKENSIS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAKENSIS" >&5 +$as_echo "$MAKENSIS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find GTK+ runtime libraries" >&5 +$as_echo_n "checking where to find GTK+ runtime libraries... " >&6; } + if test "x$GTK_BINDIR" = "x" ; then + prefix=`$PKG_CONFIG --variable=exec_prefix gtk+-2.0` + test "x$prefix" != "x" && GTK_BINDIR="$prefix/bin" + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTK_BINDIR" >&5 +$as_echo "$GTK_BINDIR" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find ticalcs2 runtime libraries" >&5 +$as_echo_n "checking where to find ticalcs2 runtime libraries... " >&6; } + if test "x$TICALCS_BINDIR" = "x" ; then + prefix=`$PKG_CONFIG --variable=exec_prefix ticalcs2` + test "x$prefix" != "x" && TICALCS_BINDIR="$prefix/bin" + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TICALCS_BINDIR" >&5 +$as_echo "$TICALCS_BINDIR" >&6; } + + if test "x$DLLPATH" = "x" ; then + DLLPATH='${GTK_BINDIR}'$PATH_SEPARATOR'${TICALCS_BINDIR}' + fi + + + +fi + +# Checks for header files + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + + +# Checks for system and compiler characteristics + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 +$as_echo_n "checking whether byte ordering is bigendian... " >&6; } +if ${ac_cv_c_bigendian+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_bigendian=unknown + # See if we're dealing with a universal compiler. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __APPLE_CC__ + not a universal capable compiler + #endif + typedef int dummy; + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + # Check for potential -arch flags. It is not universal unless + # there are at least two -arch flags with different values. + ac_arch= + ac_prev= + for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do + if test -n "$ac_prev"; then + case $ac_word in + i?86 | x86_64 | ppc | ppc64) + if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then + ac_arch=$ac_word + else + ac_cv_c_bigendian=universal + break + fi + ;; + esac + ac_prev= + elif test "x$ac_word" = "x-arch"; then + ac_prev=arch + fi + done +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if test $ac_cv_c_bigendian = unknown; then + # See if sys/param.h defines the BYTE_ORDER macro. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main () +{ +#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ + && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ + && LITTLE_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + # It does; now see whether it defined to BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main () +{ +#if BYTE_ORDER != BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=yes +else + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main () +{ +#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + # It does; now see whether it defined to _BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef _BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=yes +else + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # Compile a test program. + if test "$cross_compiling" = yes; then : + # Try to guess by grepping values from an object file. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +short int ascii_mm[] = + { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; + short int ascii_ii[] = + { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; + int use_ascii (int i) { + return ascii_mm[i] + ascii_ii[i]; + } + short int ebcdic_ii[] = + { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; + short int ebcdic_mm[] = + { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; + int use_ebcdic (int i) { + return ebcdic_mm[i] + ebcdic_ii[i]; + } + extern int foo; + +int +main () +{ +return use_ascii (foo) == use_ebcdic (foo); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then + ac_cv_c_bigendian=yes + fi + if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then + if test "$ac_cv_c_bigendian" = unknown; then + ac_cv_c_bigendian=no + else + # finding both strings is unlikely to happen, but who knows? + ac_cv_c_bigendian=unknown + fi + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long int l; + char c[sizeof (long int)]; + } u; + u.l = 1; + return u.c[sizeof (long int) - 1] == 1; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_c_bigendian=no +else + ac_cv_c_bigendian=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 +$as_echo "$ac_cv_c_bigendian" >&6; } + case $ac_cv_c_bigendian in #( + yes) + $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h +;; #( + no) + ;; #( + universal) + +$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h + + ;; #( + *) + as_fn_error $? "unknown endianness + presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; + esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if ${ac_cv_c_inline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +$as_echo "$ac_cv_c_inline" >&6; } + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5 +$as_echo_n "checking for C/C++ restrict keyword... " >&6; } +if ${ac_cv_c_restrict+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_restrict=no + # The order here caters to the fact that C++ does not require restrict. + for ac_kw in __restrict __restrict__ _Restrict restrict; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +typedef int * int_ptr; + int foo (int_ptr $ac_kw ip) { + return ip[0]; + } +int +main () +{ +int s[1]; + int * $ac_kw t = s; + t[0] = 0; + return foo(t) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_restrict=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_restrict" != no && break + done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict" >&5 +$as_echo "$ac_cv_c_restrict" >&6; } + + case $ac_cv_c_restrict in + restrict) ;; + no) $as_echo "#define restrict /**/" >>confdefs.h + ;; + *) cat >>confdefs.h <<_ACEOF +#define restrict $ac_cv_c_restrict +_ACEOF + ;; + esac + + + ac_fn_c_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "$ac_includes_default" +if test "x$ac_cv_type_uintptr_t" = xyes; then : + +$as_echo "#define HAVE_UINTPTR_T 1" >>confdefs.h + +else + for ac_type in 'unsigned int' 'unsigned long int' \ + 'unsigned long long int'; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(sizeof (void *) <= sizeof ($ac_type))]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +cat >>confdefs.h <<_ACEOF +#define uintptr_t $ac_type +_ACEOF + + ac_type= +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test -z "$ac_type" && break + done +fi + + + +# Output + +ac_config_headers="$ac_config_headers config.h" + +ac_config_files="$ac_config_files Makefile emu/Makefile db/Makefile data/Makefile gui/Makefile gui/tilem2.rc installer/win32/Makefile installer/win32/installer.nsi" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by TilEm $as_me 2.0, which was +generated by GNU Autoconf 2.68. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Report bugs to . +TilEm home page: ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +TilEm config.status 2.0 +configured by $0, generated by GNU Autoconf 2.68, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2010 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "emu/Makefile") CONFIG_FILES="$CONFIG_FILES emu/Makefile" ;; + "db/Makefile") CONFIG_FILES="$CONFIG_FILES db/Makefile" ;; + "data/Makefile") CONFIG_FILES="$CONFIG_FILES data/Makefile" ;; + "gui/Makefile") CONFIG_FILES="$CONFIG_FILES gui/Makefile" ;; + "gui/tilem2.rc") CONFIG_FILES="$CONFIG_FILES gui/tilem2.rc" ;; + "installer/win32/Makefile") CONFIG_FILES="$CONFIG_FILES installer/win32/Makefile" ;; + "installer/win32/installer.nsi") CONFIG_FILES="$CONFIG_FILES installer/win32/installer.nsi" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi + ;; + + + esac + +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/tool/tilem-src/configure.ac b/tool/tilem-src/configure.ac new file mode 100644 index 0000000..88e2306 --- /dev/null +++ b/tool/tilem-src/configure.ac @@ -0,0 +1,172 @@ +AC_PREREQ(2.67) +AC_INIT([TilEm], [2.0], [tilem-devel@lists.sourceforge.net], + [tilem], [http://tilem.sourceforge.net/]) +AC_CONFIG_SRCDIR([emu/tilem.h]) + +# Checks for programs + +AC_PROG_CC +AC_PROG_CPP +AC_ARG_VAR(OPT_CFLAGS, + [Additional C compiler flags used for optimizing critical areas of + the code (default: -O3 if using GCC)]) +if test "x$GCC" = "xyes" ; then + CFLAGS="$CFLAGS -W -Wall -Wwrite-strings" + if test "x$OPT_CFLAGS" = "x" ; then + OPT_CFLAGS="-O3" + fi +fi + +AC_CHECK_TOOL(AR, [ar], [false]) +AC_ARG_VAR(AR, [Static library archiver]) +AC_ARG_VAR(AR_FLAGS, [Flags to pass to ar to build a static library]) +if test "x$AR_FLAGS" = "x" ; then + AR_FLAGS=cru +fi + +AC_PROG_RANLIB +AC_ARG_VAR(RANLIB, [Program to make a static library linkable]) + +AC_PROG_INSTALL +AC_PROG_MAKE_SET + +AC_CHECK_PROG([UPDATE_DESKTOP_DATABASE], + [update-desktop-database], [update-desktop-database], [:]) +AC_CHECK_PROG([UPDATE_MIME_DATABASE], + [update-mime-database], [update-mime-database], [:]) + +# Checks for libraries + +m4_define(with_flags, [ + save_cflags="$CFLAGS" + save_libs="$LIBS" + CFLAGS="$CFLAGS $$1_CFLAGS" + LIBS="$LIBS $$1_LIBS" + $2 + CFLAGS="$save_cflags" + LIBS="$save_libs" +]) + +# GLib and GTK+ + +PKG_CHECK_MODULES(GTK, gtk+-2.0 >= 2.6.0 + glib-2.0 >= 2.12.0 + gthread-2.0) + +AC_ARG_ENABLE([gtk-deprecated], + AS_HELP_STRING([--disable-gtk-deprecated], [Disable deprecated GTK+ API]), + [ enable_gtk_deprecated=$enableval ], [ enable_gtk_deprecated=yes ]) +if test "x$enable_gtk_deprecated" = "xno" ; then + GTK_CFLAGS="$GTK_CFLAGS -DG_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED -DGDK_DISABLE_DEPRECATED -DGSEAL_ENABLE" +fi + +# If using the native Windows version of GTK+, be sure to use +# -mms-bitfields for all compilation. Also, use -mwindows for linking +# GUI programs. + +# (If not using pkg-config, you're on your own) + +if test "x$PKG_CONFIG" != "x" ; then + gtk_target=`$PKG_CONFIG --variable=target gtk+-2.0` +fi + +if test "x$gtk_target" = "xwin32" && test "x$GCC" = "xyes" ; then + CFLAGS="$CFLAGS -mms-bitfields" + GUI_LDFLAGS="-mwindows" + LIBS="-lcomdlg32 -lshell32 -lole32 $LIBS" + gui_extra_objects="tilem2rc.o" +else + GUI_LDFLAGS="" + gui_extra_objects="" +fi + +AC_SUBST(GUI_LDFLAGS) +AC_SUBST(gui_extra_objects) + +with_flags(GTK, + [ AC_CHECK_FUNC(gtk_init, [ have_gtk=yes ], [ have_gtk=no ]) ]) +if test "x$have_gtk" != "xyes" ; then + AC_MSG_ERROR([GTK+ 2.x libraries not found or not usable. +You must install a recent version of GTK+ 2.x, including the +-dev/-devel packages if appropriate.]) +fi + +# Libticalcs2 and related libraries + +PKG_CHECK_MODULES(TICALCS, ticalcs2 ticables2 tifiles2 ticonv, + [ have_ticalcs=maybe ], [ have_ticalcs=no ]) + +if test "x$have_ticalcs" = "xmaybe" ; then + with_flags(TICALCS, + [ AC_CHECK_FUNC(ticalcs_library_init, [ have_ticalcs=yes ], [ have_ticalcs=no ]) ]) +fi + +if test "x$have_ticalcs" != "xyes" ; then + AC_MSG_ERROR([libticalcs2 not found or not usable. + +$TICALCS_PKG_ERRORS + +You must install libticalcs2, libticables2, libtifiles2, and libticonv +(including the -dev/-devel packages if appropriate.) These libraries +are available from . + +If you have installed the libraries in a non-standard location (or if +you're cross-compiling), you will need to add the location of +ticalcs2.pc to your PKG_CONFIG_PATH environment variable, or set the +TICALCS_CFLAGS and TICALCS_LIBS environment variables by hand.]) +fi + +# Tools used for building the Windows installer + +if test "x$gtk_target" = "xwin32" ; then + AC_CHECK_TOOL([STRIP], [strip], [:]) + AC_CHECK_TOOL([OBJDUMP], [objdump], [objdump]) + AC_CHECK_TOOL([WINDRES], [windres], [windres]) + AC_CHECK_PROG([MAKENSIS], [makensis], [makensis]) + AC_PROG_LN_S + + AC_MSG_CHECKING([where to find GTK+ runtime libraries]) + if test "x$GTK_BINDIR" = "x" ; then + prefix=`$PKG_CONFIG --variable=exec_prefix gtk+-2.0` + test "x$prefix" != "x" && GTK_BINDIR="$prefix/bin" + fi + AC_MSG_RESULT([$GTK_BINDIR]) + + AC_MSG_CHECKING([where to find ticalcs2 runtime libraries]) + if test "x$TICALCS_BINDIR" = "x" ; then + prefix=`$PKG_CONFIG --variable=exec_prefix ticalcs2` + test "x$prefix" != "x" && TICALCS_BINDIR="$prefix/bin" + fi + AC_MSG_RESULT([$TICALCS_BINDIR]) + + if test "x$DLLPATH" = "x" ; then + DLLPATH='${GTK_BINDIR}'$PATH_SEPARATOR'${TICALCS_BINDIR}' + fi + AC_SUBST(GTK_BINDIR) + AC_SUBST(TICALCS_BINDIR) + AC_SUBST(DLLPATH) +fi + +# Checks for header files + +AC_HEADER_STDC + +# Checks for system and compiler characteristics + +AC_C_BIGENDIAN +AC_C_INLINE +AC_C_RESTRICT +AC_TYPE_UINTPTR_T + +# Output + +AC_CONFIG_HEADERS([config.h]) +AC_CONFIG_FILES([Makefile + emu/Makefile + db/Makefile + data/Makefile + gui/Makefile + gui/tilem2.rc + installer/win32/Makefile + installer/win32/installer.nsi]) +AC_OUTPUT diff --git a/tool/tilem-src/data/Makefile.in b/tool/tilem-src/data/Makefile.in new file mode 100644 index 0000000..c41e175 --- /dev/null +++ b/tool/tilem-src/data/Makefile.in @@ -0,0 +1,114 @@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ +datarootdir = @datarootdir@ +bindir = @bindir@ +datadir = @datadir@ +pkgdatadir = @datadir@/tilem2 +mandir = @mandir@ +icondir = @datadir@/icons +applicationsdir = @datadir@/applications +mimedir = @datadir@/mime + +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +srcdir = @srcdir@ +VPATH = @srcdir@ +@SET_MAKE@ + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +SHELL = @SHELL@ +UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ +UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ + +# Custom action and status icons go in these directories. These icons +# are only used by TilEm, so they are installed in DATADIR/tilem2/icons. +pkg_icondirs = hicolor/16x16/actions \ + hicolor/16x16/status \ + hicolor/24x24/actions + +# Application icons go in these directories; these icons will be +# installed in DATADIR/icons so they are visible to other programs +# (e.g. desktop application menus.) +shared_icondirs = hicolor/16x16/apps \ + hicolor/22x22/apps \ + hicolor/24x24/apps \ + hicolor/32x32/apps \ + hicolor/48x48/apps + +all: + @echo 'Nothing to do' + +install: + $(INSTALL) -d -m 755 $(DESTDIR)$(pkgdatadir) + $(INSTALL_DATA) $(srcdir)/keybindings.ini $(DESTDIR)$(pkgdatadir) + $(INSTALL) -d -m 755 $(DESTDIR)$(pkgdatadir)/symbols + set -e ; for i in $(srcdir)/symbols/*.sym ; do \ + $(INSTALL_DATA) $$i $(DESTDIR)$(pkgdatadir)/symbols ; \ + done + $(INSTALL) -d -m 755 $(DESTDIR)$(pkgdatadir)/skins + set -e ; for i in $(srcdir)/skins/*.skn ; do \ + $(INSTALL_DATA) $$i $(DESTDIR)$(pkgdatadir)/skins ; \ + done + set -e ; for i in $(pkg_icondirs) ; do \ + $(INSTALL) -d -m 755 $(DESTDIR)$(pkgdatadir)/icons/$$i ; \ + for j in $(srcdir)/icons/$$i/*.png ; do \ + $(INSTALL_DATA) $$j $(DESTDIR)$(pkgdatadir)/icons/$$i ; \ + done ; \ + done + set -e ; for i in $(shared_icondirs) ; do \ + $(INSTALL) -d -m 755 $(DESTDIR)$(icondir)/$$i ; \ + for j in $(srcdir)/icons/$$i/*.png ; do \ + $(INSTALL_DATA) $$j $(DESTDIR)$(icondir)/$$i ; \ + done ; \ + done + $(INSTALL_DATA) $(srcdir)/icons/hicolor/index.theme $(DESTDIR)$(pkgdatadir)/icons/hicolor + $(INSTALL) -d -m 755 $(DESTDIR)$(applicationsdir) + $(INSTALL_DATA) $(srcdir)/desktop/tilem2.desktop $(DESTDIR)$(applicationsdir) + $(INSTALL) -d -m 755 $(DESTDIR)$(mimedir)/packages + $(INSTALL_DATA) $(srcdir)/desktop/tilem2.xml $(DESTDIR)$(mimedir)/packages + [ -n "$(DESTDIR)" ] || $(UPDATE_DESKTOP_DATABASE) $(applicationsdir) + [ -n "$(DESTDIR)" ] || $(UPDATE_MIME_DATABASE) $(mimedir) + +uninstall: + rm -f $(DESTDIR)$(pkgdatadir)/keybindings.ini + set -e ; for i in $(srcdir)/symbols/*.sym ; do \ + rm -f $(DESTDIR)$(pkgdatadir)/symbols/`basename $$i` ; \ + done + set -e ; for i in $(srcdir)/skins/*.skn ; do \ + rm -f $(DESTDIR)$(pkgdatadir)/skins/`basename $$i` ; \ + done + set -e ; for i in $(pkg_icondirs) ; do \ + for j in $(srcdir)/icons/$$i/*.png ; do \ + rm -f $(DESTDIR)$(pkgdatadir)/icons/$$i/`basename $$j` ; \ + done ; \ + done + set -e ; for i in $(shared_icondirs) ; do \ + for j in $(srcdir)/icons/$$i/*.png ; do \ + rm -f $(DESTDIR)$(icondir)/$$i/`basename $$j` ; \ + done ; \ + done + -for i in $(pkg_icondirs) ; do \ + rmdir $(DESTDIR)$(pkgdatadir)/icons/$$i ; \ + done + -rmdir $(DESTDIR)$(pkgdatadir)/icons/hicolor/16x16 + -rmdir $(DESTDIR)$(pkgdatadir)/icons/hicolor/24x24 + rm -f $(DESTDIR)$(pkgdatadir)/icons/hicolor/index.theme + -rmdir $(DESTDIR)$(pkgdatadir)/icons/hicolor + -rmdir $(DESTDIR)$(pkgdatadir)/icons + -rmdir $(DESTDIR)$(pkgdatadir)/symbols + -rmdir $(DESTDIR)$(pkgdatadir)/skins + -rmdir $(DESTDIR)$(pkgdatadir) + rm -f $(DESTDIR)$(applicationsdir)/tilem2.desktop + rm -f $(DESTDIR)$(mimedir)/packages/tilem2.xml + [ -n "$(DESTDIR)" ] || $(UPDATE_DESKTOP_DATABASE) $(applicationsdir) + [ -n "$(DESTDIR)" ] || $(UPDATE_MIME_DATABASE) $(mimedir) + +Makefile: Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && $(SHELL) ./config.status + +$(top_builddir)/config.status: $(top_srcdir)/configure + cd $(top_builddir) && $(SHELL) ./config.status --recheck + +.PRECIOUS: Makefile $(top_builddir)/config.status +.PHONY: all install uninstall diff --git a/tool/tilem-src/data/desktop/tilem2.desktop b/tool/tilem-src/data/desktop/tilem2.desktop new file mode 100644 index 0000000..8118c97 --- /dev/null +++ b/tool/tilem-src/data/desktop/tilem2.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Name=TilEm +Comment=Graphing calculator emulator +Exec=tilem2 %F +Icon=tilem +MimeType=application/x-tigroup;application/x-ti73-variables;application/x-ti73-program;application/x-ti73-backup;application/x-ti73-app;application/x-ti73-os;application/x-ti81-program;application/x-ti82-variables;application/x-ti82-program;application/x-ti82-backup;application/x-ti83-variables;application/x-ti83-program;application/x-ti83-backup;application/x-ti83plus-variables;application/x-ti83plus-program;application/x-ti83plus-app;application/x-ti83plus-os;application/x-ti85-variables;application/x-ti85-program;application/x-ti85-backup;application/x-ti86-variables;application/x-ti86-program;application/x-ti86-backup; +StartupNotify=true +Terminal=false +Type=Application +Categories=Education;Science;Math;Emulator; diff --git a/tool/tilem-src/data/desktop/tilem2.xml b/tool/tilem-src/data/desktop/tilem2.xml new file mode 100644 index 0000000..7dae83c --- /dev/null +++ b/tool/tilem-src/data/desktop/tilem2.xml @@ -0,0 +1,322 @@ + + + + + TI calculator group file + + + + + TI-73 variable + + + + + + + + + + + + + + + + + + + + + + TI-73 program + + + + + + + + + + + + TI-73 memory backup + + + + + + + + + + + TI-73 Flash application + + + + + + + + + TI-73 operating system + + + + + + + + + + TI-81 program + + + + + + + + TI-82 variable + + + + + + + + + + + + + + + + + + + + TI-82 program + + + + + + + + + + + + TI-82 memory backup + + + + + + + + + + + + TI-83 variable + + + + + + + + + + + + + + + + + + + + + + TI-83 program + + + + + + + + + + + + TI-83 memory backup + + + + + + + + + + + + TI-83/84 Plus variable + + + + + + + + + + + + + + + + + + + + + + + + + TI-83/84 Plus program + + + + + + + + + + + + TI-83/84 Plus Flash application + + + + + + + + + TI-83/84 Plus operating system + + + + + + + + + + TI-85 variable + + + + + + + + + + + + + + + + + + + + + + + + TI-85 program + + + + + + + + + + + + TI-85 memory backup + + + + + + + + + + + + TI-86 variable + + + + + + + + + + + + + + + + + + + + + + + + TI-86 program + + + + + + + + + + + + TI-86 memory backup + + + + + + + + + + diff --git a/tool/tilem-src/data/icons-svg/breakpoint.svg b/tool/tilem-src/data/icons-svg/breakpoint.svg new file mode 100644 index 0000000..e3c55fb --- /dev/null +++ b/tool/tilem-src/data/icons-svg/breakpoint.svg @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/tool/tilem-src/data/icons-svg/pc-arrow.svg b/tool/tilem-src/data/icons-svg/pc-arrow.svg new file mode 100644 index 0000000..13874e3 --- /dev/null +++ b/tool/tilem-src/data/icons-svg/pc-arrow.svg @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/tool/tilem-src/data/icons-svg/stepicons-16.svg b/tool/tilem-src/data/icons-svg/stepicons-16.svg new file mode 100644 index 0000000..c89f3e4 --- /dev/null +++ b/tool/tilem-src/data/icons-svg/stepicons-16.svg @@ -0,0 +1,217 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tool/tilem-src/data/icons-svg/stepicons-24.svg b/tool/tilem-src/data/icons-svg/stepicons-24.svg new file mode 100644 index 0000000..d4b9f4b --- /dev/null +++ b/tool/tilem-src/data/icons-svg/stepicons-24.svg @@ -0,0 +1,389 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tool/tilem-src/data/icons/hicolor/16x16/actions/tilem-db-finish.png b/tool/tilem-src/data/icons/hicolor/16x16/actions/tilem-db-finish.png new file mode 100644 index 0000000000000000000000000000000000000000..bd51d31da1a5f7c62d0d4873998f60db0eb7b043 GIT binary patch literal 472 zcmV;}0Vn>6P)Nkle{vyLa09dRYZ8m%Nv$?Y!Uq#l)p03zd zKUCLeqz?LwuCns~rU*pNRyXb+ODH`QQ7jcuDBd9<3FzsyKI_emu9qddugc6s5nmL* z%to<0xu-%duk*-X$dL0#$jTYq++L|S`2>)YmmRCslZ`AmPZYF^hR@+gU?QXfGFb`I zp@_J|fr~ScbH{o>zmX~@7eu7y6X0iA2n#&Io(SmipbB8vF!m!Mg!Tj232s43i+TX* z`HYq!OtVO@rr>OGziKlWXr@$ynB>8WEMhzZpWlnlF0*b1I1ikHn_`giNvctM1#7qE z+ba;W@@*r%=ScCOY2=jvVv`X_D@iCVsW-4U4Cj8#fl_4ZZ=x!~9EbCr4?xnJz~<;S z9F49D+5a_28iZ4Zm+_|&7z@^9)+JGctU1@A1gR$Tw$1#IU%k9 O0000{D1Q#?;`*p_)l>!d1boSoDvN_E4NhhniW7oJ(df!&mN(E zY>!2<2KrX6AR6?dLGAk+FkriZWaI!%I+_C{vZ~_hT17%E72#`RF9mAHg$>F9$A%5G-SjiRuha%^Pt?WbU^EVK=a%gx=axckSnE$1*3rtxVD^dy6jkU+Mv^GAeD;~ zX+W#-0^R0w-Yv)!lC)bO;ncHOAgs{)NpoT4bdmraOIPT%UZS8vpZwTJt^db8NHrCu zn%`8WC_915a*O`eYbZzdkYA>IBj>*^(pN;i&7fuK2*UE;!{0ZNMHHjH)c6w_g?Ydy gA}rUxWEv**4ql0+Px# literal 0 HcmV?d00001 diff --git a/tool/tilem-src/data/icons/hicolor/16x16/actions/tilem-db-step.png b/tool/tilem-src/data/icons/hicolor/16x16/actions/tilem-db-step.png new file mode 100644 index 0000000000000000000000000000000000000000..4b8e1d7938e88a0ae41a8b6083353098fab64c85 GIT binary patch literal 498 zcmVN^Yr_EdU~FRQ8vlEEm4HwO(X}v2vrPXGTha_i{yU- z^!qaY4$xiKp!X{M6M(H|+UR#~NC3GDlol;Poi=es`WAL~Tlr|1}+XzIZbbwg$nJg9Jgt1Sy`dDL^atSMkH&lzAa>oIN6p>LoEf(oAZ+w~9#J)gi9C?WsL o7KoXS1wR2oyMy0c-9H7q0F+OsTKTi>pa1{>07*qoM6N<$g6KTs+yDRo literal 0 HcmV?d00001 diff --git a/tool/tilem-src/data/icons/hicolor/16x16/apps/tilem.png b/tool/tilem-src/data/icons/hicolor/16x16/apps/tilem.png new file mode 100644 index 0000000000000000000000000000000000000000..0023cd906165a916dd0f01cc6c51114520e10931 GIT binary patch literal 679 zcmV;Y0$BZtP)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01ejw01ejxLMWSf00007bV*G`2ipu4 z5Htc`7(Gh>00JjTL_t(I%Z-vxPZLoT#ea7?(`o69{SyULNI|0uAS_rA6Kx7=Vhnx> zH^9cYR$@#D@&!zcu)!TG6BZhy2_fnyaAP32kW@mUR>e*Y)6Tqcp{>)3k(0dKyq9;* zJ@1|;Gc&hSz#z~KoYZx_N7s#h5$OReKmlc?RH0t4Z7HRS!0zw0uE%1r6)Ry6r&4KU z+qP+2b~I{6gTP1XUOhkrJrWTFT=xLSaa_l7YWv^6iQ`l@brCH+K6W*}`1qmeI29bn zky@?BVK7Y-%d(6_!eVmzmiz4aN=gS%N>MJCB$LUINhkRaq)^z#_k97-8>b!dIFA;W z5fOqQXx62Ld2UYKZKOIcRL!I~_(AkroG9yMuO-!=4r5BXe_i-d(?T?bJY9am(BJ@jdnLZ^?=w9$NjlSsWhVjQ zOS#yLPH#+9Q#%-52|J;J0uiGjhmjfrUm5Z`ZPVEEn2$aud6$Onnz)!4wm zz|z9N(Amk({_TjF*}q#}UjHA5hW@|k>iU1Dfx*9aHnwj-Lpnj~uo?i;JX1{U`@_J% z|8Ja~|GzRc{Qp=@?f=;(zW{MC3cj5UkGb0NQZV$LIfj9i9J=l$5~u zuDtyJBMTV*ADhSi|D?U-|C2z2+aNAM^$y67TlMt*9iPDt)_{ypF5>wA@j({Q5Vrrv zJeB^h*3kIZ%)qb$)c{~X9ksIqYj}6J^8fq$)&D;}to{G#asB_#Pa6M!eb)T{&CTTh z$L6yB-yNX!ALxSnCJ3 zKj!%V$TaT%z<~UX;ex$ZR$v1joKE}y=xoOS$LBNuKe>?o|LLV%u%Qo52L3-Xhvok^ ze@#pmfc&%)=(i(NSTMri$Q;K1Hx9V}KRlc1{|+aa|BF>r{xzb90XXrnvVPlRWAlHD zsObLE!wnhV?|`4m{D0^g$2Dfl@wC# zqO~r9`!#dBL1wk779VHkp839c+&Kb(_zlFL3ycdPO&1r32$_HoFH=QDnMv~b`;P)+ zLX=Jl5e({d*`(7cr@dZ0`u(^V8bZ9QOPj&WDFFZ!qLoq(Feno23jlqoc@lbl|~aQE+EAQWnm}BnI0| zJ|uFYstP;gZ}#+nD#+vs@U%}xMsQ#>;;60;DT6@)+ewwYRZ)ScUXNXm2Q~uIqGI)o2j0 zTCr%g%7M=_P?krd$!_=eBSJlgiNILXY8B#gNeNb{qNvM-DT*uj3#v$PuBIjzqgFW6 zDwV%PBFofwn0_gf`Tom2c;7_60e&s YE5@Zji3p{!kN^Mx07*qoM6N<$f(4rM1^@s6 literal 0 HcmV?d00001 diff --git a/tool/tilem-src/data/icons/hicolor/16x16/status/tilem-disasm-pc.png b/tool/tilem-src/data/icons/hicolor/16x16/status/tilem-disasm-pc.png new file mode 100644 index 0000000000000000000000000000000000000000..e6c559467c8b2ba36affe3074d8bcfa032b63e9f GIT binary patch literal 269 zcmV+o0rLKdP)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01ejw01ejxLMWSf00007bV*G`2ipu4 z5dt%Y7{)UI00U`BL_t(I%bk=l_1r29*jM9GInO> z9u{p%9!^AZHfQGEIp6v3KWB!R89QTga#Dt2H3y(Tr1Ag?%;XR;F(U*}CZaNcvXoT5 zapPl;_dtjUG&ObgeNEFYGNTa3ac2}oZMtqWZQBYRrwvYic@N;*qz$ zF1)ohQmmlsNiE&pp6Jf^u;aR%a#L*CHpfc2n;Z31u~ZuPY3_$!0JkIn^z`(oZ@&IA zF+2Oc7RND;8d6G(jh&4zy#7XrxuDx0P zA~5s5d}sP5E?vI9FJJlKoqf&3f0qo)GL8(rGkx<}eQU)GbarG~LjRXyK0vWzrtKL# zj^ge5mL3Cm2HBf0UA}%`)5AS}dX&SI9b{7ri+8^~00%-3Q{0Ly_8#HbiuVLfOPPY8sSctgMs)06`F-R4hK3U&YX*z}a)> zR7-F+li>@my^5;uqf!|`qY)qo0%Wu8Xf~T*W}G^85|(MgG))W-55l%=xQ+wUGLdrK z)>bIR1Q1*|jg;%6(P%&^1u36A5=9Y&5HJh_0MM21g<+Ujezdfsz6F@UXl6#ingO}F zjPJhs1jSMb&yNg)L71O^h(aNUi{s-+XS!h94umGrmG48nUI8EY69Pl`AAp4cifTB2 z{uKm40H@6X2pAq3glU>c=t9{~6l X$ers(nlmYd00000NkvXXu0mjf&rZ4@ literal 0 HcmV?d00001 diff --git a/tool/tilem-src/data/icons/hicolor/24x24/actions/tilem-db-finish.png b/tool/tilem-src/data/icons/hicolor/24x24/actions/tilem-db-finish.png new file mode 100644 index 0000000000000000000000000000000000000000..8eeb7239249b865ff5377c1452c271824ab198d6 GIT binary patch literal 978 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 literal 0 HcmV?d00001 diff --git a/tool/tilem-src/data/icons/hicolor/index.theme b/tool/tilem-src/data/icons/hicolor/index.theme new file mode 100644 index 0000000..cbb495c --- /dev/null +++ b/tool/tilem-src/data/icons/hicolor/index.theme @@ -0,0 +1,44 @@ +[Icon Theme] +Name=hicolor +Comment=Default Theme +Directories=16x16/actions,16x16/apps,16x16/status,22x22/apps,24x24/actions,24x24/apps,32x32/apps,48x48/apps + +[16x16/actions] +Size=16 +Context=Actions +Type=Threshold + +[16x16/apps] +Size=16 +Context=Applications +Type=Threshold + +[16x16/status] +Size=16 +Context=Status +Type=Threshold + +[22x22/apps] +Size=22 +Context=Applications +Type=Threshold + +[24x24/actions] +Size=24 +Context=Actions +Type=Threshold + +[24x24/apps] +Size=24 +Context=Applications +Type=Threshold + +[32x32/apps] +Size=32 +Context=Applications +Type=Threshold + +[48x48/apps] +Size=48 +Context=Applications +Type=Threshold diff --git a/tool/tilem-src/data/keybindings.ini b/tool/tilem-src/data/keybindings.ini new file mode 100644 index 0000000..64f3583 --- /dev/null +++ b/tool/tilem-src/data/keybindings.ini @@ -0,0 +1,555 @@ +[common] +Up = Up +KP_Up = Up +Down = Down +KP_Down = Down +Left = Left +KP_Left = Left +Right = Right +KP_Right = Right +Shift+Up = 2nd, Up +Shift+Down = 2nd, Down +Tab = 2nd +KP_Tab = 2nd +ISO_Left_Tab = 2nd +Delete = Del +KP_Delete = Del +BackSpace = Left, Del +Ctrl+BackSpace = Clear +Ctrl+Delete = Clear +Ctrl+KP_Delete = Clear +0 = 0 +KP_0 = 0 +1 = 1 +KP_1 = 1 +2 = 2 +KP_2 = 2 +3 = 3 +KP_3 = 3 +4 = 4 +KP_4 = 4 +5 = 5 +KP_5 = 5 +6 = 6 +KP_6 = 6 +7 = 7 +KP_7 = 7 +8 = 8 +KP_8 = 8 +9 = 9 +KP_9 = 9 +period = DecPnt +KP_Decimal = DecPnt +asciitilde = Chs +dead_tilde = Chs +plusminus = Chs +Shift+KP_Subtract = Chs +dollar = 2nd, Chs +plus = Add +KP_Add = Add +minus = Sub +KP_Subtract = Sub +asterisk = Mul +KP_Multiply = Mul +slash = Div +KP_Divide = Div +asciicircum = Power +dead_circumflex = Power +twosuperior = Square +Ctrl+2 = Square +parenleft = LParen +parenright = RParen +greater = Store +less = 2nd, Store +F12 = On +Shift+F12 = 2nd, On +Return = Enter +KP_Enter = Enter +ISO_Enter = Enter +Shift+Return = 2nd, Enter +Shift+KP_Enter = 2nd, Enter +Shift+ISO_Enter = 2nd, Enter + +[ti73] +INHERIT = common +F1 = YEqu +F2 = Window +F3 = Zoom +F4 = Trace +F5 = Graph +Shift+F1 = 2nd, YEqu +Shift+F2 = 2nd, Window +Shift+F3 = 2nd, Zoom +Shift+F4 = 2nd, Trace +Shift+F5 = 2nd, Graph +Home = 2nd, Left +End = 2nd, Right +F11 = Mode +Shift+Escape = 2nd, Mode +Insert = 2nd, Del +KP_Insert = 2nd, Del +m = Math +Menu = 2nd, Math +apostrophe = 2nd, Math +d = Draw +l = List +ampersand = 2nd, Power +EuroSign = 2nd, Power +F8 = Prgm +p = Prgm +Ctrl+Tab = 2nd, Prgm +Ctrl+KP_Tab = 2nd, Prgm +Ctrl+ISO_Left_Tab = 2nd, Prgm +F7 = Apps +Escape = Clear +underscore = Unit +bar = FracSlash +brokenbar = FracSlash +onehalf = FracSlash +backslash = 2nd, FracSlash +onesuperior = 2nd, FracSlash +Ctrl+1 = 2nd, FracSlash +f = FracDec +numbersign = 2nd, FracDec +a = MixSimp +c = Const +s = Simp +percent = Percent +x = VarX +comma = Comma + +[ti76] +INHERIT = common +F1 = YEqu +F2 = Window +F3 = Zoom +F4 = Trace +F5 = Graph +Shift+F1 = 2nd, YEqu +Shift+F2 = 2nd, Window +Shift+F3 = 2nd, Zoom +Shift+F4 = 2nd, Trace +Shift+F5 = 2nd, Graph +Home = 2nd, Left +KP_Home = 2nd, Left +End = 2nd, Right +KP_End = 2nd, Right +F11 = Mode +Shift+Escape = 2nd, Mode +Insert = 2nd, Del +KP_Insert = 2nd, Del +Menu = Alpha +apostrophe = Alpha +x = Graphvar +F10 = Stat +F6 = Math +F7 = Matrix +F8 = Prgm +F9 = Vars +Escape = Clear +backslash = Recip +onesuperior = Recip +Ctrl+1 = Recip +s = Sin +c = Cos +t = Tan +numbersign = 2nd, Power +comma = Comma +ampersand = 2nd, Comma +EuroSign = 2nd, Comma +braceleft = 2nd, LParen +braceright = 2nd, RParen +e = 2nd, Div +o = Log +u = 2nd, 7 +v = 2nd, 8 +w = 2nd, 9 +l = Ln +p = Prgm +Ctrl+Tab = 2nd, 0 +Ctrl+KP_Tab = 2nd, 0 +Ctrl+ISO_Left_Tab = 2nd, 0 + +[ti81] +INHERIT = common +F1 = YEqu +F2 = Range +F3 = Zoom +F4 = Trace +F5 = Graph +Shift+F1 = 2nd, YEqu +Shift+F2 = 2nd, Range +Shift+F3 = 2nd, Zoom +Shift+F4 = 2nd, Trace +Shift+F5 = 2nd, Graph +Insert = Ins +KP_Insert = Ins +Menu = Alpha +apostrophe = Alpha +x = Graphvar +F11 = Mode +F6 = Math +F7 = Matrix +F8 = Prgm +F9 = Vars +Escape = Clear +Shift+Escape = 2nd, Clear +backslash = Recip +onesuperior = Recip +Ctrl+1 = Recip +bar = 2nd, Recip +brokenbar = 2nd, Recip +s = Sin +c = Cos +t = Tan +p = Prgm +numbersign = 2nd, Power +ampersand = EE +EuroSign = EE +o = Log +l = Ln +A = Alpha, Math +B = Alpha, Matrix +C = Alpha, Prgm +D = Alpha, Recip +E = Alpha, Sin +F = Alpha, Cos +G = Alpha, Tan +H = Alpha, Power +I = Alpha, Square +J = Alpha, EE +K = Alpha, LParen +L = Alpha, RParen +M = Alpha, Div +N = Alpha, Log +O = Alpha, 7 +P = Alpha, 8 +Q = Alpha, 9 +R = Alpha, Mul +S = Alpha, Ln +T = Alpha, 4 +U = Alpha, 5 +V = Alpha, 6 +W = Alpha, Sub +X = Alpha, Store +Y = Alpha, 1 +Z = Alpha, 2 +at = Alpha, 3 +quotedbl = Alpha, Add +space = Alpha, 0 +comma = Alpha, DecPnt +question = Alpha, Chs + +[ti82] +INHERIT = common +F1 = YEqu +F2 = Window +F3 = Zoom +F4 = Trace +F5 = Graph +Shift+F1 = 2nd, YEqu +Shift+F2 = 2nd, Window +Shift+F3 = 2nd, Zoom +Shift+F4 = 2nd, Trace +Shift+F5 = 2nd, Graph +Home = 2nd, Left +KP_Home = 2nd, Left +End = 2nd, Right +KP_End = 2nd, Right +F11 = Mode +Shift+Escape = 2nd, Mode +Insert = 2nd, Del +KP_Insert = 2nd, Del +Menu = Alpha +apostrophe = Alpha +x = Graphvar +F10 = Stat +F6 = Math +F7 = Matrix +F8 = Prgm +F9 = Vars +Escape = Clear +backslash = Recip +onesuperior = Recip +Ctrl+1 = Recip +bar = 2nd, Recip +brokenbar = 2nd, Recip +s = Sin +c = Cos +t = Tan +numbersign = 2nd, Power +comma = Comma +ampersand = 2nd, Comma +EuroSign = 2nd, Comma +braceleft = 2nd, LParen +braceright = 2nd, RParen +o = Log +u = 2nd, 7 +v = 2nd, 8 +n = 2nd, 9 +bracketleft = 2nd, Mul +l = Ln +p = Prgm +bracketright = 2nd, Sub +A = Alpha, Math +B = Alpha, Matrix +C = Alpha, Prgm +D = Alpha, Recip +E = Alpha, Sin +F = Alpha, Cos +G = Alpha, Tan +H = Alpha, Power +I = Alpha, Square +J = Alpha, Comma +K = Alpha, LParen +L = Alpha, RParen +M = Alpha, Div +N = Alpha, Log +O = Alpha, 7 +P = Alpha, 8 +Q = Alpha, 9 +R = Alpha, Mul +S = Alpha, Ln +T = Alpha, 4 +U = Alpha, 5 +V = Alpha, 6 +W = Alpha, Sub +X = Alpha, Store +Y = Alpha, 1 +Z = Alpha, 2 +at = Alpha, 3 +quotedbl = Alpha, Add +space = Alpha, 0 +colon = Alpha, DecPnt +question = Alpha, Chs + +[ti83] +INHERIT = common +F1 = YEqu +F2 = Window +F3 = Zoom +F4 = Trace +F5 = Graph +Shift+F1 = 2nd, YEqu +Shift+F2 = 2nd, Window +Shift+F3 = 2nd, Zoom +Shift+F4 = 2nd, Trace +Shift+F5 = 2nd, Graph +Home = 2nd, Left +KP_Home = 2nd, Left +End = 2nd, Right +KP_End = 2nd, Right +Page_Up = Alpha, Up +KP_Page_Up = Alpha, Up +Page_Down = Alpha, Down +KP_Page_Down = Alpha, Down +F11 = Mode +Shift+Escape = 2nd, Mode +Insert = 2nd, Del +KP_Insert = 2nd, Del +Menu = Alpha +apostrophe = Alpha +x = Graphvar +F10 = Stat +F6 = Math +F7 = Matrix +F8 = Prgm +F9 = Vars +Escape = Clear +backslash = Recip +onesuperior = Recip +Ctrl+1 = Recip +s = Sin +c = Cos +t = Tan +numbersign = 2nd, Power +comma = Comma +ampersand = 2nd, Comma +EuroSign = 2nd, Comma +braceleft = 2nd, LParen +braceright = 2nd, RParen +e = 2nd, Div +o = Log +u = 2nd, 7 +v = 2nd, 8 +w = 2nd, 9 +p = Prgm +bracketleft = 2nd, Mul +l = Ln +bracketright = 2nd, Sub +Ctrl+Tab = 2nd, 0 +Ctrl+KP_Tab = 2nd, 0 +Ctrl+ISO_Left_Tab = 2nd, 0 +i = 2nd, DecPnt +A = Alpha, Math +B = Alpha, Matrix +C = Alpha, Prgm +D = Alpha, Recip +E = Alpha, Sin +F = Alpha, Cos +G = Alpha, Tan +H = Alpha, Power +I = Alpha, Square +J = Alpha, Comma +K = Alpha, LParen +L = Alpha, RParen +M = Alpha, Div +N = Alpha, Log +O = Alpha, 7 +P = Alpha, 8 +Q = Alpha, 9 +R = Alpha, Mul +S = Alpha, Ln +T = Alpha, 4 +U = Alpha, 5 +V = Alpha, 6 +W = Alpha, Sub +X = Alpha, Store +Y = Alpha, 1 +Z = Alpha, 2 +at = Alpha, 3 +quotedbl = Alpha, Add +space = Alpha, 0 +colon = Alpha, DecPnt +question = Alpha, Chs + +[ti83p] +INHERIT = ti83 +CapsLock+a = Alpha, Alpha, Math +CapsLock+b = Alpha, Alpha, Apps +CapsLock+c = Alpha, Alpha, Prgm +CapsLock+d = Alpha, Alpha, Recip +CapsLock+e = Alpha, Alpha, Sin +CapsLock+f = Alpha, Alpha, Cos +CapsLock+g = Alpha, Alpha, Tan +CapsLock+h = Alpha, Alpha, Power +CapsLock+i = Alpha, Alpha, Square +CapsLock+j = Alpha, Alpha, Comma +CapsLock+k = Alpha, Alpha, LParen +CapsLock+l = Alpha, Alpha, RParen +CapsLock+m = Alpha, Alpha, Div +CapsLock+n = Alpha, Alpha, Log +CapsLock+o = Alpha, Alpha, 7 +CapsLock+p = Alpha, Alpha, 8 +CapsLock+q = Alpha, Alpha, 9 +CapsLock+r = Alpha, Alpha, Mul +CapsLock+s = Alpha, Alpha, Ln +CapsLock+t = Alpha, Alpha, 4 +CapsLock+u = Alpha, Alpha, 5 +CapsLock+v = Alpha, Alpha, 6 +CapsLock+w = Alpha, Alpha, Sub +CapsLock+x = Alpha, Alpha, Store +CapsLock+y = Alpha, Alpha, 1 +CapsLock+z = Alpha, Alpha, 2 + +[ti83pse] +INHERIT = ti83p + +[ti84p] +INHERIT = ti83p + +[ti84pse] +INHERIT = ti83p + +[ti84pns] +INHERIT = ti83p + +[ti85] +INHERIT = common +F1 = F1 +F2 = F2 +F3 = F3 +F4 = F4 +F5 = F5 +Shift+F1 = 2nd, F1 +Shift+F2 = 2nd, F2 +Shift+F3 = 2nd, F3 +Shift+F4 = 2nd, F4 +Shift+F5 = 2nd, F5 +Home = 2nd, Left +KP_Home = 2nd, Left +End = 2nd, Right +KP_End = 2nd, Right +Escape = Exit +Shift+Escape = 2nd, Exit +Page_Down = More +KP_Page_Down = More +F11 = 2nd, More +Menu = Alpha +apostrophe = Alpha +Insert = 2nd, Del +KP_Insert = 2nd, Del +F6 = Graph +F7 = Stat +F8 = Prgm +F9 = Custom +Ctrl+Tab = 2nd, Custom +Ctrl+KP_Tab = 2nd, Custom +Ctrl+ISO_Left_Tab = 2nd, Custom +numbersign = 2nd, Power +ampersand = EE +EuroSign = EE +backslash = 2nd, EE +onesuperior = 2nd, EE +Ctrl+1 = 2nd, EE +bracketleft = 2nd, LParen +bracketright = 2nd, RParen +comma = Comma +colon = 2nd, DecPnt +A = Alpha, Log +B = Alpha, Sin +C = Alpha, Cos +D = Alpha, Tan +E = Alpha, Power +F = Alpha, Ln +G = Alpha, EE +H = Alpha, LParen +I = Alpha, RParen +J = Alpha, Div +K = Alpha, Square +L = Alpha, 7 +M = Alpha, 8 +N = Alpha, 9 +O = Alpha, Mul +P = Alpha, Comma +Q = Alpha, 4 +R = Alpha, 5 +S = Alpha, 6 +T = Alpha, Sub +U = Alpha, 1 +V = Alpha, 2 +W = Alpha, 3 +X = Alpha, Add +Y = Alpha, 0 +Z = Alpha, DecPnt +space = Alpha, Chs +equal = Alpha, Store +a = 2nd, Alpha, Log +b = 2nd, Alpha, Sin +c = 2nd, Alpha, Cos +d = 2nd, Alpha, Tan +e = 2nd, Alpha, Power +f = 2nd, Alpha, Ln +g = 2nd, Alpha, EE +h = 2nd, Alpha, LParen +i = 2nd, Alpha, RParen +j = 2nd, Alpha, Div +k = 2nd, Alpha, Square +l = 2nd, Alpha, 7 +m = 2nd, Alpha, 8 +n = 2nd, Alpha, 9 +o = 2nd, Alpha, Mul +p = 2nd, Alpha, Comma +q = 2nd, Alpha, 4 +r = 2nd, Alpha, 5 +s = 2nd, Alpha, 6 +t = 2nd, Alpha, Sub +u = 2nd, Alpha, 1 +v = 2nd, Alpha, 2 +w = 2nd, Alpha, 3 +x = 2nd, Alpha, Add +y = 2nd, Alpha, 0 +z = 2nd, Alpha, DecPnt + +[ti86] +INHERIT = ti85 diff --git a/tool/tilem-src/data/skins/README b/tool/tilem-src/data/skins/README new file mode 100644 index 0000000..4b4028d --- /dev/null +++ b/tool/tilem-src/data/skins/README @@ -0,0 +1,45 @@ +** About the format : ** + +When I started to work on tilem 2, I firstly decided to use the old tilem format (4 pixs around a lcd). +But that's not a good idea, and the new skin creation is too hard like this ... :( + +Finally, we (with Benjamin) have choosen the Tiemu skin format: +This format consists in a binary file containing skin information (author, name, model, size etc...) and in the second part :the image data. +With this format, it becomes really simple and fun to create a skin. +Tiemu Skinedit works perfectly for tilem 2 (how do you think I 've created these "officials skins :P). +I hope this new format will pleased to you. + +Thank you Julien Blache for his help and his authorization to use Tiemu skin format and skinops.c/skinops.h files. +Thank you Romain Lievin too. + + + +** About the image source : ** + +To find free files to generate skins is not so easy :| +A part was found on wikimedia (god bless wikimedia) +Some other are created and donated by tilem2 users :) +Some other are just my own calc. + +For the source of the pictures : +ti81.skn = GFDL wikimedia.commons +ti82.skn = GFDL wikimedia.commons +TI82stats.skn = GFDL wikimedia.commons +ti83.skn = My TI83 !!! +ti83p.skn = GFDL wikimedia.commons +ti83pfr.skn = GPL v3+ given by Claude Clerc (aka claudiux). It's his calc. Thanks to him !!! +ti84p.skn = My TI84plus !!! +ti84p2.skn = Mine. +ti86.skn = LGPL v2.1. Picture given by Danilo Segan. I've resized with the gimp and I've done the skin (the skin given by Danilo was perfect but too big).Thanks to him !!! +... +... +Your contribution ... +Your contribution ... +Your contribution ... +... +... +... + +Have fun with tilem 2 ;) + +Thibault Duponchelle (aka contra-sh) diff --git a/tool/tilem-src/data/skins/ti76.skn b/tool/tilem-src/data/skins/ti76.skn new file mode 100644 index 0000000000000000000000000000000000000000..2f5958b32cb5c88ccf0f391fa368cd1ac346dcc9 GIT binary patch literal 342274 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

n8O%75gImtq253TCO? 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

7HrLs6^Q!WH=bfY_VOVl5(Jv$^ANW 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

%REP2wr_AC&>YVJ95>->Os#m}lP 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 literal 0 HcmV?d00001 diff --git a/tool/tilem-src/data/skins/ti81.skn b/tool/tilem-src/data/skins/ti81.skn new file mode 100644 index 0000000000000000000000000000000000000000..6c1ab92dca37e163759f7fb154013ba2b67baf8a GIT binary patch literal 77418 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%0A3rAblT_U|@6T}Mr@ zD^QmBA}|y{6D9`{ApNKHAEzFYNn#l8P(&6H+?g|hfFKXHnJraN!m8QkLV3c{2!7q17B-&(3<15L94kR&t-na(*KfEXH<>Ep}aDtAaBcZ10% zh5!&E14s}f1jduJQ|*FPWb*>0P0~7lXuoS=N2qDVR!W36qM#mN$OcR=Yi>V5g#9{s z98g#wgCq^X_3QE^ZPN=ng`{M1gdi+B#1)$Z%wU=6>x+ag;?M@^DrPz5Oz=qL%$V&O zoMY%Ga{;i*h#_KljE$g<2e}#5k9aw#d}oYOQPTrc`~sx_1InjAkU^cVZ_+0aqmPu% zx1VaSY6@H#onTroWqU(wbr-yC^qJld9dVs~ldVcf4&|?*Wh&)C3t?6!!ti2a`o$j- z4f5*UYSKZ0oL3QWUf7=e+IP;fyo!B~()C zq%(R&y+9duK1onx{U;<~NH{UhtKfqjN2L{+o5Ug`lv6qE0GQ@L!4s+P;qCB_GVr{t z`{~yjY=SNU{wGho->vUE^vCJ_qm1bdDtqa?jQsM-Q;*BffZ-_O*9@GxTt>IkR_H;^ zsYU+)E93PD(FSy0kUjLiKz?~mA;l-aOj$aM8Oz(4J-sd??SOw+?WrHc@K&!$5=a#8 zxjVm#jKP79J~@p?#_ALm?9B5)nd|9qhn4595nM-gv}oM@MMQGt)h6R(?3LEh^1`L! zQn^VX#2MuvN`d|Pi$Mbjz9%{khSVi|p#K03e1T#A0IOF~9Z#2A^~Ea7b6wjk5PqhT zk^X-iDsu1Hkop(`i)t5jBb3J`%*p&e6 z-rbC!%cds(0D;yN=M*&~?6=P2X>uyDyoQmKCXvrof!CO;_(wpAoS z?ISRMwz;(pI+k4pL?1J*?tnY}S{5YEK_fX3ButHSpZ20vrF>rFt!;a2T2otGl_V?P z_fqH{^qqn0x62%M>jk0g>oQwuA+uibNIUWuRRgb2r1ZyKUun){ulSG0hulJx+Os^- zKFw#|kQOd`i(Bcq$08b$Va&q3g%r(O#0Un(!bRfpZ8sixrzEFF=rqB?^vhG_#E=?= zA~P8ih$cDqCsxby4fX31f8$kv1}AfJ2P5a6G$xU78RZs)gWBT$z0Ys1AI==O1zQ5< zd3?GLr|I7KVJOl{SdF`1g>(+a|~1qHxkAg90LM5?jbI(N~==Za~(lQRT6)hWA*xcPh4W%cc*nKy;AY1SlzO< zQ8%BL3E^;xEIngcHQ=v+m6%PY)&Sxe)rX~kCjs)r6ZBDr2!fcd~OrDpMA49*! z_!Q&tZecrbe?HO$?S_SpG;sTy+6_fQg+vsUh$Hp$*!IVRj2t|Epe5Z&MuZZ5?tgdl z>pS{kDjhqjZB_aU;5jGh>WCX-)HeIcCyCQquA7;amn5k>umO>`J^ly3^L5-(975I{ z<>cshRCWW`f2>;p+i@yvHlVwnWZane9jza^!%)63Xe7PtnAB8GsHg-0uvDY-{r28= zRB?Yp(mFl1prk^?0?#^mgozV-e|z@B%6&JfV2+=9R7fM~>Uw~a-G1_O!1&WvBtFH0 zL_uR903Z<{@^*;l-%cZq0FvUA54?Fq`@#wN_x*bY6-7jgBb2}-Zyzgsx9WDv)UygHb3J*El}Q_5{8p*~hWEwJL3OzH*W_I=|20Hl32 zQv~xTY(dF`-hRac>LGV3G8kzl2_%NkUtnFE`HP$uJH^ceTlS+or&@^sp-0~I z9f$Sph1;feRsla}-R=SnQ*T=)a3f#`J?A1aMu>`_xZWL!U}gYi91QlHj^yJ`X?>EE zmr9BXk2wUDN0sg0wff+`sk$g3w^mY8OhwXqPnUcAI^nu=j9LjGa%OD7j$lY25$a9P z%e3IB?k#9#g{iFJl$DrJ8;HG(z#jq9Mix$+)mE7wv+o!#HydiKSC9ZZaxf%zKY0RX z4t*ey1O|sE5CD@fNhchFJ(mxHkV+H)<|0nsK%Y;Y_KX8fI#$cBm8Ai(Jd^l|>?TCd zZ|jEsr;A!Gzyfo2M=hc^j;7!fZ;!3;U;h9VGnv9bAjQ=rdX%I|iXh2kj2>d-JXXU@k z3nxtKj7qJA-~_>%4kbW<6qSr%kbka5fX>0Rf;Vshl^_xizyv`N$({ky_4oObkrqgi zXi+w|m>*mLaZ6=Mb;e2N9_Z=P=1=&aTsQCWCrhbPoXsbc5|scidD?$Dz*l&qrxcRX zvm|o#QiPCW%$}Ct`rzr)dY8_Jm3Ik4{y(>&jfEf?iCV1kpPJJ_aIFA3@0Dg+HJ;yg==aBWWYBj zMf}CjO}!%p)q49)K9H5ywh9D5OdAc4ev@hLFkjhSR-=|ZHurE*Bgk?IBvGqQc)tS{# zO}xU9{{RA@;F%pHtEsS0RUwd~sk$yI=hktBnC#CZ$?b6aGqkZTf3 zWe5jt{a}O8{4Y0L^sc8Mt%dOlcJ1-3v;I5(@ZRHlCXo?=KMNd-Mj`h0DNbh>X<3ZM9W&kR$OPDvY5u<>j2zW@BadFK050SU0BvpW{YP8j(scf!xi(iL4d^s# z91P5XlO%Qn?hI)ap-};*6~Q^+z?mz^fdY& zZ(B|ZU0Y_!2YDcL1jHNkx5OLY02QfnLgGi?8&Xsv#7amWzpU6>d;?aZ$j7t^tUxA2 zp0PV#{{Xnc%hPZ1y3V_BK@^_>q5(T{2PS>S2VwFmf>5C$rGad~01@-~ut>&u7&;!} zk~vI79mV8y`2PBVj|<$utCST$2{CR_)7R@g1_RLN*$aW@*5Y3wqCg6cNdEwK{(EoR z08^Y~?xFb1T4^Zvl7%0}LHsE)Bdz*I6&*JH;0rsB^1f60cITM*CIsU@8Y57wrGu%- z1Yw{^GnmOOFf$+A)emxo5E3N73fels?djLk82gS8g?q%^Q8oh5Jm+r5z7y_hEUrC} zscAq71a2*Jzm^22ILd_@Y86!2Sy%-_psS#ZxM`_bfnXV2F7&|7sW3PO_rkY@5a zjqXo*nZYu%{J4`fO)SI(Oe!MX_W93jX&K!Jkh;`zs1lG(!o1`2^xAN7VR}jb04H#& zK_k$_u@DB_cY~jg*FaH}F$m=p00;$0-8)zUGG~wv5IyA3zLv_&NdSa`KM6f=e@*Z~ zT=6VC6>^|No$b7TpRD5-Gnz*TK&fq0aG*qy+Du>1;oAk3)yyrW0PA5yMDtj{zrg;? zU=yd`?@6?{1Tev*$B-gSM-V=8bRSPqluEpn47*j8M(x0pfB}MiQVuwgrejisCb#2U9 zNGgSW(#RHA9PPk~$vnx7jGj)58EmP+DpHp`%C(eC_O|6NEUslt^ufb}?V zkM}2?Rvmsjbo0g(w2e{G7b_`UH3p#trviWpDNrgyshNUAOno<0>gu<37N1+K(KVO0 z!f4s$U=Wv7l?3}jI;lr}u1+mx+-h`qJ$1IV=9el+TT5Udgb6rN-*BrI4LVxNU=HDOIeKDWJx@4ZN$P0g!px`m=9N>fB zwEeLIT8D$6Ui6qVy7K8kC$XTX9p*#;HvYZmCj}Ooek^d{I5|i9+f4GP^&iFQAWxrt zr_X=XH$p8ZL+H~x=}kO(^~xyxvH61VikYW)lf$Pufl@WDnph(7{{U;!7&r1e7@U5Z zx(>Y~L+H^vX-zseJu-?sXI=uR#d?W($+nIRf5nm72M{^;)YsyA?rxJ1AYFna;Dbc_ zPG)_%jWrdhN}W>M2`dM92H)rU;jH50PB);n1L-`f`-7l^wbDViPuF}pEG`zX@F0zh z+I#x<`1;|o<1?gi_fV-M^8L+Y<|A*P>xz#|+WkVv$%eb2U|^{gK;ynYq|T);8L3%a zD2Pj1$8kK5Da;7}0Mv1+E#kgv8RAC`a`8@;sp@)?r<9wZgFfMoz5J&W$G{3pnclvt zl_gB3w1Nff+Kr9-PxizX;?+GT{8!<*E^{blH46zJ?L4w)%ni@wwkJn{rG46;h*d2T z7N#>I4S|HR(y4MaYMs5Y8$Zs04Y!a54`pqlM*9b>tKx3JT8O~ z_4>jv8%`$Z5=i1AN%)hD>zGfp!!n?EG~=_*g&fcL{%$>?*+}PD5>H!gf6p9}XWXi+ zc&H9#RIc{|3yRj^-1c3`X{&tJTD)khOpV3BGuS>N+RA6nQgS2K~7zb8+;6A$W$=mf6a!;uK@u$3d zaexQgO4gd?400;msgO6=cH8&U4?c!%!BEr#9LbU|V;-0Ex5o|F4)iXi)b%vf)W8z@ zl9UCcm<9mtYm59h#g=fN!M?ezO*KpPR7h!Dsv$xQK>d$Nwlpsa_&cp%(HHcrnQhpV zN2pN&g%h`PZ)xNmxExPv)%RWLR&_-yi^_E0)#;K-$3CS8+zkfPR0?v2oz~O}`BI)x zH`@OIAD`ug?G-ZQ^9U#+L_smu-6P@#B<@S$A5hXT(pt=E(!N`y{t!fM+w=Iw7IdBy z^+8DH%_#>(dy-G*x9-@TPXYLroo08prV>C;-ymRSa|V0ho=-AHjZ?;+9$HJgs8M37 z1OW0#h>!;$M2_Q8a+Qe*30kfsT!^;c6C3S=bhe_S7w382Eiy#n$P_Dvgr|B1bVNAP^76p<-#=Qo-g?fzo5Q)3kKP&tp(7l6NEn z=jT5krSUTp;cl@mB>w;yKmeHmyBYJ1qrdjRli``+1Ne}%6%dZU5w_iT`C(u1zf%OZ z$_bDF-iB60lN>HKduG+l*iu#ug+Y*J zY)7x3(;Aew*0STvTZ>sTr4m)Qa(a53Tec?BJT{PprON(ecvrK7=`nHj^ynR48!6Kz z%H@)FAscVy`~1N8X7hy<6@-E6&Uug)VYug<5;R}&Z%8Z(R$?FqV@akbAOI#n!Hx*$ z5vW>u#W-~J+ z2qp$&=TOl}QAiOa_w?Io+9$6`xW=%8Pb43Ash!35_#ew`O+n%BEke1}^QuUL9H*CW z%f8zdS7{@em;lKm8%&Y<{))GWx?yDnr*uK` z$tVGnxB_tp^GWyACMCgQBq>|ZO{_h9uW__vz=e2P+($h)NnT^Q!KKU zm(JNT;1Z>R1WlrT9ezPozY`#a4pj3ut^#z3sB(%XTkWU0jn8y%oheQ+2APb3)*!|lXH|*B%OQ}(7{oI4z z9rqX8uk^(0Z-9DbcT;Z>7XeoD+6VdWFk+4Y={5jy6wXX+Ng(;hc_95TL*eSO51OI^ zgR~JFOvoMc`V-r}h7;zdB6a$2v`OQCS(#YW3eRhrALWuTrvu52?ekLjtPUi4nR4-+Tpy%wSMd8(iSrJ#aI89c#}Bj-He=`ZmmqTnS@TzU;KO5_tBvI!z2@iUPc zgH`mIeKwxUs+oRk>K3%rFqIid5fTQ%{jLZxz7qhDE))ne9XdfB{{Uka2)+nt@F3AB zs1eF0*X{EYjVFRyMo;{ak!YJm{cU5v`0(h(gDW^NOfZ#^GbBeO5V*nk=SLlS%q$S) z&OadZvV$d$0kOdMlg^+6igL#45nxAO-^1sPNiGtQY)P~T?Y+GI5je1e!EGP`AH(HP z03_}Cjla(L&^Rlk(g_qc25tqTbH3gCblV1AlmPV9K+3>G5)6pqAont2c{9emI_;+H zheaTf3M7#ekZ@#39M8bi3}r05)JYZtu(+M$<=ej4o$o#}kDrwMx?|2~42{yG%njyA*#7`s zzL=cf@K;JGlA1->cmDt)Pt;@2_%Wo!kGiZYa!KvmZrAib1pfeKI3xFfLE1vA4ctK_ z2qHb;_Kh6%>mW?is9|6+S(yPqklD{^{!^$&Pg?CcaYzx)g4+9lK_8d*-vAP#LZ(cp zo%{T3aXEkBo|1(q)34tD0L63O-bbO2tYb&~5YlRpSal)~;W59@x%}{D=_Ei(h(OB^ zR0$XoNBT@+Gdc(B)?|Xz>V_Ya_jmva$dd=(+zI!HK!rh)3W7)=cL0e8ypQeXaOP^! zVQjTa$;^R!lut!2K%#`zHc~T&uiK zpYNnjJ^LW2pEYD-3Sn}j4Dve<*WhRy#1>2?g=ruSp$Jgeka83ph+tzgJZcpJ?<$-U z6JhwI$OEUBtYdmy9D|ukQ891tw?n^QmL^*GBc(1wPm$!i6?#wXbl)10!3{Vs+V@Vgp~O`YKhkR^cTW_NH8Ae}?% zcGUaGZMBfM77&n3LX>TLfIT)C-I!6-Q98P3$@YjKE0sY)`w(xxlx}?SF5BR~ooQ)O zTXiHGd(cvLkY>lNww4L9FV#N8YobY)P0b|^m zfFO4J>)+x#BPuurs$Heggft!Q_KMb83bM<>G8si z(%p~eRRRk@I0FZ648b_aCqTV^#Jd(1ijl~tnIZ`}oPtPP1CfZ-Rix8dzHa+VYMQA* z)9oE43ifF#AoIr2<_D3(x1MRtlPJ*D4OLaP)?(PFd1!G-L2#wSz-~_9?>i2cIFngs zOQ-1=rll;cKFShQj#Q~_&C;R;{{TI(j^nQibmq3v{=-aERM2N(%5b8kkcFWuNm2|b zM2Q;@KQUg9R+(z5$n3P=U_X)SLqK8xhJGf0F`X|@uh`eDv_Yvs7=#YWR05!YYRTb` zCnMbHRluUAHExct`^!%yq|v&k8CYK`J&;HQi*o^E^us^mz3;y9BUZfGD{03Ru%$=5 zPcc5b&er_g&K&8ZqVru5KwovIUlcUe3R;gTauC{xB$?(jW8VAWx$#q%BP!wsc+!?# zmeAyM_uC4ReCGbA6){4kEA~q2X}wDzLS}ZYP#l1HDo6+89kn&ls;x>FVGC6h>d_AB z07-8!s8%P`pkjV=jaDsNsBb-SkkUew-9)T@FT!koUzYeqa8>5m)LNIEOjkIN2%q=$ z>?88+g{E@@QZbsdHo8uMyML>h8 zG?NyJWP^}u7$!5p;F1KGz&g~tB0tV_mMl#50yfX(28$9VB4mg-lbPV^!FWAXl<_M; za*zVGhMQ25AdlkIp6I_r82u{rE@D5?Iy&S30MT7N+y4Ny6qx+Y_)?WI#BB()Dq9-6 zPN+`8Gipt}A|eOJe14Bw8#zePIy`$s+e>Njx&Hv|O(&i*?*zA&I)IcQwF8V~ij$IL z_WNqz_>WI>bfO79n~@u5y%-?!WDzEL{)hE-2o5-cVDk`?JI%HqoZk%}8>&>#4YQ;b zN|etjgL|k5_>Qq}t{q2F?W!FqP0+Gb55r;e=rG9f?xi2_`#3?AsuG*@Jjn;)Jw0($ z=;}{duu(f+_JXMG0JoKTzi=GNcb?e;01^BY!*2j|Od`mrHRDuo+Tv?Ab&U1P@^Bkaz6_^~3|>I-PTk znqi-9?NLvq-B^=!lG4uG{EuGjd2INBq0MkVUrm#yXFz zRAuSjDZ$gx#YpBh$6263~RWA>$-?yIFYCH*WPeoeBPo^B9sjQ|7r~$3e08im0+;rR1q+-!D z7Ew=2PRm6pNW|8)x1B|FV<4d ztu~SaN=z}`CD`t5#9*9>jx^*_G{Yev1dm8#4Gi87Qrl0p=rcuJJ0QoMxU=&Q+cO;=v)>}C2}Fm>u@3La)aTV*#Oq^d{4 z-gvdASrvsgN*6UL)&;2TwyJl5nOIOvfKD<;7}YYrgnFunr~9Dv{{T9*#T9hj7^%7N zOwSP$-%5&nrk%(lCN>?m1pfeTv4MjrWJn-R-?P+pynMDw)Ku#V9Mz18jWt%R(x87X zkREqP79<3y#rK$qGIz$RTJ3jVn$+YhX}W`&ut0i|)dt)_C;pWYB>8sv0qVBQ%BI@u zf1Bh$x2c-JLwSFf4+nI6eX>e^5$ix?TYym1UDq@)g9V4If}Nz`6BEvrF6Ff8kqNXD zwa;L0*nU_FW70m)xrm- zN|UQhR7&)XGmWGI7>I!eI6r+qi_4hgFcUGgy7b@t`fghFBSQS4QNLb;<8M8N=erQ^ z6>~>9L174pHaql#dmi?T0I1@gZd3zIw*+i1C#|pCeS6)D_@|>ZLpfFwq*F1TV*ts3 zC$#4yPuIa6d_eN)r~!GZm=g@8fd@H*ndeW^=^6q+OkCVd1Nj}N^T1PXu+q?A~1>F%ws??IL-IBaw{h{{UM}hE&i9_G(m*bbSv_(YNJ- zmnqsZLQ()5+E0-FqW)dkByk5(IFj0$Ym~{K&=5E2zpen(>+JcZ`!a+AQ!~(Sxblv; zLa&MXX#j+%6mBZsUPytCdzn9DrPIN^V9OClbeICCq{!M7f+qt582RH*siSAvm7Y*Z zA|m~7{rdN{gSk%05d)fTW4F`D{>B)e_0FK?NGfSS`@{*bI}h2|nUR2x>+MK|EP~eL zKoTRhy*t~k5~<=|o&p`URB^XxBPM-W#(w_*Z7==~>X`M?3Sv~$F+I0P;AG?Z7}N4t zY)VDPUoY+bK6=#CX)usBl2sAjFW3C-h6&ywXF&-lQbPX#^^z?vb06swe> zA}=7x{oB3>d`DzsYSbn}NCN=pgZIED2|eRVe}npz0$zYTk6RE<2sl{XBaFcBJjh>Q z+=Czugbt^B5&QUv@G#dk#Dlqr-v0ofr=5-?f;fe!0@9aOgdmyb0%Obxy|(yFVA7ji z=58hB{q>+w4< z1W_PwX*iQUk=_7*eXQCeXj zf&ibE{{Z6zZ|iL6kdW^xPvJ2W>UQ$$>3PCOui8V6u1Ot$ADT#jaTCeN9?_>XyeHHE zA)b&7eLkiFazTJF3Bd0h>HS#>9H^CUK<(U!-}k-70jWU}qXdYxj1g}84zdSNgnwSN z&yo}n@qm9ETu({rI(O@B@Ca)R{HaIpQV!`*CSot={X0Rzf48lO2o?AQOio0|ff>i& zIpa$&g)hBQ^hhvNhBMp|J7Wjmk)M4?o^Z8=7?Hf%L=*ELDDE+(OF%rp07*0H+AkCI z#C`t&TIZrtUr7-H2HpC6{{TaP>ee~na05^x3XB6gAJTUIm?!PabHysExQT%==_kB^ zd&fE-@V(>#=TIlRw&RJNz{C>}F%ue)vn0S0HY0z|_Vtd~@Q|a*Au<3U#m`^gOh?pf zJm~~QOe=J%BuSnB0A_Lb`o}s_rBxu2I}fZ+^!i|bZQGe;M<*sRlbA6%QviQ&lMf5s zf+nRPBLtT_Ns!pu0X^s1Gl?(MpeT-F3QSvacbOm4XunK&#nWqg^*^P?J$G8?PAD(hfK)|-U`X_^pO>K+^7Xnb#5FpAoRV<3@*BRoS0Zww5fIyCDpUdO$##EZ4Kdq=p351QOxwL+G1J-C4+vT{( zCSU~vC8ra_2+l_XUOpVVQ3jQfXXuhSAcG1Z6W97o{csUnK+jO17UFC>biYtO zck$XR z1JZh4)7QQ1qQegla0~R24 zCJc0$@A5zG%X9gWgrIHPKoDf88N(RIx$nl0{u$~HU74t508zYy{85|<$j4v|6Q}(J zG6^Kc@^2GjFK_R@*bp8A zP|~ej#!RV(%ui8yw?kpm3Fo+rQ$?=wO*@#U{#!G0iN;+|S5r`nh}*B8*i-nJ4X;%t z#3YdBQ%0bo46bRLf@kB_{Ga&xs;fB+Ns!}+MsG3Ox z7u+O{zW2+&_>4Jvks%tHqX+)^LU#hhd}4e4m~1#;RE{d=Y?TOG&J*Sdp1-;H;|}~o zkNiLt1hs`iMofis2bl*v3=fX_?}cAwewySDM^mJv;GL~Ri8+bEz~|rEdhpSH&s^xk zABR$jc znbMw?AE#Nd9oFdV^bH}UM=`dW$j45ZWhm{8SHcyb-;zv|MtFijtHJNgPsg-s{p0i% zPfd(%`kn`4 zckk)v*AMPulDg`FKFs@40hsC!#(yF6jlLw%x_tpqP@s9L7)r@8y2PI=_U(K_bUALn z)01zYbt)s(*oxd|^2|Z(J+wV&0noaQLh#3>+#F&-pkSYPkbj=3%UJ&a^meBTD(7oT zsY#jqCAEVGVcI9I{pbGxhgB+vgFH;DWkeNZS+Q3%Md{t0$Qu*#ov(-osL&tdg;T0@ zf6M7aq$6_*Xo)0xpWGZzt_Y;H;qQs>g{2(17G^?}K%e9}Xx{r{rF=)`e#r4TFc0j+ zLS|0Zt4%`4C$aYL>;|x|g-)7vKL?;Cz%D_U1eB=KL~$eIfgSb7pV|>n^0X$f=4^jE zI;`bz365%~3=8aL-G#bgci}>nY4E|r>S7@U_i8Sim3z0IyY=;r@Y;Q$wJKwWxxzVw z)n_#%o^8pgaEOo(U+cae{{RdKQ(hYQaKX7%Dx5MB4Z1!X@ndwD*v%qAhW&j3Y zAbEgtJ3!+Ap4yYHKYv{cmE6a09i^mZ1~WMk{Nqkzbn8p%Sy}gb0TLt|dG+%>g|H>n zsy_iGUBugC79Y9W1}wCttj8*pEoT96T`EFBDQI%9s($$9^Wfew) zGonEvUG|Ac_Q_4i6Vg3?)7rC7>FzXUN@G)0xsjZ?@T!NLS!3^h$xzzV0Ya3OKnge8 z;(5Y4O)-%0WjWSh?p2r6t2G?em2~N-b!;S#c1mZO6eJGT?Q_Sn{R^*jZoRJ2c?~1g z=xL^#EwY5X?LZK>sgg)iQl&|Ne@W;&L+5mkhLmn73#wFUUQwV~nzcbnjY721RrhQ$ zwTlSMD8y?lycE-`b%NAu8+R{lR;I-iQl-OEQ&HK$1fZ!XRDyPrKm$l#73$qHmuK47 zTWT!r+PbEzY8c7dY%Z>?4JpIQL4l08d82Cdw+r)(&o9&LRBOakkZG%#L$xha{{Yt0D<_zD zH=HT6Y~T1kQ=s!K(=EyuCUVi2U zJNl=|Z$)Oj+!xP!icQG;rkR1Tk?aaL28#7Yt!~e7DaTHviB^)Mr_vcwNFy+zB)P3S ze9i#pQFp{Pc=ms;Yn-R6tE$TiTl=|JwG`y?4sJlO5)6)=XQ9MxRTMqT0VPVgR^7VW z(0+qRC(LpNjvR`uIgm-DGD$|+hcyct@H9H z8CQ#uM_lRvR%(FOV(#h{L$nr3U^7Z^0l|q8?|AU*7U=e0yA)MufQlF~C20_28}ArTy-JqeNM$!jGGg9@bnkgL!P4Duj#8qO?2&t( zo#HG$9jtb-M3wu>Q0E|kox%0}&MPX8(SQ_53qX*E^|A6$V`OZCj(Xmy%rpjs5q_p0hdV-h%YAo(XZOj1xsRnVX z_gLyzwpHwDTF{|Zoyn@M&eavEnl#?45wS>utF>nn@v70R$TNJFtL~YN4MinL0I8SI zq%3nsMP55^>9!7<;l``4evy{)EWyX?k?knJVQ1T*g9<^2Qhfe1i&fVedrIm$jPd+Dxng--!&1$7AjP$9j<@@>~&lJ02;rMOr?P} zh+|MSL*)V}y;LF87{bFV5W~K8ReF<#+Q&(rXh@1rkhK=lPqZ!D-P-pZcEmSz9IlY^U=RR+AolHluh3&Y z>)ke=O6s>ZR4P4s6iRt@i~`8WuZ^UG$P*(25jwW?ySM5cI)&5I@=ajOY3|*yhBznO zMnR8m+Djsh)sUWEWX8u~(8TuZ-{XNSWX>hR6Ce@I8;;#(J9!U6aHwLP3Q!45#Fzr( z`icGaGDRY}i5$rwM5squf!O>v`G}=WY-Y-v$L`*7xg}i-h)|Rg2E%dcI>^}G$K{7IuAR+XP zW0~)ysbxl-vZQ;n%nvBJ{{Y=w!0IixdBJT$OJH&}?GDx#0C%){{5IPQMq1|QY_?XS zC*2YUa~-~(kr>pvbi&6Ye8ao~4gN%R`EP*o)Gw$26AFFsCQJeE5s}_C;NTKTATfXx z%ozK?CpqICjAv@74+P_I-_p;EOvb*n<{L}memA*8b|HwWZB^G<^4= zLFy$TxEh;ag@ctQ4{44k8cOEA8~B-$WUgm5nIgXK!+zSOwwyz+Q=$rqb)=ql;9lvs z#NjWc_%E)tj#ruI85Ta5lM&PQ6#8v&3eauT-mw)U0G# zx?D7L)U}@9?@YfulDsH&r4K>regc z5V2B!+6OTvW-r?sRX+%HH@u3~jg_4hsvX|;g;Q{WmX*C)VLep*!b?K}3W&yaO0VLZ z+E$3v=q2UVMnH*eM(JtNUA|>>s2O3I016pQ7CDRqQdB%G)p@R4nrBpbYmU(5%Prugtl|v$MVoT3AxOd0Io3Q0;ueR>e~IT= zIzNWmJAZe~6eC7p?SGZKw36piXPWDs06W zrDLztQI+f(ee&c#nhF&QHdt304XZ z1i=zP1cBarbMQoD>n$O}eOs>{dY4X6n%7t$skE&Ps`ea#L=|+hWctPwdW*x?67BU>T44&8b{{bndC1W|H75 z_NoOTNQmYJ!tx^)0iNf2cR%BXUtgQ*c2%bGT&hx1&$|)jCwl-Bc(lZFMBA5H~b2k%>{NpH=G@-9GtI5{+wL zrmbD!Dz!k=VSK4Ww{x=y8)OMN=T(uZ_%p8bit^fg{{SJXp;m9~hF|SaKz&ZYY#_k7 zBnaMo&J?fsY2wRN$$V*g!h=pKNJ@~WgB-lv>1uh%<+*`B5hBg_iL7{I#l1MfsC6p` zHPad0HB}ei0vT7`*?3EA6CB719_(5^u02Mp$SL#en>kHZPVQcujSN-hXE;Jsz!c#G z3O;a^nchL#-3Bf+JQ3m7ty^bMYSaZPUQ<)AM7q`UUY){{L6DnO)a?Ul0OKMCr;K`t zr9}SERJe+wx>QPt2EwmNP_aV7qA`gCk_ZZT)g9*CEY_JuMs*frmDV?t3Wd|ArPQe? zOUNWCvJKKfu?Nqfz}+Fi?RUgFC$kMHkUd#NOs`<`=~__A91|d^Z~-@gBNmCNa(zF= z9v5dCXC~D-FsS}NS5kvhQqvsGtz?KvAV;3je#ZcK8q z&6=iarKLyt@ zsSW~}1oEi_{;{-nMKXC8$?k$K5O%bDW;$(!3f}`*{S+f`d2tM{~9)z9#9^I&V{}M$dBF(^Yge z9cmVpl1l{y4`Bd|jDf3vO}nXkYf7y~r{+B{%qWOiIg#pOcFxo4Fu?we{(n%k@kc<6zEzbn4}7Zp!x$O$4Q(?e-rJvtotr?T%+4$G%h7501i`3+ym!tt>+PcQ+q~r z&W?E?l8TfCI+JAbxP!mIboKL-9wQRtkLkLlbALBaQYbA^?|{$(Ivu`0l}X4>r%dg` zSvWF1JB3B>&*b`ARBk>e?E-v znsl+o8pNtVbCxD|Abif>E%BB9ASoj708aZGgP%(VnK>e0OvL{HQ98KzY$>Z~?SQ>j z&_RGmJNd`H0WdwdI^P3Mj(bQ7VSQ>Mu!NIBk4q7K%trz7G!c^q}|rZp-PrnK^TzYa%~j-4ne$9!OZ z7j<8(C8SL-3Mo8q=N$WdYf|xr0^dXEBmrC0V3L1#G7Ry?u1_(ia;GtwOiR3qONwCPZ>3irX7?qd>bG6tVDs#*z>`lTHr-8+3e`$gXr&nNv3 z!hr=YW;EeRNx$L}B1i9N7$=97f5f&60JrTF3<}QTDv}Hy;K%74YA?hU2=L!gVtoUp z)!Xm?00SWQBR#V|$C_}=U0q)q^#jOj*|krmklFHAByZAp`9>#a4Bh*`hW;ZcsHG~& z>!vLrwz(dDosX6vdYoFg(XJHHP+>U>DdaO{awJ@Sqo-}m?9zl&_*&O*mcq*Ny0n4# zN=ZVl561Jp-gxNW5QFr0JM2b4GN%S1?LWOjfo!JM}EK4)M8BdW}u%B{69y$BQ0%7PWz-0 z=_jD`wAe+zv}qxFMvbRPN>`iA+DyD`2UwXM{P8qAJ0g~sf;>4xT>i`WO)+0Myz&Bf z-+#+&O7w(2O;#j-_%Z@HP*S03Bpkp5$2iV4DOJF)bGkPdm6jUxgQyO-;claP z_E(nPA-uAqb4iJ|v^2I4E~6`Xg^-Z#6U;&$xf;O5#Zf z3FVw_$vjr(86$2dBF}1Q1H}7A>6geC=A?i@Bc|iGm1}re;%^AD?l)+$#@wNLhliDU zy*(D7rbFeY8>Fgr4JxHBT>k(go7xaR5J?_*>WfwVo!$vJ9i#Ohh%ECwPJP2ZCs5_B zaDOTlNqNdD?CG=yRRi9sTMjrmP>cJqa$^?$m*Z#d5&>gT=Qfqo%a+}<7x!Llm7ro9z)_S6K_8I z9P-@9EX?(VCmX8isOqTdGpanfI$otho}I>3RK+he?t~D9E69@u!<^0|XQM=Golm4q zP^}twHLJ@FX+dn%idRcv?`ESYDgt>;#Ka6p-FW8Sg)|p7Hg#ydVoK9BssQomW4wYI zGBD6Y&%AX%2REARy=wc-0EODrk&y@zr)@Ze>?4E5bzr)W#tm&1@wp>_3mX$0B1cectX zTHDa9)lvNFDn(_cNF)->L4Ny)j^6s2>HP}7OLcbYSGOptLQ=0*X~`14fCOef4C|^* zA+K_MVU$tkbTv$=s>T_p2?Z)rOQ;Je>#-yoTdowD=63EyMMqalN{WYStEs6Q4jxpJ z>e87TNrGStlW3e({{VzNWm%eO>K4n&U$CcS5L8HnqzD3jLLxCgwT`53FUhp6eQFYE z=`}u6QlPR*RF)n~ic0209#}FU{V-dK>uYi4qxrP_s#i$h0xHpU4g&#+i3|h+NAs{* zm%OoB?uLa&XQNRG%{L5FaBpK0rVk@JEaPt!bL}^rx0UI z3p5{xz9n$`OL2oR(%MDz@iRlxXcZM@)Q%xJm)%>Y4uYgYYKgg0VSL?f11&eht`KR= z{{U0)dV@vjO0V=5N0h3e!;?_GPz_yD9!IrVX-Y625zJ?(H^uJP#XUB?6@S^b=+!CF z+_chy2bD!6h~}G!Vf;)(4`W8D;gXjX6!ku-R0@?!d6!jKq>~{?AV%G=as+`K>y2uk z5<&1%ghqZ`wjzfPwtq2vg4 zwEf#L6nv1CsU<(n2oteYpf`H8-1S^`(0m#^DbqFHA9KDK*VO9_#-mEnCX$J1rE`(v znf=`%r;;Fn?Kz}Q;2aseQEth)or2UW{{R&k=_}Dww6RiEgBoO(+bSGE1Wtr_V%)C9 zyuK2yWonYS6(yLG4pl@8&gegzeQ)T&$bu~XE$y2SN zX-6y)NHQXAI8D^?!^CY{blmhhwaR+BgGojeL71%$zJmpdX>5hMlOM}OsCMnt?-=U! zFNey14;o9szYVe-L&J@2t{kA(xt3d}sI$gbm%CV`*D+sI8h6;G4JkmaY8-%AfFlx< zOljW_`lnLseInMG(hTMt8O~_+-E|Wb8Fw~X{Znl{R+Xe6l(p>?NkYBRdsvJC@fEW% z-)T)K)P<#8>e4=bO5_yu6?Fq)XTc^xSSlxnt>`T~r>rJ4ehKFY05q8KJ4m1RCc(}(lJ*NBR4Eoo{> zjOoT0&s%X+^&tcR;*nsmHyqX^d0Nqn)B9_4o)>UW!JfO+x=$w4OlG`%%vo}s+B~|6 z3n)lZ7P@6N&?w(_if#-+k~qomm#k_iGtapDWu*(P3jr#Fb;NSdr|tl&bxXS|uB~o~ zRjECDD~1FzH9t0(-AFJ{0|pAnOh_<6g92LCom(0|<*AlKbxCTYmSR$&3sIDl17z+! zra_%_BTnjt9bIiY+i`TX?>dx~ekC^AmY$nP5^rvoyno8Lp~PKfq)jecr(MjoE_JG^ zvQ0Y9R+3+Qu;QCTC`5wminIV`ciRqjkgogAMP5|dTHVU(ITloHH0#_<%=O++oufYs zb6sDonBm_FIANIo0081uUl%G^eR-zkvjY;JSw$^nr5r845 z5zd}m!+`!jDKgrsvBEui%_|K#RP(>Xm;AbPB&|v$5?~_aZ`$TClF{57@zcaCqO&&A z{5#h5`F#@IMN5gIaiCVgQd~np!W80?K?Ecnw#QQ1&7Ty$6TCR&nlmALQStYR8mX+k z-EFF?D`?-K$a1x*lbMQOR6s*C%5)(Bg)fwnWR)f{c%-fIEw8G0BF}`aLTR#Q=rVep zRZXPx3L0e5X2?@2&6A!s%E3>wciSb@yc5(YZZUAD;smOXQ}%yOH3c&C_E%P;Sylt7 zV@x=xIb0A_7Kp~H-?3?mfp^_9?kWphxmi?(aonl=qCfKrSN^2 zu2oPZN`r)wdMYD#hMHdydL@q(xz~+7PfJt5e9tP*e}Gcz?9VT(qJ7dvMqpFMh+MvkZNiwLInYls2W zC1WQ_7aoLIfy)kVWxUA8zKp z(z?gM?uch1&GL8J$+b7|3O4C$=-pE&%TStRru6HaLAywT8C=L6*okN+^sq7f_2O9 zhmRH+;nj6ITU}PKFr%q%X-#o1d-GO zb93{@I2wOFPM_j_S5s6=^z2q3RJO~Pd9P{jgf2$+gD@xMdb}*u*;b>YJmTd_c)6SBmDwi;HQrsP+J2$>e`%I1DVkP_lnGH#kPr!wZ-#cW ziZ$FS@o}VezExcQQJ7^~X0ggjqAfudXAX9{xbNr<14>p_Cv+WE+*GE zsxvJ5wwA9wq^hSGpr=!XA9jC~mHRM)Q_7@^NbiY`m)3ln`>vMucGXg)G`pv9b5ZHC z?4VicDcJKWq=gZaC*MtPdTlzjlIXqDJBGD1*1M%8QVV&8iprKGl?-wg7a$!}7Ej^h z?HJTqYc-i?4t335S5g$V9s9D<+2v752ujy@AczT@c??JGU6}Z^(R%8GhB}^$Rb?8_ zGpTBWFUV@?UuL$Y=hP6>Y$ZUIg_r=MM#F4%b6MhVgSs=p--F#p#-1eWOr+|BWGtgM z(HWx*y;qx7RRB(STU3g5x}^Jla4bny54fYkT@S^t9UMC1=B3WGqdYp{Uk$0XMq8g$ z)#Zt(%qpCtOVn@X4hIwM+-0(d6=f(cZP3e7>-Lu++NG@uC+NPWfLe@8e*92SLoU}= zlO~Y`92rxSre~(o^aWaghT6*29EMP`03--922}S1`wmIC)u%jPa2m5KqvDoTt2Cun zeA`ZCX1TYK_r$**$S|;BYEe>0Dolbvz3~44XnzG?X&(|aRW7^8w2q)wPhU&-+_Ues zLXy6^n4{Vy%34Rrb-=U`P!b7Th?xT&Ao#n^{5bf=;ME?gq2h*x*V*>~wdP-)X9q8< zqD4bl4FzIVQA6yVaVvZ_+jmQR$x%s-fWuwl%SLh6#NMpnCb;l@$BjFp_(hWBIa;#} z-z?R%8GSyRa*mlPc-Cd9scYJnxfGQ&v_UB$KmupY)-7r+DwgKKPt#m)rCzyOLgw12 zSEEXx+WV>_B~%1Tg1`nNCQAxioka#E_Q7X$+6ji1g)Ov$+lV>WKU^p9Yxaooky@p# zJCWz@og10ClxOMAYZaG$!nLxnrkoW*06c_+a{xgQdIrD59|?S3_&2W7+MA3HQllcw ztJ-8YPo2@`Npuwew%tPuQkzs61w(s`bzk7SUcZy*uM=7?TJeWK@ym#G`je5$&-D&n zrrOU668b|cs7+fx%t^A}ZF4u~ybgap+x(|eKcKXRq+W;8S}uZ?w6{<)4kM#iJ5uRT zDfX0U%qsns(iRX8OA7{99ZKHjmGw5GY&^PGH7OLjN4WDS(pre2*0Pp^ARnfNP-YCn zsx}COnskvFcL3pgbQc_3WDioh)+#P{3M$-ofEoI@0?GMtr*H7qt{{Tel z=Cl1&`l)gLurt4Y-qM^?l1f%Zjlr^x73eIBMd;oLSL@Cp=Gk_v()s-} z*`}S=8mleM>X^)(ZlCXN3b$&*=wa88wYCyDLP#4*aDJWEY1ipiK6NWYQE6OTGNorr znpJGUYE>=}Vk_WF%!whl2-9l4F3ypv%SEaZ{$iJ_QJtOP-9(eMGTT5fI}ikGlWk|< z!|f{2I(olQ=XwiNx0U4VE~>f82Y&MPD-EQrZaTv%_PnV`B}GZJZH6y{ygBj9$Lz0H zX1p}X^>(Jqv^aQb7b*Vo1qztvF0`Z>3UL7{=4@O>#zgirr94#ld(}Q9yi9P%P3HN| zU&M^NMCMLESE)5UEmnuk3zV*<4drw-3pAm8=idlYj2| z(pr~`n%gwawIi)mP*ky-4BoL#CoL(bTD^lwL!6SZ5|F7jlZQ>!?UI`}mXzvR-W07! zRj8ru{+rKsY`dc=V5sWOj2IFYGv~0hAQM2J%et5>REWVCVn5PiRg6y<XByQb0c8Am3}_tKJUiP6_yZ;#Z6PYelRwMeyf} zT5*kQMs)svms8g{O;ExrYQKh->N%58Ql%-dl$8b8;xPDc`&hg>ac9I|3;Z|mr8(nz zcS$*(Raff{A?9qZti0Nt4pFz5RTLG4DJlph!Z`>4kq{NSwT+`zD^tw0YOc1oCbdZ` zQjI#+`BG{5jphnf6Kav_VAvo6+S}6=Dy@K2VlmsUSR zT8F*YJ)Dy>K;$ zOJ@#iSD{dKX0TPOTAfBwQqWbVDuB)pmsD&O6p+f`m^de?=1@m_S}3BEF5pL~(P(FY zH)bS_yyJ9aYQyy{TPINIM`@GokebCnnIv-q5<72x-guF|A?ls3qtY&x)POYgG6V<` zlo&f&ePe$3gzx4_O(vDBL#~>SzBX=s)usU=dQ5Gx#K7YnbG4d(M!M^YkKl}f%m4rY zq02LP^YcCN2GdihQQZKFR}_gskX3;th9E#2W3a~=ou?+1NIqa{NZ@fGu!0Df`I83* zaT=|?Z!PDvmr(xznoNV{zMg$e{Kgs#wP|OJDhf!I1QJhT0qrv$cKn__eFHhBQ6lvz zB<^gXBd1}t?=!SAX;V${hM15+a5a7A!0r3*7crN3`h4p9cQN`qrOb=~v!8!*M3Jjk zK|4~8;Q@M`i97;WvjLd=pb}@>9OqUCqnt_4^zxFRo?PE5RlKWMJulzj0Xqrm3r^}) zCr{)_=TEzn<%4n3iGlwBPnJ1%((Sh1agn-$K>i_@9=1@aWmC0nj& z^F)Eup#J;f9r&|-RT&0I$XH8C%~=pep@^oJq&)_NW%twQ);`DpDY)E@c7f-cpMnF4G?yMB8P@ zD10eukfjugoVnnVl6~cJk+32=eRdaxibHMjCy5-21R|1@6U`(TY#Fij{cVYVsj9^% zg>2C+k?&BbN$5&skv^oK-1IkIP~9)YNtP~b5m?|BH?6KjAqHyCL0ppBc2kGoqJ!VGK`xlqpNz5SF}USw(6Th=pXw;f&!zl1QC2vO=hWa<(0Wn zb7@Mg@f~*hNyk9GGyE}D@%n=)%yPW>yt2P1Wni-Md7FI@ecOH&4u&K16q&8O81a8k zS31oi8_bzPh)UQd;z;lG@4n*|&a$aO?VbF(Zt5KEBh~?B5=;pOK?5<&#*IRaz z>WqzzKCTYd($(d9s*b3ds<$ZAl~XCkiupp?Qe-HkfOZ0HS#J1g;{#;2yq)O-epMTE z1JC;WafL62UM)KE66F)kHdP8GDmQa><2sw``&qnle+))Wc<-oxha!+r{oW~nG@-9#8&TxA z_G6Ti4DW~~sCE8rssNhb$Rcv#}l zacC57DFl$(z$ch_kOWNi{{TAM@SDZrNffF*MDtDhA5ZD&gsOFGawBk?4xcSm0dFyut!6&+g$Mz_IsL1prUH6?lsPM^3}x+Z*Y;9q~oyS#qkCe#k8OI*qkRRjh;(C7j42c%BD%jP}sKO6p}vYZ{?o1L??YWb$xwLG78;?C>u7 zT%zPrQAueQm<9ld=m_l}*As)p{%~~X2C6eetzlGEw9htY{(~`Yx9j}|8E*-k8qPEp zPEKb^O-g{}l>Y$T$3s2wF1VS)9KVYEKFqXMbo-PIW(gd%O#)nD)DLlBUSRG#`c3o; zXQ_KoTv9u!C6y{l(n7P-rW6s03ZxKB4Z}GGG@V;!x3v0q0-Z)IT!24=3HfmRy7>veHN?yw6C6{{V?!XWnU&I{GqQ zS@+V}B?*0>W>%ZU`9LNFe0~^??)Wg`FjJhhjjaeKNCxq13*Ykd+Z8*Gr}VXItxJND zQK^Ikjf@$XK=wVO?hkEwdR_HZMoUGg83S)njk-WHGBezX=LU5wXnxjz7g=7p)LcW$ z__vu->RnfqHIixyhNLl>P_h!1lJ!5d_G1D7=^E2WD zWF^Y9f~x}t+Z*j~&&c7Mb(tiZ^)MGY5K_i`jNdwYBZb*zo zcIP5i@N4a7@rA&xHJIsb0me+)pCZg1si}60F(WV(wKZg^_vn{UwJMp%7NVl2&DHN4 z$t|Xy`$T+7X-!qGb*@##oc)aVi4@M#YZ|3ht!$T!-Adl0R+a&j zEE&qMfdYL*k8lj*ofY~W^3&Y*qMad@ZR#Wf4t+$JgOH|pAnMk1bE-K5oQskCCE|Hx z8&ax%1IzWjCGjVW8J>*Qb*^c=>c1(@a*an_TSu5szP2jqDp2~$TxG_{QWlZ{3Ks_# zsiraqXy{bWv`9l#%4KO$k7|WBQnZ0{Fi*#9R{sDSd=6Zy>Hn z2ubWo8JLKkWACV?TlS22ud1e19Y=^BB`t+CrWD!KHAOBoQczn^>XMVnK|5Or9V_E! zkGc`e!R;%?J#~_=HB+mt`<8iDkow*{&aG)u)R}PIWg#S!I5^I{66fvII4CpZyxfx7 zRykG5I+8kx>+B=bpH6Eo}{XAROi}Y_Rb_2h>;>YPMi*l)EvOJ zjer;|fRUK)0VE7TIPV%rRrrP1*`BC6&c9pgDxFpBOX<(u&1#jJCE$63iK`9=QbL4) z2p(8*wI7XMJL`On8edp(e_iLSw^(aDO5VrZpIzRvbxr=tWT|a|8Q1X&L zh?JRwBEk;cBzL|x)Oaq`?ei$+WobycNIbLGkH*QE1fC(fI*FQb46JQ^d43jN zexpcHD6g5cB_$$Y$O1*gkrtm!S6+?qXR1X*nV4`?H%O!@_ZC7z5L6<>-g*J@#jbE$ zMbzmmhcBi}K(^CqOOgyJKmbgG{yfBtS$sEn=Tp3*tnT%mlc|FQD;>p;Wr6{Lz~pC0 zRr%ZnqYBEYyfl&kB!Ed15(nM~8jAihbpu*kh?xd*vRZXn6OANnR1|;;f$B$J zFDv2%X1*i%jZ>xSIDU23qB<2-YpF(;R$%I~WW2K_#L_5~B}8sg1;#Fak9-2r{AtVS zsU;r6uwk4j2H>HF#{MIjN=@cGnd1obplS? zU_t_aGT;Lp%mO=P82Hn3lyS3HY4)=QGEG^Z-z7F6&?&VBT7P(n}wo4Q5^}GJMDu0)!Z6tDamdOZjm^Ml41-N zfMQ1;UWwFZew^Ty!>j^Kl1L0-panv7;ujlhO=rQdlgH1r~TPb%k0R>@2ORy3D08yR4b{HY*jOI6;%wU*l z03T2%kPN{;F+7bFbZhWn+sJM~sIW+b*!+S=KdwWg;TtepdCMs0S!@7GMBEd&1HS(N z)^TB6dUZpB`Q=Jb9776e#R6`Wi6p4Z+AMA9IFH^Rcn@2na|Js3lJH<930q*BCI>XZ zkYLAQ^qkr5i^_FAn6A^g<4bcd%&E%{rL)SYQb-C<{v?t}>oIY*H9rp5H#U~67@|<1 z^xmdPU`0Uy7=ob84}dttRcmu<)l#Vfqtz@GP8DDRTba%|Jm*x0o%n{;+Ip)hsnL3y zJ<}DLYbkB2%$G8$pnU`gKK(n0Bv@}fJ3vfl9x6D~oYb1k&x+dewydcu_SG7bGFpn$ z_*4mg%1IV54E3e%uvgUQrbmStRij`GIl+BiR)t@>O384DyG)$ zK55R{R6!_7_j?kU+>g(;D7{v_OH0bs+^V{gxRJR)fY|_*ayNG~J-B~Er(D*hO{t)& zt~ZDxIfybaK|Fjg?WUccIqRk~ik$teYpEK~YY(>f$@9F+EX_icui_LnkJ8o3%&3ZnR);}U%DwB!_^urAy{a22 zD5z3FO~EGJ{{VK5vM?Q98MQbk{%u{N3=`|O>ue^SLBuF2;2wrLN6VTg+=%&FdSftwO{pHE$u{x6-YY z94Z7!Be>lmnJwK#Pf#kCRQu1N$6i{B*0&b0r4=m6Q6$MGNj-36pA34jVJ(-yDp2KA z9=#-9XKlSk9o`=JZq#{RWk>B?=TaR?)T2EJBm@3qrKb*UdWBD{w|_8@mFYZ5%K`{# zE(#Z&Y!5F%QUu4QtH6_`wf;-vXHwZ zL;@!LBhm@P#p5bYeYP}mdC zt3MsM6R5{gNVOGkrD+B9_S(WCIfEe25reAA;tDx4Mma!IzVL!$pbH;6>_P1vu*BCm zTH^j%QjsMr9^D7;U`6KmkUT^H*Rtp#GWtOV#CyZfw%?xEk2&!z@n0xdHd1N9F&D7! z2jklr$BvYm#1IKuj$tp3zg@kIc8j*bMDa655ziCwm(c$hL}+m8CuK_=TaGv z0f$k&?c3>#Euhc&XlT>Un^IGa`!a!!Ub3nw)VPrZu$d%qTM)R{L3Ijc*58u5Nd;7y z+z{p`^q=_+FoHmJqDX1_tsE%y0AalZnNh zg4TPOtf&^vLgXFB-vibMmqUmz;`QdyN2WcJ?ySOoS2psSPs0{Z38AUuD+QJWbxM#V z7$T#PN5&`Ech+g*XB7M$)O(icN;e6CG}1$SkL|{FQQ30J_0JWbQm2(v?SOX>K#qnC zL_qxUEp@$Pi14*oKnX~t30e)5uXgZ!`VenESclmX%eteAju|RmV#{h&Se{{I?_dV| ze629Jyc)|qC_b`MpJ_)RZ`{&+BT zmUIPG>zxcw{62|yP%)AOS-D_;Lyzgsx$NT>fXH~8kk@2+t7s*~sZ`4;1hVK+C{R8} zrV?5^DdN6|(-gXIO*xe3RQY>hs%lEtlG?dIAv}%~YXCWB-8x~#&FYAG&t|f&WvI#9 zb7|O4z|Zx znFJp3oasxV;<2km&@-zm23_jHKpv1(?htmFf!rMtJDYfqt#!&}XiYwr)E0v3vsU>* zg9De^TpuGAkY@~Tf0X!%HPt`*6On_?r4#q&)QAMY1gm| {k6u4LLtRZHPS$X~W{ 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�e|ki;Ng88utzOU&^DEajV_ zbl?$vr=I7}uR())E+cCi*2BYz0KGs$zZn||Nrf_|hdBmdgUm!opF?4AF%3@9h*cGB z>M@^F&fH;#N4*v3=wP=Mb)Na*R8MLmZeej1LIa46crUKaj{sZJ=w`dXj zp18>@nMnx%Oq*_Rx$Zpi6cMSoi%_D5_?@NzQ3bDRkU4>w1oV$Pk=vo&E@i}L3XrZO z=|ys+kV4V{RqPCR`u5ub_7w;LKvOVSJt7)AfGQG692FkGPh^i*w}a`tP#`OP9mxmN zIQ`c#j^zE$uLHn_p~y7;o#T6X&SgQDIhbhLrYM`Lc?_9{Iq53Dhm-HImidQ zw9K2{Z7MGfej+mtCw~^oHA-n2&T_?qiiQXXt8D)OyOhK%P4@)#7sD&NiZlfqRt&XW z7{dV5kV{A=4h({L)7xvhSF-e)pn#}R>Af~3R!LQLQ<>wjp8A+5pKKvVmzwiz6d8`7 zo`&5z2>lKion^$mZsxtH(OMFroUNRykk;q9qwlS>Fw9Cz#i^=jZe*w&Ch{7StAVt7 zn{i#cK+NEKUPe^Pa&9!}Z1+27N#t2_S5m^4mFItZWlk97H3?g*OMJ%s))HWL!gs`u zSy!9oI=%eADbc2pN_MFkr4FGhuX&-&LeokgQdFf4&=cO<m;$8Uhfja$aH z&u4#Z)}$rV)pElA(|Qv@X%JM>04UlZpi|CFYMeSUrPY*@dc`#K#b!n zOc^}Q!jyNBXg{Zx_}V!4s@z!#&N6VT5zLVh(0&moc>KHNg5GL?wP_sw?0J-lg9Z<% zP9#K3$jQ~;>#0)`MNq~k{Jm(v>;hzC{+gQ503fDpK_pwZ%g#YKR_H93F3oXSz^61%le5!q7_C(3G#FMea5T@gftzw~-ROa~-&`MkiKm{@nHzLGt zWA)n#hj`Jdvl^jOPn>D01t}?nrV@ZavY;dslK`JPfnf@ZDvWBKsp-Kctuv2d>L3Wn znI?2Y)h)q@u2M7miu3u1Ao>gtXP;xPm2{U3vcC?z4dcF7U#qeV-zn8OV=B`1^i|9{ z_GX6~N~hQ%T*y*(DUJMqnqNW^YF#ND#Jb{wy;Ml@h#>Flz98nT@qfgvF4}0Tb9!w0 zfsz90MN{rm`w&Ei(xOnGcWAfE5|@VjL(6s6p3Aij65DN6%q4GANGf5%A;$ND0;W0< zZ!9ypxTQ*{v#05LDr&lzZ_Z>5${?u08J~Q_xuH;2ho1Z3v}KYcnW zauEd}lo=g%xV`o}kDOv_@e-}QW8q&#S5O)>Rq5)tDYHDjiPq4hAutg8)ZsxvN*7Xq z_pV4HVhmMgOl9;nRj(3Sr(xIE%W@Kg6_5v?>Mt0NYvN}Ys`O@{*HkZ2Y3&0`m^(vE z-FxaoxsuyaPdjwvl)8%!auaD!TugLMu}i0m`&zV~x9wXR_I`#4>cvG-QA_^-3T>7W zB|#ZFVb$%Dpt87XzFXN{)2@V5YJ#sc%`&PB0KxwNI3AM(#-4Ssr({Ssx=4c^J!A4W zw*Gz1CA5V=>Lh$4%YX853s~_%R_ID@@}9kGB;Ol}4VA9&%4T2n)F2?Sr@i1d}IjNavHD+O~ff+9OzLzAI)G znvXrD)cJ09qnK&z?vkOm>FP4a&$XvYeVUY()PyJk*)|~JIZ!r$+hs-~$JeF18%Xju zH<(9~c)ZnlzO2c##=QRkoXa0rrJ<`eZakVbmYYyHXECgaVq>|XY@*_ z(OP<$RF#iq83hv$*EZrEsSXAZ9A(!NJlv`T3Alr_nXhgs@f>i^POCqrY08TK0BV+K zS!HA?RSGbY6q}?;6CXJXN&m`p2&5MuxBf$q||8k)J#@XDca;RZi4C@3R*(J z_fEt~1cC{%bl$N>)28))ndLj(-%+=6>O)hZZ9<`UETv2aZK@cNw}A&x_w*O*`fdG6 zqMF+Z>rQ||TCHlU2Oxq9s+uU@m$1d8!5t5mrSWa0H_^^ehAo)>BkHh5a#bq<3WPH|n7|_ksRPh zW2v32bT)OPGun+mpVJB~%7Ncz`v_WH2~gaj#2!^Au^aR_EkX7?s0yB8&~5qrLBk2d zZxA(nP0T8(bvvq7e#9wNPQ0hS@`Kl%!c<5$GrsfL`Y)iKWQ3_PFnxS)f zLcF~RD6O=HU9FGxEMS8f`wc!W%!**JF_Fac@c<6SIg_j$<@dSC1emwetj}Bma3x!( znJL~u_lHAyCO>^n6KrN$qg8PmBjL7;%jxPfT-9xtYATciETzQ&lMw|#8v)zpB=wH~ zHC~Q$_-1RVGNvnM41iBBQR{43I!A^&zg(wMuS~TyQ4nt`RbcvL zDP~Z_5;6(NBay1-Rq;R)HpV*)S&G+o3C* zG2-B}dA68vUzDjqCvCb|{{VP_iK?Cg@f8pwrPnOY!ue!KJe{wZ5DEQt8a#jD$^QV} zDilhCNRzl8@IIfvJ%%>_ z0K;B3rDNID=~X6feW3H3lNhywEw5`R);+FL^KV~PAX%Ior%sZ)~FX6Z{$ zQn~FHT0N*OLWxp@#3yO*80TJ}N_e5kkoy@WenibP${g*}*C~WJp>&m@DgdZ-F@F89 ztxt?rlH-rLMVKW?+KbdA&FA{MaChx-~2)w)Oeo&B0WV zK)Ch6h^%mf&OOm71Rd^gBdF`st|>LC?76D7X|)zsAf-hp%aMjm6)BJb6FK+QsVb#Z zT8hf_nN`uzfmTxx!U+rvO#5e(qTI`wD0DbEeZ>F;=dt+WHD`#7=!v&7#f{`nKelkmTn!p1h|@Qmz{1eKZI1n=JdcZ>Dj8?1yjS0GQRD+O^Z7HKrG zk&KW4oaQ^}_fB9gsItgDZ88a&fWQd$1d?z^&X_$cP@X5$AjnCqRQeTKJioQ^G?Lvv zDt*bYyq?~egqa$>pA;Ve82jNTtjYL(cH0v%E{;^~uyE$v(S}s#39~{!5AfQKdsrj|6Zv^ZTyi&-)a3_{4KQRGCU%MQ{c*VXFagtiSW75l)w+09Kbe8IKwx|mGx9z4hxIbTzlLH; zo|n`KXe1$8wMYj5L4)6r4uJ7DoMpM6Du^D@b3UftzGTO1Vi~#u>J(fe${=VCH| z-XbwE_@_U@^ACHMnbqEAAdx3&{`iJ(l&R$+=CGW=i9ciT3U7FgmV?5#Y8|IBWsS^cJxj0 zX^Lkw3+}s8s%L1LcBYlYD5YNAC@?vJ1v?0cGH{?uRurUj5@g(1kB^}FVYcJFOU!WP zVWsk@q0pjC$Ozc~0ABctqM^2iI0P5~01Sc&jP{?2?r>x-rD;`VX#f!sw3dSqGbDTW z`{Pu_s4J?f^Zd!`nwM%FT~nn_I^vvKhcdTP%8YiCKP(qEvg-K~zy0K$&q6hb{+7qoM3>S^f^I$H1OYyK@3rH6P}pvES=cNC2o1cQTNZ%^`Ka*>~aN!w(qvMZ^9fab~NHTC+CKlb37m7w8sEMs~uS zbqJj1PvWQ6lDq_G~Qo`EOjT^f3YArKG7PA_t)Rn`3#9>M*?R6?s zXx!eW3__8l9-Dnk6Ip1P2h<7&RU%A!ytlywWUvNA4SDvycscOb;ipRQyHfCygE8U$ zv($lK$9Q*NTDsS%C`wYQddC+4Hu*{Zdt%5`pczb>9&a~OW8PbePm+ivnc5Ej08gnB z{{Y3;+6Bh{02$5YU-5xC6@6w*wL3|f&}GS`uOUE69egTQf+yWJo|X{;S5{KAq?IKk zfIztKZ!Iq^?D+W8HY$`zJA$jdTCrQ*$)s%q;aLByUc?lG zC%5m^!rm!&W{%{2K!%1KEI1Xzg#5+ls_#IDfqB}k_(6D715n}N&M zbNjz+LXI`5N#Z`faf>#Lxq#u5u>@Q8emJvQ*LSw2=l&q4a8=6slnNCjoSEPsu;+;< zQeCwIleQ{Sk^wmt5R)PXPCeoe#-bfl>r?J8n5&s;=2XgwCP|-P*uZAncBRCI%9N!Z zRG~6SJ)+av_ze9>3S1|386@x20o(U{Y^SMPOGB-=P_*1dh%vbAdSB1W6@M_20VTIc zCmVp~a6ljtARcGiMIgpR%m6|7_~#h@)1hl^#*|R5WGN)34&aE9AJ*p{B)B0&ksfCL zeKy#~e=9ni72#H=6fW>zI9KNWvi@TB{FJiR6mF`nEBV6KSL3xW`UVC{l?5F>*;ja55u6_o;3Jo%5rNA|$9RXh_Mz)bskY-HS3AcOvBVp%-ZLXS)!BA9+ zw$&7ta>YSlLrMN6+6X+3B=Mx^ps8M%7$KwDRe+fTnOt_`R)<|)s=Yax`(w%%m%f#r ziAg|7bG4F5K7-c~i^K+MXf!UB)0sZ5{yCCzIaK3R#Z0u#O4L;24>Mp~X+)%`k9ZQR zb0`UyP`+&~n-Bp%!>WV}8#buxZ(r+r%h!)7-8Gh>ZKMR%)61%=M1W(+oydSb z1E3$=>`9Ujy>NdC^s(>p?d5<)JgVQVfVn-zzA@hdStKYbU<;Y)J^enBe>#Aw#-ft^ z10leOUPSxO?s<&p=K=r#@&pN-XE8B@s|ou!{1a#1Is8Io{4Axbe<{+mG|uOm*FJ0# za?FN|DawT*M1YsvN)(2Iia=2W`=Ek_@x8*181Os9Cb!|22=na6J<_^Xxy-Q@*@J~| zs;Zop-vwbx3jt{+XRgB2bf5V)JVw#^4;nb*!~D(4I(=QlJ{sn_1z1F@qo7+E%Vr~FBAk0{iX)ik-iF1pWAQr$>eUXxnkLX;N-r9<$m zVlD~9qNOG2HR`ZqUZvd>rp3yHr?R6vKs=XNmdprKnbKt$ThvZzf~nZcWWWQ45J=#E zSlRc7pno+|I~4*)s6V~&@~i3)2=>l-j%8cx*ZklT)TGV8x5N6*`(FXM`IaVmxxNwm z^WUW35#DV@1-!=*g(cYfq>^*)a7=$l(ZEpyGn4sXOyraHIOF?hw>-=jL73$giFHBN zs+n?0GM{`OboTEP^O&^`5$f8U%TML5t>Ut#TTd}m*d-#y`_0dI?~1 z2Rt&8VC2S@x26lWNL`J&M4iTcB%aal?H|ChT7sTM=FR)S+!U#@4dg&E zzo8vO8SxLC=Q)mVm(W(`&sNf9lx@;dG*)>SZM1-tgaQD8)D56)1WXP)Ry#wZa;nO8 zkm55scwa%xq)hdl`wyldHx(A`R&vwJa($&UOCS;lF-ZCK@3t%*R-*kK#?@u6>p+)Q z+DaB-vSW!~%L03YoiHGMSoMDF(y8eH5DK#TyTQr!>@?IgV8Y6Y5-d*O9q;~pvAHDk zSduT+@O;VKe$E3H*4u?AVkSZT$I8};wC`?n>o1Of(60t|M~{byF;_FH%~;O~x&LB!4r>b(B|HPc*J{{Tx>=e#ekrgk#= zy80GY;(PcY`4;%oDbyd%|o3gUjR;eM}S+D!9EXH~gPVipvhf4aQ3 zlJa?=lsc4!B*Y$Rwk==(04MuTY8=Py1<-nzEN-DW9+1lOJl|ASpe;0%xoR6qiK}!% z5`*m409lWFy^B%y%xi5Uu6%WIdppt#r+R?qi>7`0PETU>Q!83rSSYbFE@YXp>502* zRk-Na*Mt-{mlo=kL1h(1eZi=V?JU2XcK{!G(jYIG>w-3{$)8aq5Iv<}k&Xf6#;TmY zq}(WgcawA8;P3F8`QSRL7D|C}R{}lb5%c*C=X?frY7$1i;5Bd6(XT8@^^msd){oN%bElqi#Pa0%Z1d;b7TQ-)OHo7EY6fRLoTgX!;& z({H9NlZUJO)>)UhU=YJx!>K%?{)f24_e8s_?37CoDcnh5a>&%wlwwJdB49)V$8C61 zU*8fA&7pt=qGXAVGoIssPBh@~uC3~C5VVzag>5{=3r@E34=R#V%4G&*d^^Cs@gsPt zsdGHTP}MtASnIA85T&hZQjPk_C#TLmF&A_VVWRO1m9YSQ>n{mN8%Mh_+TLK_*AM3r zAzAfUBb7;6>u5Il_VwwGwEQ^q^h&`=5peK$EDlPD06^V=gEQPn!+c^1@eOol^coiC z7!nC6K!d;_a!4fP05K_M^J=7s54b1)01+mBcKP*-^cc=zm_D>L(%*H}kP?Q7ND(@)C0Y-5_qqYt43>$ zMUrGy)%k`+mgZFqW%-iXsBJYA$aO)rmAHhaN$LkuSv}{sX$hyZg*0$8)J1P^4EOHBm#K* z9a^qBCr$m7kLFqbD!uYrrJbIy#A3x^>_4kBG+P zYD~pMlT_?Uuu`L_0w;gps%^&$hQpHfw@)F`2Y&I|GHl$BDfwdX)oQ4n#H6b>1dS% z#?8vRg7?V>9`b#(x2kzQ&2UxtOabY+zn&w;pe0$~0Xm(tJ8oz& zDq^KDpz-;}IpgdxlRA$1PrJnmp5mkuJ|pvv-xh4s^A0IhkOUW# zGwKHS-+OH^ceJ%bNaRh&;ZI*7=07ZRZ;E`g`#p|FlTZM_7=~W*2|bV4bI!J}1PY9L z*3~3^a+&5!A(QC@8Ht(V2ix@y@%fb1XFMp*=&2B;zUE0@rqY{|q%`V)5qY=lV~Rc# zyH)=HA9LC&ps`a&N0_11xDPT49H>tzouilO)W$ow@f}XxWe#0P>I03`vry8|s3}qw zm87JD+#ilPXycEAjN65Lb<{jq$=IDGp3qhMPiGvowRHv66hHz2E>HJ3ws?Q83oj9M z4v|!qPNQ>V^jcsVwAPT=LBT9Cyi5^1Yd*N?Z(qaRGpZu)7Phz4YQUBX)hd*4g_#8K z2^?oobBg6dDXdZI^7ic~w_$(ph;jpJtOaUXTMCsCc@w_-{WjWhFu1T>PE}NeCwCS> zJw%(|;WO)qXyGWRDz%htHWFiQ@dxI1#_`vL-3`DjQl>V503aqt2#Aki?~P`?2+g4< z3+GfI0g(;IKJ)(oQ5qPvAx|wV5|Bv=Q5Pe*oupf&@953=ima!j;lt*w)V6@zi3=zF z@=FmQvc+w^wK`H{on_sVxj+eL4HN0QYZSglo*6EjPT%vK=cAllXmYx7|lif37 zFWB_N87)a!>7iy+FrB6w8@=!ZNS?-ZFK|4{TR>whBWU#)B4BVw+>e}Uj8{;f;x!5? zlqvTO{MKOg5gj^r>4QW#l0+)RiH_gCo8N3b+LOYjw#e$-O)hCmnuHZXc}r^|Oe>-0 zi0OYwhW5XLyia9>u}_yahfuW=_$C&TY?3GBet4jpnrh4{kT$bQuxalr5KOLcdDHPi zy9FYPg)jgrV2*G&X%WFVk8G5tvy`PRsDP0mb8YqB-8{Y`{`!{$I=O-V;wF5}$^F3W z2mTN7a1xV9*d`#{PV?v2^2XozJ;oNuPu$x*V3W4@C-oD)*1-L8Z7M2~4hV-hJa+9o zo&eH@-r$%P)kuI_Xgmx?eW2rs;x)Wgv;iFVI}WkhdceO~w)if2#41!R20`yVe7m3N zw$<>Xi^)IyEp1$;@J+5Q=1*`u@EOh(%++&~5a z#t9?&j>AAGTmUA8SOaO4X~>X0=O4>NxxHFV6+>i|0+mUgvA=n>`~1!bxDJrMBs5bz zqMAf^JSxwEgZnyB~d4P_4!Qghfjc971cRbtY8q5$L6>OcS)CP;!EzJkYcEyQlrre}q zkPxJ)DG5-E5CnR8e5bgF-XnZFYCUnOoz{9^GG&#$OdGDCe3XYvW8G2+B2RJNBY4HZ zQmwa7rp-^yBAs36Cvu^t>PaREfI|`7V4v%?-LHlsNzf!GNoAFaE3_Aqfyd#Wk4mfIj4?t_CcB75d|G0u#()y@SP#K-^? zW82?6{CoYS^YGiLo6`Jg;r@62uXl&&%k>=vL%O|`7hcGkL!;VPGT0!kZ6p;XAcCS| zM@!NBVLsB%9r%&qR|>cd!_8TkaVZ)So}K*nU*?DnRA)JY8bEd4P)H?eO#85u?2#56 z;3I~dRk0Z=lDmK;{^PGs_}-oy@mu}bIVKPLi9TcMcN4#+B<=h`Le|pa*;N^RQ*1K)pLad=IpeX=1a|av<=QF{90?kuSrd%+gc=PS~9-I2% zQKRy_t31pNE@f0GsnF8gQ>i1EkSCPSN$L%}@Q42ZhTK*%Q<9Ycs4z^(pDn@t-yaPF z#j1A+MoQ{Q5hyD2wYqxsoJY~>7S!qoa)pbW&!gW5DcMPd)`D)2!4 z+a7y^82A*TbpdG%a_ZvCOi?)IR+ih*1g+xV0!Yq+S%6yl>JhF>&g3 zo`+77gomT#mt1*lTA5aWFb={Dfd+k}Oe&$RU0DHlR%V3+h#-R_>}7wLn2kr)$R_Fp zo1_E3VJFkK=YbM7F+2K4`R&qefRE^oB2u_eaypVwqa_I>5)SqqcDJTAr%7=QX4w@{ zCuu^w_qDc}JNjHw8t#g+qco_U!177^N9aKJ7}COpMxWid!7vqs$3JiT#-0ukadTX7 zM_uF`M&ZtRRj2h{oULxVEX-)#TWf9B)D_C2k~!N{LeNPHOod1!VO8P}#0IhPAH+=0 ziQ4$kFIHy=Xy+A_G{~hzbM2>>?=G~DbiS|&aeJ$+@g9|=c!-FMlBkh#IThEjj=ocW zF?@g0d_-3|jzv=!pLIh204|>i!;jkNv>Mn~+d`u&GB5-Zl0n@Bi9N?8W=4$ED**tdhgWYuX=wVPCWZRzW@T;UUaNP{&FLgxTu7>F4W@?%9bYT{|U!N%5{ z$sG3mduczZ)Q1H%rD=H(L6Nxn_xj?*{5-T*rs%=gg!3pxtT+A7#}Ew~Cs}4S6z#o~ z)FGrgl1Xh`#K`N*{$}^y&iDpb3%(I{piXH8E04n{{Sc~IXruQnmXfpX|^l${YJ+c(%~y4#l?>{(b!Fd+t(UZq;`h z-WvR4af`ycdcbg(I%6bzT4j!98P#8~O6r$L;tORBJ!Q86Mmb0XsFNoV<5KFp*H!0P zj-byg90Dp1KPz#@MEApFNmZhkh# zCrN9dkVZ>YbJZ)kzm@#GeDLAA)l+JgEnJIAbsnnGSPSMh8QUJWhyr-X8V@F<$CTco z1cYKpo^hN`3GIyxanZ{YGjKnDvGR~b%h-tm-9Yk^cRs(<87E6?WRh2s*4RV@sy#mr z-Z)@GC7WWfjTo-#iF z03EgNTMN(f^(Y>HYKw~l?+86UV1H|5;d%$~Y_<@huVB~*srNPqtiX&dBm#2&$Uk&tzzwJPtG1wA{#1i_q05HklE_x3j7{Q&;}kJ(*iLugp1%H%0T z0+K>RfOp$?-rlbl5fp=-)wl@dQ-;9ba}m9x`{F2ZPb16{57s^n*6aGwNx*t zrMiYUojd)ZBdH`%CA|G>b0OBF`z83WAoH1nzf&NVHF;I#a@aJMj01>}z!X zt#a0t+N#y0??$W9tcH--w=3Ps&!th*LG<}trJBN(L2uG=Udiz}uiIC%e?_`ewYi{M zrY zgDHcWiVTC;dv-Gf2$QQR)B3|wX@^~ZPUm@+OykH?FE1~vc9~8#t0@k9H7A`XsEZ5{ z*X9q`RJm7IQsqrc&K17<%PVokD(X^}Zb_LW{!@zo07r^#Q6MWt)fh8kq3dn-1N6YQ zd{*Zi@lm6y#Kgc<+sNP7Zs*DEAH^R6dYL-)l`>;-D(deM$SLXrFndf6HR`?(@hj0) zG#a9#`cut2Qe)JMxPT=@fd`qvI-Lqw6FYP_+=375^7(CPz>q|Md1C!z^zYjcg})WA z60dEf>%bQfl@KGLv7b}^H~#?VT+)(4bk1NG2Fgl>&cNE&^6$R*dY_422PnY!hQx>L zYA}dB`D8f(PWOPap!hVS_wo0ndFixqe9NyhC=SC{P^XYE*l?q9ApX zwfg+#Nv4#*x!88?>x8CBlY0!o`sZ7_&{DMtFaVODFWg%Teq?{vul_`1kbFyhUgr4H zqQHw?)YxRGV#JU?mT`#JOL$YIe$TP1S*iN3s`>u_l#{fm+A)}ej@j?dzgC_CD1#Nw>HVAb>R zs-&Q&m2Xc;2_k+ox9N*T6%XU<0XhAlV*qjn+FAFBo-?e@*VEuS%m5?lF99=aBZ=)X$<`;( zLHZ!fyHA||0I#T-!H670;y+y&w^CA+rAp>V=$V2p4^F?ioGCQcL78ft=8q-HDcgFx zFj#JxE;yFkl@LAUEQEpTMDI9kLf<^91caFu>)h@1>~|N!w<^r4a@@lvs&1j`MKM=Q z;-6*3G~y5)L0`O*4#1e6k+vFHB?`ARXxmu{wPz2gGR)?)G0XFvJ6D(@g10it$F>wNg(WXG;2hrbVnf#>_D(Z8#s;C*#BPPtV1xnnbs(PHXr8=b<04-9ZGikl>nc}|_ICsO|9wScV zInG(Ft7|nYx$+o*^(tF+z~WnU88DDwi^=rHr+fHk;F^~GPV>%0Y7XuzeOf&`eTi=9 zm8hh(V{ztGou*_$2?tc$KNR?+Rq58%Xw+j+g&=;OcRQkO{HBfCLfX{#DpcZK1t6t7#DtR;-g-nAblUj}fJuP_ zMaUNIVLL}|*qt0j@fVwM8%!NDnPhoG6su_AmN^K zsk2%vr!J&Q>g%c)rfxvx=Y3%aB#nfhc>3*WUcE}vSIm_Ag!`sJm_Mc*-V$f1$u-8D zs;PAp^eN7A_13)TvsCTWAh@~Q1f)rghpsCN;m(~>rqe}`v5XcCGu*_SA92CwQv<5q zV0nPf&}Bf7K2H&zGnn?)jaT4nj9OP(X^jt=WmNwF#C2m0RAluD9Mn&HMv~{V_R#@p z3KE%+Vg>Nf=6p8I_<5^yT{Wm_Tc^#kdZp3Tp$U|S5J(^xh%jL8d*h)R9}!$2)EsQ2 z(|Wr*ps3UNZ50k@r1dyjd2-y%s#enNGM?QnIHZ)6%mZW4ih%JYndQ0P8#UHtl~plW zK~xZA=dpj0N)Jwj{gx$ojA%hOjxc38qbEdLV5t;o~&Ynv;Th--Wq`qRa9O^ERma z#TxS`Qq?n~-nTlS1AFR zCgCgEpDWDX%5$n`bDFA0QtcxQ2U4Y#s1lNxOdjB$fZb=rjuyS7_=lCg)}5@&X&Ir* z@=6+NMiW-}X|yHUmL3TT=2%IE17blqn!5ZU=#^{Sd3TiUJewBRM)}?gUU-h}5FhZc^Uey+}c3R}5rt41=zTw@yHM#Itsx@k znkS|Kdj%ySMFRFG&(3=EpH7&vPXT(@O64?MPSAP2Z%3wc-EEOMN2l}3)g^|StPS#^ zl~fol1*k;G7vH^gJS)>{Fam)a$RUF<+NNd!nP>tBxyX%79TQ7yu*yxiSVP zk_LMW>KE}R!KW8EeUiJWvkaPpHppny8?Ud(sv56qfys_qw6)AwzU6Qyed7$iN0bV5 zhT3nHML?<%7Z6Rr@4Or0?{rR|{{Vm-9^*57Q`Y$=pdpf>V zIPbGkgeVXMOwH|0j#QyFH3ppp4SnI#*ZveK#T1U?-7qAb?S+@awl)s87RuCK8BkSF zt^hDv4`bN>01){jNWW6Lxk9xnhCl%WXiO0XM|jKw?=i{Nz{ScG0#pE)pGiIY?gv|8 zWv(~}t*LS?FPlG=rTn*8t)}u?x^wMAk32$9(#mI%$ud%J-ZsKaRh6OC@+2Eek$HLn?zYy~}N_w6iR;xY84Qr`No((6NEVJzoy$S-uuW^fqhPoA( zi0&?WUFA_urE7oktO!bNRSFkcfwAhP<}d(=XgaO+uBCa>XjAGIbj?+zTngxj&rs5J zDNT|LhDxP300=3%W3@o>3xQg6=XqKj3)8F@p3IboUmA5qsYcf3 z!QQ&jnzt6}0vf(mI>i+#0Jshke9W+H9@Uvm!R=F;WOZ7Ck4)7)l;z+qt10236b%+aqjqi8~(=bqlw=7Zk;{DmN`kivV{$G*xdg!4n~l(FbXQ0V9@e zdQCv2hFj`??$h6)jlXxpwZrcV98co5UtOGNjV1hNFUsBaRnMTd(`-0)O3Kp%t>)dq z#`42y2$Yx?f<9B_FnxCOw;u$Wr$cG44t!%8uDQnBT|ymI7GGMLOxf1G=~XAZ7tAei z40+lxa{~Vz)VTRc3C_;`X&GmlZL2C(FJfoi1-h zNWf5GDsg1;gV5jNH}a2-+$TV`=~cnE^_Cl$`decTDUv2gnP3cXGGOSn@9SKkTDwb0 z1|WTj0~|>Lc@R5m+QhU{r7zrZD&_WIi6mQLG70G&aNFvg51D5zIabC^m^d0ov~j^e z`jC`=)KnTNcQV|jWj)Kv)5np#qj%|e7u=4NwiQg1!p9gf?YWFl0d8u+T(cj-_G4eF;fUyik1mUyp6yU zxsI0q01<@$0K$DZ2Q5X*Za$Jo+Y#6a0zF1fc;Lo?dZkrn{pph=D?kb{GChoAKhLvA z{*ew4+jPlV)}WLGwh2;+fRK<0B%61hn2{P^z|S0Yj!#dW)cGUXK53V_TBxO|r}j>vX)*rbB_<3gTK2XUjD&K80uLyK06O#o&u^4%ix&Gv z4oWzwle0v+8rsTyj*g!(%_x@3jpi>j%2KM5<5Cu-kW^GjCU1)E32n74#U%0*3FQ-h z>W%$BF0wZL65pe{c_E8EG;IEKW>CdDfE7uR9L`{2I@gbO13PVfyaBWTBLp150~qb` zr{{uv8)u77=ih$MS=00x4JY2J>mO^J7U0dG$OCiR+Lg{X+1$*k>}LOYOOB1vXgM|8 zAE+ftg=j4nK$OA{-GfnBiER3CB6VNsom#aXxzwmtuEi+QxALt@BBLcl4E3jPnBK9p z!xbLW5e^>H$Wc&L8+(usAf9f<*Bf8c0l(6yBGiq7P5%Ivm>#ywDlg@U{sZ02dLy#t!y7{JuHp@MWgJt5TtlFn&k}F{UJGhJuLun|I&&V2$_KU&wDGrZg)`)AM`O4XO=~vrpF3 z9sd9;;rmu!PLTj5L|%LM6W_Jt=X_N}z=8lzEv}Gco|A6@go))*)dgcv6Y5j;TmY4n`W9rV{|z7FaxA?J+XWUDQfEKNjd7n7Nh7KZd%T;N=5IIhmdao|eY1peT zHJ@f^tf9;j0=b4<)2f7ypf@M!4lVovPP>+CrbRXA&{#zxYEx#3nUEB~7$P{*C#&GAP?gEjU#n(YqsSO044$L1}Cu? z>;^gSqROMl97!@cZ2}-|x7YH-bk(6FG*XlQ09YXO04Q|-05ORdSW+2qSinB^-3`3$ z)AKlvTD^SPf{56yGvx~Wy!y@@^$gp&hAj>p#L3vedX7|sIKW}vBT3tkY7r5%BN2~L zEV4sj2oubX5cePLc%jj@hM6{)fVx#7jr0V&E;&mvu2_Jb#{r=H$;g_)TCYKm3< z=siC@kFQR+nH*!NQnI8ZD3F?kiRltV{+~{`hPi^ke1Zam8SGC>e0Lqq&N_Fj`fpwV zmZeB@leBU1KhLom#JoNnS?whM0L7?5J>;0j^7xWtK;@Ig~(@fJhT3VI~1Mr%y3LzX?esl3)ROgVc{) zH(Y*kOlbG2TXn{ijJ@thno^LV?kYzzNF(QbF{Fm0ZBymSFx)>f!WLK~fXt>zgOlDh zCwWxTpzpYVHi-rqOAvs}5josB1c^G18iQUxk!E#ya(JfgRc#xkryOJjQz^vzt1YNG z1O);C2m63$h}q3z3f06_m5GHolkCLp9{Cgd7=j+%*Q;MyD^h)`iqxW1Nh>m?6C{&) zl27T=UWo9=!EDFuN6vWHS)wwv@j{nUEYfPp6j5D|pHu^o6v!}4i6n>+d6A~oI(1qpPN3=+Y!&HJW-m@hoP4!E@XV0HO5>9p zW~2WA)!LD4Fq(cQ(fehnm8HNS9)f+Pjn9$V*TJJ1*0fU49^!UV5>d=KwHSlT(>uB!z-F!ZmE}sk5rz-ZeT)O{+S+xnQ+6 zm32m>Lq_0s$i%=rYn}>ft!-L4sW_*Qw4PvqiiHkfNVzbniQM(J4e9>?*PhA6FN#`S zN@+m^2f|c*(<-<-1MoJHj+!fcICxF)EvLLc@I|i;Ssx#`!NuIYipNFJ-y#l1ARZkoGTvoROS&Zlr+T{64C;Xo6N<4vg9 z-o0{-)$Z1vVBSe7Y+Q;(gL+L70gmB2oZu+~P$!7|RpLhv*cEK+Os6$cl1pNdVbB6Z z!i~yy{=IPG_O8iju<}u6-eyQkiI`V6LL~W5O2^c7uRTLi&f?X| zg%QlP88Lmy-?zgG9|~FG==FttIH_AGsCG{&B23yu?RfIPnZyN7x^8ckDAG3c-5zPZ zPcXZpGlB>R03;P0Z~+GgQx;bBXe!aTxv6^Fw)w8K>9CUk#Wf0cg9Hc%C!Jk|2@X0{ z&J=EB0As(O$J4GCd_LfR7x>indz)zt-!9TxM^Cyb9L_TX{L1>zc&WN{i}IojkUI-O zIAyf0dyWJLRVgU}DhB4$()XMCbr!{hczew1nc)p{EL1p#Ri9KB5QTE2sP!;lo1VSS zCGBe(f|bHOL{|*{pG`po0u{MZ7|izo$2uG8F0(}{wKsPPDyUW=d$!k=G6vj<&l9F` z?+3h3ai+rftCKFVDn8NYS?5Z@Hi=0hJN4Mb@ufZwxTL1m%bZTr{N-c$hMr^y>B+Qo z@3tjF6)&ko`$q`qdCYu?{Qm$m7&2|w2omC^dXwIF@3dl7FCHD7)oCCW^LG;~8>ERN z8JX|%sN>VB;%}}BsKDDmERr)GUOsaM2O5c~@NdMg<%IDoPlG=4{_X)g?G5#gmcM)% zH{jD=dm@)Ohmft(ulvxz+t2xPBfa;q#kX)bP55Wdw9=g7&Z*CGok{nCmg%SxR?^r| zgmS{fteBA-?b8y&i9Qv)I_Z86R&g6B)cN%@m2_p?fxOLL#mdLIWwm<+FPNcr=>$O= z!9Sf<%`x=u%J4%5R>=}uJYW+f4WefwNj;r)Abn-`srCaD2r@w@3%ID{j(NmJx!*nu zxPsv1PZBixc~x?%VH@m!m+9+s9nNU{7wgtaSN{MK@&?>QLYZfgayBVaPzYC;?QW4O z3(7-_hg78Vs0k)W1b}VjkFaol`?g)j!z#ks` zXzgQkPSMn^qzIK-B6;J`ae@ew^T^d@_^RRe7I+t+{{YslYRXMxm*uXYW|R&(>WXQm z6t;QPVM$Eb2(aof!D!uSL9Dd)U!GDeDf{yXb!_v>nsGpLpo!fo+so4vXUC)N9}l{? zDZ?LiRmqw6O^p1%XB4gB%TQFWA!?ns)KN~NIYQ66IiLs|4Z3a-+Pc!bf?-^QHVO@#|1&jIUZZn(6&9mS?Ssiafrl!Yd6D?%JK@>f$}< z*n%S4$4sfmEAr6m$(DKPgNh%F0Q+4I+q+>RJfqdu+tvNS5VlMdBQ+Yp1b;-X?Mb(8=U1o>b)qnf&{1nQVdTliGVxI zb=cxyCaR-vYT*EMQIYk$_TK}VsHh<@>ZG6gjP~!;ez95dSFXg_fXC$>MEYLfCPk|UG^g4x$@SVpu8&iMkZ7NbkB_N(t(&>&_KAZX5 z1!joJZ(>V_iG-j(_q|uszC^YU=OI3^oiEODR>Oz4RiJrnR2D7-P z-@hX&ts#~WZX!yb%1JSR2gGR;Lb0k7>uZTH%x&mxBmwD?hmPX_`}MT_ zdBA#m=Hs^UKAy3R&23CUbzqpEc>0gu^|3s{tPL|zNRhSGav;Pic9JIq576l5&g=rK z)T#soxBLn-oDl&)Bica&`2k71UZ>*60Ci?Vm2np;%Ib9PpnOv?o@Hy4F;JoeIu6E2 z-Yt0;Sfa5tEVAnlrN+uakfe}#lC;P%J-=rPf3*s|_H;g!eNGZt&RSYjNhJ`m1RKP4 zzxIjTG}N`#nI>A|o>PD}+Ce6L*by=1)cM|V7h3Jb)6%Hy$-0Xo%9p3+DFhe;a>|(} zB6vEKx2FDD)2QOLK!t@sfp@By^#LF>5Ib@++fSyT)DL8o)JBzs)aEtSwAp@M&{0P{ zT}y$sd6Wo%7C}9FNwLJzZ^924*~xNz^E%bpMps*$W$e}(Qu3DLZNA!ELn~C0LQ+5= zpDnh6`Lhenvketaf`q!}tI3L7CISj-TO{*$+>V_OmDOu1oWh;Fo{{>uoh)TE4W?XD zfQn{>3+#GF&$N}bdeokxC0c@*MQ{;{O-5$`lLylrECaan5vDgZ4QjNhC1 zeIu7+@YwlGxkK-A32{K~Pch%l_%NXrb+t6qjJUGxQ|(hUIf&+4%S&ko)k?o?F4dKY zETrJ>h7e;vn`l1W&jNkPeum~$o}pNU00HIEI3DL<_mL1pY8d|j=6S^BDpRU7$1t?= zqysY@J^=K;rapJU=M_}gOM073^B#pM->g{e``ny#LzH+w;O2tS+EX{tum)HKPi$ulJtCBoCG z3qx<*`{4>rzbu{%Yf@PH{YEqEmcjY7q+pY_k%oJnUt+lp5l-PoIf%Kos^Mya!IjAaf zr}Rty)j*n(kf|X;{RxwQD}6B;^md@Ftjp-!TZP2BgqxWoZO`n^7}mH7;U1&8W(l#O zs-SRLO8_#Sk~hF2VCqudlZ6!OxT{d6;_84JkWNa-3Pb=vfjAL5UT3=ZTVfK&@5Zhp>Rj_Or*gM3dBW8* zNoWNT%8o$*3A9Q1iJWVG0`TpxTC%=wrFC4|+tvwAg&MmMI7D*g7!_t_b|jI30eCvg z{9o5Pr%&ou_O=zM+m^Rlg4GN8lF0xK z%aTYCB(^h+HBE5Oj;K-;rRkCc$o7feY)wf2PkT@DRFgXjpdLK#bR0JEjprX6ac&vI1#P*0mXhFaMvQ@ zR;Ddw*>-#bl(}s~{?9T)D;&+d?K+eel(-D0M8Olj5vAc@1=aGXtxK1B)oN2fw;#gKswNkCBd5~B;y; zK!m=_-p$C1fV7Z7KD{GhflJ}{h-yVYQ%k7wb-eVK!fIB7P&X-br9;{UL>_4|g}Src z%<~gc=)H$IgZ22^Z#-fAe>3JE^G?T6%uI{#coXaO#EM{;1bpeDc%Q}S^#gS)ZG&l1^mInx#wGxr&;)`+dqnA;daE_d>QhCk8fJ$&ZCtet zwy>sMGj|$P-6}VOe~!n^R3*fSAf!iLho~}rZMCq%aobbX((62^`(=Xa6YovQ1W4Ww z_wqPbX-w(bh8jxLRvm3Wi@ZgN{UX@spBGx&bWadmblXaeR*JAyt5~a7rp&8TW5fdi zpcs?M9Gz{R9=ff6(=D!U3N6h_D)oglVNZeyRbpaDCuk){W8Y34TacFk1fu-Ao|Ck1 z1E-PO5!Y9ca}^Lj5`?I2_^b&1?GZSCUv#OJNBdHFr)eEd_qN{rg%ebqEx^)m=D zDQz%fM$#nP_dPZp>>lhsNBZEJjcWFE;3$FY(SIN|9(L=~<%7R&v0zLMul=#bJz<$T zt^Uoe{${X(1|iJACSd;nFV|gp(bQDwT{>5JTRHz5RRQoBUq@jvsS@%2cz`;NIPSn7Qv1ker(%aEm6TVEP%GdLQ$OV)2+6It8~H zT$QYXkZd4c-@jaFRw{q{N$ErmZ)`{=IoQ9`-1`o3tWw>8{5rdkW9jchK;#;y-yQz| zwz>P`BsG?{O02h5qMMD$>+KRk8~Na+WUMvdioiM#`T}L(xj+DRt?&%l8od*%rGVwD*On&1}C=^kF5PK=ju z6tYx0NKxC$-&mga{{Z0E?UK_x0r0rrh2A6Z8zkbkicNEsjx(D+5Y<6k0GC@XB6(xo zH}mT}_l2aovVGysq6zii=hTDJ_%szREDll?%78uC5C?yx?YGAij-AyiSv68AP_Is^ zZL3bYZv{h2unOu%(m_}wf)BBjV2rOxkzSL94Njm1Wk?{8Vh%x(1LOm)khD+RW1@Id z#2TE-gq|DpzK!9AtI8LWaSMjbz3no6NlfBO3*OJ2NM@lek~zoY1`fg$d_ntdG!B^I zKCI!tgwGF|Cj@`jYH{sJo6xuwROLg<=XFi2EU19HwhfbD1VG0$Z9Yg!f~55aul2S3 zyrwWQx}^XTR76}3kv+bfVqAEJr~#7Jz*JN#La&xX(MjADKz)RR`Ae&jFr*A=F-nkB z^d{tlLKX-`%Ar5R6y-sf2M{r?oH%9n;c)j*@c#fn%i1ilk~kf<^GV!VZg)d3rtSj54G1|mC&oDgO^=+wYB6v5+o`Hak9W+Z$3pKG1a zYH=;}UXo=`xZ4DK{N@5A!qmV0u9j1QFIhL*#ur;JKCZh!#(CF}dHU zAFS^&fhlm3K~V0HEIRBvUk?j=LV^sK9-wCgL_j=#v!=#Ki2^%;5!}zXf;lI?rEi3O z7PZB0GHJ|;yZM=2BdN@@5V+)16w3~B5U2zzkjRUT_rufUvx+r2?+}&4?4`j=ru1t~ z<<#_yC?SHj5)mZ`_YdJWkB%VzkJp-;Lgphj(%HRMQJ5Cg(W;|gBfNw`M=-xBlWXpJ z;5Kupb3I3x)aN+65>je&PJ023crx1aR*V1y6|1AKs6Cvg+R<|n>Ja6R;(fg)$P{Z9j#h$QM6c=Am6 zebvU~{n1@~kMHM-CGg1dlFRKCNGnkw_4kSQZP1H;hWNeT9m-GsZ<@I!K%crUHW%eL z27NZ$=ZY8b)CmvRj%O4ChhU=@^ZoCNmsn+9q>T(WTC$R}g$yG&#D0f~I3ewz0;Mu! zoz1|Lv;n{;BzuGQ&NXA1MMD1ohL+n|N=ajw4U_!#yLE{Ch4#1iiB^x%1dyUM-dzL% z{{YnJ_-`}Q6z7!%riDpKlBH9F{{Z3Il4tkV7W~tx{{Tm5z!nw;L6?GOWqsWeKXQD` zV$p8JEvan_>Y|cKpW=cK+nA0HV@xg-t*#HcNuA~hBtaie_!`rvzbGFW^7QMsmOKvDAS}dtOf-6c z?lY1;_|So#crpiQBer<#J-=OFmjD|&2f_6|camgBiS-$a>3*wCEh4d|9a4byVwy=$ zvpa|eVMn$Id~HyFs{A)-{aKh(xuWx0RIpBu3JtK7DI@t|i$OpZG3$z};fIMXD{zXP zbXqG^RZ!48d7Pkhm#IpHxr0h2DKXds^0tm9_<-VH7mGt#>I#bXTf210CAwsh*`$!2 z_O-SVIFX`gs`{#`ZC71^Tg_tXKvrUQ1R0pmu+9-{a36T647T7(?Q-}x(jY?2S7cwnkZ#$mET*vu1%?k=7+(6s%AGr7o zH{K8_2231B7*J0flkeDmpyUxJjwT2OVkZ+H1dUYJ+M?&P;ntoLGnyhVu>@bx5&m%s z_$KO}(=-y~0EA8ML;=!cZ`iPz{{U*4N#W+61_b74w@t@y-s8R@KLWxIoTLWll>h-2 z+vR&=r+-zKt4x&%N`WAmBo|`_F(bEmGBRgRt@FWAT*@~sY+9)5T4i#TN^>I|`^M6jRy?yEl| znddpwdjs_-4%7R(gA+fQL`-I9kJNY4VG2+J1k3~ZPxcr#%O8H4ww9%m68jY_y3v~l zP~ueCJHQG^p13DNr<6pH1epTS)AZbTz_wl3k95c*$_&VXzi*xfa7-%B2gyF*kVNo( zgorv`3;{mb_s{&f&U1}lHb<%JwdW4FV&50IE17E7D1V24rt|!P(NjpGk7gNmxF9Gr z5E2yNTqeYlIyS#)PN&G8)0ziO(YDP#V?{{Ii=axVjfKO{2HQL8s>V0>bJ)G*C+NU+l9Z@QN zrNu0yD3U@_NeLH{2d*S2)uB$2cVP8=rlOS9U-xO63GPngsI}S-Rz@C4+&X!^XkTC=kk(iHE^8zA%bx+@FGm1qv ziYS0ZNd)zfqx=5H5qE{vYIh;a2M+5F!Ia|d^H;IyZj=#Hh zio7Ig*Ya8uf}dT(X-n<1UA8ydUKtI)wus@)c=4MThvrw&H+D%$iGSl%5s)Alg%jT251GM26jZ4M*pOpr@*-o`sO!@kkg|o2Uf`8< z=m)2t*RC{XKuO5#d&~m|0At#Id&ZzPlEs3;l!@fPDgXj_VnK-${LZhpz}<3q1;RT0 zYsc*Jil>G;lh`?uXuQcySDs==E@IOTmHQHNn~W>vXPTq2Hv`lYU& zl-d&8WWXH&8*S9%Hucu5{{T-bORGK1m5`-D)a5Iwaa2iJ{{V7XQi>9wW7S!Vd&iQLzyikjajO7J9e=)1Y8-n3-tw+YP(>BAW7K- z1%h!P;vp=su2VY$Yy5n-`26jU8<8b2qHamtck93GZ;V!=pgD+?-V9&h3I6?HV-&6l zI}^Ng+v9${ePQe;a2g$`Mp$dLqh_~Cb; z%D;wD5MUNiO!ctoe!jlFxd-tQp{L`Xs24xHv}OJ#^BUbih#bae*vH#?@R}Crwm^cU zTL>eW1-765uVe0gwD7vHwgHj}5I{X*0O~z<*x`rONKwqX5)=;cdA$CX`eE@=Bh;ghPUxA;{k1hr zgm@-ofVG z(@FtKErEWPJ+0~agBbAStrAar@89E&FYB8ZtMvfvz>BKTRc1$+*pM5K(r3Q9@1m3Y zD#9Rtm7|QG{{UvW1$!Tu{`&n|d{%{j0m#Z`)oKKEgWtEVDKo|`KpGhh>`R1*x@<2K z`Nv#c=Zb`>T5~3k!fR9%Z)u1=pAm{W@tV@9v|B0sNiHa*a1TOb&-b((Xm%i<#IBG# zeN~$t^XP#Cw;w+J^@dSz{{U9^>mZXx^a=O#7=UN=f$gdZ<8zIgN@*vUDR3l{B>X>d zxWquJQc&{{Wmy{y40C-jL6{RIqjjd!L6-?P!TswHM(c!>Q|e+qc&H zUmZ2pg8gfPa%rUF(+~-WEHgKZSd{b z4ex#Mrqj7DWvR3LuTSMP#;-BV>Kmq~XaYf7gd`KR00@~qw!~ndZpzxzQq5KqV(uin zKv1D_S*HpHN%_>X?Nnn`w$VvuZQDYs!!r}w05jSqOiroKSNLq!nLR^^$|_l{LP-FW zkVpmrf!qrn{u74W@P~>NQ(pKO;zm=G*J=uCjI%JS%V|w+ zXOdGAYU$Vs=Td+o6jCN)_A%Q895C?Hq_r;%^W9~s^1VY%nB;}^mYHQ<%Do8$aM){ylOx{qQHx<-REelovk#PgR z^zZV;ujaaWma{76sM;;kBBj(YmyiRfY%KDJEoA{5-H(wNE;%C7R1%O*#Bz^5zI~>9 zVy1d8U00~2DA;zh4W&#mQ!V_6gha6Qw{{Z1yT#ewF01^G?^y_LvPrS0LB&K%d1Q2Jp@8N?? zi$G?2i#*G6ETxpWUz%03MNEYx0JmxulqZ<%0F(9j5OjXDj0Vuo+`_1Vk|f9(G6iNRD>d?k>?nFu?P9Btf6THZX^;2x5IVp`bSh3l$z>` zq7@~W(;z5_8%{I0;Kn&HG>*#+hNTMcRq2%|jVd!Rcpb!JILR70()7xpX|y;$2m_i7 zk~aC+ew{+AF5qbt zV5l3PhSRbAI=W|rnv*!;ZezrjMKie#BmV$(c`8@)kgzucVkfYZ9(cc7*j-n*t4F8O zdX?>HRjk`a?Wn6QQPv6AvI#N(<~0{_d2dFoI=61L=~cN}K~6l!s=-wOAmpFQaVOqL z)Nal^eCynm)imc0UUUMfQ%)5mfjbbRAl&!!!hHRsy5xQi8q^5xS225e{12C&HBx9y z<5cI&HV3E^k2UuPbtevUfstygi8*#}#K&z*fzwvE zkZx`K%9PDYG@K&UbyrZ^l$n4CmX3ME>vDe59eW_7hOZkzNm`GsyLtR$16%t@wdeq= zhBX8Lc2b9Vkt5UgFxee0+DKTXXc+rQ-b#6Bm9Z zAnl~5)A@}V&mG`Eli!eICknN-lCYYT$ua2&1Ot%9Pw78?!%muh(yeCNef}2I!6ISB z8T$A5_S+kO_vRX?0#6Gn!4@N(N2cJ-`}VQ)!$NfOK~MavDm_7MJN&xOr(8JPHQ>&7 z#O+4jp2#TjwAVO-v0A!Y?Ia^2u?LBYg~kTa$O#D9$bCULh(J)@{JW7#DIY2~U~`IfaH*ra(u z9j0f#8jlZ}Q!&b#{{Wm}#(BuPl0fD#X8!YJa_h z_r^o7u@lcugLgz+a)Ui5Y)Ab!l`}`~8g#Z(Ab^k)%nT82?g;Jh+_vMY^&8(Z`jeq3 z%F#&E0VQK>;&C8$BLL~MB?@RRDb-hGBrQ6AhyePS4s((39{N<$(y#b)%pqRQ*BU8p zz+xN#DYXDMg#@2b-wQT;UF+Qor>L~{q|#?NcP4A@^qG|tgo>J0{nm=xlMV!c3S)bW z6H>INUSWpO3UNqn0RI5g;<-hmVo3U0aB;>C5bBK`Nt8XQGS9pJ02iZ0WdejKJ51_A z(yg~3+#l_WeZ{@^&{e6^>D8(9h>Xn0Sq9($^B^6&q7;}jjOsF-dw;8@msKgFTs1>U zYHi&62IH_1ouG}uW7GE1J%4D+^sD55KxU~@Oezwh3{AqK{#^$CSn)q;QbCiTb6^Kv zRct;VGjBX4wD$nD?zzj~&2;9GIgVRS>Y8@5`E8&rAe9bfqy-QGCJ(QY4=~X#Wc8I9 zW@nQ#PghFfny6__B&jP&f+P<8r@wqvTJyy;Q7&G}qEf9ZO0`>RiA}_jDEmUR7~qmI zsa2=bYCTG6b!%3l60V8)>CENVe5e8^w1KC+A8Au0kNpD8h$iQiMh4Pt^y|{ofvtU| znR*m`riIQ(?hvm&g)<*pcf@paOj0C!xoar^bZIyGPhs>J0Y1>uhQ6v9(5T2mH`-$FaRE@n9S$icFUSDq zcSPr5C$nmSAN$1IjmgIU0R8!%lmM&!9i9RP-px_85BBsIzg$FfrYTesm1XRJItJ5t zK56Uox5ExaABU}1nrIsCB+zMORB24UukKa3f?7;6{m4qw%dh~6nCZQ+E!KQMtY+0V z@FtB(B|+VZg1bRD{{WVQ>8yYf)JZrd8zsLWATj%H&&fUG-;1vl75*d9lw^56pRLQX z+A4&;wZ4T17NDsDAVy04#E7=jI9H~x zQ0g~tadk|h5QlcsyVXpERcw$sBuE-UwK`Vg&7}0*jHp$OsRjrjl0n=tC%GmLg6d4S zHq9~we*}FDX4Ew__4Eb7?iz|!hY%GP0cuD|jixWQ914#cyiCZlsu~?tpbPnqTT0a{ zl@xCCH&T`m8%wDZ?(+nNN0{w}CY;h$Io@fPWcfmV^O)vuHpMG50ml~sDckh(j_GbQ z@b5O#nX|brcbEOsH>XHVLj^qBk9IqSO^gxei#7GPQCmZO(`nT!ZxrhKCX)zf0oZ<5 zFiNb01Ku?mYhK&yzLw&(AyT5XMMl~jDIpC=kah;ag8+en8A&_#kY=>1D0_!_h#-+} zV|k6oZM${H$oopGqyGS*?qDtfKJlNX_w)3)!fEaS@d5mW%}xG?tzJlmy}GMD>L4?@ zca}N12){H$b;DA)rLAZz;5P!XtnAe*SY?`fAk}p`RGfoTJce?b_L~khQ1a9g8c|Ap)s-lFrcYDX z0($pfKzCcHGsJL!q>J>pk0@e`Tl zEYs=t^4biw*=yRRMa7jX{lYE1y8O--yeFZnq{^vVSX)aiq!2*_^F&Ry^7_upZCk+H z`-fSb6)vmO$jd4#shO>%4kaY1my#BRej5^!2?xq5A@!l)qFbC?rkXw zf3$6Dd3AiW0V$=$Dn*4lhvnEL| z^Tgw}q}RZm2$v2q1emJlc?}`}U?BWN7}g`jD_1GgHRWB(Rc|pM9^F5_@BHbd2mb&@ zYx@s%Q*OIn{{WUgPL-nxkwD2LSo<&|p_^R(zdQ^^l%`5Z`->z+zm_D=Lj&_2Z-T$$ z58?~~w#Wk#1)CD2P66CwcN4%LIx+A+hvpzI0S>OfEDQkKreFYM%t+7^;+7Hz`dYqX zLFHBFY4tz8_^ZVt!c zKa2kWh>s*Cm{Jv`Y#2x_wQ^2mfUC@$91R0_E5l6bv6pJDX0re`7|b`TaUdQ{oXl#w zbL&sTpNSOK2%kAV@bpckFvkB{qYgT4*T{uv5s=0Fkw(Pv_?zcq(H@ zBQMPyqN&T;MNKQpY1E|x%R-1$7#5L!w(Ey$E~IXeq=48(fB*kxfE{RKQS*BZ>DXQq5;WrqNn9#YG^3ny4g%6Z}WHGcrBQ z>wB%1&|*jlH``(Rk?`wwD^`>{n2C^P2mb&i>G|z8>xbR)qS+H@HtKCXFXex(7;Rdv zOvNhL$e5X#+z!6GSc8eXwo^`+C7>`O1TU&a0fE3-iOzoLQU`M>k6|+)6FBZNAQC&q zG;c-D(=E^9_F&xFBFChkpG<8vFG+=+`=9HDHdm9UGSlrogvCQi1a#(swW3e-j1iop zGL!s{r@!>a7}m)Eu^v&QSr4HcK9&nli$l1Y$KM&AovF-T@f@9)G z>#Qo4KMrq+;x2^biSs>y?KA%XO>^(ZRj1j~@|8#{w*7xEh0geh^>q^EzYwzh4_LQ1 z_W0se@zK>KG@yV4sLi(c_no`-#6zpQ#F9^!kUb!F-)}5*pI9h5gP+T>Y3@v!1wrSq z6Fl=c_Q(1jY$?9s`Ks}P0CtJsiI^XMd}wyITzd#4R_f zo@hLbsE5N@jOm@C7|PH+51>4|E%yzGnroyK4)pYx)RUwF>mAAle_+uB?D8fOsAAk~Jf9v8dEa zqG>%hO0o`Vy0B~sB$X$Q-*Kzf*1j#cVVLC^?r)Q7Ou-qZZIv#WIWVM1Ej+eL7L~je zD{Ls31Q8uTIIV{G*~A)DRZ>uDI+il`RZ@oO5)v6K)G1ueslA9ZvG`)U^=A;+$#Vv> zT3u)bbrVI3`lP%T%e6@NRGZj7I`Zr8Rr%KxPqE#V) zy0oiMD$xu&}!V0wyv@K zx}KXdrgiGdZ~OXWCBZJWvFAYdlX12qWkcGp?@li-*ZO%>igTHyKT?3THFyN=&Cr>T zsKB~Lb^T>fewSHkg)oHxv>LX-k-g2gj=jl{FyVSlct=oMZqu|$CL1Rc9^RVl zyJt^nX1G`&!L_+r1WDR_zQY~!oNJ@pw}`wn%xK-M*PKDoy5C8wPpO(}ii&@^>q>Wx zH!Ex{^h1Shssxo^%1$YFRxy%0s`VvCOs5x>FEgrhEGsgzN~cs?=20Z5@{xYGoI~y; z@e5bz45`}3bBwa7(aL#gYEe*?0}?`0cvtihTK>FtqKAPqhy)B^D&7J4RzaIfpc25)vMi7ytS=j^p)8vy4q^yW46svB*ka=w)pe=$3gCkShhBXIiy7)T*(l_X!MGijEN$s}OeYDhi}57#e}LOF@4_ zs#UzbxVxoI=~QO6uC%JFB9Hh&mfBlH5#`{SoX(?~7yu+KAoModq#mCi&lxJ23il9? zd;PYwpWO8a)-frvzX@DZe5o0pcaXF>r4KR!l@^dkC)d31&@=uLc*fhWCYLtTuQHb< zhn7NCQU3spK=*)--%L|{l$9{xDcry-5hUOOMqqaK8n7O*N=a6&8(>YnbIFK;lf;-H zU~#Cpnlyk)+fYz9u{ZPUzmc3Nbi0qxX8CcI)k2*P21W#DB z?-+cCgw8i9NB+~(Y8=p`&Y6#wmr`%#aAJ=N9BD);IhLGBn2@A`2bHa~@4WZIj)9D< z%gK5vx+-t+EQD)p4s>VV3dyiJw0zY@j7#V}c1nNzA?bfvU=8xdgbpE4N zY8%p2jAo5eS1HJSEF~*NQc$xi5JG~+``Sh;6{e7s5>dCj3F@L`{-^w5-Qx!cILpIb z9aE`u7qaZ~i!4vIsibA)EltxV?kTxcB!tPZfr$B#YOKFeWptUHBdAb$0IiZoGfo2w zZ9pB;L6Bx+uT-v`4RlrxzqC1MsxfB+^*9Dx%$d1-c+G});ZV5OuuWObYsWN@Yo zf~05LF{ckGeY2S5%25ddww6?2LQ?t)reeSYKRAq9ABcV#R`G*MaN@5?Y7I2vGQBfO z&0|$rn+&>#5l)a(%BKOD5eMTo#ZMt_hSumwB`2AXfO(X%Ktcc#edQ1YUVGw6W!@b; zM&^2JDb#Jg)=`&ctReimma4h--88Eb+LVuIBbfvc1&2#t7EcfLew|@$)a)DOs^)|IU)RWy&&n}u^(0u?B^;7rK& zo+4FvcUaSUJ$f%R%ygQmD6^N-sVS;!kxN|7IOa;-q;V=pf0#)@Nl+8DqYyKWd1jSw ziF%X$Ci<%Kb6B-gy0;77=}{_3cI9bFkO}Do&sQP84BTu|l;f4zGF(`f98F@9wW#mR zps=HTeuaeUEb>rMQv-XGFgukpz$!5eIM(M?8JR*X@cczFMmQ zz~YTyU_i(27+p9q{;<|WGPfFzJC=mZG8f&R1boF3)g75KfC z)C!sm{{SwbaWnkNN~N&ri;J|RlX2cQ^1`W27179M2pwFSaAnnmjl*o@#Pc&cP<3l& z3=7r`G78eFThk3J4KN511Y&0$^!IqF%W};b;j@K2Hq0|TvZGbxg~u}rIvR%Re(Y5q z=~HD=L|@`|#cJirOKC?iD)QRf&fllbFj?XwH{ve_^{z{l@fD?Jc|LgRSfkGoROLWz zAVAEGKcQ7B&=pb5M62BH3|X5yl)+rgj>05kQWt@_&Rs>ttq}ENiKnG&IHgmL zzMzKM0b|};&$FUaEEZEdwq+iECVwJxY7w53TPiBSWX5fMIEmpWH~{v)*> ziOF?q^(KQY&gq+|rKPIOUkVI5kf!;9oq`HTkbV=sEj<&g^qX#%dC_`>t<7P1UWMWt zYKW{2y1GNkIN2@g#&|qpvDRocJL_JfO8if-XESD)rBu$*&%8aNOv+&PJt(t3%Bb1Rvlf_f zH5BQqs0};-_tEVY$g5i7;0s3vDb*9~(jH7infIibkvreMB>Y+83oj7b^xJBEJLziLQ(@;b0tg6+ zu@agnRfOFocS(aIZkqIkw&=#`mj1nJb(sjKQr@U4L2ThkVs~YP0~`$MFRF=@zzGEG z3~#->y!!l1V_N7N{6R1Y{3L9CG4RBUUxl7Kl&6<3$dv|X?*N#dp7)>bFaiGn3;rM^ z7V?aZX)yrQCdY36yN^DYqlz@Q$CnBaGdGsmLPKy*^e zrjerchcbXXpv}DT0{;N>V(|>xRIlK9A>WjHU{rp)eLF@s<$fFdOSN9oDDvE^E)@$1 zRZ43V&}}N2Qq+Z@ln8|h?*N=0n%k{F?M>YYD(mGmvJvV)3X>&C5&)l)GGo@Pj0U+N zA4y=9LjVW^l#GyL;PV4Uekt{OHOCb5hpF5TW!YQG%d+5u%+gt>CA9lE_j!3zAcGO< zh6#og+CzjMQUFOZ0X;y!&VG0mud)szaMM<=PH`_KYLwLb^cn3Nh3XpB4bojDT&pHG zGke~|sa48fB2b{FtUwBsr){90rr0HSp;F33R;JV2vv1LY1t|VbuB~$_PO%) zlO8H^*0P-)!<>ow?7ptME6Pz#S@#;2>Kj9e5JaI$5$1Nqb!%QCW?E9CEz2?r7jq2z zIe0Td(=I6rN{N6Q!H-^^1E>oqKzCe?@HCwE;9Jps2M$bqY&VVt@^;g<&E!S^()l7QgEqL#Ehu zE}L=GI<2LMqAEQrdc{N3XG2W5aKwdBVm9VE>^D1>vR1BCq|N38Mc{pV^v1Pi=zx@< z2{C@LU{7C{e<6g@GEP3JT!%-|q|J$3Nci;L{#f3PF~{|i4wuWs0zoc)JfI&_=QxjF z2K9nje`DT>EX+l_hGGk2^1$uEj1e=P3wYndz>hPn*ohca9ZW}U;~NDdDF6Tnyn;6LKfi_(LrU@f^QN-otEns8cI~|Ees~zxisSRZ zm1H?u3T`E0@izS9=0{8~OTk@l2lh4Ul>lbk!T$h4fN%^DWXE%v(l6uB4Ga#oWh}WK zYZ(w=fEN;A3=$0ES0msviCPiv9_noiuk(65yZtodnuAR$xoxAKt+W!Bndi4Oje#DP z!{5a2HgMlL;NGLw^cl`v?zpI8t4^w!E+AGKR;37VCV7e!B#7L7C^nl#c!_C6bop*u zOb8-S@j*}`2t1@n{Pw_uqP#=~9GX0~B&fCR)yT4B-7^H8iR(C$weYuFx1xabE6TMI zs#MzaV-QU`VTjJkhj_`8!~r@?_}{{tr}o{x=4B)Ysk3$?_&+I-TQMUsp_Pe6Mq^P} zw9Aja@N0nP{oAPDboQF!>`iFHDyy;`*DQG0upsLNKJWhqvfmIN{| znG+yzRERKjZ>3o-t?AdJSt`-015>F?`IPDm9m?YcNaG_S4C~sZdx|mzilTS&H~9Ym zY%ton!}s*qM=<6#A|}?}-ye=1$J9)cAaaok`FuR&e_S#ewLoS7j)n*QJM{1Uy)hSi ziaUnwfuy&1gA2$YdqzI`aX`G89Ka-rm?MvDW_XE+JUzMz#IGx4E(i$`AV$}*>jQWm zxL^A!Q~v;{A5ZCq*FzwyDPc)hDy%^0JcpIdu)qHRnf=Z4J7H(U&es=4ntnGu}o zf_UoUl&W8OGX%klc^^-Q#={Xg^{6~!@YqT7Jty?_#G~Vzhz>ClB`Uq6DX^y7K;0%L0}{k#WX2%# zgWE%?z1I=U1d<3JJ)+Wkb-l43xcaK3XBkWMl?tV)Yb&jB3rfpsN_i9r3Iq^OV102R zY19__4#6ZzgA>>DKe>qQ;w{EenB~q8Tu90)!R0Vyp<{b>?{8VdT19|T2>>uGz?Cwg zhUIC&ADTu4Y0dWIMWF3%rAUbxF#!GGN$gIm2EL-D%*LhH9b1kq_X^gfDN0c)RFb6| z^%EzrO`J{_Wpw%WywTZBcvG}_j-|;c>X?!}r9DPtPSdTEv@Hr+Ng{4+P8({I{{S}e zNPwqYH{5&YZnOK2%UuPif705gAk;yxZTuHE%kw{APyOkks%oGjZ2?8TQ+~4|ah==M zU#d?v*wHnH{mjD#r>wD=+9%XR$QjhVEuLjBFc=J*cKw=vX9tCk6Q5@` zeV=g;E~d%&rKq!v!zt4`>FS?i^&W5aGQqp znjh`$_Zll|`NJ?ClB?O-ksdvM z&Tb!gUi&&URQnjtPI zd(a60Dg<}LEzvy7qz;D%IB5`*B5XG6H=eUM+Y+C^+MFNppg{xp+hmn&WEuYE{U!|J z-Cv|-&2`+wR@`O zHBORNW?WR6JMZf!zg%xlVO17++gtIUq?6zG(LRMJsLg>ki;=nd{5tlW4{cHnjL3r< zi(WbmO0N8S4+(f~vhCNTfrlQcXiZ%s2=pK${5M z&4=+XOKFVv!cKWe=MgD0S{IzDu4huHl`&IO_|n0VV512Uu`|;TsoOIIsN%2%_R~-a zR>2Zj2+84Rg^~p6mB^?XnMH6B(8_`ot4!`A^FR?FB*wY&70-)%R|KE>&hhzwPlh%O z!lV*CvylV+>LPrud;XT(fvRj%R8&(X#JU-EZKc#1ONmN|3m^DY1dlF*8p4chZx$VV z{{YXX8y(w>k_aXSc#=oy6YgZd#+{KM2m^pm5y64qzx!#a@c~x*ye8H`PNsS%kNJi+^B&@`4}A71XXZh`sZMsiPTrOv; zvzpB}rKy)v@>-_JXi(cBMJa75VE`ln07Q0(wSbIMZiLL0LWbN+ZLP&SObXVSDVLj) zp2p+TVT)*e?re`vI$)PFiX{>|mJoKgb8AKYF)!2WJxgj%)9PQ%1Q0Nj#vANol6cW; zs*92V0b-%rWWXmIlym|<6Fc1Xz{X?RAtqsbvS!yXXSZ@m{V?%cae_>4Ew~&o6Y0<8f--p`40qR{ z4{iq^c^~d^pX;kz;V*^07G``C$vC6LjO$a=yPGF~MJQS6v zlN(O`_uhVZ$qGEjp|SLfe@r$Ez#Mknl3+)s4tdFp$@r6}L=liiAQ9Zmt#YPwX4Dja5+PuSCgA#fwwSTQJwaJll2DTQT3l_kkX1hKD2bCDKh7k- z+Mr3$nr(OHPGpOXh>$PaZ`9%waALZ2{Th~33J`z?lnZp9JXP~VDTjD% z1waA-2G;01#81QP+XEPP-b|4IfPQ;_n+x97a2bpO#i9V2C1*=?bO3zz4WEdP z5NI6-m1SC+h8#k3KFe#!`_@mGdqy*A6&;G1b{0k9M{s+K;>a|25Hs3O2pT&!;ij9S z)_J~Kih4@SsZ{OP7FCCf8@g3IKU0nuV z+f<8loglb}Y1`zHJ=0}uN#0K0-CCV7m#*}x)R9<*P_wj@U{zFhg0uRAsNuWM%#vy{ zZ4M651`E+B08h$8D^7cjQ}NC-9+fTtAjdMTJ9X>7UH9pXhId{M{{RHIOk8sr2j}rW z4Z0DPC`g-r;(N#EkAZ}e54=yueY=_cZ-!*J<($sd+wBDB7zDsG`h%F$(xBvkK!JcW zKOXXOF{l~#gX#*ZT?ducEooD&*PtcBkXD%@>0EOT*8Z5UJrk*`E2$}#AjI=0B#vWF@~XLbyTg~< zZ7v4u8*rsUQaM~nlVf858IJbpWE^MW_HmgnDx_^R^sLcPFvDr5Z72mPZ7JO#3jhhV zzdGP%o~8aI=ylSxUMO%Wzy$K6n{(uzq+h>GOCBV<6|~&qN8Q>4b^Id7`$t;9 ztA5PCt4+_D<|#tJNd}c7(TE#_07*Cl+-n)})e3cdLui$PH9EFubfPd_k5I3vfr1#E zDahn;qQS2-bsIjZ7BYAA`9SaT#zR_XB&+%A5;?3v_;vojJRm_ylkX&2V`1gr=kebP zogrV9Wjcc@%yX(UnPpV9ti4%6O{%HTuvW~IZghe={-;ZO+k~X#F?QHnU^yowq~aK# zOvv~9R}#X^kgr05Fd=vBO`gD+5d>k3h#3(YHdeCDM038dNHC&odPh#3cJJ38f2^~P zQxz@~{@5fy^X~(1FFaZ1TjGPj!*moaSNL;NwQR83Y8D+OE<6$giu@+ZP$uR_csNUO zH^gs)eM_QqoR3QI4CFcGWjfK9=FPhfQoG7R7v}_mMS&BDdR=p@JxXfbF5;5ZsG->0 z(I^CyCOum~g9ACq_m-*Qnjv?y^uf79GK$n#g-}k>3|NpmV3RO$8m`o9EaC}WQ-D~< zHILW7L-fWcS7!6?Rk_M;ed8X6{{RiGY$V=NTzSMvv49PVGMN1U^)nt`~s3;x8b&coy^o%v$ zC6=Z$tcBSC5|n@p5piyx1GM^16dF15?F|am?|&&fdJfS8t@}@wIXm$t^^c72=@Sn~ zTQ>2AdT&8M3_9lU-hrk2fJ9ooPp&jJQTTDP85J5LRkI!we;QL2AeN+80#C|ARYu9>~ z{{U3o)?hQ0)h$_W7Om$3lKB-1b~Nq*+Hge~LDhc>~FRt~t~3wBm+KmZ+I& zN>Y#}W<|i?YkuvGpQO^?_>$R_lu2sn4B|>D0^69;&ZvJ~>OYz}+)eJ!Za##ZZUvfOX zJ#B189&`{AM5!c&8MO4bVR`+5(EU&!t*SxFNdSYjw*fnt8Jw8i{RXm*j2QI#Qv{vx z42Ue|3C=*A;&gRF>Q?Ju{vY?m0Dr%q%g!u#pRN>@*;z``(p}5y5R$Sz=?bvePoJNz zB&|Dz9`I6ZL;>7-`D|j}Ts6F5;dL(*C}_f~S3y}qRHj}4s1QN^TELSBe_QsL>ZRU` zJv32ORGpiN$qWc2z?e9m`HtFmSv=KHCB0i*AOxOfLlOB%2i`I{%}qMtH4En7onDYh zy#8kfblijk%mw!OSb^oX9nD?94Of)D@XP8Mt@cYWHYx*S@!zM@4Z-1;5t{@Iv=}5v zn}Bz)pO5sMX0;h{RQ{cmZ(jpYDUVHemyUm2V1AvWL^;E53RhBZ2r+KL-k|Ng?Sjq_lC56CR~D*F z+y4L`c#ntq!iO=^yhVPS+5Z3pbsX}Nc@OlM8*kUX7Q7(gR;H!T>8fk!++{`Nx}_;4 zDf~j$+so^C$C9-wmp1Ta0}eUdW(+}*!~ysD(4`mi5>lYZ&en**$^O}y`)bZ~RRjM3 z!yBpzZN`I11fY&&`?i#y%wkV?9S4_;^0S)cTClfJ^#e+psyc*0Qh^c(JwWL@)qEC>fmv{{WRz;0k6-6i{{uRt%s6v^Lp}cmx7t8nFbdN}wI$ z_JQ^Ow!ow;f+WNZx8L_~OJclpe;pYXOyb(B(%G;wedHjS0G<8cfwy0d6T|Hi(g?BB zS;*f0$x>t0Blqiv-?Z!jMQf@k%LaVFxPdanfe=h~Jm)|x>ykkWDq=UR{0QCJdH(>e zto1KKU?|MZ?Qc>0k4rlY@tn@zAO1(ue7!IwA86)<8|l345GDgFi6GnXb^iXV)9V&gz*>DufSCqsA;x~=B1D7V z8V0khH!CWU-dSMGG!M2SIEdtG&I;rc8(Y`0KD}}9bD*34`~2}*$ooe)dH^cZ+2VP> z5DX~Cb0t0h050Pj$J#r?SUmX-dXwMo>Yx49(}J&6>D#00E#W~qsJswN4^~Kma$wKC zi}bayVLe9L{isMCyceY~Qy*j&6uJcWU1d#w@eMACa6Bv(u9)${& z>L_UZ;ecOM0C{Nb`tmysSgw^*Wla<=Ah%(%%bH-bUNM!&VTYmw5qcM#U>kDKocFl24u_Jui$TY0WX0Wg4?jRvPS{ zoiu``l3Z@7ra((>ro@RzxHANtSS@a8TUlG1kKJwpWW)eiiNt_l!pZFu#)7RAUg)(D z8If4AEChxMOalYcw8`!deCl^LqDbZ-L~Y*W#s?*001AU9I?0}!{XK7r)_d&;;rk90 zy_4q%D6y6lZYRj?-@Y*a0N;%8_z(t5oD;YromTm$uJiG>7yYSW>Hh#ZZXu=(L=iC{ zfKE6dV=_DA-$`3=fP|jg(2wQ11|aZ0J@s`QI`JXJ?if%jEz(-TzK1SVzT&qF)XAO8 zZK%Qw_8t8&l-GPy*1Sy2PG_uh>b%~n40~r(TR`i`j$#J;06Rs7DkuK{el5e{@0^o5 ziGV$Vpn!KWpWOTo#C@Z@I|hG&XFw1Bw^z^bk1t)P3$I_ZC}}THp|pku9YJLT0l3V- zjloHX*NvTd$X1MQ-n);mIg^i*9fmb#yuhTYc7QFv<@5UEz-&G3uRBfu0CVugX@Bp> z_;3LSCC;FW{{SIJZvN-e-_zsvknqtU#!sA^ZTEFsr2YwwqB`J%s#vlE^|shzVAWVW z9F5W(}(`aRm4! z$nHr-+RnipCgcbor_#}dSBw7u6tw;zXtKRIr*azFdJ0N}zU5UzYD&~W1^|I?uhI#) zHfLDg<)C5M=(v`r@f~Uf%Dj)u}?N)Imy`hDHa}u4WEF5kG!3ttxFv zwy_7$;owS!V}({d@jjUbNRg+{Sv)AT?FlJ_CpgN~q?rLgRJRjtjQ;?O3|%924OD2Y z6yr$qeh~&f83>O zRaL0i8^e|>yYk5lBfbYbX_C-t)zy`hx(9@i7={W790CDTKE@#D76RG1lguVl1Fyo< z^y*H~DGmt|1lmQWXRqtp))=nS_JMHjokcHYnX_t`Ak(Nv)BNw!`xyH{xL&0Ysw~kU z{{XnMzJg+6=d6F6d-kVKR#WwKL6L)0Zh^ocoS(cAKKwWqb<7g09mez{aRdy^0s7$M zom=M(xc$X06d`o_FH=_Kl&=z}D7pQmD#;&<*r@V@eZ(DymIHAcjl4tRtI2;_Y6_gp zH6G2CEQU}&@U#ygJ%kS3BNaa1+6BUeN3>@%Nt+*HsRPd6DEW24i#|U%JmCKTyv!5I z03g$-e583>z2-3WdeyL?%TK6VgknP|t4tOXJ9h)SW(XsLoF2wDw=7`O-53oiBm>6o zNF9Wc#~Pn$SdySguz+Ic1R9p|ALHhc~$_q8)&x0xn2C}g;ys&4a$cuk( zQ-cKf=-{Co$2NU1E)>ZT-Q6nWHrnm5kD~)k`W#B@Q7VC<7Zv zH{Z}>p#K03I`>Slx4pCK7gVgOy3ws}E@~=Mtc^@78f@eOP_9!ZNHH1KRpRcE)Gs=< zt<|l&)}oXil~$&k*&EC(k|(^(h{W(fl|ljcij)FkBfYl+zk7Lhz_vgsf~X^IqCC2E z{ms}Hc=4l}5~tke1_F5u`JS`X51ocJ4-ncs0y*jrZdQ%Ym90H}J{ZuS#a1T<~A*>e=j?2c|9?qULGSsanq`bw@qo7y04k;FH+j7ft4bD$m_>m}G53zIvF?gT7u011@> zM{-O9!6#C8oCRB8BET8)^b_UR(-?Cg8HGtFZoO{@VcTy0QH*$z(`kg7O4HgKS7{wO zN7CI+H7mq^o+?ljm8YowTBHw`)AYg5jr=4T$?N?wNLg3<%0vn#elHDCh8ND!?sA`Bnx_tHbe>ywz|WFVMOf@i+|R{r=i&~BAw^l(5Nhz5Gfb`yV3 z+_YR%*Uj+@HOmDJ3+Qf{Nk~%CsZ^0-AbcmJ;q1_PdyUXi^Pr@JB#>lSfO^3PrSZ$& zIO>*NW5#_#@21zMb8g>FO={95mCZC&s8#`x8bE9T1MjU%!`79ox?R1k&}FMmivkG; zY4Zz2fe{4bwlT(?R!Ast~mKXB3)-crS_(ezr7$(ARKQBJJ{%+7AvG_`dE%)dx z=uhv-q1G;cJDws5qI6gU=ag3`iN(``hl!!M;KkYtK`QxM? z6;1}YcGAjufXte=uPyP-&yN>^a@?bol%;&eFSk#Q2hV-KTt$^QM4nO%_uSt1 zjr_!U?};p_b3BZYr z9>?eAK*7#u(uo~D+>l1lNmznq$pqx%$N9zQK&h^654PDHTclsN%m@q5;?aQwj>{h z9dD<2cg4zWL!3UQvbuCtw9CAqVpa%XtWW!lOnJ;<&xfrouX@de3-A`owaP7erTnD` z3@|Ua6pRTl2*5eY-9@e`*j`k$2kL&ByHMIBwQ!B)h{!BiK!PC15Ol8B-UwQEF4VQ! zH&@f=Ii8zJ+{|+4saH;=2H+_zIIt3<*a?`6&Cq#2g8%Itn#fPTc05(EuyLk zDqlG%N3|#La~;XBoyFo}Qh1-qGm3sF<$9W`ijkVMzO6X@9V#j6DhO9QX?fHDrOXe+ zqceogd!KNBj{0*))aos6y(gIIT69uZP&f}QV@ya6FrYvSS^$D?C({}&$AJ6|dr;l< z`*ps!tw@S}KkNRUokmNqDy>rWPWo+1kPWmk4hH2Bs>Q!l@nxkjFIwqnE6^1y(4>{_ z0#&vyqL1#>x(kS>QfUKA^6x5lY9fyYnvo6bcN3gtPq(CK#$cL?Wg+G>8dan%D`~`% z5~7%~GCGa%6qTlwmtR7HLYYxaatKjLAjP`J!|RKG;hwVKu26W5r5M%~G+8!zmZvYF z%yTs<^(kpULe_${5)ep~j@u5<+lyR3(E3PHRcS42OR9xq%l7DHpoKHcqC|Gs$CD&Co;Ok9iO_4FD2lm@=&2o>UwSL_?6cx#wvhLHZVu8jCQ= zX%+WMCbLSmX%SlaNMWyTq@XR+ZcqsXnXs9S@N%}&lPYW}BwpKWLH&B$t+1}qWvt&& zWVs!FY;ugL?82Q7*1Dn*O4m9{-nGXdpO2<9;o+M{Dis(@VhA!M3_v*~$PFM*IMuN_ zop|+y@p+>;TR9d_m7_LiK5=RLhGN5whftbF zr{elHo$i zeWFOQ3yxvrN$rO};d?6@sa7i&40f?9ROEpGNG_km58PuKC)eD%npL;$D!U5+n~;K3 zf&tHG2Ox+XjSQjwN|2_Mv?vJ$G6)?#I@{D?*jEd+9%sXB!-#2V6&W2JPu(9|ikCx# z8^!(KK8E{@G_;D66(E5kCggWLk9&#kF=Ct~q{?;2hP_FlTh!SuO`X-|fo#*}bxp8T zfz7a5hm;=H*v2kC8|XB8_2t!-RbXiJ+q$$V(<60TiYdC1072Xw`bh6MBeh?xbqf7H z+LgrsKsVOOT!d%&8>e8q$Q2|N zKp`m|&4*p52wg|RxAg93Rg-6V3TSgGHw$$PILJznx!8h{^Xt&!$n<8L&Ug>TJu1y+ zr^;8C*Htt8LccG4s)|p$5;@TNhc_q_y){)udTmj5lFZE$0{~~Z15);WC97KY zk|i2-Ei2dx^zMAOR`aRUT5OJ3VW5TzVWjaIgNf4gX@U0!Bp6h*p1lo>_Wt5Atm%3b z75@O)%yahkX}_2e)PG}#eRRm@pJpsXlMw@Nj>D&(F#Dr-aHJ~tweQ!i+jZ@}D<{F! zTk|_C!r&|u1et??VDZ~M^)Py~g0GM&HX!kRy9{ znEJ*X{v2=@KjM{5brzA+bor%jTSV=1^r%V$%cp57TK$qDTvAdA2~GT?21b>G9^mCS zKJR1nBXS7rFS&cT1+DX58gU;^>KvA=Qn;MPnx3r+S1S(DzUo_jw}JOm+M7~>fe{jV zSQo+6*?<+8253HzV0L1A&eJ~F?*l{oSX7iW&@e0&im8T-3BlNKF~=h~)O)D#*Q;C7 z`KGsjN4ZU>@|x!|`ns3e4HoK~QA>zQ7LZlQp#+Ho)DwiZnbVnVBc*7kZL`)8ksd}r zG3V=xoBKidm6W?nrSxu!R#!=<^Ng~eJI)%(mfx^@GOB3~K3ol3n7E}Cf;ayF-ifL@ z8b%r_Q4%?gg#15#zF2Uc7G9fmL7KOlQCEA@2?#el?UFg!2jFKUX(#FpQik1#j>MC< z1Wfu144i{85DtxLLR$%^U?h7&kQ3agP!E0nhS)pew+OW+lgYAN(@MF7=8CRRr z)AI*krlc!GfJuW8r2!@qXW@jy`X-Wwq52xki8QrT%P4i1*!FI=wAi6(Qh9*}L6A1z z7gynrhnk;HWVwPfokx>p^g3@db!}u+^>oeEW))4$`&U$DbnY8+l0gO}3m8A*72o3g zQq&dBWpue~kJKJ&dQ#GwR2U8d*SJc+l0crPwjsKg;WZwe;rl+WZ*ErR=C_j8wdi?L zM&jn10$2nqw3>l;87eWSmR>9ueNOVpZLQ5JG*+OjftE>)po)NRR#uYKz*RW)7M()( zG`3t)NASi-<^KTLB**^%E7Q_(6fNK%@D!)WG5G{uY) zznpeBSAD?^l&H3q0%Kvf<@@>AXMsKpYAt`Lb1d$kQ9qLDT|E^!oedp&DJpYk5P8u` zhSZ=+R75FIZDDdqDe!d{sFaecfyG2Yii#PTE~X;^mY2rLe^w7wa5NV`l@gnc%<9~a>ao8P7N{~s+OIG%WWYj z2}~g=01_jA=r-%q7E9x^Qt>-I%xE&q^G?)dS{o}-q{$1)ZPNH)6bDqaNeWOCcrtIe z0=_8QZ7jj}N7bSXZ&JL&%=~@P1LPXbV{jb+7}}(6Ouy63_ydEfgm@jfAur~ zieZ(Hs-LA-)MQ|icAQRPd+9-!WpCzH)R}%-%e56X&LNg*+XSg@tKCa!0%VhIutmh( z7n)?%E6Ve{srnlFbdPCIP>5P&0wziHfn|v`Z{9SNcT?jvOsZ0l`CDc4T(M>MM}xlELX6xnq}B>^@7gRqb` z^n&Z3g;e@yNa?*L{GBm+ps^ZULqb1Pvg5YXug0wZbcJjv^da`-lrD$REVjLD_~ zlby_S`9=T{?s&$he`+8A1VALhkON@OKJa3B5d*fE)aiV&#}e9drj+8;lmv#vl_-Rz zDG?-+K=}8zC3cqZ7sTCNrctQq^t}Z;RW!!3k1wows(iw|fR1o!m|04cRFNr9DJFdG zn$t8neIBIAD(ct{Qd8!1Pt>JA6qZ}4LfoE&6p149wBw@;xvYa$J;QxfLzZNpZAmG+7p zX~xycpi-oQHZkS#!>y-sdP*908D)mhlmI0l3r54wy}FTZvaiNAW2H4u95pU$rV!8E z6;N9*FcMJnh&-xunI7ttNHRo{WX>aFg+j-%o0dD=DL&T@3-x#O$K>wu_WIE1zC zB(L6(6al&4b@!J zJr}A}qe9UxZOxh*Q%TtUMMi1f%jq=yv~UDScoXW^IvGENEpwj=>V~w7L5#Yo$|}Xw zDJ%x65U5gARsgXC-?h3%+Fu6x`nNqgc7sb&ROSYp)g`uFZRCc4Bp!56z2&|yQz1^D zuG5@ArpteVXBCfX7v66#smzkmesa{n2i=j%TRe-BZTs>Ktw0~9qSOd3{#`dyw796rEW%ZG!pSFrN;xltjeV$dT|txO`bes` zO$D6Mm7|ce?7=F6QaPjoK#G(p>*lE|w>wBCL6a5oT>x|1 z`aGvC%288am_CYXMpD@3apwpLNVUl(2g44-UKTirtm`teoF|4L6`{<+y z=PwU->E-Mr>M-DN(b`;(UgsN-IXM;!Go zcJ61FjJGk+Mum!wX8oJBMv$a8I}%kR<9^uA==d2f4N16aNR=(=ucPyMwRRroD!#6G zJbs?>!|o};vpCup2NE7;7>IwjTO zSA|7XL@o;;=42d!Bmoh~F*rKZ>46ckGC}RM?dj**FwW~WrB5a;D!4s6p3!VPF1SxL zM8O>+y|+E*w`?-n(M1meB4kQ>@6ex1Zyo!est{;askEJ;RhNQ5QZNCZ*MS)4P3RWf zRIr`0AW!94$?Z7yiCT%zVyWz`+I+61J*y3*$BA&g}h-CoWxeyNqAaOYN@9i_LuJFr`*gY;mKjmqD zP#Qfs1fJ4lVtw`cn)s$@JHw!zzwHK~_CD|Q^T#y)J;`c|CuLGd3MBL~KiYQmwmMbu zRC#!8rT+laUeWxIPfT+;5a3Z!Td((;LHW4V~|GLowJa6 z_&C-F2mb)GzNBZ<=hp-b5hWrI{QHsZst4nfqwlTq-V^U$;BRP~ci;L(?F2x|&Jh?G5}g3&o9U>Wc2qY8GxbrvKDBpVL1e*Urj6B@DIYg<`O zru02JTCJ>YbuZ>?Fq$@-NhL*706_di+vkN%I+Pqp0?GgaP5wWxP5unW9ra#$q;j|2 z$tqr)0;?Vjlg5|0 z47AG8Vy^5Go1a#~>=ZmP+ICEZJjUF1X>+|{#EhP;?6Rv_Q?9<9^)&asg#u8bKM*E% z+I#wALE<+MgAm@Qqz(WCDJdvf>SlU+#1Yd3o(VW9mUy1=F~j~A>s?sxL6T~m>9%uh z-lC{Bu*q=+#?b4lN<)ux6e36gMoidasJ=aYkv<7@o{-jhW{)7^wvEp;&YX8K$#|TU zJDX{|-m;#VP5`q`qYXT?%9K<6S zjd?P}(zEGjJu3V~6AuwOEuEO%tnQq8oO#<`GVh&)ce&FPUCM)v)zKF(hX9woRV zuXvr{H;Wp%%}c_%l%rAU%|TM>MRhV?ODP8)?1vV>Y?2nH)JkR~kuW9#HLq;!iKTO8)#)`7rPwX4 za1qtEvb8g{!3!riC!A>-t=1{5SH7cZP&iGs>-sTt4}M5wUh}5v}}*?(W)x4 z%G&A{oltG+iBdVe(r0+u!VL5Wt}C}ab!zniPSLB2LZyVdYK}ASVw7m&B~-DP99})69z|4pTA66 zuK~4{R-NE=7Fm>2)6xCzx%XLU1h_d&xoO7-h2IV8T*B$y6VkV!KEj$@5REtgqPC#uo! zm9jy`U=6?kN8Cu0s`z8Ww;dh{O7!Mhf?z2@b}Z;xsaa_b zrUQg5f61s)K?5d7s6a80XS7DC{f`VBY;omAM?esJtN;haTlsl)xxuqO7kJbhO3qP2 z(QQKMatQ2FLbn$4x5|5?Qs(xG*M~xR$o==gk*PD1fA~4zk}f%q=R5ZPxHzwEfZk-2 zw{S!s3G9_7heVYo#Gd=CW6;%s{LVAs~gr zC?P{k=h(!?rfI2Wo|dMeO`Kk~s`WJ~L@@L}*Rq)RYyhOFm;&NKFmkIWqmGucyj{M4p zZf(8yl$7Lx?B#numQ;P~#ug(p{K@e{M8SgMAeip{` z>b%`i{{S#{6Cew3VSc_}(7&nGDpsbns@>gGMLUW;MyP<9ld;P~6UzWHPrjqqr}c3x zFKr}xSerPIeW8SH^nd{5XOpV^q2ON@TnkNBj{--!q`CNKtP&^EExqR%W0q^y?*%U4_3CU)nfSn*UylU5F6tg3=z+v7U#)1gUYT`86t#7HfVes-T)@J1f!nqS zd_j0|*4z}yvb|xK>MCtnqcdU!E_IibsR>fQ2y!d|8xa8Pdto3`YS!CaAtWVVDp90C zmKY*T&d~$)l8SvuRDpj?H0)WjWv1*4F-3jQS`Gn@Kb-@)z!2;XrtixK|-RObBFsW3?CzfQh*6g6II zmei8)Jln_}H`{M6{{Wei?wvN?l^8JtAyg3&F$M&I{IS3zM;6^_8*%D3;KKlZmxgFF z`S}M5B#9gjbx*u);x`!dm2OX!@nxLl%%d`VGf!DnRP{wOFPI4n_Ju(c-gd%rp1GG< zL(Qo!Hn0?!AjnVzM_41_Cis(|Xmxn5;OgtD+ilmWE7)Fv753M9l*bq#6YGTrr z!K8_EQ6A!I4d{hY)d?y}_HD7oC-u~jtpITK+;w1ors4{{H8;SBbgF3@8OSwG)f?%BA zE(8-}{{S$E_(HS{% z*0ZI(_06TdS^}j-x2nnKJ2uruRcxvNz>}PVz|$N1d%Dd{Xd8NOx~G`+sEVX2fLCBV z2{YLD#A>$_!md2D+tkhF_3bk1mF*hXb~9fZzsapdE$)C&Sklp9RI_ zEvdzO(zTT=&g7D!N&M%mV!@8E&0Hp4zgPeP@c?%CUu7fUl0wNos1Ri1O~sc}62ku7Ns)_1&j1V@@J=&5{j14- z9(cPUBTh6@RRr@v7u?C%?{2sfd^mA)m;V5S3}0`4FXwokhCKGiK>Qx?_olTE4(a%j z#NHz_r!uP7LsYbsZnWiC3LphK*jG3touhA|2Z>J(xrYaGER$R5O;`S<(b@74x@VT2 zN|w3Aq^Tz5BoXg)^fC)ib5lyDjdMuw#S#jy=3o!1K4Li?@`vdRZCx)*C`^49@Nl#EwC zigf}a3t_;R@_{6F#Pu4RGZGC-fg^t}r|0nB9*s?z1caJ}8=DK?&*vAwC3U9kXuVoR zW*HShB0+*cm>~BeG3+$p+x20zr%$S4WwiWz*C-GN#tEWUTLVdACD=FVv-IX~gobLP#kf&8!4`F)4g{XHE_qF_=Dt zt?GKz7M@a5?HeSIc?*tVBewXhtsASWE2$Xfbhrvq0VK0i? zWq1yVOhXylqgJ~QjRU#9g7 zOFo)y5WNrk}5KKSx(hejE2O{c$k|?IN-{bSfQz5#mb!It$iHd_>@xMB#$#7 zjmAE&r{ltlZ!L$aL|SW}Qjs)CX8gPTN`h$Pub8;+d``r~Rf_Hf}4>Y#{& z*Uz+nSh?Fq{{RW}vNrzE>R~cjex{*7!0rtM;f%;X5=6-rh4CMYsv1PUO_$nQZ49Vc z1Wxe;`fv;tgNP$d6-7TBVIdhxp(-ooHBOtG$oK3|aqEQrMn%SFoiCj_!;UI>iq@ql zo}`l|O!Oq}iw5xHp>uvdYj^Z}dB5*^?!>SLA9VzncfT5rk^`NIbAZ-#E}D_OnoQLS2n(x~Y5j=*ZHBom3+ zOaaFqI&=OY@v2i5m{|Ei_U;y}qtzn^bN~txXBZNA)JAh4<704Brm4vSK^u<4$~>bO zuPWoPDOl6(sYyu&RJlrfPVpZ+NVRbTHZVhyNx0>>1M~T9J#USv*EzTW&ubw@IvDi= zWPU<$qkbHCZIJG-d%S-Ts5zV%2viV3^+6r-G??*EjKq&Kr$UfIt-EDd6D7A1#0VVZ zcFb_eGu-KKJ(g;mwOK}QOuv1#%24WO@wQLm20Z?jR5tKXSO6Q(H%`BteLXOM*{HTQ%bwSx+|!0PN7f_nY8T%V{}OX%xj$j?zdFwv@UKbEgO?hb!4ZzW1ZVe(kCHI zZrl7a2ezCiSI!n~1bz@kS~H+0Sh?-Ks@vA z2RQ@u<4$)CmIhprw>6`&=?Agx)28DNge$Ut`7!-4(D3#0GRDjwc*>*t^dFzs4u9T= z{{Ynk=OXyx&lHDVztqgk+&)5&em*~zd6TZH@W@}-T`-A2ZE1IaNLVrOKbF5!&lU|S z&KA`27*cClGB=Ok?k60OA7+>nVK#x%d;X^k3Q9SqEiy?zhJSrNc;4^Io7Q6>%96wo2@(!?Gl&o- zJL@^=P%Nm-nFb7)U`Z1=Fh4K$5uwzimq0>+35n*vEX=_2j>h(Y(JNXY@k}8}2^eg~KF#^&rxQqFZOh!Kw^`WW?GzP>e2b2SO^YkB}!z+RXox?ON z(yCxU5>TiF0hs<6fhUvBoK*yr1`n)E2?HSW@9aRwBet2Z2fSR-d=cZ;i{b{p$XwKV zVp*ii{{V~$5stI6FSXyn2M;v%tkjtY5x9-47}VJX zRUJPHHDhSaGMuUUnpL!E*j-0C_HC_vsUs15PQ&ydFPQkUNpO#OdkjRCZjSWUeMoN@X*0lt;tfad6 ziA9UigCNs-WP+}Q8Bk#6db`PdaQ&aY1UMPQ?IYnsJk*>*)!a_@hNb-Nu0+!`QDTm&k&THGRSln4YZz1q~FSNrt-Ds#QS%YTS-T@Y+sc`nF818 z&~r@V?w(RXA|M$v@dNg8sFf&5u$YgZp61^;7rq{!71yMSoj%6a){>&CrDZqO739kb zmB;2YfL0JhbCi`SChe4g+-H4L=Ts1(6oz1Ag%Bih^QZU4hl`#yc%{tOsQA69m#FJm zQ>&+2tu~*#rDT$Z)Q}a+1|X9bwT2^K0qT$XoRmrur};>qJI{afz60tK23+90!TCkW z{rAQk3L!dyV5a7%bwBl5;xGFG(Tcsr<$J!QE-SgIS<7x<0-P)XwLk!<#v%vUXy^f} zPj)~f3KerBJV414?HJXr=*P(9NgTinUi%KckFG4&gD`8u~MX*@OJcd!Y za(F+N^8zQnOzA7I1!fryxJMZDxF$zCjGupOoVZBlNidnd=KQf8FX`XY0+6)`nH_E| zWAQ%>0d2^g#mSij8+>Q_+k6XcWW~aPyj#c_?b1Cjhw8%(0IL8Z2fWCfoJ7y|$Zi3d zF_3sN2%K^_`(q!@YIrc#+LtclPKe2Av%JBarl&GWUd!96aWswsQYB3Daw^@&Upd12 z?GI7^0FU{Ij#8|?okmCEl!No@ZLblCKce++aiO&iU8!;>{_C0LuO<3txAtx%^8>!p zKYL+S#GWeZjx1^w>Rnq@n!MF*C51ec@`Bm`37<&b51u3zx|>Hws#>Tj5}Y4Gf({7; zC{rNLK{KFrV(C-N5QxdNf=n?4Htq~W0CUGPq%^>geL&yg-}Lz7dulQa$9~c#Eo=Aw zm@Z0+k8%jNPQOEW1o_}%SIPx}H;{J!02pRhdqHB@1Oi|JLC+9OmY zjCOBv!>fFh1V`@~ayftucY~ZrjDm5g$4;PfJjMa{7$lCWf}4*)yjvE(pqvWfCWKTG zIXyfNK{r0XG4sV!FoM=cm>_}e4I<%PEgN(;_;tmn@bS<7bQ%wu2^l*g#!v3ueK+34 zXhF216hZR$FLof6BXQzMCS%_b&YM?QtPk;TZ%aWTcD7`3@smGp4v=C*@6(~}*MHxj zrqlwWOdY>jj@^6xFa;|h2#6x*u@lqR0$6YoBz8RAB0-4h^`6*pzTgGqb^rip zKN%YFI3#ii#}nNA3`g_CcC-Hg4Llv=4;i#ebh?jH<~cV9^2ZZUx?q<%s@r6RDHO>B z9#RBIo5v_U72Yqn$&^xX=PKaFi^wyCX`G0nnatxdqxmWjqqQrVsCf2A2=4L0j;trzIi@nSqodkCDw%^|#q2F}LfibtJi0MC{Yv3qZ zSsM|(?;Yc;@Ab!_K&U`4B*D1{&&oP^{GrJ!Cjmj83j#!A0zeQa*!zgmo3KD2i3O%e z6O)f~i1sHsgCA%*=YhG53krtgwT}DGUoEeSo#2&PmzIPQebAWfY%Sh5nH_O#KWHQ? zf!UxW5*=*7v~4D2?bdDe#Yb>B%^^uQAv~jhE|(ME*V7d)uUVI=Czf2R+JM6%e|Skh z00AK2z~d9A)~mRy9Bp?X@?e27rz3VdM|jkY)lRqk7Kp7shcwI7pdbPR=WL;nDmg@Fb$ z6UMR%AvPU%{q_9@#{*hike-k)JHWTs&iDeKGq9LD6CJ;28(Uq*!>A)@^arW_w(9gM zfxC2wiBTjHdHzGO`PZU-9S-4Jim(&xr~BO0s2#*fvhW!)c8%WQ+BR-lH^f{_jT0znEu7CgOy z6SZaV%f!bOcvF|FD$^Q)*7CKPIekJ!MJ$u}gG-cy9f!lYUlREH#C|N6#;wkrs-|d; zN=BusWOVmh5Rtz@^_)#w)wiQT%U5?kL(>$>kn&anilF*wg9m5?{qv+AiDz1mSsbeZ zr^|6)Y%mm`K3PSaFaeG@(>=~4^D0c*#>2P3<1$K#h`8x_iSzOzcj?jyV6aq5dS2sy z-^0snWQCGc6Ylq)tZXlNw0cFM*K`nAgBZag40h&ofO*mL!H@tDeqitqu^@lbA`1Ba zQjZ7M1K&+j3{PWk>AC6gs_qoNU(1k{o>hVXB2DdSyhMI~8&L7?CxkUBx|EuPSa$RN zpG~Hy_(rLw^94n~6OjTyJO{ zqH7LQP9o^#SD-l2Sx5>1j$%hCj*^Z^y|MuaiyAK;*CUNLb4D@Br#V29D~f@m>7}> z)G|9O)84CBX$65KsS|)#Cux&85$}z3S>V%;ei-$K5TDERKLyjKv+8_;srU01*C}zf z*-?3-A|c37^9Q^PM4u77bnvN~*K7Se#|BkFt5sWE%5&D9g(kTxQ1;*-`j>OxVm2nW zxLd`oTf!XqdV@$;8Z5!uXDJ+T0D0MT6s@&-g&FfZZG@hr)HT|pJIpiO$w775l|t&O zmW`C_gsDVc!bzV`jv#HkJ#TM)Ug?YZGexMVuUV=FK@4h3NfW?h0ALRKo_?)F*(xQC zvejd>(~7=T5SziM51S6e6+Wp@LB@1jQnpm{ifi3$tz`&1r3FN!5_*J?F`zi10V?-q z2q&?*y}!RpTSSYKB2Qn_zr%Al@SbA=#WCo5-tvDgow02S6mQtdHU>~k9lZLpGr-4b z#&uk&FmR!BFwn#jc8~-BIT!{z^E!*(BONKI$qH34;J)2K{rXxkW1^quprwnIHjd<2 z4!tMO^VpNbN{XJzkOj)(X5!=Z7&Fj-jJB8&1KFencQHQ=y*Bvr58{nRK0UoqW|&J7 zS24TF1enZ`CxH+<>t*nogVF6HAGoRa06SnecsTx9j$OveQj$%SW8OZSdVIQH4R*9o zIaDlJQjl%Z{{TPf()e>41xdcaB0(D--FE%$hO1l0HIMs=0Pp+r#cQZD8#=_UVL^~W zfCr?J0GS=93}$<3ZDg}{jL&jD55VV%E!#SA_;`gYDo-pD2XPjFcKop5b2ib-7dj0Egs%ra0%s$NvBw>OuAZE?f!k5s^Kj03X=S zx{Jd~>Gaq-ODOz7=^m(W zBomB+&KeR7b`lui|JP^l}1Zlha`&@8$5r z7EB&X^3O>MeL{Dzl^1~=XK_M5Pd-q~TPp!|1!&I4oXK^E8)?=jY+YT2Ev<7d)-AzNLGI&Kz zZ1Xy~CYT2j)U{43kcAKw*zF)l?tKT#2*acGI|PMg zZUyW;#YMIre>)wmj)V0VgG{q9tIV>EE3Y!#-&SRG&s0_9e4#3JY$U1XnN$F!q{xo; z^hW8=1ywn|k!M!w4EmEIX?3qrEr+R;;@f?N6e%hRNg&MHJ8yhK+RZ%W-@XiJu%=R3SyiFe z2WbS(sGW^3s*}zC0A@I&+my*0+oip6yyRM~q?H_{(;xUx$nQN)FH<4#SiL|q`ux9D zWh=?@1%$s{>Eo0%N4l9;$6es^McoxuuC1yI8jx$a$_rlmZ@(j%0!7v)-15=Q%x z<>iJqUJUV7g{i!{>6IwZC5M_qL0$U^3biGM@K7tZs?Tpm?yJ^Nvc6NO z49Vt05`YFOK?+QO-uzVu@a;?hD#~6bsO3~!xQLSm!}Z3cQEC*Qe<*m*{smv@)6*6X z=9p|C15VLU+=M1RA`Jfkayw%}w97zqebuEXfNt7j^4#|wj@LMZYfhz49zpI2G{^wp znKRf73GV>p>P*|)epR>%Ll4Xs+8{@_9^TmIxbwWXQdKeRn#!L9n3CFrh_IOGB5=3h zzKqRivzDExrf~$h?G?;|1eI+hdi*-r;&2@`N=QSLZ5V=Kw8Z%s+QZApi8wvUH0?br z<5$ z6`j&K9Dq--zy#w;tt#8CvXHd<&;*-Eji;da?dOSY!)`6)Iv+;V$B6<-1mF*mre%_~aMc!2vdV+DBOAAIgOCOwpN&d4d{%I>kxFW-H}-0h zNKy}ZiSH5m?TiPD?hqzV@$?S17x_rHe?O&gXBiG&>+4NT0v4c15&;v>)Jiqm+G@|gi`5sZ;e zp!#u%COPl%XhX&~2jI?kDF$R9$TsLLji~XP!LX7BcBL7BeVMd%H@G)HIK8n~t?3M< zDN<9HBbbl(AXxVLoxW3z&1r0%6U~+)MU0}xBKsR}&%BRp`>WB9jTq+m#!D+@C$i>>aW5nju(M=?NS&bHu6phB*>h}>|=mH(~iStvnZ=&2}p6uRknph z0wEX=YNjVp!Aw))o=UlrptSQOD38KOgB>H` zi_2Qx(dn&P#)-N5IveX0Rx3>yiDx4Upz*i>cpT~@>nz3P8dq;hk-Dg9+pC?f?y6cT z#!e)W%tsoKhs8Gu(6uGqM8Xs#LaZcP(|?@X&wE}fctZpK07EelKViCL{=OLkWSOvm?k;Kt-&5DctQ*vO-?#MGjZI5f8VYIr^QDI2nAZ2 zlwJuc>*@Lb0Ewv4r1EHiLP4LzNs+z2G4dU!9-xkQJ<_IJ^o#L;3?7>LZK?7QbfVI-fkx3_4?rJ z;(N+w4T`WN@7(Mpdx1X89y;>U~dEk}O z5)42fsE+3IZ>iqncdtR^8D^bn)l*Qi;c=4LOQ?_nzucQyLPg*n#9^%~tDdjamZ7&w zL(1~NmMVdX$T9h(%m^nvq!cRBTSAT)Dxt!b2B9R8CPxR}B0J^)JyDa_=XzqIlPm>U zf>y)qAzLZNR+Xg$^dzJW@jUcbh}}Iw!)-B?>jW<)&vHz;nmX23?}nh-qyG^rQ)N#g(tnMLfETPq^$et)5|{8mH`CjAOoJ-j5ijEaF2UdohnsoEgD{B zK}1v9+uPjo7VwxtJN1`1=A#7P933-+8r90k>KGCeF57KVaACnHud{{Wre2ZBNW08ux101$2Q zp0V}#9f|RI!PQ&+M$`zfNfG8R)8W6KARd3=FJ0;Enf&UzNxAnLRCCoXoQKy+o2p+z zWk>?jNP!#17~!Nc#4Slx6~Q3;w->)K=>$RSLHK&VS?hL8qU)tS641)ER=p-+>;ov? z0l_2ZGa6Er4xMxh+r28Z)P$6|R@zKX?WzbrCjw`_t=&E@I5epL0MbShkOYW{o$g4# zru*2&HV+n@7*ximrb!b5e7aBPx5E_xbf#95dN8mI5&HSxrW~ym;m1{R5t@q4E2OHk z8dgY3-a>gA=Yt4B$N@?}^o#lJhTr0w&_wk5WM(~eK^c&-21pSHC!RYU`gN?!4X{8U z*B!ykl!8VePETpm$KwA0#D;^{S}A&4P1c;oq4zn9t%*VaJ09P^j5gslI?+m%EwVX` zf_$sd$%5=qfslH2X5uqe}= zi!xtyLy~z0XBfd5(q~grXVlq_ozxnArr)Z{s!-#U&WH~*6bi(}lvB4~F79@w;`UXT zQ&T^fvh@{HY&Mta)RK7}N=G;lE+kmS+glE1hvC+9uQPV^?w+P@uDwZ8(vxAzoz*9x z9&>DH;#Y-kAmplP%FMEb^;J|Rl`XMS(~bvLVIfU|R1D19;k4_W3$6I4!&aAUJ!smoy&Uty*;6lKP!$Q-U9E-Rr;rchxJYbpCT~*qhLRhOQ z1Tr_PX(Q4`8Z{i3#vLZwz511cO~)aR-=v&o-x_p!6k@4l7@u&)*7NVQ_rb8jA} zI;v@&rExB^Qig$2!zxH2N)fO<3}M0iQ2awwW(<>$UU9AMG}39DD1 zxTKsIJKc7F|VDK5^4RW-_8CgoH z695?jF(h;wcIqc{i0hxmuNm43V(Y`U_U%~%QZ>cRGUyqUva69RBX6gIAmdMI_$#8^ zhBU5?P!7h~RY(k@@@|L)XZTNeB0LljmYRfe;u6N6HeoF zRH0G;LM)*XZr>~YdSN-2X?(qPZIecn1d$Sp$cXbXzkR(h_GQ^~H0(AI+yta-1%y~_ z+vAE2PN~$qQ`atf*HEKQm0E_JQ$oswQvd}LO8}}MNbU>`St!_2=`<4BgM&>ekxT*% z?vnCPdE}8F$mnwm46B(yEhpUxS9tH`ZHM=1HS)kJS`v}WxIRaq9$kFr;$4L(55sVo zH|y3q{`NR&b>tRGlp!Tn18>Xpk32f+ge{dhSmYqkueOr4a7GBP9FWPZ4!ZY;jr`O}MSDFA?C&0SS=0`AR1SKTOzxOdRNa^s~ zr{#ywfjmc};dZ>swFPSh+7zL5wP{cN;#hnXEl4*qkVzhZNSVVAAnj-~0xmazCVzgo zWO%EeYsF?+HkZ&$E$r7a1x0N(r&fd~c}ir*e%_YCmVHC^P0hblKuudZ)auf~BX_Y1 zeNts(ae=|_r7mgP*P~vAbRI=YRT8Np0j5-|ahZ+?$#3a#*%qhZo{iR7-xV_bX#Qtc zm^W1Y9!8`?%)eHZ65EO<=|YTcu)YH4o+h%4yM&^fPrX3?p{UQQs^81&DUkA8Vxe-9 z5};BKa~Cr^-=9q9RPm2b<_~4{`hl8y=2h(8r*r_O);9zbxZBIi1pff>6N^NK{{W9t zER_j1h`(9-_K!SXY5pMHQK4Fehf6l8UX{UOsZz70d$vPbx|e5@3N|Ed0GTojR|ie# zyQ$QxcV6JqG#Z(@R;d)NywOUT9#9QVDm2I}OcF^N=qrT&ATperhulP{%$>@q^*(Uo z9-^RA2>Yc%%>MxDqnB$C0Udh`L*6873e9JlqPsGt%W0hqfDT;JS!qd$9LY!ksC5tz zan}`_Q?IzT%{xw0=Jbyl0ZEj|UgSicFR-}RoIXVa?Etdwlgg+xnuHx4S)swy$sSzB{q5QQXh?)uzxJ3ETkbn4R; zZdpriR#QkVB&D?*YVA#mt+#Q5o-wJ4w%H2iQbM3y^gXQ`e_rDO*4t(_f?#s)2SNQW z^296u0Ej$npJtj`XB3i0B2gvpX5j6EDM;>9Mm$QPMBl+x7G1tz7UN4v{qDI#Z-!8X4^=Gp4ntzW10C3bD* zo6|IyDI##{xt`_&PZ6Czx35O(nXN*q)~4AEkGXpZ_Xjx{07m2AQY3pK*#&%s7Ln8r zozBrW+t&%|r3I}>CR5yQM{VPA{WicnpE{<^Y5lz`$#tSsBpLUH;{IdhBMOca=#6*A z%>MvC%k*wgRh8+*dpyT7aRp7O+sY6?<@ZP8gWIOYW=GmQ!d_t)X&$5NAwbC>OvVVv zkaUI3%{xST_1$UFrlWZyxgZFDTX8S~!6az|TbD585eihuSpr9KC#Uwtgk^|Jc1S0= z9ellG;5&4c6+RX?qQb~Qp>vm*l&LpO?g;PN*XhzhBg1zUkdl*^Q78p(VpJykpVC44 zIz2vv5&m9SuyZt^hVI-;Ny~Hb?WW7(3sFr<*L4tbY19&`0m0emkr5;9okm~bsZcBS zKm_&@L7o18lwTO5ENNtwBod)$0EqPXMDOM=iBVbM--#eJD6)EZ;dhL0Ez$G)%Ds36r4xzh(@Z zm5dTds5xi`cEN)NMhG%U!PIx8${A5Gn*d1>dv-8`aS8}=1cS<;NcW^b^}HcX zGYwT#uAkgtPdcW65CT-S6blZCi(WUvvx=H;TJXCkR)3!9r7tXHU{n^lxtl>C7a-2U zJK%Xt0*`jvw&on9{JMKFZOP}!)4Oiy{mk#NcRa) z0bc_qXXSiM4moMe{{SoDR*b5v;u|`vC#k1orzH;|$8yqAAteD^$qBGN??^jZ3?`{G z^zYTWRF+vnopEz;5;=q$U!d#Lz8>ul!yYK{FGsbg^8C89_zKpcMfay&QXOq7fZ`IP z$~k}>um|Odu9MWQ?CmI>vXffg zTwM7St?mIR)Tz`Ji&JF?2~y}(5W$ig8%{LA)a5jl6)P!6DIlI$7d;ak5$HW#OC>M#yB1@i9v#B(jcO9Z*zNDk-pFE^mcW!j4YGI|dHGW)zShfuGAcm?t_P+qPLE?v~xd zJB)%>AY%jXn8_Z@C-6pjQWli^qHHD!um_>u{+%(Uc@qQw09Fm`V{l}Edv9~nF#5Z~ zP9wG!Mv|#0AacN6j98O@kH^%OD}~%hYI*d9VV$5X$E~bCcI)F|LZJZCrU-^{<@#8} zg(qwRIOGlt=ohb9ZXn;##E2CK1TH|y%;lz6zXlm6azs%Pg~9dOVldjBt-Tt8m|95c3sg{mGP6qpPY`AS0y*z7B~J8Q(G@6F z70}9tRt}+-B{u?Kta^k9JoBSGt0`7-nq_%=YeEfeV>HETAt`MxIFywroq|M}=m%}D zA4b-2w?}C`Kf=o0Rg_bT{EzN+)GIBix{8{n2vWkoFU?#sK_aGU)`%vr&w+JFTA|zf7z6UHm24{AjA+7 zZERmW8Q1MRKKGRx!|N{Y5h>Db!9v?^EnQduOuPUI^q7buVyEIu3r?W6=KlSyDO2+e zDoM0&uET29^#W#+k-!j0G7hHJlBLu964E?Hqp4n7Uzh&?sGa7e_KdokoT{zG^AsXa zG&ZY5+7A|mMe3g;uN&?jm=2>X0R?+UO}pC&%8n3mJ++C_E|TC1Dg|fWFiBUX=hx$k*Ni&1 zN%0jcK}O288k8NLrCN%jI13?^m~g=l(kj*#Tx#2O|-)mT3ZAH zq3TqrE)G|DP;jAOX^Z{~O25Ska2ZXkq1&$Z{H@ku_*c|4$y=~WcAC@#zaOaF!e7{Yl zs%hOwAg!gi+PPvNDI_0zZ$6-HiXz$Dtx)EY6jqi|OzvbDFhat}!*XT^ZBHJ(XTZLu z0}+tnfaXjRHk{;`COI7GL*hSPf5lEBS7z&>YK&2+(Kb?q1-OO}vqGFHND5H`=6*A~ zKS@fa0t&|}3_^!a*W6fJuTAhnnr8X-OR7JB>fDa2C$Fdl%6IA#vdvKh&+`^N<)2^E z2ToNfKqUL1i-LTtM0c?p_2@90C9O-kk4PmpBo+vpN)8Z4*aQwoa6$Ief?ch8Yf_a& zsY#R?Z%l(vXe0oJNax(hJmg52-VgJfvnt}{3%P|=Jv%F+d9dwEfwqd&k`je2LSF*;O`v%|i1ETjp=6UB#Ylnx?{2*|QszqIOAR4aIZkHkTuN4e!#4@mzTw^+Tp8P>}q?R6dH9Jr8Y2jjG+y*iJo;t>%*km^+mnA>hvrt z)wUFc3dKV@DSfVlR8XMrB3)0o1nTD4*ZeZny01RVvzqL#mo~{VcZN}!l{6cyVa5nF z;otWt6J(i_2N6$!nvW{WvwkvCRp*UUQ&dyt2Q5Rj9H?=A`AJ}Na>=*hxiJ>SdM%DB zxD9eLN6Nx^93Ius=l~lMZyh&}&>J-TOH(es-b~{zsHiO|Q;Ac9tdRv%Hw5i7*xM`h zPNiPz!r^=|T`F2$)w*veY&B`rq2&rpN&;CFiF}6&1P)9etbvH080_y)YMiRwscITtE9fdW?oCOzH0C-aOVx4t2zYxH#dJ6I~& z)}*z{gIQ}-xbxPo{j(In3Q%E*908{lsR7R><7*(LQ^(lEo6f~Jm zGs zN%seGLO?%J*k9Mv0-eb?qUcAq$^yb5BrBakDKQWX_ptf&!h`(>#1}H>YQ-%$c`X&8 zf|JZh6UuGyK6tEnqoZ}t5Z|TcPK{EMExj5kNUD`Uh(of7Q8gcPvVkO+$>vw3_@Bdl zF3ydeF0pS?nlT2Z_ z5U3JNd7q9DIZmUjdakc3&S<}d=F~5#4>GX{aUj523EUm+-wOo13XoE(5x9-}`hMd0 z%AS=fHLKG^G+vEjUXxQa*(y^zSzTMyu1JlUFbU!guL)RJq@^8dQ*pf=eMnKVyBJ7h zU}k5DIvC+h5F|{*8-exXCWEf4me{zU%(^Ehg_Lg@Ysl)ya3FVg38{$l=^dU+c^ z`m}t;IJ3oNzi#ymF(%>3ApD5$jB%5$tMHg%;r^MFZ}Q2OT=(Y?PuurUaXl(tX17Ta zqIrmbC$QK}z88!&A=eU>ASpo#u}C%}yboK?sSCkN`?J#zQJF+rl;2e$yG8dUMtp>{GK>R`sZQIkN0Z7@#5=y3cwJlv>QptMx8Prn2YWRepJzQRS4Qoj`kP$J=29 z-oO>j`g{pUJg;X^wIolxW_FTE+HF5Qt=V(Ky;o7AwQir)G|2{|BF(6CHbD{#lywMr zCOQQaLFs;&pwYOj)v52gtxZ~>4#ClNq}Gg zb05^e*H4Q3HarM;TF_iEr15RUjaIHB@iQ*VYS?EeaYzQaumU*cmV(?9VyH?81)ztL}M%^9dEoGsR{rLyC#Q`TH0hSCywfxlghmFmwH zUuS=hO&7uaL*hGBY91YNBZawkSxHq-L^ywV?4(51Fg5bI!) zOql?TbFr(n7O>Mgmp;?T&+68Umo~4<(4~-h#Vt#Wg%DC>oFEw9{+R1e!_V6#z}n6p zakoP8k2p}yi+ZAmhkBvbLyy;F`HCMDbT2woRsurO5|T&&$4qi9#Jtv%JJ))%HlR>; zlQPs9oozFlbFooY>zj_3Z))8?tX(?SsaO|V#(n6Aa_>##t5QCa zNLh&<`ttN)Z(6e5(6_Bm%C_<=6{k^a0ZsQ*RN8#Hgpub{z*?K2Wa+)t`j z=PFBSDMvpjF&)4Ye>@7{ex<3Rud1ReC5N8nQ+&_}QG+Anw${RXKjiz8$sO)40rJ|@ z^S?;J7Yg4f)T9DnzASd%_tWKkQpZxcxV>7}cNHtWK*>_2QeBGd*t0&+K7I7^jVe?M zr3FeVI8{)ol5kKD;*&AoomxhatEXjzw!#w197*?5Aw0?i%xo{Y014W0W8Mn2O?H#v zR=7@7mZ|D<4Mg|eDnbXhT4g{axJ1MqyVzV>vUG_nLt79K3=6@Ihp+F?78Bu7MO-!1 z$=D42;{C-40VVc5jQe1S5_uq)Jq56~`#!2zui&%j=Z|I8OJS50huukKe4(%p zF_T~iTS4mQcu&bQy)VMPH`HqiO02el_2(&RyvYk^+AI0MDJgaWl1xDx&L${Ztx8mu zrF)M)xpPZv!YN74*p>uNWPX}qa*D4|fwk%VIHyTgnM%u0sbI)gcLkuS5fcVAPHEJ+ zyGv7Rbn~G~N`U|nq?jOx+!4@zSQd>}njpb(Gc$Cgfh28c>pi|$BF~&*+OpGXO7zV_!C37=E|)Af*^kWU(njakhKHK zu9Iznp7!mxPczlvtzF7(b`v-(AjFf)A0(g^eLq}ns?>Si1L~)(r!>zd61Hj>_D&o-m~f$Br0yrR;?i)c@wvnf6Y&FxOlG_>q@|~( zMKEfy>NXI=RVqmLR#1pfH$q~1?}yZB+_f6D#YGh9O6=Z6LP>$NPGg)*f%nsPwjN<) zXG7`P2=hv;tx3w1+Z+#Z#EBEAxBjopB+6JK-tV$RNB;mL@agf3ZBDPMP$?|akrtMb zcZzd2_(fM+Q%6pUsv4G^W#l%Lt+gb`AwWz>GwHV2 ztL+V~>Z>VOZFL^dG};oC%*cQs-YhMASpNWyH$dQ?c2zf02qS%n>9l(E?TUHfElGNu zv}B2tncDWX&jANH_{PH(Ua5R2^#Y8=S*_8-f@g53Kn)(i#Bd0h;Oa`w-6&J12_#WVvEY~l7M93c_-rahPJe(TRx}S?V{a#%}wy9`x z+DB`18uhZ3CY_ejRdWP$Dj);DmLl74LA9pFV8m`W{V$6J@JFdKdUy5qm93~|k1*7l zexYyRD^d`cxZscPku~e<|9egw4!N0mv3$u z1H~kevH@TSiB*=5gU1?;nufbL$@84YET?4Gu}4((J9SObtxdceSw}KRZVufJ=iz~R zQl_&!)Okixn*)|o<~40nF16Z4B@C(M1ff#nU_c~I$%**N9HYf%Rl~Nbw1$1coiCkM zWc9UF%FHTh8dXEwk0=KmaHdqHN8%*Uexx>c;!h>w`tp4nm2ksN?%HB{4v-`GZH6jco1R_F+5JK+z=_6zbhPJR2)@G{I zUolgF!A%fLZG*HJlZn$S#r-F#xJjy2kY>%&)l<03b$NYzY@^v#(z=kQoJ@gol@4LJ zGt&(+wR7Z>DQU>-{FMD|*XxOQ<6~828Ln%i@=6Dps?0JRijs=Dp{1pA<7}ZNDp)6) z2qNdFd_gehDsK=(4UA6x4BR*t}(q{QbrItq4_4LV`yTbC*W zlSM&bvFhUh{%9Bz`f3n(@2;RaXD8481th|xNF$UB4ZprFFD&6N6Z}Etl{wyk$ue3TpCn6k zkJLV<>DvlQ1WB$(Xu0Ak_?`NvP*0<+3i_#4D5tg%Iz z*SSzs&QnuZibpEtCIVEYB|uC7L~p-Sy?7_8-dK2Iy~V227Xtd7Ani}g0+m$`#u`+y zk7yCwI?KFI(rr4YiAA-_AYY+Mg_@GoI|Wlr!C?p#I3$x8^*|V}tlPrR8}i)yCe!F= zPuACGt|^LSP*$-}5U_vs$!%(YeLZ^NAUr&AxxOOQaK5u4YKKuXNbPbxvwXDm6z!y_ zt(ORe$QFWp#j#}hD|xn6#_b2FGo2$%qjI`>nugU>tn^k>tw!imiE-rw6B3d@?TI6z zIJLtbCUIL;)9O6OD$BK=hibWur!!m3H~dF0TWbkNwIl}s+5tTXlVN8*ChLJ;XiCZ` z)0Pwg3sKyz???(j7~2p&CrrP=eL4Kcp-eKOF<>dvV(+<@Rgjc%`AeWBfIG1VRW+pi z6miQ~F#iDXy1g!{no{rIDAiWcsipQLg?o0w`I8YcQ_}N{GOq;OZ_c$1Zk?dawAD-W z3>WI(VyUMZVJW(j;Y!abPh~`P>MWZwvIa3*}coffq;({A!y5LVDpbvD|c8J5O z-D|`YQu&tXAEz`nZM3EX3gHWFFmX&6^pZ)5p5Ce8?vTD{RjDGPA{V1fdPpr$0-)|x z+IR*56B>tl)51R#^m=miy{WXNbxvWJH$}=J0{Aq{Z~s? z{cc^Hq1u4JsGn@6!|DYj4rN#YdtvO=ekM3Ymhs<2TJZW6urW#2z7fYG_v#O*#!#$hM{gtw6BE(*yGV01AmSBTLfok4uK~5>}lm zhjz*%by|A@k6I{spUR*!Pp64InE0yGI-iA{TBy^SqKswPR1Ud(cbc~t>vBk?6$ zi~8EZJ*V@RUS+j7Nd*bHo&8AO{UhWrAU@VS!kVkZ_F-K?n=_ixRIM)4)YG_^8}>?2 zDNj0Vs1OareDM}^lEajY5K6t&%G8bZ4ggY;l$(JT9sV6=clz4R=B_1ZQ67Lnu_h$#F+ZNzfaoes;I5F_Xl)>M$%x+Pais!LnZJ?A`fXZJ-bYa?~#o>d?aJqWFiTX_=0zl+xO+= zhkNcx?&sGHR|mh9lmM^AJO2Q-{qGm;ziya$%dE+hez)t_t~j&B5<2%%2Os8Kg`Nc9 z#{zl#$?vYI@T)3x4x7H1Vr{Aa0H{HXj81c(w!c$v66xmP=Bpq4K?mi}jzxaZRy~yl zOH!i&K|tPO1+UQUZ$6vjuD=q>2;lCkQQ0);C;tGK?T$}=(5#@>Xc`>RgeobVAvPiWq@(%yx-@DAJNR_s)Ok zu73E8LxS`NxmMT`-)RMN`1cD4)Ng{myTfz|OeL+tpRB9ZC z6&JqS_n5cqjOL{$LQ&KJGFgT}1_<_^U}rpyKi@l)13kSaK`=oW_Ut43Xmu;3COOqN zfDNtRrM_qC48w|2QY3;!OqdU@bu`9^n4gecRM z6%TSYBjvxBPsqSvdfEz!SuxKb4kHsC&)-G>;z1>#3>?QWcmRw*`Tci=Ec?9niLv@v z#@)JLGSMWcT$^6s9sdBSxyC7?&(tIMbB1mRnfOk_8yuk244|obTf_l8z+0EOKfUlm zAi-#p3nV}jp704gj6}ir(MpmVnLKiRBn&_iKYqvGNv%OBqf&}Rj>7U|;e01JWz6QM zDhVJOgo`G_-ni@E%jbnfeHM3^r`R)=x?}Mb0!LtN*3!W8dEY^=R6)w=YuWIO8 z6crg& z5L99WVKO~O1xNgkz|dYJR<0I_1ec{Fw4uxs$@U(@=TiX%Bbdyd{{WD;(Dc6BU~6tn z0w!WQN3U-<>FJ1fQ{vx1&_1TB8>i0)yhGr$NFuBFTOyrR zK!{Oy*`++iSDD`X?}~MA#%BtYVAa%sKlq9H+->{qCQSIk;X8?s;*KQk1)@2AHrhUY z@cQ4c3KYDGS61aRLl>l31E>dMl37M#K>(9F17~ysZnp)L5T+@XQS2PcsLllZ;&m|4 z=y6JMS5t~5Qe?@wC$Dqf{{RebLZUt3JiMpO-Xm_&IEnP$EqFw(P^|Bin|sJ2BlG!w zvUgA7uY<0r1!`7MM1COvMa2HQ4x@Y~mFQI5Ma35WC^b;XB#{{e%t!XpX3FRTHq|kL zU`S#(!9Lg-%;&a^{82d^8`cRQgynS~{{T$y+7Eu7d-K7<|10aJ0<~SJC z+sW3ZvMkLcNmU^>f-MF;KQBndu5kJP0Bgbx3gVN?8B;JjM2)(FFa0r9Ia4cEQ(H*~ z+SF4NB=ky%vGkq(Bd#Ww5BTqq~rmj)}vCra48M@Npb|p1sicwAdrU)VD=+}5@`zx5)5Ac zQRTm1F1-!~pn)4ld(Pj!n2dk<&hV{;tqy06p;Hh?LFeoBwgffekA$i>)GQ8Da%>Nm zpTp~UdM@qNfEDP>Z8G%K0|H25+4lbcZ2+^lBNSZi?E+#Wi5M~89{J)+=0^ysQ#0eaYtD{rVh6`fn4wB2tv4>KcD|Ks?ryY3YA2D@mLRPl-MgtjN_AVI;yw zINx(O>pRC@mcfnP1|*8quy&8$ED}_Ak_q(~BN3uKrPe=jREz`Z$T$(icLekNfYgX9 zxEBBs$|G}bw~o_|fkID75Pfb4?0aX8>VNa>1sR7W4AdTUmo>(2+iTR9X4iow-lFYwPQ~)GG5x5XWL~;)# zkME{)#~;7JT*+nQZ}r6})7oVd$`h1Pq#pkO$VSJ$*Z%-Gr=&LXnL~ecT-7sCPg2;J3M@F4 zl-AYlpJIOozv7HuSQ$YK5 zRBt&?QqqEu>q;nE6few`0toNp)c3GF19z~)DBqP3OOkK9#~2_z#P-x-hW zH6g2WO8nBHRe6O=)io~_N%*kR&CM4(W zA7UF@p`R+Rs|V0Ps#8(UvdV(TC_7qy7>B$wqf#juBwO7R24vs%ZQNp~)ZA9< z2VqAGLXv*$k|%K>O39OgR{%sDOs`F9Q(8#tu#n`d2xy)R4n%kN`|0t?Dh)2S(&bPR zrxK6}nKCX1PK1AfiG7;!6Ikh*&u6D|{KqG4ZJ@0*HBQr|%LDHv3ISW*#}MkCm;V4w z^oS;9)R3F>JB|K3&z{Cb>k?5|hy;+@M{+DWd0Vjc$5Vb6(=|FB+Ef(SC1DCiTXiKM zg1`Vr85oGxPvV;OsQ8kVS`{4}^!Ej+xlP}_fC`bs;yaO_V0D;rYlyk38x{J)I;!?c z=Rk6~_3|sClkW?UBRhN(EbC2AO_)2HwVq}zSGhrXT}6lYo29q8q4Q)M{?` zHNgx41)4(z!vP=zf+xI0#*Z4*ncFpQW(?-FtyVwH?dn^oaW6T~JlyL_xs@_zN$Wdf z>J3ewWmRjg%d=|gN~cLvl@#?ZwDXElxmu8*r4nX(_uB+1Bd1ZdpsV-s^Y8SgNC5Ll z5OxRFZ$Gnz6%;8$OcA;Xj#Q9lCpnCsJ8`6i&B75>+||#xd6_;T^9)8`XAdY02! zxnw3xsc8gU2qpx6{I|pxTXm&i;b0~K01#e%MV3tZVkUAi-xBmyoxxm)f;obH=0x{D z8h*G;+ltf8I7~s3ncvKLbo_=LiEp|2rwFbTP!#E!b%aSQS z^>Tmu&VF3qvF8|~TFOQ$>FVgJp-t4Zw!l!7kffBs7m;|sc*XC-SiHpYX1O|warB!i5{zT6Fi79_tzjgxtFr+`!dSv8&Xu$ z&ooj&1u8<+k`JA_#@?7|YSRv_D&~Ss`v7*4`ggu81ILF4^DY{33cop|q*HlLYWtNf zI)=z>DQYTGNdhMK0_UZ+fJ|mA)w1m}(4T0t%p5jSW1uok&i;QqbazMUv^w8Ovg$Ny zDc?mFsz~(J3O56S2G%4nj7%M6w{}%JedXP)P-2}z0AZF;ND;<1kl&#I>t0&0ipJb4 zRN>CXE-59f~2kh7@xS) zI+nKA1SP_gPn9gpvFuokmF8j(vBr<{T~)yR#p;)8@^yzEDkQm3K}ytSV3RZF=3wK2tGsX{v6>G1Q!8+eMM9gop%cW!*WFI-6{abR~GKt1MTPN{f$$hPHr@wA^!^~TU} zNP|*f5+elg2NS0;bUYn-gUT37oZQJ!s88Uvh$OAP;gPkkj-FiN(bFos86~( z0X=rxdv?P={)WnV%6*H*@nxHTZ}Kf{Y5xF0<$-6JFY;K3TI5H@51;kE8-Iuwf0%kb zyMU#3`Di9d&*cPqN&6p@qmF??X2V+K0O6!wRe}`9<}Dx->4}V`QeyzL}j6HfcOv~6)pv% zdHH%B@ugZLF62;3>O#bs4laHWcD=3g$D717T}r=0wRRkxxL)9q0wh9$TfQWMb>q;H zXUng6n}@4y;8^lC<+&0tM}Vmg5KR=o&|gxtCJ3h_akk#?nOo!RvuJCk`^IOwo#< z%B8i10#3>Yc{|Uneyu8XDwhvJmA_7*ZRR?9)|!_9u*Ty%R1V-z+DtD;rqs0%w-sIk z5^B|V0%VW@GC>0a-yeAumsY1UrD^l-EH;9q{t`?AV1Dn@0;^jNQ!S+#=SfO$?+G16 z@7iV~weSlrZI+r-a1sJU5n*oMv+LVp&oh%Gz_$LMD}L{beI)+?E@@UO)e4j-0AA8b zFe3!S@_yq?oUfP}HzYKOJ?FIco+l$s24$2WRJfH=rQdj@D5sdgJ?(J4l3}C?yj+ zfxnlR@2&!$g{W*U)d+3HThoQ^0>}a|1dvZ*IydbAMM_mwmfVc#YQHT>efX5mtU#gtaUIc=m@$WE9$o(-L^vl#~T)oo^ zqeui3%M;w+`->a;D|D_yme8e2YL&Ls2$ettA2{^ye!VcVc7cTgLQ~8>v(x%*9~^3B zk7Q4?Pbr(v@1?#zm|oMvqT1q>Z!kCwB35L`J9*&l&VRJ%DqT~kjuiqk5$ZjGBj57J zW5jR{Ax%o-ETD2m&{AWsUon5yZ-Pxi+f~%cMaf7on7o1Cd&u(<$A zm9Pfmau0F+G2x*|5E2gDzzwD+VgR;nC+=ScTa0F z(NHtGJ;!t2Lqq|_55AehrKr+mQy5W!yo0yEe109hI%bf6^s>Ga>3^T@_;^htEs`J; z*omK?)6UrQ?(Kj_vp_+EF>qvjNf+tm&|t^HWUy7Zj&cbmKp?`Lz>aZ(InInPm(s6D zD3D+ue4ONyBz}iD7-toxDPaEqEop!`08+2Lx0wCxFd>|ZmYF47jwwn(5LUR`ZR~va z>JA-6(Xdx!q^Rs*M0)Kz`djFtsURCQJ*H*Zbkc(zK5>D)ukna~ZT z*PC61VU>ZofRMyz{X#O*0+0uNH?3NoLFuLglRM5XqBIFeid$Uf=q2YtV{ zmL~5lDcxH&xFuJ2pbW4k06ybs?;|IjHK9?dIXujU6A}+9V2orz;CF)~OiS8&nbKC{ z4h0fG0H~2a9nIrtKP&|rT9qpIT5z4jl>jdiZ`1eW^Cp3%u1aF$!Q048T2D_q_8XH$ zP6-P_WgUS1_v_I0BNcb>qwYiJGZI@OV=M%M3`sNg=TCmEK|5*S6#^KDCzBzwBbgD2 z<4oAo4GWeR(jiLt9sdAGz{d3RCAciOBGyuZz8C4=^R^w~K+zKff-NG_d-uLJw?e=n zDnxT$!*5;fZN4`H25$>K;uhde005D+7$u8If)8%;OwNqAX%J9?M9Dmi#Bm(tWXHaA z(H%8Lv?L)9Ad3=KsgOHOyLtSvwK`ptrc$@lX^^Gw}+>H78UY4`&8TBH)UB1aP-M0$xbV2lNkBp&4GTJo7%gUd1iX;v`+ z_a<_1G0Eq-)PFiMhOP9fsSZ4@Vairiphs)X`bTU$86KU>=xLfmOorhpumf;CeqXpf zPEx@~GEkJk_ehSPFO0{|*cQ`ep%4ra25r)NpU&GHNOX>e^p#D;N`j$Mry!6aqi_@I zX;b=SMgVDXT9ri*tc{d2jH-0-}+(M>i@7+!X+>QZ5LQVo0~r zaMSAQtoRGyO~F6MMCzCn;dQb{9&If69tm(UEAqyb_% zhp0a*&y;tJRanS@?VA8xj%5CX{Q7xfBGipuO4OX{r6P7D{0Etx{$r*Jl-{i{4s%l^ znT4t*dhH*+*qEvK`QfsCJvXTlCInIkfs-x7k7u_!p&Lge&{d#YFX;x!O6bN;()_tOPznS`X#5G+mt00wUH6#%qjazwN z;yz;mzU8S@pp%_d_m60xH`ow-{{TEC{{Y+n07CT@>0L#bhzwemKoCh25F!+EPk7Sj zz*W!?F7SK388QqIGZ7+SOm{qLW(>}hD5+1dHvkt=?+)=hiT&-3Zf4X{RBD3xT+bm&etHd61>)}LT){(`t;ujpZ@?zE|ngh ziG8?&HyX6KULYCo-f%ymhk#4|TcE>e+*Y5aCw9;aVWKcc5_`^+ymNMzw=~MtOIFkB z5zLm>6r`#}j9zW};P*x{zqwO$5Rw9SHb1l5*P+4=n@1YTww|eZ$Ci~yD^Vxrclr5R zF!p6xTU1o-Auv*uh#f_Tm*@U*`~I<0#hrfltbIL7BD2$PEsD0$O#+535J(@ICzBF& zZ?>}in@XL!l2(;1q{uQ11~LqD$j2P$__AO&kW}J|LQ*fxr4h7To7yIJ@-6nW%4*Y| z=x>MpS&Ab zGbx*q)*>!&rOx#}Nyd&W)oTowBX1IZkSQKfZE7=gkqUQNPi2_wq?0G9s%3{f>#^Olt)N@8XX{+?YwuGhEX6|(0Db(%qg z{4v50XrI#*Fx5Z~Aqr41Ax2_;UVdF?&l;DEvwdiwWYFgy{6`rlw8jVA>lyqy6VmU_ zNn61RCV$|e;$ye8^Uk9miQWX|d}+|RrbSZH4rrQpUCU}zfL7bdLF7nO6ACa49tSb=Xi*TPs2LHC&mTf6Leh{5#FUY60Pp+w zNW>fQPvJ92aqmyn8irb<)U@rn_dLP2(i|%ZJg9JiDoG%3e%&Qc2l%?ThO7NO#MbGR zYHzBbmNevvsERuRJwO0R6Zd=KpA08g3w>+*yVX;@AOTbfgTN9a0&}ifX>(Q|gqTB@ ziP(Mdc1Ihq1W4S%OZTaEK<8Ot&DsW#ms&6vMt15Dq-C9}9X_|4yRM1g{ zDM=perto~vd`Bf`PGzbos98x&B}s4*%Nxv(&i!}CL3GZy)B2qOac_4Y5S>Dn~Ikg@}XdZ$6!{ z`RdYg-eM(3R#|PKpz-NxF^$9kFeY@K%9Q^A)R1-Fkpa$K0e7-o;tnQIS0<@ILAe9O4HZpII zQx?q7>qv#lf)s8O$c#v00mw7QCqi1VZ_2>Hf@hgHoPbBhJ~g$Ii7-TFee;e$?VRWnlnn)|l{YrHm>o~< z_MV3rH%5ktfC!%;PoK(q+B-?WqhC&n*&fvh> zPf7EP91C-uj=PvQsh4V4k)zWw_S*iRa!&?nj_c$ox_o#H>fJvB*ENAr?Krc=h`cnm0aKQ^ZB3a zjg7*BlnAhrb_PwmUwyjF_rXWEPzFkQNhHdJy2vwr{(ge_CE|V5xQif7n1@u>y2gP zs47ACzX=;}&<}_Az;(E#B`FC=DHkA*d#qcm-fi2^DxFX%79>d*ura>z-(oL;TJ-8< zh#PXg#K{n53G7H1;0-3!*nzr7<`O|9gX|(OPtO_>wFIaTIf;-&c8U6a_r|9R4=DtW z;9h-aubP6=Qwjj62dIQ*kvNc| zAYf#emJyN8yiu1PqOd(gW7rix!URtr(?Z;E1cU%0MgIU^vm12AA!6Z2-2lnxJ9&~L z_c#LL$sr(#Nbdwr)7N7b#sNzSF>q`FB4lqPZu@j2yx^tjsvX5)js|2FpSOHL_t5Oe za$t-OGx>?hfH5Ere#b)=Ie<}A_6OIe?3-U2!pKn-Z( z4DT^xV+0NQ&*{|T6+wd{;_-OzK70QFoCQm;KM(@)Cf$C6_HQ`FO9~cJM)3q*ck9&r zvF|r;=43SrtS;z@0~3t;dl=3@&Xfx5WB{WctOJN6m@;w5j{Im!!c)u32blL8AD3_4 zv5-FSDmEk3>_I*ITl6?CE|3MLI+Gpt>p#Cwe(>Kd)p5P-W^aE%C-cXHDD_U_rGX)` zNGD(;i0|G^dt@^b1fEzAa5*q?b2))JF)9uugxDvju_t&V_ZY%bcAH!O0D9~2kKAAo zsx!)%h!RfZN6I>UzCU|p``7Cv6Z`e+d@8R?U}9jqLjYh-VIUBGc+X;a&=3Ld?gVWz zCL}?Kk&<%*jSUJNPVyqaoB8>Scv7HLV95eIe@)Nsa0A<=XjrgPOoKlk%dgh>%vA#c zN)QvdH=j>GSoOjokcJ_ER;pD8!k zA_)fH8Tfkk?~RE{d4fz6W9Jjp`Sc$P?|?#}CLuyV-e=H$`uXF-R@zLJ0#D3;e&0^P zVOAKZWk3K3068Rr98AH^KnMBo9-t4fGmt?i{qZ1=o_);j2})uIOAgXD>G=)uwX#xq zjmh%bEn(l`>E8vyvAvR{-sH$J*nN6`j1gRbtEd1B%!u?Kzg?`8Jg{O`0RA8WA&K1t zL1WoR0K~|~lwjwv-4g&29AHL0@yzj~)UH$rAkCFBBeZNfZy%As)VcxXO064DyC1*Z z?wnR(P6sh?Z*=$g{?7RDW^APMg$O3#oAukT*Y!9bHXjbEgqWE0f(Zbb<^bb}7$<`I zw(Tn5Zpe}(K#&I@LE!g;*l9?oV1Odv*lb1n8+H9L;Uzapq$n7Xw8Y1z(Q8`?)n=`j zC|Kqe_lV!-ZRHoe@t^Tlh&;2-!XScpN`HuJE^nPg@G34^0#=7=j)m>23t+d$(!v1{;%!v!Gg1TKthY6MW7pB z_W}Uz+W_CxR4s)CEhLSuFW%(!8{r?>y(s|m5}K^-U>Ft{ETc06AT*xY<3moRU_=(% zC4dA$fs%eq#C-flwl$Wr%H<(5xFkUJ>+|me&l{>LeUc9&YF{ErP(Ug+8`ww!_uBS| zkcP~)wL2kUwMqOS2(ayMm!E6n4Ktf+T74@Fv)lPhN)j1dD#?w?{E}8bE+oujPc3XKbql1Vq=M!lRIzC|fCR~i;0f;oL{*iU zo~zCgljX^INmHq9WhpiU!3HB?^2FKDS~a~Vky3!)Ek`0$=_2Jy0%ZEh>+-<|4)|k5 zkRdsRQWE8R-^^Qt2@V^;kzqUb^26Y!-F=YK+ECa6l#)pT2Gf15H}$?byT%?Zui^`a zL}Ii1$M60H^_B z0PQ1lzh9@+@7sBwkiv1=8mf6(7=LjkEiPxy5_((6?Ru0F@u)cj;W&f9!il0W?EAK0B@pN8a)oqYyB&aeLf=m-6@9+~$WsBsA=l%Okp ziJiM(K4h{RZQutw%qz@CUY&bye0`6xPeB2PVx~uKLF4bO4CbXjkdyNK?&Vbp_KpP5tJ$^8 zd5MGq029;vyrVCS41oa-8_iY{rOP!y{YpkjSSWB&l8e<7kbGknb|P!+F0 zi*p{Nj->5?zv>LxE}!|wY;ErwKt6c;A7Xlq<)iB0AN7;X$>)$--v;P3a+x#k8 z2ecp~`5kRKk2nH;_~yj!d!IinXhx~djDuM04xGk6cE{NJ4k=ySkY>GK$^N6xzCPkbFw z=eet^6IkLwn*wbFZGOMLk@h~p4c*XMN6)Jy$LC{%gUR;C+e8WtDujSanqf)oHjY1; z(vp&^Fno@B_u*F}Z8j6W_x`wA<(Wg3ibu4}YQ%`Ljie9!L%-+WA7ku1p>uFu0j*Gm z=2)5Z{OF1Sc90BH+#~}BX~@Q$Jg-30R+J^o+c8K{h)T__Haz}#baH+LWLboJT<13c zrbtVl{{Yh;W9$%KT>?n2R|g)Wj13s_J{U*FSYzS<5yqVSpTf?Ot}P|(`#ptQ-E@O^ z{{Z5{4*p5tbBDQ!1?@?xM=%53chmm>i|>4WkFa;Ux$?>L>S5kJM;?*DTwk{hK@`%|cfGsnw}c$ONJIF){xD)jz+k9}I)+mEeA8TTA-GTP9-Y zs37it`s`!ueS(|Iqs@AT4CRT)`{^z0A`D405GFzA8RJhzOZF;wc+7p7ds}Pd^AHG4 zOm83kcsu_3I~iBlE8&YUDKBfjBP6OPma5nP0Po@X}J_CCUI)Gv?!0EJe;5$hn~nldxk zX)W#V{j{v1{{YFW@J6ru%}vB**bCQQB6s`Y{q*UDO(*_MFM)Cgw9dGO<^KTPm~U_| z{{S>+A7ktn_Ko-d0F749KC_t-pVLP3Y7$QKCM5m1{!k-F^xye3-U7k*>ox0<44VG{$>RGq+x%QN&E2>A zvuOVS^9LVe><8A~fB4OB{{T4O^T*p>^B?_3`RKu~{GRW#O|c5$Mqurr^XB{f>5c}Y z{{Sc7?9D_^2I`jvZ=4_h0K`AJIQt)94dvP9=C`-}M)~>qIs)!VC76@RllK1F6xY}T z_GYwYJQjG9zcz0({{ZrX1KRrpKFt=OjtGSj{{U8LBjxvB-%NdvvG1(9i8`!$*XCxMjY5BjqSpI`ZF{AUJDeTLs=+g!20Y`t8& zb5;}c{{WX0kFoXx>aIr@6~FxBdq=;vKHB#8{{T~e`A7bGF>mZi`#2lhfEhZ!_f-V{ z0Qr%>Tp6|YF8!R$fD_^CPmng}Sy%r6n#b7t0rgig9(`!W1x5n~M}Ke*yj{;M$L_@c z0KSK{_BQ>UZAUMMT`Xg6WRw2@0;Ne#uX>;h5#{*`Z8-*G5(Pj2O4}Q+=PUM0jQ4+M@pc zT2(&2_{Z4$1vP4s2Bkthi?JE!liyz4!-iq{p8WUkp^g2PUuW}Yn0Q^`g3N;}$+@mS z`>qvPZ`sY@e<%StcZQx9(t**ui6iUnXX}r#_8Yw_RYX*$PN4R5S0BlN8ah|4Ozx*z ztui<%QPhvsNIFnA;6K6RU<7!0;iv;|`xkHj03Crz@HgQV1Qhsv;kY8>{=^+W`>*GZ zvGx)AD=vPL)_wk-m;V5{rysPskN*IV-v0po)qnp0>8<|&`I2}`+x`IX-1_85Kbx4# z{{S*?37`JJcy0dx@D{)MynT9 zeCPZF=eKv>FjqcvW%s`K-raegc_vw4_D=H7bUwUXuU-M}zsI-rcAh+1qX7U|0001{ zB*g3KW$xukf-rL4ZmuqtcGgZ#)^spCdkb@KCog2g=e6VYi1+8toI-pE${_?n2#N#% zJR+!p5Hmt*2ycj>HG)nEY9d&Ope2HJ2&y8ui=ZunR|r1$XGO>gAz_4`y%R#u@ob3p z90Z^9wIJw%U>1S}|MAZiJ^MWbI}kiaFa<$EgeDQvLFn20AT){)F+zR_sUwt*5II7_ z2tC)dhtTtQ;|LlcxR0PCg3oc!<2|=OkN51i5!^+P6~TW9njlDqSfuCq-XVM*f-e#N zdA`qn2SIX#f3ENTIS!#02>%+vYlIvTqC|Kwq8*Ij^L!x)K9A3i;Pd)D``Z8beFRky z{x5=@2(lyM6%l;S$A+LAg31Vj5bcHtKF=o*!RPv({YM0Y5N!C5-}+Dc^M05iJ_jS> z0}vEJ&;-Hf{qRTdd4J;&e6Ftw!RPuC5iCKl9>M4NKKtkWtwZn`0|64Pi7O748#xh zIFq&TBp1+vS$c&vVlfF?rIhr)V3v~)Z_>8*PW?E2{{8T1nBpB)u!XoB+;BGM-SzqBYQ9z7bg?4Oj_bF(blaN&0I5 zZy(<7KR4>&|BHfZwz>DCF_S7PTiy7PgNpI{9=3CLv9vNI#ofGKHTM68$ zf=#-|MnqDpBxt!&VT`Bg{tVES%@iPfNLBI*nbqN);;yh@ovFR6-RO2?Vt zPjRu^>Txl9C_H{W;s%(-qb;Dco21^Hg~_31@7E1RxAthRnvGLDpw1GXETq>A{sCL1 zPXOvE)JXbtkw$YRO)R$7`|A%2)TNSsJFlu}nuOBp-(`tX<1LlT=6{i4J3X-Qj{+HC z8DKYD_y3UAutPnC5(#! zrhiiQf+V1?gH;3YXr4`14xa<$qN{$LrtQ_cjAm zfFIAGQVEJ5)#3fH*Z-hj=tqa~69aF0|?}}P;N)=uw za*qC%%qtA7&B%0ItU*m&;i-lArxoW8zf#=ab>cOp)qaTstydCEX+q5n>fu@Jo|#tf zj{rcEW9pNU1Rj498|XR@^{)HamrG=Fy|6kmFi6N&0Wil!Swkk(0ziLeCRR(x=u?o1 zR;;{OQ7<>RRXgrEI|!Pg9x`wxksQ9Pf1=%24_<=Fu8YHXF*Bw*mVX=#2x&CXuJ>=u zt8Vtiv$B+8$nLl<3-goh6iq2E7iOCb2I_I|??=M|I3fFRV??DvnhIGMR;MDaP9GgX#Nil9kG2Ft_60{8Wd z36>IA?ZB~}S-rFTnSlU)O-pbVUR>}#Zmlvr+(85je8eV)TgsOcLjI?OnA{6xG0k!&~8m| zT6F~%&yscq0-?PQ_aa&q);XK+Nlo+_U}e7q#?y6rPaJn=@}ryj*I7EQf6Cy4!#_6% zdpA~$iWfEk9dfy)B{yZP)IUT71(*wn54zBtSIr`|7GWJoa^tX;Q8~F&3I?kWZ=lb@ za6Ovf>TO33OSG@I!YOTE#f2yIAUO$r%t_FaExX!ds}cJiKMcId(p{>0i7D`J(C-G9 z|4w9Oxg9oW^D8B7>Q8T>!iqG!l;{b7Jw4pjIc8~r#Jn2W3UHno4q`YFbo!;}C*dgdHxzploYYFE&5s*d7Jy$zMJOz95s|+$ zjzlYo!}G59b;}p6*8(giziI+p>n@i!w1T)DMarCN|6a-mUouRJ+?e-%&#`d~2>xyI zPP;s^xjL%rFhwR$igs^iTiW`w%g)~8P4#-;@Mc>Xp|G|YizChF2g%IMs1VcKbxcWz zI`zAzC%}nbpGEM!EqE!P#JWiRbeK_9;O_6zh%Vmiui&v|xk}X;7G*aA$}>z{Oh#jKM$(?b z`=csJx}pMOz)(md$mWa?94spNBL*uS8Vt?g7Gs87(625<{kI`rX{3KFXUhHj!r4t7CSk&gS z#YrvJ2A~K6a67zO7c<{I>Ll{5$iEAsGb$@QenMOV8Va_hh5E%^uz_FlBoJlL#jK00f% zK8;4s`jNR?OC)zqAXaBzScf8H>y)rnhDbQ>iwgJfZEl0w%xB}%k; zEMSdv)b(d#x_QZ5oD2Nt?#(fLcE4j;EDzih$BI7Ny^CN8BPM6+Ijv=-fNMlVBngln z`v(O~PZ%#;o}Q}uK{FX_J(UyN6N7M3rDE76lNSGw5~Zpk{X{~j0j)p16o^ha|hS3Xqjh- z40XJH347~%H^TOVJ=M>GEJgalc`!b!-$+hK`v!jJ4Wi%qr_;8TW6Vc2&>4*F=@yb? zLTCnhM3&MO>bYq29>3>nmnKAI%%Q+%#vWeBb1hKKmtJR?Yt2>=SZ1Ny)@^>6CDI-G zfIZ`}7&_#ba+nE0Q!7GTeG(U2Ir?*H+Y-bR)0uF+XfH-e4WPQUWJXT73??$8vsc@$ zOw6}bkWlQW6L{$?Svlc%d=aJ}`>Ob0y?J8dGc}b?h&%J0G9|71tBczNA~dfjfE@)c z+oqkthhO(8DQup@8nyECGAZ&ktAM+4KT6~)v7j{RYPcNn8ZIf3m=dUOU)=q!UDnjG zoT`NZ?_6;!U6mMLAk15PIt{n;W8EC?2lFjWg0QkR=h@^ns7`u$Us#H~n8L8~TP>nm zwwsL3hA?L7MBQ`3FRHr234T=NazETrgE%fndsxMS*8Wb7x5eZxQaFK_@Vm>w$z^ag z;?cY#JKxVAAN_$Ow>8*JW=78Q4;)yZlW&bLf&w$D1AK{F?)>#kCwC{W0BGVnHTr3o z+N@G2>3HGWXBz=zY?V{?TAv3XZ!_-KxM<6t zY4Q9CmE9lBI7Injc~IM#XQ%dtaI3qQY{wFXgI>cankd$LQ$}jM9p@{faD}iGi)O=m z!eGJZO<|Ot`)EcgbcK!G+iO>uRjT`d4LI}2x`?dEWB=)MY=tMwfW1k0qs&iYiF*8~ z4Jt1(2uz9YhH%{PF=Na@W~wwSg>7WkaiVv5g)^NZN&}*+_7ke|f~*kRViM~$5S2Qy z_|AgCy(6|k$Z#NoZe2KV)Iw}@Jt8a^$Obivk;wrotrCzHQ!GH16WaBo)!2>nI>dHO zI&I>De|>EaRLJ*XgBYZpr$cpsiKPpJKJc^cdrz(gvNdOn+T-g?rP=J;57LPATDLPB#7?8|AfReqZ}wkE*;^D+TAq7ED`P#d8pTGNmz9!P-K( zR%k7%yNpG{vb8l>ppp*BIN)A_GSP%Bc*jTDTkpynQph>jNvg5wl$Jx_U4zeU z?M%9US!79RCV)q>;l%{5q(CZOFPvYFM9FhGA%czmz?0be;@)Tu#0mkuk6{QniLqso= z7UX)j-gF+52>;^*t!oZ@lN-OYejPO}r&@!NsXhS6Y!AY_5*=NBJICV^#<)E-u}vP0 z-Dg81la`(TI~)+aWkG@d@!j73=eGRBXpBW9uF>|D4KA;?>y-AgH+fHh+>J@knvR{E zGp)pilG=@zDSX5*W~Q0qCqUMt$v=9_vl((`JYv$oGOG$$ILR;6U$_91JIBqF`trz| zY@O;Ya7O4Z5cZCJ<-G6h>?nn#bq3wgV3LZn=RDWjk7ZV7ra+I-0^WD5CeoEW9EG@| zb4P}O|1iS+g-0v9)4zh8OsozC7KzJEOacruZo1_Mh57>n7x?J4*EyHHi~a=rIa>H~ zQy*$@Ns4C)DOP?bI(P!?Enc3THb#f?>FP{7cpf&6#YL?tX#i8#L3rVw3~&8-Z^F_k z0!5fputY;FC-eNC0F{U4|E|A86pA{=Bz0;?raS#oFjg;|FXeWp{W4pW#%qniR_=|% z?pka*vDz>={Cz8}rAsiOl4`@F2mc~Sa33C4U-9`m`3(CBz*j9YdvyJ|E~csO_O+sC zlZm6j!|&R~vLD{k*~^vyzDrhu93O>8!U> zife$0{Q>!AqrRz5`WTHS2@)q?mWF-(toQorkIs?cjV+ObBW>1&b${2>3;OpV=7ebS zYTV9z6`?bQ+|&VAjWvN{V??n6`0e#fir69_^;E~#2Ma6v?I%sO){@Gt8J*>^KJcBL zQFY(Ry}!)=St;-%ap*YA;zx{S}CCNel_sW+E zgwI`ZyR~oez^R3|q-Z0Ptl=Z$bw@%o#>^nj-WKbi@1jCn1GU2#E8MM%lw)e9Ig@cv z5(%B$cP%daCLA*AueEU()Y`Z)s{(If{73149g=LJZaQ!&`V-IF;NzON**Ov8f|Eh@ zV>3E zwV#++`PrRadZ>yG1d3>XLX)NpeWk#jSYAeK;%rcHLd8ztbx3z0n6+{AlVh4?+Awxs zV;aq0*I8h{tsuv5v13E&4NH3%iaiCj^kYGwBfQ#p!jyP&<4-FHCt7+kb9Agc!UOuQ z9olzFc~_13IP)n6ukV1CZ9n!8;Q{Sei^GZ^3}sPO3&xj6>iG0#Tmf&+j2+6Y)WyF8 z%Ef~V=cnk+gbm^}rtBnQ7J|hyrZkX>QPk^PTZbNNtd_0$Yf?B%LEhm9p7r|?50CZV zQe4}G3daNF8WcNpUtWL;2aa5U+1%6Av3Q_}BAxt`02g*sPVpUsZc&k`-Se`-nAWhA zoC8($w!06(aek((bi|4gf5>P>gM-{89(3r^?elAG$$)i=I*hPr3P_|XdtKq@wauBS z%h(N@KG`XAvjqEw9iJIBo!V^~?_$xT%8RyixUgEdYBRNy#ZD}3oB(3 zo~4v&3`y6B|4A*=M-|QEtWOX)ipj><33pMVOg6Z@J~0>LOs@#ZaW8c$eR29Z`j?yO za*G`_jLeE%XAnR{7WBSn63M#qVP;y~iq zs7Y0J1fjCMpA8H?7FgqVKzY$%wyGXCXee!2MfK!#P{%bLtNfIY>GlG}O6xuH0gh&- zxV+0F(r(|HD-!?Q{Fxeg^dsGyK=sM--H|%YP2T4d^@}&$zw`Yfw4FU<7Rvt!voG5( z=MHU)v{1tsCq>-eXZMbl!Z0#hdskq}s;KmX<-&kHtvD0djM|}+NWQ<<{s@orl#v0A z8?nsv^kI`$@yiOS6}9N0uwF`RHe~^|R+TK-dWdD0Xl^zDpOyn_oMg*TQ&Fcx&Z~KS zz>jikWvk4Op4zB^=raFO%d*Bl?*3S9=OensbVsK(vdq0BY z+?zNsP&B!+a$lVmsK=PfHcCP^J4FAoO6o)hR`mM!!a&h|XfJgYCZy+g6-n<%*bPCE zB60J{CQ1f>E5b3wg{Ai136xqzTfE&mD^%zTIx5} zXDA#qn9(d+Ju+n7)6LO(wNf)zdZaHc9j57*VmmNlTR`LjPanAkVIE=(t-bBYQ^Oob zN|W2Wvd^WbNRo|R{O5i5w`7k>7#uM$p0qh1E+j5^wA=F0N|1HK&Sykr8dM4_No0-l z5}BDS?CmE^AU{iwd(&QoSux==1ED=CY8=WHwF}ub7=>8**dQfO`cvNE3-?vdV}+}& zxNj1_)le$v^4lEE{z)?Zq5{6U1N)7u)_f}BJeJ%POdFZHs0$>?`$kIXvAAIl&XbMM=4 zt=O9sBAmeDzCDKe1n8LTtLFPwNvf!db%HPUb4J>jy$E@fifk}@0{sjl;^qVW`?!qn zE+0|d9 zk5Z3^f+_!T9Zuz7h!>We0SSK8{by{Vnh$=Z<1_m3E7*_jv_qAs$L~@jd^2u7EI=p+ zkG{$UG-+#^Km2o`TY#%$(AnMmCh3XIqj~;t58_egGU^0k6I~dTby9D9X@&rjqQ4MmuOzUrHabEYL z6V2z=i5xX81f?NAri&g~PFoJ{EcUphPM6SU-reqQMw`o4Fm>MJXBxs3u%UzRqx~(B zMw=mps52kIv%0%?E5+gkoiBgpWF{eLEoHg*@T?wPxfh9WN-_kv`4 zB68-PiSTlt0Hj8UUnLw(J*~W0##c&y4TMEyx5z5tMuthoRQM~5SaJuktRIGDm`SvQ zayR-Cx%^`ENlytchJxSly$z(KPA(q`^~{5GbWgx+>EA$DuWeJLYz> zuO=_KnSKubn-NJ_7i|f28F{Nj${K@rH=Sp$&bvIjT!9=55fHnjl+<0`>WRHriZ}k* z=ZCo&_@}Y-b%r!a)G80}8yZ9V{LTZWeh-|Vx*q%oG4p}?s;|lBd8ZAlza6Y#HDYPF zGoD~+@=%1%tPytT8k0pwh#IIZK5PlR)SyFV?lW~H!u^9hK&8%1&n}}A#|kd11Vtpu z{o)`T*&~wXQ5;p2qL}Xf!vFgc{#vk&7V-qZeXSeyo5AH*r>=EwS9I#l3!$*A{eN&=_dYEN}kd zD4<8-B4Q{<(P>LZ!zLpDeGT#%a7MK0~eKno_6B;@hD zZKvA4HVi%w_cBSX5;M*%l^v`l5ZxC?vAFO~G*UviYFhdBc)}3&Ro!3Ub?O^rX}TIv zB!~cqRXW7Ql}NgeDtmU~Ttxk-r2%H#jyDC6R>IVzp5u5&FZKa)GgA}y5!NgM-Z&%6 zTT%;UykAqx@t&RsB%;)W8laC^9X{i%$P` zn<^Pt=AKE=qzkJO=VdVRNml-spy;4p*5|^#*UfYLPAmSf!!W)* zxOYi3V_87}UNhMpo>@u`D+f^=Z8!R($%@|fM=ji1JVuLo&`1NtiS&A`RmS$j-l zQnLUh@>ox98vk#iq*@aNNA~i9gdpjj*A@rcsw1&3BAXl4yRXuQ#&$ntGPp#ryGz&K zElIJz`c7}WOEP86&;zaBR_WsYPCMp_(S_-dKM(1ubel!1WRs@Ml4f3S_gL4}`NtNp zlMO~mLdAL|_?f5Us~%C>J|Mn7JG4x0p{f-_tN7ZZ9z;?3r6hK|Dzpg2)4+AJY+YpK z-`n?WX<|`l>$$@*HGOMYY_Vxddqg*qM)(S-tnh_kp=K3rJ zpcLC%g6hqP{*a(Gr%R2uQ3lo$BB>qR#du__ztx?{_$viztgRGQqMIUAwV&v8Rz2|~ zT#p$hibciAeDSj^HFwQ7zdO^Yg!GO2s}TDZF`b=vwoAM%AY?v{K=h2no0&eUNi|AV(^q{wnS$UQr8N zo;qv#Q5;-9hR*Ca=~)M?8!XWDoAE7c{H5o8x5D$DRnZ@}m`T0_p3sbv|AFfXP%?4R zK^Z=sdlr=HA2Ybyfs23;SGz3-jRu)+3Vh!-eK zoqm4)i22g+b&xx*p0x*$b#}rwu1YwEDm@P6hMm+L*dAAC87tD;o=x_%*L=%*rD4~v zvFx$mJ60(eD(S*aG%@8#<;SgVj-$%$Fqi3HDHRLw!ti%3C0im;$&I=@AF5IeXsCw;x; z?-Rh#XwbGqbMg3%+DoHu*CcgUFH{t*u>p{0lZ^;a>PY^K6n(T`o8WL+iA@GcfDYh{ zd{e&JYd8Sk&-@10t@$@GYwu3T%!RwiT7g-nyVQlZttOcG+YAE3swi&>pke=Z0ld_L zaTfT105oWfpGVtk~1~xk~RE zOO^Hd;9LB}gZU zUPtSwaXMovL0?R$Txgh#?->VfuXYl8Vta{hNsoBGNqm~6vi#B_)ZbLN#l)i3d)dU( z?}xRej79dTmSmmG;Zq1(@43XT_ey|&KF6WumipbTJXIy>pc2IsAf4&mGI250x7y|W z8k0)Aj_lrPC8X{iZvw0}(8h$MboZvs480HGN~w`bmQvyDB!?iC-p}tFeL-e%?c^3< z26GMvP427`Feqhffn>m?hIFA5ID)e1(;SdI`q7o@PLnQEHd0}dS!22#H3`pli&|MK zRMrS?mIJgmMrz4EOZEPZ`+Hkpi3_w|?jk-L)5+^CH~GS~)rha3FeJjqU;DZfsV+gP zi8%Ol1Fe4kuX+3ofJcX&+EoQT|{?ce(i6>3E@${3?Ni)A*6x>0h z1t~XOJ+j!gjL0$Au=9mEI6R$hbCsdEz~ZzhY`>O&I@lnB!kP^N!<$?5Xwd~vRD-M8 zzUck|XDl)M02!3X2+z-7qy(hX7n!N3e*fwJvgd9ywVfs*NT@4ImTTxYV}rb}ftGkw zcyO#y%Y0h9&NlB~EcfR2baL%{x;WxVcPn+W^~9r&@OEYHVHLVwP2I9RxfZ;CQ^|c< z$rwZ-&2nv32_&g4c4D7~+%}?x{(YUhNZMRkD7a8LT{eD+K`t5hAtu;E@r4kJMg!hA zjpO%USw|v}y~H`~9@99qJ8l#P9+o%fe-E`jY{i9#h7gRmleG)0P%1gLyqBt!nb*?H zLQylSVc4~CRLDao)yo;Iw4!gOHZ^}F{w(U<#=%&YKI*|AyT>4i(jVjw>*hK=iWd6d z)__9Elj8j<(|m|JD(4lnUyGcY;!Fy6Pf1n4r0Br5_13Mce{CRpv*kM9J+N zWKCVeP4sn!8iP(oGB#C2M>gl4yGXT^c#E_fXTqYZ?@#UxJil?27lH3JeuWXw75(+_ zA1G#xjEBasL7=~7jrmt9TzLMVG+;*`8@0ct3HE3BBSG`kL`m!|wW>COMQH=nFJ@1t zzsNDWj0!gm4OJu6)>YJ`d!Wgky-0?jZP_3KW6>G)7rNAJx^Lnhj@-*H(5R`!DUcp@ zDUq`)H#fWa+%|FaZ_;-E)WH$1-JKpS97q<#Y+u*EqN>(thsw~-4HIrl$ITu~TKr2y z@5ef_OW)5D#u(=Pv&z8{JHfKawfnhfqH^A}&In=yYtSBY^paTt;%nX1b$Yk5KlObE z<*(lyjL9l0g7so-2*J=yNSrI=a(!NGwb%V+kZqnM7XRX!p9Br1<$N;opC#p-*8pmW zY)2rINNR6Ojs3)ThiX&vIMb8&(KG@+ybx$bV%uDOqMv4&sD~7xb3$bKe#3s;!KP`{ z1fft!2Os9h*pI+XZumr3qWYgwUOs00M)Q_h`d87-q#DPw#BH2{4XS;cAELyh0*T#q zj00Wyxsc7RfGfEeDIbNiCJpsvvYgUWD6nN>wC&Ye#V_4Q7g(~-wAo@H8XW?|-5S(8 z5uaXoy#ayB(ovx~_lXJnC|S4B*A$L1?d0+G-`>2i0H zOjch4pmPcjz{-$#F@=h5POgjeMCMtf5RyjIT9iz15)5+78iWfQ*t*P@a`L+ z%#6DE5Uh=RgTh~tR;q|dAMJ2vDBST`_E?5a&=^DFo&cvnXo_@gags3M%#ne0ulK%F zn(fORkgsEv{NzJbCyti@!xcBlI9Z&e3y=Jq1rOrxzJ970EX)CbU zcm2E*%~3F}PV%~{T>SnC!2UWS<+J!Om#xEN@AvtID|6qnQ{wd#<_3q#U4`^w5yyS4 zT`R^({(j|&c7o7Kkk{0QI_plsc*eDthJ$^ISUn#Vn}awfx8p}EzG~Go!)#u!etWRp zPN*v8*PP*+n>spc5VN&8KW~SHD{iU3* z<_GIc^uY^HfHd<;(=*VGv+-kR*scJ-71<8f@AJec->YT!9sZVM9M^-*_gzc~x} zx;S?2!T5Ve%&Qv5eAU@$jD_%3QB5XMI-5Cb3=ox#E`&|lJtg}x->TKd?F-!=?Vuvv z72KO-X5==PCqUC` z^s8}A%{Ns6!2Ey+I>_Z%trKuoy8GS$(!6|mIuY(pQ>ue{MqdvrF_6b1D#NH+Z?&7TLtjP}hw)UJI1Ga?3$=rI}`L*cA7ZqO#_2l|G@npIB;amZ;;D(bmf_#NI( zxuUz$Xh6y(Lfqo!yO0ke9*KLH<}aJ2Tt3{BO|51t8`D^}vpdK$-y>FOj%3@*NH3}& zGD8D75H^R$c-xRFR=S^OaeG2_TtUk$?`UyMTG`Jc`&+p-cl$fER`!ER8^>Ba%v|#B z)KR#(uqva?GXi09JL7Xe61)7%U4w%p_riXV#7oKkhLjZF$AkvJ=7uP{#C(FKyf;J{087QJ&R>DP+wTxR@OTX_} zvocGNv~Td&V1b-RX7le^y^rkkW+K`h1?vJ@hE4sr(yNeDw#`}UWu{1^8Sg#m!mCJd z>vKFs=HnoS8bqq003*K>*I{Zb^UtOD(JPe!b*g`jk9stw*;bbY-G%x)A_%iaY)502 z6h8iwF;QVJk;b z1F$YZDM7e^8Z@>V?GDkDU4TMAeBh&_jyy@+QDq&S-CG@QzHBLoAmCEQDzf- zwi?7=^D(urn-9{s)n%Q|83`g!Ch8BHX0TK%_9v1nO~LA)w3+)##{_>#c&(J=6lC>h z+S2^}eNuqhtIor*dY$biT-w*|yhdWG-#)u-5ir=JQ61A;o?xlGg&s-6tEw(qY8`vt_f#!NN_fqam;N!;DmK+;Yn4@LPq*4Le28VRty>zd8lht_rycS4B@vp;&!mbmGz3qtK*S%9syEbFb^Q3z`9sh}>P0-hV8XSx7>1y9G*Gh`{Xpd!( zs|kTMt<%8@WW=|*OSvdx;%UFU&yGz}*8V$yBNvgYQhxf~+Tk52Jnu;OtM%cut*t+= z$zGrcZ{zCCaP(vj9YVIbV6B>1ex>d{#CV|@%(x1F=*^YbBzCw<)!zp( zY)L3b`C8(esVtwb9{*ltw6RQhzM&#!-A&yGMBqMR1(L&a(8(#0*jml z09i3akjlEh?VClpGs$!%Cyl6jvV&7n97n?;uBu`fhMda%`f7$byXluLSWu7Iq-;0e zu&`}S0&RL58)-T{57pI)h94grUpZg9SYT}o&)cG3F;{_t4*??1cW+xyi+FSHz5fEQ zR>lHJV+YGZ%FKo|s&Z-sSO!dex+`6|CafVqjV#&F5z>TCT>l%dmhsO;oWNiTox^-3 zu=?3~YO{i2klPpOYb-AQc69mPZs98-qUO9grIk!>?suCt^4;l`!BcFt<%R0+7Lt8e zJQ|w4#PJH(nWNX8FHSo2Bu~bXCATro8c&>rBaezxP4bBO~r57=j_XOdIl?thi?VM zZ;T*CW4MD%%7HByT(AVC+VvwDY0(VO!U^+N?VL(qhA9QX*%T6dDCXalv8G$+Kv^D{ zg+>xnuqNYe+NN;aFrzWYx1HC2AQkw{GQUx z?KGx|BCcD6pHR2elq1NiloNbij^FO7z_mtx2}d}*jKS$=YUx5Z)T$V*hiYZTeK2db zyG%X9jSvd;c~y?g<-HrxZRg+(j_4+iA%`A=dW}YN%onhWD$vs43W5#^YR#1;AKKuj zBW_IsS6;O(IBz&h!CmncP^rrGu&*V~V0jb5PsJ{?obp?Z4sRc=iHi0U?Av0RNnhhk zPuFm<@M^Fc>935eOZ1?)&#F%Lm&pN1_ z!1y7yYpM?Odh6#Pw4CQvUoA7|?^({^)N&q~#I*gHHd&<-84Xre{^>dHzyDAxnElC@kmNozn*x<+e?BtDt~jF! z*6Wr}y$8yswr3K^W4kDbHM5>q!5UMyNI3YZB<%CGhWSlO8f)b0TL@qza@F=kq7B{Q zQ;BowdOV{zp!dTeC?2-89F`F)mEl5PLKm|muXD_Oet2YR-^{khGyo=L zu4-8k%4nq7KL3eH=YtS@yM#7{=nxUC^J?pXKF1f5~h`WH@}}Un71cho~QVDw*OBT_OaID zFjik&fM3+H>AJDi!4zN8WIME|B%*RQB5XT28!P-;vA3|3)H8zYXau6{ocfv7zG=rrGeJm^BHE2^N@#l#^pW83fJcM;vd&?;PdcD%U6r-5BmaQ z{mRjfL_*J%z7O%YM#aSdW0Mc6!RMsqzA@5|FAqweq-?Gk*E;Q73RhcI@j3weA_DuQ zUGi1J$Py1@XGu_pictoV$q>&z))4s|29*;c&TaGe@IKa~(CEcKL(P<#RVw2pjtt#g zYd3!koMgTaI=ZXTSIFCrwxkrx6{RSVkbMYZSc}L18qYtJ2kvc{7VU`R%Q}c~p*3Z@ zNErAsK&$VqWZR~%rafC4MuImC0qT5SNlN#M?JE9SL9}I&LDs`s+S|RU20G-eDvJB% ze5uA%64?=E$cmaWvzrcA_(RY-qA_0{{5{^I%tTH!tDT5w83r{#jhY6`(FR!FbQr9d zjd))vX=z}w*zF&TKLNP>T4;p0)iUX2XBX!)Ci}Du{krl zvtwgk&8vDTLBc}$r|gvOA6kQD>{(@U9N=oJsmml;vn6Utsb=b>aySC+ctZ6xOs{+Z zSi6Wr_vJ$hb>{odI(KB$QtlK*`J^K^58fB8S~3n|9S?6?(`CQ7X`#{-9=;*+<7`Kj zOTw@DY+Nh$%HLO8DNjfw{$OTV@L=15Lr?whHbl2kCRAMJ2gKjwyrDbRpIL?ayhea( zqNHG=mE&t^;!2C=)IcNv<6cPwahSpu8YV9VI_`Se-0J+3TcSY7UEw-ktbc}voYHIf zp!iotJWmkHPvi{9n6Cs{XKGHG^o-UmbjfPCc$9skh%( z68nWl_yqXm;KVF(Tj00B`{y@F;VI=kI)$q$@WUN>hYH*Pe92#>`|kHuxd`o{Gn$*V zcr@t()2C5y%?*fki*;UQ9#FMP91vns$$8Cku! zzXnVjw5HSYf#F|n^sm@rBX3|@{lY2?tm9I@c{}y~{r8ZADNC{MsnudNly+9BTV9hA zW!t|j^C{O4JWeMvME6fvC#glP!+)2H{86T3K9VwPZPsqY4Z^Bj9V(c_i7gOsCw)@dYzfDK0)q*E8cSU*J~!wi!)hn8F$nWxW`ed7Zf_=05PsG`1nVp z^a~$Bkl6MB&iy$N;dJW&xR^N(b(Yw81aXqk))s2JsncdYe;8F&IqML0IDvx5BOdk5pON#o=YK_s@c5G8+Er8oaFZqo@1s&Mj_X1WnNq;P3 zeDT<`vzuJCRo*1A<4$?*jQSbn_tw}3xlU+8ZBhc-=%rVpH_J{Vex5z4FZBH2Vr8Cm zzEVYW$M)*%o^an5j`@t14PWa@>wQXTKSzRelB;#JIyT=9Te(=3{o+f zFMM$-REqAR#@fE_W%RA1hAoekRsvBnR8&c(62CgX}PpedPMHxYzu` z498}`MZ2O8r#}pggpw~jlgV9do%T6WznBheu{ioEv3W;U$=xcSm#%_+QY}#b{ra3x zNQ&WczmZ6s4zRgmsOFU%iXDoRn2xku!Fd`HsaHhk^q!*7{!%>p&|;Zvjqzzt4%H7J zkj`GcXY#yU#uH5bMIasWmQ-89UQllD`b1^x8gcNOz=8pgbrYu6wKXE5@%=+>q~yK-!obL{VyGzu`>4|$r~+u%+$ zQZ`8EGC}OQOAC7eb}4RN>2R2y3yA+Y3009H*<4c_atqE3aDfA6qP^- zjdDVz(Rq7{ba~;g67i4jf>BbzAzPBmJ`U}?iqr?hE`F>dzhav#cJk}a9!;`#q4+=k z4We3p=e6-D%Qi9SHW5KN5p}(TPM~s^{G(w=OK%A-HKXw5BTg$&P|u!q>|HY%^MK4Q(D5Of9XD)S zRbqL=-VEmRDU!65u-CkWL-+O1lzkZ%(I0LqFkIT;GNLX23UXL-R)_<}hy0Q!z%F(i ziIlMvolmm0DYTTfXYAJy&EvpWNS8gs&I_7`+aV#J_)Fbwel{H^)#Myqo5{?ZfIoj4 zoj2b2a5w%`&PryHA+dv_&pIGc`uf~01p4#{{A}HkI4X{bqLrqeYu=)gI!d-<0&DD6 z-YlWL`dRf0ak773@d-c?_#kkP{#jJAe0!Ywl}L*KAkN>1pE>2oBmR!eP2A#?s8dr$%||crj~zTc;2iXP z;z|*h{U}Pc-1bV-PxAR6e<5zTV)!z+3sSN<+1FE>-%lZAsj$9nz zTM&?%3`v#^{{Y<|{{Uy&X{C$Z;ClX!>BO0LL;NKlntrw3-8{X*Wz$VcfFiq4eQCFb z)v{(Yg!`-%NI<1(I@52iXUCF5+BX!G!t(`^3DR%3NRe^tYzlI!0wl7NxV(Av>3>s> zXP@Av{k24lN0%CJMwRaSzYTQf(7nzLZ{k1wV@rVl0NEvHP!j$*ex+jK=K!#B4Zv-StNC1$fZ_h(oeQCX~)&3czDNg$8 zKD4n?xNDIDb1Izx)8sYt_}K1yO5$~@O;)Qn_w^g3%8UgMz2}0fDa(Xvrw61MgVz)x z6T_Y%1dQ{TK#rQ4AB{Ty08LBc_ml2}she>9jO!(#zQ_~$OV1NHQEI@ne1Pl_OYyIs&N3X1?b^XYjwBbi2BA{YX0 zc0ZJU7@~(Ta}`jPJh@~$!9U6(PTZ^B{45O^S&8K;Qe>!TCZvwpM4jtS{{TOazSo@h z4Xpq`eZUUmHlLS2ExbjGRl|CbP?&{K{{Y4E9Q4!Y;IcigaVio5O*uM}quL=#2T76u z3g_Z_TcL(aKtP6)n@QR~3{jJqd5Ia6+N4hAPu^K@o)15w^1QC?O8=MND{G)zmCzKuAR z-n%nas%WKUQmP5_+M4_=cQ0`LGz5_tvV3}S<@5PirT!o0X!{{Vo&l$_Ej zrHu}Bj=aXT-nJ>lR}!L?DCm|GUma7e5I1pcsSjnfYV%lJq9V zreWy&!Nu1wW>|(sy9A_)Y32PbmQ4BxqLUlw^un^)1Txy$Cc0HQywAUtvfn)TwSt}| z&k_kbb1I=A7_)>J#_K^HICX`akWK*XuARfD48{;)!e9 zMW^3tbz_=opWp5{JU;5bm%|o{arW)_>HLN)Lja(XtHX9-R-DbV4G5vrH3zeL9k;dB zUFMr+0u{2_Nm39}LPZjgk*A5$oc8cGrv4pIZ+T>9pK=-$a^#f$9yP75UQJ(Dg$I*q z@#HCPA{cOvURyzzja&QerZl|I@Q5|*M|N)WXapS(>uTJq&< z$do9ZocML+u-3MK_-n(|-aCxUPQhA6Q@ca%e zuMqJ!8-xcDaw(P7hr8H$cJTUX8Fa6#97q!f7q#qFo|fQr(G)$=Xzg*(GB`T`ct~hz8*Nzm^D}ygFa-IC8l9$L=U498q8$$TDcm zKEff1a<(Mbu2UAa+`b8Q@!LU1AvtriLPk{*DdV;MUrr_Py8|Qe;!}wig}F4#5F@2h zi?Gv(&Y6_O^s=78CZHv1Q-IX-I_tGI@p~nmagPVWHYDH+2KZeIxrk76iS)o6h?m2| zxJ+8c-R7JNNZz!lJK5L892CV4F8GVNGHg-1#^hmM08Ql=p5R{yMRt!~iIgE_ZbL;N zD3;O`$VoI6-%8oaOr=2H1-$%z7&3t>Oc?U`Pl&$W9(Y*rhm2S1ap^wd!tKrPoa$wC zWpZd2+e5M%wbTtH!c8<;NTsz0xF@SALB3&~X z^2I_t07HmTDIn8OX=dOjQMLMYJpLc7VR99qccHIk~$=>GM1y6TBly|>+A<(YS-Xv z6S$q7y)(I3zr*y41a3{=mnC<49!8|175JRFR+gCxDM4_g70?Y$tQs;Vst#0>O4R65 z4LhK8@f-YXyGZ~TJpPUtX8t87JP3BSLH9mdA=`qHu8X%2~u%znyA91ZCT=h_YSv02EuTYeQaNGs~TPEOi>@ zca@OuT->O7Q{`XIiP(yvDj?NFn*DqA{cY?kC#m?H6}skNpnP}h;q|XO6GWcy2U=E? z`uF(Q$CVQ#0r8%DW{*0!`V(|#ZD_l zCWO>)*UGAj?t-S0d<-k#)Olo z>+R*Qi2N*0%|T8<>pqEMxdn(1Cu^YNvjec=dF*HgJCZ8`gXsysTc*?NiL=0W74 z_2+JQtLEt`t8Pr(kvoe=m)A|>o%u~6l|l#$`Jbbg8v?FkTy zDcdpYUSwD6&dmW$N=W32`}g|sw@GmC_hI$O;*FX9{CSV(jj*c7wyU^WPM*)pUxkV< z@Csz8om9tk5xr<>`R~lufY{luypR2&en;D4i~5|+vO2IS<|ulLO+1gXRm2qa+|MYT ztvmi$X3y`L>!{D4`p?nF=#Tq8uc`k4M}@-7ti`#6Q+`wm({e4AO@7W~a^rm-H)A=e zhrBZeM%yPg)V5pa?-+>UocwM70Ie$R=IJ=wD6dCN1cBJLIdVuG#uA>I)TvVpCv6&% z`2c^}p{H9{RwYc)E#aY1&v#c54z%w>T!bE4b^HaaL(@*`h3~=$WS;JF;<|1HKMy+8 zTD3TWqc{x$l#l}0s85B_)Z234M3v+mG9pvky*&@xIA`*Q67N@W{mgoeuOH zX;b;WHvp!zmOOo=g);mhqPVdJWk z{e6Peyv)X0`5WkS{{Sh)nu71QAQNMI^q*Ve(Kv2s8_z39A9a{;C^=;tbfrEbwzyei zlxiIELJ|+O4Jq|reN9Gi(vkbo0-%zlq8*CUrcwCw9cVgQ+U0~PgaCCZNz~GYfKc@M z^E^XWdb+9q0IWU#0PZUqsQZoo0K-S&hX!7BQ97j1jgI{_`qbG~1QZH;$0*b$v;fy| zI{giFvN`~qh!y*^uDkR0d7sA0m^GS$PlYMVnfyLmXazt-^TO%ad0}Y^;Yk@(LbuF0 zQl2`I`im*xl<`n1h;oL6f}umFKD5@z*k=I9NvBcf2S3AYd@QG7VMs|FhW`Lx5%037 zP>4Q zIT~%yn=K&X1A!>i6#RXj@l)}$U&OoXM-Ldn5K~ifCkZK5#;~f_%x*k-($2Lfuj7Oo zlJFiP-ZuSl4t)-IkBt$SHw$wwHOhsO;bfvBVCB@kjI4H(ht(AKXv?S?jI}j9&3W4K zA!GA0low7?E07VC9kl1S;(V%m(Qg{tJRD)$D0vPKv}UKVQ=v{(QBf5+0jg84G2ks^ zY{rmM1whkLu+p^Y=kc@s}pe@ZR_i|hmIWvqvDX2B@qq;0ir^- z8u{|^=V9$koX7}y#3qEI#Bca-MVUK;sK$k0=)J9oV*7vV^J|un^v@_{CE1? z`Pkj6I{qK714{n@#q&5-zZ9_GDt${EjLHXodJiwldlbdRtweSI5~?w$>ww zjtc>4Ss6tQPfrcDsr+mSsgA0ustp2s`u%=(K)S9{FVy}Y&jci(lhQWv_+Wea)a!cg zqfxbVIv*ol4xZ{-fp8BDu;UTEBD`6{-|L|zy=}p;!r_rMgl;J;t25fR90Vm=YE$yi zUq`JiQ4Nxzl&qcq0O3ET{^MIx7Ygo^=@{bPiU}o#DnJ6DDc`O6Sr-&kQ$2q_=Z7?} zm6rh!02e#&`P=IFpD%E~!-7&2oEf<(016~ZVQOp7?vJf`TC4c>!kjR}ykOx{CgWUr z1=NU&zi{E_<#0{Hsl@iGpjm7rk<8a`Wv<>K^!Iz9gn$V;5@-gM9^ZYb=h8ywX^R{x z0-|!?sB)3We-&Lc9$(hQUf#d19Jb^rnc7AA{CwjUtn-vaI*PLoRAPsbJ(3MYNcrt# z%uC}c#Wkrlrz-td;4EVEgRqAMVyT6PS32s_PrzyT>16D4!2lGI-qUgI`1?Jy7H`@Q zAD8Qfs@(aX#|1GiE5AcbwcDM4uh#ZWM!X3%CcL?QcysdJ#_=zJlA^5-PI`WR`g5{U zDbl4VYq>wtoqtZ2MdeIK)PJrKbcDwDJifdzPZ;qEtxYxO@FQ*gwehlEJ}?B34LMMB z=U;!ay4dD5X-!F0DahAde*yEdE;V`9svRm%=nnMh?xm2y0G+ST1+h+~l0l_vNg5w- zhlc$+**6lkf%9pa>EZRKU93PA zs!YV5e+zvK0VG@rBkR`%t|>qgXnua${P|PL#ZHAOXLIe-%fnBtEM*X-EM=}!wR+QT zR0rHW)+TXlNg$F+E1b~xY0S`$Uzd%PAdUIpQdYgj-Vwe6M1|2na@wC>V!Y2ytWu?A z8k0fG=cSAyol;1mla)yYCbal|etX!d)ln5AF*Vx1J@wnp!G(k*2|w$;0=VERHP*Gz za`qm!Er?%uowVi7y?;N2gs7U8X-#Sm!iV8v=hQ}J6JHOH!$3#lX3l>Xnf!2%KdJil zz(;p-TlX}kLBZH<*WdqO46hC@TUCih7?}I z&+F^Q0i9l&YeTvG`hJ?&0@kxo4#tDu;m^w3Tv+h|- zgz@opDoH!kSC+@8*S5jp38B=A8V+9H*T&x5Uw=XOj{Lt{X>nBwt!bb=b*`ejbnzBZ zpT3TA+NZ|&@~rY=+ih;RLSN*cu@((AO-+2Yt)YG53C_B13Gw>;1x+nAFX0Q3yG;Ug zJ|Kz;dw#XFD!fzk;bw#X0NvT%zeJcfDr>3v*`YcBPxB&!^|woK@AqW-{urZXU)}-bZ>SEXIV>9&-=6bufO17SQ*CSEPi>|aB#?H| z&(1)PA3u&8Awas-qErXhmfoWs`u@$#Y8~``N|^?|h3S|iiqeO@^R0dRTP&6RnwP@3 z5L0D!?C*TQ0bR8<)7m+Hxo!*NbSL`RpBUdUe4Y24Y}5-L=TA00l0<)|4gE9mOu2}d zRSIdHEEObk8i7zbY4xS5Yl*4EWIhx~;1a4f;|U~JagPPxiPd( zGtB++Gc4I;Ocb{sU|+~biRFsfbWo@dy--a&Yg&1N59LcD?{E%4q#X@?{wG7_^`g|* zE~ca?iuhR*dMc=6O{-pmm^A*oTVSkAQ@U*mgB=3S-jRwsa;Np3=SRTF-(&PiIA!C| z0*``r_iN!~9PD;+a*z1tP~IQT2e!5Mb+Z0r_e}>d54?OerI1tOSh-5h$(lk6a-mu@ z_WccQMa}!!R$!#S6zr`;e~MB`9Xdh9w=M6~CzZ$7&lbPKMpRxncG4=N3c|J5`3FC6 zCT+I zMYx8l^)&~p&YruiNBwcBp6XFNn?~LsVa1lLl+!^_2cMTcEU1N913^GG_ESpl<6oVT z5Ds-Ye(g8c>*rcoRR-uMnd{TT;CJWFmPtz07Koo8(+3NH1Z*RJ<%N_Zl>jSEK@~n< z)bl1PuKOXwneb6@<}>)5;gojw-!;uI+qfZ*H8ed{C>6NZzWJ8exIHc z20%SaPmU64AvFmTX$Jlz976v9 zM7|D9E}j!Y;+yyGZ#IIxj!Yq;u5?SvT&72oCG5_@p!ZVZsmh04$=c)LV+crYswSEf zxgI|KEn41;*N~18t^f`+-8T4`s2yee}s>p`e9BULeQqk)})<9d@IwI zoV=`9{8AeQ30A08Rj&U1d^&ywYm6;DmZFPIDh)`lx88mhE{S}lN~x`R*HS(|UV4xc zsT!lx^AUpvK)Q{GDCOh+m_8FCOL1QMslzTQJ%FZgxEx;*kqL9T=+PpvDrPi3kD(mJ#pS>ac`r|;7h)PLzt)#v(J z*dk(9usbtA2p<8jyO16M2{sX{gp z^Zr=0ryNOXsw-bqXa4}jC*U;qcv&wN?N>z}=m*>G>tCZ`?nI1`;2IBAXTxTbPI~*P zpS(%%rF;dV%iLz*3!teNwbg{F zNM2ZX3PO@-KvG*FKvR0tYdBm;teg_WX28nXlE0V{U*uhB`T6q}VmNEUOfQD4WZEifg{{VSvAgHTzuP=3si<^#9e=*YrVYx|g+zW*C>3@gmg)6*b z;47bY_B-Y3?$_eqfaSj{E-?EUu>SxQotZOoXA7CT0#oa$P#~c_NGS?V+{d4Yqk>pI zm8O_|cgJ}^QVE^HNdxZqS5L~(7lxU1vPF-W?JbqUH30<7QWC^GG6QWgoXY_yNT33O znhz3px0J0$BWwJB(+&oQ8`PBPAm3v=zORYa_kByRcOjxj{67Bxmrny=3Rwvwa4W5M zA1e6RTcl-Bt!OL0rl4u;< ze>)VqunDfBp2}C>U&m_-b<#;rwHkFFUd{Kdi(gVe8t!O)pDQ#{^-Z@ud}r$TCIP-k zNm6tGpN`vobg^++BAQrx>Huyz)NiMUD*be^QB@XCE}aL5m*-+&%2uefM~(wT8gkr` z>_4To9_wLRnx~g8R`$JCqDQlF=jUxJRN4} zbodkb+tDcs(wb{e%fq4TZ4RiF8jk1{`meXc%UdYgVNIFc3b(Je&sUzzz@W?xblAbOOkC)-2UpHB-zJH{yDwCldLI_u~7 z+o(O2kN)pZF5Hj)Wa6!x{{VSw%>Dxr?)?7%vML_&@e3EU_ygU8bKEH-2*^&Er>QnNc<&0v1b^ic~B>sPojf3At!D1No1J6+XG$}Q&mx29v(@H+Yy{;p;1qW z-oI3~TZA~_xZ=$CPyYazJTtI7!A#c^#2v$zl+Z#-ON8=J zsnB}?*O9MOn#{7xz@ ze)RtU#8w%pfgR!ofSoDu_Svz#t{&1}p-?{7ggpNM#+^pLE_Jh)AN>CSU2NK3l!5kf z{{Z@|CfjPDe!T5N%|GUh=l<-!{HGSYr}yK`e?N`B9yqrS7Ydx6LaQ+!*w`LABzr!& zTF>Rl2nZ!)oisX)M=kt*J~pgg7193yO2Zw`sxeOv;3LYXPL{JcWdW2ET%k0lv+LXL z;kuQp-XFjFS2=Z2IMm$xh%^4pzmOPQGOp@MchkbZpU+J>SxW-&sMk^OJp9de<OO-d~3Vcp8K znu0Z@HPf#xejXNUc#nAh0H7>cIs3o4(_*xLi9W2l)M|A6sb>Zm(xp^Zl-TqdQ^L)E z5sp^@F=;deo0~QXRdyyBUd?{GSjkj)jknrAPM9eE@;P{Pz9FBYhX>>Cjub&+d$;0q zJeOX#W8oogjBBeh$vTq~^3I5`A`OyRodHC~%X@^B-Gc*j{|42~AB^t$NeIb?48<)i3D}cqq{l6 zU4IM%B37}tr1R;EJ$1kvhFCQQ8Iz~}$vf?~{{UJM#l)c?r!^E$v~T@7_zGLxL_kY0 zxd}CfV!c1QN&51#dO7sbN)=MKK3jf2jcI1e-1(o!4b{2xKaK)MJar*JigoyV{ru}> zoOEKH%!O!EPzdKrZ{^m);@?+fR8>t$-%5#nIosG( z+0bB5f>^a*jsVrdGoO(-b6Y16NcmQ?W; zw44{j9dt5RtN#FDdi4CPj^T9w0QC!UX}E=R{_y;)bZ_bTj4r|c&PUb2{V@LkI`7=` zR>OKE?d|yZR?rWJ^#ySck0n*9ib2!->mP?rEj!e*RFHqfuluC?N9$-6!}%kKe0d}P z0JXRO0C~$N%=r(+STi5GSD)vJxbaFwYq%Aun%T=Kw3$~Ugsk7?eY(!wGX z2syvPk~(d-v-;^`$5wKjyZbfQPi2!{{-3TJC-0wM#{ix>kUZ*ZO8ocUz+5C|3LwyF z*IoWT>RWq@B~=IU_x%1nECu6S!0Vv*6SnoUOecVfSj<#arqlyL^nJDfx;UbtpxU2Y zzgv26tGz?9Jo#(2v;s!nR`xxOPbjCIb*G=7m(JQ!tku$#x3?&*ISSLyujOwEPFm}| zmPg$lzlq1Op;=O*X-d~!eqX1ywhZ!(NE9H71LIGxZM{S)tJ7g!k1kaQ29ioLfnjb&I`gq!8-!n-Y zs5{i3uMIw{Xlr>ty-?^#`Tln4{{UrRe^-1(LZj5D6@217>96w`^N-ST9&gaBBD@q& z{{R)5FscLO54wpzEk1>v+w=a&zcqi}7HBzt%l`n)Zj|BQ?!)Vm#UC;NzbBCq=La8K zHE@x=2fUh(oq=9;9?BnaM4F%Zclzb$VNm}7eEU9j1AA4L9u)JXJ)~08&52nS`=fsn ze;vM9WG>r(=1<7ZJ1_m1=&$@+u_=;C$$HejbQy{?`1JC&SsnW^GX*OHF?JTFj9zpa zROy(qdXB#-YWo%u$zLkO$SwYu*hq~6m=~i_P@m+SC1TQ452vTcOJI7xNd`DYV#~6u9 zCAWRH{_m={px7L#pgn%MTXo=qe`0Wr?e6ONtwP_gn8tmd-!RRu{@iovAC})NS8Ljo zj}h^$k=L+N8l4IJe!O?G#m#80Nmjniem{kg*R1A+&8GT~I{kZXs@MMI&XABkQS-%3 zzutf2B>YT#i2ndwGEuvaCH(B&USGQ`JpR~)_&6-$$M<#Kfm?W=!p+U+(Gt#dn?fIY z!L<`K{{WgZpZl`^0P>t#@}J+2^9)<33oehfm;--PW1S9&@cI5WvUo@Gq>Xi^{>?%0 z=gY^Ltu7V7Ggej4)fxDp8hbVQ+R2&9GN+v@<|(M@*T&o|{{Z)jpZmk#`OY;nvOmb5 z!wUEXf|>$rO7r&owX%{GYsd;sK+xB4e;=-b$hbF(2q0)EDds+3ueDbO_Ea2%Q0q-< zH`2ZY*X6c^a>2N@#rpLhU2qS5)O~WowTGzM3DBAXY4!an&r2y`lnWq@4q8{4I_uY^ zel|wIxC#zqy(!`O_||}UX=M}}gbG(Mr~~U?(EF@pZhXHnk0bbfFr|c9O2H>uY<#}F z2e!?h5pEy!3ySU_ilXPuXrJ*`8GjL8RNj_wnqHw*%cg^K?dSMuX1|D63a}p)fY5&E zO#oi{m~~JZ)DnMPZRDy6orx#c^ufWJkA(D}qlo+H(7CrtRl|+ey)x+x6cyr{#Y|B# zn>7xEM#P{*y+l0t8PkZstch?>sruzMXc#D2qh#MX4rD4Pt%v3l`d)1Jfzw*Mh4a&ib z?=$0XhlTKRTokH~ytO*~b*DPp>3HNKgKY@u@9F1a#W;c~sWlX)!1?sIl{};-hg9oL zbsK5#+RCBP2gDJvj-Gf;Xe0n8-3%UIrVKNc4G*yVD^IU&f;jq;k^$U-Q>LQ6U$0Jf zFA-`;-$hh!N)Mj9`1G(Cr^;)YTaam5eS0gXzQ}4%U$3r~!eB>VS;3HqSaBWUs?8`y z)HLVgYK`HZBsIsE6N);OG|BNj=QrP%^|h)O#&)~(@AdGfkCm!#hQ$HLXA^D`C>UUm zVRP`H_Soqlg+<7Z$Hxy@P}1ZG5I5z1KzaWFELwzANKmMz!}@%6J~XvdarE(4Ch*Uu zpS~>r0Qkf8_*Yw5)I?HB0ZGt+Dbj+6m)AqitT^<4HYae@Yd|lHB>P-fhNqu8YDJMo z=gaiMY#4Dzeg0(m;>%ut`#dlN)I+jOPyJeU*O!;Lix5RbiYOHkm{6X+em@_X^%E75 z4N%kwR(AgY*{7$%r$O*b#YW{ylb2Ic2|A5WFAkm_%N1LnGx*_{{o?0&SL2N_ks_*W zubHRo`g`o0iG4v-uYe%_A5}eVvLW)YO$KW2b~^Rn`gmBPCB@X5_ki19nfB}XSTLr* z9~1uo(-_wf=};h^dh5C8U9|f1Dt%)qB!Rs;pFb`73vYG6l@zGzQV!dAezntm&5K=i z3I!zf)|*%K`Zo4G+mRp%m>X~P$|Cq=c#2s607AF?3KC?may9#l`lq(Y&KH$T47n+( z{{UuQmDBHib=aFJxQbc-07G~9e;|`QLF+^=x_x=_vPXs|6aIs)QAq_N5n{FHpHN3H zKb^gYjfhXIi$#xxzYITxbzK4eWmEpo)w%6uT1^k>l1e zH6C#}4SE1N?bpZ0U3BMSwXUIB?O$bf`t!EvrBNgUT>+<`FFuwnD()#poW(y6Kb@o1 z_m7#wbbjdGH@{1a1tjKHrnNlv-oT<3phz0^KZm}x_i1g;FDcA5BSZR{{T8FR4g8`2usFSBX{{R#9;k|=6X{N@yfweW#+j~Poc@bYNIcs2QUwGE0x}Oiu z-p8@wYOb9=e_vgETNOl;Q@6(2`&7`LpGRNQT`6ZR?wRTNW7r1fnX9I!!(Lxsg|xP; zw63I7*Pl`H`lYtILY15iIf8fkHV#b*S1z7suA5k@-F^Va#b2QKV5qaE+`kx;`Qase z-ydTwBx<5{-kbP-oV=n1;-OQtp&jaYYw)zPzuHRBl!{YQYffLU*7k_^gcUg82APVh zp0suYR8&uRjYj>eQ!Qk^voRD{hnF-|oZL@WmH0{rKr4pF6?y`rjU#qDeI7pPh>@ zfuuAaGniM}KTT_6G;Dm+^RZR!IoO0q6xfe-r+?V2jr9xj-)~K@#Xr7p%zilQi}qt( zD8gK9XpyDkhgCXe>^WD*OJ$0`W<|xP4e`~oK?$D0kag$k{H>Pa4`@JtT(j#B@2ccK z!kle+azLV|5F@h@ZdjE5lnlz^`dmpREz8+R9EN2cT)g({&efmBNkU*`4W#$IS(PYw z6oM)9r_r*1Nt|PEag7eh)oj2pl@400`THt9cC5}bDpMp?NCpj|O7ucU%>G?%wQwhY zDdBdu?5PT*^VC$K1E`H!`RhaH@%LFPc);~txqf5irL}6{J2w(Zx&r1pUN`W?NwX_Sx8GNo zjimffEHUxzkQH8}`TU5|&8_QIKF+4%YYEFwzCRraTM^wZ0GB~nNL zfs0Y=RLTRC)`ZjTyae2T4YH7E>=dZT5Yq*GVxEG2DSkZS*W{UDkOggna zK&@<1XEgr+h)C&k&*9^RSZI5|I-|qjem#6P#D4T{T??x#;mYdXnS7F81$buha~9^a zrWgo}n4vK*1R>`Kc}YzM{{Smka$H7WDn7Q;jcyl9V^Uo`rK{ru}Y!{r+Dkqwf7&by4z8R*O~DKoAvSQ?&WVJ zl=HsRhM_&0iJe6HMgG3G8tdc%uFC6Qe?Ol+EDkO5qAF=hdHX5(n$-B%3g1?Iy7e09 zEA_YZusE2KlA7;P`uGo^d6G?Im^05~gjBs;qVxFRTHd1B*ZI$fFRu<~YgI1}F9F9F z6ADq$Ofm(3%;vg$?PpF!Wmq*Ie!mZC`mUpDtKr@6{C4<{RcI8`1D3T@mGk*|17#an zA!0d4r2e=TDH7LFe^{DEv*0b^0#>Lzw~6P|#}+p1N=t2$O+8tjdVhAGXP2;2$$0pHvqYUh?|b&?xvx)g zuIFNMrHU;yFzr-SS60*Kx3t)XA@h}Fs0_paphtIJbo|eSysgif{BS5?WlAQ~JC9xZ zBiEs_u?^eQWTrhE~$jqLqN4ny4((Hk^)wUuU+!pINF&r6@=P zQL&{o<-I=}7H$V$udnpNE==hhkHqb6pF@@z%uvPag@oGKP^P&58J8L8LZ> z0;I`~aCvxsU2z%lr-~dIyjWp;WU_0<^i;}YDs_k^6%ODET7tBxKpK)LeuJmODze~h z$WL@3aAmY^zKq=cO)0>uFO^ zLEBA^D`6zD0x*0x}7qB@iK;UV2gLA}lWdSD`!PzYB3JNW+qUS8_} zR-}=rA75V^33<>F*OhnQU2E_j`veF0YCBg?DtOz#Ndv9}9u{bldJlhvf&-aVru@B@ z*t(R`x(#W{+Iz{?qO_>nPl?mV&s!g}@%eu|dmdsa0jboDK2-YG<6y`MDOFFH-oKZh z$EUT`N~(=%%awZg^w*WXP*Ri>Jcpk;d09mFW5VB-J%G#mr|X!ob^X)q`HKirfT$bo zP5wI_EE!57l=1rb+sYrjJp_Eu>wra_C!jxo!Xp0v0OZmBQ}Pyw_lrjrN{#;jAJfa- zX<>-u{g%xM9#)B0gc7aIC~L3RkI}bPdordiaLqfVK=z7=jiEyS0G28_qq^%7m?KJv zpOyX}mLvWARba^Izin$~eDCZ}$XVXMf9z^Jv!9)s0%!^7K33?i9scZ}U&9o<%Jl=x ze1SOjjgOjsb|$@mmLVu;K>R+b^lWg@D#}TqCr~^Noor2eY8i*<4Skf_o*I4|T5ng_ zs7CITgW?REVVh%8khzZV0COi->5j3#W;u1k+;{~;N!$-H)*tgaTP&Xanb-R(nUA9} zN=)8fK(3XnKO^(DTZ#Dnr7w&#)c|1DtC#zT>loQG*R@d79Vho=nDgg}XXzm%aithY zAMB9jC;THaswwR0@3mv`e>O~1RH6@Z%qw7#uz=?EM8Tw{RPAmGI#JUWFX*wEa)%jNdy{RcBYf zybFzpu=w~6dtw{9GNlKqNcYyhepXCgBvue>%A?!*iz;6J?Y%ixyy^Ax0P2KtBc#jfzQ-6oBS>LD5*{5AZ43t00YsR^c>wbH!w@cQd&;^B?ZiSiP5 zFwGiQ{t?Q%Q$yf-TF4qXf@#QCUG)G{r$cTWtN!&-{{R`!{O205`;Gqq!%yHp92>%< zldR7_L@zh zZzGY6L)}QH74~efq9M%BLl3){otJp^MQKgC9lHKBHUziMLscG>I(uvMY)my;%$xb1 zzocz!3w9+S{qeSd3e(QM&Xy~FC=x|;P}ip1wWj-66R|W`-TM09#>MW%B}9aPDPKRT z)`LUkt&le-%;7un3`uKRPv|RyZdQcxZ&{AjUFPL2BB>-d_@%Dr%w+nSy751 zO@q{vuDt8uH`m+eYRKXF+VPphDFh0z(FfY*+Wm4iQLUHcKO8Q~LXzap(eXcs-=-{P zHY|`*pXLb!c@KRK)~l~bG|q7^pWu|r@5|9NpF&U2?6zKhJj zK-hs#!^CT+m7qQXsH=(mc_~`J3uv6?s#-=$o`YW?eYTvdaT!1d{6k-_!{4PsE)Pk; z7TA<3ZhtHC@U{9*Ah#DQOSqwcG(Y~4roa9bA5`hjdQD|6fFUN8Lq?*NG;J07>s>7e zII&n5oq(ijMd3{~{{XE`H1OBxT55KR8B}Zi(|`UgJ{>+|!pb|hqQ3!!Tvn0iKk4iE zVWHvyKw$m-1t}#`cj%#AJFDyE^~oW_L8b}Zx{_%MvCw_~p29jGjg)x&?Qnwpp0a2B zf01?RuR-8!mf@vgI3;r`fAeJ@{wjVX{P(g-R9l=|za@-hLDQ`3R91m+(Ocv z(FoOUB^9cdwsJglAC;0yfeReOemmfl!@98pZMPh;Fy1H?3RtNcC+ls#bkkcEx^jXD zAX9R7`uZDKR8CCEIoPO3{{YS!8*EQ}*b~n-KnhepPw(2>*uQrz&5<8}Y40CP@9Dl9 z5M zB7mKTUAq2&SQGb$ui$VP!S@e)G1Lv~x7WX=DizQTC`k6u{64+b_S%X?PNT-Pr`FmX zJoF5;lD+pj>DO6lpTiEsk zD3Gd9pAlYvTI+8L6(D)*?AzTYrj!T(f7@TnO#Xs= zaK$DYPx-<0k@f42q(5fPEr@%ik1Z|Kr2VHZRpFi)dU6KeG69{^F0AG4dFqXR12$Lnif+Grs5Y@#TnlyL#*WY4Xy^$>_|% z6{QBAR3y}M*YL85M=BBz^KI|1*VR)OhM|h`<~%m2{ZHd<7cu?WKlUJe%>Fol7O6lM z9OKeGI{fg@O#uEPKm>w!9QD`Ci#BuMJ!Vm{%QA+{d~+vXqotg=qQDCvX4hJ8uRAu= zfK?GLG|)_8_uoZ|>G1N_)U4C~Yp5KG9Ff<$cg3?W{p)^X@EEjy8OCY*Mx-9Wkx{0Z z1+3B-gthR!knwmou;2^s%m!F^y+_K!qt7~*}}Nn zwT0|rE0?}&HJ9EOBG_u|MLe}jr4A+`+Pw_XQA$>6sR)>^03MFFVfPUq{dyGwc1 z5aEgT0{h=i{Y*epX6PQ}H-Q9-MhRjZZqCZD=<-{c|o`nyZmI4ppz$ zjd^KpFFKU0l1()rj~_3O)e7RGN{R{>qE)R)sUL@5FKq!SCc<};PbvD_1VRjtkmo;! z(~ql(A<%=#!%eoPyuM!>R;B{EPBFNEP|~ckx0?6xBXDhE&OR3EO-J{d_1j)`t$n&} zYTm$wAkE8=cuHPfDaA14-bt!_2I@s!m$GZlf5rfM4Ip4SI6|; zw(>VVUzotR_q;j$MkjlYoUC_1ribdDJ~r_C{-^W82?M=h_l_WT13IMfJC53Gm7&s_qiyZOsYTA&;2liyoSRj)8jHUOPZw@+_B(!lTV zf13(9vwman7=%1nWjLLHs-~a3DX;$kg+SZKTTK$+ASeE<6dV5lyHC}5+7$6rtk{)+ z#Qy;IM34Uf8kIe!AH;{nP3A;WsuOf04sQkBT4Yj{E^YKE``q zUv+zXeznml!*c0@_cL8RSyUZ+;QappU96zTl~)Nb#ZJ<9g-=q2jeb^2@Z{!97P+JR zFw3uvR%uR$OE*v59>0mgjO`qVKaL*-tQC#5TDIHn`TZK&v7}gEFvN^>#irnIl-BC{ zj8c15OID`T;LNQTkb%Yj#KsFeeRxK z`yg=#0WT%bxij0$#w^}gxQRS6pKYbYIy2=Wpw#oJ-%l$}_j83TW+4QOy42E|17EK_ zEYV}Cfx;{3R6FRGIYkNz>YkkU_W0QCz6z8GnDF$!U!UM`n>7-$2phn#vA;X~#x-Ds z&MIYvw?-~G=VGFsf=PNI^%cD8^6I6i)RK4PEa@#NP!u&Hq=IzjHu?UVGx!Nb;U&z{ zpV&e84xZm>K4son2%#EQqw(|h*be8G8>@5Xe;jCWc`MX!;r)JwwhNtIegfNFQVF3@ z6#}&z{b~Iy7}RW2L9y3sdjXG1S*E1yK&FRZD`*7rC#Ih(dR1sEm%^W0TjFb4fnHrc zzgv4A$CF-l_S@^4At#+bA#aCs=WmXxsYnBr3HN?qrMy1lzMp`>2j5qh>4xhP%_U6# z0GJPbqK)AGU-_*ou`~YwB(wfuXr*{XGWddR*B;M5_BN37)US|EDY=jL(brn1%KreK zBhCB&0AyGB&(6&Hw?~Loe04k7;J<(DivIvP{{X#ag-JRZiX>CdHoAFN+imlP{{Xmr zaZ=2P?fgkhcy-6rol{OnanE1FYY|?d{hg|ciqmhdUkz+_flQ;seC$(tg8fy3nr}i# zuP&Y&+H?Mlb3J<85_j;!5gL&@YZK`>=*RYZB9RLw$8@Pc6CErxsT|?;_VWIg%Obr3 zaZWJ>j)@B+`(&?RdHT8AYW4c2TMW-K8_PF$e_I zC%^;pkIxN6#Z?Ldhc!9;KDt@IniUt}Dk>8&VwC>?GI{ybdpg-|7_vr(YHB(D7Ddc| zzlS{|8$RWVd~HjwY`d1eCO*x>{{YHyYRk{tHY1^*LHc6NxM={-p-#lG&%_VI&;fw|~9c~|-kD$9n2DBd}Fsms_f2(JCnzdHE)Eoy8fB`uWb0#mlz4G-b(*4!yt zzwOmxA}XIw{T)!9zF5`}VWc1T5%>%nLI9uv~;PcNX}YBgZ?-hWC2rLrw10%`C=VX}gP~kWz9o)HSn;6-l+xB#Jpp@a(nw9 zc`rPQ?720GxKVB|?8$3LXgbrd;F6B=N@{*KNl7X39dLBhI%d!ZJWiCla;BA~eZQqB zb>5WPmTqyTTQR&CTYls+hLsUCn_bxWI4E&aU5Is+B?tqVDk6mbmV>wp#=Yde56b5F zvv%QbWz)Q|%amP7vr5jHw8%Z#Ho`{WsHrv6dia|xF;^S-qPrK;X)3rlPc6I`afG(? zs&e#WEvfXlkfEI_P|6BOAR2VBn?Xd$nKFOZ`CzGS=GGSk#iRXyO}sGb@O^V{CLLfc z*SeRs4N~dk98_}SVU#r}apzXqq3}?zzS3n+HZ{%=0(B}OAOWtV=m6?ZjhO4HeK96^ zgpn7re|DOH#8#l*dAqom65|VfuuDvb5=bG!C^gc|mKxt&d&PKL<#sVfat{59^u>{NQ`+#BsU#tEbGq8|Cd z&SD)~S8f5vDq>-lwHDMuN&Bak_OkO8orEDo2Nsm5r9(tGP!yzB!9$3w%VJ5H=ODjAlw zWeFU~QP@|hpw_l4TvR#(fW$(D1Kn4wvqG93yW5I;EPW(wl07hFC)Akbx7R#wE~m9l zx^{=x(62c`l_1tY*WWqHZ}MIYXK2Vso)G$Ej2&w4Gm~d__XRe($(96 zE|qa>k4j5{&>Cq}s4cdTToukL71wj+Wi`ZiNcns%hloK4U5vmdU;7Eu^{{okbECaZ z_~*Wd=%1CosO1eB=vi+{=sSXhas&0S0^n1K1O*^C39g$0K&adCua&%&ccwX+`GX!< zZrakN6zock{3p}uePGrGtpkaCaxOU1YL;^Ljv=shM%jo2_zLN1qPN=se;Oa|nh_Gu zLU+&O;pNt^<#<^z#U3KDejZ^5t4p zjMuSM8WR%lKAr6icm9?aNIEZRpNG_VVba?KH{TqN-&@Dk;6D^DrFfNrSzK*Yyd&;7 zh0=~E{0dPX0PRam?$nx!{{SO?-{Gg{`gFBlVondtu*VbdaoFqcH@$wnJVQukWa6Ae zJsnT+5ty11Pu8}xbuCHAnh&_xtu_AXI@j6dWY?r5_qk5pAo}`YC!5lrybj0Df7E`r z!%L3~{{ZTi{S#UlL*6trSLzdI#3c`5$@LsvaDH1%b2{{V}Zs&fJrTlr0M)%;p|fCTh^WP zpyk~=`zzsSVS+BDIO~l7Z|f+j8f%$+>1mMLYa|h<&QAQYkaV;_z?KlKcgBpsX!jZ@{*QTR|2+kfbe=4P!-3VHtk!Zqc!HT`VxILm6#X~=86 zI(}o_W{Utaf1%5kr5x3Q0QDLVmcBY!-Ep)dP^zE|)lt+RXEXh5C2&o-o_;>KNl0=` zB5rx_e=pAk&cTyid7U;tUR(0g!5nQ#pwxk<*N@C?V}X{rloaC6+(_G%H}LDu!4@h? zouH@kk*=E$KdmfM?AD-r9q{C4xV<4_lWDIIfLw{*T<#0=h^5ZgQ)=o2_|ExPmnueotUO8LF%Gy z%YT*pFNpJh0T5*JEBTt)qd#!}0L$`Coy+z9$glG&;kBAI=#+S;UmjN8_;34%{{R*$ z8Ib#V=u`8YcuwQYeC$_xhxQiDX+;l+rHmQXdh|90c~hDJ6({d2;r(qkqXo0lek7Q~ z5pt8_4lj?;M-ql%amJ)oQBt$6pZ%N5l`HJFSv}}Lh!C*2)G4B(Wruoy=nkjr!r5%E zG)}C-ty2>6j^0?(DL=b0{{Rg?hAl6S=ly4l`_}44T*`w2z6w=-X4TKddVrhDhPp$d zr^hI-#M;9++fj3jYtp?a7Y00j@$mWUYVzX112vbCU18CuErm4e`Pr`uBqEm~K(I|L zN05Q=+W!EqD0#$`*Ps366Y%Bhh<3m3$G7GzhQ3EE8)JOrAFrcj%b(qkZ_HT{d_Yta zK4f`QWAU~7GX2w^@RRuB89&|!ki#()-~yD^wBM$+vO+kX)q+9)0BUVj{{Wdie!Q%* ziEI*d{%tbBtw#X4(iFaH4IpAjGSi^i~@+@t)6{00x8Qnr*AT`CVx zkB8RuvQapE%yiXfUFF=nl+QBc(+ zKr(jo`A!bOUa%1)AHDf~emI60u-*B()7fqZT#LTVzdX6lVPL^r&9^@>d4}tT}XLx3qdKNDPCe}p(4(b*dpR!NjJoz((+ph5w|VkW6kjtW;Y7z}?GK4E2OQ{J~U}`#3%D|*tQQ}qP!P}LKGHaUDR1DT+v|kSR zOLuxt4z!54(XA9vfVBbPW#z)+25o(&m!k4T$&l6x$>pLtTYTB5c3|@;tXfpqB#_F& zlc27Ho}nBuS$++G_21G6o_=_FaJuKj;jPS;-ARq+ioDT~V5M_;qt%Is2kw&M)TJpy zmZxiL#il2d3^~3s>$vObpGQfeTakNWSZPf<4N|b8nku^sM5sxv_Tp;%z{g4E zu~%CQZj^c^QVYW^c%fIMu)pF<& zptK#v>{rL=907KH0dc<1ys`4=wBA-(bfs5)fPxHbN(!!EokqG-epXv>gFc$iuo~)3 zr?Jr!S%gV^y%iF&w-(@9>T?rP5UPs!4;wjH?)e$~zdSi`NcfMB>Ans4oyA!O7~!Si zT-I#ls%JcwMMK^9no5@Xqq{X_3CXHRQ4}EW)0InM^xElO8>a;~zFbLP84clydGi%3 zLZTFycKbt+0osZTq!FML+k0Kj>$&$*`85vB>5xmOkkHO&LvigUAuO!w6woyQnra7; zvwZdmVB(70ICXbQfg+{}15Q-{0bRAFy{vfsdf*#SNs=e)@aKxWN-&_fpZsbsh$B)@ ztm~$O`|oC+9ySBRRx9Do6k_fr#?SAZbmC7nX{O*W6k{$e>4^njc$$(0dY_f80o)P6 z;0nea-O>L5_=x54uGI7P*c$L(2$G~_!~48dsz>%zc5S5YqB`r=#aRX;$MVCK)F2B$ z2g`n2e=pIrcZ^H{T@o*9l9Z;EFslg#AQ}yM(DWmvq8Abv`-WH2^aeSWAX0Q03?eG6`{PYOrl<0-MPR-YBq<2Ek|0Kb zNQ6N_6wwOhQTI8LGNND{mhvikmn}!F(rA{{XA|zh0iIfv-wampcbu4PiwRQ*dtnVsd2= zsi6l#Pfa`rl`Lf>r^I!@14@}#B6lJ#Imm-Pzn!rH@Sh#<*6-t{D_)tD-NF_Hk8%SXPa$G>fuDLQr8) z3XbF_O73*lz8csX@P7(wv-^o5NmjbTq-7N4rsH3M^KP(Iq=B$E^ZhS>mJ)HqxTK|{ zaBs^009|@wEMhI>lw+;^!&vMxeRIaHjODn=>w&d4At6fAds>=;Da%7kPBkp*4Jw2- zGZFwKHjzPIdJ*oZ)|QF5!F*Z32kzXv4K6IL$(8YlFrAb$No8*;v`Pwr6%{{R*0*mK zBCj>qoT3(9gNV`?UfN}K`%N2(QbBE{ERmNrMK$N3=6vI7(k^{|tUC0z4z^UJgEP;a zx9iKM!=4oQw<(xU@b>n}J63Uh;g%wl{PN$_j1vRr}cJWJy39R;81vNpz+7keH~%MK-mv*-!;!c86iD zDN2hXZ)PE03)Ok=v|K!E@^)}|35bG*R#Z=%2`el_k)oRfQk!$%e>8{^Z*%45C+mCy z6E{9l)Z%n9l(m#qM3PAbBv8=M3hz<1Jbkt8aWOvUVZJ(J1GlzcQiA)- zB!f+WJgZ9bHknvqd!jG(#FF0V<~>>>XwPZcAzj7_YLG`#GSunJ+g#HPaQ{D)C!b->?2yXu0;1-T()G6s4w!X+5o)0Vy4O)dPj#d_ zm`8>xIStB@0Cg)6$f)V9Iek+>U{7I28q>RSCA>mB-{w;#UXM>PftcQVF0Xg>S76v;?0m&72SPS%*FKxpU;oDqnFchDit%&}~h% z<=4wf@S_eKIR(*?&=7QnNIiGM#%UwQt*`htduJ-<6USMG)qzwwjrC+pc} zkbT8@{#M>NYyNK>tZmZRr)FQiH|CFB@vXGwST(J5=}PnGV7HYyU|UTyW?#C$U)OsH z3e_7_s8^*cPJaIYor7M5A5mzekGzs~)M!1wU1@2hf3ouY@WH>~^ZfC29)=i#!#KzR z-T7eYT6P~){cV;b^gBcrTgDvU%>1;9SEC

+H5$FU-HcRe!}-<&7qj`?DYL)A(ZB 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�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�@fz)OFE0<#Ypl`k_SH+_|4ov6et^+; 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 PiGF~`|Lem1-^%|0_>btQ literal 0 HcmV?d00001 diff --git a/tool/tilem-src/data/skins/ti83.skn b/tool/tilem-src/data/skins/ti83.skn new file mode 100644 index 0000000000000000000000000000000000000000..6cbbe6b5e531478a3106595ac4c838f4a58e2cd5 GIT binary patch literal 291972 zcmeF2_d8r)*zRW-ZHQi@&6v?fi5@k2@670;*N`xR2%?K#MhSutee^D*5WPh2C5a%S z20=tUU z005AhlA<yFz{vxr zhd=-Tg41n$d)x%~*$qc`90PDf;aL4&{1HbpT>J+|4;=AuGQ~*}r$;zx;)KL07^mCz zw|@CJKEm-6j<vvmDfKwh$Fr4Oay7hd8(@UHdaDw6#iIXc%IXH3S zG>MZ9PQP&y!TC(#=#Jwb9G~MjgJUg@`#8SG@wWakjt4m2)+fLv=XSg>9B=F6;doo0 z1IOF`;p2GQKPZm)xHdo>Z^wHZYvFiXKL|&59K~_<#BjVlzcG%tez$S`fAMYp#BuRo z9FaKQj#mUnX&eo4y!8{p@iu?A@ooNGaJN}I26Zl93^n|vT$_8u?5FK95Zmd{bsb|*ok8rj;A=b;&?mW+gJw2W*pUV zOvmxouO7$S{(ZsmHh)_<2I1I;4=m|7yE6`Cl2_HooZuP!Z!t0;}+W8~{8jAU+lFrU$@|>p0Q>c>m8Ba61qI zArUbN7$0{lC&g9JqQu?QK|s*$4j*?A$OOd02N6(F6B5xtIRM1MB(yLQI(kJV22n$} z5tz}=n^W1IiHlpz*a01u+9fV=Us6Tg6jR@T^I`=8fCRTE`@iP`5Z-zb0f_-5xMF=O z+^KNq0O8{f5fBjKkpl6k@Ig=lYGHsPA&sFOhj$netw?Gi9ZaddYvN#)Uew6`kQlCP z9L~TghD2kyRD9AtN4%Zn7JnLlv}N8^9Yeha14@H|Pyuwi}x{k`yz?*?$B1wlV1Iqu`R0ldhh zr2&?0U4OjNhM`;WBfQ=cF?C@>Swc1mb=C&{oc;OJZM~g_I;%oCA%&!zX!-O8}xkJ?G#*MKYIGi zTGM3yZ=EW0h70e-IRSH-Mh>0IzC8a>MygQ z_}mxT%B=QU2I6Ofc~L5_<&plwT>9!WAD75`uB3^JowT?oLC7kTMX8>*Cb7fPGP$b* za_eLnhn5|2PxmV1biRmH7=8m0p3&V8g7>7-%yrRpgbKkk@VsT;1O;>F*HXQELT~N2 z?k7IK>htt1GfP<5J)?V1GptK<7|*`Y@w>tL3p5-nJCuIrGl&q`hUIZ&s&JSpSeMjpqaxxgEE~DD z*mOrF`qs`=qH=S|r;^@De7|>p1-}|9Gz!xYtz1x-+KMJ|zj-D?g#q1cWQ(71aFh z;nbOR<*YIA>0&KP0m8Usa)YH8sJ8v_3DnOsV_pFY%(lO^F=Z$wTllmsOh4Zwi1vOH z_N|gtE+OSIC!G#XbzvC`W53)MUF+XGP*3sxLpOH=n47A&r;YHg2{qf=f$ZmihnufA z&_$)$#mRT%#97~}BcOPwg10b?hIcIB4y#bg$_pKCKuWK(Kbp0hbDJVp)tgbNB8O=DIyY3(l z9Ge}@GA0s5`|1Mi<$JzqLimK|=o{aC76PKpqYLOEEMVky-3=i4u}xc2_{->pwP%Lj z>YquK!XnYz1bwB|1DYs_z3`!lObE5#aK7&oHut&DV)*rjMv-#EiQN5r?H z>@JjGQP)=PIMhOx z5cbdbp_h_Lew>Xh0)N>P9tKSM3Co7#16Xv(bMEHnpdb8UD=}>%3GLi$k@HUa^mh0v zaqH>hUvqpZJS0+0Gdu^hDWp-%ck0yFDHXdqq2G3Eb!ZqXJ2XfMxMW4IEQxnHmHP(3uTFKTW1H{YALM%lE4kpCDz|Wa_KxzI*nUBaQKlgj{L_sC{&eN%sQoxoob<>%Ux*4a<@|{iYS8j0FyD=$I zQR(p2^x_dKyOnuiViCNQBB}=hvPxDIAKcXPCpb;s1#b#BdJrUNx?$9o@eF()DR2+8 zamkswhKoX&vd?Y(cg|5W!R1>S9F01yJ>Z&6_duItwee3SD+iG`fZ_An%c0Fx{Tl$^ zXjUB;@jV*%4w07)RWYO-HHSBVS8kN=yx%s250QqIR)yp=>l>VJ8izms7Az{n%OQV% z9WhY}F$j(I<^W*LryuWQJDHNcfgOIbKE#+O>YLYW=+V8tGJc+DVw|-GzCUZ~jS0yGmxExrYVgxoe#2O;yy$_`$3^6xv$8z zhhB0WpK3XlYVNo-r1d??L&@I!GYg%JI|3zyVcI037e5IY38xd%Dp~9_0oWHm4q}*) zW`albs6M`G1wv<-DM#UF2ZHR^V4}2tOxNzlM=z>1N>z5`d}N<66rp#P%eBRZ$lj&# z(<}3ZVu#8QU_lJI3&z(zT!Rzy(;J$)4St5<;peGvYW}~3Ii#C*h3To15d8_eqKcN z6h$Ful4gf#>a5~>n<&x1gGw%ifj@7?l0gYCL)tD;Hj4dR-we*1k23UL2Ad@>un_Kj zd?zJ2z$o?aa!wz*lJ~CWk2~<1e)vl5}T{Rp+bqdNDj)g&l(7d5^d(S7^-1Eg1<{Uem8*GwePR!X~m&n#NC}DaU=B%yM znpg-w-I|L7Us?Ax54d>SFRh8eP*Lp#rP7-Yn$dj)5LuUuI#JAVc7&T*ike9|M_{Zt z(KeA>h}yG{Yt<^zl9JXk5{1)jO2O$VwEvoGIs&QQ3>b%7&TZPA{;b=|XHsU{W_EP_+&kw%D;iD>O`P}H>DC&+NZB{&8aSpp33}m+ z5dUcrV<&f&{`VIz8jjq#$Bi-A2)hAT&JEGU)znzcJQ6Gre)yBv@qj5)R;{A&Spg9# zc9GCTrIY}A(Pv*uwsO?tyIKiVLto6j972Is-yx9o zv@;0)8XW)f!ZXC}dT(5&!Ph^1`q?wBFT?ptca26G7{tM&siMO1Zg4+q!&V5b@zVAB z)nSX)9eLvbRuygGJpYe|(?#lnSxU)VNov?lL_F8GL3m_WD-b=uYK_FI`6k zp@SwuL91#d*)ao#2V&nm{=tLCt|JahNV%|2+k_ElWp_aZsssuDZr;1=b@;>vSH~9{ zz(n_enf-PyJb2>Qo+F+p6up{XS<06hZNOktB7@i8;BMXxI|J8W&M>~j25v$CG z`9-1c0PQMTzU5$eZVH&6-vH5+LZbDpJD;DCVYctt18+tUiHv8*0GG@gy^l6jTSoUS z=VCx9O(Qf-0QDR$MJ`Q%I$Gb-ulyovgwjqx*4&X(siNfFyVE5mLtmm!n`>vEgy>FL z$BQS^CIR%!rnJW<-f^Vq@7S~iRaX^UE(P`TG!K~P=#Sa4+)GP=D$Vp66^@Bir4?%? zTV@@+La~Vg{6Gh4o!a$X?Qq|_QARg_lcnoEbsEx7)KPIeNps9Od7OP?_W}yBF*T`! z;3gw#3z5Vs#jDlXgBw7?7Pj>(FOuJHw*-BkrPJ#616nX6uZpfP#ud5Zrcv>DC9Zwxp3d2Yi}FKMmcj@9O3?s8tq(@8W<(VCy;kP z{~!{ZcEzVpHT2ya3l9#%hq?b872R6{D-QOjVghY;VAG_AktR=PCpcc+Lw@mm-)ScL zai7zDP$tYiPBJ6IN~A?2A!bpX?c4dhrY7Eti_+7-6(tt2R>gm%bwAfVvlkrKXEcwu zt794}^opac?IVv^6V;Hs=(2~uT^V04&bRqkn(*g&@Y4A379{vJ-kKcav?^U=HFLVhMA{tU4f zjV9!Hg!(Al$m>Lq!vr{xZKO3^lRV6wGPrKe<-jU(&P8b}>$25~7+bSxiqlB9DRa^) z#`^;u1c$=%BD)V*wb^%=P8P8t*D>?&IO$a45`N8*I;nW8K-~Nzn151_TQl9>x<(~s%ndAFXA!q3DT#Kp9X!q;nDc?hlv}bvW z-fYEv;QEwb%|%!0FPgvh%BIWCPbrI4(xPW9_6-|#U>OTa{rddjDrPgek+!IGHK%>Y zdY{s>Lc)Xgxz792_rB_I)Sa!8$b`^-T8)yYeR{=eqvA(AU{lx?Y zPLazg#0nLUfM$+7(=9&9d*4l57%yH0E=LmL zTpufSfF?iw>0h4gD_+X9@ymF_mLR_NpU_WYb?c2O6^j5_RMApt$D30X`aT!zvrLTO z2R6odTId?vRtydP0EtQ=z_#<1k@_Yh~QMD6_v}D%3F7bqzhL@ACcFGG62?-JD=!-95&xcznWV?{jg@Tcj)yqruy{3Z1?cmN{y1UrrSkHo+Tq5l5K4^y}~G@W+_p00c3sR(?H z@%s(nVVf$#FaLlTNi7mJm`#dfY)r8TQ zF7TzISEwRU#*j(?U~S-rwV8OjCl2bxZZb)9c5(91>aaz@Nd%8ZN~mR5Bp|w$w!#^0g-4MLq8?cGO`*|C)_o&ZiF4 z`lQGNbcxKS&}qnxoPnrzHKrX|;`6Ogi$y8uyU%Sad9uFM=<*(%&DfViHVrhK``<7_ z1r7wDTD}4tH5>QMoSk@x-uz`WB?1fm8w9PtP;h&E6czLVF7OVyTi~1|WX7{s!DA-a z;pi@;L~s~Oa2K>JdogV&0P|ewv%HOiO z)wWzn=zb?BG88W%;m7kJ(ebiVv^G6Qi6I;l!j$CGk9sBgGn-PwnDLk`>joe?ZHmQ6 zyUKW}vfR@JsX76*7}Esw;U$*NI-(W9xq$gWNhquL$DC*DId2O?+zcvNsxY4q`^Nje zm~zUj@ig+7$ND)X(kn6IiGM%hr=HM9S#3C!Wnv^@%XhPixHPtQ6h!#SpEo7QV3=Eq zw+&Ce{NC>R`{QHgM$mcxL}j8iVu6>de21N@RevEfQ_4w*oK;a=6qh+_0dXYPIpO~J?Yb(+rHp~}CCM+4#K$K=ji$rero-#hv)-?*N7PJDGvh2wQaFg7t zE-Gl{jhdy>Ii46Th;kNwUo#Ps=1X4|J89etnp7NoOgmq}htN93+Hmp~T%K-+f)QbO zsxGb$sZ7=j6pz-L-xnpJjw)A1zR0PpV$x- z-{a?tUrB)JiYPCv0IbfNR-u^OI)^8rYGln#tp+a&T(j6l#VfX)9N8(Ol+)nnq5b|% ztBHLq{NaZ-|3q-KAZ?>WmmWI^=FV?VQk<$?4GEy~k zP2v%T9~9SeUkxJcRVi!oR{lPcpE}uN6)aERzs@=|1WokYS`p)BXO-n><;Qe^DNP>ux%DU> z5=fn-Ex35o4@Ic;LjK7h4_N0nFJeN3C~+eQfR-?N&5{Z8tV_(ynNr33f_l-MWd@fk zttz#Z*`rd}Y~TBL1Bh#h$?oeBB02Bqrzpl_3Scb*7c%l+xX%;Rb<2p@<<)%&w+@B+ zrd4V(tbXg@(vXz(rW)J_U2K-gj*t7XewL(`GLjiQiFoiqT6fxk#JsT4B0~|SCT7_2 zxS*kaS)>tL``6i4VO0LkL34W^dIf8d4|dMZeL@H4QgfpVOKY#JP#3@8m`(^EDoN5tg!gLLYf9%$WzEtt+}#Y%dBP!W-Qo<- z_G;jPH>5@E_SnT?L}!XT!a+yy->&lD3J2~(CH~wI@;_6_7OSBc9lZs^<-xt>?0;_t z4_;L)M=@53>lV+e@`Q8G%!dQWdLGkdQI9wRHIHakpXMoVK*JtIX{gAgLl?BA%e}%h z;VM9~5wlldRJI@SsOHQ*{UP!9;`SM3c*95(@2t*7IB2PTjO^tKm9LjJ_d5d9@9I0; z%pzT7Z12BtiKK7o(H$u!j&C#+`3Y=i@hfmPo1SfmHL5XhV;@5#m=XYhuKanXwbJaG zxGbf48O5lv?$}M3=-!w<==~06tbN$4swY$xV?Iy9vZ1z)g<<=nDQn`3+!a9)Y3X0J z)rPH6un_(<)8XO-oCEc((ldvcjq3&>j@l2F-P(XS`c*)PVQt!HO$OhSmDxrFJAR zmP=u5`cKx@dWo09*&!r#-{D)U{8+30`rKCqGk-yG(!EWxUqVqGE)Tb9VDvBo(@~{N zZkNMrr4I@MhN7}zEqIzrlH{5o$J965Uy=ofnT|x5@Mj)c4bs%o7Cqb=C-IJa0L&DpEBXdrmdv!&;UL48F|rjCCEFUkAOQ5M2|hX*WGc8X_*9c2x9 z_f;253R400jNwZi`5UsUL$eT3e>W`uqVROmukgz<3`G3KhTtAs6;4R@Hs zqoJI7og!-I^+~G2brVTCwp-Y!yD?&3@eR}@Zi+)6dsnnOoI(F6JFg+w`qpD4_31ywP|Q+d$Vo*P8gx?=V*|_f@Y^F0g^0i#;E=fKG_kgut069 z2+v`-1D(%(CBVenxba%b#3r@+-IxJ_Gg9C*mNU~@?NF_pFm}mgQY5+cxc|alLDTf^ zvo~3PumqY8pT)u zy_4TII}>5onWW$I3_>-KouJ~7U+govVoxFHlp{qmLzy0Hm>nUtqDO2%Xx%bOcpepV z7LLeX>4{c~m}|lK8PxGa2(STxC@WrWKM+kcq2!PEbNPe9YU@uA3CtE24Y_Dx?n1tf zsm!CS3jCH}^H}bRpDZ)nQ&+~y2+T+o%%JP304*jeF`Rl6BG&PJXVo7#^XY9RSGJ}}Zn{0)lC>RxL> zqfmP7qJpKg$J-=44~=^ED)u>g!?oRwM{BV3x*6%aA`5&+y!xY3p-D_`@8sI0O6;cw zrjO`#{*poylqLu|2}SETUjy>cL6axk`AVEgkIf(N_j0I%G&NyrOJea*0*Ey}S^G;) zOO$;@o$`r*a~`7i<1X=2m6(;X}dMx5Q@lgL%ZwX|x z=JZX90J-`j?c`qm7kypr>x%k!VPx1lRQjgf4PsR>U0Do7Ae{;(o^HS;Pg+IpuVFDS zG^waMbA3{wk-}Y`xqIwx1=mW7oLW_8&<}mI*~7Jl220h%@YHsUH3#}v z>b!O$eJ?7i2#JZN8YBcUvZyn8KVAG)Mc|iG_tsIkCt*bMyWh5h@ygyrmiF>veoQ5k zu*6%1nw7f5T{9M1>d=ymR^#2sM22UPn5=z&eCBixUM^#p0?=r+C#D>~HndAYkai>X zNlL}@s1dH@e?ObFqV(dNfio)#z5Drqa}DCbORS_BNSfL;%DVnj}PRhT3oWJchy|088!@7;g&Rhl{dSNhR7t<-`2D zAQ+bj3#|g<4wH5F<1rYKw8Vko^RVF+phaL%SRGRimQGkweY)qq2R#@thbL}hB!R!0 z=F9$SXo9fOa$W2|ndor(b6~3AM10ewK;5g7PfDCn0Z-DRHbhE{a0`MR&kJ%jpz zM22W*2mpBUP4~y(10m7G=zGW~2JkA6`)2 z@rILodPI$8>3{;JO@w&0AZhcxCU;_~4J{{v=Le%$3-~mNk(kRt&J27Mc!)}0t`>hS zok`6BkE_wSd;fd%XN>}C5@+JLHUJ}TdR=PvV|Ss1j02fEnb$B`&*b;{*J9>GQGcZ{ zYFY5nm2|BsWk6~D@(&YEu7^FC29ZqrFAx*^KFESyMFtuxuJD4SWJkw^YTDRTk==_> zJskZtLZ(KDd8XMOOE*fcH%Sz2tz8n$XV+R*Kf_1~PJX@te4bQ}#c!_=NUaG~&yD7v`0iGYz)$D={c?k@#F@5j zr4H{cZTN>p5n)0}s<}I*wHuf(A6|KM0<)@=N#OR9DRMn0{M!QWISbveZ7M0U89W`v zNPSYfmgA_kJV&s(KR-zt)iye|f`~4yY!|imcAYkG$kKJkUB}he{#&0JtA^waz}6f| zF;qM7ReDU(Fz?<37DGcYUZq7hgzafR?F7{p4D%ZFeuyzL^wmOS^`xv+z>~x@wK5f8 zj`)&F<~EQ@Y~a9Gvp2@EI*WHy#J>Lm+x4Q;i%_Lh~BTm#)A1LStOmmgd--GhZcN`kU=+YqbyFH9i9OsH7@4 zY&TPvvyB{SlfnDCfU5D#L2<%I+Kx%Xoc!Q&+N!Rv;&V(Wd|-4o2-XsbLFMw%QO*sE z9nqV$aFv%Hm3##K(__Q$BSdU&~UPTK)CQsnAwAa;IXxl2{s2qbFz>YQkE~C z@1l7eFv^SNUcK1YW~J0x<|^JXaIX<&_kMXbwH$~- zNi$dn8b$i5s5r(JWk zQcml1B(&a9PBO^I^OoH z2fv%BmY!|snV9JIG0}2!N_FydTj0oU{K3zWIq3ECeI{{&rZ{IextB|f6sMVcw~P}Q zuZPYPXw^dudMB$~9`a)dbwtiT{5V47gHt~7T0YS$_Mt-_jjs{_26LvF;8>Fs^?O4d zZyK%d?p@~4|7{Nx31Xl>L0B7Wb$nv&m3dhXR?M{UNqpWBO}-0;sEy^s8$cajZMXvCvu=53{YV;gG`vOI#LfSbvNTprUqTwmH2+SdnTk! zPEYC-uH{H&gv$K}BQb{qZBXxsl(YEm=Wn9-qdu&bSR|spc?KvnF3sryK;>dPJoqC8 zH-Nj0m)c~DCh^r~J0?G?U+4W&nkzIQs8%W_QKw0jkD4`nNmNmGf@ZSYY;}I|HMs|C zXtvA6|4K$P_(Kc=yaso?(Zyq%m7l4?~YF7VcPtOtY05>P)?| z7c}XRMIw=hcn&ZBTFgD11_#~yW32vdfobN*_r)jF*Y<^(^SJhG#A5W6Pf@rJBxTCL zU`60`TN3ZIZ~;;roe!6*69Z*Ma~jDNEI~`WpN(ibA5|nqtdgt`m~tqTFFbo}sEA+Q z{+j(kVl6PV{2zeCGlFHG>fpPNYYU>*i!)1|lhRLNwRCe6%PJ-uF zxX#KC7Ux$<$I-v1NpoxG8;u&>&&)(2rhSb4dBuL_uZ>x}_!H=c);3;PtWRzlkp7h1 zrq>0`fsZ0upPuo4jQ^?1Ll;hK!faM+X;=RCTwiJSY*MVVp9H2fV2Q=Pj80=5j6%Axlt(?q$Q_v5 zpwzmcol=Z;DXLt|;xv3h9(d*}WbGXNt~b5}6{t1}u>A5t|4P-R=yl345 zsgHGl?7{2=1rDEGsr?6~5054^e>nOR$)27hJqSKO_&G__O2^8cw^&8Dk2S5UmHpruh3X;@*ZNiIhCCw`E7=Uzmc)o`)EKD}if@-xHIiT)BJ`GZ~CN zEfGJZ;*;=mHX5gnG#Bv1)@V4bi!JZ?M;<5Z+4Q+*)KeX zs%Tvh>J>q}z%a(N!3@s0ErVXWqN)sJrYh}G{u-}Skb4_yu4T06422phD@3WZ;a{y7 zNkkJUGl8P0n6jl{v12dV5tD|8NR&)mmoOaQcoCC4#$9k^G8;>LwH*4&4x-6aBur>> zs_?z0hGr&gsf$Mg@!a+0Wy7A>B{(S!$M87 z0H*%>Yg|CHkpd^m7Hy@|HWvDFdV5H}_d{#3wQ5_ZDm&hWFQ{JQE1R4R#2)1&JHdDAFDb?C^OP|%Au!`#|NVC6G7b(aPV0jMgKvSM;J`gQ0pgb#c4%ZuT` z_gua}=w%9!0!B2O)M^U5tC#8XZ^0mI^&wx7NGvUX!xO3kf)7D>pBCzBSU1_)gt@v=ul^L{G_gbZ=zcJq8_nvjb5WD0^JUPkV zQ!WM#Wt{uf|YS52;4{;(r?(!aJNs4Ap29vaQw(x|Dd2^ixPdog@)= zztbR5P38Wn44iZrb)>L}8$95FhVTtw08xR^Zz$(-pS)tY5Pb-Ld7X;>^@Cc4>g(4S zW_#%LZ!wRFSPg&IPStqb=`%pUmE85zunhMVe>;{xp}r~O)GT~8+kByr@LT;vQp}8hMbdhmAr-=pwQWHN#g91VaN;Z?tVl~YHr!rIQVLK@HNq)Q6 z(6Uer0JG>|-8A1_-s5S)GEH1|`^3S;^oweD*D*nkjgHi`6d*kCg24T)C#T`&D(HF1 zOR$5|>Oa*F8{91k-M%g`>xJA1D93{(4X_5~&wG=fc6-u&x&#{II~!uGogQoJ!hVw$ zf>+AP3~L(CQq@K@m8q;>ZH72nzvA7%b0k^r&`EJ*{WgH+aH)M`Gm-LGIwPBrQjnKM zo-Bq!a+zXy{dpDMk*0(>Fi}H<@sK8K?sK-oFh9nT@T-DG(8sEvd!dss${28cupfEV z0{b5T=30oIKurVe#3R;Zd~SS|t>O4^?v8l|=@#9=`y>bJqA0j!Af2BKLCVLl3})MS z9(Lp7;tOG3va!#G%qoenPg)o|m66Yqv&&Vx1q!5+6qli^ao-1}<@TV2DX~(2cn=`t zEZHI;mE$+3@yd`?thqw}#W9OwOm^-eljw};(3j=MM@_0qS*S3$pdxRsBUy_TM#!rG zhX1EHCuWL#ze}qI#9yBqO547kQ1JvDvK-wPsO#Q+{Pu#my;7cBBwHMKF9|8S3$$+{ zprurgW-`!f|664E2e%m5;>j+uu%p3ia_lW!HxL82Cpm=mD#8%_nyr!0quy*3y?V6R z>pt7h>7m_EMbaRlpvR!Wur1Kjv>&>}tYydscr2AQaRO6{1|bC~T&AlZrKhU)bRU*D zG!P=wpMgRw?d_r?S`#XyK$5TqzLW%JFGsR)d8L@*Y(S@#Fw-f2LCRvpM$Xiy^Qmu+ zNOi!QNC>QzkMl?^(cJ8@ggY(V$?vHACCU&hlKMk`GGaFlt1{RNbfQsHJ&rbE68Jvu zKJ=lXCLe7@cQ4%zvc+I-!!v+ey`622r=zE>_?=|1-|7b7daQ&LEOPBiAjY=!gm>4; z;&H>ty=Tm1G?&;k(_F@doryci=UvABN)1XH6p?OZQRH?@&A)A|;B3|ho*bBxw#1mH zhc1v&)I43N7G$3++s#dT@zuMh$MsiV;k~gX0cMq`0@XsY_@*Ar_Uljw>v$e?&Zo)Y z-E|Zlr>CrgCOZ}O2qE;D*L+3)Pk}ir2PZktjHxXaR4+H7Rvi%(>)6+VDZ4JLdYRE)3q zXKWQVufd%ry!7s;wBc-%AMlf_1&iLJDPzXeOi(H}+t(`v`rmJ;xJYYA!fd-J$e=!A8>$_|RdFT%VCM5k<1zNgko>Tp4wbP{K4AP2))t$Q z%4EO?@^vGe2xkdO&#_+PkN0;I#v|#X>H5xYmP(X_Sscw&;JW^zAf)-OgxVeuEjn=i zgTf%s#3{vZn4T=lepi;b%R`u_^GO<%41gF>=3x%T)D+W3xx8-sA)=6@)B#VpKmS6( zfDo-F-#}m``>y<4`7|zc=-Y98x_bl167D)w5BYq$01 zoJoRnnxfS)?nOVGl~0JJs<93L3$gmB1CNOLwzECPZ#;RuY>(*88IpXNO%et zMC^d%AO6;)+8fMly#{WbY0EJGBbqMSoZd`R0w!>wPrWmLbp{e-=Kv}0$i|kWR_sm1 zq(<8Pvfs;ytmEmT0wRC}-f!&TWQ>lN2M^V0^RSfyvze*@D)APq$eZxu%rFh62PzQ| zVIF)ztrrbnyrW&dVqPpZ_Ggx57$#UU(TZ{>q9R0E@|pk9J%z15Z{jPJZO@80V}^m) zB+q+N$MkqhJKqQs-vBbYAOloMe_{snSDq%FDDXxadtYb=N?lD0f6<4ay7^t|dc&ia ztRP)pk#ETJI6f|Yk>4wB?4{M)=M z0$E>Qbvq!*d#H`=X$k*C@ujZ*S}!qULy8C}Z7^!|Hj6|N>gpBqc@W_i7bQ?)t+*-% z_<`%V8E+5S-+lR4UAPz65^OaXzbCL=Du^C!`4d5FR8&efnss(d^!IsJ!U9bHG2gov z{#Hz5xxk+2?b_h|h_oZ$L=2nmjdH_b0N++yVpQV+Ll=|_@lL6+ z&UdrT+B$t9v}%lZ0rv+GE%B8P?<6&EM=SMeqR)IfpdV?L9UXyT(|%KX8WF0{P%hjn ze4UGGrb$E<+iK${_1|}gE!EK_@%HoqZW|gbz?dnw8B@DA{uC+S-$08Em zPI+tHy^#CGDOIso`Oo$+DrLZoyP+IGmjRp)50$KxVc@GOEDujwHOiQETc6!{T>EgH zS`pHNjr*auv~vYFigLPBQ=4|A=tb=Cc-Kd!^L+CFEGwYQm6a?VB{ zNG}uRe{Hi07XK;XR#H~kWL;6(I^u#%e7yXkg)a}mb`ctHjF0S>PAGFP=rd2JllUq< z>3PEWelkDK$a09!VyJ+$W$`@kex>I4z!?I0)oTp%m5!uD`Z9mENZb14`;qQ$S%$&V z$~^yyY?&x(R^s;V^MBI-T*$9K+~QKTnevmdr9x%R)Vt61LAWj1K1ChsI0(JAr= z(d>HM+t9rt+B7-=@AUi&67!n0{3oxs-q9b6uhrMUXKi3a+fWlV;CtfaQOVJ+LC_G? zDJIV6JfLXwiVhXFJKV(9*>floe7+=@C9cpp;O^RaK?OS=dr@z9{vKWa=;Lg#K#P?* zru%XG4IuToYe|`pwl)KIt2#oJ*T|?8RV*?viBI;ZJhmq?3q9ywMJK1cBYS)#sy68N z>Omr`?=s3chLS9?sFbl0I!|=a*~hGBQ;8HqU#*{4=vs3kCZ^3fv3ZrChRI%9|K}(B zdhue~2>ZO1qD2B1G`u|4f`-ldS;F`y!5y*GK`6E1v?fbTGOb72SEiqEyP-NGEuJU; zE+oujipCW^5sRCd37eXkA(u{RHx&ruN<0(iwyss-Oc4Eh5($x zWb@I|>I=mJ=qk7v#vcYAA|8JH9g#w(RU@=S%ZpKVYZQn-`TVxjDiy!wQOF&Cl+hr_{w44F8%p2Z>6w%Ivx3hVNUkLrPC>dvk=raHNjsFnG7kx zyioNj^D2DXhJ^RYL$!9DU##&4bp#gO5;TOK4-JX-yt!`bhMZFVzTcixOLy^d6 z3{wazMZ^+;fHRL5Lp0e^4SJ~`{&SIRFT|~?uyEU>CE+U+CPd6y%q5aGg{psbK@l@e zd+dK|e(}o2lBdIaX6c_bIs+VUIbbf{MNId}O;tN}nc#DsQ8`S1=w)C)+eCrJ43)YE z2p`>x!lyQGQ0T5;e4;>`{O>YW&g+7EiY*+q!23MP#;c_jnp6{Lv%BZ(FP4u`28l{c zZ=+mdrlC|q(3E<0g)F$>G%v)^^D*rzN%5PQu+(?@y`+Q7cAELpBQ~aUwb)dx)59I< zZcf5^E$E%7vN{Fs@f4Em&aLRy7rF9gp3gJ3M(7e8gFg*EtZim(BA2+wSd$={sPK(U zIFq#L<&V>dEuz_T_9aUzA z!jFbn7RTxcjDbGQol5?r8M?S_#FqW_Kn~b}__2}Ow1Lk}?LPqH^z#u$QAO$k%jQH z+9?M62UT^6LZL+^g0j9noRgejopLfVmOvC?$$yG7>Pm06Y?{h!+l} zilb##ITcs|`Pd)!b}8)9jFaxz?gd`&7$saCnebae%an~+seG0I>g^c{fceHwa;=)K zVL*|I&wO#-et6@k&0WrYI1@1)yJmahd-R8z$pR^7h^!<>_(JXu%0UXlB~&iV-o9Ho zIlvBWFv#+ij!6QlfI<~e+5~ni7gm!%&ESTq@nw3vS3%V3__Wl@z-!vLL>k{eU2 z0!Sf13_}609SX)}1r>th4eG&F%k7N#!CVy1Jd^=&K0W4;HxNlMPIE8^pyTxE!1Z1w zi3D&x1V(#D_4nx={t}!rvPNMYq#dxMW*NtD>@y}=nTcWn!yyG!d@vShit4I>wuO&w zEl?S9&O@WPSu_9yWn(JrFh`Tfk_jh{GO;Y7%PH_=WpGna%s_9(%eRuxqbr=aGJqhI zq=gQW0Hw$wb|IC3RbtDiBrcwf;FGff@vOuHxw~L?n2641bM=|&ve3jHcJN3X7=!ZT zm>*mwBeF;8aD#9oO^!(}?oKs8bWpe_)DS?|ay|~GvB%mf=!Q`onis<nwmw}arLrRIP(~zZ!kthk z4XHb@AhE$Y^g81kE>#E5aM)v3*^o1oMoAN82UKyn$^x5eRh2UM1p#8ad{Tc8h>C(- zFz$ry%Gx%|F1U3n0nDU>;~IVrI!D}BMR2mljjJ8~qf!)tQ~`omoMdE@qalF8u=|X+ z#Q@19U@SnG06@S4^Uq3Fs5XM2gWM4&Vh#_t^MQ_&a@nH~qNL07Sspp(;i}Rq=*chJqo7ZBtm{4Ce#z%BLqI zZyrLh11pdYegK|ilhBnYtTiPyI8|e*9tHx9fn_@=C6!6r<70BM0K}1j+>Q=?B1azm zEWf}>IaC6)0}mj$!(IR-KO#y_0&%GZYPp8nVqkJmh8 z`y-^a1Fo@*%jj4VnINAk2+0A!lmn{;K5|YzbEvXF#I8}u0d{nEVU%Vh*Nb*Z6s0Z?)jxYgy1(1?T0~dF^+XO-36)>py^%-_x zNDNMa*p+3+%x8i@oEc(&oObm7eLR&|Z6`Pck%J>_j(&W4dUT0Aejq`T1#O-{Sr;dL zn746RiHxXV599HMU<(p0EOhfI4yr~#k^cZM8TQFTj{$%HV*ro=C&4NhOzk;AsKEqD zDzlK@09=A{1C1ZcWpH#D0Ga}^Idqd?puzx*e^zan9k6_4`N`OCfT!57N$yY7{Gry+brEYgC2~~82r+>?a0r>m z`gSeZ<8)Ffhq8l08jH5`e-tE@BTG?6_T7 z#v4_3V}cz@k9Ig9GY^Y3T#y!KPZOQW6!Gc+6WDtaI{3WtjtM>FFkpS)fs>!63ubt| zD+m4s9mZ4K?5j)}Tgx~I07J3M9mkxKGw?g`+kBg=P*DI%cT=$rx`@UYYJliQqBdfD zl>;Cyu9HGh(ZMCzPj7#9-vBw(V4SfEO86sP!33|*FHBjXjKUS9-5jX=glPzOBy7XR zs)Vwi02d{hdFS!CkpN)&9y5c$9LEFDbIj1p(I7zRM;(&F;MKl2_&X( zF3haQZrKZ$Lcs^g6)hf!$`f`NGC5yd0Nyj4`ez3RAwdM-lk=Rggou|#Qo+?g!l@|a zMA^nwSa?<*&Y*g+RojB89n1j(B$$x^<{)}TI*_+D$Rt&(60`BQIP^2xXV)husEKj< zpU}$YSnE1Vz-l7Nk>osb-hxK$u-_0wfmj`pk|zVyAXZ_jpl;toKDAsGqLZY2Q!eF9 z)YOwwJ4UP>y=kRYR`H1NtnL%p+qMeMrj9l3s|6usaKOG}$Y|7ou~Ha-%u9~qmdIQc zRtu~zBS*6je%xs;JBq3U0?~q74YAHKxjU&pfUxS(gd`9|s>nDJBu69yef8|V$m2%EyZLWW%C)X>6@j*??t#W9XXfKkss=h~MD{1PPFiRm>8eQ15m~~}H?X;Nt zL%aU~c$A4z4oZ?42^k=eNkf&v3aWGDsQV-+9bG|L70#)Hmk1H0+c;3F0=7ol4=TeS zI;wYXj5Uv{6Rd|WVXLqyjR4qy zrW(@28gAgiOKQNo9JE>q#BD1sBg&{!BnrU_hG{lF%2fbeae_TgGR>b7Q^W%HVJe0Y zd!DP8a(%;q$W>Qug8G2k=LC`Pwz6ug=G#(nDUBRFYxL#D zp!E*ZDAee-2`|l`)a5-9h73rBwFTx|Y6^bt#e@sHu%uF>N#m z<%_u<5gHKn%jxe}dIL%ROO;s`qmR6ePPgk+zvL(*bW~9U^AwEImuW&Lb5!zGWe$u6 z$!e`svq!&hIX}i(Tf+sB03!zna@ZPYW^Z!2Ix{^_;JkmBab7{j`5mT`y3u;K)KXPa z&lc?0sx$&%cbZP9iw`H6JEb;M*NSVs}`Kp>Ws7#%JcJMwJOrEo+96rjV1|crA?p zQsZNlSab=ppZjV|Y#Ek@iuqL*gEIne?3xUS^4hI7Fk%Q51P*dUfitUIRSitnq!g#z z?j}r!6&91B7zREPNx%{h9ZPWsVTg2YR*N;L$?y6h@tF? z7Iz{*%4Y4TSrqCSRizl$Sjl3lU%*!&uB@m|2f`?orEd2vg$s8|#~i{21Dwy<7*?lFbJ|H|kU<3F*f+xx))zSV*0sX}wn&8vtpsGK z1i_GF^4(|Xw|I)_(GH3;&a+k0aLz|&C8jdUvD&URbjqv?dajh}LWBVdl+{YJHTC?? z2k1jzM%^3fttzTLY;|2qqmrRvA(}dR>xAbroRXqfbO+S4qmnS$IzRd6`Y5!nby_LK z9bWpEf8nS-Nt_Y&>utAYdrK!{CG73k;yI=}a6O|D))zljXOidlzw7lJNTd8;2(GAx zo#PTQH1#~5xgrv=Zt0RbVx?WP9L&nGnFGReF~s6{c|Ta=5u=4gf!TX`?niZ+G+@X3 zE*JS24FZ&1hyX5_zf_qL!}@`AhUHaVEY|B!M(XZ;`cojNSS}WxTm0qXkG7Ii*3?Gw zDuR%d!Dk{^&SLl^f=h>1bZn!aE|pkh^-OJNxtFv%X7AUDIbcIlRe zRn?7i=7;zgRJtXpfZJPg6iw_#+@b@HpVX>_)UG5()T8i~8=z7IWOm3SzDdtS76y_^ z%7x0TX;OkjZNn4Y&dsLzZFgczGX|4ksM%W1e#S>xAJh(rR!1Y$Q;u6tMiMbHMGZr> z6#oFVrdO6&HI0Oj%lmaqOtFa=cQ9)zzye%?tw06qqwKSgkxQ`|?jok^)2qXmZ-6sNEVibg=J#KB#9lEIa*FhXpVJYa*E?kB%h16=IfuHa)s9YWme z3(E2;Nf}D1l2YO|)z#F=mO#$tPe|Je?X!=sQ5s&7^vxkTFmRqOH;@@J7R^EAx{@-u z^i?{nZZwZiUzp>D7-r=4#-ZU%-X0*V7DPMF5nYB#OBSOg&bbANZ3}I)-ii_b08RKR zB$0>*6yx#2P9zT$R?1G$jzFLoN+J~_RSLeIi?Jfn$O}}kCPgL@*u!LxSTPvy&spEv z6+)K!U|b(Id(fNUJB3@5ybE15hG{mYx}@ z=<6bg7>zAlk%{UIqMce7ieonE9PA=WDcnO3gs2$!xRWGDU?-CRYr<_}E7Z8Tx>^?$ zn`J6(wknFt<-1@@}42eSYYdC%@XcZFRZ1A2_sK=q~lP`)?7m zS#0t_Xr_0e6f0i{xl>j_QY+GEhjy)2Ss=`EJwH*t&-EXgb+4&CBe<6MF+FG*f3 zm6kdhYC&87(E*A|Lbb+pj;c{Bn1^zlDOD}f4I-je4@?@2 z;YZV=)vHh`Db5XId+n~HEq+8TW7jcEeg_4wLKLKHB^RL-t@HX6th(%Nf4Oq z9nnpHbpHUXUuU`JQ+mDA$hntJ?Xz^Qp(*CM&BHELa9zZc)khQ3Lmk>V>D}U@)UGCS z)dD4jz1Uh5w4q>CkSj16vW5y*D#tqzs;J6*Gb)w99vcevZ}rt}>Gt#Od8w+7QCU+2 z^wZ?9s5Dg*{_wQqowKA8`RbEmRY>EbtEsu04ueOumFkp zl$A0LM64(%rE>2^-lNc>uS~i~2BpOsZM+k;;T^Wfka!?3QfH>$ZhC9TELN!NZ?%=z z?(Hp`kX2cDk1<;eJdl3g3h^Dmtj|wROtr2YEYt5v3#V~$pN_p3*dCfzbq?dxNbi+! z^D9NZrt5LF*4i&LO;2s7h9{QdDynHCqMnVTmIZc~RaLZ>Z zsJ!*Qn}O5Q^-A|$Hw37)+UjM$TjQRJNre?fMI`sxMb%-brUr(5hlGgGJdD2=KW{j# zPg%K*HGfB~lGk&tnsF+d&pEw8a;&s|^NL()d-S{pX(`?ps=C~%BDgrWys(;Tb2Ti@ z6Vyo@O)s5L(*mtnWT?SdO*A`YOOmCO7VbfkBN3UkG;1cmuWrg|(+mPSxjO_?+SN%R ze6rO7fJs_xe+I@@#~vbMy}S6djkQ$aNJ@y3s& z(JYZp%OFjk8<_C!t8lJ;#A$iI557Zo<5vi(YAG%qxoM;A)3mEtvn5i)EhvIWon2;v zHBz}Mv9|vJD}wjcdJeYqpQc?e=-raoZXCTSUzG64tKzapX5*Yc_V0YLTq>Fhg{Fe% zQw=4uj!5a}mb%>1R5WH18YKS!L~oZbue|%K9UJORf|}LF`Hi0O)V>wQtyd_obZHwy zQ5PWMw(5Zu580XWYHcy{tDhgJyBjPVvWJM@ zX5&&<8swlm-al$7{{U$vM5`ID1*x`I1;IYf?@({I8#fB&x0@qF9op5#?$=rtsDbLK z(yrHTp0WWwGR+e;F=&uZcUb}xhn80@@}=yrSJ5s@#Or>v^+uzgaDI8qsHpCp553UU zT<$i=Zxt_9SzSt^jydeV<3qTqo@Jz(9QW#8w@Qp!XHrl_(_U{h*oe!*xfgMTLaN9A z0MM$k%OQ0JECi7E2vWKd8#q>Y(ux%enRX5-#E9GQh0k(ejvyH6+Lo5IZmrgkb8k|* zC+|$V0Z{{Q5(1sA1~?#}VH~v>26gN zbaeAf-@Is~mY#~Hc9yPqsZE%XL-WD69EwRc*)IB~0|U7-;S7 zajB9jxMPxu6)oTTh@_ICMCe1uxKIsBbkmM;-e>ijpd3S!7;5deZn)LjE))Wyco}1> zpOP`eJ zl9bsw3%x|taPhl_Mm61Nt(&6PzA-=7&ZbiJ4}$aVQ$vpzN-)hA78mn}0hpM;!#aW)BO3Hh4#k^*=D)$X1$q)7xni_AiA5s;}G?9O( zIWTA&RE{>Owp*cx`UunBPY^2*lF8kS#_y1?RHa#Iqm#FLsw@q`fncoAB#4kif$JSb z{heyH!l^Gv(YUCuyro2|L1n1br09hz1_clBllW!{>P*~z*>q}wtZ>zGxvAvjR8=*0 zdQ`IC*0!>imRg8w98pJWlBf!5nptC+SwlhrkbxVABh&2@|av!E~3cmhP)q zd3RB0p`%r!s<7Iw@CdmF9=F?}hkI($%`I(3OfkI3CTSR~F9IVW?ozNpPG~f$)g%$U zSpim22Poi%5}<;(=c#L=>9-W<5Y;Kvs%;#gbvtR?))co8SMZ?>q?q`~1VQTaxhGKg zzZ|0D^|$+*P||Wc#kR$0St;ur&vv}`f5y?6>FK6uB%CWMJxPUQa-o|!1e=WYdxY~_ z$0f1xzClZIyYSnIwDK!tVrp9JRarAYu++g&h~wUtRY#0T6L!k1j6pvlhd$~j5bAB4 zqV_%;$gSL}?NijgpI;V+$xtgQVz*f)s;{}$+#rP1)Z3}4D4>;QHG-X^cZL&(k&r`6 z-K(jcHR|_Oe#3OWDvn7}N!A{{`Jj(3bq5*F&a8}yQv-n9cTXc+^96{>3&q$+lZuG-4+>eb_*;Ilq7Mde&AR(*? z3RrW;mxHLzOgo+>-9?c}&iDpLwy+`SXi$0v1!C8m%^+$CAd zuu)xo5#t<-g#EPYLUViLSMuIb(Syl(HBD7SNR;>6-A$sdwt}8VleV;$c$O-7;~S&W z)9)cf3WMjmm0>13c0Gq(n_m@l0#8M zA)I)$lC7NcAx zRV7c9cpTThuU#Wc{pyCuo(L zFej#2qX|4tWd1<^023E)u{|WT(a$yGms@DRX>_|=DxPR7b)vXf+8A#1@~EZUH3XBv z6wE+~Y*RS}1OVi{9OQh{saO2J8-A&Dxj`r zo+w?25=vyIn=2w3cO#(pTc<1f_0~>b%WP5Dua%sGt93VH%8}TBKqIMj#eT$ef0a|uS7+ze8tPgbeZuQgR+GFmf{xtB_jM+sr67Q%Fh+Tq zUA06$p@4~095b%nFXnezOFtRq_N%?#=Cw66bWx>Hdb(&)r;(}NqMkVFAXJV20GgfN zKH_Q%G0@k?M{Hapl6?~5{Ck<){{YigzCjhkjmv+DRw|n%U3WFQ!*8gls#HM)2BcE0 zTGnW?Qq&}MQYuPhBRUPqx`oqDu<&k%bE=*l)oT;kZk4EdgmKO9XR2J4oMo__>09HX6$}6!|V~|e70tq=Z z0yc@`0i)G$F@(WTvEz0O&4I9Fk5Pe(f?Ep^$ zCy&#wlPrv}sB98W&ZOk9a_y;6`7GW@AZm<<8s&I~+hqh2G>0eDhK%HwL}P|-<3_9$ zf{LY?gM}ZKSA@kGRg(dTQU=UCvoef;#GOa``CUi0K=7w50cLDDYy!T(ux1A#zw!@( zj1#E^hsk#J7|C@CCQ!~>fM>i&Fh9BJnv4NZubdVf#}Egs&wo?QbS;c-Oj0w33#&(o z9K_fKn=%qmk^w5AP%5UM`9G#4cqT^)86ispqcPaR1_KNhVgCSz1d_NKjzRD@8%p>x zNUO1CQsWA(lwE?5N|PoBkN^dTVIoT^C|yyJ%AX8&XD%6tI-vl_NdqJx^Qbvw?(<1* zWC%T?AcK$fo}OktSSnPA5Clk(Eho8{$EY7(088I3GXzE%F|w9bkfBg8SyU-d-^g~s zG6np;#9V@VlvcXNwZjb8IH_tSp{JRC|1sHh#8Tnsa_GNDX`7{CN7m2HP?V^9R2 zg`gDzc7p~ENZt92W&o4v)Or;v0@6!hoQ!(|>jp3ebBxbbKg#~i{jlRbM&eyHyL7*& zkaDhOm9>@{VSBHVimsO2lTT8z)&BBDfzl{sLNJCy5{R5DE{eXa_4n-eO1ga)JiK)C zr|C;-p^{!%PM7NXr>C!~zkiOkrN6V>XO2obstSo1N&IGd)!9r4joa)c9Ea|2)rndS zTBeVeQg;==a*)$WATl6N+s1TsiL_t-0H1ua(p`dWs8l z)s*npR3sdN*6$@1GccB@sRdiItdWvgnHDmBS3NULtCID=3|f%$ND38$09YN&fU5{G zAca2+^l@+GHBBm+wzfZfr*8K^EkdrHhpbK`WpX5l@`8jDqZz6!>kzDdwMJyDioi4LPU4YL;Vyy|aI;OWN%rb@t8&hcbhv#0w>lz9jR;G`|rc_l@0L?}{R{AvReF)Vg~FdA+<_ZzG< zQS`%^^#_M>2)c3AoAni*(ENV)Q&D}kHO6kuEVY#LM8cs~EIhERahxgH7C@1^-_=g7 z{fnXIH`^ymcrP4>ig7C_yIlEiI<2g?+b>cIcABEyWRek&{VrB1d&*)B49zU`>WQ^q zOVi#b(*B%uC#+m+sAHIOc(43=t-5zzTSao9YRja7>gX)?IAs+ybrz|Ai7Hw)AG=7U z0vW_$*neDj-%5JpbCZB_eyUt}Pb=fxetU(=$85bVqL9OUj+&$`!7Ad4j_{GNK@28C zB(aG`k(nKpgl8tV?VpWL4Ac7zgGA4Sqy0WrMn_)_UWb-bm+?1nM zP*biD5l&S63Q=018yJ?Tpa1}pA6xp!{c-7am!8(zjh3>err|?VZ;C-xNd;{UTT)9U z9Ke9kNJBgY!D6kU8><9$c@#?}8y6~0WQ@rtmns#V6;~JlFbD|LmSu8INHF8*HzT^; zx-n5?tAgIvehtfSTqBNMt<=d&M}4zerc+IINMhDD?@J@eEmEs~;z=_zw9(4{047EK zwt1P*d4*aLwxEHZTcckMDu!Y7%{g>D-uG1)BDf)xTK`ac?MxW*DFr#k_>|`ax z0b&?!H;jM{I(dY;*cIM0t+t)jshB$nUOD4vW@G>fiH=8?eX|o53Qq)s8%`2E>j)J^)c4Jdt1eiw=s7 z8D8xZRx%QNNXKx_Pz4wZl2De@ugsZ#fpzu8xUC7RR;8xpy#5&}*H#-z#UzzqWKxRG zb;6{q8DlOyes!Dk2d_zKYI@ozfHj-r^W5q~eL)0!b+Ku+O>H+$s7&s$w)%eQaqdTR z>(&83RXe@TU%Zx6Z-Pp{*mNtAVmYE&qe=+4-!QH(1Zgt?L?%a_CGLX{^1IWq^f}4t zc?G(n*d=ABq7M6i9t}-MF}npBa`}GP!vh&D8Uc@*Q2XIuNe}7?J6Ehfw;DuCV(wx-N}($93I`g72i z+)p#}ikg@pSYDn;>1pZgv`I8GJzJWWs7Rrnc~N9Q@y4MNRj4gld~<*DXDq5sQB>5Q zKwPqgRV;T>r?#ZA-06pq0rJj1%)*twRlc^;ND>69>J4oVW#B11MIO-gZ!FSE^3?wT zAZZxMBKKBko*@-7M;JM>2V*!{P(gE!F_VY{ao9|H^fPx{20s$QMG5HL2 zRQ8ssmh#oJBFgV@Vo()kj%Jg>Diy#xL=3)typqHnTWb9sjuF#-ox@KYh=Ysq_!YEx z)-^VYHB2Ojx&RqnS^Q-|403*BhRJ7+TZ_=IY)ozep%I3XP=;_E#>x&>IGns{zS0oH zm15c2Cr79haSkC#5|&7;HV7eA3R!z}RI%X-rW<7eRmdzs@Ck1O`eFxKgc2a2AW!@) z1okEv#}UqFti#9k7iO9Y=XGiXDjp zX$UeYATifNlx1%o5w+=Mon9#}6ri%0q!G-rNBy!U^kr0ViqX49!%%(HetuV<>TTA3 zUB@eU&r7(4_Op-Mr;6`%Yu*wnnP88eO)|JR654(cDmF`$dmV4LLT9kX$TDNzLJ?=xCn4QNW9dkTO!3V zRZALR?#Ak64Ne0=0G`53L}#J>AHp|UmAYPi@|~!u@g*-Qo}?*ie;M6OER_tT76DES zkPe5rSI`?3PhU9qR`^}xkHyEEnNaecOT%tx4JUdU*lTVxSxpi&Q%6@)rlvY6qmB_O zJYrJ}hA8aj2(62l(s2wlj;AjOSTHpnz!4yvJ-@_u3&zRvX~q0EbXtVts+ zh8IhMGnJ6KC=u2It(`SxEJmrYW%oai*^Z`R0KeDwOZPplmlSsHYM^W@h6phPLRpzg z~ImO1nVO!QB4;N4E}(wpiG5muJ>S5i?jt0r0jj>#^-8hb*OXtDqBzfH zXXJc>M_g*jBRkw#Ukwy(>4StSU)6G^*O62pS79NDB!C;?CVP;5WbxEr_6GP=EOiQC z!9%yqhCoC@%mdy#5CLyZp;2*OGfP(0RCfC%HNX;!QBO^6rm8~uD1xCQQifCvffa~l ziId3LK&*<1eryF_J!0j|hGmXr@HR!`G?mg+r0MjVRp%p=09U#}8qp+d%> ze)I$)G426XTopmF8t`k2P^c=$5t2^OakLUAXvPLJfz#{YTeVVKQc&1Cg(fqVB!9dd zlHC6QC>?E@lGkGsw6yDLrmL8=jU_tL$1!vPCsQJ@B#@x8sa8_#qyVfGeD>N(=;~sc zdMDhPd0?n`E$f{{ZDb)bxFggk4#KWupwS zMsUs7)+2 z@m?`PAg4=pjxXEJ)l}+~bTBMaAXSp40ow?(C$bkp9amLm7#JBXve#HrS*mU9@T>N_ z@>Ar<$`GU`Rw6fLleQ61ki>=u+iXoAvmHxzSqCG&!lo%=eR&n>2n%LgB;o|>-VO=+pBq|DUybrke< z6H=sOx+Q|9Wi11DRdXb5frMhn$_d3qXWA~OPN7F8~=aa?n)A@E6Cf* z+psSexQWi$9bfH7RVAd3k@-dW;Di;7CnLJX7#U=hguvCaN?vAAh1i`y0H{TbJbXf| zpb9Jq7>a=RSt1d8e5Z)%E8r`%V>+EWo12%S;Hr=_9&1U-ByK-55O$9*ALCVZLgOqp zn#zTB5m(6_9FNMkXqK{Cc_5OZFm%L$!@;kDyEXXn()?~N~A|1=DH~|zZI{avBDqylc zB!ReKouH9D@F4wh9drGGz9)S<>Jt$gDyfh|0HjQ0u?9f|lZnpDE&MBm@u^;GMU#x! z>gOdSlHWr?LsL^cguID2?V*UyS=h3Itn9$P-V;4wv~jveubLQbl(JP$YOYTNRIoKw zQ3ZRIK>`V8W(|p|12Zy_+-B3}G$;FS)q2*8yUV#$hB!q$S>)G+Fhd*eiqfrM1>jI) zjzTs77}z4CDES}S{;Rvx$ga#pp_(KHQ&NSRGE}lD8j@W90PQPnX?I4} zaC5kl2`6lVPH;Q>ah{k@0qWlaJ>?{41XPn%%`iSC1OpGbj|#vpNa8x#eB3*V)K*V= zp3!M)>7bSgt|r?=_4PF68@Q8JcI2P3(V0=uN@8t_5&cz2sd{D8wWy@3gNX3hs?w!q zf}{K;pSmSn%M&Ar0WTZjfr*w_otjAeu_GR|e{p)nZ!07`)0Z!BX(Ap?c$7OBvB&y^Ob8)MCEmb31 zC|V1HR4v9Pf)`rmsEHzwRL08D%_Q-5(pPk1@qn&LZy4X7?r&JCRxbYlIp)MD5yJ8E zi=1wv9Ti!eRVuNOAyQil6r~k_C-Lom>-D&-rMipGfG+YhZOX2rxbo!dA^p*oRFnlB zrglwLa*Ph=wY7>)040bJ1gED2^N}QT&r#|46H^2qKHX&Qf8JDR+rg565TgPN&ICd0 zVKVghi^ph_kN*ItY-YzZlGZq_lrY+wZtBb3Ht66=GGv$}xp-W(s%0(Q@&j?soAACR zH1*tbir6ewRS~Mx)mtsJR5cYVsSJ|6ED15!1hC&yzRbIm^C0nk=Ifj>q$8;u^rFHC zbnTg8TH`LLcm8u!2P@#fE zh}=o%5J<-zY_gkVCTR?97Rbx9;D?bxAUOejDz|7g)k8oRd|`*OpM?L8lNk( zYpBcTVhCU}w}3z&F`S=&zQ783VTY-_;yC056$S33ssi}Jmf4iJje@xzSUvzO&G1wo zs0Y|uWQ`)~mpY9iE>b`9RRj>q%c z24-et{#`=<0NMTU043GC5x9nBs1%kUK@doQI|In|F|xN-SeIVVjIcN3PR+HvDD+Xd`##lB zkhQItDH}m&UD8xB$_U#sLCzpa>s|fOjEExcJ1ewcN=mvy`o4UNu#&P5=`4Hbpd~3be28ZSr72D1sNei zugAY=Q(dGD+ku%mQX?Mc(8wP79eq#0db|=E({hD@=04__<|&vyx%I?#se8vwxQ8X= zyla|Yc=a7`B;yqIaB<75n@d-06`)5_DI`J>JIZk(W+N;Vga8kSj-&m5=~q;4RM#${ z@T-3$xX{u)6%_T&Idr3vWtK>zH1ot`O`9MoS&^Ap2z(!zsf+bK`y8XNy-vO!?7@$6 z-DhBk6sCbz+%*g(nTZ)!3Nw@rP|_dOKkRuW$51O+vZ-~J(PF7wsTnaelp28Q>{%4D z7BMkE0u}0Nw1k?J$s8dz3UrLbJ(Eg(X|Z>VjC##%+4Lg z%}-THJ-)h)DrhTVdUTN10H%F$3nLV&8J{Um7BRKD)aqhkG7KEVcvKQW_{C1huftQ1c+5%P3YK^i2% zTVTixn<-#CD>yZ(RVsW+RemXtEJ0OWn?#IA0};;=j=NLAn$rBwRII^n#m%ft5Rf+dP+Kqi6|)if4^AT}x}EhC>t{*2rCmpN=X@sBdAZWlnq;n%_Y{?eo-)p0lBR;Dnxa@%M><06 zV}9cYM_hcMDqq!)uT;`89HQRoF<}&Q@yZgAw%e5pxKkKamNEUtvK$pr3dT8qR{pm5 zAL<@H2Wn38y^fnmn1%qZ9Juo8CJ5QgK|}V!4)QT+NOzJ~l1Gw8l4%|GBxU{ul9}`BRySepdzrxWkpkmoEUKY%sXD0$ z#agTWlm4RhJ#*>>x2N3g?T=A+nk#+2<8O(mU2A7&N=2%H<&pxk%8H95ZjZBJ;B_6( zmdnbhrl)DC32+f-iv;ZHA&}+pqqt+tAW48V_3h^^7_wW+b*ZDN5bGl#!2lSQks?5B zNFWRt=vwH;U<23xdU^(4C%d!~rVsV4ivTV}JDlq!gcQI<&dOb6)6YEJ%$2 zs9zY6NmDET}7S47hgGgEalD$;-%Y8APSs;e0g<=j}fJdoG8Dj+t5aL2YBILQt zV7kA_8~T>eieI)|{3`c6H$(R5f(v z)WdP1j;cqIRyJ3vQ5lGq42CGq7!0u3k+wq-OTs?&a>hV4nV8H14M5rBwnUha4_n@h zuG&7B3HZL@YNQoVLko0MJjW2;)1Iev(WCHHc%+V5M$E{y1rtD;Y@ik@a^4iN4UKTQ zTp%jKH%aGbG9gY`$JxTEG5gg^7SZ>yox86Z>SI|3nG7+PA!+I0;BVm>k-H_OQR;*^ z?gT|b>Z+*htmn=eOzGQp(!B(oBfOj=1IX-73EAUaZc&Wx(kcQNw1HLKgKU{_+YOV% zwAF2N%7%8;x1{oBKvYinh7%?|2#J{q@cmu2uhmy^ON#3a_*hh`NW}1=ry>O6I@Isz zA9qFO+-B6MV@Ub$H;N%CXyrR}`e~S$k&I*jpr~TlQVCHY^w@vQVSa=2%@0^Oy*Q0b zYtMNDv#NmcrC&_yf~32U>z6FigxF|M7iQgK+3(CxTB7uIompK%6MtNQ0Lp?9SjQ!m zK_|aG`q=ael4sxZhWI+8{J zUmzhx9&`W|XE)dSlh@5l_cyCll$Q0csI2HjloF-5Fp+<8Xr-F2rXJJA@%EI3sMR5P zBXGI`Sp1;Qnl5dk5nxHAE-JQ7=K+hx_dS-Tr!UuIz*b{{Xjz!OL0C*(Rr(>W|ini7G#D1y4|UH)&kct5P*JHK-*) zl|*t0XO>AJUoHwq6B)=*g0Fa~DRn|xLn*8EJ82ZGB~4k2Y+s;r?=F;Kx4L4!wRZHPeo*r{gncaFJ&Eqbw9okNyUx-kTR9Q=tGC%hBis_C^{Wu~j8NGi0esjsIXsK}^D zrru#CKrJjmp$HSS7_({)G634QM{B!wUN7EfiYK(%HSRLBu&?c44y5Z6JCU|PG2|*0 z)PM#g>D{He(3)7xGp*JL_E4=LSt^KF+5$+ZfUyZ1XbP|KuxN3<)H+z{J)e!F&cW8v zXL_gt4`(#A{mBzu!De+OJO^@_$`)lpEf;%vs7U}d857zH@#_)o5$V=h_KsCkOke>s zb}=vs7Uw6nIOo&nSN{O1lxbPjs__jxa~f+GA$oZ?V8#8CgLK+%1<13V{8xicUm- z3}5v6>Z11c;+J)Go_CdA7J-+w8sdL+T!J)ZK3FE2q9G(~Z>Ic4&r!oIIJD5^E%fDN zG<4zP!Pg5PZPWOQ$bo?_pl^W8KwithEi}_SqK=ZQ_YWM^MXBR#Lb07ASk)CyF`r=G zLhOH`T~!K!7b{n-M#XCcT!j8-s?EUrC~KMZKP-32n(!AJ4aBg3~H)fSh|83C`OG~ z0l9D)W2w(Oy78O2afW=rRU;CQq?`q2{Lo=FPLNWzl%&muL)Q;v*GBP)53ou4)px1GG zbu7&CTj?4JVs$KGib&QaQ@W2>)C0GLkoy8u05gQ7yk5*|DqPyBJ2Em3*{6)hE>%>r z8aIfl_PKO*=04wqAOt9-m8scSJ&oupFa>GDoN>Bd#oxYq-jhS_l1j^@q z(O_`na=n9I<3BpIVazr9F;E-aZ6G23q`^YQmA!@vuZ7sQCrX~XZKydK>N(n{v3O|8 z(PBkOzY$lVqGYS)fjSjn7hxW+-%u=AhG z!5X;|&Lxt9^};jLplQi%swj5ze6q`+Dnp;bV<^CS(Ar9|W0Gr)_Ki&%yw=7xY}$BR z`IXMQ?bo`o%(-Ks%7qE+#oI+NQq>u8Tu#1=^!*Z>rNfl>8_Q?AD%oFl$r3GNT|E5V|iI10D2{q*I9t< zQUlfKqrp;v39~CsYT4?&B(;G+Aq~jOAjH8|BTZ((%I#?g= z!A4f5pf=gwHqUi0E^zs$@40pvKjLY_zPMz=tFay|8ef$Y99X8bC^sPBF1|e6^u8#} z*F8g?0P1us2H6ep)7be<^ILde@`_I6rFin;LP9g>FP|H6y1G8!yd{M;2xrKdx+46( zBj?a1g}$QEJ0UszY$)wf9TI}n_-LHZt4Y^oeXdZ-(=qRg69{9u7;UTs3|0!!{AKEN z@lHeZBV<-rKzALv+>zS~SUmTOr@ONF3fBtvdqKld7A8i0$6w@d{9~8mtV5^Wwr>_lb5K4)j;K05s7-R^d76lqsxwF)c60x~4_g0xxH1jWNMIJ|ReOq!d zwD+|uoy(jBK6Sy)yrYVdAY=Wr$K3FW>|hp(rqX{oG_pgiAIk=&|FRo!>k%_A{_l)| z*c+?x+IN}#ZJ?*+UuZsS#>ng~$Gyjwo&z%zvt%Up84CE2FFrvIh}bDD{7O@}=U z{O1vFebRD+4<6ZH-;8>9^rqE_Tg1Qn`Hfk)Tfr(8YpIsX7mr;fmyA3KP1)zDljwl} z+P|?6;>LK+Y(p8|jmsv}TuyJ()Gs_A70B^$A}~c=Ouivigl&=8j~6i_(&pLkbB;}nOJl>kBruR zHi#Q{4&rLu&dHr2U&+a%Zr{zwQ(IvCMH3YkCfOj7pD6VkJn4`0PqV|msn=GVl6xhA zoRy_TrFrwAJJ-BgQwZEJC1fcXV3`rDy@R$<%(CxRjI{D8wP{PapQ2QyH(qdg_G6)3{_;{iZsq6*(!{w zK<0@i=+*9e$Hnw~UIw^_-78hnf-r%t0$zO! zPU}wU%;A8%g(p6mCn0X>#$IVTJa3p_cMa~qD2OO&)L*dXP2A)izpGBW%mG_CuGtYp5% zt}zvgK`5^lMQ4h6&)ia;u+uFx-=vt;c{*{(ue*1GRYlrqJL~?jN_~MbVPb-tO?0!j zb(~fHsqlPNbYz;Px7$}?#rlL*{&zR5FTQ=Fv3{xSetFV{%iaFzo0i$~WdR)%()DHz zXVkN&6YOV*s5RSkW?_v(9&%P#t<0)gpGDQfwwX_M@uBsS7n zO2O$_mGNH4zCa(35}RZsi?N6G_3mh6oVE?0^5{p_{ z<2f)^`z{9aqFhUWgoMe5=b>K|RpL^S)R1g9J;-_7FPk*oOP90_`=k`{$Vt=S3(L6a zkwl(0&A$WAMe%wrAZ8>5CSO;x2<(!Bv&x+ zND1B4_(`xBT43O-UNXFwW0T0FiPj!;{|=dq?*8WI}Ipc${9(Irvc1`klHf z5W*v69(&LNPP-7{aAT8HA6&(2aHT_6bN#DLod8-2It->sBO#&lp2YTGtRsE`OKf3+ z<$XVIwY%MIYHCqM_VDt%!?D%Tv%~J*WfREIr$JzXzta(78||ejcdof3-Mh9jca~lc z%yE_c$M99jfKij%>yGsU>3@J(D=(hn%MqwLIlAmsTSPJvMzfU=E`FuI(WjyLx36m3 zQ6W;Gs-)UuHD;|5PBdx$2Pn`SJuvnbzhEKSBUHPCBuVE+ zqd%}%<0>D{*M3{U{S0iD0c>d|3@eX3#NP~Bi>{z_d-*H?VD&A(Taz+}@&1tJP=b^d z7rw<%xCB1tUf@pEdO|^D`kPYA;MV6Fa?a5?>ZWjDQNd1e+qoXM3AwuRWVVeZs$n;^ zC5|n9lnERz{yt5@li?`rXKcgvP%3L!9j)zmOOxcF-k0h}10OI(oWa43NsEGP*Zkhi zVh@g<#Cwdwj7>YK-rM4TcrNeY=I65mhOfM)mfgO6yN_w^{>YEN>&MS7zJ6Bv^74e} z_k(N3?DFQHg)dp(dDMI0?>@n-YRu78U4Dc0;6cmvvZO2Nz1y|H>4j?m_J?3z6}Lmregpwrt`X z@788im}zvcR@Y_zLh>}v!DM|1&ozNNr{t9oVQLtx7S=OR-LzK-12*-Rt6*HMaKGZs zzQAsUl|;VJI!XssLF+s(*-(`q?eKj9^0JBbzI2lNV_Tjk(e79{$m~#)wx0@FLuh7X z;GP=B^^8)V2UUA{!1HkP!+IuM`Ia;T0@twF^C&Z=rA4gd^kzuiRE92@ z@BE<~+2qJBxvbLdKPC?vJN(GwVb4H!4rE?n!mRl2#lRfo2Z7Kp8h1t}RIGWeb&Y99 zucci`YNx7<2CuNe%?*nDjY-5%73>H-RYl+*2YR~hCDTa8=@Dpm)0MXuwBXZ8ObP-1N!=!s ztj%Hm0Xuv00O(}5j%~67>1CI0ZC^mjpp>8Q z2~=s^Uk(`k%hhIt|;@fE`PagB3f&v(sz^$sPQ#1 zW?-G{sh=EZUKP#a){dJIzaRJL+K3lW_>koyXSwVg2plMM9SA-{pcSkOKL|8?ns;nY zq!PKdC(K{M!b6}83k0%=N-Q6YsK2D;cNVQ}DkTD`><_ZO>tW{I3ZcFq3ziyviM>^} z$+>3b`B3~ALC(d4h>R6_Xr=Y#niMLWY87_u8^?%YNFRgHf>IWDUT&efetC!mgqEMY zJJhP0kh(H4&vng0K(01_km<2_t!`%p!N-r&#CZc*E6PtJ;#l^JoRlvU>Q!(RCN{95 zB%gTXC`ua#{Cy%cA9q0^=L$NUZi3Wr-uS|*%6xJ(QByk+xohC!$n0SF22hiCxp95+eu1QehT4O4d-$RrwKPx`wsl)L*pBk&ydD%aM@p`3)oTP|cO}XRT7g71GbV|#U>~H@7 zYIIc(w$}uI({0bH^l3 zu6)}wBK>HR0V2TxQ<7$7oi>QmJ<^^nbgI|Tt?1Bre^Y#gtM=V6?Sla2>-v(@9}f}+ zkh!s7{yXqffZELH?Dz`>{DWGT;^}_?1_qXdV8-Dx`ry{|*HxZw*2;h@m-^AoIKudJ z&A|?P(M>!&kkLO`1$$X#s4A23l2MNZ?-U9J|IM;D*(6}jnWiF(u3scDjThTGoE$62*Wd+bea-Y5P&Ke|2jD)s7nQy&eOVRoHcet#dA#x%8D6L!I9tJT zPL$jO_pnb-c5-yXjk$ z)-Egvy62kBPPSnLq^5#MNhG2&M|MtMT7JHvHn@}E?<*oVFAxppjo9z#6;;&9q!Gy? zY#*&;{)*oYWS!>f4P7A_S%P`qN(UXP&PBLjS}$I|R0a(jSHxs6^2xdcs@V_$^*sWt zD2OsTx5HMA{C*w>-3;@P4Xhr6Q3=z#lVvOm>-`VoyPL?6r9aNOu9C*?P6Upd!kJz` zMy9MaQs!S@<2pG?ZCu?#rQw5B+9SJ}+QTqyIyc`2cO%YUWwWMs$SH`b9YM8>G5);~ z6*}tqjwPJZN5>4FGn&%vHo?zUHA=cr>UvZz2H+!s9ygb;I)9;fcQgQGdwRkP;z=cgy})xDcVvI{_kS?riQ_$^ zm@Z0Gg(mv31coQM1Yb6b4InIut3XD+3^+3b+u(X{f9kXC1k5n=(A!5kziQg^QgDrB zerAZ*K)(tjNeVaC$@>bj{X@Z``0Bj|)1=7Z4cA3E`*M_X9tzu#p5J2EoiRWDr%yal zE-r82~Z ziYV_K9vDTfrLq44ufLbUb~mq8nWu3 z@G>Yut2I{4z}f(uUKdABv&_lkT(V;brFf(R4yw~`Z00A!eiI8#sH~C(k^}M8Q*MC* z9UM7mRd^qhD|x&N+$HN{tSOHWL~9QPc5-i-h_eTf7vt{$NK8ewb*!O9u`)aWCh>oO z_pCEUfs+uXC%x;+hktKhjNp(zmf3seuG_wQ=ch8=7ArtAz7}g{3cBKL$@EROBmB0L z3k85m2IRT#67B+qFaXb3=Eo+$ze1`8$Qloy?~Un5bY*8Po6Uvav6IyTStMLwPgG{2 zYMzSD-5wU@jV5(+nfT6C%w$7rvipW&dYcDVvPt^DlM~}T3H0cXlaM*jiDpqZ)e!{J z`sA+*ya~Vm$a30LG<&)SHP~v32*=Pb=47k{JTo}bR$P;|$$?cpZlCgXl;u!@} zRH)iYhf{_l^bpPk2-lcyZTsv{@(I;2s4QLy#1tqqi9JPBx6+YGsreEgF(;IgH%LDP zR2zEi+@1Cptto*940mz-{Hz%AWXsoP5!vuQ*yiJ5sqk=Y`dwVF;zJ09k;QBQ-yrBS zeC1oC)8p}0bDs@DX6J`+&%X|+5m{Rcv)wRW(L9fD1D1mFWeOhf;Qu7!TD#J#GRz`g zGY41WRj3x_d+~#9s1{$(8N850Vt|Y$V&~O*yF8_Yr5sR8 zdvQBZA~(yp!IYBOl419Q?t35)mX&XG8I4rdIp{xt{cDCi=4K>Q{@{_$_tl`Cvo7hQ zMSeWjhvNGQOr~zuIs4S@6+?l7cEotcMm$UXd~v6f%Y48*g=p%9O&1YiD41>eBvqiV4YoGGpeG+W9W$vHV_Ve**wF zKfo%yk9EXE-R`0qT@XNJR{{rz^fKx6?#=t%d!_k zNE?El=r0?-P3s=Tooj1T0$*{kDaXivuUK(YsW{HBxWBR8Bk0~(*j|3>@eHzQp=bv5 zXOt_!Rnz6J9xEH~448^Mj1X&n5c_MsW5hPA)~;zRVcewH*p3+{u$y9Y8J_zET_u(k z-Fm+PYAV0JSpU1&q}ad)CLRF}2k_oDi<3s4l$5EO@s#4SMp+;8%sO-|CaEPdptUVo z*nJJl{CN$$vP?*|LJ;=%%B6`4SYwJxnZI#MgVK__1A1#^p%N*EVSXgSav1oeV6(8? z22PKePZ~!V{)HANtQ9*mN&GhGl|k0?7T2a}N~jLO1KG3$9LMi?d6FiT8eg>Bm};nn z<1C_Wsyz)@Jk};h`Ic`d>vl(8SKSZUmw3+y2wGgTJh-VVZPK|b=DFnf>;NS%i#P9XBK~aJh5~?7zlnd+2SBJ2pm&#nb$wG`*Q9m_+E?^R|$l$p1~i6 zCzjZ6;){5(PBE+@L<@ zg~1pu7FK0R?eDC7@3!XNMWP^PKub|C;Ga9C&&~YOWNFFV?G}m38UTT*_xv7tw^QMG zsuIRNhc$bC1_!i!AnM(vlw*^3#3N^riF%nGYE#Z-a8O3tvEkTUQm1Okf&`%1vRDV0 zHxqMz5{Qr|yuKDO${~u&Y77L|+5Ry@h{#Ee-M-xmP>ha&5N%}{n`P!t!VeEmO!YMu zu65<_#yCsVywc3L3u~WCQb7aE)}yszd%Qb7sK%QgEu~aqU7Taz1`S^$QAVpCbu!fYcoC&t0I{LY z4XH$Ugk?U4+zA^AwAkg!0D!D|iigP~4t?Jv4CqyS`$_<74WwFhmG|6+vBM)QU;e23 zSsjx{uL#pS8G7%Ef3>KJNlVNc7{I#9B7Z-Yo2Y(8uGUMoq>680hK*-oA?k%Z=Z_^@ zq=P1IlrZA2X;)1MmjV0(tONipCYkkSVH$iY4i8|9zFqBehd+h z_s*<&xHTX3ab9tb(cL%Eyp~+f!3`;}YhC)!+P6t9C&vT7cz(Dcyt-bJ1OVU@6C{F%9Fh$RxQfZUC;=!%lQx zLaUYoigN@~(f{dit^2dv1n)wc1Jid5#CtDyxrW$&WQYcbbEvR?O<-Y(`u-}t8ZUWv z0ZmjVGKqvzCE-rEA74 zC}_z33WM>U*!o!T-sXYZC2r$|25EygEpp)etAie~Q6y_!mY=IFPg}wvf>qpL?@2dh zy(01bmrm|~uKE~@-F%(^Gc@QSY{ zw%|t!I*E3pYRbc<9Uetv&32;Ns5(5WeX)7dt1Bn{GiWh~?ZzF`pr3?Ld(Sw?{pW<% zM7EVW&wK=wv4De*pQJe4(#eEq{8QyMq;rqd!%ZC73MAI7gBM9o5}+w|iL0#~-5brY zYGoPdiWNJn>J(P_@Y6rQ0J0fKiyxiGN-Ih)}>Oy2&zDSxO{_`O?RCeq)uevTI zCXA&V3|}xsq^oP)3C%St(rV*c9UWTg)h><;gv4h+sb6_{`#6pXPuqI^G)ymE^Pksz=N$Qvr`UNd zhxwE)&6Z#M=6B!APZNt}pU+nQnuUh$)v$U z5-+Vs4?iKMT3>krGH|y|$H9J^!UXv`ljNnXUp|QFpSoh&QILZ{l1r&^nK92xgx+wx zY0`h<6591@v}Mj@R^C%*LQ3VOquooB;d=HeCvlTo^_8HQrK%ZA6Jg@9VX5rP%*wH0 zO>K?HS@RQLJ~zIV%jJ-0pI`_#01aI-==CH#Irr?*o%Yk7*S!I@&O3hHPQxD6mDR>#1u#8z)=6t4~ChEF(<-o2xVT_V8Vg)6Q}tbOaT5>m+#uml!bNL6?AX0T+0NO2=7CjG=usGuZ6;!r z%~>*Mv6!n9Yy+)%RlD)=($BtDF=^yTl;psn)-Q#4zr9M02-%M+o zHai}7E)<5-e_ijHR>ej>_tIZq7hntEe zV%)-kH$aTRjIFIZ`Qtp~n2WHQkLvlrSj*SrvTp@hjJY1oXxfTHaVCaSQT~mD@_}ag z@BX3+o96O93#MLl;8kxawUqIl(QuKCO)80NQREg~45C!CiEeEu8-=$Qn=h0q__+Pr##3powX!{V>_6kQ z+3t*QUrl$|_Zkq{cKf-N|0Ut>&NqbQ^2l}D>PdwWgkONuJTY~RB+kM5YLP{H+`{bP z-#z=rr}pd3^R7#`uFMa4c^NCmxz*))p_A3Wd}_IGn|(1TALS>0_mM^X$6EAZa$;jsl{VqKuwRlU^v z?TD94F$IW`_>O!9Di44FSqCq(nro}I^Fc!C1Tx?tU zR8{Q5P_u$UTwgZJsAK;fm%!y1Vp~I$z_*j```A*bV%l8XkjB^DnJ75}=xy6vDLVwf zv^va3Yfm|7!Yd@mUm+v^9)329=?(X;1Fd0QBU5;ADV z@>?y$GXOlYmMux%JUkDUa?-9VO}U4X)VOtnN{P^I{mAM_gl~l+%kKB`u$c*Y&QPB@ z96lb$<)|TLHlc#`4X-KAyWJ5$?w6N4)M^U6V8^y#HAvafbqWZh3)i|767xs9GTW;M z_qBVlOAf&!5=qYTk#Cx@b}xDUJbBus9z72F3;0|FA5>+Pi8us zZf?(^q!N!eGQJ_+iNBHDtPUgyaKKQljj<#0x00h}d&l{HiHDIeHo;5;Je#lIdTgB9 zbR68Hm-fo8#S{)}U26~=Quy`Fing&=i>gnC zzO`u;FmxEaRD~k(mCoo&)nYcj|S8=Kt8e8ADGGAALqPe36Z?j6g z>(Guva($E`>uNu7ALz-`A*|j8`)D|_Eh;(cBZaEN-T=1Swl%$MB$HOz_-c=~D`KS3^Nt|uUfhpX^ z`5Iq*g#n#GTRv$(t91kZJN>Uh#%~IVBL49l;y^bVEZVn@(Ck0{{n!4b@vPw@-B{}4 zyBiF}SD6&0`kK-0aJ}nlfw=Kr)C+!-v`RtVeg;o3@jGvD$XW;S zdJcw?*l#Q!VFq!(EJs>WSznjrjWk)^vHm=3N3fZ_1O|?_Cc!~M^4V@e&s>P>Qn3zS z7}oc*5xHVJUb(P+R?=C&AWp?f0B@FKCs3%QTX@Odt&F$sL5A<+Tr~EJflrliyzPqa zQ&1ua0@qf@hPx)Mrd3DL*m=T0Yz88NFba2y)FT;Z>^f|hKa%;GR+<@eDhf2UhM-z= z!$xF&ZPgy)<3VvH2-+XStDw?S69K$^AA7Ka+lFG*r)WSIvU5TaJJZ0z;COod9mh4f zw@#ikH`Hgymxgsx6jA(Th2mI)m{RSo0O1}IYVKF<%gXWRisa7?6A}bDYlTmh;C}9|+;-EFiFVSiSwD@I zGcG_6oHufZ8Jlga6Xd3=`pX)QN}YIZ|G2C(@sP)?S)o#S3&g079d?g@fDv@?C1E)V z;C+Heftjp}K(qkwIWMT;9jJt$;^q5$gSp78FJ@q?+tx=EYqLcL(F_1|jqO;5@`LY@ z=-RQgNyM8Y?jahFFZIIw@_?n`31Xt+96;8>;uQP z*cs9eWryK9KI0j0?uTJLabpZDz2YCu1&1%7*XWyfYi}N;wP0SJx(aXdYAn2USg>LN z<{LEtba0h;g#D9l(0Bv`;8=Cn`Xk%crZ_na?Z$9I$%y>*!$oxXVq-FaFB>>)CSN{$ z3i;;L>s|?0k%N;505L4Zh5WPTF>`tzw)uCj*$k$;+ZYOpXjqnuy$Fd-*=m~8kHMsi z)=8pNr3sZhV8)@NXh1mNl)KMNtNtV|x`4rkAJtJfoHVA@<;L)`BavlUqdy5vyf~JF zVoBwWcwq1kFdqw09$gok%>R-0qnLk_Qf>rBd_Y|huX2}pY!bqrF$A@gZ!hDn7Q}+b zkSkk@a;RQf+x0*!J~JcoY!EMuzxC-Fe;=N}*YieBN@8FNE$O7_HkJBhx^af#$zZ)6 zz7JvFS_ViBq2;;_X4T17Z@A$7A`~j(9i?)f%uc3TKd`)({W}NsAG`}!X?PC?P9Pv) z%mElXk#*1fJ|vCB>*k1i$-Dbep>dYtEbeFjg-06iP+`w>-3s2&3Ayk*)Tg1GJ}HYk zE@q?5IL`^*sjzhWN9a0&$OqhfD_cBc4OU_-o?w{1auC}kOgW#9w{MjF!fPg)0#CLY zYz^RzS8Z7`q#DL^@Fgvz>U?XT{pc{P&YeI*2CG*kp`5sSCB>;{khe@id!$J1nQZ5 zIda)STfTv}LRI*FT3m(-&QY9wfq&~C0Ihc*V59s$c)H2Jcv5++p8TY95dN0~pMOF}8Af zg&f5FF|B!Ql6_ag?*h#|I4eGF$bz32xD==9U$NVx-bZG@17^d{Y`G=4dmU*r!>#5@ z>i{v_g24bIe?n{{1CoAjRT6);+5Z*lQ^l(v#GxFfF@qgEQJQZa2kV`laD#es_ynqLs13h3oFw&vT>D4h;9tQsawp2kuBm`Y3^ z?iwe!gK%Y)Sez?wW6}W@1KceG+zwuHTk@C4G8AcMy8){>W(!uOFbbi}UVDz0vg$zq zF(dHk%9o-(7GQzv>vGoNoOP~AKyC@mc^E9=`;T#?hSd_TH8Is1xX9FQr=sLQwnvlIy z`=EgZ3}GH<`}NZ?DEB5g11@U7!SHtp3%@G_bpyEdvAa-}n9xoxb$C1o!UyE`3YKJ} zttkIBteZuR++dX`ZL-`SG_@>MGrnae<7Kmvk`8K>m-lO&ZvZJ5fnVfmMt%BYXY%U$ zJyVqN3v1`ElA`&`e3Kd{{PUL`5)09C_Vu)^Rd`-i9{2kv#}1)*ry&lMbH6D^ zom;1MNE%5{QBJZFyfBkJD9{F9B8~=8OdoXpZR0on{TSOIeqry0>3FYhuOQa!0T^7@ zNxE>!asHgxP`E3~)V7GncDtTeGvCrriiKawjV>oQ5lJdHfI9Q#k%)jYlDwU@%1%$n zH-qJ5%0ED}+G-5khDogOsnci)6X2ZB*a!dDDe7-@I@{ykhQJ1` zhA^m3+TwF^m<%YzpI5?WU?9Yk_fF+Ws_pgc9HYKYUSXXDZB^;+Ly0mea#`#}USY)wzd;KHlvN?7u1TDwY;9+XNU;VIZ zEbLw8%dPh(>JHk6r}rB^wba<%Qk;As7vOfc$bdKBU4=2R!@;KBw!^4?2mcRnh78Sr zeb+|uaR`WIvuy4kfLl#&fCqxaz})%9bp7>&GMDgVWcn2BXn7a(JC3Rg$ar3KyxjRI z>&x@SpSAMx!qm{IINn>S=8udguC34EA7Ff{NyrjVA$cM>%+n!t3F+d?O7Z;p9IZk5 zYHtKp;4OCIydva$V>97B7uU!rdXjwHa@6!j!27L!EA3IVn&4t&0Q;@+g1Tjk+wDs} z!s(mTRQTOCM&RXJ30h{B28~IgT74!u;Vv2@@^Xq14<6^dQukyQEVpX3H2?yq1r{Ht z*tfeL=yT1vmTy~D=RYmZ63nq1`-o_P8^#*EAp#& z@C7en=ChZ5DJd~$pM?_sHsGplYb%m0tRs2WXai{_h4rE*ni)M0W9qhV$xLfVC0hD+ zz4;4aD*Fp5L21g-ooq~%@{Uy;@Wb7s=?F!s(6<+pS3|M#S(@lMOr+ z$-N2fCnp9}k0SQ0fZRAW|x6?hONv$K(PJrzRI?&D?f%Yj1|0# zLxbWM<&zGF&Yw%p)pK#bK37S&DqEHC6dISyRzGb#v-_!Din+@24l=FFM#M?vnkb7e zGxOu|_F#Lvb{qo|8OY3lnQk)mPyTN)z>LYpx?c?Pr5aB)`%e7=0JwVTdTT%!StlBM z_JDi0)o@wn8{EA`g4HE!+<3;Q0t$HGAE5KF!Qz#k)^6?l?i=%$Mis2pG0w&F=7Dt+k_Ka+mgyzAh)r}cxD%T=7aIADp?7sDfd_EaK2uy!EBS|?=gqC zJ3AM-niBs3X8&b&A{5$Yf8I#;O zl^agdb~Qj@oB(Iq)DB28hm;@6J-7T_M|~?~(hH8*nZiI7ayfl6OoO{N=`ccja zqcE7_D*yclC45h8B&Lv29J5l8@VSp^J_G0u8Np3FVJUXWmG$jmQA@cBw{f=%WnPHW z5&)`vBF84%r2bljfoR3lJ^DJW9Ymd2X*L6nkxQJCqmo#XUiTeJ z{g7f(fB(GoteO;ak?^5hGAu)ySDvj(|E+p#bDB!6!5NdPp<_wUS=HTn*izQu;L=F@ zp!G}IS<||x*2^2&_kVuzjp!fwo$RnkY6X>W0sITMQ02zoj23;?wPa<+DrJ-`bx~{a zeQmK^r5OU#xAbjN>^IjKX()NHIE?mTUWE}L!R41AfZO~Fxd>Esy-V>)WEL^56+47- zHUpV~u9{cSLD@KCV)(I~==INK13kZByEXpGK-n>nMRZ#4mpEv_5sU&w=w}}t`>`=R z9gI5u2T+~8<)l4%R?B=NR!q2{TpV5T9@~Or%^L+Z4tfKAD>f0OLPYKQeM<~P6M5M} z!9y72=M(@ppi*c-lrcNWoaGI=(<2+9hj94xkm9|_ygLh_|yFr?cbu} z?+%jk*~m#{Huqm^YT_ZDw2A&Y{299fux0uL5Z_|`UD}W~%i8`AQ1bMQ9dfv>s-U(@ zG1#3OmXyM8H~4ec^FgKcrftgmse^6J+UNVn^MMNT$*&yj%%y)}qSErmx%+a$nbo~D z&Tk>bEmA++O7sp*O(eG#6Fa~j+-q`<-kh~J424kTalm(-H4ZmjM4#%=)*7vtl)puw z#Rvxft!S~$bt^sCqy7}Yv96I%#uDg=4c0$e2Eo;t&o@^d&sF`Vcssewy%Mk!57#OH zbuBqDOz3!4GW2R?(aY+8BkNMDBMY)+d1`&;`4w@@WXRa<=E+UGd{(mpJw=hQY#hdj z&g$a20GgErGS!!JK{JTnCtyl^6%AkXVnsoo^$WWT_EY2S6%vn`J}uqm%tq6<;lyyC zWp?6AAO`jiFsLkHG%IuVFe$TanI*daM@v4e073k4<_xsx>CReF;WlsmocnHC!BT4($n4AV@$~f}WTr>H zZ(BS18;(wSADm6??`;|4`Moy+Pt6qCQh1LZlcs9i@LdsCVRGZe@w*1h=KMr~k!FG$ z6yKawq*MH9*diH(@2FR*jtimGU6LFH_zT|&bB1z|KYDP9#zQ2Pk?Z}*V1S;Uz^icg z+SJ%#66dbjaH}$`dD46;77)ilYO>ypaVm4E;Aa4yxJ%ID^=!Y+>bzJTJ=#52hLCtS z|HDAtEf@D1yeXtX;s=Z6As8)_fId?kfU>OIpY|FVkQ|u9O?>)v9Y(p%+mY+R*ScQA z0WZ1|OWALgv#;I4_}*F@aBH)*d#?U)qMvTIs$NwKlMIj!7)846&U{{VbP3!gmNQtA znm(m9mOrPqK5ju(W9~YIXF++j*IP#XA?wwgPn1fpXIYEVEqRVXPSfTqd>rk#vHEjZ zPxQsB!H#_*?s}UQ0hWi7(k7X0m5&1kVg;~$t=6S|TJ*A9)(L1k9ms=MB-A7=LPo-Y zgy}MwKDTju_Z*}cMw`(^+b2p6T_4FfLXlVCl=}C!tIV+{!pg+TC{ZK_8v9GEO+F(JpsGtUZA%OdoW* zBW_j|!r`YhsstV{C)^E>SMmk@9B8N=1#U_6CWQt&fpVq#axh~BI*exGDV710C{<;! zC$6i6hU6bD9j!&7-OuSpaSoH%oQ`uQ#OkYsTB%0JH_O z4!d4#zJ%GCxDo?wonQ~OLpUg#Z)E)PW$Ny{dV`^~SNJ{)gqvmc+mHQ!0DQhV-JB4+ zP^dFXE4wjp^D44q$U!HC^jxn(&6Sc44#f~#Li+|D@dAJ+M% z+U_K5h-e&7%@xefeyQ*ARfA z0T#@pK%9kwWw1p^fc2Vy#T#l+0@lpk-AoI?Jne!JwW_6Xf_ ze|(GAFFJlEt_~W3HgMuY{2VUh`Sgw{=8bIx%?P2&?I<1H;)%kE@3l;v8=LC%KMQ6i z9eiMqFoC&UJU2wkhi(12qJY6OE41(Q zA#8)o9a1zR_7CvfwyG93nxE;^J9ulKF(mGFVGA!(snPt!S?XjW0wuP9(9m$?NhGQ3 z5qAy7euC5)Jq_#mEbBL`s9L#pHTnxK1%v}0!??QnXwgYz=52;BiVF2qC`&_|sgBhX zP6Y6)au?>1&b9GDJqhr4VR=%E6w&lESMYWNBhjyfeLj=Eofgcp8VgX>P?pelI$oav zwD1!90DXPD3_m;LRoE!vk)IR&`$SvPMg4Z)Ryt&2qZ2uLyyd$T&0h9+C>`?X;TY&P z+`FROy8?H=t~CJ6DIObVRh6Yu-qy`9OC4_!rK=cSrA`Jcksk7MDJRyMTW%wRsG_uH zDoP=$lb!M-gJb!P>h{XLKw&q$0M82m0Y9Fa$gW7^Ii-B%B&^8<1lc zk#0<6BNir-RoiggpAmioY`Pf+HcRi&SCCW1d2Bdpiq~RkfDvoB7BAuUf{~tiYit!~ zjPRJ;P01uAekMPQKi@Gm|2?r)3?lEEHLaw#Wi#;JW2j?^L2Ck~goZF{xQqc+>O35x za}nY=1jEPsgp1;U+!0lrE6##5fhR4*g-F=3ZIt=2I!)>xh~1Gz-*Z$EtBXL@Utkq~aA5d-T06M& zJc0>bUPPXk4eRGmPh}zvf@2|2#^g88OgZki&Egw(UDG^5Kx?^9?oxevWpc=LBUaa3 z2vy)!a$R9;(dgBOTYrmvF1wwBgU8T|KjPU$qmGXg@;^PVq+|aCzCR}`{6NIt)iJ=f z>yU2PlEleQsS1`l56aJq_=)2}}jQiL0uY3g4s%UB#HY7z4E?xK&|kS;vG6ss46 zhFowKh!Y}^Fyc<@V18)=#s~^pzLDrsw}cNW*Rva@mZDQfdtlXwLze6^V>)c10wtipH|1D(t}2Hca^`& zP>VRz>^m0o{Y$WMaDeNTVW-OfK9ue> zg0el~1%2DjAPvsTM}sp`DF4Prr^)PT@|)nPeiH@xJL11g6nk%#-S~Ns-4bRd;$NZ= zoqjtrki0D&BFry4Y*2e1cGbVsNv!=>+uI>)_Mfg~k@R%U!Bqb30_YcIv5ec@!gCD5 zUmh2*d>Sla@Zxz3D2iem)_U}AX4&ih=hs#QctNq|OLNpkw+n=t9b?7{N3T1(Zzeyl za3(qPLwWBQWtL8j{K%^FQ+yn#mFigle3DWV;$s0N+J&5`y!;rIeXmbDev+-*3r1(YMgtMXnJQArih(38All;QiC* z@&3GD=XK8Wz)ll5b@1Y#KUkoMAMo%*;H8IzYU)DUG!s-N=>o{Pmb=3)IbE7c)Esf0@*Dy@^2i0#rgCq88__46WU zap=&+jhbdb*0uLP{``WneoA?@s6s~DUS3|+_)=Z-$n17W8I4w=B=p2PrJR+{86owD z#fWDo@@CV6ZPUzc-lND&)Ft@UCJqaL0xWGtp2OY{aC?mZGx%-^Z)`Y=>GGOjt2kn4 z(Lca0A?qN^PYEewrUZm~#Enjqd^12+g^j!T8o z!FSsy@+8z}wUBb~OX>-573wIFP;XfB$)<@_zL<&??U`wj7jMt_*FH_(MEi=RD&vbv zq$_&#Kh(|_S_WHFY3Y7V_pfmHqHv&tiPhJbHnWtZKfUMFRDLAbu;B_#!R+FL7r9(* zjYzqQE|03`H=e|DQIbqCj7@pR*kn@wlQg&W6p`yfFveZbUqq`2PM%N zb&`*5mz7|xZ@p}>J!a6)Qn^ww#?&l37iexjL1Kd~g0Bd3;q?cpFS>UPkUB2a65@>o z<(E5V$gY~;Vv3`}tZrA%yRn%Ai^;Zz8H9X`sim>GAiI#Ic6MM?3M?w-wI7Z=WGuDxuSsgO<2Z4Wm7$%?~5vmE?zf($)AvKuZTNX0r&3!OCzESzghwM^1!&j39|oX)v8T{hZh_pL^RCXi3Vb zZ5HZDi2e;7>&fMI)Q%xlaRBueSZ~Np#48qOcstIENhp(}KVNv!uc_f>?bq6vU|9CM?wMXX4=8t<9#xtp`oe8@(UnaM z3V&UaOzezx7V7WLS|FL&e`Pmh_jPbwd4QSauNB4`&)f41_%Fp>TKFz_{E#dH6u=ta z!B6Vv>3`yz!EoKOz-^fzwT}NiJd&+Ct7x549)iTt9qGn1xn=U>*CE7=(kz{2@|-7E z1hdT(ZL7D97Df+5*CJEYFSY@ccJ@+bG`8uca_)NYSj=L_%nUP^|`W?JMgeuTGph5c!wtF2(LP!f|lRwIbUhCp{8IBAzX zF&hy}w-kMmo~w&U?Iy9?bBkg#%6w)bn-qh~>N3q@ED8n^Xn-E0n0Z&`*Iv$z-K0N& zo10gZiwcPkotO@p&Ef88+5B~4PhZ|*B1>iF19b0n@ut?6U}RaR8n+igUnPf$t_6+m z7a95aM<%m(WC_dO?v6N)c+VjESl@4i0>@d@r(aO#HkpHPI9saa>SErehG96f#hWPO zZJe{X8|vAZ&6!Dq*sY6`16CRGA*O811#Rcx=ab9(i(4Sb9u%OwSka1iXk(spYcj0- zJ%(g@@c{o~^KmOCwqG|x-t z4^4U84aft;q0be8xt1chbull3L1`2C+<{APWDZJRHBol-F9#D}zDc!R*Cc)t-*bA91~a6g zU`3lAxq0FjI=aUN4n2-j-G0i~cx5}4hMAo8AZ6gi-`MeeXwGU^nKtL z&oG~RBFcVO94JmMgJ9*WF99NTQs-*8o2E?UuO6>7cV|h<4}=#DZ?Kc49#3^|@VU>FESA1j=9G4V}f@9L;TG2lrYInHT@@G~{azgB3f8vpU0S*@h zrbz>KJ&8-&UnoU==@N7dH@$f9W4Vfz7(#jO+@8s0`CruLdW)3ji%_!F(t{+;Ui=pv z^t<{cxe>`Ci?m7IhFcyQ-Awb>((S|$3Q>nPQqwuap13{Wca^1ES@Rax3U*dJo47_c zN22rK!p~Q@>c8e!GP=y~;1E4pwo&|xNxSJM17>p^g~sQf2Ah1_K^}%qR=n*r?HsUC zj$_7o@imli#MstXdHY&*=mGqbc-uHFWxzK%vQ48|*w9;d%{5N?PixDQ(*W~Qxmhx) zV?+ZkYGZl^2cN3&hps~1>^V>9oL_C-#@w{$gK8;vweM#D%1dVp$?GeAH?x(#ZQdH@ zCep$p!W|y6gd*^hFMO0>zt_JN<=D*eQGj`c_g$-x4^ybRfdk@d>2KtA76*Nj%iP4S z1q1E9wf0?H0UGc~%^#b!g%13LvG}}k|D{$(HhYVgq0Cn}YU_uC?N+8EvT9Zpi&aE# z;RB)16i>dmFy(vJ_&5I!k-(M#QKoVv$!DZ^hfbsvbb(#+SOam`J!8cu#)N)#t{Saa z+>Pahp9zigy20X zX2~m`cd=nKPa6XvhocE~${qf-4Gj}n6mpKUAB_KrU}u@&9Cw?q^mt3=m?3=+__V{{ zk2N}~?niEd2SBDQsF@k-Yn~qodl%ZJQQhX)Mibgh3tShW@yW4{H5`}D z-^<@mI7N}nO{leGBd!{lLDI5SJ&OV9E7{u~FdEV5ac%T>hTcjgs7EQu_-;ng)2h9T zfw(T!+%nR`#XwY02dtM_shDD55|Bg%H85E8WGYj%!)4N>R6gTInj9CTZtXx{nX_fIsI~x?VS;-O24vMhIksOY{Bv!oGv9<5*9v$fs*b zU&8TgbMU(XqB@Nk;D%v<+aVGEAb&;0;DE8$jC|IGtYb^5jseG)G{f_iC^Q#p8Zef` z(X8;ER(JoPbVM-*-kl3(d{OZr+KN=NLUMH58!VaMDh%w-KF?X{NH+!Y!FF`x)0@ zqr&-{S*K~ee*wR4RawdH=!T?^bo$w&!`I@~jCEbwF+(;Yu%Vf(#oLxMZR*4EX7l-7 z*>~<3{E5M_y%7uA01){N$Vq|#Y=dBuQnG3Z8YMWTkDW0vJ@VF}frT`koB3JsN4 z4QTTN4i&!{HR7`X$^oir(xxk=uh`J{SQvw%inD|rvv@>FwS}Tm@FHpgZGP%g?!&XgaERpYBIrD4n8H8*$6n% zl=a1s1TET9Ue}=B)*Zaqgp~zUJ0NFO7bHG7ntU}%9BT^nF?()d8vMB>p8Q+s&vjqF zN4Y8<-T?2?&~u7e4)Vi2(Q-e}aP@Pq%(ZjBYWFcLF`*_`bePXN%`%U(`*hy4L-QO> znlqK+0{ft7-k$}BDF<&cGxUY`d)$|`BG}8+E zli>{2yiM32LV{+-Ve|6Imwm@JB?o7bTGIpOufIrd?RqRmaS->S-&WOo*vhTiz|>g& zv@&p9zkcbI+Rp-IHMEeB-}8mtfJ!^QpzpbQanXxRBh~+Wo26ZN*Ksiy_`G<}%A_3~ zzR{A5IeGVV7vHQ>KRW7+)T`(pP)@CNYZmkYi4@UY>&Ot>khsd>U8{nIaK|D2V5Fsz z<+V~nq`kLS0aWp7*}=@LQ%S&xmcI151irdH0Jf>9=B*f!lSb$Cx-vuHm8{El$;#@N zxb(}wtKn;o)lx{oxqs2MKS|NDCef_Gh$5_s?k>HML%TjrNW7F_#KqL3>{FxZ!ZE2P~vSFG)-* z2V89Y#i+O)?n2j4MhYjoF5}1#)y?>%WWwg2t@V(~|14<;+;{;Y%|3Qdj}Z*9NWt5a z9n)t*VSfQB!tbQ!#In;{_6G0=zV=SiipcNx;p~Wr-qbTRw)!8VsaX?I!p{j>$YtZWMyEGgx)9lxIIwv7bn&}sK`*CNkgb8m z#_(m*CG21#jLD9xNyfPW&`bSTSf%A}bVi!^mC;o5;Z-$$5Af@fazlq+@GJb~8B=UT zujbg>fs2jqk%Q+U20C`zbno!N)9_r(xT#W%`Tf4~@@y?|aHDbpDplL+{Y(9pTKczb zR6w;W`1v&dbk`d`O=FA@WlODFB=$9>$*`RAipJQ85IQL9YE>{3l+BQu$;UW&UtLXF z2Xk%pT=9~-(NFZ6%97Sx!L-u(1{uvY!%$o(dEa&+fVipNa|sl1U;1Io6nT~Ad1T=+ z3I4H#iWfII$8#6-{$AWzp#F=HoDQAeUR8$8Y7jOXZS#eTlC*pU~jL{K#=BAc^mjt?jIsOFMg43524_i}Up zLq6 z;6kHPUc;Uj^p7@=_kyza0ram5UoXS6keu<0I)}DG<2lp$kcK%_b6T(}Ra9?1h49GK zE88RE0XbN#?`f(nwf|zmzBa8G!nBDSQGSc~sNfauPV(46Ug+q-Vl=}nqYFmR?&Nlo z!F};uC>7Elpm6)2mnUOdJ5=8^M4f>pANZNs=1mjK5t+_9qlvYI)!B` zJ2guFQLOWFOqF~1;^v_Aj*?on(|BzoAw@!6#LXn1#Y<5P0&40_beWmF2(fo(Jnung zg5E~D4rc`zVYA>j`t`sGsewbN$4J#>G;z zSK7^#0*`h8=oNqT_aEO94y}zxzx~P6$-wiKwsNQK?c_-g=Gn^_xWEmIhGt@|yF(eO zig`lna@zfz?Br18Nkwe+!+~~FKntOxmll97&n{2@D#~JN1Kg3nHg`T7kw%1kqE|Rg zqfvm+G#o_3A+@DG4pTtA#Pe;DXL#vlAKv+81k*!N&@Q+B1AqtSFM!Kn=ukqhAfld! zeau96RP4`D zpSBai{H&4uqNmU);}jbppOrpctu#MYY`TEspnAxO3WfaU1R)|Lss&38N;{auu5k)UnXNxELM^YzDpH@q6R`u&T0AA)%WO+Tm?B@b$h#!V z?7-Kue)12Cud(4jHgCM_8DklSwl3aDi(vZ1_RUW=UhN6WraBTJ>4B~%+_%-q8LnED?oinpc_RO>w`50aUhWc2}q@FX95R32MZ)Tqxl z+RaHLepa;B&*K&Grjw(+HlF%VC)mfvGkMl|OlMED*vUEwtiye%1;Qz;-1k&^6-nC^ z*JUz9D@T+78jN;^&8l{@IR66pe{7n)Zzrm1^sNxpEwn;q@=PUavH=;?o*Y-A#2w)z zjmP@oNi=D4;-QHAG-V6NNFoEBw`oDME=ByD@#~-TpS~-Us{+xvc+=9w64w8iz&D@< zoW#!;{~(w$a`D|^`#-u;wPv0L3L-UPa3eydb|f`cQ=UDPk$cFL;Bnzm_k+@HzZ7w3%o~c2D{( z6SNrOmDNuLtT}F059r;a)j@cxy19vl&9REk&7({_({68>DM9q$Gpc5L_b`p8OdP24 zdN_^Fdygi)1kvEo?`+4Rpx*sf-4F7@3Q|(=(t&mw=qT!$cB7>N&m7H zQ)QLKX&!eMc4a3}0}&MOd)8OIW;M;0T57f4+a8DavvJfN0CNvLaT)S6))O`JQ()et@5KefrLJo2e#%>h>U? zhGzdId)N3l&R038&7$7qx?^UqsY^6t!|^(MAQ4JopV1gXA_8l*EI+?@qgIgbJyhUt zPE~k7L~@Oq!az0~rjN%3YHrWPf@GM|YC2Ev^=fK2b&D=#R9583sG2z$L@S9!p&z7; zlA{o@{d2to^grrs8<{^Wf14FKEBAJ{(35wh`c-@cj&byZvHs`Ru**K)aro#r zyE2u|Gi*h01#xcnmCdCQnD2vgH?Lh{^5lftQ-8IR<4S`?G-#NJu2YE8S>^rEgC> ziLOlbyVvLnMju{Id!iew`Cjd;^V`BX>=)i*&2+J|K@^S>mTDGWXL!DQ(R6y%JsF`a zWV=BHxQ@tkvCX9ZmWpRx(n&h3psRjxVdN@SwW`_M?_@E@!u(5$?0Hy%lLjAC8TXal zO|CJi@*f$muTL*PaSXU-0+L2xVLPPDAuCOCEuv;XeO&3vo#>(7hK3O-3KXQ^6{e*u z%*s)vEIzCGxgu}KiF8S^)Q3{1QeQGZ7>LA?$3B`Ba|naZzrqHejG8V6GQs)X?GQ?J z!g=?^xTEpK8{PDeRu!>p+Ecx|1l+~ur_$(dUua@<0($);CTotb9Kf+$UE8H3#)69G z2M@@FFx{0jI&S4g#EF6e?3}qMt5M>WT3~wE^<@ppXM53 ztmc|zf8uk`n_C+5r+%-q`2Go#f|3d$6YbX7vFeyCmxoZYa$)_7GS*ydO|C4tus!5q zz-P%--!m2Q4@PWq5xR0a%G0|S{ThRM;M_2#esd_E-tHa4raEB7q`fv#n60sAR*>n> zA7-zG!|i5G>mq|~6OQ)5R@^gxDgFB?|C!!{_)AZb4 znt_ycgWw>)*c~Cloic0G;5Rv;)jHIp%?W%!o8hGoY?vjcv0}(VPFUb@$-oBsT+cU) zbW6?=pE5SAWXGqKCFAtco``sAs9wP{8Ct$s#q$+D0h?(;LB+(u+My8?r8lh#6zv~L zU8ShoWNpibpp>s`yr2GkAlF+K$f10#Vd~%|2O6p$iiuug*Ko!vFY=M%gH_Yr)R5wcmu6yzti|02e$MZ2UErwJU17ptga*GJ8k{7 z&l+9@-r$F=(91GiCMFdMjcsL|*X>jus-+lw>af@7A=#}h&dOP?rJh`Tqj2{z+j@B> zvfAsl^5#IhNsu8M!NI>8LFE+VME{927yFm==WbA zWvdfYQJjM4L+I>B=NntUy7VmhFW~-*Xr=W6{sXWiV9nl@ z?t;=hGw9N?dY(Ym>Q9W^3o>f>)1XF(v(vwGX{iczEub=&vKPo)94oz8;KaD|qsl(dTzku3DPkqWV%Ey`|Ov4k(!iC%T|FJAP z6p`-2M^dR1R0c)dG1*t64`t^O!bUbHO~n$V(sZnVXCM z6}!Q+1_Ckyjg*?ZBvue}{hzMR)|slSgE_8E_u-5S+Qf-TOV`gfOm|EOZ!`7cDrY2P zt3C?GkE(oOVH?oe@t6y37_Sv3cLp|`BmH!JmiP}hi-;D-CD!0V8EH+iTXuw83frJE z)V!Fv>Rbp-8}=FQd)M90+p(94X`{sWU6*0SAKY$)~_#^N#`v0(lDCIpmlw}^xep-^c=JND{mu(c51(vyqnO8@5V0G z-m>VdfSFjolS~%Wc;+s+a4{Bsv`2MMXo(+-tcJsx#_K(B03xJEc7(E8|(rTi( zm3mgyTYg2e$zjny>rzP+?!;%m*lfWV*N0{a60p@=Rqf{7M|{atWQbnbC9W`cDzj1} z3~02>>IfYhO-d2FA9HTmFbUQ?$pOcJ8H@uKE7Vc^f1^BDX#t^h=Cly zv2yT7z}b2$3iYLb#a;r3LZIR-2ysK-lN?jE4&@z2y2T=9_6M%-`} zf1~yx?=i?5sl9bCihK-lba&W=03brL*56L5#E;T4hyXST>Pm)0e#F6sOvv{^rWY~8 z^fw|*iTb~FpA=Z6j4~leK&fc2T&BdtI1I!7{KaYJQf`|5Z(tI&sgiw|S$^5+W{ofz zqHspylBMGe>|ul<7+D2wEBa6E;r<aovWmZsdrv70b)KTO*(nK*4 zIPmPO6hh%mZUg>*3`54&ppH?W&R1fb z6k{aU80PKGMPSbAZH}SbXRS59W&duzElefQ>8;i^axZNdjb(S=DvJ4DEfLODFH_0R zf6q~YQb|mlfKtW=yhjxJjgFe6?sTUSU&KJKJ7sW`Aa+aF#9+PJsqADBAgOxne*qCmbZWy^Q&#BQ^Erh8tML!Fysmx>({ct?yXwItX3pn1C_C`4 zOlr9Q@WKxdOc(D@XM3??#c@Q#*7WjfxfIK_?&QxmY()Bln^j=!aHkdRg z!QFE($s+!J@rkF!9{a%kLUl1(Df*%g0P*A3y6V@rdMoT^T|%KQ-IjlXRqD2FyXZ}^$f-=$m6 zQ3I;GjAd{WY?t)}XHC_h-1X(tN*=CbgUewH?&c~b!Oz`9J=@0&kF$%Vqd!W^9d8$w zb)2f4e7QN{tAjFY%q>*!PDsm6|F;`a##hb~0gMH~z$*6z-$1672E&{y4U)`6?fIiK zJ<uKx9=204U9LO}Q-DC!n>%b5h1wKf zn`JONuH`l3GW|Exv9EUc(ipXW{6nuUWN8s=IX;#WCx^rmw-F;zY2*-j;BFe*Cko5v zh3^%w(eJke4f`(*1}#r3NAU~`5U;!*W}hD9igB1$JoVz453+z*eSy-Qt2=n{BuHOjrGy=^4Td0`K&mQ_ zp;CrL?(DtIosmesF!wSKx;e^VW+{@rINiDVmdGW%EZS`I0kvDrS9U=zD)xZlo?U7z z(%|HB8AaRz`yIuF26(~&F$j6AfB8DamJCmxaq+zUx)bxk{AD@*3hCcA+)zss(ZSgd z*gGW1^z_*B`?0afFl#YQUw%{Eqhkf6NxI2D^xxLKQy1ns5!ggXicnJ62X&9tJn_pi z-9vj(jG{dhz)bL{pB$41#$|>Aoy_TM0PZ=yFs*LQeYV4ZE9>+2+Sh)FXexjD&^Av_ z*zuBl=jC;eNy>3P5-y>6A@TOe10}(v=6;^BFmHd16O8ZQahX>;5H(K;j;w5g;sr<< zeCJ6Djur4bddgG0R0M1Nluutj@_NUrZcr1Mt3JJnOcZ?JZmJ_ST2ij8PT}+iX*fmH zH$5@HXzZk~xR=nj$~erQ(rXEny3Q_cQ+6zVv{(6`MUB@1Cbd&7KNB5PLV@Or>C#(l-)&6YtA>D^j$woL5Qy0U>J$h= zK@suuZ8mW_Xrjl@k}O7{Wc$CRPO)PtWA!~QJS@%>x~YHm4e}dU8O6JaQm^B^Xj_mcky5HeG4MDAxD2(}MUIAhA)d z)Z530?+8NzHOU?+^6r-~OL;+5n9y7THa#OI^0b5#OSdRf`$8BDH3?o)QqnVvRWz0I z(6Uz+O9d}cFuK(-)8>L-u;YA=Z5%x=bR5CCp?+XE8{Q8OW~F(w1`DRQ87?rhFDO#M zngD-WGFNq&g;;?TEFsbNFMu78hDN^SjY#6X|6{)5Bm3(4%G>GNzkY4Vg--;=+nr^8m=~__X zVY0Bdg)rqo0=wIq5$)@@E{}zQtY6&<)ghQ?LGxx+H*dI!JRkH|@>rN#iY3<6fHakc z6G{1FD~L3$Xg=ieYQ#~-^`1IrSwX5^Gs}+7;J}TVuaCc6EZ-S2t0?74Pp{Ta?(*zJ zTkpUS{HxgO-8DVlpmh1#(wb~zUne-@O5A(H`ku_>Q3?`|cK67(Nn>RBe0szN-%rF# z^&(qjS5)9<-S8bLwR#dttY^v7R14~kA!I8#@)vQ z8Gi_Dz%k&j!kSyZBF?6sp`+oRcZBELPoFJvScm=NwS0xMCe4d~7LT|8{xYyxAb(8N z@_Dv1ZQ`P$j%Sn0N^Ks~a&)$GMVc7TM<&&9B>pd;?wZ@L$w$U4#1}{7TY_au_h;9) z)?BjaXoCB&!{PUiTZXDNeJ;jiO){6?S6Y6|;MOcivQaJ^i7Fo9!+F4@n)FGa|G2-d z<~SCHQCTBRb(gvYCLE#_`Aa4;M6ds2i_FMoF`*#(Rkcu|ev(By<4nx^~P-JPJ$ zO&#ZhuGN4UbM7g%Vh5bZF=TUjz*f%rwFBYa8_z4Y2~5VvYI&D|V1=j-Py!0ZXL+&2 z_Or`BfnS=%*bW{}E+CFZd7bo5E*4c;_CAWMi3q;a=H>h3H#r4o*pG^x2k&afqO`md zUHF|mmCLnXKDXZF2K`3F8XVB&Km7&l;Xa)f6^%Umd3wiadWRQQ?Zd*crdZs}qQ|AvLd&AH=ZY7R@Z@j z{oweaq3BsJE;bsm&o&2aS zzvArF&>@-R%zNn_wsyhR&!!fAY9B4zjO|#82B4TixvZFx4H?!{u!2)!d6or0$!Bx3>KPL zF5ST0;=A=zNPrf6l&o0Pe!8&64TRp)-4fg@(i07zcdYWJ-1&+R8 z({pP^fcMAukJfYtDqa9r^Ar(Rt)=53xaKD&Zua3|aQAK%%V&Xr z{aR(95<=&{VyPFHkUdORzqzD@C+}6Cosh>>jp~}o?rSs6ze}@oo(Y&Ca#w}7{*0lr6Snz;QKq@{6CnKH0Aaf{{|& zLchE@?m6tgg(e3N$QU4od3c+~1e+LMiTBr0&!juHUb|RT2R^^HlHuU9;AN}wsy}RA z5(0tkbOn9A@A-N0G7+YFIe^+Ug3j2ti%G4wp+EfA$W9ynsQ#MH&Hqy5Yis&*SW~wo z`{8PA>WLg?)?+_T!v4|PaKX%sFnz8>3mlV_@zFrcbd%?PotH!G&lE$Wr$;-`?Llgd zNz-i0sGYDcjDYNxFEQ}aQsEuOubO?GF`MyX{1aB4%-IY;Mg0;RwlcQSRK%Q#p=ue1Deb|dD`+Oy<=STkyk?y($}^+tN?3%%hG z7uAr@74LWB5lw(FEag_eD)NcXJt5DhUw!y*uPVE>*=7g~9bX%V1gJS)5|vlUoeD@} zO;U5b!dveUKt4(uGq)3cmp?DQblpmB%Wd9ZkgY;>WhNAZe2dLi$} zHb)fgMA6afDoja@ zz}}YXA8Enm2h5q$o|(ES&G_P}_J0SBV?w6oZ5HMvy=5(w6c9^WoyT@FFDeVkxN49u z>iUDx6Tc<3bW)C0&|39{QJaT4=lzU2NbIUwQL_uQ}DQMdvDzP8ksDIF((E; z&R$N}i|a`!h2lmkVUiVRj|VUEaZct2ae{{FEG)O347_Y(V{rQtR2LG2oM9nUD5 zb+)&|aQ-s=RaX$u2iHnZ?wu{pAmHVVS_%rY4uchNu z7cWN$P>y~U1ZvP^@D>r?Pkx`-V6kbX#*#hqFfDYANp&E@=TvWgkHCzD0|Fshvtbb> z_O6>f9%=q8)%wg-f8Nbx+9zmex&fzmxHzolhG=c+pdEIZw?sxT+gm>e#N3;CVn_O{ zuB5ki79S6kWu~lXNkoox9HO=Bt}V= z;Tn0tTYh8*Ef^KOYyO>%2l|3GipM32rb7oH2C_)jRHq})9|Nm*WNMRxNp@^+P+oi( zubmhjDnW{GS?942#A{{m0rtK? z>9kzC`v>-RWbyKIl5VB9KVQBbf|L1Ax0kps1=R^?Fef}9;eAWO$!`@BZ5RD>(z1db zcozndmlhSNS2Vc{k8h4~ZgN?}^rjf6O}QyA(Sm5DLBN=C0OKZDB61B``0(nz%yDH) zshD0jyCez%=GtR;rNz*^p^ia!l(d%^pBz(cn%E;|}jU}y#=JiJ+T2scr#l)8{R zk0LXPsao_%i*gCgn*utsrUlvw!*$>DEKJ$+b92JY6(OUd%E&X(gU{bdI*VYhb9*;K zcgnIutB2130np(AuV6M*#Y4s9#~aWd&#L6akAQYh10gt~$iff)rbrk1v74NFyZ0 zkV%L%OkAcxheQc0SS`XtAU87~W*TwpzHIzpeB&OkS$(;-i*8nydZlg5{zTiubBe%pI zTej@@8kv)*f*CXh02C|HT8n(5e9+r*$-Q4FJ=1f^ji&=4-li8U%vr4fpRx6l^_13K zV%=lsV$ebNr>bXU0!bUt!rOcLR}=gaH#_UD z_dQ&(vyV^$JSd`=^6tDe;$tu?;s{U0F!gCo2+TQA|0-G4x(&k|)G0_(nS4e+4BkZ| z@*IYl{u8UICarz`h$sd-=GNdzR-vR06#dGBn+z}eJki!Sh}$szPyiQ93^OG6URUYP z#uDgTpC$y6-p?vgwkBpA5+BVfE->x4+lNFu1@iH)$N?IH8Dh`(f*RfR*OtwElHGqp z(s;!4Y$La7uY4FvcLY2i4p?0uf1M|tXs_a9uYw&miv>2j^mKCp73wr{nG>nqn+{wm z9QdRDWVKY$B;}?)1YD=XUsY3)eR#8*8C8@@vght($8z*+Gg&|Tu`U*J5D(}{FGS|! zQgg1~;o0yodPDm^#Q4oWG*fUK8@AptRs~3Mm@7QTG$4@Rv>F0w*inZV z|IyBIG23CyZ?vV&Bi--oe;K4>m{6yAu=UDX6+L&&&(b`Idlx&cEGp6;lw8G?)T}bM zb_d(a0nPv!dq62_gwS}WQM%#~>ZbP5h{R}E7|*?9iZ&gm)TI(V#=@2Zu8DO5`6VSf zul3s{aizMT=e%?P1Cn#ctaHg0#RwDb9F8p`|Jr80?h;fTCN%wYXPi)%WlJq)(TTkMGfelgS$xW_ zZM+4yNEYZhnspFdU>yTK)nys-?tfk9HdK=%GmQHx$vU{yYb0%)~d7Ay@BWg%eQts{#Lw2h8@(hnurPv^#` ziYLN>f&>qjRXVA}F#+hMCpffC^LMPa-VkQ#Pf<><dwxJ#I0+(rdF;IVPZTJsaO93zTCMn1i5Tc81!{uO&pk8PsjI!W)OY)C4I*C9al&A zPY>Nco&h>Fq!j5IUOo=Jv4gkv-upI2a8+j@#15xv?~kCu=Zvpah+KdwL$pwUM!2)e zxClt3g?Wx5&)VPfu*QA@PfnSq8+6#L#*)t?4;+~J`{%(le3w_&Rf{YD-UM+g>F!<0 z`%~|@1|HN3H{f4ttswX?Mw;PZb-${}4!Um

nOWis%V$={Bh|`+*?@>NvBxipI&OddXmKmdzeU-vj&8*eUp!;!YP!U` z!Z7c$ttGvUGXinhPRNhaweYYM`I(1ab1eWCfp?C_e)nw`E~W#y`K=! z9p^#?UA%V3()xpP9b~kMieqBoEzjqtvG87$J`#066;bYxBs?o0HT-8R7w{}oEx#cK zr`(NHORtrVeK+%Vl>ilWJWl#jY}y4;aEmE(2ndu;qK-MPyV3jd|EK8O|C#*XIKGq9 z$oa52j?HN#=8&^FZ^(HL#m90iNzR9end9UzV-DqPRwABDJE!6S`*SOurjxB{kWbSMU`P&U>|(zhzi@F;K{m{rk;) z89KVM{=*0cD&?dSssl1Otg5_o-1r(x6nS<(eiiyfdpP(_o8H=nf%4-dms$}*jF8t4 zljm~;Q)&+Pv!Gr}Wq%I7yk#W&1bx(|8Fw}8$y_+aO8#T1cj)iix$b^axx8u$;U0=dq+?w!scgubJmzq(-!YtfWH}mzc6|Ht@2RN^Y9hro-$X z$U~l#Nk+%SaLjV%n2z+;oDIiJDK&g!X3BL0UHQeP(c;)JFTWIy0DtD%E8V#3GuWT| z=1Py&(uTk;$S`lLero@y)9`8We|rbp!(ZS2SB+_w^$gfPy}SL`Cgr2>x_KaaX3hp#dNS zg-0@liEwF*f%e=LB{)Q=yNj};f6HAUgQORC7-8*R;Q5wheDhX+sraody!>mOlQ3QV zkDt>%Y4EXX8gt?@O|_O%C7X@a1X@(Bzb@&B#>e$->pT9eNC&-yi_pjE8sDnf7nbHL z)lxhrmNW5sG(2jmrN^Yc3EB4Wy1C|8(Q$jm$Q<&_Zu@H&uG_uRhnK#c@1rA8e|7EP`n?2N{d{&nAs4>4aE#vB?azJ~fv$9p*h`+A+M$I88=xH1uCZ)Kgtc&Z z6z2Mh1w2(VN}@k{38>rud!#7mqdgWrCU6Y+s`J+ZdOD(e_}2UfGa8G=Obb`kuT6=B zR$hVUC#USyAI5(iBvC6F*#S=)l=Ty3hCSklWVWl;=#Lq-7$bByo;Q+amfl^PVd*YY zH$N#rrxw}yg;T99j2^^4xi&vio7lSS?e;f};W3-TDEplDT)E)v_>0OVu6rzh9nyhq zxiWoU(yUlgQrES5C0*WkS|Q)6y1^8wyvEwT!Ao>qJwT5_JpAl>!}&l0hv$i>Fo0vB z`jP&VUNXmU@*lO8-#562Td&+MEP-tA9#9e961F#N@H$@!UZ$1hDg~jJ-Z%;JSVLOH zFVS#tk?wMVSkucr1vZSaHa~l0c6PBd78(5W_~FT-*>(Pi6cExI>Hi}+brhiEZLGB0 zc0%C@mM~m3n|gWjCI#i^JJ?k+V3L}|nYw#kGx)0@o3@m4b>)oskFuKWVmfkx`sCPt z!V|~E?Y0)<%`Wdl4zv;d_@Rd5dh?_yJLd?S(x#Nd zXez=h?6x^qCg`$QVPXJu&3ElDZ!eac(Q*gHb!7Usv1;2~v~pmfvzv_Pq&b5aAB4SD zvDU-@kJgd59#6WxM|_G8TrhyEaXHN`15ZDvX-cPU-leHmBGTS`ls>gsP$q2qb@EZ0 z5Ot$_`oePI#j?4etPx`c#{326$9Fv$Xv;O|@d58$v@{=i|r z(NaRq#e%Pp2;*HJmxt@@umY1_k0t#=8D;mj@l(R_SRCkhWc6X zx~Iem(XYxb^rkzeXh;8$^rUNL@inmXr0IV6bF|m|rYBT1B}g660&5LK(w}NGh1j-u zggDvIChYDI?AHt*jIt9qCRv7Ldp`E%b!IK424r&l@+GfjXxS6Jwv+7?4~V14BB6-O z-I#0crS-D-g5uz`!D!3?xFVs% zkIZ$LbZED`{~0{Gj%l9S{kBA{2{3-Z!Pzh;Qw6cW+o1v+Xt#Q!t=N=nUfVj5Nv(HIQn`Pwd|pXB4sFRwD*f9kti3y@_$yi*m*K z-`y@EoZUrmtQ~S}CC&tw)ZbR0Kym8{O#Kai6EkMsIknY1UiBr}vU_B{;*lunQG4+( zPn_sqKC%hZx(o)Im^e$kaQ|)sWFIPX=*N(u*@Q1W^d`&Kq3u>?n5;$)@@y187s=$% z44;fV+E#x#kH?RT<;2Z4MB%w2 zJLPNJHO0wDtJDksUxhh3Vm;JTQQ~d6|jO(2PJ0?ONfFA;C8 zbZDzXe8if~5;2StS%yD+h{n0qze32s^42e%D$&@)%UPJkBiCY1Dzvk#I4B^Z)PFG> zyG9kB7u`ti4kTaqk{46gHBjP6->3l?m#33o$fJkrMJpcn97<5`-hO18@ti&pe^I`k z(9buVRf(&6jU6OQXo>xZI=WdMqhtS|kmcsa-@~$``67qp-%g|oD1)Bo+3{DyT4ko5 zuiakarwc&n>OH8wBDyklY~uFKCp#NYlfbwva%z9B=`r|J2Bgw^#ET%E z;Vsm-npU=-qluLc&_3Nc`G=1eChXnJAUXXYv$Ev5?!~OB{5NXimchEe(WC4YF%s$G(QNl$AzQ-c6fuC5-_WfVRz}`x zKO&3fI@hbc?;(*N*7d$8UVApA?9sjFs+{fDzHB^={l2ib1~|9Q*Hf(2?#|dz&32=k zh#7`d^5WT|AY6%|YlZVI1VIZws0TR&?mf?bN~Um}Ky)s%U66EJ{YW581N(PEkB(EK z{zT&iXmUo%hd(*!piXLPsUowEC&Yw`9UNz#W*0NH+`#K0CTTf3?zJlI1$o^p^PGUH zNQmkw@*--3;K;5m|0D($F((8bl6H~-xe3StSgd!-->0Z$KiL}$;6&NTLPI;@ybW)C z=6(8?+rHywZ?89oY)d1)Tu7T2yk zzGnyrsx<*~(TP&Ocht0X%fj?q=K1mElVCvc37Drl#p;NXG!CM#Fx*(cQ}* zuE1$Y#xA3Mzoj1701Gu^-SB)VSEQPHPYAxt<8EybK4!7-0Ra^(vT^AH9fh`{5HKr) zg<{z+uq+OAu=;w$qB~BhgCx^NC>@+*>oRZ=Z!v>{w13&HR^n$63sZ7Gs~T%f&L-d9{6ko^`ep=VGGYZc|ZuXNb<% z$RW)Y6=fH?We;LCQ6UH=(`rq~7O-EJR<}E!i9{F*I0GR`KtE9?d7aGaLUiL&7(!F~ zZ?R^aDy~=Fr7JN*_EwEpM=X)UZL~f!B&4r#3L1cf2T_ z8W{MPfTfi8COMMSBGQdps#Md#L1bfXY>)H82|NV&XY!J$yQqclCEI%DLb_jMx+MwE zH8oJN`!xmVp%phiA|%6?4|nIzxDd25e-pH*+Zkuw_}L2d50JmNHx9D2Z||@aBP!)D z`O8|zDR7lvxCX&60bp%^DM`~G9QoS6)~?UsT>RAxkNCcvBoNCPQ}N z9Zcd1rQ{~e8feeHG1!9Y71~p= ze8~Z9gL$0--4mPjcHaJYn>uX2uWu@mQ#nuzZR}KXc0%cKjc#-LMF*zO0{q|%0*okU zU+q0C@4aR-)0$}e;}~+Z`e|a%M2_ICc@Qdo$?l31&1z$J(jp3&hW!V)k(B+gwe4cL zgBP1dx1^Q{l7@?w{2V0r&b4$pbR zVn9`}+V|Ny#9>AJ(E}z2d;44S$j0BZFKbJ$GKHutosOV3bCCsRr#p*s6K42L+Pqa^ zP$O)#`;5Ouy|QMI)9B7L_tZ09+4*=0S41Eyvgvz^0pi$v0h;dqYY|m=V{UwVAw|p8*^hVl<(CiX9*Wv5SjkC_qri8< zQh)E79m(7^E;$OhedmifcXE78V_$al%y3~K2{*WNy24%Wap$*rlapq?@%Qd6b{#3X z^w3X1EDngvXwx8xU&^c9J=w5&b9vj<@o>%2XuJ0_A~DkS3~wOB?0CW_t8g-z9%T7I z`*d4q+Wu_fX2%!#`K1rIVrT+kbS;mAd)l$O$|f*%l=U{7AEg-CM+5uoKMfTst8Wz; z#+%1ov4tr@L@94nHP6&U!+g^uMhOGbA^z`=G>3mxZhu3=GWNAsE1p&xLC6s%uE=lG z@@!JQTmXJw;X^yM`PO3>i`-#OuKNcdbk~2JFMBSNdI^hR^)Kel6r!7| zhNf+I>#IewOB6RqubvY*ynlOyuRii0;MDl--gJH?F+UeA-G*hHnq<|Y>BWK**DF1Q ze}Ib*6`~~SN)QV0w^m|NmOm&4e{%n;zY9B?sX6EW#-%#lo13jTC4_smtE~N9n4IzJ zIpIs!lV(wD7Qv=h*$0v*!20*v3b&i|@EvoCk`ME~z( zS|aL+=7osGWK`3+$(XJ7Jf!(s%GcGo=8EyGF@Mh|Yho5) z?98!MpE~l~i<5%MRh~2FdX#g3DAt5CSNs7q{DAxfs$v3lG^}r%rEn>DioM~^ioYAi zr9Q{jXx(8N`CfM{_3gPEo`MNtwWtHVh9;g*c2gC`uXmgN0^PYN2S)b3R@3!eR0GqA zznjq)?mpM(yxalD(Yw7P{iALvkiYFhB0l04dmoQ^Hhl4+@;}JO7yODut4Pc^B*WuEtTSv4YY!{N++=W z8gnnxE=@=8Oah)ZsDvs2q$J((j$%3n$?2V4N+`|?F={ZuhEx)E*o@uqSddV=?)jG7 zc5dGL2iwPY{hd*AOl0+JM9u0CdJk+-&=U2wYjGDCUa^tR;VSwtWQq zNShxKo|wE0iBuz}IGUT8BBire^U|Z|l+4_k>wK0^@#T6XTK4Fc7)*U@@aHXHc6wVW zUL`4IrP-9CY2i(OUddAWj4qcvp=quan7FN$fdLAcV`nb??Tm(vdZq+3Gayfszu&?8 zJB1jWRubR62pO0%CbNIKA*T>2!%+qBX4+xsTJEf7zNWNeh-5l|32B`R|!&DNTk=wtIQULzrl*`6ojx z)^1m|qsiCyX1gdz=tY5owx4ve>Rg)kwav%xwf6R>eQz@!X>KF1%VIb2m_T;Npr0v4 zFUs6DEIf4lO&S+2)<1k%5kAk#j=ozl%>4mS9`ol@9Czonu0Z4Fh}RXAV02|EPi9uh zwhU+3)H569%aqWok_HQ2QD&u~}GVW#a zneMeg>iSavR-xG;5^R5*yB?|X=H;@mEIlv)~rA7 z(|;2hW__%GS^NDy!iz()cTnoksAdxmQHUE>yk%O|%d)^O0^-biQAVcn(SS z!45XZmu1j2C~~F&E!bo4j=$T#w0ZuiAxen!);`NEOaaE>%EE5 zylmrH2S^F_y9IdV=GkA)iUiZPJR1co8Mev5B`zWFaB8E}>yI+E)sc>->g359$M(^+ zj!z~c*d>0DkXRc^3roDdKa0I9Ht3G#Ds~;tS%+SnC8+ep5ZF8iVDdv~lRj@~<5Pt} zmFEf;>}%aG^?XiHXql}c)6{DiHOkdEz7{>{O&Pyr=Y~vk+b-ml@sBhfw)`JBo4Z`*=YDpBOw$-CWs@ zj@~)}N~zB_H(ubbQv@fMnk0pi~>Q66dUmNn6+e3Od!q*Y9o3 zZ$$4OfCMZYk})RRsCia@#U*Ul7l4_2SUDKK?$+tsQ5uVa$UBtJ65UWjjvVjDAy|X7 z7$Yy+zLb^_8!)(pm94cE{zbd~yp8h3H^dLyG8EXBgxLjcW{0j`50{1O;*akg&3ASo z_5tUFID)=xAG=AN5({Emw=m@q-E2B?e2g9QNK=p%w4Z7Y2QRx z2H7N*PDPwEI2+h#Uiy&k=ZMd9VhQIRZFKuk?+umqhYl^~Y^-p-oPeZZy;v}UO;=QS z5gshlQ4^e`sv{ozu*N354Dkzp4J=EgZJQA%EQ2R`G~nDbCVf@hacH*TY?pZ~| z>v};R_f6Bd##hFGu4S=6{@9z8aQJB(=ORFs`hUmAM@q>siIBW;F@t_VVTicYV7+8K zF_%)OHpOwQsy1s=^Ue+s|HuGxL%xMBe^2I;i#;bX>v0o0HG>}rX-WuTU*@&N0csm9 zcaU6KD$`{RH0>84fMA;2d$fw_jb7f4fBystVf!_ z>K&FGKbi^?6b3bvUBP-vtg;gH$O&}LH?k03X^XuKrvmEgmg9keDcfK7zC5}4J0%=^ z^z9hAR7qE8Y;qC|9)GE_wF#9&EeeHp`|c=sH^UkLpveo4H3)$~O*BWIu}Q-d3Sem& z6e)d^h08(=;afb{Va;~YR7U*)$tP>;yra+J>*%n%J)v#Lr$T@-6DzB($~^Y0C~{2- z_fu+(HcQzPuIw#~FxS5#%NfvbkTv#EB;s%MVSL|b$amd?T|PTG*N&G~BHzQB;GPcL z7|sM!m6;az+tUfW1~^|eC4ZYX&a}7I;t#+ZN;1Mhyryc7K=2CVZc)kyo@kZyY4>R5 zRfHn@Mu;1!vZ*OxoXyMqZHXu#k3G46%m&o6&_+z5Zg{6MH}}qdkwzl8durc#jWHJt z%PVH}1L_vbLPB8RvDa+J*TGIQn1cdHWVTsS(Pa}xAWU7z?O^#yUL$?92eR=aDeia? z^QbmUNEU}moy#4cB$ipF9!yLu9Gz0&f6_4tz~)x@1(;M80+3g!3=ssiF)TFg&rajj zVoOPrdQMTbEHYq_>WV7thY_cZ?JYdKElX#ORKBZ8%^YigkriShnXSPmDR#jR)qLe& zxl8yc@p&kq*?%<5XVp#vV4|IcNMHiQbje^$A#94v2V}-|!5$oYvZ*=9Z}A|=A( z?raGyOmt-5`)=W2fjh%rKvj&X&0v~?M$Z$*Be|FZFrb6G8wP?{-UHL=w^R%HpR;eEI+_}*2=QNUK#$OFvxYO zX31sa{V%Ft2l9>|J-NS^lWM9nvsX=R{)tIdb}?S@o8F6(SMjgQ3DB9_<=bgn_;HUKl?L#0u#O9#Gr3yb#4_N?5nAP_<+o@He;k2Pco8z_4NjxjieOZM^S|Iq zThQc_uZ?TyW6!eOAXfIQvD2-gndP4vCrtwuow?SHWt{<>q#+h$`N@Lz>fXt3YZY4Pft~?&D_zs zuf2b|vhbC0xXh>vO~;Wq)QcGV>98qHv`009)_qVLP=>GKrH!e&=*n9V{~S4s0N}!q zSjRd}ihRLOtV4-Ka^1o{XW8jgq=V5)m^ZFp#%Cb|ULvLa)%2yQ0q2co)^(>mIkq6< ztel0PtBip8`}D_C5zhxrFrM2%aB?^KLPtYL%b@CH#kd>I!Q0y*&G^;!kBoYQYTT?H z0%GPI;kU?|N^n&GIBoTUN5csF@Y=+Co=DcS)2@?lvIr9jj{pu#t2G>&Ar!}jtWNGwe{0;uN@DLiav@e zRSvB6bH|v*smN*%ZB7)csQ80AP7hyJZd3mZH;%weh*c$mKy!psdl+sfw<;opxp zOQQg}<2L;U=by~|%sp0$;(O%SwDhszSJ6=K9sBR?_IwUF@A@H#p(;!}&uD~*EZW0C znmQMCxczhy_T7iQo~&X7GcnlOf}c=aEH^{(aoKqGu*x}of0NV0JEn5Q6cgGKSfs|c zWpm16WT6EbaMSARv)Ex1&&;xQ9XZx%KE0l? zGsm9E@$wv@rr+7AqxgFj$@mz5$f52Wp|C}6%%3ea zk}@jvdL41eZ^iLp1NKWm-LQxDhIGeu)3V1f>p zkZ0SU)1@rAesKTWHgaV|95A)4<--kgw9}hV@cnfI5sx{ZxCmqVm0Rn$(zNIgJy!NzFxDWJ(d&=tXjOQ6Rp=*AW(RXnbT1q8VsH)B0*iX>0)XQe8tJ}Dv&E{-tYYIW%|;*X&V*YsSafuf zGIG-PIh=4L_Pxuh2St223&`0g^~G0gC_=t5*-5c^H7*EN$9E<)6LMA2w4hN^nRD*# zD~AKp`PIiV`EPVkAH>g5bo>Waf5z+xM}^W|xNp&*sU|%pY8oBVO>kLyV7^(_*W5K5 z`5vbf7r4%JXyYH9H_>wwZ-U7`$(Ft$$9f-QZ;(#O{|=N@BbF_8du@$#^7kr3r3$Y* zHUzerQAuWSmPdB1xa2Q?xV~HSO{Z?sKx zf|A>KZHnDLz>B`jC>f8&QEz-`JNnr&-3jtx2Q$TkrQrM$cpB<1|;PF6KlsJkGq z>_|@$)vm2nlQ^%NrkmRs4JY}WmbH{@=1wUln@?W4%#c4>Vh(538&jiqqRCMMdRoDs zqJ)lIOyPOAa>~tZbniqUl{9L*j;^$Y?`%b;c0rmC$MH`rq)yybnWx1~QwXz+>1%mY zJetsTlZgD#*L-K~;vZ(C-;EC(229fNbHwNCo&k4EzG@nvFy$)}W0nOPM2bz=hk`LW zvFbKAxb2GaPG!v^6`G|`TpC2^QqasQOS5bOQyXF8f1wS>MpN?=8eLs2aUBj1nKs@L z_fP&TYez|fK3UT}iI9NaJej1~;o#CzA`0R~$6y(xKv5-*_N|7aOayYkG zvhE)L!FN@vN)yMvQj|mx`hEyRMb8+N{riZp?&X*UNkcn=sU;C+iRMmqXOnO=IqATyc_6 zH)Fxz9UQ9D3UyHL&N?Q!-&V*=bE4_h&P8oR>suN#pJG?54=3_+qAgvJo?i*pFM9l)Tswgt`$!<@x5Uu=o2pu z`}j+$3a;@A^0HI7l#teKE-q^Aa+*b$Q%D%99;M~VZqyEm{Vm19+`&A|$MrwnLP8XB zZ1e;gAAH7)JWTuEv_hV<VfW97jvhaMcEL_N=!2@S^S;+s)q6w1uSvfrsSgC2U(U}(`@Q3^ zSI+3b(6^1U-2@RNYu-%*O(M>*M~vVqW{e8XYrl+4!_AR}+(m6an3ma^3JB1Q=R~Gq zB-a?e|J20a)HGWeq@dKb95TeTopSZ~)e3gihb^Yn4sDGbl1`Fav(K%Hdk2&+9NxIj zr=Rm+RI}dcjkDt25yc}|Hw0hqIm~y?`$kyNv<+IP6wT8J+H*RfV zc*F`7Ao;A&b&xk*dBMeRIVf?~P% zOPiLr_i|L0vM#ZOq_8j8>U>c6kL3RPT6lc>|-`iAI*Sp zwiahzZJ_~8Ak2*vE>>unfcwb??$))h!wY2f=TE2-qe^WPN`0pYL4n4%{#&bk3j3Z) znBYuX)EB4<&8JT3i<3)Qa`bh{&RuDiE@7e;9_Z9C&gi(*1rWX;?4byLOPG+(W_Yqi zpM%o<=ac2I%9?(L?jFKHEOszubB(Dz{Vj2oVKyX`p~zAFAYhT=BHCCd^&QqahP_@o z(>11QbSLpCqw7p!Mf?m*@=sI6ozK>Y5B(LsTJsS=cP?{JZ<+GP;#*xk=bAm?uv(vV7d+dwVNxpB(j`)^LK#JR2 z7nno%HNw(a*c#5w z;U5%##-HLB8)$1)YP5^7G0h&gQ|aJe5}63l>F0V%=h_Dh-xU~I5UmGh_?fd%Jf}0J z`{@x%8)ybCHEC)qxfhbJaZc2tY{cSy*Shg|ly)xK7CV&1C5)IbUjPoTit`k;*vTIm zgt7CLCse3?d+j4L$H*%+75COmH7F=JU5|!t`TB8wXnze?`UfD*K7LW`=MN6o2+J!9 zaN)Ymd{<3KV~2F_@Y1GGenk{3zpDLLSXNns20AohUVoB~F*#A;1Q-TS>l493*f`=3HUWeGI zt+i#J_udS_y`Y%`ev3AsSmzWSr(yiC_DIvoAN(vjm-ZC5O7+{xd|X)z%rktYBmC7x=SV^qYLMdE2;Ii!qXO#TgbZL8+&fwCx-xIh5bP1py9NK}t-hMop)5t_oG<*d3AkY%o0c7jf=)NyREf5s&uehjJ%&#V zo%&vLKc93*|3OK8h+mGGeY-k?*m%Odvz3zHM5-m{-%nTCY7v5XqY`HiEes5AX!7M4 zCRQXoeq_<0?5);9k;%TN%OR-mmrLO=nvdt@AY7dj`i!DEsEk-V>XQ6V9ZoGVc#S-) z+id*JGL*oV+4=>UcK)(IVbWaK8H5C17U6cs>b0MPUg_K!zkM|~mEc5Rq0UmIdhErM z(?A*vGFrxbTkrk>{*v#ssgWD6P&x9DYjQ>{c5U(!(i1tc8}G9co)r9)A-EP?hX5V1 z>j#hq|4_Nxs%)oPyPJoZN{aYjHa0E7S^z6YglxWjm5+rD|LX3GQZ{=n?Z<>Ypoif!hyKVI$*3kU?}UD(#5vA9^CBE9nzLBI4>m}YE$j}IA+3+rko!{Kh~ z*$->7Vu`Ag@36axJWn=O0>Y{tBhHBC*DH^QFg~i@PDA%PdOl$vUMb*PDl-3pNKF6B z_vK}=GP`z?ObmdX?J#e5`*{%RlCNypM<3Dg9-49GWql=azOol?6*aW!Wp$bS=@k&_|BB7AMOklYOZj~D|A zws8$K76tci=@-RLJJIE4&1VyX?w%syH>~bU(7PwCmwk!m*wkOWGl25n3SM}@_hM7Id}A;ObVaJ&+otG zn%BI#Oi(7fxGMLu7*HQaUYn#C)dL`~(IM;aJs0a_@pv8?4e8TsxAV;XT;~eZC2wCYo@qmPYdm3``weZXHI}joVD&278(t)qTQXi zOfPnaS021l0rMDD^&_ zG9**ltJf@!J(^tLD`5b2y<2qqb~vQXK_2|Zh8hF2&HQUapR-+^NEIFxdw&_|)4sp? z>T%`hlP`f|F3OT5jq)9+Z5N|-^a3`dWvl)IR|WZ*Dny(hq|>T>F4DhqSLMTi3)|6E zi_MHCmALF9t7d4+NJ;*zpU7;P(aXq4Vv=^HnzFgwb+>s8#F`3gLKfe+k)$$ep|oV@ zc1wMZJ5=WEZerS+RnuD5U7_>ZyFNg>9t>rO{_$E}#mV%MBaM*Lx4n zb>ZRRum+!WsGJXb@nP%$RAtXb|)Hp;uR1#BSxRrGs+8s{p*-mRDH~SKCstPDIYq<&jW!MsND*Yee%{xTT zQ!S0I**dML0HS8U%G5BxEx)2TkwSms7ZXZBiJqsjsd|5>njI#W`aBM}du532A0YM$ z6P;ee@$oUstdfQk?Bn*2?p(je)wO(~QKd?l_Ftu_|5YvAGC?Qhl#{b-3TCVTxOiJJ z<@r!~iD6MWANTm2^YP>y}d0*pD5~&!Wh9 z4O+Q%mQnXXwzJJC=M?cOX<22h@M8Cu6MFGCX`|RPnso#hn9hl@oMn*=mYJ#spL}ix z{waKc-089p>AD1l^;;!SEqV2#etzz|Rq?P>TuQ3}GJx2*G?2%Zp)IhG^m253p~;&7 zZ633CZinzrRYk%g4g1LhB!8!ltjCX>Qqj7&&d!4C=$jso{s;!G`|OeSl^cd*d7bR3CpKa!iK!u_-aJol$Q-JDc_sQ>nST<@IN zgUW_F6K`3QE8<~s7M0q5uS232I!&wZNj@auI_5mod44Mgi(SIVVP&{J@fh#~Zg)9k zC7dubou~R9@ftd)63xVOs*VKM8lag=$|JBVYn`ftEw~}xD%{=*^-Na$8?QNzC!zbl zYU(TyUyTk z0(RK3^&87NV_4vfdhcrkN2obol;CIl` zQ65;Xh~hJ~)5(FqGC8aPN#Iy5hhq#~EWK4#EpG9JC*T{de*!ku6(Q&6KWl@ta7f98 z&xwOv+_V8y%G{H1pXn(%`J!wm%=XM(EW=3_>QB=n)- zhVE%v(Hm7)7Rw&_<}Gb}or&M~an|}M(hG_kgB<O-)D)~!m_&e82}#ZK_rrBYL=5}~5)PkFOtwoI$hD$!!y@jPP#ngTOu^Q8vU zE*Zc1o0Hz2`Rva`$EO>;P|Wg7zywnl$sc{mnG909tmWb@C=ARXV0UP`G&~Dw={3Ko zCYC{&{sKaZ?`e~CFF9$C^Lr=Gyq;~Hu=m7f7rhRf+#2x?UJ>KKL>UU8H8S|sq@SN1 zq-=hO)r|GI-H{8A6`GwU-M{LY!jK#2+%Or5CUQsyI#y-nv5)O`Ksf8E6cC0eXLZr} zfkct4G3rC=nYf6|oI3um98Ub{p&B`^eZFkELXup!RR=g5h2=j^2?Gnr-o%6b)!EjP zFt*{il3yR?beL&XgX=V6>R|Jk_xx-D-ZoZ~m4BQX`~I$gN_`04i%?f5C!Lh`?6wPP zP13_D!DK98VO6r&l=^-_Ws&o=VCMAkt4vcd{;b79$HR0qHiU7eN{Z~}%S8p^P&t%3 z^)owS-4cZ+KSsgD{{R#$?D=PQHiA<36wpVJMePmIPA1`T`Pz+u7EM(kVoXZkLTzl# zsN^#$f3)l#wGUM535S^ZS!7dLhg-wFf!GTR-6I8$?_O5?PeA-Liq&mFNk71Yjm=!S z3dE#X#Z|dd-GmI3gsaViE-%|~)Wy1!u9k2RFmX!Cw^IKBGO)0AXnz;Qrx-=nxdq`= z5Y-Q2SAnXb{s66FP156qz#Is`Q;8l#=)k~9>_)|Ha}u&ws(5wp9{|f^0BUZoa8DVI zs^fqPInjLm`QTXWpiPrXn21>7ItB3KmX5I1@M)3IJJWd}`1tq+HeLoe7j66vXQ#IjH`-$lyU)~4iKPea;*igO7@+iQ!z*k?Q5A*PncwVOvJJ@s)0*-yi!4&3j}G?* z$H#730~3avX9pX~xTNK_ryE-Zf>b?LtRR4|{4%65bjSr3D+tQt$6R|(tc*Y36e&F) z%s#1CK@$Y2HMaJ(SOAI3R?c%y!f6UVw=9Zn7{X341l^+n93M+GjT2%+#3v*YSN_Rq_0Res)a>H$Wpv_v#7Q$16 zCd`YF&f&}9omkj&0tUi2}=`O#kCh4s&9g0PG{7fsfG~b@9Hj8`7rg9fmKgt{ub&;x@R8lVC0UuVSpe!0M za1$Uzv5xnoMo4i8V~wchj8dB?Z>}nHi#sc%lmjJJd4U+8EU8vJQ6eQ{Y|_@Sz4%+M zE!jmslh$@__|lNugbK>g2hvxa%ThqbZ`U*H(wd>wQL^xRS^Ae-G6`Yrd~IA)?iBkd zuOo#C&m@h4zMA1Wg-tX_PdU~1jh1c^FoT5>b6hMu#6yt9ovE+Wi_$zX3tiH2YNR%c ziX^@7H+3KGssDIzJl2@jx zDSTO`T^4bDX9^?oe(Vw2jRkgfJqO@21Ohw-PLHqp-n<6`9Qc6w3QgWvr?XhnQCks%-IH#W zr%N~v06ZVFb1Lhzok5xHZB8rkOfn;=G#e``XjWtP9OwvfK_;1@Yd&e=GDzBW7f9<4RiywTQy9XIJ z3v8#rBeUC}y?!juv*-!$Zi8H%IzIr|`sc4%yx`MmI_;JH*oj|2R_KAaY2^x6$}*`189@P+B-<{@ zksx0IbM22mCV3lJ0yhvr2QeZu21b1c_Z@R-E!Y^GcK%)e0PE^l@w!SR5rEK@5g;m9 z?Ur!Clq#_&!Bxxb5HGpY^-I$T9qL5eNfQ)E-*oN}9TkZ#O6}!;u^+~V*DAfIqmfWm z)Knz$EV{TX@gY)@`i-!Fke-q$ATp9sgEIn(vh>u$wIqPUB+@R}Z$cdQOKb|UkQ@eG zNp`?eipuHJKs9O%f-8Ubx|~@1TH~1 z{I&qdQGhe?>(&W!+lVo1TWF9#K2t#gPsJvCLGRn5j{*X^5j#)Ee$34{BpNH8AV6Nx zgWs!T`gXCm8m$`Pg&Pqn70ULN0gS$X?ZV1a*G&q!VyZqC@z?(V?B|?G68BWuITy3B zE{tgES0!U;-J`>|xWSbev3<_q+v#j-{A#roySq?Kk(4eIu!VKp07(p5PYyzidf}b7 zA+rf&=iK*P#-hu8caH^;ni?9g=&Gtm^#(Kw%ovhJ=hW==4OQ?Lh7y>-N|h-p0Rshmxlk}dkPb;R1G0{~^fC}SdBbW=IgHI{x<);N zg=jA`Y!QkwxAO-M&FY0@S1O}FKc-jGc@j^lpI@3VRTrjQb|q3tW$e=!O14!Fz{W#m zRkj2b2P5b6K$)H3308Z_QRX`rmR8_>pfB+86g`IKX%LC+m$UIB&=sp^%HiiEH-YEdj#BLRv zfd(g;#K&59hM4}>*3{?Wvorqy(?wVH5&3oeuX?vz6L9{bLx}}L^(e6_(#I53?Ip@- z3T(|8B0^APZi?*8b|_+oeJzlGsW}I8V87vNq+BVH!z7V}E>%Hfz;5Dhsz;E(fr*jT zx^W)~>O{>*p1n<|iYkvA7j|cw79H1TQs6qPVORhe+E?4;E$L+0<(Gz(602sdXvx)q z#=AyA4p~7VL}l~@{{XQHPEBV|_Y?_c_^47X&JNW(MDyFWW<3u^6)Htqr#PzQ2?U8E zcqTql4{`3|+D5gK%7GDtzTO-o1!dV+9l;q=gXEmMSHQ6xIX ztfoleTG}ui6j>s6k&AcKw|*ueU&_o;i?y+*tE$)&liWf70DyggP;;>S<=1Ua0_2w2 z{{ZHU^*s)_#Pt;O!A~Hoff`k5Vvy8RNg}C8yWXr3z<=!Oid|!3z|X_#f7=@r`YBfg-&%S!t1FD~>v#<9zO4hyhuHdr42r4=Bt#If zAg(dN4zYvUW-7s)x-eC7t1t3uP74A7(Ln?fOPzMqpXqPaduJ{B@nPdJPfPw+fmYmX zb<}B6k5L63Rdm-YeN2#-d1>INimjrBiU^p%>9=vaq5UxwS8_ohQw5~sl^kL+Bj!x> z3HF2^_ALsEBqjYK#D5B!RfP8>62M8v9L#lS-E--by>aMYEa{acWjz&T>e*j!TA5=m zDW0+@r>3ZQimNnKwe<9#xK(if0JN3mOtfKND%|^`T~*;XF~>PKPdR-(cOR*#q@=I5 zS){$&>tdv-k_8JryiTQLkue6-Vr6xiP$YYN)|IO9Ei;h=>dhLIlw>pHmU!{tmDDQ{ z<8}OdKZPtem?V+sn%i%xlV4L+Nd&=>zyWub26k2Q2zCrMIVF^Vb5t$ICz?JS*-p(G(W7DwV~?)?$pcOot%tU_*COA_pME<~yQaXuietQpHbV z;{7bRS5ihNWtQo|xg^zE%Iziu)U&{d#$^G0WeR0hnHd-{6ulZV)V#gP zS}q04OsvKK0Eq}&f=8iq6By$~E~}H;Lcw$uPj@Ea#^!6Apk?|3|2M20mqq<3Nri-N1hNgiC2F^MCddFwv)->Clp+l6@H zevVS8h)@PIkxQp2y(>yvB9U>M{1L;HOIwoVNn#YuS>(S#&t#DoV>{s5K&nKcMKK`N+N+MC_^6SpPC~B zjuK^VE5=kYW=PGFgH=QS01>S?01`}%5`&QGzl73P^;M zS&I$zU=D|3aj{4HEv6~>ttcF;1|f@XSTVP78)Re|^f2O-AIl{>VygQVMmN?lIi6eULk^7P)Wr+H@s_Y7o zTpW~qPB_$#7sQOHOmaI|?QM`t$d3~(Ix}OzC5Cb^%ou7D{>|x|;Vr2sE7@8kkU@gP z9^jZflP4hc{7Yb~KeE6g42rTzEiEz@F(e%45#OxaN%zz2l(eF*ewmpmlR>xoJCdMP zQqml#s|*%Ij#VwP=(@?>0Tsu%zW9BTtf`@<{{W?lQfp;S)B}ccu_akyh@B-$y~|1z zfct^B<*?iQ(n>?c5esTf)mtX=Cul8S0-YN@vDnKi>cZK+rDQ%m8;zW_$#(GNln#*sO z`#W;98S@IZN{}(Q03gm=wg*|Wsr#$;R9Doi^tQ4ppz$-noGX}0%*1(8g0@MdRWA|~ zBjguE1~%pGB8ML`&U-=wJ|iVGOpNeE&e48fP?l}sFH zpwANG=tvkbSuL@+5UK@Dg(x{b6csxZ0~x^s!$rq{Q~s9Y_zk~o+h~G@7za=xDl)p~ zQWpz?g8+xu!&+tyOIj}y2s`tD1pGjlGusn0*9VB~CmL@cNb^jS>G*h#WQprEOZS7X z1*%p0ZtXNq>n$^J9#;{DMf8eLOyPs881;v^yGVsy!pKW|A9s55GDyw9DQRS!g-Ivk zT%HZ{7#l{9F?4(tXA%<5CBOnhvuS8i@h;Y8;yhVhm4Pc^w3$6yKFlcg01!?98+P)i zAmiSgXd)|dPBp5BY=4KK2f7+G)E0r63o3>F$0QYU$e?`q_+L#98lA1O?Nq=HB*K!# zfz0RY0|O=1@g0yLeZkR40RHe8mKoc$6AA=pJ;69RkE;8d*Jz5x{{T&5ku}7VL&P~a zQc4lKE6fNgn+$|d`!U!6p##bHKdu2&J&&Yv(TYrWa+kC+B*zRUVlHIVXdH2RP%ehly-hF|DUM#1+|4 zKI4J$PQVYi-P~~lti>Y&fYTOU z>aWTE;C22Kc^jrxajVBL6E6_u6EjB;2V(v6uZb1pDj1>d6>brvglAQdh9s9eV5uW; z1F4|t?-Of8d>}vsh!M;XB*2pd&UqyD3A|6Iu11|uFf2edRKyVicH{p5;^&M{S#+Q6 zk6xr7{_ShfQw+zBAAV4gk(S*Qr1?)rSJ(lS5(Wb&>|bsA^Bb{?rZ*DG!JXTO@`J2V z!s^Nf@q(nUaF!sb7%~#bBh*i8jmQCRE5_foCKEPl0gZ$BB_LK91#ln2oSzs!Jczi{ zVZYM+a7lo#rJ{*;)SZcTg?x}x)aPTd9$A>I=r)iPQnyesv?DPXh0X{Q5$XK<{?*x& zE2a`V6IoQACP$Xt{{ZGA9?{lcBl~IBSwsydO>WXL%Akvg@+L`D*_T&H!C3baBvLSG zP{|^wD9oT4MfPv4wG9;`be8YkX#!KlPsI5PJC9`%1y*A3k-DNrrJRLbRIoaBEymU2 z5^hc*ATRjc~gx4keAS{7Qi;;ps)PG}-uRV<#EjZU6T}fdt_{s!+@KVTK+6Q0( zVWR`EELl~U;351!ZtTAW5EWJ-NF<4wj#QEi$urMAEB&XnApZdFvVI{1)mVZTpWV#z zNyx+xY`#bKhpd?;I#+luf>^{-@g7AGGIpaXXHdkdl5?RE`ntGs!^oHWE!O!X1v*)N z5lDMxIQW+$RoYmB1qcL;5RlH2WcL`e1G0_u`5jfEQNwYrJCLfQTU`*=Sjw_G=^C*l zoZ|z+53Db`w%Gaq0OcRo+Kt$BkC1kowvoDV4oupNwMx+Rca8WYk^VGDsEn|>91DyIFS0&j_t`Cyk4a$scqSt39xf^>?Q=PQ{5~x%h6#-sG z1d)UX-^1rb)6X3X>6)G;q6`fxlg?zRN zM{uK4wymZ{zN0ItrJ+(7%%D=j8Kv4l0Arn$E+#2CT}bMrCNzBX-Jy=S+i|hQVnB7!gZ+U7u~CtX5d3-Z>aN*igLASRxl-d8AekubzNFnqK%OD*`0wg0IRl9 z)k+@a(T}xv*u-_68s;vBMZ=3tFqoVqT9Ea-IR;f`Si?MO+U%OLrma8Kl_>7HflB}b zENS>928_4>fU4}p$s`u@jHwuTU2FdU37#-AWDVImCXHS9X$O?JYyP$(>YWf4RWbTTp>;+Keg7g=QJb zQsr{=1Tq9|*}H@gH6O^pmIolN03ll>?p87hvZqC9Qm00U*-ni%3MM`k1?T2tKBp#0 zo`&@;PUBO#H#aJ(`&9r!#X^DrfXv6fV9yc`I;|hoE@2@x&aH>LrLmYbnsR$PsH5X^hxhkhALFRaYNV5-FfJAYb`Rl$6p;C^4 zMXD$ZR_3irQO?6rQArpgU0x#vHlFd-z5OxO_{G9VbC{@PD8@p`BSQ>mi=o3QEL=p2 z?mTKE4ZEp5t};3IP)ue`#g~wh6S}ODHM*(FqktK;bpYz>O88RoxnQFDM+7I2-7_vE zG*2Q%V^@w+A}_HzV|7FTqJX{&6359Rw`~01sf?i_m{~bS%MLXX8akJ7$XErBS9Lq; zfk6j3C+6}RJOSYVl46}u3F9=RddvkN{IL@q38MqzuMn0w{l)+?O0XW>ZU^ZA=dZtC zr|$G;hOt#ef(~sEl|e~+ZCf|}NPu{y;&$xYOHWRcP) z>Lpx>7)KDKkyKSEBs1+1?Wr4OgP~Azy2xS|ObRbGxI$$ZYgNTnmAq}?pZmIJCpyRj z7GMDI?ebXlz0qdsBxYqU-0G=}V1-axvaMB%uZBA^mjG->^6pReh}|(6=XD@5?Dopw zzCg(JTnrMSyc`p*xC#hwE0tOax1hvh$fRdDI~TvV{dzRGSgBM13G*5t0g~U>j-6{u zh$^N9u-+6GV2A;7%w+T+5W6l|;dW4?1d#IcC0RN_b(i+b8HOi?=YXM=jFnVsf~Uz- z3ZW&RO`>MhF>I-3Z3tSfQmNr%3!?yYq?<4{{uTKm4Wo%;z>282a)4WOr3nS}O8? z-`g?c1Md`b$FV=p-W-{dGw60~1sHE~;E%#F0}h5h*&A)-7CBr9G_AlHAkk$X)7Lvcme_J zVmOGL#OI|}x217K=+>qxQK*F-NR?$_8IJkqu`|zF=jdz8HvCu011W!>PO*l zs8BU$!8vIa{AGVE0Uw1R`m11)$3Ai_E%g^gP*F%x0D?gv!4vZ%J&H#-cj^ZXPTMfmxgDJVSjzw#xmp{+BVgod zBdQfw)O_aMcImN`1E27(QIi_-t0OQif)EC-+BXWr3`+t|H33OnEB^qLtSlJMDcwlG zc4+Vk1(=dB0_19^Ae?N?>;#L8h>Drt8}6h`-M0#iLopY+xySL4T3B#+%J zf`5wx5gxqp{+&Vp0NK1YH4;`&Gz9IDxA>xC4eEak4tF~zU%G0gUHXB-RyiBNZc}C` z?pe}L2i}H>K6!%s%6>vO_Dsa>lh{`tl3dkM8h(G zON~x_n+t7sotx63*#X!f)q|6=kmJh*3ylcbv5}GIKVrHUbyFnkg4(#0$+*y!PYa@M z?1LqVUpofK`S8{@u4qXZ_+Pk>P(RPhr7zjA2XktI1Ylar9y|HqPdR`-y>5km!t|-4 z-MW#$WPlfy9l33RMo1$e4SJ9ZyE`j@z^DiR0IKKz0Lm|F_RP3aiXG@MGH` zk`XJ$4~%+-{xS$=9)4ke{FLkhccqPTWH@qID8ngbR={;T0DP0@RwY@R=R1t>^66C0sYxmU|81saTyJhG_Q zVb}bm>;MlSP*I0z^zE^7OJmuX76;S%4S;Ot2ZK@qNTy6}h+s_OXS8}B&w_esKF(5B zbr&ab-4p;DU_e=@VY!k?8Q>V}ax#6M=$rw8>hDdLwq=q;{{UQZ&gQ?^sSk7qVH|tm zP?jI@b@A{seWd7dEUnf4n<0;O%5#1`QKJo`vXAlsd^<)JSnDa1(U=g&4{KLdQ6Uk_ z<&}#w%p(B@;n;=RAX`HX8!N7$5*z zFpt`WT6~O%kBbCgz`WLK9Y# zter7ki7^AtIOt5AAqxKhqkrj46}vjykw}tkNGut zke2dUa7gxGr$7cEjmCKZR+2#&F3;SN*l&_@!Ey*CiZ(C~2_67J4a1$7 zuq+4m8C;N6kAgOA44;mE*)fVDd&_^J{{UW)zh`v8{{Z`o0r39--~wPo$@6kfcu+mh zTXY|9zQ3W8H|uXq0F6}0SDNwNnGWi#&HMbQ5-zGqV!%h19n|gy{{ZEO_2ozn*3OzF zj!t9$09e?IBe+!zO4gwF39t=;jFlrE*pHgBa*iHX1ZA*Yq#%soh8_l6VBU-g!PJqE z6)I<7A`YY(69}Z`7^=7#0ZRf200LdGxn;1hHKF+92{?n=6 zBH2fpAmkXT zSUVE9{{VazMP*XTAC#YYzO=`--Erx&BNPX<$nBDTLjnUNyC5NQ9kf!qxFrb#6Q;67 z%9oH3s!jp+QH3~socfgi0AdJX?fs9>O>uI8Lld{0NTq_Z`5){6%Qjg0f*6t*fI|NO zYi=@V^BE0~PfoxY`gE52JGUT#sMQ3B6G2Qg36bUr0L})|Fn4x4TbJ)=)(uzx0Jn!v zU0668aynAD2_VWik)s4^V{w<-KvpzqSRe`i0L$0v;xvi>09^PBlKCnxu`b%9KJqd3 z(RD3?a>Rg)GIqt3R|!il%_5aSi7;3$Nh5C{g=4R#a>alFfXVo4#s2{AnneT2A&Zs-Uz*Gd_f(A+ssP58I2_Vkt9F7DC&;4`KN7<#Ki5it{qDUWi zLVIU-n+K0hF`l+(FX|ihM+0uRaeN$=5v|qHMit#z(t%WJhgmgTWk}3m;D(d+75biq z9QCVSTL^)$2>Hz@FW+kV;fMYRlSTYC9saebpGWVZyqCN6c@E z)nHD|voKwQ2G9j7lduQepaDSk4Y9$|l6OmT^k0)NhXaDAOvKn;I#Oc^4bB_**3JH%rm543aE$7(-QAE}h!Mx9u; z)OJyk%oeNjq@BjZq)P>|P4&WISbrmGJh5Drzv^%GA|Q^vR;6+>fl|lFGQ{dpS}|xP z*#qH3n#YjE+$s`r`wc{&xQ!xk8cktVauz+MV!Jew5~}JOFC!JxIE;ccJZGsfN!h5` z83>342OE|l0VFU0mMp}BqJrOnlA)ts2_T}VhWOGke$AO zQv>1y{aphozzW|ux9X4eJIjC6 zY1v75XO1FgfOp+mQ<8~R0;eb;aC_?~GhGN9{ z1O^^Q$t!!M;~+Y27&>Kpn!70q&4G~2{s<+MF%6??Rr_MFFhU&Xk&I&)A3vP-gtyuD znoOdJse?wD_Y3xB#8Cn0-a1CF)K{{X6&)aH3sK6P`I)I7&dGkW%nM}vYXKa~t& zq-_fS01`@0!Bb+9`mTLahDKq`FETr@SlKwO3`IRq{VC9l1Z#uCLkdl3Q`FdO#2dnMh|J5h9$QSpNX0TFIC7XZofjME?L% za%tI+YSjE%<=a+mPOJ(hlHf_?pd<2CK~X0ezgAzXu|~!3oT^|^Ol3ITOl83!GJ?~l z9hDR@VybdRJx(%#9a5-rfNlZ*0Biuh>`56J15!h00a=|}QpEC_vC3exC;@*8#Z(fk zfDoaJ0#4q<>#zXoNJs6u=V%nEC>)=NlkJlLPo#VFzx|!*EPgAi%)~=d5XL0`0K3RA zOdRL&7|yKa{at>q#u?+U=JMr~_ScS+;IvID&azbn_3kM}3;dA&>fY9|~BQ^#sU0D{&9smJ7gy4} zv1(Zo2odEN0wa_CI@L3NuisnZo;3ZhJb2hQ@->c$Ont({ZX~)ce1qd-fZ=s7?7%8N zSkJF8Dv0gfKy+PEm;5aTN(I@NxA}koM*=nS>{Wqe1Oz#2Yn+P~m8)1$QnRTH zVrshS;RMEHNknfPlsn!b-Ozy>yE=fxlN-JXI{3^$DD#zleMZjTIkb|h`T`Yz%XlV7 z&RKs9RH?uPo6q~U2Z&X5O8a)HRh~+ZiVRFo2Oiv!9Zt0HHit&4)~QOha)dCaTA(zG z4hte8Z(mhnQKulsOP*`aIX6(b71x&Y3(alv{dS&8s_UJ6=31HNnCQODTS($j+ln}V zju9Fn1XWO`oIcfXs-nBx;isBPJ7kvV>!poPZX;IGB`i~H0%B7H+M@X>8=R#W`mk5=r}e?MEG$#z7&bwY6l3QA&Sk z)~ZHXRz&hyeX;Dj78NSFsK!kT!U!9QV{K9=o=gCJ@<%-r*Q6-XrA~q>(?_?awA5`0 zNorF_Krl9-FgQE`6V#!T{j)O!KmwU*W<-hRD5cd_78{*UrbyW(kyAF+ zb>}@%bu1k5{!QB@fKrWYs?e5Ull*IveRL>1k{b)3qAd)ZQuo_TBs4QkFveM4YI0O6 z2-Ha;4DK1JNI@OA9-RC1U-djgSJV19 zXN_5wi;}oyR}UjL(rm~}p%JktWQZVgLBZSu{Ug6jxjUanx()5VoPO+uy#7Zfy)hUe zNYt?a6$Al-0rB(st9?6^)bVjoBJQ!$U#cTka8^B|s44)-Sc7S)D9Qk3F2Inj{U(1) zmk;!Bp~Mv-ZCAw_0;_?^ZskI$W*`M1V<3O+Ra_{>d`U^y!yX){U-y4~)~SReA-w8O zGx8=!xa(K&(=YA)VK)4Kanqh=eiEcac9JLL2VcuWu8hfh>S0g>N0rtpLZVG#St{jH zfv^PKp@H22Or8&{ZKueK(=y-d)&a&^hTy8jP7Wg=fRmQAXw#qg@0)XsW)SZa`0Dq5#QG%zV+@hOGnC4qW$<0y~ zsib;Ef}Ud(u*ynPOBArNdDVoDr3yrk0e33UN~Pc=ZXQj?9G~1&4IPKVOnZSQIv3XW zecJ{itrMOH?-2g2w0m~M^#>|olrSWvqK{Q&BTxZ%V!4wH!9W2(W@gT- z4w>#hf0FV<&jd=RqL9Jw8%kCT?=KiQkwoJP<~RZyMQAR z>Sr7eT#P`81FA`s=N zl2n_lw7WpUl9_4Vb(K*RBPzs>H`3mabqnm*5$Tr*tLD_5Jmg%u$;V}=o0DK?(iS+vZlJ{o5L7=7{`*-4Ob{!}+gO zy47#ymtIFp(;kM}`F|z9HIgbPS<(u?(=rk)30WXIDtp zzBcgv?F+k#7d4ull?qkv2ij zg|_9#DyS-@k-u!8yM@6Ui4~!WG=0n9T@~q1Q|?_h={*lThO>s&*IM~4Z!Wpo>uIZN zBT88*X0!gnijHVtRg!Zj?xR^GFB2lBtp5NkY&=I}e|t|)x1oHu6)o;-lU~-P8g#{- z$K5Vz)n|g0sa!=eflQJLu~WOGvSV?AClTxHJqHK%$58PchS^DEjmM_S6_qleGZ#6_ zI)(+n$o~Mq1K{$qFdSU$0zgZNB#x|aey8e4m+(FbOi||L13(Xx5llK zLBj&R#XtmtK1olkylBi0FdymUOOs?}rTlW?E#@y}0xy4@)#X{NhLcUg6` zBy|#*KW2?qt|K8_c=>H}SXx`wx~R1poeFJL){Qo;RH_ZlvXTPMK+e?!z&PmxXn`PP z56{>8^&R_RG+n!ite@3N_GBm5S1ddLLjpaHPxJt1lb{)6AXZmF+XR->kVy=xNB1RI z670h&#ee|a-x>N*^=FrL->Ll^vrX0Nx}K8p3(ez^EVoW4L~obM3ad<1RMraFsFoUf zI*2Y6JH5zIsi-hW(nCuex#N8OJ-Ry=HRE>bI?kZbS-B@f`iak>wO3bIE99mJ63bMI$nGTGKJf6bZ$_nCx=(p+M(*FtvbaU5MzynE zQy{Won$-<$rViK!7=`J;gsU(s3fo{Dl1Lcs5_#&9)mlZ)9~&~|#z{U7s9ys`%50$L z3`p^V^Te!5m0elTzN_pQ>{rtdIm&5&7x91;k`{`zV4`=s4rYn9K2Qojr;`f_Ee~YJTYtvQRsi2Xn;G1ns zk2_HDR+XmQ+*(|lk2>0o3eG9eW>#C8*7PYYDvVJoF?*Utwy{-GcQ9pT4f%Wch4{9T zagqVa`A^rXE^^w9)j>NFil7B=9zZ3(ATBmgqXj@y`41Zy+BPCH{JWNHGM3abtA#ja zY(}gB1diEO*koKM6Z-S@Ug7p8-_WjC)9$F)uAHixgZv}W^&^IIDrzYpw_fY6Q`g+A zlob$39mYC3dU{ByW-~%#?v(w#L=J1y>`k+z_P(WFEd3&~aw`uUu**H7u8)*msjn52 z-EGy?RMmBm)=|>Y#3|-jqG;lj7gi0kYBFb8YgF%Vs%gn>dq%xGDi_4pqfKdj-sRez zD0Qmx=A|mgRz4P_!eFa6%}qkggDg`7$UdYP!Q>c&9^zOgnn_u^o(zUVb>*CA^gf-UN$tRx zJa+5h1|#X$>=tFzI&A8E=gR`b90FU&CnPeH+Zg~H{Q9)-g2i@;awPu%$^QUi4m_%r zW>UVTP6lvaH*wT1f%FfC^jD`9^gTT31b5C`(jG5*xL&z;Re2?knXe+`G%!-tU3ljY zYUZZBr6pX(;S70(l4_NjmN;XAos=%>ezW~>o2yr!sWiP6ucVTPrccSE>*3@#hPr>9 zi;cy3d%Z;)Yh_y+)wlTdg<7Hy-3O+P5V|}d-|gm?(vH|;Q5IRMEX-B56XaO>%;WP*wZ`yX78 z6@#)If-(U){=@=)Nw@Mu%H-f-m5FRA)q^glP`Q7`NQ?{y8Tq8n0re~ERm+X^TElhe zuT1VK%sM?6Aii8%nQ}Tls$K6(X=;YJ@eVx=&N%LI$t*L>)2cN*Q%5X4lNuFfuYr9y z=!aFlwRG0kW8t*c?yK@!-Twao4=AgttA_Vm#yDqF>1@1`-CQNDS|_Tc<5y_qbcUKB zUWW=vc^XKxe$#X+u2rq|Iw5YU+B?;^q7e(Wpr*UBTs%-u*_RCD4dF@=O{BwhX%)n& zksyxTbLrT1L3%&&Y!)^#mjLBGUl_xAP%-SRr0!X@QG!TWW0l6Lk~j1SiI4(-xCaTg z6c7O*XJAyW!#XMDKTkRp&Hl!88cqY#N=h!4({$gI^WJG?wKY@4$!WOV;--exPf*iV z&eA>VwdiP;HIg3nGfG$&S(qB9LHawv{=`kfEryRT4 zY_#ih;Lxe55JyKtc7duSrKd|fYK}Eo)MzzRI#XOYNWKG#gC>I*|3N-MTAeLYOUjt!-_;b3u%WZtyon5&dr-yOg2}4sQ zG*EG_DwQ!=CCA+HrKLq(l@Y-ken=ny z0w`7oQVv3fDi8zeF4bvMsPxSu=#FW#D>4>P#R*bWm7S%Pim?Q#BRwIMt`9Q@*og1J z=e9cG8DZst45wj|x|Cx66f%}C1h*2!5+ zDrTjc?Dp$@O>`D)m7cav*Et;Jo6S-iR^ zYChE;iME3Sxq%~|lYx`K=jGq1#PCl{beK9wKw%r9$PBDilobU25A*}VvZ>VUKCLR$ z0VK~NsM{{ZRf%76sHAGLNXJ;n#=(O&*~42GQ8)^9ip$72rylx(y)wSpdZlIHynCoT zb*nA5s44DOq_szB?=v{9WKULI@Lk*@WZ55WTHFb)Tp1$K~; z#T7L`l3G^MElPl?&$6)cE=ki)adN$VTjKpLw(!1x7ag(l%MC1iIp}EGs%UBKHFmm< z<>j+Y1SrjPrrI&>RwM*csAMGT?fJ&UILW~0 z@8e$#ubcsejl7Us1Id%XQgfdrO8Hgn>{3vxAdzy28^{jihF}R*!mw<4@J4*#co6K3 zA80`oQ?q5{P{bhB(8d_60t@O`jD^Tiu-hdCS^y_J=Yl^h{{Yr~zUTuC#x$Z zJWWj~YNci*7!*d^te(2*zDp70mic)dY2+N|u9pv}T^oC?nkye!xNi>SeMuCSn++4y z)>7900Fu01%}P@&^g$@7>ZXpKl3Hk4R3bxBz8+O`&N0(2q4f)(y+GkNj+|Wo0O+4s ztsE-j4-~ATsS$9yjLS)5OT=ju3@YiXslYLNQYuc%6yaNQo!9ZoS^dp!wC76KRJAI` zl{)+W?kww9wzL&o&{d5_=GwIyEdZfV+iC(j>r|!)0G5%SAbcgK-vT4ljGnVUQ^UC> z9C0mGn(a&~B~+(MsyevMM9vT-P^7VjnY@Gun-`hra@u~1y*mGoa(#NRnc~NTD7rl{{UmUcXHv?+}@{#*2#Od zj!R0DTlghCjbW^$wo}B=*2wps?MS3G5zRJ{8RLmOd!f9)g?^zQ^^cIzar$1I@@{*| z#iH;2q2mrJiE|v!GJ7R z7$An%1f5js;OxL};9y)2>NyuJmyTI0YmYE{8uJU3QJz86-XqIx(-~u|lHS(a4TLSm zghdQ>AXL^!@l&IkOstYf9-v(pA(tuYaHrEHd>O1#aXy#~RODm^B>L=Ib{-33 z!uSL)jQP}s-xg8(8>7t=$g0#S8f?h0mS#{$$soFqAbwbqLgbQ#MA^uZ$^g%(AOOXD z1v$wo8^F#Oy5xYvhX13p5yDdte;~2b*7HFjtOc%A=@ZG?yvSD1H0G$e;a$8@; z$sYw!W0)vIPk7pS{c+P(p_Bm!<3rDF!he*&@AK;DeuFb73gmM!seP@v(V`Lv`v`#x zD0XIu<-u3VVfIV_TjOtPX&abzVS`B%uN>v3Z5vloZPje)v0|n@N{k>a8-;Z$LNdDF zr~M&r8Ontu%!REHNUF$;@&t{)a7ak>B{xDB246Tmil^o+;XrWNE!<-ByRU_E+c3qOiA1uAOM66 z9mrVY*DQ$9{{TrJ(ygTb0OU8(sHKm#)YSZfpF-kHDsl^pA>0$4k=3wp!#HJ93XkUD z^uiTO4ei5k8`!VLL@Y}XOT@Pg_HsTARoaa$;doUBf>rw07?MJKsUcN?zK^xGAbIB6bX?4tl~d~OoGOB z9}AFtN3Rwz>u08-uVYLrl6V;gJ>d5pe=jexB_ZaWRHkU8RF9fn%tJvMtg+oD!x0-{ zNloQg##0@($EK?e`fxz%Ek0RX%S~{MehTbhVgW}be4qZ7xg#o?k&Mj$0JJ@&>Q`4( zl}3JRdni~k$sjj3Nd$1xS^hRx~P`7*o^W2T`cwV$7y0+?_^1SWe@@`h-vU zc-IWgf=)5bI0dk>0L)s@?!5_bjk+ry=8 zPi!AO+!X#qKEXypu`J3}lm#0Nm}4#R>#3RM>4z()iZZydT$*Bb)zPTrD&>|%V<)L7 zxYtA|K+8iTF+$m|t?e@*3swmQRC;#`nAtp>4^4&%V#83m4EbANio1f|sp6h7Ras)V z!z^;TAuebt)EVAwBaSq74cslM3|Vuk1TpaN4S!B>4J)M)11)J;R3BWo^aOMm zXXSKM_WJ6pCC-BD4L#158rxl4(oYnNOZn>-6(rb_tg_`O;UK{rfO;=gP`avC&mDO~+g!H*wtIEni;L6J#=@@YZ=|k*rLT`ShAYMPnmc^WtpN0Md|Gn6o=Xh=%~8kAHDh=WMb zHn-tl`#fm6=9O!Is|r-D?r9~}ohpBMxR1P>cB(5WxT2(0r)O-Yokw*7lAu;i>T}I! z#+2+X+S1B{)$$7p?#>ZKNKz3#7bj^0afR#_dFlvNeYX1ra_T=z`mKHG1UFu3!8mp2 ziB(;nk6$QHEu^|q-6#@!y*;{;-%U=|_%4+z0k_8l2BX-X%x0V9Sm70YSl~TQ<2_Hc zboTXEc;dXCi$R-kp^~9@ewoRHaIjJ$6sKQ8lj1 zIyhT!#Tn2lBGj*q^#>c$%86b{YlHZuL6ry$lQ9Bd&#zh0i>#kyWb37`uC;tal-(}Y z-d#5?ps?Jn{GzXn(N81D^3hXLPa{iBNU+Lju>`QRXcQ8M1LN5L0BkzZOUoCS@h`0$ zCyHGw()kZLrnK;`MNv!6t(<@)mwQ(%rjnvh-B8t3BHRIu5~3QYfimJl9JZ0qzJUG8 z>BkAZ^WJIFEAJoT+-8DXmG19RapUrTjkm;4daiis?=np4va&WIj%hu~?U5OFf%9GJ zRnxg66lCqBnHwJGoQ#4&7$gsMCuItyKx+$M`!Ri=YNLIgviB=*Y?@#el&HN5cGStO zPS&zfx@uKIJw~jCpfxJ*h!*iisO0BckRc$q0O#Ev76co46x-(~ux z$!}dYr@3_I&C+fu(+jFzxK9AHam$^Dk3n?()irHheBb0{H5Vysq=pdh`-IjOA|{4O z3$p{&zNPXGv~>%U^&^qfQBmG`MZvC>)Yf<_4m*WW z3fj1|TKbb~tLgVArKY&hUn82Hf@<^zTV2hmYmwr4?KRbwr_ofb@>0&xcSr%tDb!1nxm9Hu!s?)YKKmH6`!W5OePLB^ zEUy;s#@^k4vcht+y-ys zpA~U5QH9BRi4~J*(O^y77}O73f>{_HmjE}GCjS7xPCkWOx!pfadU?d_?3`n%U2jX1 z*K=E~t~%)HK%=axv+=quV~VDVI@F+AO{0<++Pbop8~B43r0}POSH*XC7M1H8YYTf? zwe<^+DAoyY1Q2Pd1n(Qb%$=kTL|SW_#XTC(S7kLS)MAurjBjuOGSEVW86=OEM0E(b zuh~Da99OK}Q|mYV5RUV4>dmU1$!Op<-XF^#S8-=DQ)1-9t zq=71mRD#hBL27(1DYNZ;uPhk;H`W0wPfDi?_=n!ZWrG=}}x4vX-rZY|C1JwKwYxfLBG6w8C}hINwlDODxsB zMC7v2QFBh9Nl#B#NoL}&M@LouMhfamnrZ2(U$R_Oj?7ZLH7OI7KEXc7@BI6UzA0*| zMFc)|oxyk7v^<|J9`2n-dP_==n^KDTflzs@04iG^I@Xp{>9hneBnrfwmE;5<83HG9 z86rLO8Dqz3_E-&ZdbeQ=JS3NQD3jOYWtPWf$8U^lAf-H*?E>uZk~zyYmFK?rzsHU!}V^d>sQC~2ojzAtTy|0!Re`6jJv$nXc;eQlc>KetZiA1ui zX;CU&Sy`p^-;$Rm=AmCK(!8jRP%;*%0b%B&88&`Au5PWVYC3b!wy#lXHPTlODAjU{ zOMO2q7gM}t8*-?2+Ep4e@+ER(iJ3~GlM;<{vv~0N1hW&d!EYa*?Av>JC0X{{W?f?i z*`1Np1$9zgw*g4NBQf|)t1%1{{Dm;5j$w}U>`Q{n;k+sk0~Tg%V6asR6c9=FE@wq8 zR?b<}?iXdcE6qW1 zFHS$yHFZ2~ZNKTc>L8bmry;1Y#~Ma$@5!Z!Z;fn{2Uu2`O77&ySqXH=`6=tKzvsCv zu9EXLO{Q51|SsSQ)=H*u%ro(Qu(Ze!as;%|6ng0N5J<5tEr>3Q* zx>Uw0Af#y{+AjXbKF##IJt;g!H3qKi8j9Q6+Fe>(UIrB_c_i4>WFeTsp@0HJb6sDHn z=UktrZ^Wx;>=ksBv{cs`n?17fYo?G_ttCV)1C^?qxl=_QZ3PO-?*a#>pQTp}s^k48 z<9%5BMPccWU%K_hmzDIlrBiWBh1xSiUmVg{W8_?pJB2h>>bsgLiaJ>6%#BjA($lqV zL=sb&vT+-?2dlPz6$y%`B!j^8B*X)nVaa~#o;3VPD*1gSh4`%}5fIYHY5mFLG?j+B z8)2-c32^4tPc+Coz;=sue(1%xku3cFVW6pUDXP1V|MCS z`ET7>sH{_2{{Yjq)_N-~Rc$2GO?0^>(v~{Avrx$0x;W)j23Uhl+E?v<$3DsLuNKQp z*DhZE?&j{=*(zyPE*kEQrs}TM7Sf*T4MwBIP|CGwyV9i00iM5&_3LDJtESkp(=#bv z;XVM%v=ZC))Pj-#aI6fNBdm~B(@#`pt(ZE=yOLy;OFMbW;fjH=?m3rJu>|CtBq zN{Dq!xVv0~5PWp!wTD4t5m{d)_y(Jk@Ni1VM4r`t% zsi$6j#@2;8wNwJet1_&WRuQyh5ZHzX1k7MjUCXNf0C~9uUmdNy-@2JmTg7Y5b%Erk zG^t5n0z3&`!Z=}uqO~EKXk)Ic63v$W8IhPb#NCd&?e83(_dTAcsFun3Ep-*r`tjAv zo0WaCwo8Q#RYOZwNUNu=CZ?XD*$9vZ8!Do%usFx*kM*CESvs-Is6N^9`;Q9g4f@B! z`7OrT(RD}k12dtNFpvA}Jw_Nz&5N4^Oh6~RhxLibZ7kZn;ED*;O^{SE4)GchQ3#`EYv~ zAQAv?GOJ^7GQ-S36y$RQ*F9z*l-&O7^#Y#VY~`2!pkF8`u2i>*IPO>Kc$SvwZdpY= zdNH|EOtn(IIdjFsBu}^>v_D|Z?elb z2poRF4OWs?@>&>$T7x9(0cfexDyiBvcc-I2rYF{pwDa1B>DSrIuRiHx^qTwBDq4Om zVWE?&7JIdl@n)c(j`D6U^-?tywXoe@Yf>#WJxy(GG?Yn91Y&BN6ZTd1KV`D8zto|IUWxmboV#~!-%{dE(gT?D zFbT@UoX8|~i~dK^j;V1AQM~f533#_zi7~a_BublgGYLQqJxvSLK?~(uDJ+q1<5iUT zR<>CC10#3TxMtNz7%0lm7%a_zS2$vT6d`~Nerq4@Z`Xd6^a|_4xK99|t(O`OZ$oiT zS8eML0301>qy5}8G{VhIQ0n(6f&J^rJh0-9rW#WfL6m4S57izoOT)U2%ec%0&qc>M zP2SlONW{C*(AT^%vX)j%EMB?x{{UrEg6H7Jk9-4R;oUPx@dk~5b$O#|^{U%ZO+tdu zzN1=@Vhuq|ifvA)ro~%gFi;6!i1m5lUlrVIw-?qo*0gQztpe3Ywy5svWhQxy*M ztfhcuJC&rcAPlz=Q^yI2lORVb(y|4^5D8_CORy|XG}((|Y=f3R4d^X*E4@$n`z@lr z<6BVsLk$#C)k?7yR&C>rUA-3`>`sVSl16?J+^%&KcV~>oNkvL%#0ZL-1%@byLOdX7 z{{Z@?W-0*JKP@-wZyK`kj+ol&t+bI#$~lDcHO}oUO7$^N({`eYmYJU-Hm<9lcAQ4R zjC5#;Bx>>lLEwK1CyKRixjjaqMx8%CwN)FLDXXfGs&LGANCpImCJc3TuIjC%+5O>A z)MkGz7lFKqQq8y!q9urv69WbzZ68Vc<3H@GBI8`1XQrZt3TY*04@nGVRv4gptAw8bVmj8X9pm-TzD{OZH@L!I>c9-_x-;~Xkm?*id;Hwqc6ZMNP`S4RbH(rM)pnrZ9l zC8UX}RZ=ua%uPFm(4W$$qnz)g-52FN=bUw@a_+8PxkZK#^hXY-yz#z0Rbb?m7CL&{ z+_J#cwyRvR(?u+mcNT>RX}iWK;c%LLZvp+7+taFUHBC>;3@L<7I006iSE;_3scyox z5@=Ors2C!!ECZU7K!=QV)(igtbh6Ie2dYGKAxjBa1a1WSL}cTlucKXbtw^4$j`De? zW-fxN1ost;0kp)dnfXRHC+Ig^ zYSx_p0HW`A7mLd?C$UPSG>_X8+si;eQTsUJ51)L+rM>1N>-6&*3Z^1h|>OJ85AI(d1H#|5Sf zb+f0iDm6zSl9p1HFKS?M}k{ct^w+ z_Zp>^ov3QG?QbYi7WM74ZqW{$GopZ0YEI?ZxXfnvlnh6fk`mKag<0;NocVH{Je zae_9}Ee3lXut!?GM%sfhFHSp*u>OZ1-a5M9pprUqE>5tybdJu-;asyUvr|ThuCJ>x zXNkQ|x~xFxP#s%aa>Tr+tP(g3Uyt(8$~Ppemin^&&&;_B(Ty_hj6joi#BAk$pVC7~ z#5qH3z<-HlUcz8WBSQ&zh>}D6k;Ym?CuA#<%LyQcy4(X_`p1$29y!cFXNZMWj@w$v z8Uz4=5R4!ZjhS%3CzfADYBfLpp7 znc-N_;isEsQyQ*9BQbPiqDlQBe@YqEzM=8>!${w@RFzTQ` z=T#)A$ox=%cu&IpjXL_e5&r=D6pY7iao#X`)O<8Z@ea4dJqr^tm=u^~j`KMEG1v1K z`+-U*`p4F&6tc#g@01kGZ5s&1-d4+RsX`dC$hmEm#BTBc;6YBGNMhK83~H(dH7-)e|ruO{O$s>drx2_TH> zPm1~AtjW~7GA5`DvZ|d#XUr0XP=)^hrZ&SDW+Vm1ilgQ$q>^lGNirJRgJ5=QNM{52 zjGq3dSAo9watJamDyg4P-sz6Y7$PMr0Ay7kqW^kfJ%F!K)goZ>f{{RvZTy8@GPq4|!P&NU9Di|@RCF9ar zuGKc;lEo6#O4O1_q0*v}-)JR;&YQ49*_C6|DMnJLz^W$}7L4jzGJq6gu_4zaYRCQd zz`}wF84Hu-!l(@@%#2~xpoo|w*k>HietLaQ^bN>iAo_!!aWHt#x$4sXt8%+NPfzCK zQdHALaJ5})wv5yd+%$D=wUAUI5s?hBONiuP#4<1p3`J5+S5#8R1ZFzHApZdG$si|Q z+N&;)hb}Zy&PFq?4j8bcI|m}W@yf`n?A5gtO&n^y+G!B0M6HF6t{D$))+Pig4p=ED zM2ZP6OuuIOi%djm4K+e4W!g>S04_i{6X~-OJc7h9^giL2(;f-?Sn&0pg=42{UwO8> zv7=7geJgQRg=%zBR-HvE=AtlJRvTrSOy{h(TJT-H9jcJd715ZzwwBuNuGFuU6}o46Z7uq_@?_Qyld2DcLGxNRMeiW(?zE zS%LXyf2lv*-kx>$uYDQjT|DGf-2VW9a6TQy4P}O=E8iQVJen*0UDK1%GSo#&Qw2@Z zmYUU1HQtFPXwe`L)H_oJOqogcZ>fnc%SS+}sz5AH=NLJ|sb^3DBiWCFrEsi0H`%_Z zwoH_^_Cj(-j;F}L{FAX#c2HLhA!5Li3tnA)rG1`VU)pLFZ*L7-N*6Q{R>HJ0-Kryp zlrQio1q#$qH$GsJDk^wCURBvng&`yoO=S`cPJM_oBd{}=>r)+H{XqIX)IOMU-UDX( zpKapTenn=Q*+t3QtepFhJ%V{9M~b$d-&|6fzFJp$rfBL}AeH7OLP3=zsw&2TLVqDU zmGD@4ua-Gd+c&W;SQYYIV5*gBzCUHUtUQWZ6(v=G?1m#b1OvI%O5!vDLa1OD3`_hB zKFxJbS4hn@vt?W;5Vx=UA5usPScWlxe2}9hf|=Ss+Nasphf1X_Iq%Y)YP;$x+TB%c z#Zf~|YKICIAQ6MX$?2+|1=s6^W~D(~E&;3{=Ys$MO!7TCwSGCtE&N*bO@Fw`kz1^i zHOfaUU1nN9Dm!lF*Ha^+K)x_r^Rny(JaVhJyz>4@ccE_GC3WWKUjj1^5lvL=fGmf& z#IAMj3<3hLvX%I6$hy1L9$9ai-*~t+vfC+So(cpM@=k>%eI1yG)>RtgCuJ;r6;RE1 zd`7XuD#OtrGvA_#L$uyu_y3fgf6ry_qW%kpWZI1(zi-fT+~#hNrMvav?*pF zLa!aqN7Qvo6--g87I|Q+hq~-S;#kVEwtzQ}ILT%A%Yoqq*L^7Ky(a^#=$}8eREN0q z(~xnyopmHqFquEompXc?x=|g(KsI#X0vP<1@WQo}#LPcG$W^iqw+iWdZ=f z1Mmlmt$a19T^srhUr*GnzUg$d+ig@pN%IpQ6e~E|8A+TKAfAXkOQBTOEa@!+B1BA%{ch*1U#s6oIiC>w7sYtD80GfY<@`R~#(FaK)|)*vJbf=V zHnMdFYk{V_&bGr^YO1Q~e`dAoURD!Ul&sF^GV}Vq^p4L(9ajmmb7!q<$JgjCbQimA zx(ikFi*T+RRmJ*~Wvh-m?Pzgvr>v=`wbq3+6PPL@jZPjP?0-{f+y+_+ase|s zopo0Aafw-!GXyv}by8gBQbG8iX*!t7W024+N~jAM$-y7_0meyE6@klbxgXhq)EC4b zWlXdKR@HV=s%z|OHQBcmrkhxWAgrl!f#7ec45feoOW^+i5z{pQN-V7cMQUWQ1QJ1g zq!R*9EM$)7t;%%+^&R>j)=FNZ+xnA7*2*qBck7P_>i+;1xABV~9*(-;cyCU)j~k`6 z-RG>mNgWIow;MIe8CD8`B2gG;hQ5*J?JH}3{YgHpeVDAiTYk&fI-S8Rd`qp+b(^Kq zbmluf(xU5cq_$hE(eYkjYN{xbD}_Whs%hTuO&|&1nwC21WPw_v7KiOOQi>kjHunq` zGq9D0%D7J}AuIVP0V=^gJ;q2A7ulYu$sKJ;qP7*LjUHx`Ah9-BTB@j|}z zOLb{kK6M~KP&1L}Fb8~tFnZfB7X4#-drwLBKKpm$+=|o7`F~bz9J`}b^oa#ySvc&p zyi<(w8cU7hDx{8v;XfAROD#gvK{QphR~c#6X`${-^00qa-@3gs>;2=YoSUby)zNh7 z4vt!SW5MZfltR~4`-+>ST!QseEvcrEL*BmC++&9d45Bz{8z|@(IScmJsIoV0DJ?F^ zlIZcsUCLuD&crcNd@81@gKbrOI<=hlteoGeGen$*v@HY-?G>(_S~@7+Ms-F38M~zy z0UBRL)VAA_M=JQ|?B7JEsA@VAYFB!-eKzjG*50K$lNBob>T*B~qb}m~r<77~{%yy36p@#wwB6}yD&%GwMI4JHGBV()Wrf}~ z*BS=c{{ZuTH1thO2!eK%QzfG~SB$tNSY#2bV=7KEPNN`s_#rBcH8Sc^sg6`Zw1=gTYCw7s^xqqokruTJ8Ta7u5a!IngVM2v|T^c`!ps8g>- zr3a9eX_`((4%QH3us(-5_3HilQ`GJc4>I9=uaMi9m~iWVC*#+CLtuiXY2?4yXznz% zS1TgSCPayD7RYKS*_vf_E?I~IMO)DO2l}A>KkI}XXOn-?p0x3vdD6R89Gwxg&~r;2 zzoy(jlGvUq?mJgM9JI?%OEtP1oiz-1C{ms0s%@U3BrAs;{2v87q!8j@aU4tAqT>6-?pk7Z|+d0W@-gl8og+v<_KFm<20B>xD zDhBg)_LboMU+y;=t(L1s_SW6$f88p@HS+?kWd&=~+_luYx4<9EB};*hvoH29Rko>6 zTU=XIq-vU!&0WEOF&OfjDisuD?QI*s-xr`-+b7N58MQQ#7A+nvho z$nCX#G~@SL+hskn;mPcXm2F7^>NW0eg>{>* z{W9vE%j|F04i`hic+^}{yN}1fIkVW-u0A(&y|q!BL!mFix4+Vfq+zyaezXzI-EX7N7pW|ASiE)`ka?B!pbp%fxs9e zAe1`ggD}A?es-6QzRh;a+jxa4nto57hjnkdy#}{?K>q-I_-%ZWX?bb`fOmXNE+JI# zcZnIdEo(vmU7*xp01*I>E0AX-5@RQc-3Lkk09dY)Tj{z|{ZHeZuC{jNKVdl^S}nHQ zMY6ufSx?lv(B(X4hmOZncZyqtlozTCY*L!aYA@Qw3&|X^me9ftbQaHP z{{TFBw-3DaYX1PvsqWNK(_3S#=UkyK*1CH=WOoXW-Ni{o2&ZS3niEW-7!xsxS#pfs zdFvq8ThuL#x+KX4Uu>XN&=HnXs2EX`f&o7}P1jDd&qC`p?kW_i-9 zR$VT&w|VK-SjjB#B=JRzwylD=Sk^U%6*9=l+hDuO>_Jcjg+K_5%%pn-4BfrTxBKHe zFNq}Gq^PN^o~q$e?=@`I610*}GZoRD*qpY-&c&Mxk8MkQ<0V*-g#lfW8I?+9iD8oa zw}KAa203Qb0)e~?W5!-09wzY)sjjULx~=`f)Tcn5=A9~3snMhzpl))MgSim9%WWHW z^`+=~P|@_OEio!JVQWmIRbW0hcWRXg01d0X*dqKzPyktso}}m1o?CCRa!b{!uA(Yg zZ&dLbR+OqMuxMDu8Hm?z$yQwfc2K1TPPe7>H|%#1`pNcFroCzA)R%j&9pY_&n&m;q z;-a4IQrB)Tda_0+;jgQrr;zvSppsD~TtYaKNn>dl0=8mfsHlQvtfP_Osfdr;)CYAc z#G^4s&c#lEFf0L5e4}NHt!nGPRc!RhO9frNulD){lBHHzH43;<-BJ0#10j^C@XP`) z%`3ovX?hl$;hMe}@ddrew`IAcw-%^t8niBrPca^tC~37NXhsE#7$zVxi+Gp9mzVdc zs902{Y7mO_swLu>BOIu<~xBaek0p zxi8rMqjcw|eLd&(eBPSh4+6QT6@sW=>qOQovR*1;yS03Ah$DvI6--v!ag(zhJ|7VY z_6w`E3L{H}xHONWYXWyL0Y?5-QWOme;a3MM`0@vV*Y2*$@|dqQu(zNLu_CD{l^U}z z=L$wiRT`FWB$d9o@weG!!}-l(q*O{cGL{R zVQ1brJR9OPJ4H)BET9rA7zDDCxuqoMnBoADp0>TpKUV&T^)9~Y7g72v$SU}kT6#%f z;6Gw49CE(bYO5TZh1XV9@qSUj>u0X-&lMzhI=Tj@z6vU}r=ztza!8cT8PrOv)zS8s$toLpU$@+6o)=Nt9 z8hfL1o3~kdgD*F#l7%LwxKYJvdb;}IMHD4&4_E}ytg=+V=@hcY#WO?I4p7|7o$~HU zBX(lH@(Z2XmNk#q(%03z^ucv33p{RzVW4xf6bv;9%hx*RJf_?zZ`b3%co5l7_lW%UD;rO2n(IkVSZGxT1SV@+cPpBI)q{Uu-GhnOMn1n z)k|bE50+2$-=EM|aVtH(D#cpsOE6fLSi=@s(q)lLzF08@4luuj+!5lnOGPOJYFa>0 z1}*sq0iAFN$UqcjO2~m(ff@KJ&wajes)1Qyxjh`9sgEqeBEgihx@XuNt_jqQvY`92 z4fqemlsqY{o7BdZ+_*TfaT z9Z9rMU+6^#Q25^}=2ch3u*png(oWT`;Z;n3eJ5<3j+Jx$7vP?%6e zAOvlLxH-;NcBLk}DX|4=jGzccU}=d0Gn3%Gcp39;Q~<;M^BveK z03iWc4T4}#Z1uLQr|Vh6cojz%wtam1`)IQ9&-#ad>OVeCXtZ}5t##v*T?JiyoKfx1 zO-*LFMQxhnK^1)MR8j_|NTOJynPqQ2!hWxk^1hir3;NAx=iLjtT{@%5dG+4!Nysg& zHBAR9ilVZ<&kyV=P}8KBtAw??L{Vcg!pR_$xEC9X*S@WY*;e-u$Cq&$WMPRPh1pKn zR>G%%KrNk55Bl@f=?PKDqm5a^;b4pc5tx<)5UTHx7h&L_P^-6xZM<>zQ9|O4!s$A@ z)uU9nYLtz1tT#%vYBg^iYJ`>)mDKrRw(Z&nTwerh-b&N^#k&|?%w2&bjk10WkQj-M zekqnGtzFsw08#!&Yx?8UPL9&IJBOO_PPNr_XP0xTZe>?XQ_QLBE;Tm^>~*hB(N)a# z%~K(&ma?W;T*8ecQZ%|GMg2&=>v8V4axS@bp{)?OZ>O@v5rjyH--QHJ;OG zo~C-3;-`i~`+ID)llGDzrP3(7%Nb)p@%7uQ20`8A$iLq*M^1pYb^$6sx6kJp;p{XNMr{%JsUnzE@H%hed4yjh| z)ao}B7Ruhe8t$~JZ>vzyU}>t&Gz+-kv3vtCOb&>vstrWOXLs8K7F>b=*?`8oD`VM6 zBTSzs169u*f>~`7x}z_Cu?X$%HaVA}GKaypQX=%`UpjLSH zDJed8Lff6dEL|N>Z}*sE@)xY!0of=*djnEOp8BXve1HTL+`Ti!VC zy=R%QU3iZ-{zuk9s#|LjAJaGo_?yRZiseu=TDkOH{Vy-T9ty!`6t6>>Bp9ac1K9C_ zkEdA0rD*YYi6awI*W%+P(lZ^v-JZm8$4!UQ(cYuJt4S&pV>*8%33aCbw&UJ5sx3@vNCL#Rv^jcfKlfd82S9+{+G)C z0I=jpkmdgX)0NPqf!yLbvKfhUBw^T;QK?3a+kV*|BmRq@rD2L6tW`0_N~r1;)Rf7> zG2%QRlo@XUat0UFV*|&`f5lF%;cpB;Ahm5+nc$IeL`aO2w`}`^6Fq7k81p}G>qL-L zQnFAxiK3*8p6pwmIP4?&xc&H{5q*{W2NhGPk`8^#i|(NsLN9ei6$rpmP$~py)6SYI ztA!Q6!dNF#>m|Ps}fc34^&R1SY!ptn}cc}Ck|D>IYlbE#&&{{WG;0Ct}t0G{0Q?beg1uG{;tfBCA1>E@H$+c@o>qy;RjZ*@gXzLHj~ zikKJyS(!4vO0tuJ2q70z%AhaD8o^eOSt?Ys5JPVy5j>|1thgpm3lo)gl&Z32K`J9z z2yN**qWN4ElWy(Am;U4cuYgwoHlYHBL@R)D4y1ftaowk~)%Ij??MC(+&qB+cm%8qI4+XM?nBcqRckD1XKS4# zBLpO@q$;t%V8o0agh6D)fuNpB7~(NT1TJJ#84cWbU0uQ^?!C5^e;b{bV=0iZ1j%l7 zN@^o798&tmQ5H9f2aGWaJCaC?p_Is2u#89%3hmq^g5{}QD*1?^)nHUms@U~0oMKK# z)Q+j?y=!(QSd=F!Nh&4=2Vv>NXQ*cOK2HkFqS0~+shKeg0tS2>4_5yG-aPA&&ItjC z<4tAc21Jdlw+SSal@ZBHKIJuCP&%T-K^S1$u+uIH8n?-zEzW9K;#Q8DM-Z-F1gDvR z*uGt*5-5-}kK-!1Ost4S#sH@T5mVpQjAwf$Vaz_IeDvDzPhOF*Yn<}x71z8Za zcim8*gs~DLdrz+;ALp-A66T`_a06$KA|_6G`C}bJI*J>lB&?Ro*o$Wj)Y5^1xDKIJ zwU5Ysylhl^5CbRFrLKY~<(8JQVV@dE@k~}irxF5jf!iP*NjomCvEZmP8LJ>=frSma zc+T+x)atWqDJ;R1h=?e%60&*#n23Ua2Ktp&%DDs*P*SvTgpwtW5UCujh$fLE-!3F7 zK^YD~-P3$9_}YLm+qr|BWN>rqo-^#PJ|N)>;R2F6*I>p)kcd4hDq}L}0wxnzXZdrj18=Rp2%oo{m$&{DtPhxoh zsj|>S72TQ>44u@&WlI%hQL2DsOpU-_RZv;IR9Nhcv81+2b_@%vW@8JPdrYt9Ld1cP z79gQRDPYBN%UTT)F_334c>e$+_4N6!qvgc$$sAyIpO?ydhh@8=9p!QXP_Yp)SyUvW^5_|s-^tP!njF+iL@g~(g>!T)x$HhDt7yky9V_p zpsb2m#93S4U!OIha7US#obiG%Jp>T$6ehh)`XNI2ZpF7Q=4uuP~};`xCHYfMgQn9AjcUoD30+NZC3uZICgF>l}GN z%4$+YXLcAN0fI>s79-uaCk$O%BLuI}n&_2GRg{v(tB{K^F6CI@v#Sg$s0GTlz%f&? z%PPg4Krke8{Js1C08W-}(DOf(dVfFjoH1X%A{C5AP{yhk4B$RXw{eJVjtI_JdC3K^ zxpN9S(ffH-0|sY4Gnlfgs9gvlw!kh({ra*@sohgh;>9*71`6JX;g!zw{gGvp{okyri#at1y4{Q6qg zq}(@Y&&U|((Dt60y0R8|WK}=`8CAe4PRtmvZH9f9z!@ZYM#&(OR>sP}5<->pVV{siq785j7Y)24BS?^Ka@oNNq9(OOXvqmhh_vM;XKAxg;XFmdEF91Q+Q8v+~h-hT=2?mK-xUtX2DeMjax6K}dY z5b`>o00EF3DE1_52nQ_0DO{WoK^el0ZZfoNBMXKLu#osD0wR!Gt!0i!}p7@j3z=8>p1H9w62kX(RSG&rOh>1}fdiX+r3JNc# zNy*9ZNGu5R@Jn3hsMwIM!D9-6KoQ3oKlZ`^5kYcYv_@tp#!dljG>+^*13nP0jP9}! zSOvoV30#c{EHxu4R0A04DkIEtM(ZfaC1Y$IoCy7+K)4JP<6;Ipzn#7-WkC`Qp5lFn zKUmLP+@N#xALr@UETiB9xFj+E0C30EUmBC(3;<3BK}G>sAD*IlDdvhsjb}*R8KH3N z6o?L47#RbQ%7GZGh8Wi=f=I}1m1O$GFb-4#i0PJXM!*n8pn1y-56R2zgKBO$ajdA0 z3Tk;wvanA80Ogg=&mjUdO+f&$A;!!JWo)a+awZA&!Q+m3^c;UKljflOL@&&aiLMn< zTr27;Y3M1ft2?xbK}j5mM+gBuX~gr*BB;n?nONkp7)&bhRCSG{mM1Y(0wQd(Cc|vY z83Y&9l3N8qz+Aai_d~`nn=#42vv%($s1)dry-CZ81Mq&l>9QH;@5?E7N*-Z zS82qCm4u;XO~ZEKc;j}AvXO>48oH9LmL+LvP#M_3$c!|0^&Dh=WO@#pYRGUHbNQcc zkul4vjoG(w${ZgAgSGc{G%iOzw6UYTA1a(A?xqo^^b0u;@!jS0CGzzvih!1 zk=xD{OB{w*^(BEBWAmt40>%hd!sB(uSb#t~5=c|8p8%hHN2jm(kFQKDG}AO{6CjenZFfW zCkJnzWrAdpd%03ay2Od?S(qzpF0I0$A>-Fq^ zw*|t;AbZ4#?Fae)0A8bd(#-fN1hOL#i=<`sI3$dyIbtwd$p9R%3PPVE*esy%#Ip2u@h>~$VzrF+>zI(1d6UWn$@ALgS zj>~1Z<-hdvzDk^S*Jfk`@(ENcoD8`KBx(n;{4j>eb4?falF69Q_rb^^Kx8{)fOP}$ zhSfg200UkpC09Eo3_$moI2FWS&)}mlZWmOxJQY~{LBLZAt z;16~lMgtN&F5ewpG;_R&-Ut&i@%pfBG#6Ua0MsiQ%KK|apb;xZ&W0e4^p;CRk z{7|t_z!FYCJPhFb;$}16cRCbm0Ejs(Fn^GMMgo>OEK&8aw-8ts zh`~7R>D&9`fzvH_S0EJvdk)y+^8I>4TKEgmd7h#u)tQoAbd{MkB%f_d46Yabw>e_R z$zRDGB|R)O6p{9z0y$WM8RnHk11!Ze-fwJs4@JOK3PJhhW%AKuBMX4oAyE#i{ep~z z0AK>d;5HFLeD$|%E~&JNp#by=f>E#;mO@*@h91Q*04&4-B`8u-0;mH5KQHtBG1Eq+ zN5s$gJ%7ypR*m!-yIgyl5!sE!1gu!IKw4zp7{(RkF7)om;AnFp zVSFS2VpffCr;y_3Dl8VEr7dDL}j3T5b zg>W$%l`Z{(k7Bt}Nh)!VpU%VSGnA*~3UbZcN!9vFljy%Ym+In?jWL4ntKWVneNEMmF(A5W+_*s+_K*08qAe1doK4Q@`PvCz0r5`IzdG-~$_@ z+HuDtnH5*$es zt579JjzH+KtYajFEL80yCd3z9;~NFRa-nm4f>S08jzpQqr*rN{^Xjgm$7zyxM{YSd z$JF|JbfAKxe$_8+Y5WDt<-m85mPr9cJ;J9ls+20^;DF?p=Nu9VwrJ_+>@Y6Pg$uu^ zFR2aT2EkaJ%ixf}ufQoIcH`6yp)#{9fGaVS3}9rbAnUT013Hxivmb&XoppGm!Yisx zB&q^23?5K02wy=d1`u5Omh}m;@=B6D`2PSi(gq?sarEn$jy9-mv z?lTMvPlkMnnOR+Bj!a;M&<&(x-0t@o)Q4id#%2egiG$dHbL$`8I$-WRjwiR!{{S!N z+o48DC;iDFH)U9=lx1e^kV|B*gR2sR>5mFL4ZeEXKGLJPA(=@50A~Z($U__t>Zc)c zMi_+zgU%|c5U7`9ETn~IAONwcR_@@h@T&~DEX-BBBRdiBLbmd%xVHYth3liS;m^Xv8KwNNpOR68`HARX5V>d(0f z6cz_x?i7{606*kCI>`j&FkZ@zaKa!>a8(W;15200a@n>lGR zuiX5jXh>3AfW+h@XjGOZK7BGxD+C%U%uB1|{{W=`NXP+}Px$CqBL*#iqfDki-9@+l@J$eH4+p(S|3*!V9bLr$ZMw!MAq1A%=$%T)?AJN4Wdc?ux zQ`>j#N{9*6GOFY@42(b}$pB^45s!n(h(hp6l8F}tJaPh2*Cs@fS#{Op?`T+Tq!L^W zjD^@#GozJe!lEQ(7Iu^ejm(6G2L!VswnMImLdrr};$l4k_c8u=_3P!_c^RMVKcBB& zgkmpA$1z4Z% zs#LLOR`wVo5g<@w)SZ?l2#7NoP&Q&;`pAU&ECC@#VE>BpJjX(nlS0Q6zFR7H16_xpi+<-&q2q z0^l4ntE#REVg|Y}U&N{w+$^w^1=Zq+j^?b`T=>Zan6vB#a7iIt{Vd=>BvTwqfiA(7 zon+ki3}Ajp3KeiL#Fx%C`RKauq+m$#p%0i{OBc=vA$*K5P&Ut>CnV>sO-@MeIFDie ze-6;KI#WjDR-vU3YFXwmp=4hLRlPBQLj#@I9{{dM`N8OIFC_AQ&WwTK zfT!*EJAS1~fr3M*&#+OGpTdPRV0VdE-D3{LN;$|8gl`O2R8WoO$ioE-w1*%mk(uMd zLPUzn123`$)FDD!1%m*0Vi~dn7AQ#UDv0cReLvIaPj0>p#iVokW4Zo+%hRIvvDnnJ zJ-USV0^(s7rWcVEu);DaaHYX7omhewZ52xDIQ@t;g>7`s&RC5L2P##t5S0Xjjq+7W z4M*YGN|I_%opxpx`ZxMB(!6#AWTqw(-CAiBxiDqOaNjnL>rYlZXV z05Wr_I11h$=gMh<3<>ucJ^9bepXt+$<`6P-&Q5+)`ScU~RU~%L@v*}3P*nD&s-ZJ7 z(zL(^jI>3xE}Ib(YQ+g9a?E}f{{W_}(gLvCY4uO*{E}dT%u2=^Y!X4soj}wsr(!~p z-lI8JjTun6M_9m@9=RpS0FrfJRb7;2Se9Lb`a3#|FO5tZ)N}s;Pv_E6>H#A6oKIE z&9U;JGOh`gJ(Aj!q>V*LO1ESHzU1rzfzz&==&9T3ySEU_ge zDBOnrDrlo%$Xi!!7f=ayL<3(|7$I?SsqsaT?|Vc1L0eBnDCxXJsv+lU;;s`OY>4{{Xp;Bm!jw;|hx82RaZyRY2uPVv0#n z?oP|wBq>c*cv$2iM0+Q)ml}`l+ikqysPMoK#tz!&=f;dFU?2caGn{ktAJe3UEYJ)H z#EIkU{do82%CfEipl(l>ll|lYSZ7hO+f-r{E=Q^IMg~$5d}5y zZ-Q_9Ue#KKRkX6VAu8R}MsQq!c2YoB%y7Jd$`p_ZIf{*ATes2CJjH6&stHOcLY=ty z*pNc0I0gGPhS!1iZJXX4Ojm~3Yu3DjkVc!BYELZ{v1pITY z-3aPMQjhXCJ|||5Fp|7d8miZ2&y~Q`ld)B01;JL%OE3aWRb6W;T1PYL0xA@XAwWW? zs;G7ti_j<_Y=nCp$+%F=+YHF&K;`?a$`imuLd3BfV6J_FlDQqWV0S$?>~q4l%BK47 zQq-L6ET*L!S|y}!P?Tx;p-9Ae@;eY_K`wl0tJZKW>D$_`s6$ob8-6Dsc8nk*xns9LJ2_gJEt(*>uzS#OpK`rB3NhO*ajp_)ossv5XurmKRcIRtXk zPXx-cQ%e&gE5#-|Z?;?6i(0SQzknXKN;I_n)o7J9X{M)oYEu;y8fK!4jleJxvIgie zjv{}x9v})B-6;h`O|>`#7$*sm3{3hAcIrD%_3NlG{{SrocMraWVk3eJyw=L8Kx{dV zI{I@?&EtHnR*H({+cC1T6Or`ysGLG4my+=7{kD!Z4%Zc>{{Sg$%aY5RrMgP0Na6=p zCRdCBk0)FSSk*HwJ914BQp76DhGGYm0}8+>LLGfel0UH{2R6P{d!RCQt7b@;KJaeS zM#4e{j<~9cn!xPNgd7q*J)IuT5&uxIl8D(V>yDl@-=l3F}AF z^(q?8g)8e|Lb)pR+wsz>gsn<#1c?omZW&n))tC!7B1K)KDd*i0a;HWMD(nLj?XfC7 z2bTpvd^ecFMtgE+MJ@{f>${w<;|r+(E&~PhAgY+~7^0rJf+;<*oQ08NQW&7Z{xPqG zEKr|apTJf+7|T3mbw)`EI}{)B^zIxspyWBi<71V>0&ocWd_V!u@)Htzov^_t9+Qtx z>HRx(+{Xc(WRZg=T|I_f&I%UPYO$&xB!T>xB#=&{^q5~bW>#RPOepeMLbEx>NH`9F zF2JAo?0yFhRZ-oLGchR5tCFFWhU$QoI-hLg*o{C1up~&uV#JYwB4bcc1!JjV#oJb3 zRhLtbLICnGT@=ahC(;amJP&@9tg+Z1sO&$HoX^f^cExP0!X_*y! z8z4o|(RF1n8@V}P z+A`JbhS=eaNRMto9L)VgYxI@@H~EHWm5=O$fu`tIO2`sU-~@VUs z_V)6d~k>|lU7%}=gNfhsLP(+={sMFP7a(~Iu zCV?Xf`H`KQ%Muh81O-Oj2i2q+qNZ`&HNNf@?QAV@JqHWEO=_=t~b9b&Kb zou_&~)DP@ubg~(_mEnw?ksAowFe3&xEF4Nu1eCLeiIX3BL^$z85g1Y-_jZn)Hkp2%(9@9nqDPc@=7aK%^YP2FPPg<-~gxC zFW_v{Uu*$6)q#$I4d#uTY%G2!iCnQ_0)h_;f!$nv;ektay89mNRlK!#!b`$jX? zp{am13%D5bnDHEipQ#Zs$?8W;L|m4wL}pypN~o?7gCK>~JP@80l|uTANJA1l%2YOJ zT}k3d%#L8GFf$YS z_B~Kv8QUF?9mehtxF4sdL`7#IA&tRk?+=69bXjLQ7t0ILd;YPe}Vq5nj z8ZP1?DOWskO%PTBGGTm79I)In>T*uN1Y*iBOerqPsy3FA2R(8k7Mf2MWc?3l5+g2d#RfC_42I9y1HB}QfVhpi5w0*LH)S+Td1Ld0~^4_a}Kpc-6DN!zF zqGdiAnd0}3L*#$l8##=`Mlt^3&VYq!E~&UXW8o~P;uzXQ52zrI)($$9ZQTG22#};; z#zdUJ1oJR)-g-^`-A?}UG-^S1KCBc4WC&e@GZa(hMhPKMGL!&)B)OC!kyK%w9o3J! zWupqemXj-v&^nS1%2;7k$;Mtk=KaMieZ!zK$q87!v9lzSXh}uL8tQw8z&JlSRPp%f z;f&2uPr8<7Xlmj~Ss7FS`#UOO@s)6^xbRom!hGarg6O4)02Tsqj!*jjW2CjS5K5yM z5@AU(AWVS}Wctsi2cn5CC%Nyc5QqzQz%Ch?*%?Bx&#Qo{0mA?Q*Z>-N36Mz;X75Z= zBxOjD#=v^7Y?4fBg&8mi8Du~}$%5NzAc?0FZ2@M{V`Y^?$pn`%=?(XL#x%sJGlGDuonDQ$tjX6QfF#7mj(Llqbix9x0)q7w~;2t*QO~#9Rwy zu&I7Dp

1I%Pdj{>`bVH5jLEw~;^>XL3ran;k7IUg9+n!jG2w7&8DX5CuOnC5<^O zNLYg&-7fiO>D^ypo;ha`Z za}CDrYdo>&{{VA-xm_ovZ`{cnQ9w;7fn*`}HAST#F}hm6+s*EuYe{s|rRr50mE~HM zC}?#kC4%V`sJ)eDYl@(1m36tgbxLO0ZQ7utU8y3|>gZ7L^)pe8Q&9pHMFyxW{$MK5 zs0dFi5hRjJ4c+9L_4KdnrKh0huXNvNZWj(AQ+BQ6b~(pNFEPE#mr_twRQ~{kmX2Gj zcPe=q=^iGyRMW*v8mhSgN)c6zkQoGKN7-aJBfxD~?I9Q#XUY+=0N@1-93PUd>GrpY z)_q%}`so}tn3CPpyN5oDkq$*oE4x=v&jgm(t%$j&P3983;-*F22zANW#M!T$VPt6D z`(RjPV#zAqXoEp205my}5XU(PONM4b7`Ce0SAyvHqSl_aJWr|D)Ly2&sGT3qr>4?s zIvUph0NtRSGTzpmM|vl7n$*p3!1;^`3Mh3KwW;@Yw4>yOqMmt2sN3tZA*nuNIRRgI zU68O(Lybh5GD_i?6Wc~+5i$d~!m7w+0B0Uq2xTmEbSLOZq)8`Xkq}iO9x}>bDIANI z)Zjj#jA?)!lx)mcw~jM3f+W9L#DQKj6n6?)d&kdhS=v=n@+nj3rFBq>8Mb9GSYy>% z1`Z?y{{RE`0LWHAjIY|%sK^EX0N9YnD#YnV;0R!S27SLQM;_dDSX3w^ujV~HC$7e* zsgZ-@QRJ`ks6ntIOtEHQ2=oUT$<*xF^0MWT_E%l=qbZI(c0le~0uaO~MFBz~Il~;| zhSdnhG%=)09Dp;bt1&t5Z6HEHVjBU+vZkmX#=sGZ&Z!dPw#1njF^yfpK%|^(xycL( z8!KhpC_fxKKpVK8@_#JP>))L9^5!Gkk6-V{S2xoy(+<_tI({k_s`a+|-edLl)7DFD zvvK-$prE*3t}$C_c=XeoqVI2tT8L76iHXoWxr-CJfJVK^35N6qbQL5`F z0k-kR;gojvqWalQ&?xy0S1A3At0gVMD(YTU9xcI^c%`RZEz3~SJwYs$m`GwHIUnk^ z$GNOsDu<~23#Xjh{R_sgyn6dlUw?XP%jEZH?TFlp&0j}OD|mk(Q)q@|uA!2$M3Szo zQ zn0fMU>l8H$;e$;eRBDKni2SLPCbET;dPc1EVisM}hfjo1Oq%zb(qcWk( zj58)k2r}pwxDHB`Qsq#-06QrP$Gh({KHGiu;{O0;?A_7yRw9a6W22<)F^l%o=vy1pON&xvUoI?|HTQA&3vKa~G79pSx z>rr&1rpme1g*bK%GY{;_GwY8GNgq3{>x)&_JvE~L0Bou(T_IGdjyWYOl{iT?XD7j3 zR0ju9fJ1yRT5e!~Jw|?Bow7QpsZTlgj%0Dq>CvJ)JUMZa>{%PQ0obwCM$SqH^<%3D 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�DY=9-y8K41zF3j(WE1 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 literal 0 HcmV?d00001 diff --git a/tool/tilem-src/data/skins/ti83p.skn b/tool/tilem-src/data/skins/ti83p.skn new file mode 100644 index 0000000000000000000000000000000000000000..5c9752950565f4c26674c55518850aa814151319 GIT binary patch literal 285916 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

|edz88AWs&$=s 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%0AK$AS!LNxYm3=RrYKmrvZ|Q) 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éx6BDLLUxAim87ZxTQmedX{EtvZ$yqw6}w5R8zru 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

    !n{&u2LsxQ>>anmU6LfFvB<> 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 tRHOo>HcEjYjB%ZB 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�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%0Aq6Z~R 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 z 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 literal 0 HcmV?d00001 diff --git a/tool/tilem-src/data/skins/ti84p2.skn b/tool/tilem-src/data/skins/ti84p2.skn new file mode 100644 index 0000000000000000000000000000000000000000..59138055b53c122f1841c8c542c048487930b117 GIT binary patch literal 201136 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

  1. >6(3-Cie0-?Ui0 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�M4^MA?c4I3pZTlmREEEQ9 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 Bk{$p6 literal 0 HcmV?d00001 diff --git a/tool/tilem-src/data/skins/ti86.skn b/tool/tilem-src/data/skins/ti86.skn new file mode 100644 index 0000000000000000000000000000000000000000..3377aeb843c918dab7348f6f751eaae35cd1c0d1 GIT binary patch literal 127830 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≻E9 zrO~(N9o{^p<4P_c?W!=!p_(o->5p9f>Z)(3yrRPtEWmPNZxzrh6Uuh1TWPjml6ef2 zBTHc*Ee;`MojZkYOhaB09(5y9cHY+5#<7kV#d&v86#P?8EhLZ|c_!&UST056tLR6X zFE(tM=gLoi*fHaVIMjL%WssHWQn@DN`bFOObz@v3CzOc7__s1}i!}L6a%wZOHGD|* z4y!;PF4BKmNX<5@OqC@nL6<4GQ%O88dQMqSh6+HwaxQ&rbwtGQROLX2=BP<%0{f^1 zB(SRjMS^c}v{jS53L7f=3MZ9SvhT5j)`w!04Dwwd%Gg_7nR2WRur;2pTp(+h5 zhOV0}1A-&XRpbU|xRRfjl_Z{gdjSNVpYvH)20@=N*+s&3{CAFNcv$4O{&oF_9G0rj zLU2!1oibt!wWQ*@9$-+go+-xFn)8(~{K8uOL5XH)-z1unfhA4LxVDOefN4smyI9({ zb^SuZIDe;Xs>9Oxpo+#NrOeb?tow+N^`c$E@*G2HQ)zj6m7?lOY(O^zm<7(C zb6p1JMS?G}4_F_+h%M}e&4s7~OhWel1>VE!1}_pA=gKT{nrorm(N;Uc_!l!ObJ&+L zWw5&HICc3MN$RZ~GxW)YEp3%cPqCqDRJziGx<;g|Alv|9L#>=mlNh5A;mN$6n5VpD zaQY?j3$!VDhAE1k4lP8=H86Fw*-Dah*e3iANsXPz%-LiW3_4a5wxk=6yVvf9t!7%g zhU&km@ijH+S%mGSz(xE20Hk`0%5m|%8qv$>C!5s0hADOdK%0(tg6_8kiQWc>3jDf9 zuJ9LDCED@bSV&JKjw6`eS!#0gE#J?thwdKBY%Q3$LZ4Nm=9N}{azhegnQD5H!_rbn zLxaXpxGF<~ZourkgjscE&fDB9vS?M}3nYFv>vJ(hNkS@_YL+xnNuCVCH8 z&n9pterJs`h19i5p&1qEATNrIJBpC?I?BHiv| zTv%g?Yv?PqcWDV##=!c-ztKiH!Wny>P1kYFb-Hyi>^WJKa%Ir10mrHDw$e_JNYv>< zc(5u2+SiCZb(ye@3y}BKa~l|vX($O2TLZb(9XN8!23XELt(oPxRZ*Liopa?V53L4CrKlmrzb?{L?w_*I@eR~U zQ>dU4tAs1*3O;!M07PD#x4NCgQ>aRSZv(y*w53}goRm6Awva59pEb7v+uA;dAx*bJ zk3?P8Fdtsay6-3s>}yl!ubyGoq)dHzsU=PpC2VdDe8QCpt;YsdoXf z!4)I1BZ+06-$?mIpEl0=nwwZrGm8V?eg6Qzc5?*u+#)lJ2yu*;}39&et*FRgDhL zpJmxzC&iT|DFsPPsuESm9vDA|{G)jBX_ENy#R+9pYQDuI5{p@}@DGT}&U6p^*Wbm0u8%-qjZ-}^bs zy47^aAuF9t8kX$IVJarYVYHHvNH)Krg6d8y#yU}O6S(yEi?i@s>N1Pdd)cLp@zyP% zQ!uQq8)jyv%;e{XQJtA>GaoF(k_j5hoKXwd*c8SvhbLBC+l*}~Eq$mo91=zyn>$1DKvNeG-^^q$&*6C6d&| zUZpnmMdT>m-W8-@d8I4ERjjM=!7!I4EQEj(R26&L{{Y?LQj(OSXf0|` z^IWKHZh4DJwjC26OkFYNUsKqEVuOJt<(X*f${vQ2?DvBFO+7+WZ1x zp))GwE_vE>sQu$FEwxx|2qYVKJbx(kYo&ZMm)It?fiNygXBH2sP-(JH&(@`6syga* z%7e150_xC|*fz*s$R^+<_lgyq*jX4CH0t}0kgx-5rN47M;t@=#5b#q{6bx8W7H52Xo|Z7bLW zjz{I>^c&WZA)5i zNwDVD0xAruk`%&-0DRjd9&SUaF>m^UT9sa>7gJ!IKPE0n4?s@R80#l47g|URs})Njy<`NJRHBxR&f7Rq>BXV7@Ky0dkBB}P8P!I?wK}Y( zE5h|WNkpX@g>MDZDvEZcCoU2cvQQIc6oM`RL&F+Q#=DVAUnwke_*nl$C(8 zE|YYf>_~?=MIs|6+e|f?#W>ko)wnh{A9wmhan!XkpF4t;R$Q_bGb;K+Z;!MA?d#ef z=r%`(waNQHZEt^H`NI#Wl$P@1WNIf|!Y{SEEBZ!yXwfZ@%!Bq^&f< zgj{QJAd+C&7Rd;@cPZk~P9#RET1j91xzv~SbR8%epZt-aWz zr%3x>XNy5E%)X8mLA*#kHB|a>%<< zA3?lJi;T87wAG`z*4mn6PBz#>s8F(#urbyOoB;D--V@nbO+93d^$6{5{u)+SyaNqo zMJowau17YGT9S!SJ>#jLwR-@4402QnDixIqHS z*++6x1bqagk^w0r*!F`bXd>+q=T}Kmx>w9(qo3G{oxZ;+ zoqPQbtkrBeLS5UqNwtb>NcD)6EwSY`+mq`P7HVs24a_)$pbHHf`FG|ahXM%H4ail^ z`5v%kzIILrc+R{nk7Tl+8BNt|Z9KX~UReS6T5nNdSI45SLmvG$6cK-mp zA>I2QgtY_uouyvoLdMqg<~92rg;t`5=xuRf=2!JT-<&dt;&ip*X<@*nDA-yb8E=PQ zrc%5~rj&&|;Zf9^5I7%5RF%QlZcWt8%hK9GNf$QNZ^w?%t0gG5)Sn3nwd|CQtpXEl zI3+Cvy0i;k`h7<`#J7_p5figb zt!o4W<xXt)X`;6;xi$lT!_q60in3a=ZCvcHj#kv%xFG1+ z&~3H1-{~Fl(=yFBsZ)&Ky_TLo7_PM(13N^SOqD`Pc2)3y!F6sSeEJ>4X`C}rRO+M{ z6UJmKKw-7HtSi$`H;LrC8;zplWcGDq9F)bfxaTjiDkLhBt+^U<>OyXU6 z^n|d|Rdajxwf)3Hs;bu0Wj9})2IQ!jwHx2+ec>K%UCHU;JyMul!>Ri!ebS;kUwDZ= zNKwa5&RPVMl9GsR;iX4^y#D~_3oo)Al69LTrPh{$qu8k=e^}%3180Cot)S&NbONOd z5O(!2llU}uMV`V~mW`PGIN=$ZT}cj3(JB7`tE#ePS9OOHPa~TfTpvOq0Vz?t3MXPh z$>bg)0+FrF(Pj+QGNSyF-vKVIhl)HvIMfEpwfo)=na0??(_@Kd`RwQXqPt`$(<~J| zX+y-MT|;Z9)7R-1X8`<4^TP+>Dpnk-(6G&VYY)k$T8CV(Q4;+9J*1~fLvCChk_Cz1 zVY!btQH*hViC67p{^QH0V%PNAHTw4u2Fm{cYN}yFYl*v9_Aui&9)#g#xy6{qx0o1~ za~NV;x~FP23AId3%)G0Y98n~aex^0^EK9EL%ru2|y0;_x#X4PHyjE|CY9ybv{_y}* z#bLv(c#5P?shcpIt!!#EOnpyd`a?7qX-qtqW+p&srqH0FV0q`#Au1%GVWc5RxdO!d zz*kGvGA5pV$5+O;R#ZfGG2sLd2?_onKb$8|qSaQ8hukbmEo>s|Y=;{bMOfOSQj5$eWUG~(wEr(kgN)|Z;4{qN`s;hB200!dxm?aYPQgbSrrO!;s ztzT_&uapJ-M|erm4k@(RV?TD3Ee))Mk*Of6_Zw}0%J6M2Vs4u{#YUGhrk|E^F0kuL zvXJ6;3KrmlV}8+F*HFbFK_eDawj2qQv<2$+CuKmV6;G7}?n}UvbH^M-dW}5}w`ZZ) ztKv`9mMqKlsh1vkM|HZp zn3YKskaaz;4FCd23GLbm#0(YFRPebWK>fh;9gP&Wnbj29E*Z2V-umuXT5f%QpAxY*y=!$EV2QhdwgZ?^^vnV`z8UM#xS z*gKR1x97wXstMg@al!WpR@)9b2y$T|M#Nb9z!vp|we5I4R6;frs^e=Tm;$KoBXcxI zwV(?}E6y!k?SDfBt8V?b_Kx#QU4^EJJ%K=sO)pTecIW6J4RjF7HOdBcd5eO;$9fP_ zEq(0)Wa-=aH)lTggO zU5FBpwa8&&mK*U(G%eTKN}RYiBsZ*D$8`g>u08K*N>gc4(WOKSruVV*iJQ6{dK!H| zqs7QPbl>@~WmJFmo3Zj;jeIm`-9czhol^vz`QLkSX!_RAM1|yjG(r9>BU2pz0QIA> z@>Q5#6Iu5<%E1W}XJn+_-+uAa;x%>kGR;X__!P58Qn0J*B{o>OJ-s&kVjTd(Ks>*E z1w308*jyiLf8`SHW~FMv&jdI~@Q4=dVjOv;1nFAG8=Y3#&}RLsL57|*NS!R!Xp}Cb za3ymQRb}KU@>s4#`N`?Egtso*UqY0%6R-l;C)zGn2I|8kE0uge{Z^>mE=rS`^ttJj zPFI&c-BFVB?51X24lDO)Y0nAuC9z`I0o6Th|+dtAiZVS*W+HmC3#|jqXGk@i?`$tEa$aUNZ6gMPkVnzvi|@I3CT%rtGs0_HsHbakt`DG5bKV7 zvC@W=y^`VJeNVhrWstI;1d<5nO^Fut>?4MyiDa<$mtLMzZWDIU$vV#ct+@Kf9!RXX zoG-I@$wk@fo;Si6b1*AeZJPPzI=VYqclzeBU6IAJl9M$j+iWrNs&UC*D%$yik0?#Z zNgS9?qtaz+8NXHPuO(&Wv0FIX1cqlOaFp6*s?F4xm~E-2q!9WQcLk8OB|#@b?l0fU z`HaneYUR~VtSF5^ci;2&fl20NPC%i`e8oYPAw;%YNlucXVnvT6M;GW%{{V0L?A7F7 z2d^~xPCCP>%qqPSv5G1@)#Z%IzYCah_UAJ8?l=hpuFSFRqDaVKn|=r z;8Mk`0XMp=Hu^$!M-tSklLh&?d8ZsZDQ=*WeJ)SZHpS!14(`m{lhqTi!@S{{?yYd` zI}yvuILzdgT3TJH*20@|Wy)mI8A%G-<;5fm{{RsXy_s26Udm2^lSItC4!Ry7oXywW zlxm?WmgZcPO*y1$7xQ?2B3uLbZg1QetupmGq@#$Nr^`&V;vCeM5P}L%s3U{!Ab7Jf z@rEjzLUEoWsZTn}G&H)L(%e!-hRN1VhToKWxbxu0<2cD&w_h9iIj4eB&B;A$`Cs=6 za_L5(njLlEv7jmqx3xSE9?#1xmd-(pC}UAzm7YQ5w@_Zg-1sl~sCHKcMHHBb&?03scx* zA4t(C(-aJ)r`4U7ltZ(?Au@VUmkNSTrwV}}B$9N29&O8FcW|vms;xG#?4?9JkQ!FFA&OIgX;M`Wt)p@tbu zjO3FmE>Y}ARnxMycz~O#BdVr0I4`9P&9BYmep@?O%iP76!jccG1xU=cnQK0U-Nza# zeOE$k;;y?`oz3E+Q98@&8iiJ<)+t>;V##^Buu5ukBE2$KHKhRwD#Eu?_dS( z4P|D{adbKCH10B}e1%GN6IBT>n{&dMeF0isaTl`IH7d#=pD~Q1;yZ1>kLouiT1O-9 zrRUb-TS5wzdnGmi`+7vp(3AL1v7FOcOO1mGk<1)9JBE`nFodW}Ow1%IS=8#`VqvC2 zNZb{B#1yLBfi^_aYodI$X=_{OB@fmm`GaKiUOb7F0iG>mCvlGU}w6l5ujLA>5@*yz=z=rv8yk zP?V5dE7)-ktS8hqXyuHBI+28PHmgZulTmu3OqZ0MQWGmS>s||wAP=&&HUbImk!a)3 zig{p^T~o7I(r2Vf>4&8{1pLiQ4rQJcdP8q!nqHrc-(xq^w3u>)6{Wh6|tGH_k%~BhcpIoHV?IkQt65@PUT0=`v z*U-YiGt@Hztf5ofV3Bkf*;RCK#DNx|e!m<{W5TA1a>x;r{@Ocq<4-PmK}eXDQr9l%wXCMp;>u5LMmZOQm1$4>yENwyWKDg0blsI% z9n&URv4pV0GWd#0r#VZ;byP1?vyuHR)I68wgzcl@zv#YU5Y>8phEg4xoqgvf7F|#PsH8Z6o8HN=?GR%aqPWEy z_I--P=g54|%qmGQufY#nPl=-Xb=z%Ly|%n+t%@pmlBTMiezN@Z)0XijCSNW%q6LPf zD3WXdA9Q;;yx$)uh_Ocu30jqJF}KzZ zP0D~9?a2DZme!MTUe)R&pT=0Jx#iAM@w=0>`K&_E zim@)`8hr^YHd2rQO8HV$4S~Ehu?jM3TcbBI>pdi4mhm%~<@^#!esAVlbrkd|GieET zNtg~D(_-0C**nB3mz{C-C6jmwytBcXvo#|}mkya3MYPk3lMWK4_zPM}*#$(B5J0&n zlMOmAQdyTnpvqyYW;}VhDt;-!ObFEl@OI7@S>Y;LXZgc71zdV>n%%c`SNo&G577o)BlZ3#?dDq<^nVTowYI8d3)KRUve1@wimwBFtMkCDvRapwAk zoz$_Y&4n#jzNHR-IQs9!=?lVDR2~g7U?2YgMyUA>&Y)T94s|xtl+0|KZ)^JfV}Ba# z%QaA^j@|i;Ht2B{DQN6F9k>2*4mLbTLLDGlz+U?pm$Acb{?0z@YEdd^k`F)mZxItg zOMA?1Vc2nK(>sqMaU`I3Wc~)DV|-~{uVM)#O|wl)Qu1v%x>0oA_WWbN9pPF74K)Vr=16v}L;5ZOp^Nd#&_6g$Qa7L^T2rrRowLl4WLN5hm&``Iv=Genmlr4p%9 zg}2cjrQ<3dSV(4eN#f}&jmf-YhqDh9y@lp61se-3nOU|~IVdc-2au5~G|E;$btPKD z)DIi7G3(hIg=rbv)J(TY8F^KIF0&o15kbSvP|7K?vdeyauBAA_RcBpNSZ$=N=>Ww% za`y$1_eYy^G`5lD@De%gu!Py!aM%SY`@rHarhIg(k@>yUenBdcD8EkW`K04#1|ThXN<_NP{+OSiB9{bEJPZl7?Z?ouN>^DHW2Vy`;l zX;OsjP>YM$o(Ug-5gE4CN*mt6)@IVNa9(MO`u?e%}i)61|?*I)KCVavOzYmzqEDAVB9jd zKl(W*Z2$q_r~B;}7vW!;IC8Cs6_fPrsG-YLg$i}~yi(E>XXelp2x&x{X|k=iWbYM1 zX-k%=y4zR#WNB9RA3<>CHDSw50)i0ziaZG^;SC?SDDj({l=Sg{V;`?7#a3 z54FFi-wC}Ndy^(gbjODdRWX}6lHqYxaHUh_(tN~vpH4yV3SaEcE);C}J%Ptyh{_Ie75qpE?^!nU=#v3x~XOxgt@7w$Sko5Fp9#3rLnaixdo|a*U zXz3|sHfcKcN_ivKo$Y^E5z0)leWZn9hDQGYX-+EV*Ssn)^pOB5AZbn2zvF1Sy*TDh zT48({m$^;T#!OK$#w)~W)tGKpF!zq?6sG|265{qtNJ5XCc}AP}F{E*+3AY`Tah#XR zqq~@74oYm|t>`)Wz}U!4uzeZ@1GT(Bz5f7|SPr~!E?Q-mRG5S znM#CK4-&o)Dv;U+d0P%2f=r+7ISBLJsKP7`GW z8!MaY{A1IMn8Udh)FjPs4q)z@u*drkqf_0KZxz2x4b}c>3?Y6fDJA0Pn&->ChUak} za#q@6omH8WmQt3Mol--K8>n92j9l@xLXJ*ugp^=R3#4kpj5ZW33t)l=;}HIQ<)tqO zrL0wll2F>6(=yVO4wJpVlulv5l?5OY2)5htV1JZH9Ydii!0(Idv#2|p`u_mRGHTtG z7VL^7U1`SBqD8C?{^-?p)k{b%_D`5tB>IwV9Mq)`4Iw;)jo|8vi-~RH_zAP^E+eq!N+`t&Chu>-cr!+DF49DJHP@N;S0Rki}KQ zi;RvKeARwYQw#ZIOr;1bDGh`aY8wN$CIzxwmC-l=TRf2;*mxf5$oDL$8O z6|uep#`$ZA9>SRa00`7*l}T`t{W`58yuw|K= zL#c2&9A$eOLZL`n1@{NNp*e0TRMj@FHD27pg9T1B6K=zf@bzNrV36OQ*Wc7aT>Z@2 zRi}f#(5~1{`;iH?2Cp=b70KoY&?c<+%k)Mj+m^+6k%Y40a$^oHDp+MoN)VS>Rf>Qi zHz)Y42~Nh~1Ma$?WeU=#03)%F5B~r}i|46h7A#@aKPde%w%n+t3ACcF7A{WyeFRu~ z4Xg}%a;l3#L?yCEt)gexN1-PXOFKD-r{vf|)VHKwLK5Be5>P+_+uwNk3(v;hM^TfY zpZjtW0(ZUmx7YHIujiXnttq4|q^TqY1z3ysxZ~>|Ae~8|%XKSI2w&NlCdXn9qa8jY zN?*XsHTHL7M%HlSgrKB&Cg~l8kN0SXlInxHK+-q8giV;ZGVU6F?WtFlJDs~2gCBWJ z0Na4;Ng+w?4=>}{7+t`5bkkCjmaJmB3y&bW^usd^Aw&f!B^J2fdw*YOchfTy9ptV) zlgzxe#1k~S%_;8^N~0#A7Rt1gtDT4`QAq~ig%Ei$2)`*XxwKWN^+)6`y!Za(D6n_Y7CDVg}=4dxCl%vUC=I6i$7 zxOYU8Ei)xBmlEK0ETI9tT9ATCNhe6WHgdzQuA(w$AL3lb!I;!HP{q%@?j~w>MVXmu zlHGMqD7wR`Q)~0BN*7MV?P!Z#V;s)w@hkGl1fTw<8}Hh~XyBWm;=7V-62$UV;M?&% z;d+@Hw!)V~vpjl-&7Pn!^7A7#aclKDxM8*$d1y;%Wuyxsw$OkQgrpskkO$`syl;*1 zemSZ=TgDiQcBwl0wLLjMFsEEu;^j&tm@WDiCI?Ze%MJd?b~Ru88VjY-4|ihCC%ikGfg^?VnVeO zZ((bG1|R~krmubWA9Oh~>osu>T+`<;^)+qGQff0EJk2@qbfMdB;t%kX-?58MjO3rO zB(%^El`NzXt6TaQRFp!JgqE2ag@TDcoJR8*)%*26iZV$&9~Ry3#1^dkt1z3jLS61Cx%&N@^>YS=+(=xA0OH2mVpz3skat{W|wYRh}rzY8- zs=YGB^tk$p3jHr}f4VE_>Qfgm?}*kAlP9u^_at-QZtw>>p~tNovxTI^&ByQVdG--} z(^VmG_eGAD3JY3Ua^%|SAlQ-L`NVhBtm6#fDTik?Bo-B<>e#EWwf$`o!`)YATF^o; zgn-kzQeWTm5Xi^5k&bgQDQ6KDrRCGPLn}8v+}ao2NTjH2P$gE=B%O-MDciB)I;$j# zEW>C|EgPgki4C=-4S+bZM*u7y;@ncb&oVLFkx2c7=o z{QV)S!Cs&iKID_;9ilwT%=@n490HuKugQM0qsuy{DJxQda!TgvK=lNlU8B7@<3I}i z?G|Z3aiM7)t@uTz?#PO15BX+^BSJ4?EH@qE{{ZAZXLO%{`edSDOb^sra9$&-(~#yc ztjpn7W@jFlT0wDyyJ4XSSCnZsAOa6D<}*3@ho#kYQKq$y;Yr#%S?Vr=l7$L1?UBBp z5k9@Rjd9K?+Z3RrPg(tja7`aGC*(5cG#86$iw(NPdD$h)snw|gOG=QUR1}pGFW%Sh z4LJtXz|xc*xdeS;IUPx1u;@vn%>@4d5xPnK?;Q;FH-y=2>7`B^o>T_WljSXfQc8}F zpcYOLpGunq8Ed59fpB8A(%VuckWV(_+9aIa&9`ylRZo(ZGVChBcd#lSK@2t-ZLwz4 zw_7KDh}0tGXVN@Z=rcjfhw$X0lC8ToHrt<0dqp^XgiJ74 zQ+G;%y`o~I^(ggg22wD-Ka^9GG-+=FQlifOGeY`8!8;Id$2Sml(3*BR7E)3ZrAimt z)h=Yd%c@|ZQsrt^ zm9|OM-^?~utrW91F&#S^=4F2u(BuT9wN|e)G{m|R0BN=Gci`ir2X0-Q5Ezb@fK4gTZw^o<tohQ3GUHeYo!JNt7~pRBcuW~A#$a&=xD+ku2lBINAY zPMu&LEzEhCnRgZeOHOgWlZZ7&aR^f&JD{DxPQ=58M-@RNn;lvE)GllFDUMZ{InRqG zE0x8{w=C^SX({m>ZLwq|l!1ERc=`zc|pI{J5aEdX;2@87LyX%4oPUIj@P~6He~9X zNJ_ld7WUpd+tN0_-5gI1RRk29dAan4_AMrT7XFEhyJ*WCcJV{SWvLN#vI}S*ys#@K z;PGVl0Yva4*og8Y^iJf8GG84{iH7Z}K_#-soo3GOuJ^FDwA+V~As&;I~dtSfWbX7TmpuoRM#vXDmVN~}k?J)`8GulWXP z{cK{1CW?|8#50IUT8SyN!-?eXb{zLHzl_%-Jl!04m?``;w6v>_2I;r{>$WQ3W0i8rv)b{??-R3&_Qhf>|bLyESey{{Vi4Jjip9evHQ z<Wj1(Mads5NT{+V5 zt5^#d)8#2u2^nRuCzw?Cg1KjuRc8y0rr_M4I6dxYB$Y~HnCo-0vnyrUcLLDz7o|v0 zHwpxBZxS9W>&K{!T~DP`@dj?r%%Y1t#N?*8QF8k#3T?&Me)OcI8?O9Eo1YF$j^gO* zi$&RUD7sgx^%CAxjJnHrTBfm9o2W_1NzAu7Dw%0F3Pjb;jR8suI(O87K-ie49col^ z!Fb}IPsW{96Zh; ztG77SMxfbFr%^Q0ns^awd62aaZrno>V!tZ-!CcA>xYD5$gU5KJo0ZZVmoHo;x+o#Nm@XC zHV0#rTE&(^~ zc$qps$(+8;Is9LZb7krChVUj9cDGZJq`H>oCkS=6kkVG5LKAl`rC8V}-XZkMDJoNB zgo6vsp?%~uaZ=ZPe7h$1k|Rb=~#k&KPJ@sGcwJx;%8KprPfMaa4j~v4X$9? zU&C5Q_Ma&*wPty1dcP-DsN?79RW|0O+mn)*Zr?1nfdy)9*4q{;y3{=kMiu`6h<0mK zu++{3p<%o?L&NW3S;_>Z5|2p?u_rAw>rOnT?5p^SQ%SnXJ9dtI9q|LsoClQhnN@|R zWMtc?Qs1Xjt1K|2&dV_L(3x~0%~lFh!bYoH1dDDj98$yO-Nse)@7v_G@z&8c(0&{_ zO(~pNn}%!Bc&f8V!&F*DTM5e3>N4_k6Rb{`E*9hH4U&?Ajly?9;KT{nk4~5~rp(i& z;T#V;QZm&nF)37-k*qk|lN9%!E?!+rXap}vN=~Hh=H%M&b|v_M=T0%oY3!uLQ!*2c z&(WpnbCsEfmZ|5Z*qk$M1-ez|DO!|}Nc$=v-XqN7&x}!>ayV9B7Nvr`C54!v%1pEr z9DZG=99k6VQ9719LYs?hk+f-t7m*B{rz>ClLb$b|L#ApbRARi@k-^!~F*L;@vdfZk z^$AIj49Ly6EW_&9>OxmwpnEF)p~uypN9D&(blMhLBBbR<95>?4VyU*CKP<~`Sg|gI z5%z*?vaaD`A(=X=sk5z3OFLz>u(YetjmPH>Eb-2aMW5N5P|YlB^5UmcEg6w0)`sre zC}?R(CfhbIzc-IsIWR94P;vYBr}XzY-aMbADJecRwe|l1AM!(35|s@m#GddV=vf6j z3-TbbU~Wyp*g?scE~e;C=@#7fj$N~<(;c}M=29HakZ(O`^}2=^@ZbGmEr%USCkgOZ z;g-s_+06vs_(6t+Sjr-O^wZpMONUk92R_z|oj138TJZ15EZ@g{KV}S;YGvHiyA_EB zpKXUGWf1x_y3(3hC|Dr*RBg7<&#OG-{QI>Rl%EmTRN{(7fF#`5c8E$!ZT$qQsO0f1 zLaiG^?i8pXoBeDf6o6B3MW8D}t`)c)h>Ag=!m^M7H|D@Zm(s2Q%dFMRuh=|)hp|;f zbrzD{AsA9&hTLiGV^fcK$WZW-i;_jHZelVHAT$?y?ryJmlzL<8a%ZNQ>g4p62BTKR zc0m%4imF@-X|PqPEv>brq%11R9rUM*M^}mH{*fP5{oC1>k>HDKmVT{Er==}FH$LNQyuc(llqs+RkSr{1&HW-fZPTkwt+yf_`MsF9XEN~fJ(dxH|cNBuU-^+%Xf*m}8)jv1g)=}Mlh;uXsH$dpNO46>4vq>HWB5IGwK z5yV7lV%wDyW4ufm6V_HY>Axy#xqX!s_Gy)x{bpKjYZIg;$BeU0IDsjlXd_8l_21M- zCRLVL+J|QGakXQ{negb$I=)h77A|VCrDBW$il%8#VT4P9XPTB^JutRZ4y8B{d_aIV zLKJRHJs9|6;i`Q{6SG;&+(A;5!*9}BeXJ*igzZHFcAm`Hec5jm6tLQz(Wy5o&`!{c zioPgV#}THLU8ZH!l`9a*;|g9Ps?}wu6cJRKm5?${hZ@oV54E!Fcqf~}jbq|VmH6K> zt67JQ`f`1zCn_>i)Op-FirkQ>Q`W?rGNpqu+j^dtQdmN~A^-%c+nC~U^H%==&tmHt zR`Xj3%4ObUR`4w^6E|6vq*Wf3VyeWl*+kk9vXJ0IfGHQZ*;eC-ZzfEDPx(}n-V^brRAW56!`OQh;>uB# zmc;UpO;VEKA!=>6*21-hq}_w!;#bKLY1gBc{`&Qd1=*EmK-r zVI-15Q+UpV+=j(G4Z5E}SpLndcf^I;+0{h2PUN@(4ZuPI~ zVIN)3bzkx9Hq=pYq+8rUvgIzI-97n&0Mt9%lLs^|JS{tSj&pjnS!}ZCCW(zQFAir$ zD$Z$&J6M$yZb`|?V9CmmVG{ETVMW!;lcMDXS5N}qNZWr6Ovat8;0bC@F_N04<^+*) zPO{vSo)m-s04%ALu<*U^q$g!?eA{_pcOv@W%6uWyh8oE%cS*<6uVKVg8dT;G#R-#Y zb*ZVhUnzA31ggQ(n-WJpyDeqk#WI4K3Du${^1#B&qFzZ zlK68KVvNAVw8?2Y6!g5U8ezR^ZxEM~m8Ej0YoIisvZ5{8Akvb8MZK;fW6%DkrL%`7 zGUF^8YJD%@x;v7U2j?9MOw)xxAxN>|Eu{$;+-^9Ca_61>BdZ6i!}Y!Y0H5|}D)uu- z1K7Xi})<9jJ6DTqfg# z98IfTNuWU8!TjRAh37-NtI}viwD_R-3f4~Aw3{N^+UZq=?oX=C zx2ZR`a~@=Vi(LVk9)~dnaT4lE=CMm`Ey9sy2BngqFKgU*q>+8K4Y!X@*l{Un1L}XA zOzWE*FOJT2B`Zlnz#xkdp>c1de4czyX|ptLy)lH8>TKf}wxZjJPpF%45xu+L@sF%X z`BC`1%gizH6UTwZ$WpPTO=T;!(oEx|aj_?EHuQ~rZ^UPpbcSTwis;C3Xb1O0P#u9C zzVGJ{G~!l?=TPd%9x8>0tL;%)EDT5=LC&jLcN@%#6w>EhLuD$a$Hp+@p;SHpQ zn^8#8vv6)bVY!Gt7M)As{Iks5$EeaJJWQ*_KdG@D8JE<#rP-7`xu$?lm9m!IZDiaX zB%5s#?^+IV`6?rrS!|~3oF3pL!6t^%Su-C#0M%_E8~tKp&z_tymP67oRbv-T$vDnC z!K`9hI;7lEw92~c%_R<9BTIoysE{r!r0={%vr_0gSeuAjDKyZErsrwEPD)LZ0=7^* zA9#AD((w>DMg8!Qi4XUz`|UDO^3xcp(mmtg{yQmfdyPu2x~;~nfReiEkz^zKgE zf64)Za-%TwnTf1JNtSu4OuO0xqUk|baerGzKT@4*56sfqno<~bAx<)t9V${%pcF?0 zfTeyWEKXe|ss~26J(^-XBu^>l=E?@^b6FQYyBHA-(FFeh(UPgGB-h#|{D+T}dx-06 zrPimhs4IM+0we9&u^vbT0GD=G*FxF^w6PguzDzU7}+QX8xX;z%G zXjyE&@mSe9`wMJuefEv|h{(#nP8qdT%9_PNsl!ikCRTk3AWX2dg|_971g6&;fN#0x zDM8X~%hYaMQB=R^k6ZI2^~)zny^^)vUAu^3<|a~NOuI;$Q{F2e*+m4Dj`la=E$a_9 zvOIPUtM=~^mr#<8JBO!N;RC6l4aVCM{UTavnkjCI{Yjck7pf0N9%ke(=?n&EZV2%sk4JHM&%* z=#th_g&^roy~*Yk(bJwVD*f#60^e)ql7FxB-YjiVQdmbKaAqH*%O#d(=;@hpXh^!$ zqHlX!umbSMD^lFnhi`HS2XDG5#Ln9zA=5S@U5ar73H1g0TiOptOqIW~<|kuUa2!`2 zzh)&C%2c48$vfPe{{SdgrBmlB3O^wz>!q~aWtPgcq;jKf1T_^wWIj4vsEsId60vi_ zg4MUzXgPf=&$7ytyiC#Z-%?7fMZS?OrG6110^lo~a~;e&r6Aaar8^so-u!*gxT+hK zBCKW>U1BV{Q**B?!p-)kRWvyT6$5Y z)I6@f+FZB!N`=f@Y{R9}^8Ww^P%y?Dl}kufDXEvMoeZq zsnp|6ruz**3&&D28!#87I_8pi1;8(Om{m}iSq&k5z$vw?eSP8cj{1*B3KqDyH-_P>K;^BKiCsM6G+nmptrY~{{7>vdI~QR*L4l`I)n;8q zw-sRN;{O0%3|S?oNV944Z~+%TasK)Ch6hkG;$s9j9AFhR>Qt53-8b$1`b0F)({@D? z?x|_hacga8HE%Y<1=kMAP09C;Du4JXQ1l$fVrAN!QdnD-1!DgI-`3F6E$B^hsak&P zmuEsr*lFzrsrtZh9XIzP9eK%1m%_Nk+&4^0P|TYxAZXiCyfl?4`;&NSDq;HqRBvc( zmG`!6yIOYSGk>CEN>yn2baC3y68q!?2UI=5j1J5nw6z-!>WQKBZ&hP$QvU!$rZG>| z3b$mRqF^P*NxGa>`)?ae%*uBTt8Opa0a3YXqTN@4G@UEH+edPV2o~lzCzgk$6ELJ% zz^#qBj`k3xG8CYDKn9UugKLjaOc5lKy2B_*-&nDZmv#op{{Wm5Mghv}30dXPFK!{d zp(EL-f%+e*_gWo&oc>6S^qy}Ml9_N3f(u;5*R;94eMh^XBKUfajZ zpT`D^`#td##t3PZCAHV46p*&;v3Ci%`riKlQy)>0^M(3Jxp=%C*WFsOnH3?5nq{WY zwE{KkWeQOq+VuBYnRZ zn`Bm*>>$RHZW&F<8+%{wu=}DO$5O$(PT~?01A#hGZh7B`+cm74Iq*F(i7iHp_D%<#tfMzz@Uv!T3Kl23gXdrBx|TPE%cT#cgtq4-thP zc0Xud-Nmi%4ctSU_%^7ma%|4Gu-VyQ4gIW7x91sTl9E(!8@FZH#8p0y`p3XIQHpWr zR88gWQ!cPXju*vr8jU6QjP#tM)LNL5Q$UXqNmi8wTEv5E2$8c-;>DFHrs6E<%IU^e zP^xG9bF-K_eY+~Dh7*UHr#a$_Xd&MXK%|mVqJ!@qUe9AH6Rp{&oEvhcR3S2B5z|(! z34K8zap9P+T9-oflP#ac<23qw%3n#-q90(`Yqy=>z6liaox;{;|yMW=_PZD!Agvj9b}Jj~LLIRzlFxE)A46 zv@Ye|w9?gdZQ`2)-VrBWa`5HM&koU=r%1NZ7Xdd?fbZTF(l6U*Z2i|F zw5_v$2!U;hiy49okMwJS+?Poqwag`I)%I+^AkP&5BF#m%%-g)u1P8&Jezq(Aohg`1X*A>Q~_1M0^5CIEt=g0 zl&mhTEJoT0eK+S}%ydg)iU>eUwW)oL{{Y1tLqczfdT~xtz2a#l7$w0b%A})Iy@edX;o)c)L_2O9&003HTKkLLr zokiw_0(yq5J42fJ$)}a1DI0_hul%-*nrO9TA%WqJPPT+uSal$& zM(6FQkH8pcw5I$tmXZzj=HG~gd<~B9-Z$yr58(%=P}OS>Fl8rY98d*dDCuz|@(2U* zgmyGG2n#^9h1Ph#xA)9bSJ9est(|SC1qT$1D0<&=V#xFh))p7(LHtsTV}TV|YQHHi z8gYjZ7SfyXE`n4I+gNmk5BNthTAFnM#J4dt)xqGpEpM!KOHWhVPw#4M0sem-HvVx? zTsBOj8LAfRQ}T6c+|=Z>pqFj;*5VjW>1-2w4`JFhEp#@Lf^0_mcC;n_zo8<|E~_p8 z2V(ko@3r@im14XxEpq*4R9IXR@Yq6E%VTZyhQ@xO*KlORcDM~2D)-te#Q-W^RVlDH ziI+YzKMquAYM^2Hq|D6Bc~lTKXb*UaB-li=Xl+Ut9+51#T3ZdO=w_CsF8YGeW2^ol z7VA78FVQf(&~Oy4guqJ42Ve-c!{47l6*8qPij6thc7RIO-I2d>xc*UP>NwJmm^mke z>lC^4Dq=#IBZ(deECQA$RM>59B$25)k^oQ!$4Dd_2(+VG6MU$!S;sfymz5UMc$4(=R0pDDw;KtJ)T1F|~S^hbQp0KM=hyO{uMyDl#q2*{OxKtHV;# z4T(uo?S3^MSiVu=(JvHzgtrvtvJS&m!;$^k8Ts6n-@%hDAaamRhaY@Aou80G65{4r zN`Hu{z%>u)!HDNOafKZ;vqh&)w*17>0vt;w;VA?gowhp&$A0Fqw#b^CKi!e$-q51b z!(l-o zZl_vq+DTA5TKh$+!9NpDm+BeQPQuxZj8wccLCZNOa6Tn+Nz$r4c+dqtdP&4+DlEKI zut*w1jUiy!MNw9$y+&niGoswF%f~Tj{h-2m>o;DjQxPh?ZBv{~l9KXOr%L?Hx-^4u zMXkl@Wsm>mU5-hQP^+@F7G&mC_F8}C+)|lQwT7?(HW#@7 z`W2nMOLVu0x|pDK89>h*hnmB*+|;Dj6+26yOv~bw$(f`FR_od<;6fCoEhKImy@>)L z{-FBf$qt};Tk0P!aP+nl!WG5h>TN=lNBgO`-&K+!PEE@)mdO4a6A9BLA%$rh>$v(ybgIf51yuA`15B$3OrNJrA@1DIkyyM6}L7qIuj z=PP7iaVjoJPQEno1C#R$1OEV;E;>?>kOu>ZuRjee60E%FA1biZ?1q*wbgav%z3g8F z^S}Q9%!$Td7~%I>3SxOqq+L4LmT|E&q!I|G9 zEU({4xlWpKDDvuMWyD;bNlU8q*&~?tS}PC5{{W_WeyBPX#kgIWUlOB4WA(*0$+;?J zD)ACNttrpE53E)>ahhb#JdyKTmGh{qVI;PreJLn9O~|l3k6t1^&I)R&)fT4|i)%?r z&GzjMTnc9J7B8t`N`|y8xq^)+ZLVx>@3bA9Gy_+|=6R;|hHkJDZEy9C-1hONb7PcL z+(>5>VLV@6q@t%sEc~NxmdXRayi%+ceK)bn8~yO^D3h5% zZfQ0t`#Wy{{aqlm6u6Qu4+=Z}amgmml!jE^AFKFCQm4~v?1h3i{;|sC8la06P9%VP zcZagDzf#j5UWWON1=2BC&th2uV09a|T_Zg+h_6DH(Zjp0t@bSWr zPQOblm`3VN{K>f@2AnrQZAn{FO{{EJ1X9g zHK??mekybiu$%ArM-XvAWH;R2F~XaINjBv7i)x*Phpu7rH7K7^a~nj$#npYtAbZC; zW_DA02Ky%C`9_PEZ_T;3*ZRcUpy>lz%YwvTec(PQ;5XXVg7*p+HXf0nNxs)A_k^U- z^uxSH)}1OJQw6$&kFWkgJ%n^NqSITb?lvIz zf*UR*0H(I=sK-{MvZpnRUxH!k#{Le5sxLC6t+i=bJ18CFb2WMOxxDL&xZIZy-5hO@ zq@?&{*k5l*E#gwMb(6Kh9iVMkBpm$g%gM6ea>LbTIb86TtEtr=UCawv3DA8ug4g9% zl_ui*m;rWc!C^#|gSgmS?*UY_nyi$!W9f6u32H_8x$gz)Di;U5AZupQmL)>GB!TN_ zD86n=m0{inpru(PeF^Ubt+jA(d-sL0+0==}Hk$<~f$DjVx=t;s(i~W)POY%wuHZ_x zQG{~hk>yCWzbMi`+@$u{z@HINxc*?`6&*&T=-+XxXy#rsuDY;Zsy;yN;+RZHAwFYq z$+?2v^IW3id)g}KE7L_umw9o zQzZCd)vDpOg>UJ2)}^Uh!Y%7z8*RjHEq||QVoTh4bsCgU<96#b)P*xQOO<)Gpxi7L zlX4Gz!Tw#MJZ;&OjVVzdd?`4ojR|F`w>%_^HrkECK{v4Uf<95!j}Wh^?{)?X!4?DbIynxQ!}H=W)W+D?)il5H(+fx1&fLT)&l&- z{0ENVMD5HNm!_0;mr?e6rZ#3~{{V$(->^(Ag`6|ZDYR){elH!3gr$_Eix4dZtt(TW zD~r@e*|6d^r&6P^+TG!;v3nYsSZ$JhJz`AgV=Jq9&D8D?%gi?`<4)CUveL4sBmiA; z#GwF^Km$=5oq*(simDR{TVcCjc=X%!UwTTYXLnoDd5rxvYmmXxu2mg)n;{OM1h6l0 z=J8a80ejghBkaR!g3FJX)0}|gDGq!BFOrWY$R${cOP6gb<63QE#Nh#>4i8xVPc#y|(n7sp4TdcQ`!Sx;hIF-lr+-C@%| zMsy8H`F9kfqW-O`QV2Wj4+;d<+9gg$6yaYo!44zrp!@KBHjkzM0E!1fSa+`Oo9FO2 zrZl`uOhV>x)9TWar%3ZlsY=)-zyP`7K_`G?<^KRNuue4TYd0tI_Zib>WZGtRZKvj2 zDN;&QK|+DxgSEY*w-!Y_Tx4?O$Gs7@J;P5>D=w9#K`yOIK`FQLgfgXC;BGdsF*9Qd zB|9F{?=Fo;NmFav)A`yWD%BQpjW(tqZAb~*Q5FU{=N=N-tR->SnqPei)RhYnZM#58 za1cU>^xg*RU<(3Iyaeb%h0;y?z|yT2=>>-sWj1%*?jv_tx0_bm-Z8|bw3Vcfrw|0G z!h#PxTJbNS>@hAnmjOzMzX#egN|cg(OYiH%0HoLp><;n0N(6-Q+Wnx9K+%8^VlDW< zUL#+W-`8jwlr#h#$s52_kbz=F$lM)b#RN|V0k-kV00l0Zt1-tmIg2nx9-H1JSR zBIMfEz2a@zOwmfp^@DVc>|iz^c~#G>7^|#>BmfTN0R^eGtQDIL`$MgQHb^PHqjTB< zZj+>{*B0O21#xRDu-X8SRI6@%Of^?bO@m5^7P+?~0O7ds%7>`1ffa-0(gnE|g4T_~ zg19~Z0F)%t>=%1A;vk~KdmBJrC2I;mU>~=ApAMZ6NdzgI#(+awQ;9t@Ju%Nv*0G?pSES0T&XEYmL_UQW}cJ?4T4yYqUoD%m3y7 zrv5HEXy$;C7++3d$Wn=Tr=Lf{j2F68_V=nnZ`U&}f3rnRA z1RVI)AKhN=Hu%|9N)2!&W)pO010a%mr8o@$T)!5QzUc5E@=BMBWfcD@TQHUL6jZN7 z(U_ztA@ifvOLbhBZ(&K^N4!WGq3-LtV;T9uhv_6y2sgLLFV;AHhA6d*RP)wkL!hL3 z@f3O70_F%^2G!o3Cu;6Dd-cDZVJq`Tvu;A^p_mJMWWK8nj{^(NhGXAY6Bv~aK3`wz z+>gX5E8jSDI=RUQiGD9u!efk1 z@ml7LzK);JI+~rxmKDbo^)ssBt7`}9x$GGvZhX12aS$P0)g2gQDU#Ok?wX9tEx}*b zOn0}ZkoM0FZ6KmRP*8^!S4Tw3<3%rQx`At+C2L zJNQY%NE%L=jyiJY?DIbPjaOSIyA3vV(Ng4jc(GMna&465u;q zf3$1OPoWv2%Jf;Sd&>X&IDGL`38o00N%8tiGo79LHaqCgPWNz^q?nLfB@wsC~w$;B}gfq8Z zc{Z3;o?%vl(gJH%M;~JT>^>&OBpq;jUW&Q9T{=l}lTidq4lhJK7VVI6F#9WO2T4js z6t{t>qExY83WR&Q-{Kl#mxMsb+?G?V|F{6?qu9~zZ9mzD*DTht3R+L#bJy&KDQui8 z8Gjp+B`@yH`l=1H;q@8Y4i6FmoPn_TP8^6mxIxJJyvCXoEiMLjs?`VYUUzvO8Cnk0hy~7ghLc`I!NA|gSq;k*P!6I2&Ayb*avrtKbQOvWhT+tP2OPH4 z9H>|4rlbw1qXG`PFPcK=9X#2073P=R-LIJ%(^5_*;wme4qODwErG=c*TJ$ba9$nXU zT=MmY?bM5B;iW2xD|tvO-W=b|+7A^VTKgMzM5h+c_&fAl>;0Rrjounp517`-F{1^C#M!l z8Ccll1N0kg_VSs#g{JrZZX`)W2`t@2hNItJSoVhN)Ft+>D{cIS5|P&_xwAat~xsU5cu0R(-YJVDRprkQmi_}I5TEhDKinVxU66K`Pmy{D7fsX-r~4~T^6S0y zU2Ahm+0Y7HV1ByrEOlhu|C%+Tv)KBPEsbgWwhs7Nf;`2h4{)So+*vHFOycmMxqCz8 zXoF=uEiDbhl>Dorj_{MAYLV8lL$7ru1m6=pYuZ&V`{Sm&)@u1ctf6JhfNpjEZW0e5 z&#Y-ch9)1T1F2OvCk_$$Kc{$YKBzR6*DbWany1;IDiheee%`0EdvrJKX5q@^o;p>x zLD?yJkdzNz_IhK!npseb%ag@z+x=s%$Kd zvn79ih#b!K!=OfX0mnO>W5OXnLf5BfQU(bPG-lFK*X#nS=!zv?_hkV@W2D*cU2zX1 zF)Z+#vRs!_7H7`dTFM1q14MH*YAw*|(igXE7W93oDABR)kG-bPBeW79t)bjcXPGe? zXLnF^E=-LS48E{~)}^XpBj=EQ`Dh3D9HxkrJSfo)hLQRjf7e;xzn4Rh-4K#;kRVoq z`uDleA!$GWn>1QWyVEcvu>H*<>oPNH)D~gB*8sKav##HskkFqY{ZPKn3HF*LL4&W0 zD#>Wu=&RTA+Fvt0f`LYwVFUA$eSLvqPe#>tfsNXRgb>g(1>w&F?vcH;)|im)5PWX^ z5`;|8rwK4gUY-JHgSRe%P^~fXQUO}^P=KIocQ6dwapCWsBAj7j|LHE2f-`Adi4NsX zLS?xCKP#3=!q{|*Q=4?8i4>Rm?B(w!t#LT^lCSoQnsk`?s)3eI>IWAgQ;GmR*8nD< zr#)Ho1U1e};)8i}LHEJ2Hogd;n&y9iBK9Lp`&p5c5`-oR98@%?t>69X5EK71Hs-LI z*{+|W39?V``_h1s@I(eyEfly6fhAW#QG0w~K(_L+Loy>NmH@E9F?U{t7m~laWW>u)t6770_8S+@hxJ+g!bbE_lv@V zn5+ZVq6Deedj0z6T90$VRw-%BEm+9% z%@03$$9#DYM_CnIjy1MPo@^mvh~3d@sG@Ax7@sA8#KmAIdZA+30an`HLNK;8`WZ z*Xt2Ok`_bE{#LxwWiS#Bl3ga4&jJ+8s&B{M=};mcxvT z;9*m#{L4y}m8!7WJrtXtt11jWT@|$N7M$DR2*S!W!xqCjM>@|H&s4*ao8AQ2&r&h* z!1hcMJd({T+zTM4C3K9m!WWs=^3p`h=3|~Jj+s}o$x9Kl%NvuHK*M3unDUFO6&Ysj z%bZDEr$SNL9k(|JN?&w8k_zBvXxC?|Emk+DSSsFXPVn5nCeCeeyBEjC2w%)Xn5sL3 zQJkahJ27W{>R@9uoWKKSd^v(D{GYT5@(Vrc^S65p9|ZaEy}k%Hy@#Sn74nh)0YZ<8 zNHIa_5`b#gb*|}^F~TlntVrQInq&QprQ1&`NQH#4Vz?F_9r5gYT3Wokh=_H3P z)`HJVnDb8AR=NVG7w^t`)Zp!^RYA^nO5 z(VCtPcP$Vo;l{3Y-Aj8h(V=dl`Yv(Be(i+>Ec#N60Yl*zYWWlLNx1_I@;fPuF+ZDVw=$~u0H)j0J-0D#{XU(X98NRzZ z)XaFEqVHY7KH|SDs#dU60vi!1`LNH>-)BVV9S-Ysx?TNpK2HQ4nUiDvJ9Y4Us_7kj zvM8kAuot%cH?!0(r)41Lb&V6#ofGxjEGJBqvXwXEnh2tSRB0F8&`xU(ZxA--*m>rW zk$gM5Gs=;4(=ZH{I?tl;<4TQnRZ)OJb`WQZiIPL?+(PJpHKF^z-osP|4Of9-TLynU~1OCtA@-ven|*ML{}r?V?-ht$26?Q5UsJorwQZ994wGTe=- z464UVRJPro-i8!3%-+&%EGXGYPw~6wy~y|5_-bK14d|6GC012Qkuk^$=tUEiVw#gi z?}2!0$fGDtd}z;pseLx1I5MQmuFAjfOC8TKz#T3nh{xlr(EZ0sZ9jL9?-Zo&iT{qX zg|jRc=+E7^OyG^+y|Xn#vqwRs{|M$M$8@-Sgv2@%+oYqsWP5t zr48g`ay~J++4v9Y<8)s+3y^6UDzwtp;%X;IIO~zbjFqdOxpko4j596I9|c z>*=P9{2;(!B`~XLmW1drTVm_6kC5x=oZzVp^Sw!E39(fml@OX6~)1K0wVLVt~WT$aG-+SfQ=_L*rXzMX* z`wE)ZCJE$({R7}vO0%YPEv9q$ipFQY3wa^TjN=JKfc&LKgn^L5N`gbAvQno+xcuf@ z(Y1Vc@LKi_h@b7+nV!djYG$p}l8}(7J+ANuH?Jl`{+I>MK|)tt(#FtKCsS5bd|H}x zPr7;DQ1hTZ&Rs-^iB?&^0sP;DUj5bKoOspPg%pTk55-D`$-@KSGvII24YJ-v`=jmu z0pi&v__JiAbIabgR!G?-B4sPSTW_loCo5@*GjprqOF1lK-qVYwjkV$r1ifJu#3UHr zti21mD*yV2<@)J;i!R!Y%rtx=OEwKg2O9Lm>!kd@qX$VO+N5nfXybnuqW^vTAC`SE AkpKVy literal 0 HcmV?d00001 diff --git a/tool/tilem-src/data/symbols/ti82.sym b/tool/tilem-src/data/symbols/ti82.sym new file mode 100644 index 0000000..4c8afd0 --- /dev/null +++ b/tool/tilem-src/data/symbols/ti82.sym @@ -0,0 +1,939 @@ +[macros] +0CD748D ROM_CALL~%j + +[labels] +0008 rOP1TOOP2 +0010 rFINDSYM +0018 rPUSHREALO1 +0020 rMOV9TOOP1 +0028 rFPMULT +0030 rFPADD +0033 _LdHLind +004F _SetTblGraphDraw +0095 _CpHLDE +00A1 _DivHLBy10 +00A3 _DivHLByA + +012B _ApdSetup +0131 _KbdScan +01B8 _KEY_READ +01C7 _STORE_KEY +01D4 _GetCSC +01E8 _CanAlphIns +020D _coorMon +0213 _Mon +0220 _MonForceKey +02B5 _sendKPress +033C _JForceCmdNoChar +033D _JForceCmd +0355 _resetStacks +0368 _sysErrHandler +0374 _newContext +0385 _newContext0 +0462 _PPutAwayPrompt +046D _PPutAway +0473 _PutAway +04B4 _Redisp +04B9 _SizeWind +04CA _ErrorEP +04DC _callMain +04ED _monErrHand + +10C2 _SinCosRad +10C6 _Sin +10CA _Cos +10CE _Tan +14AA _SinHCosH +14AE _TanH +14B2 _CosH +14B6 _SinH +154D _ACosRad +1553 _ATanRad +1556 _ATan2Rad +1558 _ATan2Rad_83 +155E _ASinRad +1563 _ACos +156D _ATan +15CD _ATan2_83 +1570 _ATan2 +1575 _ASin +1787 _ATanH +17D4 _ASinH +17E2 _ACosH +18E7 _HLTimes9 +18F1 _CkOP1Real +18F7 _Angle +18FF _CpOP4OP3 +1907 _Mov9OP2Cp +190C _AbsO1O2Cp +1912 _CpOP1OP2 +1955 _OP3ToOP4 +195E _OP1ToOP4 +1967 _OP2ToOP4 +1970 _OP4ToOP2 +1979 _OP3ToOP2 +1981 _OP1ToOP3 +1989 _OP5ToOP2 +1991 _OP5ToOP6 +1999 _OP5ToOP4 +19A1 _OP1ToOP2 +19A9 _OP6ToOP2 +19B1 _OP6ToOP1 +19B6 _OP4ToOP1 +19BB _OP5ToOP1 +19C0 _OP3ToOP1 +19C5 _OP4ToOP5 +19CD _OP3ToOP5 +19D5 _OP2ToOP5 +19DD _OP2ToOP6 +19E5 _OP1ToOP6 +19ED _OP1ToOP5 +19F5 _OP2ToOP1 +19FB _Mov11B +19FD _Mov10B +19FF _Mov9B +1A01 _Mov8B +1A03 _Mov7B +1A05 _Mov6B +1A07 _Mov5B +1A09 _Mov4B +1A0B _Mov3B +1A0D _Mov2B +1A54 _OP2ToOP3 +1A5C _OP4ToOP3 +1A61 _OP5ToOP3 +1A66 _OP4ToOP6 +1A6E _Mov9ToOP1 +1A73 _Mov9OP1OP2 +1A74 _Mov9ToOP2 +1A79 _MovFrOP1 +1A7E _OP4Set1 +1A83 _OP3Set1 +1A88 _OP2Set8 +1A8F _OP2Set5 +1A96 _OP2Set4 +1A9D _OP2Set3 +1AA5 _OP1Set1 +1AAA _OP1Set4 +1AB1 _OP1Set3 +1AB8 _OP3Set2 +1ABD _OP1Set2 +1AC2 _OP2Set2 +1AC5 _SetNum2 +1AC9 _SetMant1 +1ACD _OP2Set1 +1AD0 _SetNum1 +1AD2 _SetNum +1AD7 _SetNumA +1AD8 _SetMant +1ADC _Zero16D +1ADD _Set16A +1ADE _Set14A +1ADF _Set14D +1AED _OP4Set0 +1AF2 _OP3Set0 +1AF7 _OP2Set0 +1AFC _OP1Set0 +1AFF _SetNum0 +1B07 _ZeroOP1 +1B0C _ZeroOP2 +1B11 _ZeroOP3 +1B14 _ZeroOP +1B1C _ClrLp +1B23 _ShRAcc +1B2B _ShLAcc +1B39 _ShR18 +1B3A _ShR18A +1B42 _ShR16 +1B43 _ShR16A +1B46 _ShR14 +1B76 _ShL16 +1B7A _ShL14 +1C2D _Add16D +1C33 _Add14D +1CA2 _Sub16D +1CA8 _Sub14D +1CEB _OP2ExOP6 +1CF0 _OP5ExOP6 +1CF8 _OP1ExOP5 +1CFD _OP1ExOP6 +1D02 _OP2ExOP4 +1D07 _OP2ExOP5 +1D0F _OP1ExOP3 +1D14 _OP1ExOP4 +1D19 _OP1ExOP2 +1D21 _ExLp +1D2B _CkOP1FP0 +1D30 _CkOP2FP0 +1D39 _PosNo0Int +1D3F _CkPosInt +1D48 _CkInt +1D4F _CkOdd +1DD5 _GetCon1 +1DDA _GetCon +1E48 _ExpToHex +1E52 _OP1ExpToDec +1E9A _CkOP2Pos +1EA0 _CkOP1Pos +1EA6 _ClrOP2S +1EAB _ClrOP1S +1EB2 _FDiv100 +1EB5 _FDiv10 +1EC0 _DecO1Exp +1EC8 _IncO1Exp +1ECB _IncExp +1ED0 _CkValidNum +1EF2 _GetExp +1EFE _HTimesL +1F0F _EOP1NotReal +1F16 _PrgmBangName +1F1B _PrgmPoundName +1F3E _ThetaName +1F42 _RName +1F46 _RegEqName +1F4C _RecurNName +1F57 _XName +1F5B _YName +1F5F _TName +1F61 _RealName +1F6A _SetEStoFPS +1F71 _ChkTempDirt +1F94 _OP1MOP2Exp +1F9E _OP1ExpMDE +1FB2 _ChkErrBreak +1FCC _IsA2ByteTok +1FE3 _GetLastEntry +1FFE _GetLastEntryPtr +2014 _REGRCLRCHNG +2057 _CheckSplitFlag +2083 _ResetWinTop +209C _SetYUp +20A6 _SetXUp +20AB _MemChk +20BD _CmpPrgNamLen1 +20C0 _CmpPrgNamLen +20D1 _FindProgSym +2124 _ChkFindSym +2129 _FindSym +2258 _InsertMem +2262 _InsertMemA +227D _EnoughMem +22AE _CmpMemNeed +22C3 _CreatePVar4 +22E2 _CreatePVar3 +230F _CreateVar3 +2333 _CreateReal +2339 _CreateTRList +233F _CreateRList +235B _CreateTRMat +2361 _CreateRMat +2369 _CreateTStrng +236F _CreateStrng +237D _Create0Equ +2382 _CreateTEqu +2388 _CreateEqu +238C _CreatePict +2393 _CreateGDB +2397 _CreateProg +239B _ChkDel +23A4 _ChkDelA +23DF _AdjParser +2400 _AdjMath +2455 _AdjM7 +2531 _DelMemA +2547 _DelVar +2548 _DelVarIO +258D _DelMem +2590 _DelVar3D +2593 _DelVar3C +25BB _DelVar3DC +2612 _AdjSymPtrs +2695 _DataSizeA +2699 _DataSize +26C1 _PopRealO6 +26C6 _PopRealO5 +26CB _PopRealO4 +26D0 _PopRealO3 +26D5 _PopRealO2 +26DA _PopRealO1 +26DD _PopReal +26E3 _FPopCplx +26E6 _FPopReal +26E9 _FPopFPS +26F1 _DeallocFPS +26F4 _DeallocFPS1 +26FF _AllocFPS +2702 _AllocFPS1 +270B _PushRealO6 +2710 _PushRealO5 +2715 _PushRealO4 +271A _PushRealO3 +271F _PushRealO2 +2724 _PushRealO1 +2727 _PushReal +273B _CpyTo1FPS11 +273E _CpyFPS11 +2745 _CpyTo1FPS5 +2748 _CpyFPS5 +274F _CpyTo1FPS6 +2752 _CpyFPS6 +2759 _CpyTo2FPS4 +275C _CpyFPS4 +2763 _CpyTo6FPS3 +2768 _CpyTo2FPS3 +276D _CpyTo1FPS3 +2770 _CpyFPS3 +277C _CpyTo3FPS2 +2783 _CpyTo5FPST +2788 _CpyTo6FPST +278D _CpyTo4FPST +2792 _CpyTo3FPST +2797 _CpyTo2FPST +279C _CpyTo1FPST +279F _CpyFPST +27A4 _CpyStack +27AB _CpyTo3FPS1 +27B0 _CpyTo2FPS1 +27B5 _CpyTo1FPS1 +27B8 _CpyFPS1 +27BF _CpyTo2FPS2 +27C4 _CpyTo1FPS2 +27C7 _CpyFPS2 +27CE _CpyO3ToFPST +27D3 _CpyO2ToFPST +27D8 _CpyO6ToFPST +27DD _CpyO1ToFPST +27E0 _CpyToFPST +27E5 _CpyToStack +27ED _CpyO5ToFPS1 +27F2 _CpyO1ToFPS1 +27F5 _CpyToFPS1 +27FC _CpyO2ToFPS2 +2801 _CpyO3ToFPS2 +2806 _CpyO6ToFPS2 +280B _CpyO1ToFPS2 +280E _CpyToFPS2 +2815 _CpyO5ToFPS3 +281A _CpyO1ToFPS3 +281D _CpyToFPS3 +2824 _CpyO1ToFPS4 +2827 _CpyToFPS4 +282E _ErrNotEnoughMem +283D _FPSMinus9 +2840 _HLMinus9 +2845 _ErrOverflow +2849 _ErrDivBy0 +284D _ErrSingularMat +2851 _ErrDomain +2855 _ErrIncrement +2859 _ErrSyntax +285D _ErrMode +2861 _ErrDataType +2865 _ErrReserved +2869 _ErrArgument +286D _ErrDimMismatch +2871 _ErrDimension +2875 _ErrUndefined +2879 _ErrMemory +287D _ErrMemoryNE +2881 _ErrInvalid +2885 _ErrIllegalNest +2889 _ErrBound +288D _ErrGraphRange +2891 _ErrZoom +2895 _ErrBreak +2899 _ErrStat +289D _ErrSolver +28A1 _ErrIterations +28A5 _ErrBadGuess +28A9 _ErrTolTooSmall +28AD _ErrStatPlot +28B1 _ErrLink +28B3 _JError +28B6 _JErrorNo +28DC _noErrorEntry +28DD _pushErrorHandler +2903 _popErrorHandler +2913 _StrLength +2926 _StrCopy +292E _StrCat +295B _IsInSet + +2E46 ___bank_call +2E6D ___bank_ret +2E75 ___bank_jump + +2E86 _PutTokString +# 2E8C _DispYPrompt2 ? +2E92 _SetupDispEq +2E98 _BufPeek2 +2EAA _CloseEquField +2EB0 _BufToBtm +2EB6 _CursorLeft +2EBC _SetEmptyEditEqu +# 2ECE DOREFFLAGS02 ? +2EEC _PrevEq +2EF2 _DarkLine +2F1C _CursorDown +2F22 _JPromptCursor +2F34 _GrphPars +2F3A _PlotPars +2F40 _ParseInp +2F46 _InitPFlgs +2F4C _OP2Set60 +2F58 _StoTheta +2F5E _StoR +2F64 _StoY +2F6A _StoT +2F70 _StoX +2F7C _RclAns +2F82 _RclY +2F88 _StMatEl +2F8E _StLstVecEl +2F94 _GetDEPtr +2FA0 _WScrollRight +2FA6 _WScrollLeft +2FAC _WScrollUp +2FB8 _RclToQueue +2FBE _FORSEQINIT +2FC4 _PDspGrph +2FCA _GRDECODA +2FDC _XYCent +2FE2 _ZmInt +2FE8 _CopyRng +2FEE _ZooDefault +2FF4 _ZmTrig +# 2FFA _ZmFit ? +# 3000 _ZmPrev ? +# 3006 _ZmDecml ? +# 300C _ZmUsr ? +# 3012 _SetUZm ? +# 3024 _DrawCmd ? +302A _InvCmd +3030 _TraceOff +304E _FNDDB +3054 _NextEq +305A _SetFuncM +3060 _SetPolM +3066 _SetParM +306C _SetSeqM +307E _TanLnF +# 3084 _ShadeCmd ? +309C _PointCmd +30A2 _PixelCmd +30A8 _ChkTextCurs +30AE _FormToTok +30B4 _GDispToken +30BA _UnLineCmd +30C0 _LineCmd +30CC _VertCmd +30D2 _HorizCmd +30DE _FormERealTok +30F0 _RclSysTok +30F6 _FormEReal +30FC _OP1toEdit +310E _IsAtTop +3114 _ToggleIns +311A _BufReplace +3120 _StoSysTok +3126 _SetupEditEqu +3132 _RecallEd +313E _SetupBuffer +3144 _CreateNumEditBuf +314A _CallCommon +3150 _CommonKeys +3156 _Leftmore +315C _fDel +3162 _fClear +3168 _fInsDisp02 +3180 _CloseEditBufNoR +3186 _ReleaseBuffer +31AA _numError02 +31B0 _SetupEditCmd +31B6 _CursorToOffset +31BC _RstGFlags +31C2 _RclVarToEdit +31C8 _BufInsert +31CE _BufToTop +31DA _IsEditEmpty +31E6 _DisarmScroll +31EC _SetEmptyEditPtr +31F2 _FormDisp +3216 _JCursorRight +321C _JCursorUp +3228 _JCursorFirst +322E _JCursorLast +323A _BufDelete +3258 _RclEntryToEdit +325E _InsDisp +3270 _RclVarToEditPtr +3276 _FormScrollUp +327C _FormMatrix +3294 _FormReal +32D4 _DispTail +3312 _RclX +3318 _SaveParse +331E _GetParse +3330 _CpyTo2ES1 +3336 _CpyTo6ES1 +333C _CpyTo1ES1 +3342 _CpyTo3ES1 +3348 _CpyTo3ES2 +334E _CpyTo2ES2 +3354 _CpyTo1ES2 +335A _CpyTo2ES3 +3360 _CpyTo1ES3 +3366 _CpyTo3ES4 +336C _CpyTo6ES4 +3372 _CpyTo2ES4 +3378 _CpyTo1ES4 +337E _CpyTo2ES5 +3384 _CpyTo1ES5 +338A _CpyTo4EST +3390 _CpyTo2EST +3396 _CpyTo1EST +339C _CpyTo2ES6 +33A2 _CpyTo1ES6 +33A8 _CpyTo2ES7 +33AE _CpyTo1ES7 +33B4 _CpyTo2ES8 +33BA _CpyTo1ES8 +33C0 _CpyTo1ES9 +33C6 _CpyTo2ES9 +33CC _CpyTo2ES10 +33D2 _CpyTo1ES10 +33D8 _CpyES10 +33DE _CpyTo2ES11 +33E4 _CpyTo1ES11 +33EA _CpyTo2ES12 +33F0 _CpyTo1ES12 +33F6 _CpyTo2ES13 +33FC _CpyTo1ES13 +3402 _CpyTo1ES14 +3408 _CpyTo1ES16 +340E _CpyTo1ES17 +3414 _CpyTo1ES18 +341A _CpyTo1ES15 +3420 _CpyTo2ES15 +3426 _CpyO1ToEST +342C _CpyO1ToES1 +3432 _CpyO6ToES1 +3438 _CpyO6ToES4 +343E _CpyO1ToES2 +3444 _CpyO2ToES2 +344A _CpyO1ToES3 +3450 _CpyO1ToES4 +3456 _CpyO1ToES5 +345C _CpyO1ToES6 +3462 _CpyO1ToES7 +3468 _CpyO2ToES1 +346E _CpyO2ToES4 +3474 _CpyO2ToES7 +347A _CpyO1ToES8 +3480 _CpyO1ToES9 +3486 _CpyO1ToES10 +348C _CpyO1ToES11 +3492 _CpyO1ToES12 +3498 _CpyO1ToES13 +349E _CpyO1ToES14 +34A4 _CpyO1ToES15 +34AA _PixelTest +# 34BC _DFMIN2 ? +3504 _RestoreErrNo +3516 _StoN +351C _ParseOff +3522 _RclN +354C _Random +3552 _StoRand +3558 _GetL3TOP1A +355E _GetL1ToOP1 +3564 _GetL1TOP1A +356A _GetLToOP1 +3570 _GetLToOP2 +3576 _GetL2TOP1A +3582 _PutToLA1 +3588 _PutToL +35A0 _ConvOP1 +35AC _GetM1ToOP1A +35B2 _GetMToOP1 +35B8 _PutToM1A +35BE _PutToMA1 +35C4 _PutToMat +35D0 _AdrMEle +35D6 _AdrLEle +35DC _RclVarSym +35E2 _StoOther +35E8 _RedimMat +35EE _IncLstSize +35F4 _InsertList +35FA _DelListEl +3600 _EditProg +3606 _CloseProg +360C _ClrGraphRef +3612 _FixTempCnt +3618 _SaveData +361E _RestoreData +3624 _CleanAll +362A _MoveToNextSym +3630 _DispErrorScreen +3660 _GrRedisp +3690 _FindAlphaUp +3696 _FindAlphaDn +369C _RestoreDisp +36A2 _LoadMenuNum +36A8 _LoadMenuNumL +36AE _RstrSmallText +36B4 _ConvKeyToTok +36BA _GrLabels +36CC _NBCursor +36D2 _IsEditFull +36D8 _IsAtBtm +36DE _ShowCursor +36E4 _BufLeft +36EA _BufPeek +36F0 _BufRight +36F6 _FDispBOL +36FC _FDispBOL1 +3702 _SetWinAbove +3708 _GetPrevTok +370E _StringWidth +371A _DispEOW +3720 _BufPeek1 +372C _BufPeek3 +3732 _ReadDisp2 +3738 _PutMap +373E _PutPS +3744 _WPutPS +374A _PutBuf +3750 _PutBuf1 +3756 _WPutC +375C _WPutS +3762 _WPutSEOL +3768 _WHomeUp +376E _SetNumWindow +377A _NewLine +3780 _MoveDown +3786 _ScrollUp +3792 _ShrinkWindow +3798 _MoveUp +379E _ScrollDown +37A4 _ClrScrnFull +37AA _ClrTxtShd +37B6 _EraseEOL +37C8 _GetCurLoc +37CE _VPutMap +37D4 _VPutS +37DA _VPutSNG +37E0 _SaveCmdShadow +37EC _SaveShadow +37F8 _RstrShadow +37FE _RstrCurRow +3804 _RstrUnderMenu +380A _RstrBotRow +3810 _SaveTR +3816 _RestoreTR +381C _GetTokLen +3822 _GetTokString +3828 _PUTBPATBUF2 +382E _PUTBPATBUF +3834 _putbPAT +383A _putcCheckScroll +3840 _DispEOL +3846 _FDispEOL +384C _TblScreenDn +3852 _TblScreenUp +3858 _TOTOSTRP +385E _SetVarName +386A _DispDone +3870 _FinishOutput +3876 _ClrLCD +387C _DispHL +3894 _CreateTemp +389A _ClrLCDFull +38A0 _LoadNoEEntry +38AC _GrBufCpy +38BE _AbortPrgmode +38CA _ClrScrn +38E2 _StoAns +38E8 _GrReset +38F4 _RandInit +38FA _PutS +3900 _HomeUp +3912 _CoorDisp +3918 _RunIndicOff +391E _CursorOn +3924 _GetKey +392A _BlinkGCur +3930 _RunIndicOn +# 3936 _PullDownChk ? +393C _TokToKey +3942 _GrPutAway +3948 _PopCx +39C6 _SaveOScreen +39CC _CurBlink +39D2 _PutC + +## note: following ROM calls are not correctly handled by +## SNG on ROM 19.006 + +31E0 _CloseEditEqu +3246 _DispHead +324C _BufClear +32BE _Send1BErr +# 32C4 +# 32CA +# 32D0 +# 32D6 +32DC _KeyScnLnk +37B0 _ClrWindow +37C2 _EraseEOW +38B8 _RstrPartial +38C4 _HideCursor +38D6 _LCD_DriverOn +38DC _RstrOScreen +390C _CursorOff + +## note: following ROM calls are not correctly handled by +## SNG on ROM 19.0 + +050C _AppInit +0684 _initialize +07F3 _LCD_BUSY +0801 _Min +080A _Max +0818 _AbsO1PAbsO2 +0820 _Intgr +0836 _Trunc +083A _InvSub +083F _Times2 +0842 _Plus1 +0847 _Minus1 +084A _FPSub +0851 _FPAdd +0905 _DToR +090E _RToD +0917 _Cube +091C _TimesPt5 +0924 _FPSquare +0925 _FPMult + +## note: following ROM calls are not correctly handled by +## any current shells on ROM 19.0 + +0A1B _LJRnd +0A5D _InvOP1S +0A6D _InvOP2S +0A83 _Frac +0AD0 _FPRecip +0AD4 _FPDiv +0BA1 _SqRoot +0C69 _Int +0C6B _Round +0C4F _RndGuard +# 0CDF _Factorial ? +0D27 _LnX +0D2B _LogX +0E63 _LJNoRnd +0F03 _EToX +0F0D _TenX + +8000 kbdScanCode +8001 kbdLGSC +8002 kbdPSC +8003 kbdWUR +8004 kbdDebncCnt +8005 kbdKey +8006 kbdGetKy +8007 keyExtend +8008 contrast +8009 apdSubTimer +800A apdTimer +800B curTime +800C curRow +800D curCol +800E curUnder +800F curY +# 8010 curType ? +8011 curXRow +# 801A tokVarPtr ? +# 801C tokLen ? +801E indicMem +8026 indicCounter +8027 indicBusy +8028 OP1 +8033 OP2 +803E OP3 +8049 OP4 +8054 OP5 +805F OP6 +806A progToEdit +8072 nameBuff +807D iMathPtr1 +807F iMathPtr2 +8081 iMathPtr3 +8083 iMathPtr4 +8085 iMathPtr5 +8087 chkDelPtr1 +8089 chkDelPtr2 +808B insDelPtr +808D upDownPtr +808F textShadow +810F textShadCur +8111 textShadTop +8112 textShadAlph +8113 textShadIns +8114 cxMain +8116 cxPPutAway +8118 cxPutAway +811A cxRedisp +811C cxErrorEP +811E cxSizeWind +8120 cxPage +8121 cxCurApp +8122 cxPrev +8131 monQH +8132 monQT +# 8133 monQueue ? +8143 onSP +8145 onCheckSum +8161 menuActive +8163 menuCurrent +81F0 ioFlag +81F2 sndRecState +81F3 ioErrState +81F4 header +81FD ioData +8209 bakHeader +8215 penCol +8216 penRow +8217 rclQueue +8219 errNo +821A errSP +821C errOffset +8228 saveSScreen +8528 flags +8549 curGStyle +854A curGY +854B curGX +854C curGY2 +854D curGX2 +# 8551 XOffset ? +# 8552 YOffset ? +8553 lcdTallP +8554 pixWideP +8557 lastEntryStk +85D7 numLastEntries +85D8 currLastEntry +# 85E1 ORGXMIN ? +8691 Xmin +86AC Ymin +874E deltaX +8757 deltaY +8760 shortX +8769 shortY +8774 XOutDat +8778 YOutDat +# 877A inputSym ? +877C inputDat +88AE ES +88B8 plotSScreen +8BB8 seed1 +8BC1 seed2 +8BCA parseVar +8BD3 begPC +8BD5 curPC +8BD7 endPC +8BDF cmdShadow +8C5F cmdShadCur +8C65 editTop +8C67 editCursor +8C69 editTail +8C6B editBtm +8C71 editSym +# 8C73 editDat ? +8C8D modePtr +8C8F winTop +8C90 winBtm +8C91 winLeftEdge +8C92 winLeft +8C94 winAbove +8C96 winRow +8C98 winCol +8C9A fmtDigits +8CF2 fmtMatSym +8CF4 fmtMatMem +# 8CF6 EQS ? +8CFF delAdjAmt +8D06 chkDelPtr3 +8D08 chkDelPtr4 +8D0A tempMem +8D0C fpBase +8D0E FPS +8D10 OPBase +8D12 OPS +8D14 pTempCnt +8D16 cleanTmp +8D18 pTemp +8D24 userMem +FE6E symTable + +[flags] +00 kbdFlags +2,00 trigDeg,trigFlags +3,00 kbdSCR,kbdFlags +4,00 kbdKeyPress,kbdFlags +01 editFlags +2,01 editOpen,editFlags +02 plotFlags +1,02 plotLoc,plotFlags +2,02 plotDisp,plotFlags +4,02 grfFuncM,grfModeFlags +5,02 grfPolarM,grfModeFlags +6,02 grfParamM,grfModeFlags +7,02 grfRecurM,grfModeFlags +03 graphFlags +0,03 graphDraw,graphFlags +2,03 graphCursor,graphFlags +04 grfDBFlags +5,04 grfNoAxis,grfDBFlags +5,04 grfLabel,grfDBFlags +05 textFlags +1,05 textEraseBelow,textFlags +2,05 textScrolled,textFlags +3,05 textInverse,textFlags +4,05 textInsMode,textFlags +08 apdFlags +2,08 apdAble,apdFlags +3,08 apdRunning,apdFlags +09 onFlags +3,09 onRunning,onFlags +4,09 onInterrupt,onFlags +0C curFlags +2,0C curAble,curFlags +3,0C curOn,curFlags +4,0C curLock,curFlags +0D appFlags +1,0D appTextSave,appFlags +2,0D appAutoScroll,appFlags +5,0D appCurGraphic,appFlags +6,0D appCurWord,appFlags +11 promptFlags +0,11 promptEdit,promptFlags +12 indicFlags +0,12 indicRun,indicFlags +1,12 indicInUse,indicFlags +2,12 indicOnly,indicFlags +3,12 shift2nd,shiftFlags +4,12 shiftAlpha,shiftFlags +5,12 shiftLwrAlph,shiftFlags +6,12 shiftALock,shiftFlags +7,12 shiftKeepAlph,shiftFlags +13 tblFlags +6,13 reTable,tblFlags +14 sGrFlags +0,14 grfSplit,sGrFlags +1,14 grfSChanged,sGrFlags +2,14 grfSplitOverride,sGrFlags +7,14 textWrite,sGrFlags +15 newIndicFlags +1,15 saIndic,newIndicFlags diff --git a/tool/tilem-src/data/symbols/ti83.sym b/tool/tilem-src/data/symbols/ti83.sym new file mode 100644 index 0000000..70df089 --- /dev/null +++ b/tool/tilem-src/data/symbols/ti83.sym @@ -0,0 +1,1307 @@ +[macros] +# Nothing currently + +[labels] +0008 rOP1TOOP2 +0010 rFINDSYM +0018 rPUSHREALO1 +0020 rMOV9TOOP1 +0028 rFPMULT +0030 rFPADD + +8000 kbdScanCode +8001 kbdLGSC +8002 kbdPSC +8003 kbdWUR +8004 kbdDebncCnt +8005 kbdKey +8006 kbdGetKy +8007 keyExtend +8008 contrast +8009 apdSubTimer +800a apdTimer +800b curTime +800c curRow +800d curCol +800e curOffset +800f curUnder +8010 curY +8012 curXRow +801a lFont_record +8022 sFont_record +802f indicMem +8037 indicCounter +8038 indicBusy +8039 OP1 +8044 OP2 +804f OP3 +805a OP4 +8065 OP5 +8070 OP6 +8080 progToEdit +8088 nameBuff +8094 iMathPtr1 +8096 iMathPtr2 +8098 iMathPtr3 +809a iMathPtr4 +809c iMathPtr5 +809e chkDelPtr1 +80a0 chkDelPtr2 +80a2 insDelPtr +80a4 upDownPtr +80ac asm_data_ptr1 +80ae asm_data_ptr2 +80c8 asm_ind_call +80c9 textShadow +8149 textShadCur +814b textShadTop +814c textShadAlph +814d textShadIns +814e cxMain +8150 cxPPutAway +8152 cxPutAway +8154 cxRedisp +8156 cxErrorEP +8158 cxSizeWind +815a cxPage +815b cxCurApp +815c cxPrev +817d onSP +817f onCheckSum +819d menuActive +819f menuCurrent +822d ioFlag +822f sndRecState +8230 ioErrState +8231 header +823a ioData +8246 bakHeader +8252 penCol +8253 penRow +8254 rclQueue +8256 errNo +8257 errSP +8259 errOffset +8265 saveSScreen +8565 usermem_offset +8567 flags +858f statVars +886c curGStyle +886d curGY +886e curGX +886f curGY2 +8870 curGX2 +8871 freeSaveY +8872 freeSaveX +88F6 XOffset +88F7 YOffset +88F8 lcdTallP +88F9 pixWideP +88FA pixWide_m_1 +88FB pixWide_m_2 +88FE lastEntryStk +897E numLastEntries +897F currLastEntry +8AA5 Xmin +8AB7 Xscl +8AC0 Ymin +8AD2 Yscl +8C3B deltaX +8C44 deltaY +8C4D shortX +8C56 shortY +8C77 XOutDat +8C7B YOutDat +8C7F inputDat +8DEB ES +8e29 plotSScreen +913B parseVar +9144 begPC +9146 curPC +9148 endPC +9157 cmdShadow +91D7 cmdShadCur +91DB cmdCursor +91DD editTop +91DF editCursor +91E1 editTail +91E3 editBtm +91EF editSym +91F1 editDat +928C modePtr +928E winTop +928F winBtm +9290 winLeftEdge +9291 winLeft +9293 winAbove +9295 winRow +9297 winCol +92F1 fmtMatSym +92F3 fmtMatMem +92F5 EQS +92FE delAdjAmt +9305 chkDelPtr3 +9307 chkDelPtr4 +9309 tempMem +930B fpBase +930D FPS +930F OPBase +9311 OPS +9313 pTempCnt +9315 cleanTmp +9317 pTemp +9319 progPtr +9327 userMem +0fe6e symTable + +# System routines (page C) +4000 _ldHLind +4004 _cphlde +4008 _divHLBy10 +400c _divHLbyA +4010 _kbdScan +4014 _getcsc +4018 _coorMon +401b _mon +401e _monForceKey +4021 _sendKPress +4024 _JforceCmdNoChaR +4027 _JforceCmd +402a _sysErrHandler +402e _newContext +4032 _newContext0 +4036 _A2PointHLind +403a _PointHLind +403e _PPutAwayPrompt +4042 _PPutAway +4046 _PutAway +404a _SizeWind +404e _ErrorEP +4052 _callMain +4056 _monErrHand +405a _appInit +405e _appInitIfDec +4062 _Initialize +4066 _lcd_busy +406a _Min +406e _Max +4072 _AbsO1PAbsO2 +4076 _Intgr +407a _Trunc +407e _InvSub +4082 _Times2 +4086 _Plus1 +408a _Minus1 +408e _FPSub +4092 _FPAdd +4096 _DToR +409a _RToD +409e _Cube +40a2 _TimesPt5 +40a6 _FPSquare +40aa _FPMult +40ae _LJRnd +40b2 _InvOP1SC +40b6 _InvOP1S +40ba _InvOP2S +40be _Frac +40c2 _FPRecip +40c6 _FPDiv +40ca _SqRoot +40ce _RndGuard +40d2 _RnFx +40d6 _Int +40da _Round +40de _LnX +40e2 _LogX +40e6 _LJNoRnd +40ea _EToX +40ee _TenX +40f2 _SinCosRad +40f6 _Sin +40fa _Cos +40fe _Tan +4102 _SinHCosH +4106 _TanH +410a _CosH +410e _SinH +4112 _ACosRad +4116 _ATanRad +411a _ATan2Rad +411e _ASinRad +4122 _ACos +4126 _ATan +412a _ASin +412e _ATan2 +4132 _ATanH +4136 _ASinH +413a _ACosH +413e _PToR +4142 _RToP +4146 _HLTimes9 +414a _CkOP1Cplx +414e _CkOP1Real +4152 _Angle +4156 _COP1Set0 +415a _CpOP4OP3 +415e _Mov9OP2Cp +4162 _AbsO1O2Cp +4166 _CpOP1OP2 +416a _OP3ToOP4 +416e _OP1ToOP4 +4172 _OP2ToOP4 +4176 _OP4ToOP2 +417a _OP3ToOP2 +417e _OP1ToOP3 +4182 _OP5ToOP2 +4186 _OP5ToOP6 +418a _OP5ToOP4 +418e _OP1ToOP2 +4192 _OP6ToOP2 +4196 _OP6ToOP1 +419a _OP4ToOP1 +419e _OP5ToOP1 +41a2 _OP3ToOP1 +41a6 _OP6ToOP5 +41aa _OP4ToOP5 +41ae _OP3ToOP5 +41b2 _OP2ToOP5 +41b6 _OP2ToOP6 +41ba _OP1ToOP6 +41be _OP1ToOP5 +41c2 _OP2ToOP1 +41c6 _MovREG +41ca _Mov10B +41ce _Mov9B +41d2 _Mov18 +41d6 _Mov8B +41da _Mov7B +41de _Mov14 +41e2 _Mov6B +41e6 _Mov5B +41ea _Mov4B +41ee _Mov3B +41f2 _Mov2B +41f6 _OP2ToOP3 +41fa _OP4ToOP3 +41fe _OP5ToOP3 +4202 _OP4ToOP6 +4206 _Mov9ToOP1 +420a _Mov9OP1OP2 +420e _Mov9ToOP2 +4212 _MovFrOP1 +4216 _OP4Set1 +421a _OP3Set1 +421e _OP2Set8 +4222 _OP2Set5 +4226 _OP2SetA +422a _OP2Set4 +422e _OP2Set3 +4232 _OP1Set1 +4236 _OP1Set4 +423a _OP1Set3 +423e _OP3Set2 +4242 _OP1Set2 +4246 _OP2Set2 +424a _SetNum2 +424e _SetMant1 +4252 _OP2Set1 +4256 _SetNum1 +425a _SetNum +425e _SetNumA +4262 _SetMant +4266 _Zero16D +426a _Set16A +426e _Set14A +4272 _Set14D +4276 _OP5Set0 +427a _OP4Set0 +427e _OP3Set0 +4282 _OP2Set0 +4286 _OP1Set0 +428a _SetNum0 +428e _ZeroOP1 +4292 _ZeroOP2 +4296 _ZeroOP3 +429a _ZeroOP +429e _ClrLp +42a2 _ShRAcc +42a6 _ShLAcc +42aa _ShR18 +42ae _ShR18A +42b2 _ShR16 +42b6 _ShR14 +42ba _ShL16 +42be _ShL14 +42c2 _SRDO1 +42c6 _SHRDRND +42ca _MANTPA +42ce _ADDPROP +42d2 _ADDPROPLP +42d6 _Add16D +42da _Add14D +42de _Sub16D +42e2 _Sub14D +42e6 _OP2ExOP6 +42ea _OP5ExOP6 +42ee _OP1ExOP5 +42f2 _OP1ExOP6 +42f6 _OP2ExOP4 +42fa _OP2ExOP5 +42fe _OP1ExOP3 +4302 _OP1ExOP4 +4306 _OP1ExOP2 +430a _ExLp +430e _CkOP1C0 +4312 _CkOP1FP0 +4316 _CkOP2FP0 +431a _PosNo0Int +431e _CkPosInt +4322 _CkInt +4326 _CkOdd +432a _CkOP1M +432e _GetCon1 +4332 _GetCon +4336 _PIDIV2 +433a _PIDIV4 +433e _TWOPI +4342 _PICON +4346 _PIDIV4A +434a _PIDIV2A +434e _ExpToHex +4352 _OP1ExpToDec +4356 _CkOP2Pos +435a _CkOP1Pos +435e _ClrOP2S +4362 _ClrOP1S +4366 _FDiv100 +436a _FDiv10 +436e _DecO1Exp +4372 _IncO1Exp +4376 _IncExp +437a _CkValidNum +437e _GetExp +4382 _HTimesL +4386 _EOP1NotReal +438a _ThetaName +438e _RName +4392 _RegEqName +4396 _RecurNName +439a _XName +439e _YName +43a2 _TName +43a6 _RealName +43aa _SETesTOfps +43ae _ChkTempDirt +43b2 _OP1MOP2Exp +43b6 _OP1EXPMDE +43ba _ChkErrBreak +43be _IsA2ByteTok +43c2 _GetLastEntry +43c6 _GetLastEntryPtr +43ca _REGRCLRCHNG +43ce _ResetWinTop +43d2 _SetYUp +43d6 _SetXUp +43da _ISO1NONTLSTorPROG +43de _ISO1NONTEMPLST +43e2 _IS_A_LSTorCLST +43e6 _Chk_HL_999 +43ea _EQU_or_NEWEQU +43ee _GET_PLUS1_SAVE +43f2 _ErrD_OP1NotPos +43f6 _ErrD_OP1Not_R +43fa _ErrD_OP1NotPosInt +43fe _ErrD_OP1_LE_0 +4402 _ErrD_OP1_0 +4406 _Findsym_Get_Size +440a _Sto_StatVar +440e _Rcl_StatVar +4412 _CkOP2Real +4416 _Get_X_Indirect +441a _MemChk +441e _CmpPrgNamLen1 +4422 _CmpPrgNamLen +4426 _FindProgSym +442a _ChkFindSym +442e _FindSym +4432 _InsertMem +4436 _InsertMemA +443a _EnoughMem +443e _CmpMemNeed +4442 _CREATEPVAR4 +4446 _CREATEPVAR3 +444a _CREATEVAR3 +444e _CreateCplx +4452 _CreateReal +4456 _CreateTRList +445a _CreateRList +445e _CreateTCList +4462 _CreateCList +4466 _CreateTRMat +446a _CreateRMat +446e _CreateTStrng +4472 _CreateStrng +4476 _Create0Equ +447a _CreateTEqu +447e _CreateEqu +4482 _CreatePict +4486 _CreateGDB +448a _CreateProg +448e _ChkDel +4492 _ChkDelA +4496 _AdjParser +449a _AdjMath +449e _AdjM7 +44a2 _DelMemA +44a6 _Get_Form_Num +44aa _DelVar +44ae _DelVarIO +44b2 _DelMem +44b6 _DelVar3D +44ba _DelVar3C +44be _DelVar3DC +44c2 _Sym_Prog_Non_T_Lst +44c6 _AdjSymPtrs +44ca _DataSizeA +44ce _DataSize +44d2 _PopMCplxO1 +44d6 _PopMCplx +44da _MovCplx +44de _PopOP5 +44e2 _PopOP3 +44e6 _PopOP1 +44ea _PopRealO6 +44ee _PopRealO5 +44f2 _PopRealO4 +44f6 _PopRealO3 +44fa _PopRealO2 +44fe _PopRealO1 +4502 _PopReal +4506 _FPopCplx +450a _FPopReal +450e _FPopFPS +4512 _DeallocFPS +4516 _DeallocFPS1 +451a _AllocFPS +451e _AllocFPS1 +4522 _PushRealO6 +4526 _PushRealO5 +452a _PushRealO4 +452e _PushRealO3 +4532 _PushRealO2 +4536 _PushRealO1 +453a _PushReal +453e _PushOP5 +4542 _PushOP3 +4546 _PushMCplxO3 +454a _PushOP1 +454e _PushMCplxO1 +4552 _PushMCplx +4556 _ExMCplxO1 +455a _Exch9 +455e _CpyTo1FPS11 +4562 _CpyTo2FPS5 +4566 _CpyTo1FPS5 +456a _CpyTo2FPS6 +456e _CpyTo1FPS6 +4572 _CpyTo2FPS7 +4576 _CpyTo1FPS7 +457a _CpyTo1FPS8 +457e _CpyTo2FPS8 +4582 _CpyTo1FPS10 +4586 _CpyTo1FPS9 +458a _CpyTo2FPS4 +458e _CpyTo6FPS3 +4592 _CpyTo6FPS2 +4596 _CpyTo2FPS3 +459a _CpyCTo1FPS3 +459e _CpyTo1FPS3 +45a2 _CpyFPS3 +45a6 _CpyTo1FPS4 +45aa _CpyTo3FPS2 +45ae _CpyTo5FPST +45b2 _CpyTo6FPST +45b6 _CpyTo4FPST +45ba _CpyTo3FPST +45be _CpyTo2FPST +45c2 _CpyTo1FPST +45c6 _CpyFPST +45ca _CpySTACK +45ce _CpyTo3FPS1 +45d2 _CpyTo2FPS1 +45d6 _CpyTo1FPS1 +45da _CpyFPS1 +45de _CpyTo2FPS2 +45e2 _CpyTo1FPS2 +45e6 _CpyFPS2 +45ea _CpyO3ToFPST +45ee _CpyO2ToFPST +45f2 _CpyO6ToFPST +45f6 _CpyO1ToFPST +45fa _CpyToFPST +45fe _CpyToSTACK +4602 _CpyO3ToFPS1 +4606 _CpyO5ToFPS1 +460a _CpyO2ToFPS1 +460e _CpyO1ToFPS1 +4612 _CpyToFPS1 +4616 _CpyO2ToFPS2 +461a _CpyO3ToFPS2 +461e _CpyO6ToFPS2 +4622 _CpyO1ToFPS2 +4626 _CpyToFPS2 +462a _CpyO5ToFPS3 +462e _CpyO2ToFPS3 +4632 _CpyO1ToFPS3 +4636 _CpyToFPS3 +463a _CpyO1ToFPS6 +463e _CpyO1ToFPS7 +4642 _CpyO1ToFPS5 +4646 _CpyO2ToFPS4 +464a _CpyO1ToFPS4 +464e _ErrNotEnoughMem +4652 _FPSMinus9 +4656 _HLMinus9 +465a _ErrOverflow +465d _ErrDivBy0 +4660 _ErrSingularMat +4663 _ErrDomain +4666 _ErrIncrement +4669 _ErrNon_Real +466c _ErrSyntax +466f _ErrDataType +4672 _ErrArgument +4675 _ErrDimMismatch +4678 _ErrDimension +467b _ErrUndefined +467e _ErrMemory +4681 _ErrInvalid +4684 _ErrBreak +4687 _ErrStat +468a _ErrSignChange +468d _ErrIterations +4690 _ErrBadGuess +4693 _ErrTolTooSmall +4696 _ErrStatPlot +4699 _ErrLinkXmit +469c _JError +469f _JErrorNo +46a2 _noErrorEntry +46a5 _pushErrorHandlER +46a9 _popErrorHandleR +46ad _strCopy +46b1 _strCat +46b5 _isInSet +46b9 _sDone +46bd _serrort +46c1 _sNameEq +46c5 _sUnderScr +46c9 _sFAIL +46cd _sName +46d1 _sOK +46d5 _seqn +46d9 _Sselect +46dd _STransmit +46e1 _SRECURN +46e5 _GEQNAMEA +46e9 _RECNAME +46ed ___bank_call +46f1 ___bank_ret +46f5 ___bank_jump +46f9 ___bank_entry +46fd _ReadDisp2 +4701 _putmap +4705 _putc +4709 _dispHL +470d _puts +4711 _putpsb +4715 _putps +4719 _wputps +471d _putbuf +4721 _putbuf1 +4725 _wputc +4729 _wputs +472d _wputsEOL +4731 _wdispEOL +4735 _whomeUp +4739 _setNumWindow +473d _newline +4741 _moveDown +4745 _scrollUp +4749 _shrinkWindow +474d _moveUp +4751 _scrollDown +4755 _clrLCDFull +4759 _clrLCD +475d _clrScrnFull +4761 _clrScrn +4765 _clrTxtShd +4769 _clrWindow +476d _eraseEOL +4771 _eraseEOW +4775 _homeUp +4779 _getcurloc +477d _vputmap +4781 _vputs +4785 _vputsn +4789 _vputsnG +478d _vputsnT +4791 _runIndicOn +4795 _runIndicOff +4799 _saveCmdShadow +479d _saveShadow +47a1 _rstrShadow +47a5 _rstrpartial +47a9 _rstrCurRow +47ad _rstrUnderMenu +47b1 _rstrbotrow +47b5 _saveTR +47b9 _restoreTR +47bd _GetKeyPress +47c1 _GetTokLen +47c5 _Get_Tok_Strng +47c9 _GetTokString +47cd _PUTBPATBUF2 +47d1 _PUTBPATBUF +47d5 _putbPAT +47d9 _putcCheckScrolL +47dd _dispEOL +47e1 _fdispEOL +47e5 _MAKEROWCMD +47e9 _TOTOSTRP +47ed _SETVARNAME +47f1 _dispDone +47f5 _finishoutput +47f9 _curBlink +47fd _cursorOff +4801 _hideCursor +4805 _cursorOn +4809 _showCursor +480d _KeyToString +4811 _PullDownChk +4815 _MenuCatCommon +4819 _ZIfCatalog +481d _ZIfMatrixMenu +4821 _loadCurCat +4825 _NCifprgmedmode +4829 _LoadMenuNum +482d _LoadMenuNumL +4831 _MenuEdKey +4835 _MenCatRet +4839 _notalphnum +483d _SaveSavedFlags +4841 _SetMenuFlags +4845 _RstrSomeFlags +4849 _RstrSmallText +484d _dispListName +4851 _SeeIfErrorCx +4855 _RstrOScreen +4859 _SaveOscreen +485d _DispLAlphaName +4861 _AbortPrgmode +4865 _Is_FullCntx +4869 _AdrMRow +486d _AdrMEle +4871 _GetMatOP1A +4875 _GetM1ToOP1 +4879 _GetM1TOP1A +487d _GetMToOP1 +4881 _PutToM1A +4885 _PutToMA1 +4889 _PutToMat +488d _Mat_El_Div +4891 _CMatFun +4895 _RowEch_Poly +4899 _RowEchelon +489d _AdrLEle +48a1 _GetL1ToOP1 +48a5 _GetL1TOP1A +48a9 _GetLToOP1 +48ad _GetL1ToOP2 +48b1 _GetL1TOP2A +48b5 _GetL2TOP1A +48b9 _PutToLA1 +48bd _PutToL +48c1 _MaxMinLst +48c5 _LLow +48c9 _LHigh +48cd _LSum +48d1 _CumSum +48d5 _ToFrac +48d9 _SeqSet +48dd _SeqSolve +48e1 _Cmp_Num_Init +48e5 _BinOpExec +48e9 _EXMEAN1 +48ed _SET2MVLPTRS +48f1 _SETMAT1 +48f5 _CreateTList +48f9 _UnOpExec +48fd _ThreeExec +4901 _RestoreErrNo +4904 _FourExec +4908 _FiveExec +490c _CpyTo2ES1 +4910 _CpyTo6ES1 +4914 _CpyTo1ES1 +4918 _CpyTo3ES1 +491c _CpyTo3ES2 +4920 _CpyTo2ES2 +4924 _CpyTo1ES2 +4928 _CpyTo2ES3 +492c _CpyTo1ES3 +4930 _CpyTo3ES4 +4934 _CpyTo6ES3 +4938 _CpyTo2ES4 +493c _CpyTo1ES4 +4940 _CpyTo2ES5 +4944 _CpyTo1ES5 +4948 _CpyTo4EST +494c _CpyTo2EST +4950 _CpyTo1EST +4954 _CpyTo2ES6 +4958 _CpyTo1ES6 +495c _CpyTo2ES7 +4960 _CpyTo1ES7 +4964 _CpyTo2ES8 +4968 _CpyTo1ES8 +496c _CpyTo1ES9 +4970 _CpyTo2ES9 +4974 _CpyTo2ES10 +4978 _CpyTo1ES10 +497c _CpyTo2ES11 +4980 _CpyTo1ES11 +4984 _CpyTo2ES12 +4988 _CpyTo1ES12 +498c _CpyTo2ES13 +4990 _CpyTo1ES13 +4994 _CpyTo1ES14 +4998 _CpyTo1ES16 +499c _CpyTo1ES17 +49a0 _CpyTo1ES18 +49a4 _CpyTo1ES15 +49a8 _CpyTo2ES15 +49ac _CpyO1ToEST +49b0 _CpyO1ToES1 +49b4 _CpyO6ToES1 +49b8 _CpyO6ToES3 +49bc _CpyO1ToES2 +49c0 _CpyO2ToES2 +49c4 _CpyO1ToES3 +49c8 _CpyO1ToES4 +49cc _CpyO1ToES5 +49d0 _CpyO1ToES6 +49d4 _CpyO1ToES7 +49d8 _CpyO2ToES4 +49dc _CpyO2ToES5 +49e0 _CpyO2ToES6 +49e4 _CpyO2ToES7 +49e8 _CpyO2ToES8 +49ec _CpyO2ToES9 +49f0 _CpyO1ToES8 +49f4 _CpyO1ToES9 +49f8 _CpyO1ToES10 +49fc _CpyO1ToES11 +4a00 _CpyO1ToES12 +4a04 _CpyO1ToES13 +4a08 _CpyO1ToES14 +4a0c _CpyO1ToES15 +4a10 _EVALF3A +4a14 COMPLEX_EXEC +4a18 _GetK +4a1c _setTitlE +4a20 _dispVarVal +4a24 _RecallEd +4a28 _setupBuffer +4a2c _createNumEditBUF +4a30 _CallCommon +4a34 _CommonKeys +4a37 _Leftmore +4a3a _fDel +4a3e _fClear +4a42 _finsDisp +4a45 _FinsDisp02 +4a49 _setIndicator +4a4d _CloseEditBufNo +4a51 _releaseBuffer +4a55 _varnameToOP1hl +4a59 _nameToOP1 +4a5d _numPPutAway +4a61 _numRedisp +4a65 _numError02 +4a68 _Load_SFont +4a6c _SFont_Len +4a70 _InitNumVec +4a74 _SetXXOP1 +4a78 _SetXXOP2 +4a7c _SetXXXXOP2 +4a80 _UCLineS +4a84 _CLine +4a88 _CLineS +4a8c _XRooty +4a90 _YToX +4a94 _ZmStats +4a98 _POINT_STAT_HLP +4a9c _DRAWSPLOT +4aa0 _INITNEWTRACEP +4aa4 _SPLOTCOORD +4aa8 _SPLOTRIGHT +4aac _SPLOTLEFT +4ab0 _CMPBOXINFO +4ab4 _NEXTPLOT +4ab8 _PREVPLOT +4abc _CLRPREVPLOT +4ac0 _PUT_INDEX_LST +4ac4 _GET_INDEX_LST +4ac8 _HEAP_SORT +4acc _STOGDB2 +4ad0 _RCLGDB2 +4ad4 _CircCmd +4ad8 _GrphCirc +4adc _Mov18B +4ae0 _DarkLine +4ae4 _ILine +4ae8 _IPoint +4aec _XYRndBoth +4af0 _XYRnd +4af4 _CheckTOP +4af8 _CheckXY +4afc _DarkPnt +4b00 _CPointS +4b04 _WtoV +4b08 _VtoWHLDE +4b0c _XItoF +4b10 _YFtoI +4b14 _XFtoI +4b18 _TraceOff +4b1c _GrRedisp +4b20 _GDispToken +4b24 _GRDECODA +4b28 _LABCOOR +4b2c _COORDISP +4b30 _TMPEQUNOSRC +4b34 _GrLabels +4b38 _YPixSet +4b3c _XPixSet +4b40 _CopyRng +4b44 _VALCUR +4b48 _GrPutAway +4b4c _RstGFlags +4b50 _GRReset +4b54 _XYCent +4b58 _ZoomXYCmd +4b5c _CPTDELY +4b60 _CPTDELX +4b64 _SetFuncM +4b68 _SetSeqM +4b6c _SetPolM +4b70 _SetParM +4b74 _ZmInt +4b78 _ZmDecml +4b7c _ZmPrev +4b80 _ZmUsr +4b84 _SetUZm +4b88 _ZmFit +4b8c _ZmSquare +4b90 _ZmTrig +4b94 _SetXMinMax +4b98 _ZooDefault +4b9c _GrBufCpy +4ba0 _DrawSplitLine +4ba4 _RestoreDisp +4ba8 _FNDDB +4bac _ALLEQ +4bb0 _fndallseleq +4bb4 _NEXTEQ +4bb8 _PREVEQ +4bbc _BlinkGCur +4bc0 _NBCURSOR +4bc4 _StatMark +4bc8 _ChkTextCurs +4bcc _Regraph +4bd0 _DOREFFLAGS02 +4bd4 _InitNSeq +4bd8 _YRES +4bdc _PLOTPTXY2 +4be0 _Ceiling +4be4 _PutXY +4be7 _Putequno +4beb _PDspGrph +4bef _HorizCmd +4bf3 _VertCmd +4bf7 _LineCmd +4bfb _UnLineCmd +4bff _PointCmd +4c03 _PixelTest +4c07 _PixelCmd +4c0b _TanLnF +4c0f _DrawCmd_Init +4c13 _DrawCmd +4c17 _ShadeCmd +4c1b _InvCmd +4c1f _StatShade +4c23 _dspmattable +4c27 _dsplsts +4c2b _closeEditBuf +4c2f _parseEditBuf +4c33 _putsm +4c37 _DspCurTbl +4c3b _DspGrTbl +4c3f _ZeroTemplate +4c43 _settblrefs +4c47 _dispTblBot +4c4b _DispTblTop +4c4f _dispTblbody +4c53 _VPutBlank +4c57 _TblTrace +4c5b _dispListNameY +4c5f _CurNameLength +4c63 _NameToBuf +4c67 _jpromptcursor +4c6a _bufLeft +4c6e _bufRight +4c72 _bufInsert +4c76 _bufQueueChar +4c7a _bufReplace +4c7e _bufDelete +4c82 _bufPeek +4c86 _bufPeek1 +4c8a _bufPeek2 +4c8e _bufPeek3 +4c92 _BufToBtm +4c96 _setupEditEqu +4c9a _bufToTop +4c9e _isEditFull +4ca2 _isEditEmpty +4ca6 _isAtTop +4caa _isAtBtm +4cae _bufClear +4cb2 _JcursorFirst +4cb5 _JcursorLast +4cb8 _cursorLeft +4cbc _JcursorRight +4cbf _JcursorUp +4cc2 _cursorDown +4cc6 _cursorToOffset +4cca _insDisp +4cce _FDISPBOL1 +4cd2 _FDISPBOL +4cd6 _dispEOW +4cda _dispHead +4cde _dispTail +4ce2 _PutTokString +4ce6 _setupEditCmd +4cea _setEmptyEditEqU +4cee _setEmptyEditPtR +4cf2 _closeEditEqu +4cf6 _toggleIns +4cfa _GetPrevTok +4cfe _getkey +4d02 _canIndic +4d06 _LCD_DriverOn +4d0a _DFMIN2 +4d0e _formDisp +4d12 _formMatrix +4d16 _wscrollLeft +4d1a _wscrollUp +4d1e _wscrollDown +4d22 _wscrollRight +4d26 _formEReal +4d2a _formERealTOK +4d2e _formDCplx +4d32 _formReal +4d36 _formScrollUp +4d3a _setwinabove +4d3e _disarmScroll +4d42 _OP1toEdit +4d46 _MinToEdit +4d4a _rclVarToEdit +4d4e _rclVarToEditPtR +4d52 _RclEntryToEdit +4d56 _rclToQueue +4d5a _FormToTok +4d5e _Disp_Interval +4d62 _DisplstName +4d66 _dispSLstNameHL +4d6a _EditEqu +4d6e _closeEquField +4d72 _AutoSelect +4d76 _DISPYEOS +4d7a _dispNumEOS +4d7e _setupdispeq +4d82 _dispForward +4d86 _DispYPrompt2 +4d8a _stringwidth +4d8e _dispErrorScreeN +4d92 _PopCx +4d96 _loadnoeentry +4d9a _SaveScreen +4d9e _RetScreen +4da2 _RetScreenErr +4da6 _SplitChange +4daa _SolveRedisp +4dae _SolveDisp +4db2 _itemName +4db6 _SetNorm_Vals +4dba _SetVert_Vals +4dbe _ConvKeyToTok +4dc2 _KeyToTokNew2B +4dc6 _KeyToTok2Byte +4dca _TokToKey +4dce _Load_LFont +4dd2 _Send1BErr +4dd6 _GetVarCmd +4dda _SendVarCmd +4dde _PrintScreen +4de2 _KeyScnLnk +4de6 _IOResetAll +4dea _DelRes +4dee _ConvLCtoLR +4df2 _RedimMat +4df6 _IncLstSize +4dfa _insertlist +4dfe _dellistel +4e02 _EditProg +4e06 _CloseProg +4e0a _ClrGraphRef +4e0e _FixTempCnt +4e12 _SaveData +4e16 _RestoreData +4e1a _FindAlphaup +4e1e _FindAlphadn +4e22 _CmpSyms +4e26 _CreateTemp +4e2a _CleanAll +4e2e _MoveToNextSym +4e32 _ConvLRtoLC +4e36 _TblScreenDn +4e3a _TblScreenUp +4e3e _ScreenUp +4e42 _ScreenUpDown +4e46 _ZifRclHandler +4e4a _zifrclkapp +4e4e _rclkeyRtn +4e52 _RclKey +4e55 _RclRegEq_Call +4e59 _RclRegEq +4e5c _initNamePrompt +4e60 _NamePrompt2 +4e64 _CatalogChk +4e68 _clrTR +4e6c _Quad +4e70 _GraphQuad +4e74 _BC2NonReal +4e78 _ErrNonReal +4e7c _Write_Text +4e80 _FORSEQINIT +4e84 _GrphPars +4e88 _PlotPars +4e8c _PARSEinp +4e90 _PARSEOFF +4e94 _PARSESCAN +4e98 _GetParse +4e9c _SaveParse +4ea0 _InitPFlgs +4ea4 _CkEndLinErr +4ea8 _OP2Set60 +4eac _GetStatPtr +4eb0 _Cmp_StatPtr +4eb4 _VarSysAdr +4eb8 _StoSysTok +4ebc _StoAns +4ec0 _StoTheta +4ec4 _StoR +4ec8 _StoY +4ecc _StoN +4ed0 _StoT +4ed4 _StoX +4ed8 _StoOther +4edc _RCLANS +4ee0 _RclY +4ee4 _RclN +4ee8 _RclX +4eec _RclVarSym +4ef0 _RclSysTok +4ef4 _StMatEl +4ef8 _StLstVecEl +4efc _ConvOP1 +4f00 _isaletter +4f04 _Find_Parse_ForMULA +4f08 _Parse_Formula +4f0c _StrngEnt1 +4f15 _GetNumLet +4f1e _Init_Prog_List +4f27 _PRGRDLP +4f30 _VarEnt +4f39 _RclStat +4f42 _ParseLoop +4f4b _ParseOnC +4f52 _ParseOn +4f5a _ParseCmd +4f61 _StoType +4f6a _CreatePair +4f73 _PushNum +4f7c _IncCurPCErrEnd +4f85 _ErrEnd +4f8e _CommaErrF +4f97 _CommaErr +4fa0 _StEqArg2 +4fa9 _StEqArg +4fb2 _InpArg +4fbb _StEqArg3 +4fc4 _NxtFetch +4fcd _CkFetchVar +4fd6 _FetchVarA +4fdf PARSER_EXEC +4fe3 _FetchVar +4fec _CkEndLin +4ff5 _CkEndExp +4ffe _CkParsEnd +5007 _StoTypeArg +5010 _ConvDim +5019 _ConvDim00 +5022 _AheadEqual +502b _ParsAheadS +5034 _ParsAhead +503d _AnsName +5046 _StoCmpReals +504f _GetDEPtr +5058 _Push2BOper +5061 _Pop2BOper +506a _PushOper +5073 _PopOper +507c _Find_E_Undef +5085 _StTmpEq +508e _FindEOL +5097 _BrkInc +50a0 _IncFetch +50a9 _CurFetch +50b2 PGMIO_EXEC +50b6 _Random +50ba _StoRand +50be _RandInit +50c2 _resetStacks +50c6 _Factorial +50ca _YOnOff +50ce _EqSelUnsel +50d2 _ITSOLVER +50d6 _GRITSOLVER +50da _ITSOLVERB +50de _ITSOLVERNB +50e2 _ExTest_INT +50e6 _Dist_Fun +50ea _LogGamma +50ee _OneVar +50f2 _OneVarS_0 +50f6 _ORDSTAT +50fa _INITSTATANS2 +50fe _ANOVA_SPEC +5102 _EXEC_ASSEMBLY +5106 _outputExpr +510a _CentCursor +5113 _Text +511c _FINISHSPEC +5125 _TRCYFUNC +512e _Rcl_Seq_X +5137 _RclSeq2 +5140 _GRPPutAway +5149 _CkValDelX +5152 _CkValDelta +515b _GrBufClr +5164 _GrBufCpy_V +516d _FndSelEq +5176 _ClrGraphXY +517f _Next_Y_Style +5188 GRAPH_EXEC +518c _PLOTPT +5195 _NEWINDEP +519e _Axes +51a7 _setPenX +51b0 _setPenY +51b9 _setPenT +51c2 _Tan_Equ_Disp +51cb _putAns +51d4 _DispOP1A +51dd _MathTanLn +51e6 _EndDraw +51ef IO_EXEC +52e5 EXECUTE_Z80 + +[flags] +00 kbdFlags +2,00 trigDeg,trigFlags +3,00 kbdSCR,kbdFlags +4,00 kbdKeyPress,kbdFlags +01 editFlags +2,01 editOpen,editFlags +4,01 monAbandon,monFlags +02 plotFlags +1,02 plotLoc,plotFlags +2,02 plotDisp,plotFlags +4,02 grfFuncM,grfModeFlags +5,02 grfPolarM,grfModeFlags +6,02 grfParamM,grfModeFlags +7,02 grfRecurM,grfModeFlags +03 graphFlags +0,03 graphDraw,graphFlags +2,03 graphCursor,graphFlags +04 grfDBFlags +0,04 grfDot,grfDBFlags +1,04 grfSimul,grfDBFlags +2,04 grfGrid,grfDBFlags +3,04 grfPolar,grfDBFlags +4,04 grfNoCoord,grfDBFlags +5,04 grfNoAxis,grfDBFlags +6,04 grfLabel,grfDBFlags +05 textFlags +1,05 textEraseBelow,textFlags +2,05 textScrolled,textFlags +3,05 textInverse,textFlags +08 apdFlags +2,08 apdAble,apdFlags +3,08 apdRunning,apdFlags +09 onFlags +3,09 onRunnings,onFlags +4,09 onInterrupt,onFlags +6,09 statsValid,statFlags +10 fmtFlags +0,0A fmtExponent,fmtFlags +1,0A fmtEng,fmtFlags +5,0A fmtReal,fmtFlags +6,0A fmtRect,fmtFlags +7,0A fmtPolar,fmtFlags +0c curFlags +2,0C curAble,curFlags +3,0C curOn,curFlags +4,0C curLock,curFlags +0d appFlags +1,0D appTextSave,appFlags +2,0D appAutoScroll,appFlags +11 plotFlag2 +3,11 expr_param,plotFlag2 +4,11 expr_writing,plotFlag2 +12 indicFlags +0,12 indicRun,indicFlags +1,12 indicInUse,indicFlags +2,12 indicOnly,indicFlags +3,12 shift2nd,shiftFlags +4,12 shiftAlpha,shiftFlags +6,12 shiftALock,shiftFlags +13 tblFlags +4,13 AutoFill,tblFlags +5,13 AutoCalc,tblFlags +14 sGrFlags +0,14 grfSplit,sGrFlags +1,14 VertSplit,sGrFlags +2,14 grfSChanged,sGrFlags +3,14 grfSplitOverride,sGrFlags +4,14 write_on_graph,sGrFlags +6,14 cmp_mod_box,sGrFlags +7,14 textWrite,sGrFlags +15 newIndicFlags +1,15 saIndic,newIndicFlags +0,1D gkKeyRepeating,gkFlag +21 asm_flag1 +22 asm_flag1 +23 asm_flag1 diff --git a/tool/tilem-src/data/symbols/ti83p.sym b/tool/tilem-src/data/symbols/ti83p.sym new file mode 100644 index 0000000..086215a --- /dev/null +++ b/tool/tilem-src/data/symbols/ti83p.sym @@ -0,0 +1,2327 @@ +[macros] +0EF B_CALL~%c +0CD5000 B_JUMP~%c +0EDED DB~$ED,$ED,%b,%b + +[labels] +0008 rOP1TOOP2 +000B LCD_BUSY_QUICK +0010 rFINDSYM +0018 rPUSHREALO1 +0020 rMOV9TOOP1 +0028 rBR_CALL +0030 rFPADD +0050 BRT_JUMP0 +0059 APP_PUSH_ERRORH +005C APP_POP_ERRORH + +[romcalls] +4000 JErrorNo +4003 FontHook +4006 LocalizeHook +4009 LdHLind +400c CpHLDE +400f DivHLBy10 +4012 DivHLByA +4015 KbdScan +4018 GetCSC +401b coorMon +401e Mon +4021 monForceKey +4024 SendKPress +4027 JForceCmdNoChar +402a JForceCmd +402d sysErrHandler +4030 newContext +4033 newContext0 +4036 PPutAwayPrompt +4039 PPutAway +403c PutAway +403f SizeWind +4042 ErrorEP +4045 callMain +4048 monErrHand +404b AppInit +404e initialize +4051 LCD_BUSY +4054 Min +4057 Max +405a AbsO1PAbsO2 +405d Intgr +4060 Trunc +4063 InvSub +4066 Times2 +4069 Plus1 +406c Minus1 +406f FPSub +4072 FPAdd +4075 DToR +4078 RToD +407b Cube +407e TimesPt5 +4081 FPSquare +4084 FPMult +4087 LJRnd +408a InvOP1SC +408d InvOP1S +4090 InvOP2S +4093 Frac +4096 FPRecip +4099 FPDiv +409c SqRoot +409f RndGuard +40a2 RnFx +40a5 Int +40a8 Round +40ab LnX +40ae LogX +40b1 LJNoRnd +40b4 EToX +40b7 TenX +40ba SinCosRad +40bd Sin +40c0 Cos +40c3 Tan +40c6 SinHCosH +40c9 TanH +40cc CosH +40cf SinH +40d2 ACosRad +40d5 ATanRad +40d8 ATan2Rad +40db ASinRad +40de ACos +40e1 ATan +40e4 ASin +40e7 ATan2 +40ea ATanH +40ed ASinH +40f0 ACosH +40f3 PToR +40f6 RToP +40f9 HLTimes9 +40fc CkOP1Cplx +40ff CkOP1Real +4102 Angle +4105 COP1Set0 +4108 CpOP4OP3 +410b Mov9OP2Cp +410e AbsO1O2Cp +4111 CpOP1OP2 +4114 OP3ToOP4 +4117 OP1ToOP4 +411a OP2ToOP4 +411d OP4ToOP2 +4120 OP3ToOP2 +4123 OP1ToOP3 +4126 OP5ToOP2 +4129 OP5ToOP6 +412c OP5ToOP4 +412f OP1ToOP2 +4132 OP6ToOP2 +4135 OP6ToOP1 +4138 OP4ToOP1 +413b OP5ToOP1 +413e OP3ToOP1 +4141 OP6ToOP5 +4144 OP4ToOP5 +4147 OP3ToOP5 +414a OP2ToOP5 +414d OP2ToOP6 +4150 OP1ToOP6 +4153 OP1ToOP5 +4156 OP2ToOP1 +4159 Mov11B +415c Mov10B +415f Mov9B +4162 Mov18 +4165 Mov8B +4168 Mov7B +416b Mov14 +416e OP2ToOP3 +4171 OP4ToOP3 +4174 OP5ToOP3 +4177 OP4ToOP6 +417a Mov9ToOP1 +417d Mov9OP1OP2 +4180 Mov9ToOP2 +4183 MovFrOP1 +4186 OP4Set1 +4189 OP3Set1 +418c OP2Set8 +418f OP2Set5 +4192 OP2SetA +4195 OP2Set4 +4198 OP2Set3 +419b OP1Set1 +419e OP1Set4 +41a1 OP1Set3 +41a4 OP3Set2 +41a7 OP1Set2 +41aa OP2Set2 +41ad OP2Set1 +41b0 Zero16D +41b3 OP5Set0 +41b6 OP4Set0 +41b9 OP3Set0 +41bc OP2Set0 +41bf OP1Set0 +41c2 SetNum0 +41c5 ZeroOP1 +41c8 ZeroOP2 +41cb ZeroOP3 +41ce ZeroOP +41d1 ClrLp +41d4 ShRAcc +41d7 ShLAcc +41da ShR18 +41dd ShR18A +41e0 ShR16 +41e3 ShR14 +41e6 ShL16 +41e9 ShL14 +41ec SRDO1 +41ef ShRDRnd +41f2 MantPA +41f5 ADDPROP +41f8 ADDPROPLP +41fb Add16D +41fe Add14D +4201 Sub16D +4204 Sub14D +4207 OP2ExOP6 +420a OP5ExOP6 +420d OP1ExOP5 +4210 OP1ExOP6 +4213 OP2ExOP4 +4216 OP2ExOP5 +4219 OP1ExOP3 +421c OP1ExOP4 +421f OP1ExOP2 +4222 ExLp +4225 CkOP1C0 +4228 CkOP1FP0 +422b CkOP2FP0 +422e PosNo0Int +4231 CkPosInt +4234 CkInt +4237 CkOdd +423a CkOP1M +423d GetConOP1 +4240 GetConOP2 +4243 PIDIV2 +4246 PIDIV4 +4249 TWOPI +424c PICON +424f ExpToHex +4252 OP1ExpToDec +4255 CkOP2Pos +4258 CkOP1Pos +425b ClrOP2S +425e ClrOP1S +4261 FDiv100 +4264 FDiv10 +4267 DecO1Exp +426a IncO1Exp +426d IncExp +4270 CkValidNum +4273 GetExp +4276 HTimesL +4279 EOP1NotReal +427c ThetaName +427f RName +4282 RegEqName +4285 RecurNName +4288 XName +428b YName +428e TName +4291 RealName +4294 SetEStoFPS +4297 ChkTempDirt +429a OP1MOP2Exp +429d OP1ExpMDE +42a0 ChkErrBreak +42a3 IsA2ByteTok +42a6 GetLastEntry +42a9 GetLastEntryPtr +42ac RegrClrChng +42af ResetWinTop +42b2 SetYUp +42b5 SetXUp +42b8 IsO1NonTLstOrProg +42bb IsO1NonTempLst +42be Is_A_LstOrCLst +42c1 Chk_HL_999 +42c4 Equ_or_NewEqu +42c7 ErrD_OP1NotPos +42ca ErrD_OP1Not_R +42cd ErrD_OP1NotPosInt +42d0 ErrD_OP1_LE_0 +42d3 ErrD_OP1_0 +42d6 FindSym_Get_Size +42d9 Sto_StatVar +42dc Rcl_StatVar +42df CkOP2Real +42e2 Get_X_Indirect +42e5 MemChk +42e8 CmpPrgNamLen1 +42eb CmpPrgNamLen +42ee FindProgSym +42f1 ChkFindSym +42f4 FindSym +42f7 InsertMem +42fa InsertMemA +42fd EnoughMem +4300 CmpMemNeed +4303 CreatePVar4 +4306 CreatePVar3 +4309 CreateVar3 +430c CreateCplx +430f CreateReal +4312 CreateTRList +4315 CreateRList +4318 CreateTCList +431b CreateCList +431e CreateTRMat +4321 CreateRMat +4324 CreateTStrng +4327 CreateStrng +432a Create0Equ +432d CreateTEqu +4330 CreateEqu +4333 CreatePict +4336 CreateGDB +4339 CreateProg +433c ChkDel +433f ChkDelA +4342 AdjParser +4345 AdjMath +4348 AdjM7 +434b DelMemA +434e Get_Form_Num +4351 DelVar +4354 DelVarIO +4357 DelMem +435a DelVar3D +435d DelVar3C +4360 DelVar3DC +4363 Sym_Prog_Non_T_Lst +4366 AdjSymPtrs +4369 DataSizeA +436c DataSize +436f PopMCplxO1 +4372 PopMCplx +4375 MovCplx +4378 PopOP5 +437b PopOP3 +437e PopOP1 +4381 PopRealO6 +4384 PopRealO5 +4387 PopRealO4 +438a PopRealO3 +438d PopRealO2 +4390 PopRealO1 +4393 PopReal +4396 FPopCplx +4399 FPopReal +439c FPopFPS +439f DeallocFPS +43a2 DeallocFPS1 +43a5 AllocFPS +43a8 AllocFPS1 +43ab PushRealO6 +43ae PushRealO5 +43b1 PushRealO4 +43b4 PushRealO3 +43b7 PushRealO2 +43ba PushRealO1 +43bd PushReal +43c0 PushOP5 +43c3 PushOP3 +43c6 PushMCplxO3 +43c9 PushOP1 +43cc PushMCplxOP1 +43cf PushMCplx +43d2 ExMCplxO1 +43d5 Exch9 +43d8 CpyTo1FPS11 +43db CpyTo2FPS5 +43de CpyTo1FPS5 +43e1 CpyTo2FPS6 +43e4 CpyTo1FPS6 +43e7 CpyTo2FPS7 +43ea CpyTo1FPS7 +43ed CpyTo1FPS8 +43f0 CpyTo2FPS8 +43f3 CpyTo1FPS10 +43f6 CpyTo1FPS9 +43f9 CpyTo2FPS4 +43fc CpyTo6FPS3 +43ff CpyTo6FPS2 +4402 CpyTo2FPS3 +4405 CpyCTo1FPS3 +4408 CpyTo1FPS3 +440b CpyFPS3 +440e CpyTo1FPS4 +4411 CpyTo3FPS2 +4414 CpyTo5FPST +4417 CpyTo6FPST +441a CpyTo4FPST +441d CpyTo3FPST +4420 CpyTo2FPST +4423 CpyTo1FPST +4426 CpyFPST +4429 CpyStack +442c CpyTo3FPS1 +442f CpyTo2FPS1 +4432 CpyTo1FPS1 +4435 CpyFPS1 +4438 CpyTo2FPS2 +443b CpyTo1FPS2 +443e CpyFPS2 +4441 CpyO3ToFPST +4444 CpyO2ToFPST +4447 CpyO6ToFPST +444a CpyO1ToFPST +444d CpyToFPST +4450 CpyToStack +4453 CpyO3ToFPS1 +4456 CpyO5ToFPS1 +4459 CpyO2ToFPS1 +445c CpyO1ToFPS1 +445f CpyToFPS1 +4462 CpyO2ToFPS2 +4465 CpyO3ToFPS2 +4468 CpyO6ToFPS2 +446b CpyO1ToFPS2 +446e CpyToFPS2 +4471 CpyO5ToFPS3 +4474 CpyO2ToFPS3 +4477 CpyO1ToFPS3 +447a CpyToFPS3 +447d CpyO1ToFPS6 +4480 CpyO1ToFPS7 +4483 CpyO1ToFPS5 +4486 CpyO2ToFPS4 +4489 CpyO1ToFPS4 +448c ErrNotEnoughMem +448f FPSMinus9 +4492 HLMinus9 +4495 ErrOverflow +4498 ErrDivBy0 +449b ErrSingularMat +449e ErrDomain +44a1 ErrIncrement +44a4 ErrNon_Real +44a7 ErrSyntax +44aa ErrDataType +44ad ErrArgument +44b0 ErrDimMismatch +44b3 ErrDimension +44b6 ErrUndefined +44b9 ErrMemory +44bc ErrInvalid +44bf ErrBreak +44c2 ErrStat +44c5 ErrSignChange +44c8 ErrIterations +44cb ErrBadGuess +44ce ErrTolTooSmall +44d1 ErrStatPlot +44d4 ErrLinkXmit +44d7 JError +44da noErrorEntry +44dd pushErrorHandler +44e0 popErrorHandler +44e3 StrCopy +44e6 StrCat +44e9 IsInSet +44ec GEQNAMEA +44ef RECNAME +44f2 __bank_call +44f5 __bank_ret +44f8 __bank_jump +44fb __bank_entry +44fe ReadDisp2 +4501 PutMap +4504 PutC +4507 DispHL +450a PutS +450d PutPSB +4510 PutPS +4513 WPutPS +4516 PutBuf +4519 PutBuf1 +451c WPutC +451f WPutS +4522 WPutSEOL +4525 WDispEOL +4528 WHomeUp +452b SetNumWindow +452e NewLine +4531 MoveDown +4534 ScrollUp +4537 ShrinkWindow +453a MoveUp +453d ScrollDown +4540 ClrLCDFull +4543 ClrLCD +4546 ClrScrnFull +4549 ClrScrn +454c ClrTxtShd +454f ClrWindow +4552 EraseEOL +4555 EraseEOW +4558 HomeUp +455b GetCurLoc +455e VPutMap +4561 VPutS +4564 VPutSN +4567 VPutSNG +456a VPutSNT +456d RunIndicOn +4570 RunIndicOff +4573 SaveCmdShadow +4576 SaveShadow +4579 RstrShadow +457c RstrPartial +457f RstrCurRow +4582 RstrUnderMenu +4585 RstrBotRow +4588 SaveTR +458b RestoreTR +458e GetKeyPress +4591 GetTokLen +4594 Get_Tok_Strng +4597 GetTokString +459a PUTBPATBUF2 +459d PUTBPATBUF +45a0 PUTBPAT +45a3 putcCheckScroll +45a6 DispEOL +45a9 fdispEOL +45ac MakeRowCmd +45af TOTOSTRP +45b2 SetVarName +45b5 DispDone +45b8 FinishOutput +45bb CurBlink +45be CursorOff +45c1 HideCursor +45c4 CursorOn +45c7 ShowCursor +45ca KeyToString +45cd PullDownChk +45d0 MenuCatCommon +45d3 LoadCurCat +45d6 NCifprgmedmode +45d9 LoadMenuNum +45dc LoadMenuNumL + 45df +45e2 MenCatRet +45e5 NotAlphNum +45e8 SaveSavedFlags +45eb SetMenuFlags +45ee RstrSomeFlags +45f1 RstrSmallText +45f4 DispListName +45f7 RstrOScreen +45fa SaveOScreen +45fd DispLAlphaName +4600 AbortPrgmode +4603 Is_FullCntx +4606 AdrMRow +4609 AdrMEle +460c GetMatOP1A +460f GetM1ToOP1 +4612 GetM1TOP1A +4615 GetMToOP1 +4618 PutToM1A +461b PutToMa1 +461e PutToMat +4621 Mat_El_Div +4624 CMATFUN +4627 RowEch_Poly +462a RowEchelon +462d AdrLEle +4630 GetL1ToOP1 +4633 GetL1TOP1A +4636 GetLToOP1 +4639 GetL1TOOP2 +463c GetL1TOP2A +463f GetL2TOP1A +4642 PutToLA1 +4645 PutToL +4648 MaxMinLst +464b LLow +464e LHigh +4651 LSum +4654 CumSum +4657 ToFrac +465a SeqSet +465d SeqSolve +4660 Cmp_Num_Init +4663 BinOPExec +4666 ExMean1 +4669 Set2MVLPtrs +466c SetMat1 +466f CreateTList +4672 UnOPExec +4675 ThreeExec +4678 RestoreErrNo +467b FourExec +467e FiveExec +4681 CpyTo2ES1 +4684 CpyTo6ES1 +4687 CpyTo1ES1 +468a CpyTo3ES1 +468d CpyTo3ES2 +4690 CpyTo2ES2 +4693 CpyTo1ES2 +4696 CpyTo2ES3 +4699 CpyTo1ES3 +469c CpyTo3ES4 +469f CpyTo6ES3 +46a2 CpyTo2ES4 +46a5 CpyTo1ES4 +46a8 CpyTo2ES5 +46ab CpyTo1ES5 +46ae CpyTo4EST +46b1 CpyTo2EST +46b4 CpyTo1EST +46b7 CpyTo2ES6 +46ba CpyTo1ES6 +46bd CpyTo2ES7 +46c0 CpyTo1ES7 +46c3 CpyTo2ES8 +46c6 CpyTo1ES8 +46c9 CpyTo1ES9 +46cc CpyTo2ES9 +46cf CpyTo2ES10 +46d2 CpyTo1ES10 +46d5 CpyTo2ES11 +46d8 CpyTo1ES11 +46db CpyTo2ES12 +46de CpyTo1ES12 +46e1 CpyTo2ES13 +46e4 CpyTo1ES13 +46e7 CpyTo1ES14 +46ea CpyTo1ES16 +46ed CpyTo1ES17 +46f0 CpyTo1ES18 +46f3 CpyTo1ES15 +46f6 CpyTo2ES15 +46f9 CpyO1ToEST +46fc CpyO1ToES1 +46ff CpyO6ToES1 +4702 CpyO6ToES3 +4705 CpyO1ToES2 +4708 CpyO2ToES2 +470b CpyO1ToES3 +470e CpyO1ToES4 +4711 CpyO1ToES5 +4714 CpyO1ToES6 +4717 CpyO1ToES7 +471a CpyO2ToES4 +471d CpyO2ToES5 +4720 CpyO2ToES6 +4723 CpyO2ToES7 +4726 CpyO2ToES8 +4729 CpyO2ToES9 +472c CpyO1ToES8 +472f CpyO1ToES9 +4732 CpyO1ToES10 +4735 CpyO1ToES11 +4738 CpyO1ToES12 +473b CpyO1ToES13 +473e CpyO1ToES14 +4741 EvalF3A +4744 GetK +4747 SetTitle +474a DispVarVal +474d RecallEd +4750 SetupBuffer +4753 CreateNumEditBuf +4756 CallCommon +4759 CommonKeys +475c Leftmore +475f fDel +4762 fClear +4765 fInsDisp +4768 fInsDisp02 +476b SetIndicator +476e CloseEditBufNoR +4771 ReleaseBuffer +4774 VarNameToOP1HL +4777 NameToOP1 +477a numPPutAway +477d numRedisp +4780 numError02 +4783 Load_SFont +4786 SFont_Len +4789 InitNumVec +478c SetXXOP1 +478f SetXXOP2 +4792 SetXXXXOP2 +4795 UCLineS +4798 CLine +479b CLineS +479e XRootY +47a1 YToX +47a4 ZmStats +47a7 Point_Stat_Hlp +47aa DrawSPlot +47ad InitNewTraceP +47b0 SPlotCoord +47b3 SPlotRight +47b6 SPlotLeft +47b9 CmpBoxInfo +47bc NextPlot +47bf PrevPlot +47c2 ClrPrevPlot +47c5 Put_Index_Lst +47c8 Get_Index_Lst +47cb Heap_Sort +47ce StoGDB2 +47d1 RclGDB2 +47d4 CircCmd +47d7 GrphCirc +47da Mov18B +47dd DarkLine +47e0 ILine +47e3 IPoint +47e6 XYRndBoth +47e9 XYRnd +47ec CheckTop +47ef CheckXY +47f2 DarkPnt +47f5 CPointS +47f8 WToV +47fb VtoWHLDE +47fe Xitof +4801 YftoI +4804 XftoI +4807 TraceOff +480a GrRedisp +480d GDispToken +4810 GRDECODA +4813 LabCoor +4816 CoorDisp +4819 TmpEquNoSrc +481c GrLabels +481f YPixSet +4822 XPixSet +4825 CopyRng +4828 ValCur +482b GrPutAway +482e RstGFlags +4831 GrReset +4834 XYCent +4837 ZoomXYCmd +483a CptDelY +483d CptDelX +4840 SetFuncM +4843 SetSeqM +4846 SetPolM +4849 SetParM +484c ZmInt +484f ZmDecml +4852 ZmPrev +4855 ZmUsr +4858 SetUZm +485b ZmFit +485e ZmSquare +4861 ZmTrig +4864 SetXMinMax +4867 ZooDefault +486a GrBufCpy +486d DrawSplitLine +4870 RestoreDisp +4873 FNDDB +4876 AllEq +4879 FndAllSelEq +487c NextEq +487f PrevEq +4882 BlinkGCur +4885 NBCursor +4888 StatMark +488b ChkTextCurs +488e Regraph +4891 DoRefFlags02 +4894 YRes +4897 PlotPtXY2 +489a Ceiling +489d PutXY +48a0 PutEquNo +48a3 PDspGrph +48a6 HorizCmd +48a9 VertCmd +48ac LineCmd +48af UnLineCmd +48b2 PointCmd +48b5 PixelTest +48b8 PixelCmd +48bb TanLnF +48be DrawCmd_Init +48c1 DrawCmd +48c4 ShadeCmd +48c7 InvCmd +48ca StatShade +48cd DspMatTable +48d0 DspLsts +48d3 CloseEditBuf +48d6 ParseEditBuf +48d9 PutSM +48dc DspCurTbl +48df DspGrTbl +48e2 ZeroTemplate +48e5 SetTblRefs +48e8 DispTblBot +48eb DispTblTop +48ee DispTblBody +48f1 VPutBlank +48f4 TblTrace +48f7 DispListNameY +48fa CurNameLength +48fd NameToBuf +4900 JPromptCursor +4903 BufLeft +4906 BufRight +4909 BufInsert +490c BufQueueChar +490f BufReplace +4912 BufDelete +4915 BufPeek +4918 BufPeek1 +491b BufPeek2 +491e BufPeek3 +4921 BufToBtm +4924 SetupEditEqu +4927 BufToTop +492a IsEditFull +492d IsEditEmpty +4930 IsAtTop +4933 IsAtBtm +4936 BufClear +4939 JCursorFirst +493c JCursorLast +493f CursorLeft +4942 JCursorRight +4945 JCursorUp +4948 CursorDown +494b CursorToOffset +494e InsDisp +4951 FDispBOL1 +4954 FDispBOL +4957 DispEOW +495a DispHead +495d DispTail +4960 PutTokString +4963 SetupEditCmd +4966 SetEmptyEditEqu +4969 SetEmptyEditPtr +496c CloseEditEqu +496f GetPrevTok +4972 GetKey +4975 CanIndic +4978 LCD_DRIVERON +497b DFMIN2 +497e FormDisp +4981 FormMatrix +4984 WScrollLeft +4987 WScrollUp +498a WScrollDown +498d WScrollRight +4990 FormEReal +4993 FormERealTok +4996 FormDCplx +4999 FormReal +499c FormScrollUp +499f SetWinAbove +49a2 DisarmScroll +49a5 OP1toEdit +49a8 MinToEdit +49ab RclVarToEdit +49ae RclVarToEditPtr +49b1 RclEntryToEdit +49b4 RclToQueue +49b7 FormToTok +49ba Disp_Interval +49bd DispLstName +49c0 DispSLstNameHL +49c3 EditEqu +49c6 CloseEquField +49c9 AutoSelect +49cc DispYEOS +49cf DispNumEOS +49d2 SetupDispEq +49d5 DispForward +49d8 DispYPrompt2 +49db StringWidth +49de DispErrorScreen +49e1 PopCx +49e4 LoadNoEEntry +49e7 SaveScreen +49ea RetScreen +49ed RetScreenErr +49f0 CheckSplitFlag +49f3 SolveRedisp +49f6 SolveDisp +49f9 ItemName +49fc SetNorm_Vals +49ff SetVert_Vals +4a02 ConvKeyToTok +4a05 KeyToTokNew2B +4a08 KeyToTok2Byte +4a0b TokToKey +4a0e Send1BErr +4a11 GetVarCmd +4a14 SendVarCmd +4a17 PrintScreen +4a1a KeyScnLnk +4a1d IOResetAll +4a20 DelRes +4a23 ConvLcToLr +4a26 RedimMat +4a29 IncLstSize +4a2c InsertList +4a2f DelListEl +4a32 EditProg +4a35 CloseProg +4a38 ClrGraphRef +4a3b FixTempCnt +4a3e SaveData +4a41 RestoreData +4a44 FindAlphaUp +4a47 FindAlphaDn +4a4a CmpSyms +4a4d CreateTemp +4a50 CleanAll +4a53 MoveToNextSym +4a56 ConvLrToLc +4a59 TblScreenDn +4a5c TblScreenUp +4a5f ScreenUp +4a62 ScreenUpDown +4a65 ZIfRclHandler +4a68 ZIfRclKApp +4a6b RclKey +4a6e RclKey2 +4a71 RclRegEq +4a74 RclRegEq2 +4a77 InitNamePrompt +4a7a NamePrompt2 +4a7d CatalogChk +4a80 ClrTR +4a83 Quad +4a86 GraphQuad +4a89 BC2NonReal +4a8c ErrNonReal +4a8f Write_Text +4a92 ForSeqInit +4a95 GrphPars +4a98 PlotPars +4a9b ParseInp +4a9e ParseOff +4aa1 ParseScan +4aa4 GetParse +4aa7 SaveParse +4aaa InitPFlgs +4aad CkEndLinErr +4ab0 OP2Set60 +4ab3 GetStatPtr +4ab6 Cmp_StatPtr +4ab9 VarSysAdr +4abc StoSysTok +4abf StoAns +4ac2 StoTheta +4ac5 StoR +4ac8 StoY +4acb StoN +4ace StoT +4ad1 StoX +4ad4 StoOther +4ad7 RclAns +4ada RclY +4add RclN +4ae0 RclX +4ae3 RclVarSym +4ae6 RclSysTok +4ae9 StMatEl +4aec StLstVecEl +4aef ConvOP1 +4af2 Find_Parse_Formula +4af5 Parse_Formula +4af8 StrngEnt1 +4afb PrgRdLp +4afe VarEnt +4b01 ParseOnC +4b04 ParseOn +4b07 ParseCmd +4b0a StoType +4b0d CreatePair +4b10 PushNum +4b13 IncCurPCErrEnd +4b16 ErrEnd +4b19 CommaErrF +4b1c CommaErr +4b1f StEqArg2 +4b22 StEqArg +4b25 InpArg +4b28 StEqArg3 +4b2b NxtFetch +4b2e CkFetchVar +4b31 FetchVarA +4b34 FetchVar +4b37 CkEndLin +4b3a CkEndExp +4b3d CkParsEnd +4b40 StoTypeArg +4b43 ConvDim +4b46 ConvDim00 +4b49 AheadEqual +4b4c ParsAheadS +4b4f ParsAhead +4b52 AnsName +4b55 StoCmpReals +4b58 GetDEPtr +4b5b Push2BOper +4b5e Pop2BOper +4b61 PushOper +4b64 PopOper +4b67 Find_E_UndefOrArchived +4b6a StTmpEq +4b6d FindEOL +4b70 BrkInc +4b73 IncFetch +4b76 CurFetch +4b79 Random +4b7c StoRand +4b7f RandInit +4b82 ResetStacks +4b85 Factorial +4b88 YOnOff +4b8b EqSelUnsel +4b8e ITSOLVER +4b91 GRITSOLVER +4b94 ITSOLVERB +4b97 ITSOLVERNB +4b9a ExTest_INT +4b9d Dist_Fun +4ba0 LogGamma +4ba3 OneVar +4ba6 OneVarS_0 +4ba9 OrdStat +4bac InitStatAns2 +4baf ANOVA_Spec +4bb2 OutputExpr +4bb5 CentCursor +4bb8 Text +4bbb FinishSpec +4bbe TRCYFUNC +4bc1 Rcl_Seq_X +4bc4 RclSeq2 +4bc7 GrPPutAway +4bca CkValDelX +4bcd CkValDelta +4bd0 GrBufClr +4bd3 GrBufCpy_V +4bd6 FndSelEq +4bd9 ClrGraphXY +4bdc Next_Y_Style +4bdf PlotPt +4be2 NewIndep +4be5 Axes +4be8 SetPenX +4beb SetPenY +4bee SetPenT +4bf1 Tan_Equ_Disp +4bf4 PutAns +4bf7 DispOP1A +4bfa MathTanLn +4bfd EndDraw +4c00 SetTblGraphDraw +4c03 StartDialog +4c06 DialogInit +4c09 GetDialogNumOP1 +4c0c SetDialogNumOP1 +4c0f GetDialogNumHL + 4c12 +4c15 SetDialogKeyOverride +4c18 ResDialogKeyOverride +4c1b ForceDialogKeypress +4c1e DialogStartGetKey +4c21 StartDialog_Override +4c24 CallDialogCallback +4c27 SetDialogCallback +4c2a ResDialogCallback +4c2d CopyDialogNum +4c30 MemClear +4c33 MemSet +4c36 ReloadAppEntryVecs +4c39 PointOn +4c3c ExecuteNewPrgm +4c3f StrLength +4c42 UserPutMap +4c45 GetCurrentPageSub +4c48 FindAppUp +4c4b FindAppDn +4c4e FindApp +4c51 ExecuteApp +4c54 MonReset + 4c57 + 4c5a + 4c5d +4c60 IBounds +4c63 IOffset +4c66 DrawCirc2 +4c69 CanAlphIns +4c6c Redisp +4c6f GetBaseVer +4c72 SetFP0 +4c75 AppGetCbl +4c78 AppGetCalc +4c7b SaveDisp +4c7e SetIgnoreKey +4c81 SetSendThisKeyBack +4c84 DisableApd +4c87 EnableApd + 4c8a + 4c8d +4c90 forcecmd +4c93 ApdSetup +4c96 Get_NumKey +4c99 AppSetup +4c9c HandleLinkActivity + 4c9f +4ca2 ReleaseSedit +4ca5 initsmalleditline +4ca8 startsmalledit + 4cab +4cae SGetTokString +4cb1 LoadPattern +4cb4 SStringLength + 4cb7 + 4cba +4cbd DoNothing + 4cc0 + 4cc3 + 4cc6 + 4cc9 + 4ccc +4ccf SmallEditEraseEOL + 4cd2 + 4cd5 + 4cd8 +4cdb initsmalleditBox + 4cde +4ce1 EmptyHook + 4ce4 + 4ce7 + 4cea +4ced ClearRow + 4cf0 +4cf3 SetupSmallEditCursor + 4cf6 + 4cf9 + 4cfc + 4cff + 4d02 + 4d05 + 4d08 + 4d0b + 4d0e + 4d11 + 4d14 + 4d17 + 4d1a + 4d1d + 4d20 + 4d23 +4d26 AppScreenUpDown +4d29 AppScreenUpDown1 + 4d2c +4d2f initsmalleditlinevar +4d32 initsmalleditlineop1 +4d35 initsmalleditboxvar +4d38 initsmalleditboxop1 + 4d3b + 4d3e +4d41 ErrCustom1 +4d44 ErrCustom2 +4d47 AppStartMouse + 4d4a + 4d4d + 4d50 +4d53 AppEraseMouse + 4d56 +4d59 ATimes12 +4d5c ClearRect +4d5f InvertRect +4d62 FillRect +4d65 AppUpdateMouse + 4d68 + 4d6b +4d6e initcellbox +4d71 drawcell + 4d74 +4d77 invertcell +4d7a setcelloverride +4d7d DrawRectBorder +4d80 ClearCell +4d83 covercell +4d86 EraseRectBorder +4d89 FillRectPattern +4d8c DrawRectBorderClear + 4d8f + 4d92 +4d95 VerticalLine +4d98 IBoundsFull +4d9b DisplayImage + 4d9e + 4da1 + 4da4 + 4da7 + 4daa + 4dad + 4db0 + 4db3 + 4db6 + 4db9 + 4dbc + 4dbf + 4dc2 + 4dc5 +4dc8 CPoint +4dcb DeleteApp + 4dce +4dd1 setmodecellflag +4dd4 resetmodecellflag +4dd7 ismodecellset +4dda getmodecellflag + 4ddd +4de0 CellBoxManager +4de3 startnewcell + 4de6 +4de9 CellCursorHandle + 4dec + 4def +4df2 ClearCurCell +4df5 drawcurcell +4df8 invertcurcell +4dfb covercurcell +4dfe BlinkCell +4e01 BlinkCellNoLookUp +4e04 BlinkCurCell +4e07 BlinkCellToOn +4e0a BlinkCellToOnNoLookUp +4e0d BlinkCurCellToOn +4e10 BlinkCellToOff +4e13 BlinkCellToOffNoLookUp +4e16 BlinkCurCellToOff +4e19 getcurmodecellflag + 4e1c +4e1f startsmalleditreturn + 4e22 + 4e25 +4e28 CellkHandle +4e2b errchkalphabox + 4e2e + 4e31 + 4e34 + 4e37 +4e3a eraseallcells +4e3d iscurmodecellset + 4e40 +4e43 initalphabox + 4e46 + 4e49 +4e4c drawblnkcell +4e4f ClearBlnkCell +4e52 invertblnkcell + 4e55 + 4e58 + 4e5b + 4e5e + 4e61 + 4e64 +4e67 HorizontalLine +4e6a CreateAppVar +4e6d CreateProtProg +4e70 CreateVar +4e73 AsmComp +4e76 GetAsmSize +4e79 SquishPrgm +4e7c ExecutePrgm +4e7f ChkFindSymAsm +4e82 ParsePrgmName +4e85 CSub +4e88 CAdd +4e8b CSquare +4e8e CMult +4e91 CRecip +4e94 CDiv +4e97 CAbs +4e9a CSqrAbs +4e9d CSqRoot +4ea0 CLN +4ea3 CLog +4ea6 CTenX +4ea9 CEtoX +4eac CXrootY + 4eaf +4eb2 CYtoX +4eb5 Conj +4eb8 CMltByReal +4ebb CDivByReal +4ebe CTrunc +4ec1 CFrac +4ec4 CIntgr +4ec7 SendHeaderPacket +4eca CancelTransmission +4ecd SendScreenContents +4ed0 SendRAMVarData +4ed3 SendRAMCmd +4ed6 SendPacket +4ed9 ReceiveAck +4edc Send4BytePacket +4edf SendDataByte +4ee2 Send4Bytes +4ee5 SendAByte +4ee8 SendCByte +4eeb GetSmallPacket +4eee GetDataPacket +4ef1 SendAck +4ef4 Get4Bytes +4ef7 Get3Bytes +4efa Rec1stByte +4efd Rec1stByteNC +4f00 ContinueGetByte +4f03 RecAByteIO +4f06 ReceiveVar +4f09 ReceiveVarData2 +4f0c ReceiveVarData +4f0f SrchVLstUp +4f12 SrchVLstDn +4f15 SendVariable +4f18 Get4BytesCursor +4f1b Get4BytesNC + 4f1e +4f21 SendDirectoryContents +4f24 SendReadyPacket + 4f27 + 4f2a + 4f2d +4f30 SendApplication +4f33 SendOSHeader +4f36 SendOSPage +4f39 SendOS +4f3c FlashWriteDisable +4f3f SendCmd +4f42 SendOSSignature +4f45 Disp +4f48 SendGetKeyPress +4f4b RejectCommand +4f4e CheckLinkLines +4f51 GetHookByte +4f54 LoadBIndPaged +4f57 CursorHook +4f5a LibraryHook +4f5d RawKeyHook +4f60 SetCursorHook +4f63 SetLibraryHook +4f66 SetRawKeyHook +4f69 ClrCursorHook +4f6c ClrLibraryHook +4f6f ClrRawKeyHook +4f72 ResetHookBytes +4f75 AdjustAllHooks +4f78 GetKeyHook +4f7b SetGetKeyHook +4f7e ClrGetKeyHook +4f81 LinkActivityHook +4f84 SetLinkActivityHook +4f87 ClrLinkActivityHook + 4f8a +4f8d SetCatalog2Hook +4f90 ClrCatalog2Hook +4f93 SetLocalizeHook +4f96 ClrLocalizeHook +4f99 SetTokenHook +4f9c ClrTokenHook + 4f9f + 4fa2 + 4fa5 +4fa8 Bit_VertSplit +4fab SetHomeScreenHook +4fae ClrHomeScreenHook +4fb1 SetWindowHook +4fb4 ClrWindowHook +4fb7 SetGraphHook +4fba ClrGraphHook + 4fbd + 4fc0 + 4fc3 +4fc6 DelVarArc +4fc9 DelVarNoArc +4fcc SetAllPlots +4fcf SetYEquHook +4fd2 ClrYEquHook +4fd5 ForceYEqu +4fd8 Arc_Unarc +4fdb ArchiveVar +4fde UnarchiveVar +4fe1 ResDialogKeyOverride +4fe4 SetFontHook +4fe7 ClrFontHook +4fea SetRegraphHook +4fed ClrRegraphHook +4ff0 RegraphHook +4ff3 SetTraceHook +4ff6 ClrTraceHook +4ff9 TraceHook + 4ffc + 4fff +5002 JForceGraphNoKey +5005 JForceGraphKey +5008 PowerOff +500b GetKeyRetOff +500e FindGroupSym +5011 FillBasePageTable +5014 ArcChk +5017 FlashToRam +501a LoadDEIndPaged +501d LoadCIndPaged +5020 SetupPagedPtr +5023 PagedGet +5026 SetParserHook +5029 ClrParserHook +502c SetAppChangeHook +502f ClrAppChangeHook +5032 SetDrawingHook +5035 ClrDrawingHook +5038 IPoint_NoHook +503b ILine_NoHook +503e CLineS_NoHook +5041 DeleteTempPrograms +5044 SetCatalog1Hook +5047 ClrCatalog1Hook +504a SetHelpHook +504d ClrHelpHook + 5050 + 5053 + 5056 +5059 Catalog2Hook +505c Catalog1Hook + 505f + 5062 +5065 DispMenuTitle + 5068 +506b SetCxRedispHook +506e ClrCxRedispHook +5071 BufCpy +5074 BufClr + 5077 + 507a + 507d +5080 DisplayVarInfo +5083 SetMenuHook +5086 ClrMenuHook +5089 GetBCOffsetIX + 508c +508f ForceFullScreen +5092 GetVariableData +5095 FindSwapSector +5098 CopyFlashPage +509b FindAppNumPages +509e HLMinus5 +50a1 SendArcPacket +50a4 ForceGraphKeypress + 50a7 +50aa FormBase + 50ad +50b0 IsFragmented +50b3 Chk_Batt_Low +50b6 Chk_Batt_Low2 + +## OS 1.10 +50b9 Arc_Unarc2 + +## OS 1.13 +50bc GetAppBasePage +50bf SetExSpeed + 50c2 +50c5 GroupAllVars +50c8 UngroupVar +50cb WriteToFlash +50ce SetSilentLinkHook +50d1 ClrSilentLinkHook +50d4 TwoVarSet + 50d7 + 50da +50dd GetSysInfo +50e0 NZIf83Plus +50e3 LinkStatus + +## OS 1.15 + 50e6 +50e9 DBusKeyScn + +## OS 2.21 +50ec RunAppLib +50ef FindSpecialAppHeader + 50f2 + 50f5 + 50f8 +50fb GetVarCmdUSB + +## OS 2.30 + 50fe + 5101 + 5104 + 5107 +510a GetVarVersion + 510d + 5110 + 5113 + 5116 + 5119 + 511c + 511f +5122 InvertTextInsMode + 5125 +5128 ResetDefaults + 512b +512e DispHeader +5131 ForceGroup + 5134 + 5137 + 513a + 513d + 5140 +5143 GetRelSeconds +5146 DisableClock +5149 EnableClock +514c GetDayOfWeek +514f GetDate +5152 FormDate +5155 GetDateFmt +5158 FormDateString +515b GetTime +515e FormTime +5161 GetTimeFmt +5164 FormTimeString +5167 GetClockStatus +516a SetDateMkList +516d SetDateFmt +5170 SetTimeMkList +5173 SetTimeFmt +5176 GetAbsSeconds +5179 AbsSecondsToTimeList + 517c +517f ClrWindowAndFlags +5182 SetMachineID +5185 ResetLists + 5188 + 518b + 518e +5191 ExecLib + 5194 + 5197 + 519a +519d OpenLib +51a0 WaitEnterKey + 51a3 + 51a6 + 51a9 + 51ac + 51af + 51b2 + 51b5 +51b8 IsOP1Resid + 51bb + 51be + 51c1 + 51c4 +51c7 DispAboutScreen +51ca ChkHelpHookVer +51cd Disp32 + 51d0 + 51d3 + 51d6 + 51d9 +51dc DrawTableEditor + 51df + 51e2 + 51e5 + 51e8 + 51eb + 51ee +51f1 MatrixName + 51f4 + 51f7 + 51fa + 51fd + 5200 + 5203 + 5206 + 5209 + 520c + 520f + 5212 + 5215 + 5218 + 521b + 521e +5221 Chk_Batt_Level + 5224 + 5227 + 522a + 522d + 5230 +5233 GoToLastRow +5236 RectBorder + 5239 + 523c + 523f +5242 LoadA5 + 5245 +5248 NamedListToOP1 + 524b + 524e + 5251 + 5254 + 5257 + 525a + 525d + 5260 + 5263 + 5266 +5269 CheckUSBAutoLaunchHeader + 526c + 526f + 5272 + 5275 + 5278 + 527b + 527e + 5281 +5284 SetVertGraphActive +5287 ClearVertGraphActive +528a SetUSBHook +528d ClrUSBHook +5290 InitUSBDevice +5293 KillUSBPeripheral + 5296 + 5299 +529c GraphLine + 529f + 52a2 + 52a5 + 52a8 + 52ab + 52ae +52b1 ZifTableEditor + 52b4 + 52b7 + 52ba +52bd FindAppName + 52c0 + 52c3 + 52c6 +52c9 BufCpyCustom + 52cc + +## OS 2.40 + 52cf + 52d2 + 52d5 + 52d8 + 52db + 52de + 52e1 +52e4 DelVarSym +52e7 FindAppUpNoCase +52ea FindAppDnNoCase +52ed DeleteInvalidApps +52f0 DeleteApp_Link + 52f3 +52f6 SetAppRestrictions +52f9 RemoveAppRestrictions +52fc CheckAppRestrictions +52ff DispAppRestrictions +5302 SetupHome + 5305 + 5308 + 530b + 530e + 5311 +5314 PolarEquToOP1 + 5317 + 531a +531d GetRestrictionsOptions +5320 DispResetComplete + 5323 +5326 FindAppCustom +5329 ClearGraphStyles + +## Boot +8018 MD5Final +801B RSAValidate +801E BigNumCompare +8021 WriteAByteUnsafe +8024 EraseFlash +8027 FindFirstCertificateField +802A ZeroToCertificate +802D GetCertificateEnd +8030 FindGroupedField +8033 DoNothing0 +8036 DoNothing1 +8039 DoNothing2 +803C DoNothing3 +803F DoNothing4 +8042 ATimesE +8045 ATimesDE +8048 DivHLByE +804B DivHLByDE +8051 LoadAIndPaged +8054 FlashToRAM2 +8057 GetCertificateStart +805A GetFieldSize +805D FindSubField +8060 EraseCertificateSector +8063 CheckHeaderKey +806C Load_BootLFontV2 +806F Load_BootLFontV +8072 OSReceive +8075 FindOSHeaderSubField +8078 FindNextCertificateField +807B RecAByteBoot +807E GetCalcSerial +8084 EraseFlashPage +8087 WriteFlashUnsafe +808A DispBootVer +808D MD5Init +8090 MD5Update +8093 MarkOSInvalid +8096 FindAppKey +8099 MarkOSValid +809C CheckOSValid +809F SetupAppPubKey +80A2 RabinValidate +80A5 TransformHash +80A8 IsAppFreeware +80AB FindAppHeaderSubField +80AE RecalcValidationBytes +80B1 Div32ByDE +80B4 FindSimpleGroupedField +80B7 GetBootVer +80BA GetHWVer +80BD XorA +80C0 RSAValidateBigB +80C3 ProdNrPart1 +80C6 WriteAByteSafe +80C9 WriteFlashSafe +80CC SetupDateStampPubKey +80CF SetAppLimit +80D2 BatteryError + +## 84+ Boot +80E4 USBBootMainLoop +80E7 DisplaySysMessage +80EA NewLine2 +80ED DisplaySysErrorAndTurnOff +80F0 CheckBattery +80F3 CheckBattery46 +80F6 OSReceiveUSB +80F9 OSPacketSetup +80FC ForceReboot +80FF SetupOSPubKey +8102 CheckHeaderKeyHL + +[labels] +8000 ramStart +8000 appData +8100 ramCode +822F ramCodeEnd +8230 baseAppBrTab +8251 bootTemp +8269 MD5Length +8292 MD5Hash +82A3 appSearchPage +82A5 tempSwapArea +83A5 MD5Buffer +838D appID +83ED ramReturnData +83EE arcInfo +8406 savedArcInfo +8432 appInfo +843C appBank_jump +843E appPage +843F kbdScanCode +8440 kbdLGSC +8441 kbdPSC +8442 kbdWUR +8443 kbdDebncCnt +8444 kbdKey +8445 kbdGetKy +8446 keyExtend +8447 contrast +8448 apdSubTimer +8449 apdTimer +844A curTime +844B curRow +844C curCol +844D curOffset +844E curUnder +844F curY +8450 curType +8451 curXRow +8452 prevDData +845A lFont_record +8462 sFont_record +846A tokVarPtr +846C tokLen +846E indicMem +8476 indicCounter +8477 indicBusy +8478 OP1 +8483 OP2 +848E OP3 +8499 OP4 +84A4 OP5 +84AF OP6 +84BF progToEdit +84C7 nameBuff +84D2 equ_edit_save +84D3 iMathPtr1 +84D5 iMathPtr2 +84D7 iMathPtr3 +84D9 iMathPtr4 +84DB iMathPtr5 +84DD chkDelPtr1 +84DF chkDelPtr2 +84E1 insDelPtr +84E3 upDownPtr +84E5 fOutDat +84EB asm_data_ptr1 +84ED asm_data_ptr2 +84EF asm_sym_ptr1 +84F1 asm_sym_ptr2 +84F3 asm_ram +8507 asm_ind_call +8508 textShadow +8588 textShadCur +858A textShadTop +858B textShadAlph +858C textShadIns +858D cxMain +858F cxPPutAway +8591 cxPutAway +8593 cxRedisp +8595 cxErrorEP +8597 cxSizeWind +8599 cxPage +859A cxCurApp +859B cxPrev +85AA monQH +85AB monQT +85AC monQueue +85BC onSP +85BE onCheckSum +85C0 promptRow +85C1 promptCol +85C2 promptIns +85C3 promptShift +85C4 promptRet +85C6 promptValid +85C8 promptTop +85CA promptCursor +85CC promptTail +85CE promptBtm +85D0 varType +85D1 varCurrent +85D9 varClass +85DA catCurrent +85DC menuActive +85DD menuAppDepth +85DE menuCurrent +85E8 progCurrent +85FE userMenuSA +865F ioPrompt +8660 RectFillPHeight +8660 dImageWidth +8661 RectFillPWidth +8662 RectFillPattern +8670 ioFlag +8672 sndRecState +8673 ioErrState +8674 header +867D ioData +8689 ioNewData +868B bakHeader +86B7 calc_id +86D7 penCol +86D8 penRow +86D9 rclQueue +86DB rclQueueEnd +86DD errNo +86DE errSP +86E0 errOffset +86EC saveSScreen +89EC usermem_offset +89EE bstCounter +89F0 flags +8A3A statVars +8C17 anovaf_vars +8C4D infVars +8D17 curGStyle +8D18 curGY +8D19 curGX +8D1A curGY2 +8D1B curGX2 +8D1C freeSaveY +8D1D freeSaveX +8DA1 XOffset +8DA2 YOffset +8DA3 lcdTallP +8DA4 pixWideP +8DA5 pixWide_m_1 +8DA6 pixWide_m_2 +8DA7 lastEntryPtr +8DA9 lastEntryStk +8E29 numLastEntries +8E2A currLastEntry +8E67 curInc +8E6A ORGXMIN +8EB4 uThetMin +8EBD uThetMax +8EC6 uThetStep +8ECF uTmin +8ED8 uTmax +8EE1 uTStep +8E7E uXmin +8E87 uXmax +8E90 uXscl +8E99 uYmin +8EA2 uYmax +8EAB uYscl +8EEA uPlotStart +8EF3 unMax +8EFC uu0 +8F05 uv0 +8F0E unMin +8F17 uu02 +8F20 uv02 +8F29 uw0 +8F32 uPlotStep +8F3B uXres +8F44 uw02 +8F50 Xmin +8F59 Xmax +8F62 Xscl +8F6B Ymin +8F74 Ymax +8F7D Yscl +8FB3 Tstep +8FBC PlotStart +8FC5 nMax +8FCE u0 +8FD7 v0 +8FE0 nMin +8FE9 u02 +8FF2 v02 +8FFB w0 +9004 PlotStep +900D XresO +9016 w02 +901F un1 +9028 un2 +9031 vn1 +903A vn2 +9043 wn1 +904C wn2 +9055 fin_N +905E fin_I +9067 fin_PV +9070 fin_PMT +9079 fin_FV +9082 fin_PY +908B fin_CY +9094 cal_N +909D cal_I +90A6 cal_PV +90AF cal_PMT +90B8 cal_FV +90C1 cal_PY +90D3 smallEditRAM +9151 Xres_int +913F XFact +9148 YFact +9152 deltaX +915B deltaY +9164 shortX +916D shortY +9176 lower +917F upper +8F86 ThetaMin +8F8F ThetaMax +8F98 ThetaStep +8FA1 TminPar +8FAA TmaxPar +918C XOutSym +918E XOutDat +9190 YOutSym +9192 YOutDat +9194 inputSym +9196 inputDat +9198 prevData +92C9 P1Type +92CA SavX1List +92CF SavY1List +92D4 SavF1List +92D9 P1FrqOnOff +92DA P2Type +92DB SavX2List +92E0 SavY2List +92E5 SavF2List +92EA P2FrqOnOff +92EB P3Type +92EC SavX3List +92F1 SavY3List +92F6 SavF3List +92FB P3FrqOnOff +92B3 TblMin +92BC TblStep +9302 ES +9340 plotSScreen +9640 seed1 +9649 seed2 +9652 parseVar +965B begPC +965D curPC +965F endPC +9776 GY1 +9777 GY2 +9778 GY3 +9779 GY4 +977A GY5 +977B GY6 +977C GY7 +977D GY8 +977E GY9 +977F GY0 +9780 GX1 +9781 GX2 +9782 GX3 +9783 GX4 +9784 GX5 +9785 GX6 +9786 GR1 +9787 GR2 +9788 GR3 +9789 GR4 +978A GR5 +978B GR6 +978C GU +978D GV +978E GW +966E cmdShadow +96EE cmdShadCur +96F0 cmdShadAlph +96F1 cmdShadIns +96F2 cmdCursor +96F4 editTop +96F6 editCursor +96F8 editTail +96FA editBtm +9706 editSym +9708 editDat +97A3 modePtr +97A5 winTop +97A6 winBtm +97A7 winLeftEdge +97A8 winLeft +97AA winAbove +97AC winRow +97AE winCol +97B0 fmtDigits +97B1 fmtString +97F2 fmtConv +9804 fmtLeft +9806 fmtIndex +9808 fmtMatSym +980A fmtMatMem +980C EQS +9815 delAdjAmt +9818 tSymPtr1 +981A tSymPtr2 +981C chkDelPtr3 +981E chkDelPtr4 +9820 tempMem +9822 fpBase +9824 FPS +9826 OPBase +9828 OPS +982A pTempCnt +982C cleanTmp +982E pTemp +9830 progPtr +9832 newDataPtr +9834 pagedCount +9835 pagedPN +9836 pagedGetPtr +9838 pagedPutPtr +983A pagedBuf +984D appErr1 +985A appErr2 +9867 flashByte1 +9868 flashByte2 +9869 freeArcBlock +986B arcPage +986C arcPtr +9870 appRawKeyHandle +9872 appBackUpScreen +9B72 customHeight +9B73 localLanguage +9B78 linkActivityHookPtr +9B7C cursorHookPtr +9B80 libraryHookPtr +9B84 rawKeyHookPtr +9B88 getKeyHookPtr +9B8C homescreenHookPtr +9B90 windowHookPtr +9B94 graphHookPtr +9B98 yEquHookPtr +9B9C fontHookPtr +9BA0 regraphHookPtr +9BA4 drawingHookPtr +9BA8 traceHookPtr +9BAC parserHookPtr +9BB0 appChangeHookPtr +9BB4 catalog1HookPtr +9BB8 helpHookPtr +9BBC cxRedispHookPtr +9BC0 menuHookPtr +9BC4 catalog2HookPtr +9BC8 tokenHookPtr +9BCC localizeHookPtr +9BD0 silentLinkHookPtr +9BD4 usbHookPtr +9C06 baseAppBrTab2 +9CB0 DBKeyScanCode +9CB1 DBKeyRptCtr +9D65 localTokStr +9D76 keyForStr +9D77 keyToStrRam +9D88 sedMonSp +9D8A bpSave +9D95 userMem +0FE66 symTable + +[flags] +00 kbdFlags +0,00 inDelete,ioDelFlag +2,00 trigDeg,trigFlags +3,00 kbdSCR,kbdFlags +4,00 kbdKeyPress,kbdFlags +5,00 donePrgm,doneFlags +01 editFlags +2,01 editOpen,editFlags +4,01 monAbandon,monFlags +02 plotFlags +0,02 plotTrace,plotFlags +1,02 plotLoc,plotFlags +2,02 plotDisp,plotFlags +4,02 grfFuncM,grfModeFlags +5,02 grfPolarM,grfModeFlags +6,02 grfParamM,grfModeFlags +7,02 grfRecurM,grfModeFlags +03 graphFlags +0,03 graphDraw,graphFlags +1,03 graphProg,graphFlags +04 grfDBFlags +0,04 grfDot,grfDBFlags +1,04 grfSimul,grfDBFlags +2,04 grfGrid,grfDBFlags +3,04 grfPolar,grfDBFlags +4,04 grfNoCoord,grfDBFlags +5,04 grfNoAxis,grfDBFlags +6,04 grfLabel,grfDBFlags +05 textFlags +1,05 textEraseBelow,textFlags +2,05 textScrolled,textFlags +3,05 textInverse,textFlags +4,05 textInsMode,textFlags +07 ParsFlag2 +0,07 numOP1,ParsFlag2 +08 apdFlags +0,08 preClrForMode,newDispF +2,08 apdAble,apdFlags +3,08 apdRunning,apdFlags +09 onFlags +0,09 appWantAlphaUpDn,alphaUpDnFlag +3,09 onRunning,onFlags +4,09 onInterrupt,onFlags +6,09 statsValid,statFlags +7,09 statANSDISP,statFlags +0A fmtFlags +0,0A fmtExponent,fmtFlags +1,0A fmtEng,fmtFlags +2,0A fmtHex,fmtFlags +3,0A fmtOct,fmtFlags +4,0A fmtBin,fmtFlags +5,0A fmtReal,fmtFlags +6,0A fmtRect,fmtFlags +7,0A fmtPolar,fmtFlags +0B fmtOverride +0,0B fmtExponent,fmtOverride +1,0B fmtEng,fmtOverride +2,0B fmtHex,fmtOverride +3,0B fmtOct,fmtOverride +4,0B fmtBin,fmtOverride +5,0B fmtReal,fmtOverride +6,0B fmtRect,fmtOverride +7,0B fmtPolar,fmtOverride +0C curFlags +0,0C fmtEdit,fmtEditFlags +2,0C curAble,curFlags +3,0C curOn,curFlags +4,0C curLock,curFlags +5,0C cmdVirgin,cmdFlags +0D appFlags +0,0D appWantIntrpt,appFlags +1,0D appTextSave,appFlags +2,0D appAutoScroll,appFlags +3,0D appMenus,appFlags +4,0D appLockMenus,appFlags +5,0D appCurGraphic,appFlags +6,0D appCurWord,appFlags +7,0D appExit,appFlags +0E rclFlags +7,0E rclQueueActive +0F seqFlags +0,0F webMode,seqFlags +1,0F webVert,seqFlags +2,0F sequv,seqFlags +3,0F seqvw,seqFlags +4,0F sequw,seqFlags +11 promptFlags +0,11 promptEdit,promptFlags +3,11 expr_param,plotFlag2 +4,11 expr_writing,plotFlag2 +12 shiftFlags +0,12 indicRun,indicFlags +1,12 indicInUse,indicFlags +2,12 indicOnly,indicFlags +3,12 shift2nd,shiftFlags +4,12 shiftAlpha,shiftFlags +5,12 shiftLwrAlph,shiftFlags +6,12 shiftALock,shiftFlags +7,12 shiftKeepAlph,shiftFlags +13 tblFlags +4,13 autoFill,tblFlags +5,13 autoCalc,tblFlags +6,13 reTable,tblFlags +14 sGrFlags +0,14 grfSplit,sGrFlags +1,14 vertSplit,sGrFlags +2,14 grfSChanged,sGrFlags +3,14 grfSplitOverride,sGrFlags +4,14 write_on_graph,sGrFlags +5,14 g_style_active,sGrFlags +6,14 cmp_mod_box,sGrFlags +7,14 textWrite,sGrFlags +15 newIndicFlags +0,15 extraIndic,newIndicFlags +1,15 saIndic,newIndicFlags +16 newFlags2 +5,16 noRestores,newFlags2 +17 smartFlags +0,17 smartGraph,smartFlags +1,17 smartGraph_inv,smartFlags +1A more_Flags +2,1A No_Del_Stat,more_Flags +0,1D gkKeyRepeating,gkFlag +21 asm_Flag1 +22 asm_Flag2 +23 asm_Flag3 +24 appLwrCaseFlag +1,24 comFailed,getSendFlg +3,24 lwrCaseActive,appLwrCaseFlag +26 groupFlags +1,26 inGroup,groupFlags +28 apiFlag +0,28 appAllowContext,apiFlag +4,28 appRunning,apiFlag +7,28 appRetOffKey,apiFlag +29 apiFlg2 +2A apiFlg3 +2B apiFlg4 +2,2B fullScrnDraw,apiFlg4 +2C apiFlg5 +0,2C appWantDiagonalKeys,apiFlg5 +2E xapFlag0 +2F xapFlag1 +30 xapFlag2 +31 xapFlag3 +32 fontFlags +2,32 fracDrawLFont,fontFlags +3,32 fracTallLFont,fontFlags +6,32 drawLFont,fontFlags +7,32 customFont,fontFlags +33 hookFlags0 +0,33 alt_On,scriptFlag +1,33 alt_Off,scriptFlag +2,33 useRclQueueEnd,rclFlag2 +3,33 ignoreBPLink,backGroundLink +4,33 linkActivityHookActive,linkActivityHookFlag +34 hookFlags1 +0,34 getKeyHookActive,getKeyHookFlag +1,34 libraryHookActive,libraryHookFlag +4,34 homescreenHookActive,homescreenHookFlag +5,34 rawKeyHookActive,rawKeyHookFlag +6,34 catalog2HookActive,catalog2HookFlag +7,34 cursorHookActive,cursorHookFlag +35 hookFlags2 +0,35 tokenHookActive,tokenHookFlag +1,35 localizeHookActive,localizeHookFlag +2,35 windowHookActive,windowHookFlag +3,35 graphHookActive,graphHookFlag +4,35 yEquHookActive,yEquHookFlag +5,35 fontHookActive,fontHookFlag +6,35 regraphHookActive,regraphHookFlag +7,35 drawingHookActive,drawingHookFlag +36 hookFlags3 +0,36 traceHookActive,traceHookFlag +1,36 parserHookActive,parserHookFlag +2,36 appChangeHookActive,appChangeHookFlag +3,36 catalog1HookActive,catalog1HookFlag +4,36 helpHookActive,helpHookFlag +5,36 cxRedispHookActive,cxRedispHookFlag +6,36 menuHookActive,menuHookFlag +7,36 silentLinkHookActive,silentLinkHookFlag +37 hookAutoFlags1 +38 hookAutoFlags2 +39 hookAutoFlags3 +3A hookFlags4 +0,3A usbHookActive,usbHookFlag +3C plotFlag3 +0,3C bufferOnly,plotFlag3 +4,3C useFastCirc,plotFlag3 +3D DBKeyFlags +0,3D leftShiftPressed,DBKeyFlags +1,3D rightShiftPressed,DBKeyFlags +2,3D diamondPressed,DBKeyFlags +3,3D squarePressed,DBKeyFlags +4,3D repeatMost,DBKeyFlags +5,3D haveDBKey,DBKeyFlags +6,3D keyDefaultsF,DBKeyFlags +7,3D HWLinkErrF,DBKeyFlags +3E openLibFlag +4,3E openLibActive,openLibFlag +3F clockFlags +0,3F clockNotMonthFirst,clockFlags +1,3F clockYearFirst,clockFlags +2,3F clock24Hour,clockFlags +4,3F clockFmtASCII,clockFlags diff --git a/tool/tilem-src/data/symbols/ti85.sym b/tool/tilem-src/data/symbols/ti85.sym new file mode 100644 index 0000000..4cab7ed --- /dev/null +++ b/tool/tilem-src/data/symbols/ti85.sym @@ -0,0 +1,254 @@ +[macros] +0CD098C ROM_CALL~%C +0CD0C8C CALL_~Z,prgm+%j +0CD0F8C CALL_~prgm+%j +0CD128C CALL_~NZ,prgm+%j +0CD188C CALL_~C,prgm+%j +0CD1E8C CALL_~NC,prgm+%j +0CD248C JUMP_~Z,prgm+%j +0CD278C JUMP_~prgm+%j +0CD2A8C JUMP_~NZ,prgm+%j +0CD308C JUMP_~C,prgm+%j +0CD368C JUMP_~NC,prgm+%j +0CDC88C RCALL_~%j + +[romcalls] +00 TX_CHARPUT +01 D_LT_STR +02 M_CHARPUT +03 D_ZM_STR +04 D_LM_STR +05 GET_T_CUR +06 SCROLL_UP +07 TR_CHARPUT +08 CLEARLCD +09 D_HL_DECI +0A CLEARTEXT +0B D_ZT_STR +0C BUSY_OFF +0D BUSY_ON +80 FIND_PIXEL + +[labels] +0008 rOP1TOOP2 +0010 rFINDSYM +0018 rPUSHOP1 +0020 rMOV10TOOP1 +0028 rFPMULT +0030 rFPADD + +0033 LD_HL_MHL +008E CP_HL_DE +009A UNPACK_HL +01A2 READ_KEYPAD +01B1 STORE_KEY +01BE GET_KEY +0115 UPDATE_APD +0168 READ_KEY + +8000 kbdScanCode +8001 kbdLGSC +8002 kbdPSC +8003 kbdWUR +8004 kbdDebncCnt +8005 kbdKey +8006 kbdGetKy +8007 contrast +8008 apdSubTimer +8009 apdTimer +800A apdWarmUp +800B curTime +800C curRow +800D curCol +800E curUnder +800F undelBufLen +8010 undelBuf +# 8074 tokVarPtr? +# 8076 tokLen? +8078 indicMem +8080 indicCounter +8081 indicBusy +8082 OP1 +808D OP2 +8098 OP3 +80A3 OP4 +80AE OP5 +80B9 OP6 +80C6 iMathPtr1 +80C8 iMathPtr2 +80CA iMathPtr3 +80CC iMathPtr4 +80CE iMathPtr5 +# 80D0 chkDelPtr1? +# 80D2 chkDelPtr2? +# 80D4 insDelPtr? +# 80D6 upDownPtr? +80DF textShadow +8187 textShadCur +# 8189 textShadTop? +# 818A textShadAlph? +# 818B textShadIns? +818C textAccent +818D cxMain +# 818F cxPPutAway? +# 8191 cxPutAway? +# 8193 cxRedisp? +# 8195 cxErrorEP? +8197 cxSizeWind +8199 cxPage +# 819A cxCurApp? +819B cxPrev +# 81AA monQH? +# 81AB monQT? +# 81AC monQueue? +81BC onSP +81BE onCheckSum +81DD menuActive +8333 penCol +8334 penRow +# 8335 rclQueue? +8337 errNo +8338 errSP +# 833A errOffset? +8346 flags +8364 stCounter +# 85E3 XOutDat? +# 85E7 YOutDat? +# 85EB inputDat? +8629 ES +8641 plotSScreen +8A41 seed1 +8A4B seed2 +# 8A56 parseVar? +8A5F begPC +8A61 curPC +8A63 endPC +8A6B cmdShadow +# 8B27 editDat? +8B2D modePtr +8B2F winTop +8B30 winBtm +8B31 winLeftEdge +8B32 winLeft +8B34 winAbove +8B36 winRow +# 8B38 winCol? +8B3A fmtDigits +# 8B96 fmtMatMem? +# 8B98 EQS? +8BD2 delAdjAmt +8BDD tempMem +8BDF fpBase +8BE1 FPS +8BE3 OPBase +8BE5 OPS +# 8BE7 pTempCnt? +# 8BE9 cleanTmp? +8BEB pTemp +8BF7 userMem +0FA6F symTable +0FC00 videoRAM + +## ZShell +8C3C PROGRAM_ADDR +8C3E ROM_VERS +8C3F ZSHELL_VER +8C40 ZS_BITS + +## Usgard +8E8B ORGSP +8EA2 USGSHELL +8EAB VATName +8EB4 DEST_ADDR +8EB4 PAGE1ADDR +8EB6 PAGE2ADDR +8C08 PROG_BYTE +8C41 TX_CHARPUT +8C44 D_LT_STR +8C47 M_CHARPUT +8C4A D_ZM_STR +8C4D D_LM_STR +# 8C50 SCROLL_UP +# 8C53 TR_CHARPUT +# 8C56 CLEARLCD +# 8C59 D_HL_DECI +# 8C5C CLEARTEXT +# 8C5F D_ZT_STR +# 8C62 BUSY_OFF +# 8C65 BUSY_ON +# 8C68 RANDOM +8C6B FIND_PIXEL +8C77 FREEMEM +8C7A VAR_LENGTH +8C7D ASCIIZ_LEN +8C80 NEG_BC +8C83 MUL_HL +8C8C COPY_STRING +8C9B USGARD_INT_INSTALL +8C9E USGARD_INT_REMOVE +8CA1 USGARD_INT_CLEAN +8C95 APPEND +8C98 UNAPPEND +8CCB CHECK_APPEND +8CA4 VAR_NEW +8CA7 VAR_DELETE +8CAA VAR_EXEC +8CAD VAR_GET +8CB0 VAR_RESIZE +8CCE RELOC +8CD1 DERELOC +8CD7 RELOC_TAB +8CB3 SEARCH_VAT +8CB6 OTH_SHUTDOWN +8CB9 DM_HL_DECI +8CBC OTH_PAUSE +8CBF OTH_CLEAR +8CC2 OTH_EXIT +8CC5 OTH_ARROW +8CD4 OTH_FILL + +## Rigel +# 8C50 GET_T_CUR +# 8C53 SCROLL_UP +# 8C56 TR_CHARPUT +# 8C59 CLEARLCD +# 8C5C D_HL_DECI +# 8C5F CLEARTEXT +# 8C62 D_ZT_STR +# 8C65 BUSY_OFF +# 8C68 BUSY_ON +8C6E RIGEL_INT_INSTALL +8C71 RIGEL_INT_REMOVE +8C06 VAR_SEARCH + +[flags] +00 kbdFlags +2,00 trigDeg,trigFlags +3,00 kbdSCR,kbdFlags +4,00 kbdKeyPress,kbdFlags +05 textFlags +2,05 textScrolled,textFlags +3,05 textInverse,textFlags +4,05 textInsMode,textFlags +08 apdFlags +2,08 apdAble,apdFlags +3,08 apdRunning,apdFlags +09 onFlags +3,09 onRunning,onFlags +4,09 onInterrupt,onFlags +0C curFlags +2,0C curAble,curFlags +3,0C curOn,curFlags +4,0C curLock,curFlags +0D appFlags +1,0D appTextSave,appFlags +5,0D appCurGraphic,appFlags +6,0D appCurWord,appFlags +12 indicFlags +0,12 indicRun,indicFlags +2,12 indicOnly,indicFlags +3,12 shift2nd,shiftFlags +4,12 shiftAlpha,shiftFlags +5,12 shiftLwrAlph,shiftFlags +6,12 shiftALock,shiftFlags +7,12 shiftKeepAlph,shiftFlags diff --git a/tool/tilem-src/data/symbols/ti86.sym b/tool/tilem-src/data/symbols/ti86.sym new file mode 100644 index 0000000..5fb2cf3 --- /dev/null +++ b/tool/tilem-src/data/symbols/ti86.sym @@ -0,0 +1,1112 @@ +[labels] +0008 rOP1TOOP2 +0010 rFINDSYM +0018 rPUSHOP1 +0020 rMOV10TOOP1 +0028 rFPMULT +0030 rFPADD + +4010 _ldhlind +4028 _chkON +402C _bitgrffuncm +4030 _bitgrfpolarm +4034 _bitgrfparamm +4038 _bitgrfrecurm +403C _cphlde +4040 _put_colon +4044 _divHLby10 +4048 _divHLbyA +404C _divAHLby10 +4058 _timeout +4060 _resetAPD +4064 _scan_code +4068 _get_key +409C _jforcecmdnochar +40B5 _pPutAwayPrompt +40BD _call_cxPPutAway +40C1 _call_cxPutAway +40C5 _call_cxSizeWind +40C9 _call_cxErrorEP +40CD _call_cxMain +40D1 _cxNull +40D2 _p_cxNull +40DD _err_handler +40E1 _set_cx_100 +40E5 _set_cx_50 +40E9 _set_cx_dec +40ED _set_context +4101 _off +4109 _reset +4119 _removTok +412D _errAxes +4130 _errFldOrder +4133 _errStatPlot +4136 _errOverflow +4139 _errDivBy0 +413c _errSingularMat +413f _errDomain +4142 _errIncrement +4145 _errSyntax +4148 _errNumberBase +414B _errMode +414e _errDataType +4151 _errArgument +4154 _errDimMismatch +4157 _errDimension +415A _errUndefined +4169 _errReserved +416c _errInvalid +416f _errIllegalNest +4172 _errBound +4175 _errGraphWindow +4178 _errZoom +417b _errBreak +417e _errStat +4181 _errConversion +4184 _errSolver +4187 _errIterations +418a _errBadGuess +418d _errDifEqSetup +4190 _errPoly +4193 _errTolNotMet +4196 _errLink +4199 _errorA +419C _error +41A1 _instError +41A4 _removError +41B7 _ld_de_fp0 +41BB _ld_de_fp1 +41BF _mulHL10 +41C3 _ckop1cplx +41C7 _ckcplx +41CB _ckop1real +41FB _cpop1op2 +4203 _op3toop4 +4207 _op1toop4 +420B _op2toop4 +420F _movtoop4 +4213 _op4toop2 +4217 _op4toop3 +421B _op3toop2 +421F _op1toop3 +4223 _movfrop1 +4227 _op5toop2 +422B _op5toop6 +422F _op5toop4 +4233 _op1toop2 +4237 _movtoop2 +423B _op6toop2 +423F _op6toop1 +4243 _op4toop1 +4247 _op5toop1 +424B _op3toop1 +424F _op4toop5 +4253 _op3toop5 +4257 _op2toop5 +425B _movtoop5 +425F _op2toop6 +4263 _op1toop6 +4267 _movtoop6 +426B _op1toop5 +426F _op2toop1 +4273 _movtoop1 +4277 _mov11b +427B _mov10b +427F _mov9b +4283 _mov9b_ +4287 _mov8b +428B _mov7b +428F _mov7b_ +4293 _mov6b +4297 _mov5b +429B _mov4b +429F _mov3b +42A3 _mov2b +42A7 _op4toop2m +42CB _op2toop3 +42CF _movtoop3 +42D3 _op4toop6 +42D7 _mov10toop1 +42DB _mov10toop1op2 +42DF _mov10toop2 +42E3 _movfroop1 +42E7 _op4set1 +42EB _op3set1 +42EF _op2set8 +42F7 _op2set5 +42FB _op2set4 +4303 _op2set3 +430F _op1set1 +4313 _op1set4 +4317 _op1set3 +431B _op3set2 +431F _op1set2 +4323 _op2set2 +432F _op2set1 +4343 _ld_hl_8z +4347 _ld_hl_8a +434B _ld_hlplus1_7a +434F _ld_hl_7a +4353 _op4set0 +4357 _op3set0 +435B _op2set0 +435F _op1set0 +4363 _ld_hl_fp0 +4367 _zeroop1m +436B _zeroop1 +436F _zeroop2 +4373 _zeroop3 +4377 _ld_hl_11z +437B _ld_hl_bz +4383 _shracc +438B _shlacc +446F _ex_op2_op6 +4473 _ex_op5_op6 +4477 _ex_op1_op5 +447B _ex_op1_op6 +447F _ex_op2_op4 +4483 _ex_op2_op5 +4487 _ex_op1_op3 +448B _ex_op1_op4 +448F _ex_op1_op2 +449B _ckop1fp0 +44A3 _ckop2fp0 +44B3 _ckop1int +44B7 _ckint +44BB _ckop1odd +44BF _ckodd +450B _ckop2pos +450F _ckop1pos +4513 _absop2 +4527 _inco1exp +4547 _HtimesL +458F _findsym_error +45E3 _invsub +45EB _PLUS1 +45EF _inc_ptr_ade +45F3 _ex_ahl_bde +460B _get_size_word +4613 _setXXop1 +4617 _setXXop2 +461B _setXXXXop2 +462F _load_ram_ahl +4633 _conv_ahl +4637 _inc_ptr_ahl +463B _dec_ptr_ahl +463F _inc_ptr_bde +4643 _dec_ptr_bde +4647 _set_abs_src_addr +464B _get_free_mem +464F _set_mm_num_bytes +4657 _round_OP1 +46AF _check_asm +46B7 _jump_table +46BB _memchk +46BF _dec_ptr_ade +46C3 _getb_ahl +46C7 _cp_ahl_bde +46CB _findsym +46D3 _copy_fwd +46D7 _del_temp_vars +46EB _createreal +46EF _createrconst +46F3 _createcconst +46F7 _createcplx +46FB _creatervect_temp +46FF _creatervect +4703 _createcvect_temp +4707 _createcvect +470B _createrlist_temp +470F _createrlist +4713 _createclist_temp +4717 _createclist +471B _creatermat_temp +471F _creatermat +4723 _createcmat_temp +4727 _createcmat +472B _createstrng_temp +472F _createstrng +4733 _createequ_temp +4737 _createequ +473B _createpict +474F _createprog +475B _copy_bkwd +475F _delvar +476F _update_VAT_ptrs +477B _get_size +477F _get_var_size +4783 _push_bc_OPS +4787 _check_STACK_mem +478B _pop_bc_OPS +478F _push_a_OPS +4793 _pop_a_OPS +479F _popop1 +47A3 _poprealo6 +47A7 _poprealo5 +47AB _poprealo4 +47AF _poprealo3 +47A3 _poprealo2 +47A7 _poprealo1 +47CB _sub_FPS_20 +47CF _sub_FPS_10 +47D3 _sub_FPS_bc +47DB _deallocfps1 +47E3 _ram_page_1 +47E7 _load_ram_OPS +47EB _load_ram_ES +47EF _load_ram_FPS +47F3 _ram_page_7 +4813 _pushrealo1 +4893 _cpyto2fpst +4897 _cpyto1fpst +48AF _cpyto2fps1 +48C3 _cpyto2fps2 +48D7 _cpyo2tofpst +48DB _cpyo6tofpst +48DF _cpyo1tofpst +48E3 _cpydetofpst +48E7 _cpydetohlt +48EB _cpydetohlc +48EF _cpyo5tofps2 +48F3 _cpyo2tofpsto1tofps1 +48F7 _cpyo1tofps1 +48FB _cpydetofps1 +48FF _cpydetohl1 +4903 _cpyo2tofps2 +4907 _cpyo3tofps2 +490B _cpyo6tofps2 +490F _cpyo1tofps2 +4913 _cpydetofps2 +4917 _cpydetohl2 +491B _cpyo5tofps3 +491F _cpyo2tofps2o1tofps3 +4923 _cpyo1tofps3 +4927 _cpydetofps3 +492B _cpydetohl3 +492F _cpyo1tofps4 +4933 _cpydetofps4 +4937 _cpydetohl4 +493B _cpyo1tofps6 +493F _cpyo1tofps7 +4943 _cpyo1tofps8 +494F _ask_self_test +4953 _self_test +4957 _strlen +495B _strcpy +495F _strcat +4963 _strcmp +496B _find_bit +498C _cursorOff +4994 _cursorOn +49A0 _reset_MATH +49B0 _disp_GRAPH +49DC _flushallmenus +49E8 _disp_menu +4A0A _exec_pg1 +4A27 _putmap +4A2B _putc +4A33 _dispAHL +4A37 _puts +4A3B _putps +4A5F _newline +4A7E _clrLCD +4A82 _clrScrn +4A86 _clrWindow +4A8A _clrLine +4A95 _homeup +4AA1 _vputmap +4AA5 _vputs +4AA9 _vputsn +4AAD _runindicon +4AB1 _runindicoff +4AB5 _clrText +4B1B _exec_pg2 +4B1F _binopexec1 +4B93 _tofrac +4B9F _gfudydx +4C2F _INTOP1 +4C3F _ahl_plus_2_pg3 +4C47 _exec_basic +4C9F _stoAns +4CB3 _stoY +4CBB _stoX +4CBF _stoOther +4CDF _rclY +4CE3 _rclX +4CE7 _rclVarSym +4D13 _get_token +4D1B _get_varname +4D3F _disp +4D43 _pause +4D6F _PDspGrph +4D73 _horizCmd +4D77 _vertCmd +4DAF _unpack_hex +4E39 _grbufcpy +4E51 _ILine +4E59 _IPoint +4E71 _geqnamea +4FA8 _set_app_title +514B _FindAlphaUp +514F _FindAlphaDn +515B _dispOP1 +515F _dispDone +5191 _formReal +51E9 _CLine +5209 _get_abs_src_addr +521D _get_word_ahl +5221 _set_word_ahl +5235 _abs_mov10toop1 +5239 _abs_mov10toop1_noset +523D _abs_mov10b_set_d +5249 _abs_mov10b +5241 _abs_movfrop1_set_d +5245 _abs_movfrop1 +5285 _set_abs_dest_addr +52B5 _RcPicGrph +52ED _mm_ldir +52F1 _mm_lddr +5369 _get_statvar +5371 _getky +5398 _low_battery +5464 _mov10op2add +5468 _INTGR +5470 _MINUS1 +5474 _FPSUB +5478 _FPADD +5484 _TIMESPT5 +5488 _FPSQUARE +548C _FPMULT +5490 _invop1op2 +5494 _invop1s +5498 _invop2s +549C _FRAC +54A4 _FPRECIP +54A8 _FPDIV +54AC _SQROOT +54B0 _SQROOTP +54BC _RNDGUARD +54C0 _ROUND +54C4 _LNX +54C8 _LNXP +54CC _LOGXP +54D0 _LOGX +54D4 _ETOX +54D8 _TENX +54E0 _SIN +54E4 _COS +54E8 _TAN +54F0 _TANH +54F4 _COSH +54F8 _SINH +5508 _ACOS +550C _ACOSP +5510 _ATAN +5514 _ASIN +551C _ATANH +5524 _ASINH +5528 _ACOSH +5538 _YTOX +5544 _randint +5567 _writeb_inc_ahl +5577 _convop1 +557B _set_mode +55a3 _asmComp +55AA _getkey +55DA _random +5643 _vputspace +569D _get_char +56A1 _get_vchar +56EA _call_user_on +56ED _call_user_off +56F0 _call_sqrtexpr +56F3 _call_sqrtparse +56F6 _call_sqrtexec +56F9 _call_sqrtform +56FC _call_sqrtcmdtok +56FF _call_sqrthome +5702 _call_sqrtkey +5705 _call_sqrtgrf +5718 _exec_pg4 +5714 _exec_pg3 +571C _linkExec +5730 _exec_assembly +5732 _errNoSignChng +575C _instTok + +0C000 _kbdScanCode +0C001 _kbdLGSC +0C002 _kbdPSC +0C003 _kbdWUR +0C004 _kbdDebncCnt +0C005 _kbdkey +0C006 _kbdGetKy +0C007 _keyextend +0C008 _contrast +0C009 _APDSubTimer +0C00A _APDTimer +0C00B _APDWarmUp +0C00C _viet +0C00E _curTime +0C00F _curRow +0C010 _curCol +0C011 _curUnder +0C012 _undelBufLen +0C013 _undelBuf +0C077 _P_tokVarPtr +0C07A _toklen +0C07C _TOK_B3 +0C07D _DETOK_H3 +0C07E _MEMPRE_H3 +0C07F _indicMem +0C087 _indicCounter +0C088 _indicBusy +0C089 _OP1 +0C08A _OP1EXPM +0C08B _OP1EXPL +0C08C _OP1M +0C093 _OP1EXT +0C094 _LOGKP +0C094 _OP2 +0C095 _OP2EXPM +0C096 _OP2EXPL +0C097 _OP2M +0C09E _OP2EXT +0C09F _OP3 +0C09F _LOGKM +0C0A0 _OP3EXPM +0C0A1 _OP3EXPL +0C0A2 _OP3M +0C0A9 _OP3EXT +0C0AA _CORDFLG1 +0C0AA _OP4 +0C0AB _OP4EXPM +0C0AC _OP4EXPL +0C0AD _OP4M +0C0B4 _OP4EXT +0C0B5 _EK +0C0B5 _CORDFLG +0C0B5 _OP5 +0C0B6 _OP5EXPM +0C0B6 _SF +0C0B6 _EL +0C0B7 _OP5EXPL +0C0B7 _EM +0C0B8 _OP5M +0C0B8 _EMM1 +0C0B9 _EITS +0C0BA _ENM2 +0C0BB _ENA +0C0BC _EEN +0C0BF _OP5EXT +0C0C0 _EN +0C0C0 _OP6 +0C0C1 _EJ +0C0C1 _OP6EXPM +0C0C2 _OP6EXPL +0C0C2 _EEI +0C0C3 _OP6M +0C0C5 _ELOW +0C0C6 _EIGH +0C0CA _OP6EXT +0C0CC _OP7 +0C0D7 _CPLXTRG +0C0D7 _IOFLAG +0C0D8 _P_IMATHPTR1 +0C0DB _P_IMATHPTR2 +0C0DE _P_IMATHPTR3 +0C0E1 _P_IMATHPTR4 +0C0E4 _P_IMATHPTR5 +0C0E7 _CHKDELPTR1 +0C0E7 _P_CHKDELPTR1 +0C0EA _P_CHKDELPTR2 +0C0ED _P_INSDELPTR +0C0F0 _P_UPDOWNPTR +0C0F3 _STDRNGSGN +0C0F4 _POLRNGSGN +0C0F5 _PARRNGSGN +0C0F6 _DIFRNDSGN +0C0F7 _USRRNGSGN +0C0F8 _STATSGN +0C0F9 _textShadow +0C1A1 _textShadCur +0C1A3 _textShadTop +0C1A4 _textShadAlph +0C1A5 _textShadIns +0C1A6 _textAccent +0C1A7 _cxMain +0C1A9 _cxPPutAway +0C1AB _cxPutAway +0C1AD _cxRedisp +0C1AF _cxErrorEP +0C1B1 _cxSizeWind +0C1B3 _cxPage +0C1B4 _CXCURAPP +0C1B5 _cxPrev +0C1C4 _monQH +0C1C5 _monQT +0C1C6 _monQueue +0C1D6 _onSP +0C1D8 _onCheckSum +0C1DA _promptRow +0C1DB _promptCol +0C1DC _promptIns +0C1DD _promptShift +0C1DE _promptRet +0C1E0 _promptValid +0C1E2 _P_promptTop +0C1E5 _P_promptCursor +0C1E8 _P_promptTail +0C1EB _P_promptBtm +0C1EE _varType +0C1EF _varCurrent +0C1F8 _varFAFlags +0C1FA _varClass +0C1FB _catCurrent +0C1FD _menuActive +0C1FE _menu2Hilite +0C1FF _menuSingle +0C201 _menuAppStack +0C20D _menuAppPtr +0C20F _menuAppDepth +0C210 _menuSysStack +0C21C _menuSysPtr +0C21E _menuSysDepth +0C21F _menuPrvStack +0C22B _menuPrvPtr +0C22D _menuPrvDepth +0C22E _m2i +0C242 _menuDyn1 +0C26A _menuDyn5 +0C274 _userMenu1 +0C275 _userMenuTitle +0C27C _userMenu2 +0C284 _userMenu3 +0C28C _userMenu4 +0C294 _userMenu5 +0C29C _userMenuSA +0C31C _XSTATSAV +0C324 _ioPrompt +0C326 _YSTATSAV +0C330 _FSTATSAV +0C33A _IOSNDTYP +0C33B _SNDRECSTATE +0C33C _IOERRSTATE +0C33D _HEADER +0C346 _IODATA +0C352 _BAKHEADER +0C35B _TBLRNGSGN +0C35C _calc_id +0C37C _penCol +0C37D _penRow +0C37E _P_RCLQUEUE +0C381 _ERRNO +0C382 _ERRSP +0C384 _errOffset +0C386 _ram_to_use +0C390 _offerr_sav_bc +0C392 _ABS_SRC_ADDR +0C395 _ABS_DEST_ADDR +0C398 _MM_NUM_BYTES +0C39B _mm_tmp1 +0C39D _mm_tmp2 +0C39F _mm_tmp3 +0C3A1 _mm_tmp4 +0C3A3 _mm_tmp5 +0C3A5 _ram_cache +0C3E5 _Flags +0C40A _ram_to_use1 +0C414 _statReg +0C415 _STATVARS +0C555 _STCounter +0C555 _curgstyle +0C556 _curGY +0C557 _curGX +0C558 _curGY2 +0C559 _curGX2 +0C55A _curgstyle_save +0C55B _curgstylesave +0C55C _plotflagsave +0C55D _XMINPTR +0C55F _XMAXPTR +0C561 _XSCLPTR +0C563 _YMINPTR +0C565 _YMAXPTR +0C567 _YSCLPTR +0C569 _DIF1STCURINC +0C56B _TRACEPLOT +0C56C _BOXPLOTINFO +0C56D _SCURINC +0C56F _CURINC +0C571 _YPIXEL +0C572 _ORGXMIN +0C57C _PANSHIFT +0C586 _USRRNGSIZE +0C588 _UTHETMIN +0C58D _STSP +0C58D _STRAMStart +0C592 _UTHETMAX +0C59C _UTHETSTEP +0C5A6 _UTPLOT +0C5B0 _UTMIN +0C5BA _UTMAX +0C5C4 _UTSTEP +0C5CE _UXMIN +0C5D8 _UXMAX +0C5E2 _UXSCL +0C5EC _UYMIN +0C5F6 _UYMAX +0C600 _UYSCL +0C60A _UXRES +0C614 _XRES_INT +0C615 _HDERIV +0C61F _TOL +0C629 _XFACT +0C633 _YFACT +0C63D _DELTAX +0C647 _DELTAY +0C651 _SHORTX +0C65B _SHORTY +0C665 _FUNRNGSIZE +0C667 _FLAGSF +0C668 _XMINF +0C672 _XMAXF +0C67C _XSCLF +0C686 _YMINF +0C690 _YMAXF +0C69A _YSCLF +0C6A4 _LOWER +0C6AE _UPPER +0C6B8 _XRES +0C6C2 _POLRNGSIZE +0C6C4 _FLAGSPOL +0C6C5 _THETAMIN +0C6CF _THETAMAX +0C6D9 _THETASTEP +0C6E3 _XMINPOL +0C6ED _XMAXPOL +0C6F7 _XSCLPOL +0C701 _YMINPOL +0C70B _YMAXPOL +0C715 _YSCLPOL +0C71F _PARRNGSIZE +0C721 _FLAGSPAR +0C722 _TMINPAR +0C72C _TMAXPAR +0C736 _TSTEPPAR +0C740 _XMINPAR +0C74A _XMAXPAR +0C754 _XSCLPAR +0C75E _YMINPAR +0C768 _YMAXPAR +0C772 _YSCLPAR +0C77C _DIFRNGSIZE +0C77E _FLAGSDIF +0C77F _TOLERDIF +0C789 _TPLOTDIF +0C793 _TMINDIF +0C79D _TMAXDIF +0C7A7 _TSTEPDIF +0C7B1 _XMINDIF +0C7BB _XMAXDIF +0C7C5 _XSCLDIF +0C7CF _YMINDIF +0C7D9 _YMAXDIF +0C7E3 _YSCLDIF +0C7ED _XAXISDIF +0C7EE _YAXISDIF +0C7EF _SLOPEF_EQU +0C7F0 _DIRF_X +0C7F1 _DIRF_Y +0C7F2 _DIRF_TIME +0C7FC _FRES +0C806 _INTS +0C810 _DNEQ +0C811 _P_XOUTSYM +0C814 _P_XOUTDAT +0C817 _P_YOUTSYM +0C81A _P_YOUTDAT +0C81D _P_INPUTSYM +0C820 _P_INPUTDAT +0C823 _P_FOUTDAT +0C826 _PREVDATA +0C862 _PREVDATA_EXT +0C86C _P1TYPE +0C86D _SavX1List +0C876 _SavY1List +0C87F _SavF1List +0C888 _P1FRQONOFF +0C889 _P2TYPE +0C88A _SavX2List +0C893 _SavY2List +0C89C _SavF2List +0C8A5 _P2FRQONOFF +0C8A6 _P3TYPE +0C8A7 _SavX3List +0C8B0 _SavY3List +0C8B9 _SavF3List +0C8C2 _P3FRQONOFF +0C8C3 _oldtype +0C8C4 _oldxlist +0C8CD _oldylist +0C8D6 _oldflist +0C8D6 _uppery +0C8DF _oldonoff +0C8E0 _tblpsrow +0C8E1 _tblscroll +0C8E3 _INPUTDAT_PG0 +0C8ED _TblLine +0C8F7 _OldTblMin +0C901 _TBLRNGSIZE +0C903 _TblMin +0C90D _TblStep +0C917 _TABLESGN +0C918 _TableYPtr +0C919 _curTblcol +0C91A _curTblrow +0C91B _dspTblcol +0C91C _dspTblrow +0C91D _higTblcol +0C91E _higTblrow +0C920 _TABLEXDATA +0C920 _TBLMATRIX +0C95C _TABLEYDATA +0C9D4 _TABLETEMPLATE +0C9D5 _SavedEqTok +0C9D7 _SavedEqNum1 +0C9D8 _SavedEqTok1 +0C9DA _SaveAppFlags +0C9DB _SaveCurFlags +0C9DC _SaveCurGstyle +0C9DD _SaveGraphFlags +0C9DE _evalflevel +0C9DF _TmpMatCols +0C9DF _ES +0C9E0 _TmpMatRows +0C9E1 _P_DERIVPTR +0C9E4 _DTMPThresh +0C9E6 _ELCPLXLCNT +0C9E8 _DERIVLEVEL +0C9E9 _P_DIFFEQPTR +0C9EB _P_DSOLVPTR +0C9EE _SOLVAR +0C9F7 _P_QUADPTR +0C9FA _plotSScreen +0CDFA _SEED1 +0CE04 _SEED2 +0CE0E _PARSEVAR +0CE18 _P_BEGPC +0CE1B _P_CURPC +0CE1E _P_ENDPC +0CE21 _ELCNT +0CE23 _COLCNT +0CE24 _ROWCNT +0CE25 _LCOUNT +0CE27 _EOS_ASAP_2ND +0CE28 _EXEC_CONV_SAVE +0CE2A _LASTENTRYPTR +0CE2C _LASTENTRYSTK +0CEAC _numlastentries +0CEAD _currlastentry +0CEAE _FREESAVEY +0CEAF _FREESAVEX +0CEB0 _STRACESAVE_TYPE +0CEB1 _STRACESAVE +0CEB3 _TRACESAVE +0CEB5 _DIF_T_SAVE +0CEBF _A_B_SAVE +0CEC0 _A_B_TYPE +0CEC1 _GS_DELX +0CEC2 _GS_D1_YINC +0CEC3 _GS_D2_YINC +0CEC4 _GS_DELY +0CEC5 _GS_MAX_Y_PIX +0CEC6 _CURRENT_STYLE +0CEC7 _CL_X1 +0CEC8 _CL_X2 +0CEC9 _CL_Y_DAT +0CECB _PREV_POINT +0CECD _RESSAVE +0CECE _DREQU_X +0CECF _DREQU_XINIT +0CED9 _DREQU_Y +0CEDA _DREQU_YINIT +0CEE4 _DREQU_XLIST +0CEE7 _DREQU_YLIST +0CEEA _DREQU_tLIST +0CEED _DREQU_COUNT +0CEEF _GY1 +0CF21 _GX1 +0CF53 _GR1 +0CF85 _GQ1 +0CF8A _EQU_EDIT_SAVE +0CF8B _FORMULA_BITMAP +0CFAB _MENUCMD_M2I +0CFAB _cmdShadow +0CFC9 _MENUCMD_ITEMS +0D041 _MENUCMD_NUMROWS +0D042 _MENUCMD_CURROW +0D053 _cmdShadCur +0D055 _cmdShadAlph +0D056 _cmdShadIns +0D057 _cmdCursor +0D059 _P_editTop +0D05C _P_EDITCURSOR +0D05F _P_editTail +0D062 _P_editBtm +0D065 _curmatcol +0D066 _curmatrow +0D067 _curlstrow +0D069 _numedTbl +0D069 _curlistel +0D06A _curlstrowh +0D06B _higmatcol +0D06C _higmatrow +0D06D _higlstrow +0D06F _maxdsprow +0D070 _ForCurMat +0D070 _higlstrowh +0D072 _ForDspCol +0D074 _forerrornum +0D075 _P_editSym +0D078 _P_editDat +0D07B _DspMatCol +0D07C _DspMatRow +0D07D _TmpMatCol +0D07E _TmpMatRow +0D07F _numoflist +0D080 _num1stlist +0D081 _NumCurList +0D082 _STATED_CUT_COL +0D083 _listnamebuffer +0D12E _LastName +0D137 _modeRoot +0D139 _modeCount +0D13A _modeItem +0D13B _modePtr +0D13D _winTop +0D13E _winBtm +0D13F _winLeftEdge +0D140 _winLeft +0D142 _winAbove +0D144 _winRow +0D146 _winCol +0D148 _fmtDigits +0D149 _fmtString +0D18A _fmtConv +0D19E _fmtLeft +0D1A0 _fmtIndex +0D1A2 _P_fmtMatSym +0D1A5 _P_fmtMatMem +0D1A8 _EQS +0D1AA _LSTINDEX +0D1AC _LSTSIZE +0D1AE _EQUINDEX +0D1B0 _order +0D1B1 _xnamesav +0D1BA _ynamesav +0D1C3 _CustMType +0D1C3 _MCustM +0D1C4 _CustMLen +0D1C5 _CustMSav +0D1E3 _custmnames +0D279 _VARSAVECNT +0D27A _DELADJAMT +0D27D _TEMPINPUT +0D27E _TSYMPTR1 +0D280 _TSYMPTR2 +0D282 _P_CHKDELPTR3 +0D285 _P_CHKDELPTR4 +0D288 _P_TEMPMEM +0D28B _FPBASE +0D28D _FPS +0D28F _OPBASE +0D291 _OPS +0D293 _PTempCnt +0D295 _CLEANTMP +0D297 _P_PTEMP +0D29A _PTEMP_END +0D29D _FREE_MEM +0D2A0 _newdataptr +0D2A3 _SavBotRow +0D2B8 _curstatplot +0D2B9 _curstatplotprompt +0D2BA _difeqfieldmode +0D2BB _matedoldtype +0D2BC _modesave1 +0D2BD _statansfirst +0D2BF _statanslast +0D2C1 _statanscur +0D2C3 _charmap +0D2CB _altcharmap +0D2D3 _toktmp1 +0D2D4 _toktmp2 +0D2D5 _IOSAVOP1 +0D2DF _DELVAR_SAV_F +0D2E0 _DEL_SAV_OP1 +0D2EB _alt_asm_exec_btm +0D2ED _altlfontptr +0D2F0 _altsfontptr +0D2F3 _altonptr +0D2F6 _altslinkptr +0D2F9 _alt_ret_status +0D2FA _alt_ret_jmp_page +0D2FB _alt_ret_jmp_addr +0D2FD _alt_int_chksum +0D2FE _alt_interrupt_exec +0D3C6 _alt_slink_chksum +0D3C7 _alt_slink_exec +0D48F _alt_on_chksum +0D490 _alt_on_exec +0D558 _alt_off_chksum +0D559 _alt_off_exec +0D621 _altram_end +0D621 _asm_exec_btm +0D623 _ASAP_IND +0D624 _asm_reg_af +0D625 _asm_reg_a +0D626 _asm_reg_l +0D626 _asm_reg_hl +0D627 _asm_reg_h +0D628 _asm_reg_bc +0D628 _asm_reg_c +0D629 _asm_reg_b +0D62A _asm_reg_de +0D62A _asm_reg_e +0D62B _asm_reg_d +0D62C _mPrgmMATH +0D64C _mMath +0D65A _mMath_asap1 +0D65C _mMath_asap2 +0D65E _mMath_asap3 +0D66C _iASAP1 +0D678 _iASAP2 +0D684 _iASAP3 +0D690 _iASAP4 +0D69C _iASAP5 +0D6A8 _iASAP6 +0D6B4 _iASAP7 +0D6C0 _iASAP8 +0D6CC _iASAP9 +0D6D8 _asapnames +0D6D8 _asap_nl1 +0D6E1 _asap_nl2 +0D6EA _asap_nl3 +0D6FC _asapvar +0D706 _tokspell_asap1 +0D706 _tokspelltblptr +0D708 _tokspell_asap2 +0D70A _tokspell_asap3 +0D70E _numtokens +0D70E _numtok_asap1 +0D70F _numtok_asap2 +0D710 _numtok_asap3 +0D712 _eostblptr +0D712 _eostbl_asap1 +0D714 _eostbl_asap2 +0D716 _eostbl_asap3 +0D71A _Amenu_offset +0D722 _reinstall_asap1 +0D722 _reinstall_vec +0D724 _reinstall_asap2 +0D726 _reinstall_asap3 +0D72A _asap1_ram +0D734 _asap2_ram +0D73E _asap3_ram +0D748 _checkStart +0D748 _asm_exec_ram + +[flags] +00 trigflags +2,00 trigdeg,trigflags +00 doneflags +5,00 donePrgm,doneflags +02 plotflags +1,02 plotloc,plotflags +2,02 plotdisp,plotflags +02 grfmodeflags +4,02 grffuncm,grfmodeflags +5,02 grfpolarm,grfmodeflags +6,02 grfparamm,grfmodeflags +7,02 grfrecurm,grfmodeflags +03 graphflags +0,03 graphdraw,graphflags +2,03 graphcursor,graphflags +04 grfdbflags +0,04 grfdot,grfdbflags +1,04 grfsimul,grfdbflags +2,04 grfgrid,grfdbflags +3,04 grfpolar,grfdbflags +4,04 grfnocoord,grfdbflags +5,04 grfnoaxis,grfdbflags +6,04 grflabel,grfdbflags +05 textflags +1,05 textEraseBelow,textflags +2,05 textScrolled,textflags +3,05 textInverse,textflags +06 parsflag +07 parsflag2 +0,06 numop1,parsflag2 +08 apdflags +2,08 apdable,apdflags +3,08 apdlock,apdflags +4,08 apdwarmstart,apdflags +09 onflags +3,09 onRunning,onflags +4,09 onInterrupt,onflags +0A fmtflags +0,0A fmtExponent,fmtflags +1,0A fmtEng,fmtflags +2,0A fmtHex,fmtflags +3,0A fmtOct,fmtflags +4,0A fmtBin,fmtflags +0C curflags +2,0C curAble,curflags +3,0C curOn,curflags +4,0C curLock,curflags +0D appflags +1,0D appTextSave,appflags +2,0D appAutoScroll,appflags +12 indicflags +0,12 indicRun,indicflags +2,12 indicOnly,indicflags +12 shiftflags +3,12 shift2nd,shiftflags +4,12 shiftAlpha,shiftflags +5,12 shiftLwrAlph,shiftflags +6,12 shiftALock,shiftflags +16 asap_cmd_flag +7,16 ex_asap_cmd,asap_cmd_flag +17 NewDispf +6,17 ProgramExecuting,NewDispf +18 new_grf_flgs +6,18 textwrite,new_grf_flgs +1D statflags +6,1D statsvalid,statflags +1F anumeditflgs +2,1F ex_asm_module,anumeditflgs +23 exceptionflg +0,23 alt_font,exceptionflg +1,23 alt_vfont,exceptionflg +2,23 alt_int,exceptionflg +3,23 alt_on,exceptionflg +4,23 alt_link,exceptionflg +5,23 alt_sqrt,exceptionflg +6,23 alt_grphexpr,exceptionflg +7,23 alt_off,exceptionflg +24 exceptionflg2 +0,24 alt_parse,exceptionflg2 +1,24 alt_form,exceptionflg2 +2,24 alt_exec,exceptionflg2 +4,24 alt_home,exceptionflg2 +5,24 alt_cmdtok,exceptionflg2 +6,24 alt_key,exceptionflg2 +7,24 alt_grf,exceptionflg2 +28 asm_flag1 +29 asm_flag2 +2A asm_flag3 +2B asm_flag4 +2C asm_flag5 +2D asm_flag6 +2E asm_flag7 + diff --git a/tool/tilem-src/db/Makefile.in b/tool/tilem-src/db/Makefile.in new file mode 100644 index 0000000..89f981b --- /dev/null +++ b/tool/tilem-src/db/Makefile.in @@ -0,0 +1,59 @@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ +datarootdir = @datarootdir@ +bindir = @bindir@ +datadir = @datadir@ +pkgdatadir = @datadir@/tilem2 +mandir = @mandir@ + +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +srcdir = @srcdir@ +VPATH = @srcdir@ +@SET_MAKE@ + +AR = @AR@ +CC = @CC@ +CFLAGS = @CFLAGS@ +CPPFLAGS = @CPPFLAGS@ +DEFS = @DEFS@ +RANLIB = @RANLIB@ +SHELL = @SHELL@ + +objects = disasm.o listing.o lstfile.o + +compile = $(CC) -I$(top_builddir) -I$(top_srcdir)/emu -I$(srcdir) $(CFLAGS) $(CPPFLAGS) $(DEFS) + +all: libtilemdb.a + +libtilemdb.a: $(objects) + $(AR) cru libtilemdb.a $(objects) + $(RANLIB) libtilemdb.a + +# Disassembler + +disasm.o: disasm.c tilemdb.h ../emu/tilem.h ../config.h + $(compile) -c $(srcdir)/disasm.c + +# Listing file management + +listing.o: listing.c tilemdb.h ../emu/tilem.h ../config.h + $(compile) -c $(srcdir)/listing.c + +lstfile.o: lstfile.c tilemdb.h ../emu/tilem.h ../config.h + $(compile) -c $(srcdir)/lstfile.c + + +clean: + rm -f *.o + rm -f libtilemdb.a + + +Makefile: Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && $(SHELL) ./config.status + +$(top_builddir)/config.status: $(top_srcdir)/configure + cd $(top_builddir) && $(SHELL) ./config.status --recheck + +.PRECIOUS: Makefile $(top_builddir)/config.status +.PHONY: all clean diff --git a/tool/tilem-src/db/disasm.c b/tool/tilem-src/db/disasm.c new file mode 100644 index 0000000..3326d85 --- /dev/null +++ b/tool/tilem-src/db/disasm.c @@ -0,0 +1,1084 @@ +/* + * libtilemdb - Utilities for debugging Z80 assembly programs + * + * Copyright (C) 2010 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include "tilemdb.h" + +typedef struct _TilemDisasmSymbol { + char* name; + dword value; +} TilemDisasmSymbol; + +typedef struct _TilemDisasmSymTable { + int nsyms; + int nsyms_a; + TilemDisasmSymbol* syms; +} TilemDisasmSymTable; + +struct _TilemDisasm { + TilemDisasmSymTable labels; + TilemDisasmSymTable romcalls; + TilemDisasmSymTable flags; + TilemDisasmSymTable macros; +}; + +TilemDisasm* tilem_disasm_new() +{ + TilemDisasm* dasm = tilem_new0(TilemDisasm, 1); + dasm->labels.syms = NULL; + dasm->romcalls.syms = NULL; + dasm->flags.syms = NULL; + dasm->macros.syms = NULL; + return dasm; +} + +static void tilem_disasm_sym_table_free(TilemDisasmSymTable* stab) +{ + int i; + + for (i = 0; i < stab->nsyms; i++) + tilem_free(stab->syms[i].name); + tilem_free(stab->syms); +} + +void tilem_disasm_free(TilemDisasm* dasm) +{ + if (!dasm) + return; + + tilem_disasm_sym_table_free(&dasm->labels); + tilem_disasm_sym_table_free(&dasm->romcalls); + tilem_disasm_sym_table_free(&dasm->flags); + tilem_disasm_sym_table_free(&dasm->macros); + tilem_free(dasm); +} + +/* Find symbol in the given table, if any */ +static TilemDisasmSymbol* find_symbol(const TilemDisasmSymTable* stab, + dword value) +{ + int start, end, i; + + start = 0; + end = stab->nsyms; + while (start < end) { + i = (start + end) / 2; + if (stab->syms[i].value == value) + return &stab->syms[i]; + else if (stab->syms[i].value <= value) + start = i + 1; + else + end = i; + } + return NULL; +} + +/* Find previous symbol in the given table, if any */ +static TilemDisasmSymbol* find_prev_symbol(const TilemDisasmSymTable* stab, + dword value) +{ + int start, end, i; + + start = 0; + end = stab->nsyms; + while (start < end) { + i = (start + end) / 2; + if (stab->syms[i].value <= value) + start = i + 1; + else + end = i; + } + if (start > 0) + return &stab->syms[start - 1]; + else + return NULL; +} + +/* Find symbol with given name */ +static TilemDisasmSymbol* find_symbol_by_name(const TilemDisasmSymTable* stab, + const char* name) +{ + int i; + for (i = 0; i < stab->nsyms; i++) + if (!strcmp(stab->syms[i].name, name)) + return &stab->syms[i]; + return NULL; +} + +/* Find a given symbol in the table, or create a new one */ +static TilemDisasmSymbol* add_symbol(TilemDisasmSymTable* stab, + dword value) +{ + int start, end, i; + TilemDisasmSymbol* syms; + + start = 0; + end = stab->nsyms; + + while (start < end) { + i = (start + end) / 2; + if (stab->syms[i].value == value) + return &stab->syms[i]; + else if (stab->syms[i].value < value) + start = i + 1; + else + end = i; + } + + /* insert new label into the array */ + if (stab->nsyms < stab->nsyms_a) { + if (start < stab->nsyms) + memmove(&stab->syms[start + 1], &stab->syms[start], + ((stab->nsyms - start) + * sizeof(TilemDisasmSymbol))); + } + else { + stab->nsyms_a = (stab->nsyms + 1) * 2; + syms = tilem_new(TilemDisasmSymbol, stab->nsyms_a); + if (start > 0) + memcpy(syms, stab->syms, + start * sizeof(TilemDisasmSymbol)); + if (start < stab->nsyms) + memcpy(syms + start + 1, stab->syms + start, + ((stab->nsyms - start) + * sizeof(TilemDisasmSymbol))); + tilem_free(stab->syms); + stab->syms = syms; + } + + stab->nsyms++; + + stab->syms[start].value = value; + stab->syms[start].name = NULL; + return &stab->syms[start]; +} + +/* Remove a symbol from the table */ +static void del_symbol(TilemDisasmSymTable* stab, + TilemDisasmSymbol* sym) +{ + int n = sym - stab->syms; + + tilem_free(sym->name); + + if (n < stab->nsyms - 1) { + memmove(sym, sym + 1, + (stab->nsyms - n - 1) * sizeof(TilemDisasmSymbol)); + } + + stab->nsyms--; +} + +static void set_symbol(TilemDisasmSymTable* stab, + const char* name, dword value) +{ + TilemDisasmSymbol* sym; + + if ((sym = find_symbol_by_name(stab, name))) { + if (sym->value == value) + return; + else + del_symbol(stab, sym); + } + + sym = add_symbol(stab, value); + tilem_free(sym->name); + sym->name = tilem_new_atomic(char, strlen(name) + 1); + strcpy(sym->name, name); +} + +static char* skipws(char* p) +{ + while (*p == ' ' || *p == '\t') + p++; + return p; +} + +static char* skipwc(char* p) +{ + while ((unsigned char) *p > ' ') + p++; + return p; +} + +static int parse_sym_value(const char* text, dword* value) +{ + char* p; + dword x; + + if (text[0] >= '0' && text[0] <= '7' && text[1] == ',') { + x = strtol(text + 2, &p, 16); + *value = 0x1000 + (x << 4) + (text[0] - '0'); + } + else { + *value = strtol(text, &p, 16); + } + + return (p != text && *p == 0); +} + +static int parse_sym_line(TilemDisasmSymTable* stab, char* line) +{ + char *w1end, *w2start, *w2end, *name; + dword value; + + if (line[0] == '#' || line[0] == ';') + return 1; + + w1end = skipwc(line); + w2start = skipws(w1end); + w2end = skipwc(w2start); + + if (w1end == line || w2start == w1end || w2end == w2start) + return 1; + if (*w2end) + return 1; + + *w1end = *w2end = 0; + + if (*line >= '0' && *line <= '9') { + name = w2start; + if (!parse_sym_value(line, &value)) + return 1; + } + else { + name = line; + if (!parse_sym_value(w2start, &value)) + return 1; + } + + set_symbol(stab, name, value); + return 0; +} + +int tilem_disasm_read_symbol_file(TilemDisasm* dasm, FILE* symfile) +{ + char buf[1024]; + char* p; + TilemDisasmSymTable* curtbl; + int status = 1; + + curtbl = &dasm->labels; + + while (fgets(buf, sizeof(buf), symfile)) { + p = buf + strlen(buf); + while (p != buf && (p[-1] == '\n' || p[-1] == '\r')) + p--; + *p = 0; + + if (!strcmp(buf, "[labels]")) + curtbl = &dasm->labels; + else if (!strcmp(buf, "[romcalls]")) + curtbl = &dasm->romcalls; + else if (!strcmp(buf, "[flags]")) + curtbl = &dasm->flags; + else if (!strcmp(buf, "[macros]")) + curtbl = &dasm->macros; + else if (!parse_sym_line(curtbl, buf)) + status = 0; + } + + return status; +} + +void tilem_disasm_set_label(TilemDisasm* dasm, const char* name, + dword value) +{ + set_symbol(&dasm->labels, name, value); +} + +int tilem_disasm_get_label(const TilemDisasm* dasm, const char* name, + dword* value) +{ + TilemDisasmSymbol* sym = find_symbol_by_name(&dasm->labels, name); + + if (!sym) + return 0; + else if (value) + *value = sym->value; + return 1; +} + +const char* tilem_disasm_get_label_at_address(const TilemDisasm* dasm, + dword addr) +{ + TilemDisasmSymbol* sym = find_symbol(&dasm->labels, addr); + + if (sym) + return sym->name; + else + return NULL; +} + +typedef struct _TilemDisasmInstruction { + int length; + const char* pattern; +} TilemDisasmInstruction; + +static const TilemDisasmInstruction insts_main[256] = { + {1,"NOP"}, {3,"LD~BC,%w"}, {1,"LD~(BC),A"}, {1,"INC~BC"}, + {1,"INC~B"}, {1,"DEC~B"}, {2,"LD~B,%b"}, {1,"RLCA"}, + {1,"EX~AF,AF'"}, {1,"ADD~HL,BC"}, {1,"LD~A,(BC)"}, {1,"DEC~BC"}, + {1,"INC~C"}, {1,"DEC~C"}, {2,"LD~C,%b"}, {1,"RRCA"}, + {2,"DJNZ~%r"}, {3,"LD~DE,%w"}, {1,"LD~(DE),A"}, {1,"INC~DE"}, + {1,"INC~D"}, {1,"DEC~D"}, {2,"LD~D,%b"}, {1,"RLA"}, + {2,"JR~%r"}, {1,"ADD~HL,DE"}, {1,"LD~A,(DE)"}, {1,"DEC~DE"}, + {1,"INC~E"}, {1,"DEC~E"}, {2,"LD~E,%b"}, {1,"RRA"}, + {2,"JR~NZ,%r"}, {3,"LD~HL,%w"}, {3,"LD~(%a),HL"}, {1,"INC~HL"}, + {1,"INC~H"}, {1,"DEC~H"}, {2,"LD~H,%b"}, {1,"DAA"}, + {2,"JR~Z,%r"}, {1,"ADD~HL,HL"}, {3,"LD~HL,(%a)"}, {1,"DEC~HL"}, + {1,"INC~L"}, {1,"DEC~L"}, {2,"LD~L,%b"}, {1,"CPL"}, + {2,"JR~NC,%r"}, {3,"LD~SP,%w"}, {3,"LD~(%a),A"}, {1,"INC~SP"}, + {1,"INC~(HL)"}, {1,"DEC~(HL)"}, {2,"LD~(HL),%b"}, {1,"SCF"}, + {2,"JR~C,%r"}, {1,"ADD~HL,SP"}, {3,"LD~A,(%a)"}, {1,"DEC~SP"}, + {1,"INC~A"}, {1,"DEC~A"}, {2,"LD~A,%b"}, {1,"CCF"}, + + {1,"LD~B,B"}, {1,"LD~B,C"}, {1,"LD~B,D"}, {1,"LD~B,E"}, + {1,"LD~B,H"}, {1,"LD~B,L"}, {1,"LD~B,(HL)"}, {1,"LD~B,A"}, + {1,"LD~C,B"}, {1,"LD~C,C"}, {1,"LD~C,D"}, {1,"LD~C,E"}, + {1,"LD~C,H"}, {1,"LD~C,L"}, {1,"LD~C,(HL)"}, {1,"LD~C,A"}, + {1,"LD~D,B"}, {1,"LD~D,C"}, {1,"LD~D,D"}, {1,"LD~D,E"}, + {1,"LD~D,H"}, {1,"LD~D,L"}, {1,"LD~D,(HL)"}, {1,"LD~D,A"}, + {1,"LD~E,B"}, {1,"LD~E,C"}, {1,"LD~E,D"}, {1,"LD~E,E"}, + {1,"LD~E,H"}, {1,"LD~E,L"}, {1,"LD~E,(HL)"}, {1,"LD~E,A"}, + {1,"LD~H,B"}, {1,"LD~H,C"}, {1,"LD~H,D"}, {1,"LD~H,E"}, + {1,"LD~H,H"}, {1,"LD~H,L"}, {1,"LD~H,(HL)"}, {1,"LD~H,A"}, + {1,"LD~L,B"}, {1,"LD~L,C"}, {1,"LD~L,D"}, {1,"LD~L,E"}, + {1,"LD~L,H"}, {1,"LD~L,L"}, {1,"LD~L,(HL)"}, {1,"LD~L,A"}, + {1,"LD~(HL),B"}, {1,"LD~(HL),C"}, {1,"LD~(HL),D"}, {1,"LD~(HL),E"}, + {1,"LD~(HL),H"}, {1,"LD~(HL),L"}, {1,"HALT"}, {1,"LD~(HL),A"}, + {1,"LD~A,B"}, {1,"LD~A,C"}, {1,"LD~A,D"}, {1,"LD~A,E"}, + {1,"LD~A,H"}, {1,"LD~A,L"}, {1,"LD~A,(HL)"}, {1,"LD~A,A"}, + + {1,"ADD~A,B"}, {1,"ADD~A,C"}, {1,"ADD~A,D"}, {1,"ADD~A,E"}, + {1,"ADD~A,H"}, {1,"ADD~A,L"}, {1,"ADD~A,(HL)"}, {1,"ADD~A,A"}, + {1,"ADC~A,B"}, {1,"ADC~A,C"}, {1,"ADC~A,D"}, {1,"ADC~A,E"}, + {1,"ADC~A,H"}, {1,"ADC~A,L"}, {1,"ADC~A,(HL)"}, {1,"ADC~A,A"}, + {1,"SUB~B"}, {1,"SUB~C"}, {1,"SUB~D"}, {1,"SUB~E"}, + {1,"SUB~H"}, {1,"SUB~L"}, {1,"SUB~(HL)"}, {1,"SUB~A"}, + {1,"SBC~A,B"}, {1,"SBC~A,C"}, {1,"SBC~A,D"}, {1,"SBC~A,E"}, + {1,"SBC~A,H"}, {1,"SBC~A,L"}, {1,"SBC~A,(HL)"}, {1,"SBC~A,A"}, + {1,"AND~B"}, {1,"AND~C"}, {1,"AND~D"}, {1,"AND~E"}, + {1,"AND~H"}, {1,"AND~L"}, {1,"AND~(HL)"}, {1,"AND~A"}, + {1,"XOR~B"}, {1,"XOR~C"}, {1,"XOR~D"}, {1,"XOR~E"}, + {1,"XOR~H"}, {1,"XOR~L"}, {1,"XOR~(HL)"}, {1,"XOR~A"}, + {1,"OR~B"}, {1,"OR~C"}, {1,"OR~D"}, {1,"OR~E"}, + {1,"OR~H"}, {1,"OR~L"}, {1,"OR~(HL)"}, {1,"OR~A"}, + {1,"CP~B"}, {1,"CP~C"}, {1,"CP~D"}, {1,"CP~E"}, + {1,"CP~H"}, {1,"CP~L"}, {1,"CP~(HL)"}, {1,"CP~A"}, + + {1,"RET~NZ"}, {1,"POP~BC"}, {3,"JP~NZ,%j"}, {3,"JP~%j"}, + {3,"CALL~NZ,%j"}, {1,"PUSH~BC"}, {2,"ADD~A,%b"}, {1,"RST~%z"}, + {1,"RET~Z"}, {1,"RET"}, {3,"JP~Z,%j"}, {1,0}, + {3,"CALL~Z,%j"}, {3,"CALL~%j"}, {2,"ADC~A,%b"}, {1,"RST~%z"}, + {1,"RET~NC"}, {1,"POP~DE"}, {3,"JP~NC,%j"}, {2,"OUT~(%b),A"}, + {3,"CALL~NC,%j"}, {1,"PUSH~DE"}, {2,"SUB~%b"}, {1,"RST~%z"}, + {1,"RET~C"}, {1,"EXX"}, {3,"JP~C,%j"}, {2,"IN~A,(%b)"}, + {3,"CALL~C,%j"}, {1,0}, {2,"SBC~A,%b"}, {1,"RST~%z"}, + {1,"RET~PO"}, {1,"POP~HL"}, {3,"JP~PO,%j"}, {1,"EX~(SP),HL"}, + {3,"CALL~PO,%j"}, {1,"PUSH~HL"}, {2,"AND~%b"}, {1,"RST~%z"}, + {1,"RET~PE"}, {1,"JP~(HL)"}, {3,"JP~PE,%j"}, {1,"EX~DE,HL"}, + {3,"CALL~PE,%j"}, {1,0}, {2,"XOR~%b"}, {1,"RST~%z"}, + {1,"RET~P"}, {1,"POP~AF"}, {3,"JP~P,%j"}, {1,"DI"}, + {3,"CALL~P,%j"}, {1,"PUSH~AF"}, {2,"OR~%b"}, {1,"RST~%z"}, + {1,"RET~M"}, {1,"LD~SP,HL"}, {3,"JP~M,%j"}, {1,"EI"}, + {3,"CALL~M,%j"}, {1,0}, {2,"CP~%b"}, {1,"RST~%z"}}; + +static const TilemDisasmInstruction insts_ddfd[256] = { + {1,0}, {1,0}, {1,0}, {1,0}, + {1,0}, {1,0}, {1,0}, {1,0}, + {1,0}, {2,"ADD~%i,BC"}, {1,0}, {1,0}, + {1,0}, {1,0}, {1,0}, {1,0}, + {1,0}, {1,0}, {1,0}, {1,0}, + {1,0}, {1,0}, {1,0}, {1,0}, + {1,0}, {2,"ADD~%i,DE"}, {1,0}, {1,0}, + {1,0}, {1,0}, {1,0}, {1,0}, + {1,0}, {4,"LD~%i,%w"}, {4,"LD~(%a),%i"}, {2,"INC~%i"}, + {2,"INC~%iH"}, {2,"DEC~%iH"}, {3,"LD~%iH,%b"}, {1,0}, + {1,0}, {2,"ADD~%i,%i"}, {4,"LD~%i,(%a)"}, {2,"DEC~%i"}, + {2,"INC~%iL"}, {2,"DEC~%iL"}, {3,"LD~%iL,%b"}, {1,0}, + {1,0}, {1,0}, {1,0}, {1,0}, + {3,"INC~(%i%s)"}, {3,"DEC~(%i%s)"}, {4,"LD~(%i%s),%b"}, {1,0}, + {1,0}, {2,"ADD~%i,SP"}, {1,0}, {1,0}, + {1,0}, {1,0}, {1,0}, {1,0}, + + {1,0}, {1,0}, {1,0}, {1,0}, + {2,"LD~B,%iH"}, {2,"LD~B,%iL"}, {3,"LD~B,(%i%s)"}, {1,0}, + {1,0}, {1,0}, {1,0}, {1,0}, + {2,"LD~C,%iH"}, {2,"LD~C,%iL"}, {3,"LD~C,(%i%s)"}, {1,0}, + {1,0}, {1,0}, {1,0}, {1,0}, + {2,"LD~D,%iH"}, {2,"LD~D,%iL"}, {3,"LD~D,(%i%s)"}, {1,0}, + {1,0}, {1,0}, {1,0}, {1,0}, + {2,"LD~E,%iH"}, {2,"LD~E,%iL"}, {3,"LD~E,(%i%s)"}, {1,0}, + {2,"LD~%iH,B"}, {2,"LD~%iH,C"}, {2,"LD~%iH,D"}, {2,"LD~%iH,E"}, + {2,"LD~%iH,%iH"}, {2,"LD~%iH,%iL"}, {3,"LD~H,(%i%s)"}, {2,"LD~%iH,A"}, + {2,"LD~%iL,B"}, {2,"LD~%iL,C"}, {2,"LD~%iL,D"}, {2,"LD~%iL,E"}, + {2,"LD~%iL,%iH"}, {2,"LD~%iL,%iL"}, {3,"LD~L,(%i%s)"}, {2,"LD~%iL,A"}, + {3,"LD~(%i%s),B"}, {3,"LD~(%i%s),C"}, {3,"LD~(%i%s),D"}, {3,"LD~(%i%s),E"}, + {3,"LD~(%i%s),H"}, {3,"LD~(%i%s),L"}, {1,0}, {3,"LD~(%i%s),A"}, + {1,0}, {1,0}, {1,0}, {1,0}, + {2,"LD~A,%iH"}, {2,"LD~A,%iL"}, {3,"LD~A,(%i%s)"}, {1,0}, + + {1,0}, {1,0}, {1,0}, {1,0}, + {2,"ADD~A,%iH"}, {2,"ADD~A,%iL"}, {3,"ADD~A,(%i%s)"}, {1,0}, + {1,0}, {1,0}, {1,0}, {1,0}, + {2,"ADC~A,%iH"}, {2,"ADC~A,%iL"}, {3,"ADC~A,(%i%s)"}, {1,0}, + {1,0}, {1,0}, {1,0}, {1,0}, + {2,"SUB~%iH"}, {2,"SUB~%iL"}, {3,"SUB~(%i%s)"}, {1,0}, + {1,0}, {1,0}, {1,0}, {1,0}, + {2,"SBC~A,%iH"}, {2,"SBC~A,%iL"}, {3,"SBC~A,(%i%s)"}, {1,0}, + {1,0}, {1,0}, {1,0}, {1,0}, + {2,"AND~%iH"}, {2,"AND~%iL"}, {3,"AND~(%i%s)"}, {1,0}, + {1,0}, {1,0}, {1,0}, {1,0}, + {2,"XOR~%iH"}, {2,"XOR~%iL"}, {3,"XOR~(%i%s)"}, {1,0}, + {1,0}, {1,0}, {1,0}, {1,0}, + {2,"OR~%iH"}, {2,"OR~%iL"}, {3,"OR~(%i%s)"}, {1,0}, + {1,0}, {1,0}, {1,0}, {1,0}, + {2,"CP~%iH"}, {2,"CP~%iL"}, {3,"CP~(%i%s)"}, {1,0}, + + {1,0}, {1,0}, {1,0}, {1,0}, + {1,0}, {1,0}, {1,0}, {1,0}, + {1,0}, {1,0}, {1,0}, {1,0}, + {1,0}, {1,0}, {1,0}, {1,0}, + {1,0}, {1,0}, {1,0}, {1,0}, + {1,0}, {1,0}, {1,0}, {1,0}, + {1,0}, {1,0}, {1,0}, {1,0}, + {1,0}, {1,0}, {1,0}, {1,0}, + {1,0}, {2,"POP~%i"}, {1,0}, {2,"EX~(SP),%i"}, + {1,0}, {2,"PUSH~%i"}, {1,0}, {1,0}, + {1,0}, {2,"JP~(%i)"}, {1,0}, {1,0}, + {1,0}, {1,0}, {1,0}, {1,0}, + {1,0}, {1,0}, {1,0}, {1,0}, + {1,0}, {1,0}, {1,0}, {1,0}, + {1,0}, {2,"LD~SP,%i"}, {1,0}, {1,0}, + {1,0}, {1,0}, {1,0}, {1,0}}; + +static const TilemDisasmInstruction insts_cb[256] = { + {2,"RLC~B"}, {2,"RLC~C"}, {2,"RLC~D"}, {2,"RLC~E"}, + {2,"RLC~H"}, {2,"RLC~L"}, {2,"RLC~(HL)"}, {2,"RLC~A"}, + {2,"RRC~B"}, {2,"RRC~C"}, {2,"RRC~D"}, {2,"RRC~E"}, + {2,"RRC~H"}, {2,"RRC~L"}, {2,"RRC~(HL)"}, {2,"RRC~A"}, + {2,"RL~B"}, {2,"RL~C"}, {2,"RL~D"}, {2,"RL~E"}, + {2,"RL~H"}, {2,"RL~L"}, {2,"RL~(HL)"}, {2,"RL~A"}, + {2,"RR~B"}, {2,"RR~C"}, {2,"RR~D"}, {2,"RR~E"}, + {2,"RR~H"}, {2,"RR~L"}, {2,"RR~(HL)"}, {2,"RR~A"}, + {2,"SLA~B"}, {2,"SLA~C"}, {2,"SLA~D"}, {2,"SLA~E"}, + {2,"SLA~H"}, {2,"SLA~L"}, {2,"SLA~(HL)"}, {2,"SLA~A"}, + {2,"SRA~B"}, {2,"SRA~C"}, {2,"SRA~D"}, {2,"SRA~E"}, + {2,"SRA~H"}, {2,"SRA~L"}, {2,"SRA~(HL)"}, {2,"SRA~A"}, + {2,"SLIA~B"}, {2,"SLIA~C"}, {2,"SLIA~D"}, {2,"SLIA~E"}, + {2,"SLIA~H"}, {2,"SLIA~L"}, {2,"SLIA~(HL)"}, {2,"SLIA~A"}, + {2,"SRL~B"}, {2,"SRL~C"}, {2,"SRL~D"}, {2,"SRL~E"}, + {2,"SRL~H"}, {2,"SRL~L"}, {2,"SRL~(HL)"}, {2,"SRL~A"}, + + {2,"BIT~0,B"}, {2,"BIT~0,C"}, {2,"BIT~0,D"}, {2,"BIT~0,E"}, + {2,"BIT~0,H"}, {2,"BIT~0,L"}, {2,"BIT~0,(HL)"}, {2,"BIT~0,A"}, + {2,"BIT~1,B"}, {2,"BIT~1,C"}, {2,"BIT~1,D"}, {2,"BIT~1,E"}, + {2,"BIT~1,H"}, {2,"BIT~1,L"}, {2,"BIT~1,(HL)"}, {2,"BIT~1,A"}, + {2,"BIT~2,B"}, {2,"BIT~2,C"}, {2,"BIT~2,D"}, {2,"BIT~2,E"}, + {2,"BIT~2,H"}, {2,"BIT~2,L"}, {2,"BIT~2,(HL)"}, {2,"BIT~2,A"}, + {2,"BIT~3,B"}, {2,"BIT~3,C"}, {2,"BIT~3,D"}, {2,"BIT~3,E"}, + {2,"BIT~3,H"}, {2,"BIT~3,L"}, {2,"BIT~3,(HL)"}, {2,"BIT~3,A"}, + {2,"BIT~4,B"}, {2,"BIT~4,C"}, {2,"BIT~4,D"}, {2,"BIT~4,E"}, + {2,"BIT~4,H"}, {2,"BIT~4,L"}, {2,"BIT~4,(HL)"}, {2,"BIT~4,A"}, + {2,"BIT~5,B"}, {2,"BIT~5,C"}, {2,"BIT~5,D"}, {2,"BIT~5,E"}, + {2,"BIT~5,H"}, {2,"BIT~5,L"}, {2,"BIT~5,(HL)"}, {2,"BIT~5,A"}, + {2,"BIT~6,B"}, {2,"BIT~6,C"}, {2,"BIT~6,D"}, {2,"BIT~6,E"}, + {2,"BIT~6,H"}, {2,"BIT~6,L"}, {2,"BIT~6,(HL)"}, {2,"BIT~6,A"}, + {2,"BIT~7,B"}, {2,"BIT~7,C"}, {2,"BIT~7,D"}, {2,"BIT~7,E"}, + {2,"BIT~7,H"}, {2,"BIT~7,L"}, {2,"BIT~7,(HL)"}, {2,"BIT~7,A"}, + + {2,"RES~0,B"}, {2,"RES~0,C"}, {2,"RES~0,D"}, {2,"RES~0,E"}, + {2,"RES~0,H"}, {2,"RES~0,L"}, {2,"RES~0,(HL)"}, {2,"RES~0,A"}, + {2,"RES~1,B"}, {2,"RES~1,C"}, {2,"RES~1,D"}, {2,"RES~1,E"}, + {2,"RES~1,H"}, {2,"RES~1,L"}, {2,"RES~1,(HL)"}, {2,"RES~1,A"}, + {2,"RES~2,B"}, {2,"RES~2,C"}, {2,"RES~2,D"}, {2,"RES~2,E"}, + {2,"RES~2,H"}, {2,"RES~2,L"}, {2,"RES~2,(HL)"}, {2,"RES~2,A"}, + {2,"RES~3,B"}, {2,"RES~3,C"}, {2,"RES~3,D"}, {2,"RES~3,E"}, + {2,"RES~3,H"}, {2,"RES~3,L"}, {2,"RES~3,(HL)"}, {2,"RES~3,A"}, + {2,"RES~4,B"}, {2,"RES~4,C"}, {2,"RES~4,D"}, {2,"RES~4,E"}, + {2,"RES~4,H"}, {2,"RES~4,L"}, {2,"RES~4,(HL)"}, {2,"RES~4,A"}, + {2,"RES~5,B"}, {2,"RES~5,C"}, {2,"RES~5,D"}, {2,"RES~5,E"}, + {2,"RES~5,H"}, {2,"RES~5,L"}, {2,"RES~5,(HL)"}, {2,"RES~5,A"}, + {2,"RES~6,B"}, {2,"RES~6,C"}, {2,"RES~6,D"}, {2,"RES~6,E"}, + {2,"RES~6,H"}, {2,"RES~6,L"}, {2,"RES~6,(HL)"}, {2,"RES~6,A"}, + {2,"RES~7,B"}, {2,"RES~7,C"}, {2,"RES~7,D"}, {2,"RES~7,E"}, + {2,"RES~7,H"}, {2,"RES~7,L"}, {2,"RES~7,(HL)"}, {2,"RES~7,A"}, + + {2,"SET~0,B"}, {2,"SET~0,C"}, {2,"SET~0,D"}, {2,"SET~0,E"}, + {2,"SET~0,H"}, {2,"SET~0,L"}, {2,"SET~0,(HL)"}, {2,"SET~0,A"}, + {2,"SET~1,B"}, {2,"SET~1,C"}, {2,"SET~1,D"}, {2,"SET~1,E"}, + {2,"SET~1,H"}, {2,"SET~1,L"}, {2,"SET~1,(HL)"}, {2,"SET~1,A"}, + {2,"SET~2,B"}, {2,"SET~2,C"}, {2,"SET~2,D"}, {2,"SET~2,E"}, + {2,"SET~2,H"}, {2,"SET~2,L"}, {2,"SET~2,(HL)"}, {2,"SET~2,A"}, + {2,"SET~3,B"}, {2,"SET~3,C"}, {2,"SET~3,D"}, {2,"SET~3,E"}, + {2,"SET~3,H"}, {2,"SET~3,L"}, {2,"SET~3,(HL)"}, {2,"SET~3,A"}, + {2,"SET~4,B"}, {2,"SET~4,C"}, {2,"SET~4,D"}, {2,"SET~4,E"}, + {2,"SET~4,H"}, {2,"SET~4,L"}, {2,"SET~4,(HL)"}, {2,"SET~4,A"}, + {2,"SET~5,B"}, {2,"SET~5,C"}, {2,"SET~5,D"}, {2,"SET~5,E"}, + {2,"SET~5,H"}, {2,"SET~5,L"}, {2,"SET~5,(HL)"}, {2,"SET~5,A"}, + {2,"SET~6,B"}, {2,"SET~6,C"}, {2,"SET~6,D"}, {2,"SET~6,E"}, + {2,"SET~6,H"}, {2,"SET~6,L"}, {2,"SET~6,(HL)"}, {2,"SET~6,A"}, + {2,"SET~7,B"}, {2,"SET~7,C"}, {2,"SET~7,D"}, {2,"SET~7,E"}, + {2,"SET~7,H"}, {2,"SET~7,L"}, {2,"SET~7,(HL)"}, {2,"SET~7,A"}}; + +static const TilemDisasmInstruction insts_ddfdcb[256] = { + {4,"RLC~B,(%i%s)"}, {4,"RLC~C,(%i%s)"}, {4,"RLC~D,(%i%s)"}, {4,"RLC~E,(%i%s)"}, + {4,"RLC~H,(%i%s)"}, {4,"RLC~L,(%i%s)"}, {4,"RLC~(%i%s)"}, {4,"RLC~A,(%i%s)"}, + {4,"RRC~B,(%i%s)"}, {4,"RRC~C,(%i%s)"}, {4,"RRC~D,(%i%s)"}, {4,"RRC~E,(%i%s)"}, + {4,"RRC~H,(%i%s)"}, {4,"RRC~L,(%i%s)"}, {4,"RRC~(%i%s)"}, {4,"RRC~A,(%i%s)"}, + {4,"RL~B,(%i%s)"}, {4,"RL~C,(%i%s)"}, {4,"RL~D,(%i%s)"}, {4,"RL~E,(%i%s)"}, + {4,"RL~H,(%i%s)"}, {4,"RL~L,(%i%s)"}, {4,"RL~(%i%s)"}, {4,"RL~A,(%i%s)"}, + {4,"RR~B,(%i%s)"}, {4,"RR~C,(%i%s)"}, {4,"RR~D,(%i%s)"}, {4,"RR~E,(%i%s)"}, + {4,"RR~H,(%i%s)"}, {4,"RR~L,(%i%s)"}, {4,"RR~(%i%s)"}, {4,"RR~A,(%i%s)"}, + {4,"SLA~B,(%i%s)"}, {4,"SLA~C,(%i%s)"}, {4,"SLA~D,(%i%s)"}, {4,"SLA~E,(%i%s)"}, + {4,"SLA~H,(%i%s)"}, {4,"SLA~L,(%i%s)"}, {4,"SLA~(%i%s)"}, {4,"SLA~A,(%i%s)"}, + {4,"SRA~B,(%i%s)"}, {4,"SRA~C,(%i%s)"}, {4,"SRA~D,(%i%s)"}, {4,"SRA~E,(%i%s)"}, + {4,"SRA~H,(%i%s)"}, {4,"SRA~L,(%i%s)"}, {4,"SRA~(%i%s)"}, {4,"SRA~A,(%i%s)"}, + {4,"SLIA~B,(%i%s)"}, {4,"SLIA~C,(%i%s)"}, {4,"SLIA~D,(%i%s)"}, {4,"SLIA~E,(%i%s)"}, + {4,"SLIA~H,(%i%s)"}, {4,"SLIA~L,(%i%s)"}, {4,"SLIA~(%i%s)"}, {4,"SLIA~A,(%i%s)"}, + {4,"SRL~B,(%i%s)"}, {4,"SRL~C,(%i%s)"}, {4,"SRL~D,(%i%s)"}, {4,"SRL~E,(%i%s)"}, + {4,"SRL~H,(%i%s)"}, {4,"SRL~L,(%i%s)"}, {4,"SRL~(%i%s)"}, {4,"SRL~A,(%i%s)"}, + + {4,"BIT~%f*"}, {4,"BIT~%f*"}, {4,"BIT~%f*"}, {4,"BIT~%f*"}, + {4,"BIT~%f*"}, {4,"BIT~%f*"}, {4,"BIT~%f"}, {4,"BIT~%f*"}, + {4,"BIT~%f*"}, {4,"BIT~%f*"}, {4,"BIT~%f*"}, {4,"BIT~%f*"}, + {4,"BIT~%f*"}, {4,"BIT~%f*"}, {4,"BIT~%f"}, {4,"BIT~%f*"}, + {4,"BIT~%f*"}, {4,"BIT~%f*"}, {4,"BIT~%f*"}, {4,"BIT~%f*"}, + {4,"BIT~%f*"}, {4,"BIT~%f*"}, {4,"BIT~%f"}, {4,"BIT~%f*"}, + {4,"BIT~%f*"}, {4,"BIT~%f*"}, {4,"BIT~%f*"}, {4,"BIT~%f*"}, + {4,"BIT~%f*"}, {4,"BIT~%f*"}, {4,"BIT~%f"}, {4,"BIT~%f*"}, + {4,"BIT~%f*"}, {4,"BIT~%f*"}, {4,"BIT~%f*"}, {4,"BIT~%f*"}, + {4,"BIT~%f*"}, {4,"BIT~%f*"}, {4,"BIT~%f"}, {4,"BIT~%f*"}, + {4,"BIT~%f*"}, {4,"BIT~%f*"}, {4,"BIT~%f*"}, {4,"BIT~%f*"}, + {4,"BIT~%f*"}, {4,"BIT~%f*"}, {4,"BIT~%f"}, {4,"BIT~%f*"}, + {4,"BIT~%f*"}, {4,"BIT~%f*"}, {4,"BIT~%f*"}, {4,"BIT~%f*"}, + {4,"BIT~%f*"}, {4,"BIT~%f*"}, {4,"BIT~%f"}, {4,"BIT~%f*"}, + {4,"BIT~%f*"}, {4,"BIT~%f*"}, {4,"BIT~%f*"}, {4,"BIT~%f*"}, + {4,"BIT~%f*"}, {4,"BIT~%f*"}, {4,"BIT~%f"}, {4,"BIT~%f*"}, + + {4,"RES~0,B,(%i%s)"}, {4,"RES~0,C,(%i%s)"}, {4,"RES~0,D,(%i%s)"}, {4,"RES~0,E,(%i%s)"}, + {4,"RES~0,H,(%i%s)"}, {4,"RES~0,L,(%i%s)"}, {4,"RES~%f"}, {4,"RES~0,A,(%i%s)"}, + {4,"RES~1,B,(%i%s)"}, {4,"RES~1,C,(%i%s)"}, {4,"RES~1,D,(%i%s)"}, {4,"RES~1,E,(%i%s)"}, + {4,"RES~1,H,(%i%s)"}, {4,"RES~1,L,(%i%s)"}, {4,"RES~%f"}, {4,"RES~1,A,(%i%s)"}, + {4,"RES~2,B,(%i%s)"}, {4,"RES~2,C,(%i%s)"}, {4,"RES~2,D,(%i%s)"}, {4,"RES~2,E,(%i%s)"}, + {4,"RES~2,H,(%i%s)"}, {4,"RES~2,L,(%i%s)"}, {4,"RES~%f"}, {4,"RES~2,A,(%i%s)"}, + {4,"RES~3,B,(%i%s)"}, {4,"RES~3,C,(%i%s)"}, {4,"RES~3,D,(%i%s)"}, {4,"RES~3,E,(%i%s)"}, + {4,"RES~3,H,(%i%s)"}, {4,"RES~3,L,(%i%s)"}, {4,"RES~%f"}, {4,"RES~3,A,(%i%s)"}, + {4,"RES~4,B,(%i%s)"}, {4,"RES~4,C,(%i%s)"}, {4,"RES~4,D,(%i%s)"}, {4,"RES~4,E,(%i%s)"}, + {4,"RES~4,H,(%i%s)"}, {4,"RES~4,L,(%i%s)"}, {4,"RES~%f"}, {4,"RES~4,A,(%i%s)"}, + {4,"RES~5,B,(%i%s)"}, {4,"RES~5,C,(%i%s)"}, {4,"RES~5,D,(%i%s)"}, {4,"RES~5,E,(%i%s)"}, + {4,"RES~5,H,(%i%s)"}, {4,"RES~5,L,(%i%s)"}, {4,"RES~%f"}, {4,"RES~5,A,(%i%s)"}, + {4,"RES~6,B,(%i%s)"}, {4,"RES~6,C,(%i%s)"}, {4,"RES~6,D,(%i%s)"}, {4,"RES~6,E,(%i%s)"}, + {4,"RES~6,H,(%i%s)"}, {4,"RES~6,L,(%i%s)"}, {4,"RES~%f"}, {4,"RES~6,A,(%i%s)"}, + {4,"RES~7,B,(%i%s)"}, {4,"RES~7,C,(%i%s)"}, {4,"RES~7,D,(%i%s)"}, {4,"RES~7,E,(%i%s)"}, + {4,"RES~7,H,(%i%s)"}, {4,"RES~7,L,(%i%s)"}, {4,"RES~%f"}, {4,"RES~7,A,(%i%s)"}, + + {4,"SET~0,B,(%i%s)"}, {4,"SET~0,C,(%i%s)"}, {4,"SET~0,D,(%i%s)"}, {4,"SET~0,E,(%i%s)"}, + {4,"SET~0,H,(%i%s)"}, {4,"SET~0,L,(%i%s)"}, {4,"SET~%f"}, {4,"SET~0,A,(%i%s)"}, + {4,"SET~1,B,(%i%s)"}, {4,"SET~1,C,(%i%s)"}, {4,"SET~1,D,(%i%s)"}, {4,"SET~1,E,(%i%s)"}, + {4,"SET~1,H,(%i%s)"}, {4,"SET~1,L,(%i%s)"}, {4,"SET~%f"}, {4,"SET~1,A,(%i%s)"}, + {4,"SET~2,B,(%i%s)"}, {4,"SET~2,C,(%i%s)"}, {4,"SET~2,D,(%i%s)"}, {4,"SET~2,E,(%i%s)"}, + {4,"SET~2,H,(%i%s)"}, {4,"SET~2,L,(%i%s)"}, {4,"SET~%f"}, {4,"SET~2,A,(%i%s)"}, + {4,"SET~3,B,(%i%s)"}, {4,"SET~3,C,(%i%s)"}, {4,"SET~3,D,(%i%s)"}, {4,"SET~3,E,(%i%s)"}, + {4,"SET~3,H,(%i%s)"}, {4,"SET~3,L,(%i%s)"}, {4,"SET~%f"}, {4,"SET~3,A,(%i%s)"}, + {4,"SET~4,B,(%i%s)"}, {4,"SET~4,C,(%i%s)"}, {4,"SET~4,D,(%i%s)"}, {4,"SET~4,E,(%i%s)"}, + {4,"SET~4,H,(%i%s)"}, {4,"SET~4,L,(%i%s)"}, {4,"SET~%f"}, {4,"SET~4,A,(%i%s)"}, + {4,"SET~5,B,(%i%s)"}, {4,"SET~5,C,(%i%s)"}, {4,"SET~5,D,(%i%s)"}, {4,"SET~5,E,(%i%s)"}, + {4,"SET~5,H,(%i%s)"}, {4,"SET~5,L,(%i%s)"}, {4,"SET~%f"}, {4,"SET~5,A,(%i%s)"}, + {4,"SET~6,B,(%i%s)"}, {4,"SET~6,C,(%i%s)"}, {4,"SET~6,D,(%i%s)"}, {4,"SET~6,E,(%i%s)"}, + {4,"SET~6,H,(%i%s)"}, {4,"SET~6,L,(%i%s)"}, {4,"SET~%f"}, {4,"SET~6,A,(%i%s)"}, + {4,"SET~7,B,(%i%s)"}, {4,"SET~7,C,(%i%s)"}, {4,"SET~7,D,(%i%s)"}, {4,"SET~7,E,(%i%s)"}, + {4,"SET~7,H,(%i%s)"}, {4,"SET~7,L,(%i%s)"}, {4,"SET~%f"}, {4,"SET~7,A,(%i%s)"}}; + +static const TilemDisasmInstruction insts_ed[256] = { + {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, + {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, + {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, + {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, + {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, + {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, + {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, + {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, + + {2,"IN~B,(C)"}, {2,"OUT~(C),B"}, {2,"SBC~HL,BC"}, {4,"LD~(%a),BC"}, + {2,"NEG"}, {2,"RETN"}, {2,"IM~0"}, {2,"LD~I,A"}, + {2,"IN~C,(C)"}, {2,"OUT~(C),C"}, {2,"ADC~HL,BC"}, {4,"LD~BC,(%a)"}, + {2,"NEG*"}, {2,"RETI"}, {2,"IM~0*"}, {2,"LD~R,A"}, + {2,"IN~D,(C)"}, {2,"OUT~(C),D"}, {2,"SBC~HL,DE"}, {4,"LD~(%a),DE"}, + {2,"NEG*"}, {2,"RETN*"}, {2,"IM~1"}, {2,"LD~A,I"}, + {2,"IN~E,(C)"}, {2,"OUT~(C),E"}, {2,"ADC~HL,DE"}, {4,"LD~DE,(%a)"}, + {2,"NEG*"}, {2,"RETN*"}, {2,"IM~2"}, {2,"LD~A,R"}, + {2,"IN~H,(C)"}, {2,"OUT~(C),H"}, {2,"SBC~HL,HL"}, {4,"LD~(%a),HL*"}, + {2,"NEG*"}, {2,"RETN*"}, {2,"IM~0*"}, {2,"RRD"}, + {2,"IN~L,(C)"}, {2,"OUT~(C),L"}, {2,"ADC~HL,HL"}, {4,"LD~HL,(%a)*"}, + {2,"NEG*"}, {2,"RETN*"}, {2,"IM~0*"}, {2,"RLD"}, + {2,"IN~(C)"}, {2,"OUT~(C),0"}, {2,"SBC~HL,SP"}, {4,"LD~(%a),SP"}, + {2,"NEG*"}, {2,"RETN*"}, {2,"IM~1*"}, {2,0}, + {2,"IN~A,(C)"}, {2,"OUT~(C),A"}, {2,"ADC~HL,SP"}, {4,"LD~SP,(%a)"}, + {2,"NEG*"}, {2,"RETN*"}, {2,"IM~2*"}, {2,0}, + + {2,0}, {2,0}, {2,0}, {2,0}, + {2,0}, {2,0}, {2,0}, {2,0}, + {2,0}, {2,0}, {2,0}, {2,0}, + {2,0}, {2,0}, {2,0}, {2,0}, + {2,0}, {2,0}, {2,0}, {2,0}, + {2,0}, {2,0}, {2,0}, {2,0}, + {2,0}, {2,0}, {2,0}, {2,0}, + {2,0}, {2,0}, {2,0}, {2,0}, + {2,"LDI"}, {2,"CPI"}, {2,"INI"}, {2,"OUTI"}, + {2,0}, {2,0}, {2,0}, {2,0}, + {2,"LDD"}, {2,"CPD"}, {2,"IND"}, {2,"OUTD"}, + {2,0}, {2,0}, {2,0}, {2,0}, + {2,"LDIR"}, {2,"CPIR"}, {2,"INIR"}, {2,"OTIR"}, + {2,0}, {2,0}, {2,0}, {2,0}, + {2,"LDDR"}, {2,"CPDR"}, {2,"INDR"}, {2,"OTDR"}, + {2,0}, {2,0}, {2,0}, {2,0}, + + {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, + {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, + {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, + {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, + {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, + {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, + {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, + {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}, {2,0}}; + +/* Count number of bytes of arguments for a given instruction/macro + pattern */ +static int pattern_arg_size(const char* pattern) +{ + char* p; + int count = 0, offs; + + while (*pattern) { + if (*pattern != '%') + pattern++; + else { + pattern++; + + if (*pattern >= '0' && *pattern <= '9') { + offs = strtol(pattern, &p, 10); + pattern = p; + } + else { + offs = count; + } + + switch (*pattern) { + case 0: + pattern--; + break; + + case 'b': + case 'C': + case 'r': + case 's': + offs++; + break; + + case 'a': + case 'c': + case 'f': + case 'j': + case 'w': + offs += 2; + break; + } + + pattern++; + if (offs > count) + count = offs; + } + } + + return count; +} + +static void get_instruction_info(const TilemDisasm* dasm, + const byte* instr, + int* length, int* argbase, + const char** pattern) +{ + const TilemDisasmSymbol* sym; + const TilemDisasmInstruction* ii; + dword mvalue; + int i; + + mvalue = 0; + for (i = 0; i < 4; i++) { + mvalue = (mvalue << 8) | instr[i]; + if ((sym = find_symbol(&dasm->macros, mvalue))) { + *pattern = sym->name; + *length = i + 1 + pattern_arg_size(sym->name); + *argbase = i + 1; + return; + } + } + + if (instr[0] == 0xed) { + ii = &insts_ed[instr[1]]; + *argbase = 2; + } + else if (instr[0] == 0xdd || instr[0] == 0xfd) { + if (instr[1] == 0xcb) { + ii = &insts_ddfdcb[instr[3]]; + } + else { + ii = &insts_ddfd[instr[1]]; + } + *argbase = 2; + } + else if (instr[0] == 0xcb) { + ii = &insts_cb[instr[1]]; + *argbase = 2; + } + else { + ii = &insts_main[instr[0]]; + *argbase = 1; + } + + *length = ii->length; + + if (ii->pattern) { + *pattern = ii->pattern; + } + else { + *argbase = 0; + if (ii->length == 1) + *pattern = "DB~%b"; + else + *pattern = "DB~%b,%b"; + } +} + +static void TILEM_ATTR_PRINTF(3, 4) +printv(char** buf, int* bsize, const char* fmt, ...) +{ + va_list ap; + int n; + + if (*bsize == 0) + return; + + va_start(ap, fmt); + n = vsnprintf(*buf, *bsize, fmt, ap); + va_end(ap); + + if (n >= *bsize) { + *buf += *bsize - 1; + **buf = 0; + *bsize = 0; + } + else { + *buf += n; + **buf = 0; + *bsize -= n; + } +} + +static void print_byte(char** buf, int* bsize, unsigned int b) +{ + printv(buf, bsize, "$%02X", b); +} + +static void print_word(const TilemDisasm* dasm, char** buf, int* bsize, + dword w, int autonum, int autodiff) +{ + TilemDisasmSymbol* sym; + + if (autonum && w < 0x100) { + printv(buf, bsize, "$%04X", w); + return; + } + + sym = find_prev_symbol(&dasm->labels, w); + + if (sym && !strcmp(sym->name, "flags")) { + w -= sym->value; + sym = find_symbol(&dasm->flags, w); + if (sym) { + printv(buf, bsize, "flags + %s", sym->name); + } + else { + printv(buf, bsize, "flags + $%02X", w); + } + } + else if (sym && w == sym->value) { + printv(buf, bsize, "%s", sym->name); + } + else if (sym && autodiff && w > 0x8000 && w - sym->value < 64) { + printv(buf, bsize, "%s + %d", sym->name, w - sym->value); + } + else { + printv(buf, bsize, "$%04X", w); + } +} + +static void print_romcall(const TilemDisasm* dasm, char** buf, int* bsize, + dword w) +{ + TilemDisasmSymbol* sym; + + sym = find_symbol(&dasm->romcalls, w); + if (sym) { + printv(buf, bsize, "%s", sym->name); + } + else { + printv(buf, bsize, "$%04X", w); + } +} + +static void print_flag(const TilemDisasm* dasm, char** buf, int* bsize, + unsigned int bit, unsigned int offset, + unsigned int prefix) +{ + TilemDisasmSymbol* sym; + int i; + + if (prefix == 0xfd) { + sym = find_symbol(&dasm->flags, 0x1000 + (offset << 4) + bit); + if (sym) { + for (i = 0; sym->name[i]; i++) { + printv(buf, bsize, "%c", sym->name[i]); + if (sym->name[i] == ',') + printv(buf, bsize, " (IY + "); + } + printv(buf, bsize, ")"); + return; + } + + sym = find_symbol(&dasm->flags, offset); + if (sym) { + printv(buf, bsize, "%d, (IY + %s)", bit, sym->name); + return; + } + } + + printv(buf, bsize, "%d, (%s", bit, (prefix == 0xfd ? "IY" : "IX")); + + if (offset & 0x80) { + printv(buf, bsize, " - $%02X", 0x100 - offset); + } + else if (offset) { + printv(buf, bsize, " + $%02X", offset); + } + + printv(buf, bsize, ")"); +} + +static void disassemble_pattern(const TilemDisasm* dasm, const char* pattern, + const byte* ibuf, dword pc, int argbase, + char** buf, int* bsize) +{ + int argidx, offs; + char* p; + dword w; + TilemDisasmSymbol* sym; + + argidx = argbase; + + while (*bsize && *pattern) { + if (*pattern == '~') + printv(buf, bsize, "\t"); + else if (*pattern == ',') { + printv(buf, bsize, ", "); + } + else if (*pattern != '%') { + printv(buf, bsize, "%c", *pattern); + } + else { + pattern++; + if (*pattern >= '0' && *pattern <= '9') { + offs = argbase + strtol(pattern, &p, 10); + pattern = p; + } + else { + offs = argidx; + } + + switch (*pattern) { + case 0: + pattern--; + break; + + case '%': + printv(buf, bsize, "%%"); + break; + + case 'a': + /* %a: word value, always an address */ + w = ibuf[offs] | (ibuf[offs + 1] << 8); + print_word(dasm, buf, bsize, w, 0, 1); + offs += 2; + break; + + case 'b': + /* %b: byte value */ + print_byte(buf, bsize, ibuf[offs]); + offs++; + break; + + case 'c': + /* %c: word value, always a ROM call number */ + w = ibuf[offs] | (ibuf[offs + 1] << 8); + print_romcall(dasm, buf, bsize, w); + offs += 2; + break; + + case 'C': + /* %C: byte value, always a ROM call number */ + print_romcall(dasm, buf, bsize, ibuf[offs]); + offs++; + break; + + case 'f': + /* %f: flag value */ + print_flag(dasm, buf, bsize, + (ibuf[offs + 1] >> 3) & 7, + ibuf[offs], ibuf[0]); + offs += 2; + break; + + case 'i': + /* %i: IX or IY by instruction prefix */ + if (ibuf[0] == 0xdd) + printv(buf, bsize, "IX"); + else + printv(buf, bsize, "IY"); + break; + + case 'j': + /* %j: word value, always a jump address */ + w = ibuf[offs] | (ibuf[offs + 1] << 8); + print_word(dasm, buf, bsize, w, 0, 0); + offs += 2; + break; + + case 'r': + /* %r: one-byte PC-relative value */ + if (ibuf[offs] & 0x80) + w = pc + offs - 0xff + ibuf[offs]; + else + w = pc + offs + 1 + ibuf[offs]; + print_word(dasm, buf, bsize, w, 0, 0); + offs++; + break; + + case 's': + /* %s: one-byte signed displacement */ + if (ibuf[0] == 0xfd + && (sym = find_symbol(&dasm->flags, + ibuf[offs]))) { + printv(buf, bsize, " + %s", sym->name); + } + else if (ibuf[offs] & 0x80) { + printv(buf, bsize, " - "); + print_byte(buf, bsize, + 0x100 - ibuf[offs]); + } + else if (ibuf[offs]) { + printv(buf, bsize, " + "); + print_byte(buf, bsize, ibuf[offs]); + } + offs++; + break; + + case 'w': + /* %w: word value */ + w = ibuf[offs] | (ibuf[offs + 1] << 8); + print_word(dasm, buf, bsize, w, 1, 1); + offs += 2; + break; + + case 'z': + /* %z: RST target address */ + print_word(dasm, buf, bsize, ibuf[0] & 0x38, + 0, 0); + break; + } + if (offs > argidx) + argidx = offs; + } + + pattern++; + } +} + +void tilem_disasm_disassemble(const TilemDisasm* dasm, TilemCalc* calc, + int phys, dword addr, dword* nextaddr, + char* buffer, int bufsize) +{ + byte ibuf[64]; + dword a, addr_l, max; + int length, argbase, i; + const char* pattern; + + if (phys) { + max = calc->hw.romsize + calc->hw.ramsize; + for (i = 0; i < 4; i++) { + a = (addr + i) % max; + ibuf[i] = calc->mem[a]; + } + + addr_l = (*calc->hw.mem_ptol)(calc, addr); + if (addr_l == 0xffffffff) + addr_l = (addr & 0x3fff) | 0x4000; + } + else { + max = 0x10000; + for (i = 0; i < 4; i++) { + a = (addr + i) & 0xffff; + ibuf[i] = calc->mem[(*calc->hw.mem_ltop)(calc, a)]; + } + + addr_l = addr; + } + + get_instruction_info(dasm, ibuf, &length, &argbase, &pattern); + + if (phys) { + for (i = 0; i < length; i++) { + ibuf[i] = calc->mem[addr]; + addr = (addr + 1) % max; + } + } + else { + for (i = 0; i < length; i++) { + ibuf[i] = calc->mem[(*calc->hw.mem_ltop)(calc, addr)]; + addr = (addr + 1) & 0xffff; + } + } + + if (nextaddr) + *nextaddr = addr; + + if (buffer) { + disassemble_pattern(dasm, pattern, ibuf, addr_l, argbase, + &buffer, &bufsize); + } +} diff --git a/tool/tilem-src/db/listing.c b/tool/tilem-src/db/listing.c new file mode 100644 index 0000000..3936d6c --- /dev/null +++ b/tool/tilem-src/db/listing.c @@ -0,0 +1,379 @@ +/* + * libtilemdb - Utilities for debugging Z80 assembly programs + * + * Copyright (C) 2010 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include "tilemdb.h" + +struct _TilemListingLineCache { + dword minaddr; + dword maxaddr; + int* order; +}; + +static void sort_lines(TilemListing* lst, + int start, int end) +{ + int pivot, ncstart, ncend, n; + dword addr, pivotaddr; + int* order = lst->linecache->order; + + pivot = order[start]; + pivotaddr = lst->lines[pivot].address; + + ncstart = start + 1; + ncend = end; + + while (ncstart < ncend) { + n = order[ncstart]; + addr = lst->lines[n].address; + if (addr < pivotaddr) { + ncstart++; + } + else { + order[ncstart] = order[ncend - 1]; + order[ncend - 1] = n; + ncend--; + } + } + + ncstart--; + order[start] = order[ncstart]; + order[ncstart] = pivot; + + if (ncstart > start + 1) + sort_lines(lst, start, ncstart); + if (end > ncend + 1) + sort_lines(lst, ncend, end); +} + +static void ensure_order(TilemListing* lst) +{ + int i; + + if (lst->nlines == 0) { + lst->linecache->minaddr = 0xffff; + lst->linecache->maxaddr = 0; + } + else if (!lst->linecache->order) { + lst->linecache->order = tilem_new_atomic(int, lst->nlines); + for (i = 0; i < lst->nlines; i++) + lst->linecache->order[i] = i; + sort_lines(lst, 0, lst->nlines); + + i = lst->linecache->order[0]; + lst->linecache->minaddr = lst->lines[i].address; + i = lst->linecache->order[lst->nlines - 1]; + lst->linecache->maxaddr = lst->lines[i].address; + } +} + +static void order_destroyed(TilemListing* lst) +{ + tilem_free(lst->linecache->order); + lst->linecache->order = NULL; +} + +static int first_at_addr(TilemListing* lst, dword addr) +{ + int start, end, i; + + start = 0; + end = lst->nlines; + while (start < end) { + i = (start + end) / 2; + if (lst->lines[lst->linecache->order[i]].address < addr) + start = i + 1; + else + end = i; + } + return start; +} + +TilemListing* tilem_listing_new() +{ + TilemListing* lst = tilem_new0(TilemListing, 1); + lst->lines = NULL; + lst->linecache = tilem_new0(TilemListingLineCache, 1); + lst->linecache->order = NULL; + return lst; +} + +void tilem_listing_free(TilemListing* lst) +{ + int i; + + if (!lst) + return; + + for (i = 0; i < lst->nlines; i++) + tilem_free(lst->lines[i].text); + tilem_free(lst->lines); + tilem_free(lst->linecache->order); + tilem_free(lst->linecache); + tilem_free(lst); +} + +void tilem_listing_file_clear(TilemListing* lst) +{ + order_destroyed(lst); + lst->nlines = 0; + lst->nlines_a = 0; + tilem_free(lst->lines); + lst->lines = NULL; +} + +void tilem_listing_append_line(TilemListing* lst, int srclinenum, dword address, + int depth, int datasize, const byte* data, + const char* text, int is_expansion) +{ + TilemListingLine* line; + int i; + + order_destroyed(lst); + lst->nlines++; + if (lst->nlines >= lst->nlines_a) { + lst->nlines_a = lst->nlines * 2; + lst->lines = tilem_renew(TilemListingLine, + lst->lines, lst->nlines_a); + } + + line = &lst->lines[lst->nlines - 1]; + + line->listing = lst; + line->srclinenum = srclinenum; + line->address = address & 0xffff; + line->depth = depth; + + if (datasize > TILEM_MAX_LINE_BYTES) + datasize = TILEM_MAX_LINE_BYTES; + + line->datasize = datasize; + for (i = 0; i < datasize; i++) + line->data[i] = data[i]; + + if (text) { + line->text = tilem_new_atomic(char, strlen(text) + 1); + strcpy(line->text, text); + + if ((text[0] >= 'A' && text[0] <= 'Z') + || (text[0] >= 'a' && text[0] <= 'z') + || (text[0] & 0x80)) + line->is_label = 1; + else + line->is_label = 0; + } + else { + line->text = NULL; + line->is_label = 0; + } + + line->is_expansion = is_expansion; +} + +void tilem_listing_get_address_range(TilemListing* lst, dword* min, dword* max) +{ + ensure_order(lst); + if (min) + *min = lst->linecache->minaddr; + if (max) + *max = lst->linecache->maxaddr; +} + +TilemListingLine* tilem_listing_line_get_next(TilemListingLine* line) +{ + if (!line) + return NULL; + + if (line != line->listing->lines + line->listing->nlines) + return line + 1; + else + return NULL; +} + +TilemListingLine* tilem_listing_line_get_prev(TilemListingLine* line) +{ + if (!line) + return NULL; + + if (line != line->listing->lines) + return line - 1; + else + return NULL; + +} + +TilemListingLine* tilem_listing_get_loaded_line_at_addr(TilemListing* lst, + dword address, + TilemCalc* calc, + int match_internal) +{ + int i; + TilemListingLine *line; + + ensure_order(lst); + i = first_at_addr(lst, address + 1); + + while (--i >= 0) { + line = &lst->lines[lst->linecache->order[i]]; + + if (match_internal) { + if (line->address + TILEM_MAX_LINE_BYTES <= address) + return NULL; + else if (line->address + line->datasize <= address) + continue; + } + else { + if (line->address != address) + return NULL; + } + + if (tilem_listing_line_is_loaded(line, calc)) + return line; + } + return NULL; +} + +static inline unsigned int getbyte(TilemCalc* calc, dword addr) +{ + dword pa = (*calc->hw.mem_ltop)(calc, addr & 0xffff); + return calc->mem[pa]; +} + +static inline int line_load_count(const TilemListingLine* line, TilemCalc* calc) +{ + int i, n; + + for (i = n = 0; i < line->datasize; i++) + if (getbyte(calc, line->address + i) == line->data[i]) + n++; + return n; +} + +static inline TilemListingLine* get_next_local(TilemListingLine* line) +{ + TilemListingLine* nline = tilem_listing_line_get_next(line); + + if (nline && nline->address != line->address + line->datasize) + return NULL; + else + return nline; +} + +static inline TilemListingLine* get_prev_local(TilemListingLine* line) +{ + TilemListingLine* nline = tilem_listing_line_get_prev(line); + + if (nline && nline->address != line->address + line->datasize) + return NULL; + else + return nline; +} + +int tilem_listing_line_is_loaded(TilemListingLine* line, TilemCalc* calc) +{ + int nbytes, ngood; + TilemListingLine *nline; + + while (line->datasize == 0 && (nline = get_next_local(line))) + line = nline; + + if (line_load_count(line, calc) != line->datasize) + return 0; + else { + nbytes = ngood = line->datasize; + + nline = line; + while ((nline = get_next_local(nline)) + && nline->address < line->address + 32) { + nbytes += nline->datasize; + ngood += line_load_count(nline, calc); + } + + nline = line; + while ((nline = get_prev_local(nline)) + && line->address < nline->address + 32) { + nbytes += nline->datasize; + ngood += line_load_count(nline, calc); + } + + return (ngood > nbytes / 2); + } +} + +static int bptest_listing_line(TilemCalc* calc, dword addr TILEM_ATTR_UNUSED, + void* data) +{ + return tilem_listing_line_is_loaded(data, calc); +} + +int tilem_listing_line_add_breakpoint(TilemListingLine* line, + TilemCalc* calc, int bptype, + int match_internal) +{ + dword max; + + if (match_internal && line->datasize > 0) + max = line->address + line->datasize - 1; + else + max = line->address; + + return tilem_z80_add_breakpoint(calc, bptype, line->address, max, + 0xffff, &bptest_listing_line, + (void*) line); +} + +static int bptest_listing_int(TilemCalc* calc, dword addr, void* data) +{ + TilemListing* lst = data; + + if (tilem_listing_get_loaded_line_at_addr(lst, addr, calc, 1)) + return 1; + else + return 0; +} + +static int bptest_listing_top(TilemCalc* calc, dword addr, void* data) +{ + TilemListing* lst = data; + + if (tilem_listing_get_loaded_line_at_addr(lst, addr, calc, 0)) + return 1; + else + return 0; +} + +int tilem_listing_add_breakpoint(TilemListing* lst, TilemCalc* calc, + int bptype, int match_internal) +{ + dword min, max; + + tilem_listing_get_address_range(lst, &min, &max); + return tilem_z80_add_breakpoint(calc, bptype, min, max, 0xffff, + (match_internal + ? &bptest_listing_int + : &bptest_listing_top), lst); +} + diff --git a/tool/tilem-src/db/lstfile.c b/tool/tilem-src/db/lstfile.c new file mode 100644 index 0000000..938ce1c --- /dev/null +++ b/tool/tilem-src/db/lstfile.c @@ -0,0 +1,384 @@ +/* + * libtilemdb - Utilities for debugging Z80 assembly programs + * + * Copyright (C) 2010 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include "tilemdb.h" + +/* Test if TEXT contains a correctly-formatted number WIDTH characters + wide. If PAD = 0, number is padded on left with zeroes; if PAD = + 1, number is padded on left with spaces; if PAD = -1, number is + padded on right with spaces. */ +static int match_num(const char* text, int width, int pad, int base, + int* value) +{ + int start, end; + char* p; + + if ((int) strlen(text) < width) + return 0; + + start = 0; + while (start < width && text[start] == ' ') + start++; + + end = width; + while (end > start && text[end - 1] == ' ') + end--; + + if (start == end) + return 0; + + if (pad != 1 && start != 0) + return 0; + + if (pad != -1 && end != width) + return 0; + + if (pad != 0 && text[start] == '0' && start != end - 1) + return 0; + + *value = strtol(text + start, &p, base); + + return (p == text + end); +} + +/* Test if string exactly matches a printf-like format string. + %d, %x match decimal and hex integers; + %s matches any string of exactly that width. */ +static int match_pattern(const char* text, const char* pattern, int* datasize, + byte* data, ...) +{ + int width, pad, value, *ip; + char **sp; + char *end; + va_list ap; + int failed = 0, lastdb = 0; + + va_start(ap, data); + + *datasize = 0; + + while (!failed && *pattern) { + if (*pattern != '%') { + if (*text == *pattern) + text++; + else + failed = 1; + pattern++; + } + else { + pattern++; + if (*pattern == '0') { + pad = 0; + pattern++; + } + else if (*pattern == '-') { + pad = -1; + pattern++; + } + else + pad = 1; + + width = strtol(pattern, &end, 10); + pattern = end; + if (!width) + width = strlen(text); + else if (width > (int) strlen(text)) { + failed = 1; + break; + } + + switch (*pattern) { + case '%': + if (*text == '%') + text++; + else + failed = 1; + break; + + case 'B': + if (text[0] == ' ' && text[1] == ' ') { + lastdb = 1; + text += 2; + break; + } + case 'b': + if (match_num(text, width, pad, 16, &value) + && !lastdb) { + data[*datasize] = value; + (*datasize)++; + text += width; + } + else { + failed = 1; + } + break; + + case 'd': + ip = va_arg(ap, int *); + if (match_num(text, width, pad, 10, ip)) { + text += width; + } + else { + failed = 1; + } + break; + + case 'x': + ip = va_arg(ap, int *); + if (match_num(text, width, pad, 16, ip)) { + text += width; + } + else { + failed = 1; + } + break; + + case 's': + sp = va_arg(ap, char **); + *sp = (char*) text; + text += width; + break; + } + pattern++; + } + } + + va_end(ap); + + return (!failed && *text == 0); +} + +static int get_tasm_depth(const char* s) +{ + if (!strncmp(s, "+++", 3)) + return 4; + else if (!strncmp(s, "++ ", 3)) + return 3; + else if (!strncmp(s, "+ ", 3)) + return 2; + else if (!strncmp(s, " ", 3)) + return 1; + else + return 0; +} + +static int parse_listing(const char* line, int* linenum, int* addr, int* depth, + int* datasize, byte* data, char** text, int* isexp, + const TilemListingLine* prevline) +{ + int dummy; + char *p, *q; + + /* tasm */ + + if (match_pattern(line, "%04d%3s%04x%1s%02B %02B %02B %02B %s", + datasize, data, linenum, &p, addr, &q, text)) { + *depth = get_tasm_depth(p); + *isexp = 0; + return 1; + } + if (match_pattern(line, "%04d%3s%04x%1s%02b %02b %02b ", + datasize, data, linenum, &p, addr, &q) + || match_pattern(line, "%04d%3s%04x%1s%02b %02b ", + datasize, data, linenum, &p, addr, &q) + || match_pattern(line, "%04d%3s%04x%1s%02b ", + datasize, data, linenum, &p, addr, &q)) { + *depth = get_tasm_depth(p); + *text = NULL; + *isexp = 0; + return 1; + } + + /* zmasm */ + + if (match_pattern(line, "%08x %02B %02B %02B %02B %02B %02B %4s %5d %s", + datasize, data, addr, &p, linenum, text) + && p[0] >= 'A' && p[0] <= 'Z') { + *depth = p[0] - 'A' + 1; + *isexp = (p[1] == '+'); + return 1; + } + if (match_pattern(line, "%08x %02B %02B %02B %02B %02B %02B %4s %5d", + datasize, data, addr, &p, linenum) + && p[0] >= 'A' && p[0] <= 'Z') { + *text = NULL; + *depth = p[0] - 'A' + 1; + *isexp = (p[1] == '+'); + return 1; + } + if (match_pattern(line, " %4s %5d %s", + datasize, data, &p, linenum, text) + && p[0] >= 'A' && p[0] <= 'Z') { + *addr = prevline->address + prevline->datasize; + *depth = p[0] - 'A' + 1; + *isexp = (p[1] == '+'); + return 1; + } + if (match_pattern(line, " %08x %4s %5d %s", + datasize, data, &dummy, &p, linenum, text) + && p[0] >= 'A' && p[0] <= 'Z') { + *addr = prevline->address + prevline->datasize; + *depth = p[0] - 'A' + 1; + *isexp = (p[1] == '+'); + return 1; + } + + /* spasm - old and new versions */ + + if (match_pattern(line, "%5d %04x: %02b %02b %02b %02b %s", + datasize, data, linenum, addr, text) + || match_pattern(line, "%5d %04x: %02b %02b %02b - %s", + datasize, data, linenum, addr, text) + || match_pattern(line, "%5d %04x: %02b %02b - - %s", + datasize, data, linenum, addr, text) + || match_pattern(line, "%5d %04x: %02b - - - %s", + datasize, data, linenum, addr, text) + || match_pattern(line, "%5d %04x: - - - - %s", + datasize, data, linenum, addr, text) + + || match_pattern(line, "%5d %02x:%04x %02b %02b %02b %02b %s", + datasize, data, linenum, &dummy, addr, text) + || match_pattern(line, "%5d %02x:%04x %02b %02b %02b - %s", + datasize, data, linenum, &dummy, addr, text) + || match_pattern(line, "%5d %02x:%04x %02b %02b - - %s", + datasize, data, linenum, &dummy, addr, text) + || match_pattern(line, "%5d %02x:%04x %02b - - - %s", + datasize, data, linenum, &dummy, addr, text) + || match_pattern(line, "%5d %02x:%04x - - - - %s", + datasize, data, linenum, &dummy, addr, text)) { + *depth = *isexp = 0; + return 1; + } + if (match_pattern(line, " %02b %02b %02b %02b %s", + datasize, data, text) + || match_pattern(line, " %02b %02b %02b - %s", + datasize, data, text) + || match_pattern(line, " %02b %02b - - %s", + datasize, data, text) + || match_pattern(line, " %02b - - - %s", + datasize, data, text) + + || match_pattern(line, " %02b %02b %02b %02b %s", + datasize, data, text) + || match_pattern(line, " %02b %02b %02b - %s", + datasize, data, text) + || match_pattern(line, " %02b %02b - - %s", + datasize, data, text) + || match_pattern(line, " %02b - - - %s", + datasize, data, text)) { + *linenum = prevline->srclinenum; + *addr = prevline->address + prevline->datasize; + *depth = *isexp = 0; + return 1; + } + + /* tpasm or miniasm */ + + if (match_pattern(line, "%-5d %08x %02B %02B %02B %02B %02B %2s%s", + datasize, data, linenum, addr, &p, text) + || match_pattern(line, "%5d %08x %02B %02B %02B %02B %02B %2s%s", + datasize, data, linenum, addr, &p, text)) { + *depth = 0; + *isexp = (*p == 'm' || *p == 'a'); + return 1; + } + if (match_pattern(line, "%-5d %08x (%08x) %2s%s", + datasize, data, linenum, addr, &dummy, &p, text) + || match_pattern(line, "%5d %08x (%08x) %2s%s", + datasize, data, linenum, addr, &dummy, &p, text)) { + *depth = 0; + *isexp = (*p == 'm' || *p == 'a'); + return 1; + } + if (match_pattern(line, " %02B %02B %02B %02B %02B %1s", + datasize, data, &p)) { + *text = NULL; + *linenum = prevline->srclinenum; + *addr = prevline->address + prevline->datasize; + *depth = 0; + *isexp = (*p == 'm' || *p == 'a'); + return 1; + } + if (match_pattern(line, " %02b %02b %02b %02b %02b", + datasize, data) + || match_pattern(line, " %02b %02b %02b %02b", + datasize, data) + || match_pattern(line, " %02b %02b %02b", + datasize, data) + || match_pattern(line, " %02b %02b", + datasize, data) + || match_pattern(line, " %02b", + datasize, data)) { + *text = NULL; + *linenum = prevline->srclinenum; + *addr = prevline->address + prevline->datasize; + *depth = *isexp = 0; + return 1; + } + + printf("***\t%s\n", line); + + return 0; +} + +int tilem_listing_read_file(TilemListing* lst, FILE* lstfile) +{ + char buf[1024]; + int linenum, addr, depth, isexp, datasize; + byte data[TILEM_MAX_LINE_BYTES]; + char *text; + int i, status = 1; + TilemListingLine prevline; + + prevline.text = NULL; + prevline.srclinenum = 0; + prevline.address = 0xffffffff; + prevline.depth = 0; + prevline.datasize = 0; + + while (fgets(buf, sizeof(buf), lstfile)) { + i = strlen(buf); + while (i > 0 && (buf[i - 1] == '\r' || buf[i - 1] == '\n')) + i--; + buf[i] = 0; + + if (parse_listing(buf, &linenum, &addr, &depth, &datasize, + data, &text, &isexp, &prevline)) { + + if (linenum) + status = 0; + + tilem_listing_append_line(lst, linenum, addr, depth, + datasize, data, text, isexp); + prevline = lst->lines[lst->nlines - 1]; + } + } + + return status; +} + diff --git a/tool/tilem-src/db/tilemdb.h b/tool/tilem-src/db/tilemdb.h new file mode 100644 index 0000000..daef3dc --- /dev/null +++ b/tool/tilem-src/db/tilemdb.h @@ -0,0 +1,149 @@ +/* + * libtilemdb - Utilities for debugging Z80 assembly programs + * + * Copyright (C) 2010 Benjamin Moody + * + * 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, see + * . + */ + +#ifndef _TILEMDB_H +#define _TILEMDB_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Disassembler */ + +typedef struct _TilemDisasm TilemDisasm; + +/* Create a new disassembly context. */ +TilemDisasm* tilem_disasm_new(void); + +/* Free a disassembly context. */ +void tilem_disasm_free(TilemDisasm* dasm); + +/* Read symbols from SYMFILE. */ +int tilem_disasm_read_symbol_file(TilemDisasm* dasm, FILE* symfile); + +/* Set symbol NAME to value VALUE. */ +void tilem_disasm_set_label(TilemDisasm* dasm, const char* name, + dword value); + +/* Check if symbol NAME is defined. If symbol is defined and VALUE is + non-null, set *VALUE to symbol's value. */ +int tilem_disasm_get_label(const TilemDisasm* dasm, const char* name, + dword* value); + +/* Check if a label is defined at the given address. */ +const char* tilem_disasm_get_label_at_address(const TilemDisasm* dasm, + dword addr); + +/* Disassemble a line starting at address ADDR. Store text (up to + BUFSIZE characters) in BUFFER, and set *NEXTADDR to the address of + the following line. If PHYS is 0, use logical addresses; otherwise + use physical addresses. */ +void tilem_disasm_disassemble(const TilemDisasm* dasm, TilemCalc* calc, + int phys, dword addr, dword* nextaddr, + char* buffer, int bufsize); + + +/* Assembly listing files */ + +typedef struct _TilemListing TilemListing; +typedef struct _TilemListingLine TilemListingLine; +typedef struct _TilemListingLineCache TilemListingLineCache; + +#define TILEM_MAX_LINE_BYTES 6 + +struct _TilemListingLine { + TilemListing* listing; /* Listing to which this line + belongs */ + char* text; /* Text of source line */ + int srclinenum; /* Line number in original + source file */ + dword address; /* Address */ + int depth; /* Source file inclusion + depth */ + byte datasize; /* Number of data bytes */ + unsigned is_label : 1; /* = 1 if line appears to + contain a label */ + unsigned is_expansion : 1; /* = 1 if line is part of a + macro expansion */ + byte data[TILEM_MAX_LINE_BYTES]; /* Data bytes on this line */ +}; + +struct _TilemListing { + int nlines; + int nlines_a; + TilemListingLine* lines; + TilemListingLineCache* linecache; +}; + +/* Create new assembly listing. */ +TilemListing* tilem_listing_new(void); + +/* Free listing data. */ +void tilem_listing_free(TilemListing* lst); + +/* Clear listing file contents. */ +void tilem_listing_clear(TilemListing* lst); + +/* Add a line to the end of the listing file. */ +void tilem_listing_append_line(TilemListing* lst, int srclinenum, dword address, + int depth, int datasize, const byte* data, + const char* text, int is_expansion); + +/* Calculate minimum and maximum address used by a listing file. */ +void tilem_listing_get_address_range(TilemListing* lst, dword* min, dword* max); + +/* Get next line, if any. */ +TilemListingLine* tilem_listing_line_get_next(TilemListingLine* line); + +/* Get previous line, if any. */ +TilemListingLine* tilem_listing_line_get_prev(TilemListingLine* line); + +/* Find the line (if any) currently loaded at the given address. If + MATCH_INTERNAL = 0, find only lines that begin at that address. */ +TilemListingLine* tilem_listing_get_loaded_line_at_addr(TilemListing* lst, + dword address, + TilemCalc* calc, + int match_internal); + +/* Check if given line is currently loaded (and mapped into Z80 memory + space.) */ +int tilem_listing_line_is_loaded(TilemListingLine* line, TilemCalc* calc); + +/* Set a breakpoint to be triggered on the given line. */ +int tilem_listing_line_add_breakpoint(TilemListingLine* line, + TilemCalc* calc, int bptype, + int match_internal); + +/* Set a breakpoint to be triggered on any line in the listing. */ +int tilem_listing_add_breakpoint(TilemListing* lst, TilemCalc* calc, + int bptype, int match_internal); + +/* Read assembly listing from LSTFILE. */ +int tilem_listing_read_file(TilemListing* lst, FILE* lstfile); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/tool/tilem-src/emu/Makefile.in b/tool/tilem-src/emu/Makefile.in new file mode 100644 index 0000000..915d6d8 --- /dev/null +++ b/tool/tilem-src/emu/Makefile.in @@ -0,0 +1,218 @@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ +datarootdir = @datarootdir@ +bindir = @bindir@ +datadir = @datadir@ +pkgdatadir = @datadir@/tilem2 +mandir = @mandir@ + +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +srcdir = @srcdir@ +VPATH = @srcdir@ +@SET_MAKE@ + +AR = @AR@ +CC = @CC@ +CFLAGS = @CFLAGS@ +CPPFLAGS = @CPPFLAGS@ +DEFS = @DEFS@ +OPT_CFLAGS = @OPT_CFLAGS@ +RANLIB = @RANLIB@ +SHELL = @SHELL@ + +core_objects = calcs.o z80.o state.o rom.o flash.o link.o keypad.o lcd.o \ + cert.o md5.o timers.o monolcd.o graylcd.o grayimage.o graycolor.o + +x7_objects = x7_init.o x7_io.o x7_memory.o x7_subcore.o +x1_objects = x1_init.o x1_io.o x1_memory.o x1_subcore.o +x2_objects = x2_init.o x2_io.o x2_memory.o x2_subcore.o +x3_objects = x3_init.o x3_io.o x3_memory.o x3_subcore.o +xp_objects = xp_init.o xp_io.o xp_memory.o xp_subcore.o +xs_objects = xs_init.o xs_io.o xs_memory.o xs_subcore.o +x4_objects = x4_init.o x4_io.o x4_memory.o x4_subcore.o +xz_objects = xz_init.o xz_io.o xz_memory.o xz_subcore.o +xn_objects = xn_init.o xn_io.o xn_memory.o xn_subcore.o +x5_objects = x5_init.o x5_io.o x5_memory.o x5_subcore.o +x6_objects = x6_init.o x6_io.o x6_memory.o x6_subcore.o + +objects = $(core_objects) $(x7_objects) $(x1_objects) $(x2_objects) \ + $(x3_objects) $(xp_objects) $(xs_objects) $(x4_objects) $(xz_objects) \ + $(xn_objects) $(x5_objects) $(x6_objects) + +compile = $(CC) -I$(top_builddir) -I$(srcdir) $(CFLAGS) $(CPPFLAGS) $(DEFS) $(OPT_CFLAGS) + +all: libtilemcore.a + +libtilemcore.a: $(objects) + $(AR) cru libtilemcore.a $(objects) + $(RANLIB) libtilemcore.a + +# Main emulator core + +calcs.o: calcs.c tilem.h z80.h ../config.h + $(compile) -c $(srcdir)/calcs.c +z80.o: z80.c z80.h z80cmds.h z80main.h z80cb.h z80ddfd.h z80ed.h tilem.h ../config.h + $(compile) -c $(srcdir)/z80.c +state.o: state.c tilem.h z80.h ../config.h + $(compile) -c $(srcdir)/state.c +rom.o: rom.c tilem.h ../config.h + $(compile) -c $(srcdir)/rom.c +flash.o: flash.c tilem.h ../config.h + $(compile) -c $(srcdir)/flash.c +link.o: link.c tilem.h ../config.h + $(compile) -c $(srcdir)/link.c +keypad.o: keypad.c tilem.h scancodes.h ../config.h + $(compile) -c $(srcdir)/keypad.c +lcd.o: lcd.c tilem.h ../config.h + $(compile) -c $(srcdir)/lcd.c +cert.o: cert.c tilem.h ../config.h + $(compile) -c $(srcdir)/cert.c +md5.o: md5.c tilem.h ../config.h + $(compile) -c $(srcdir)/md5.c +timers.o: timers.c tilem.h ../config.h + $(compile) -c $(srcdir)/timers.c +monolcd.o: monolcd.c tilem.h ../config.h + $(compile) -c $(srcdir)/monolcd.c +graylcd.o: graylcd.c tilem.h graylcd.h ../config.h + $(compile) -c $(srcdir)/graylcd.c +grayimage.o: grayimage.c tilem.h graylcd.h ../config.h + $(compile) -c $(srcdir)/grayimage.c +graycolor.o: graycolor.c tilem.h ../config.h + $(compile) -c $(srcdir)/graycolor.c + +# TI-73 + +x7_init.o: x7/x7_init.c x7/x7.h tilem.h ../config.h + $(compile) -c $(srcdir)/x7/x7_init.c +x7_io.o: x7/x7_io.c x7/x7.h tilem.h ../config.h + $(compile) -c $(srcdir)/x7/x7_io.c +x7_memory.o: x7/x7_memory.c x7/x7.h tilem.h ../config.h + $(compile) -c $(srcdir)/x7/x7_memory.c +x7_subcore.o: x7/x7_subcore.c x7/x7.h tilem.h ../config.h + $(compile) -c $(srcdir)/x7/x7_subcore.c + +# TI-81 + +x1_init.o: x1/x1_init.c x1/x1.h tilem.h ../config.h + $(compile) -c $(srcdir)/x1/x1_init.c +x1_io.o: x1/x1_io.c x1/x1.h tilem.h ../config.h + $(compile) -c $(srcdir)/x1/x1_io.c +x1_memory.o: x1/x1_memory.c x1/x1.h tilem.h ../config.h + $(compile) -c $(srcdir)/x1/x1_memory.c +x1_subcore.o: x1/x1_subcore.c x1/x1.h tilem.h ../config.h + $(compile) -c $(srcdir)/x1/x1_subcore.c + +# TI-82 + +x2_init.o: x2/x2_init.c x2/x2.h tilem.h ../config.h + $(compile) -c $(srcdir)/x2/x2_init.c +x2_io.o: x2/x2_io.c x2/x2.h tilem.h ../config.h + $(compile) -c $(srcdir)/x2/x2_io.c +x2_memory.o: x2/x2_memory.c x2/x2.h tilem.h ../config.h + $(compile) -c $(srcdir)/x2/x2_memory.c +x2_subcore.o: x2/x2_subcore.c x2/x2.h tilem.h ../config.h + $(compile) -c $(srcdir)/x2/x2_subcore.c + +# TI-83 + +x3_init.o: x3/x3_init.c x3/x3.h tilem.h ../config.h + $(compile) -c $(srcdir)/x3/x3_init.c +x3_io.o: x3/x3_io.c x3/x3.h tilem.h ../config.h + $(compile) -c $(srcdir)/x3/x3_io.c +x3_memory.o: x3/x3_memory.c x3/x3.h tilem.h ../config.h + $(compile) -c $(srcdir)/x3/x3_memory.c +x3_subcore.o: x3/x3_subcore.c x3/x3.h tilem.h ../config.h + $(compile) -c $(srcdir)/x3/x3_subcore.c + +# TI-83 Plus + +xp_init.o: xp/xp_init.c xp/xp.h tilem.h ../config.h + $(compile) -c $(srcdir)/xp/xp_init.c +xp_io.o: xp/xp_io.c xp/xp.h tilem.h ../config.h + $(compile) -c $(srcdir)/xp/xp_io.c +xp_memory.o: xp/xp_memory.c xp/xp.h tilem.h ../config.h + $(compile) -c $(srcdir)/xp/xp_memory.c +xp_subcore.o: xp/xp_subcore.c xp/xp.h tilem.h ../config.h + $(compile) -c $(srcdir)/xp/xp_subcore.c + +# TI-83 Plus SE + +xs_init.o: xs/xs_init.c xs/xs.h tilem.h ../config.h + $(compile) -c $(srcdir)/xs/xs_init.c +xs_io.o: xs/xs_io.c xs/xs.h tilem.h ../config.h + $(compile) -c $(srcdir)/xs/xs_io.c +xs_memory.o: xs/xs_memory.c xs/xs.h tilem.h ../config.h + $(compile) -c $(srcdir)/xs/xs_memory.c +xs_subcore.o: xs/xs_subcore.c xs/xs.h tilem.h ../config.h + $(compile) -c $(srcdir)/xs/xs_subcore.c + +# TI-84 Plus + +x4_init.o: x4/x4_init.c x4/x4.h tilem.h ../config.h + $(compile) -c $(srcdir)/x4/x4_init.c +x4_io.o: x4/x4_io.c x4/x4.h tilem.h ../config.h + $(compile) -c $(srcdir)/x4/x4_io.c +x4_memory.o: x4/x4_memory.c x4/x4.h tilem.h ../config.h + $(compile) -c $(srcdir)/x4/x4_memory.c +x4_subcore.o: x4/x4_subcore.c x4/x4.h tilem.h ../config.h + $(compile) -c $(srcdir)/x4/x4_subcore.c + +# TI-84 Plus SE + +xz_init.o: xz/xz_init.c xz/xz.h tilem.h ../config.h + $(compile) -c $(srcdir)/xz/xz_init.c +xz_io.o: xz/xz_io.c xz/xz.h tilem.h ../config.h + $(compile) -c $(srcdir)/xz/xz_io.c +xz_memory.o: xz/xz_memory.c xz/xz.h tilem.h ../config.h + $(compile) -c $(srcdir)/xz/xz_memory.c +xz_subcore.o: xz/xz_subcore.c xz/xz.h tilem.h ../config.h + $(compile) -c $(srcdir)/xz/xz_subcore.c + +# TI-Nspire 84 Plus emulator + +xn_init.o: xn/xn_init.c xn/xn.h tilem.h ../config.h + $(compile) -c $(srcdir)/xn/xn_init.c +xn_io.o: xn/xn_io.c xn/xn.h tilem.h ../config.h + $(compile) -c $(srcdir)/xn/xn_io.c +xn_memory.o: xn/xn_memory.c xn/xn.h tilem.h ../config.h + $(compile) -c $(srcdir)/xn/xn_memory.c +xn_subcore.o: xn/xn_subcore.c xn/xn.h tilem.h ../config.h + $(compile) -c $(srcdir)/xn/xn_subcore.c + +# TI-85 + +x5_init.o: x5/x5_init.c x5/x5.h tilem.h ../config.h + $(compile) -c $(srcdir)/x5/x5_init.c +x5_io.o: x5/x5_io.c x5/x5.h tilem.h ../config.h + $(compile) -c $(srcdir)/x5/x5_io.c +x5_memory.o: x5/x5_memory.c x5/x5.h tilem.h ../config.h + $(compile) -c $(srcdir)/x5/x5_memory.c +x5_subcore.o: x5/x5_subcore.c x5/x5.h tilem.h ../config.h + $(compile) -c $(srcdir)/x5/x5_subcore.c + +# TI-86 + +x6_init.o: x6/x6_init.c x6/x6.h tilem.h ../config.h + $(compile) -c $(srcdir)/x6/x6_init.c +x6_io.o: x6/x6_io.c x6/x6.h tilem.h ../config.h + $(compile) -c $(srcdir)/x6/x6_io.c +x6_memory.o: x6/x6_memory.c x6/x6.h tilem.h ../config.h + $(compile) -c $(srcdir)/x6/x6_memory.c +x6_subcore.o: x6/x6_subcore.c x6/x6.h tilem.h ../config.h + $(compile) -c $(srcdir)/x6/x6_subcore.c + + +clean: + rm -f *.o + rm -f libtilemcore.a + + +Makefile: Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && $(SHELL) ./config.status + +$(top_builddir)/config.status: $(top_srcdir)/configure + cd $(top_builddir) && $(SHELL) ./config.status --recheck + +.PRECIOUS: Makefile $(top_builddir)/config.status +.PHONY: clean all diff --git a/tool/tilem-src/emu/calcs.c b/tool/tilem-src/emu/calcs.c new file mode 100644 index 0000000..b251f60 --- /dev/null +++ b/tool/tilem-src/emu/calcs.c @@ -0,0 +1,186 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include "tilem.h" +#include "z80.h" + +extern const TilemHardware hardware_ti73, hardware_ti76, + hardware_ti81, hardware_ti82, hardware_ti83, + hardware_ti83p, hardware_ti83pse, hardware_ti84p, + hardware_ti84pse, hardware_ti84pns, + hardware_ti85, hardware_ti86; + +const TilemHardware* hwmodels[] = { + &hardware_ti73, + &hardware_ti76, + &hardware_ti81, + &hardware_ti82, + &hardware_ti83, + &hardware_ti83p, + &hardware_ti83pse, + &hardware_ti84p, + &hardware_ti84pse, + &hardware_ti84pns, + &hardware_ti85, + &hardware_ti86 }; + +#define NUM_MODELS (sizeof(hwmodels) / sizeof(TilemHardware*)) + +void tilem_get_supported_hardware(const TilemHardware*** models, + int* nmodels) +{ + *models = hwmodels; + *nmodels = NUM_MODELS; +} + +void tilem_calc_reset(TilemCalc* calc) +{ + tilem_z80_reset(calc); + tilem_lcd_reset(calc); + tilem_linkport_reset(calc); + tilem_keypad_reset(calc); + tilem_flash_reset(calc); + tilem_md5_assist_reset(calc); + tilem_user_timers_reset(calc); + if (calc->hw.reset) + (*calc->hw.reset)(calc); +} + +TilemCalc* tilem_calc_new(char id) +{ + int i; + TilemCalc* calc; + dword msize; + + for (i = 0; i < (int) NUM_MODELS; i++) { + if (hwmodels[i]->model_id == id) { + calc = tilem_try_new0(TilemCalc, 1); + if (!calc) { + return NULL; + } + + calc->hw = *hwmodels[i]; + + calc->poweronhalt = 1; + calc->battery = 60; + calc->hwregs = tilem_try_new_atomic(dword, calc->hw.nhwregs); + if (!calc->hwregs) { + tilem_free(calc); + return NULL; + } + + memset(calc->hwregs, 0, calc->hw.nhwregs * sizeof(dword)); + + msize = (calc->hw.romsize + calc->hw.ramsize + + calc->hw.lcdmemsize); + + calc->mem = tilem_try_new_atomic(byte, msize); + if (!calc->mem) { + tilem_free(calc->hwregs); + tilem_free(calc); + return NULL; + } + + calc->ram = calc->mem + calc->hw.romsize; + calc->lcdmem = calc->ram + calc->hw.ramsize; + + memset(calc->ram, 0, msize - calc->hw.romsize); + + calc->lcd.emuflags = TILEM_LCD_REQUIRE_DELAY; + calc->flash.emuflags = TILEM_FLASH_REQUIRE_DELAY; + + tilem_calc_reset(calc); + return calc; + } + } + + fprintf(stderr, "INTERNAL ERROR: invalid model ID '%c'\n", id); + return NULL; +} + +TilemCalc* tilem_calc_copy(TilemCalc* calc) +{ + TilemCalc* newcalc; + dword msize; + + newcalc = tilem_try_new(TilemCalc, 1); + if (!newcalc) + return NULL; + memcpy(newcalc, calc, sizeof(TilemCalc)); + + newcalc->hwregs = tilem_try_new_atomic(dword, calc->hw.nhwregs); + if (!newcalc->hwregs) { + tilem_free(newcalc); + return NULL; + } + memcpy(newcalc->hwregs, calc->hwregs, calc->hw.nhwregs * sizeof(dword)); + + newcalc->z80.timers = tilem_try_new(TilemZ80Timer, + newcalc->z80.ntimers); + if (!newcalc->z80.timers) { + tilem_free(newcalc->hwregs); + tilem_free(newcalc); + return NULL; + } + memcpy(newcalc->z80.timers, calc->z80.timers, + newcalc->z80.ntimers * sizeof(TilemZ80Timer)); + + newcalc->z80.breakpoints = tilem_try_new(TilemZ80Breakpoint, + newcalc->z80.nbreakpoints); + if (!newcalc->z80.breakpoints) { + tilem_free(newcalc->z80.timers); + tilem_free(newcalc->hwregs); + tilem_free(newcalc); + return NULL; + } + memcpy(newcalc->z80.breakpoints, calc->z80.breakpoints, + newcalc->z80.nbreakpoints * sizeof(TilemZ80Breakpoint)); + + msize = (calc->hw.romsize + calc->hw.ramsize + calc->hw.lcdmemsize); + newcalc->mem = tilem_try_new_atomic(byte, msize); + if (!newcalc->mem) { + tilem_free(newcalc->z80.breakpoints); + tilem_free(newcalc->z80.timers); + tilem_free(newcalc->hwregs); + tilem_free(newcalc); + return NULL; + } + memcpy(newcalc->mem, calc->mem, msize * sizeof(byte)); + + newcalc->ram = newcalc->mem + calc->hw.romsize; + newcalc->lcdmem = newcalc->ram + calc->hw.ramsize; + + return newcalc; +} + +void tilem_calc_free(TilemCalc* calc) +{ + tilem_free(calc->mem); + tilem_free(calc->hwregs); + tilem_free(calc->z80.breakpoints); + tilem_free(calc->z80.timers); + tilem_free(calc); +} diff --git a/tool/tilem-src/emu/cert.c b/tool/tilem-src/emu/cert.c new file mode 100644 index 0000000..5c2375c --- /dev/null +++ b/tool/tilem-src/emu/cert.c @@ -0,0 +1,136 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2009-2011 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include "tilem.h" + +static int certificate_valid(byte* cert) +{ + int i, n; + + if (cert[0] != 0) + return 0; + + i = 1; + + /* check that the actual certificate area consists of valid + certificate fields */ + while (cert[i] <= 0x0F) { + switch (cert[i + 1] & 0x0F) { + case 0x0D: + n = cert[i + 2] + 3; + break; + case 0x0E: + n = (cert[i + 2] << 8) + cert[i + 3] + 4; + break; + case 0x0F: + n = 6; + break; + default: + n = (cert[i + 1] & 0xf) + 2; + } + i += n; + if (i >= 0x2000) + return 0; + } + + /* check that the fields end with FF */ + if (cert[i] != 0xFF) + return 0; + + /* if there are fields present, assume the certificate is OK */ + if (i > 1) + return 1; + + /* no fields present -> this could be an incompletely-patched + certificate from an older version of TilEm; verify that the + next 4k bytes are truly empty */ + while (i < 0x1000) { + if (cert[i] != 0xFF) + return 0; + i++; + } + + return 1; +} + +void tilem_calc_fix_certificate(TilemCalc* calc, byte* cert, + int app_start, int app_end, + unsigned exptab_offset) +{ + int i, base, max_apps, page; + unsigned insttab_offset = 0x1fe0; + + /* If the ROM was dumped from an unpatched OS, the certificate + needs to be patched for some calculator functions to + work. */ + + /* First, check if the certificate is already valid */ + + if (cert[0x2000] == 0) + base = 0x2000; + else + base = 0; + + if (certificate_valid(cert + base)) { + return; + } + + tilem_message(calc, "Repairing certificate area..."); + + memset(cert, 0xff, 16384); + + cert[0] = 0; + + cert[insttab_offset] = 0xfe; + + if (app_start < app_end) + max_apps = app_end - app_start + 1; + else + max_apps = app_start - app_end + 1; + + for (i = 0; i < max_apps; i++) { + if (app_start < app_end) + page = app_start + i; + else + page = app_start - i; + + /* Clear installed bit / set expiration count for + existing apps. (If this incorrectly detects pages + that aren't really apps, don't worry about it; + better to err on the side of caution.) */ + if (calc->mem[page << 14] != 0x80 + || calc->mem[(page << 14) + 1] != 0x0f) + continue; + + tilem_message(calc, "Found application at page %02x (index %d)", + page, i); + + cert[insttab_offset + ((i + 1) / 8)] &= ~(1 << ((i + 1) % 8)); + + cert[exptab_offset + 2 * i] = 0x80; + cert[exptab_offset + 2 * i + 1] = 0x00; + } +} diff --git a/tool/tilem-src/emu/flash.c b/tool/tilem-src/emu/flash.c new file mode 100644 index 0000000..eefef6f --- /dev/null +++ b/tool/tilem-src/emu/flash.c @@ -0,0 +1,326 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2012 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include "tilem.h" + +#define FLASH_READ 0 +#define FLASH_AA 1 +#define FLASH_55 2 +#define FLASH_PROG 3 +#define FLASH_ERASE 4 +#define FLASH_ERAA 5 +#define FLASH_ER55 6 +#define FLASH_ERROR 7 +#define FLASH_FASTMODE 8 +#define FLASH_FASTPROG 9 +#define FLASH_FASTEXIT 10 + +#define FLASH_BUSY_PROGRAM 1 +#define FLASH_BUSY_ERASE_WAIT 2 +#define FLASH_BUSY_ERASE 3 + +/* Still to do: + - autoselect + - erase suspend + - fast program + - CFI + */ + +#define WARN(xxx) \ + tilem_warning(calc, "Flash error (" xxx ")") +#define WARN2(xxx, yyy, zzz) \ + tilem_warning(calc, "Flash error (" xxx ")", (yyy), (zzz)) + +void tilem_flash_reset(TilemCalc* calc) +{ + calc->flash.unlock = 0; + calc->flash.state = FLASH_READ; + calc->flash.busy = 0; +} + +void tilem_flash_delay_timer(TilemCalc* calc, void* data TILEM_ATTR_UNUSED) +{ + if (calc->flash.busy == FLASH_BUSY_ERASE_WAIT) { + calc->flash.busy = FLASH_BUSY_ERASE; + tilem_z80_set_timer(calc, TILEM_TIMER_FLASH_DELAY, + 200000, 0, 1); + } + else { + calc->flash.busy = 0; + } +} + +#ifdef DISABLE_FLASH_DELAY +# define set_busy(fl, bm, t) +#else +static inline void set_busy(TilemCalc* calc, int busymode, int time) +{ + if (!(calc->flash.emuflags & TILEM_FLASH_REQUIRE_DELAY)) + return; + + calc->flash.busy = busymode; + tilem_z80_set_timer(calc, TILEM_TIMER_FLASH_DELAY, + time, 0, 1); +} +#endif + +static inline void program_byte(TilemCalc* calc, dword a, byte v) +{ + calc->mem[a] &= v; + calc->flash.progaddr = a; + calc->flash.progbyte = v; + + if (calc->mem[a] != v) { + WARN2("bad program %02x over %02x", v, calc->mem[a]); + calc->flash.state = FLASH_ERROR; + } + else { + calc->flash.state = FLASH_READ; + } + + set_busy(calc, FLASH_BUSY_PROGRAM, 7); +} + +static inline void erase_sector(TilemCalc* calc, dword a, dword l) +{ + dword i; + + calc->flash.progaddr = a; + for (i = 0; i < l; i++) + calc->mem[a + i]=0xFF; + calc->flash.state = FLASH_READ; + + set_busy(calc, FLASH_BUSY_ERASE_WAIT, 50); +} + +static const TilemFlashSector* get_sector(TilemCalc* calc, dword pa) +{ + int i; + const TilemFlashSector* sec; + + for (i = 0; i < calc->hw.nflashsectors; i++) { + sec = &calc->hw.flashsectors[i]; + if (pa >= sec->start && pa < sec->start + sec->size) + return sec; + } + + return NULL; +} + +static int sector_writable(TilemCalc* calc, const TilemFlashSector* sec) +{ + return !(sec->protectgroup & ~calc->flash.overridegroup); +} + +byte tilem_flash_read_byte(TilemCalc* calc, dword pa) +{ + byte value; + + if (calc->flash.busy == FLASH_BUSY_PROGRAM) { + if (pa != calc->flash.progaddr) + WARN("reading from Flash while programming"); + value = (~calc->flash.progbyte & 0x80); + value |= calc->flash.toggles; + calc->flash.toggles ^= 0x40; + return (value); + } + else if (calc->flash.busy == FLASH_BUSY_ERASE) { + if ((pa >> 16) != (calc->flash.progaddr >> 16)) + WARN("reading from Flash while erasing"); + value = calc->flash.toggles | 0x08; + calc->flash.toggles ^= 0x44; + return (value); + } + else if (calc->flash.busy == FLASH_BUSY_ERASE_WAIT) { + if ((pa >> 16) != (calc->flash.progaddr >> 16)) + WARN("reading from Flash while erasing"); + value = calc->flash.toggles; + calc->flash.toggles ^= 0x44; + return (value); + } + + if (calc->flash.state == FLASH_ERROR) { + value = ((~calc->flash.progbyte & 0x80) | 0x20); + value |= calc->flash.toggles; + calc->flash.toggles ^= 0x40; + return (value); + } + else if (calc->flash.state == FLASH_FASTMODE) { + return (calc->mem[pa]); + } + else if (calc->flash.state == FLASH_READ) { + return (calc->mem[pa]); + } + else { + WARN("reading during program/erase sequence"); + calc->flash.state = FLASH_READ; + return (calc->mem[pa]); + } +} + +void tilem_flash_erase_address(TilemCalc* calc, dword pa) +{ + const TilemFlashSector* sec = get_sector(calc, pa); + + if (sector_writable(calc, sec)) { + tilem_message(calc, "Erasing Flash sector at %06x", pa); + erase_sector(calc, sec->start, sec->size); + } + else { + WARN("erasing protected sector"); + } +} + +void tilem_flash_write_byte(TilemCalc* calc, dword pa, byte v) +{ + int oldstate; + int i; + const TilemFlashSector* sec; + + if (!calc->flash.unlock) + return; + +#ifndef DISABLE_FLASH_DELAY + if (calc->flash.busy == FLASH_BUSY_PROGRAM + || calc->flash.busy == FLASH_BUSY_ERASE) + return; +#endif + + oldstate = calc->flash.state; + calc->flash.state = FLASH_READ; + + switch (oldstate) { + case FLASH_READ: + if (((pa&0xFFF) == 0xAAA) && (v == 0xAA)) + calc->flash.state = FLASH_AA; + return; + + case FLASH_AA: + if (((pa&0xFFF) == 0x555) && (v == 0x55)) + calc->flash.state = FLASH_55; + else if (v != 0xF0) { + WARN2("undefined command %02x->%06x after AA", v, pa); + } + return; + + case FLASH_55: + if ((pa&0xFFF) == 0xAAA) { + switch (v) { + case 0x10: + case 0x30: + WARN("attempt to erase without pre-erase"); + return; + case 0x20: + //WARN("entering fast mode"); + calc->flash.state = FLASH_FASTMODE; + return; + case 0x80: + calc->flash.state = FLASH_ERASE; + return; + case 0x90: + WARN("autoselect is not implemented"); + return; + case 0xA0: + calc->flash.state = FLASH_PROG; + return; + } + } + if (v != 0xF0) + WARN2("undefined command %02x->%06x after AA,55", v, pa); + return; + + case FLASH_PROG: + sec = get_sector(calc, pa); + if (!sector_writable(calc, sec)) + WARN("programming protected sector"); + else + program_byte(calc, pa, v); + return; + + case FLASH_FASTMODE: + //WARN2("fast mode cmd %02x->%06x", v, pa); + if ( v == 0x90 ) + calc->flash.state = FLASH_FASTEXIT; + else if ( v == 0xA0 ) + calc->flash.state = FLASH_FASTPROG; + else + // TODO : figure out whether mixing is allowed on real HW + WARN2("mixing fast programming with regular programming : %02x->%06x", v, pa); + return; + + case FLASH_FASTPROG: + //WARN2("fast prog %02x->%06x", v, pa); + sec = get_sector(calc, pa); + if (!sector_writable(calc, sec)) + WARN("programming protected sector"); + else + program_byte(calc, pa, v); + calc->flash.state = FLASH_FASTMODE; + return; + + case FLASH_FASTEXIT: + //WARN("leaving fast mode"); + if ( v != 0xF0 ) + { + WARN2("undefined command %02x->%06x after fast mode pre-exit 90", v, pa); + // TODO : figure out whether fast mode remains in such a case + calc->flash.state = FLASH_FASTMODE; + } + return; + + case FLASH_ERASE: + if (((pa&0xFFF) == 0xAAA) && (v == 0xAA)) + calc->flash.state = FLASH_ERAA; + else if (v != 0xF0) + WARN2("undefined command %02x->%06x after pre-erase", v, pa); + return; + + case FLASH_ERAA: + if (((pa&0xFFF) == 0x555) && (v == 0x55)) + calc->flash.state = FLASH_ER55; + else if (v != 0xF0) + WARN2("undefined command %02x->%06x after pre-erase AA", v, pa); + return; + + case FLASH_ER55: + if (((pa&0xFFF) == 0xAAA) && v==0x10) { + tilem_message(calc, "Erasing entire Flash chip"); + + for (i = 0; i < calc->hw.nflashsectors; i++) { + sec = &calc->hw.flashsectors[i]; + if (sector_writable(calc, sec)) + erase_sector(calc, sec->start, + sec->size); + } + } + else if (v == 0x30) { + tilem_flash_erase_address(calc, pa); + } + else if (v != 0xF0) + WARN2("undefined command %02x->%06x after pre-erase AA,55", v, pa); + return; + } +} diff --git a/tool/tilem-src/emu/graycolor.c b/tool/tilem-src/emu/graycolor.c new file mode 100644 index 0000000..5864c0b --- /dev/null +++ b/tool/tilem-src/emu/graycolor.c @@ -0,0 +1,90 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2010 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include "tilem.h" + +dword* tilem_color_palette_new(int rlight, int glight, int blight, + int rdark, int gdark, int bdark, + double gamma) +{ + dword* pal = tilem_new_atomic(dword, 256); + double r0, g0, b0, dr, dg, db; + double igamma = 1.0 / gamma; + double s = (1.0 / 255.0); + int r, g, b, i; + + r0 = pow(rlight * s, gamma); + g0 = pow(glight * s, gamma); + b0 = pow(blight * s, gamma); + dr = (pow(rdark * s, gamma) - r0) * s; + dg = (pow(gdark * s, gamma) - g0) * s; + db = (pow(bdark * s, gamma) - b0) * s; + + pal[0] = (rlight << 16) | (glight << 8) | blight; + + for (i = 1; i < 255; i++) { + r = pow(r0 + i * dr, igamma) * 255.0 + 0.5; + if (r < 0) r = 0; + if (r > 255) r = 255; + + g = pow(g0 + i * dg, igamma) * 255.0 + 0.5; + if (g < 0) g = 0; + if (g > 255) g = 255; + + b = pow(b0 + i * db, igamma) * 255.0 + 0.5; + if (b < 0) b = 0; + if (b > 255) b = 255; + + pal[i] = (r << 16) | (g << 8) | b; + } + + pal[255] = (rdark << 16) | (gdark << 8) | bdark; + + return pal; +} + +byte* tilem_color_palette_new_packed(int rlight, int glight, int blight, + int rdark, int gdark, int bdark, + double gamma) +{ + dword* palette; + byte* packed; + int i; + + palette = tilem_color_palette_new(rlight, glight, blight, + rdark, gdark, bdark, gamma); + + packed = tilem_new_atomic(byte, 256 * 3); + for (i = 0; i < 256; i++) { + packed[i * 3] = palette[i] >> 16; + packed[i * 3 + 1] = palette[i] >> 8; + packed[i * 3 + 2] = palette[i]; + } + + tilem_free(palette); + + return packed; +} diff --git a/tool/tilem-src/emu/grayimage.c b/tool/tilem-src/emu/grayimage.c new file mode 100644 index 0000000..46ee275 --- /dev/null +++ b/tool/tilem-src/emu/grayimage.c @@ -0,0 +1,324 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2010-2011 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include "tilem.h" + +/* Scale the input buffer, multiply by F * INCOUNT, and add to the + output buffer (which must be an exact multiple of the size of the + input buffer.) */ +static inline void add_scale1d_exact(const byte * restrict in, int incount, + unsigned int * restrict out, + int outcount, int f) +{ + int i, j; + + for (i = 0; i < incount; i++) { + for (j = 0; j < outcount / incount; j++) { + *out += *in * f * incount; + out++; + } + in++; + } +} + +/* Scale a 1-dimensional buffer, multiply by F * INCOUNT, and add to + the output buffer. */ +static inline void add_scale1d_smooth(const byte * restrict in, int incount, + unsigned int * restrict out, + int outcount, int f) +{ + int in_rem, out_rem; + unsigned int outv; + int i; + + in_rem = outcount; + out_rem = incount; + outv = 0; + i = outcount; + while (i > 0) { + if (in_rem < out_rem) { + out_rem -= in_rem; + outv += in_rem * *in * f; + in++; + in_rem = outcount; + } + else { + in_rem -= out_rem; + outv += out_rem * *in * f; + *out += outv; + outv = 0; + out++; + out_rem = incount; + i--; + } + } +} + +/* Scale a 2-dimensional buffer, multiply by INWIDTH * INHEIGHT, and + store in the output buffer. */ +static void scale2d_smooth(const byte * restrict in, + int inwidth, int inheight, int inrowstride, + unsigned int * restrict out, + int outwidth, int outheight, int outrowstride) +{ + int in_rem, out_rem; + int i; + + memset(out, 0, outrowstride * outheight * sizeof(int)); + + in_rem = outheight; + out_rem = inheight; + i = outheight; + while (i > 0) { + if (in_rem < out_rem) { + if (in_rem) { + if (outwidth % inwidth) + add_scale1d_smooth(in, inwidth, out, + outwidth, in_rem); + else + add_scale1d_exact(in, inwidth, out, + outwidth, in_rem); + } + out_rem -= in_rem; + in += inrowstride; + in_rem = outheight; + } + else { + in_rem -= out_rem; + if (outwidth % inwidth) + add_scale1d_smooth(in, inwidth, out, outwidth, + out_rem); + else + add_scale1d_exact(in, inwidth, out, outwidth, + out_rem); + out += outrowstride; + out_rem = inheight; + i--; + } + } +} + +/* Quickly scale a 1-dimensional buffer and store in the output + buffer. */ +static inline void scale1d_fast(const byte * restrict in, int incount, + byte * restrict out, int outcount) +{ + int i, e; + + e = outcount - incount / 2; + i = outcount; + while (i > 0) { + if (e >= 0) { + *out = *in; + out++; + e -= incount; + i--; + } + else { + e += outcount; + in++; + } + } +} + +/* Quickly scale a 2-dimensional buffer and store in the output + buffer. */ +static void scale2d_fast(const byte * restrict in, + int inwidth, int inheight, int inrowstride, + byte * restrict out, + int outwidth, int outheight, int outrowstride) +{ + int i, e; + + e = outheight - inheight / 2; + i = outheight; + while (i > 0) { + if (e >= 0) { + scale1d_fast(in, inwidth, out, outwidth); + out += outrowstride; + e -= inheight; + i--; + } + else { + e += outheight; + in += inrowstride; + } + } +} + +/* Determine range of linear pixel values corresponding to a given + contrast level. */ +static void get_contrast_settings(unsigned int contrast, + int *cbase, int *cfact) +{ + if (contrast < 32) { + *cbase = 0; + *cfact = contrast * 8; + } + else { + *cbase = (contrast - 32) * 8; + *cfact = 255 - *cbase; + } +} + +#define GETSCALEBUF(ttt, www, hhh) \ + ((ttt *) alloc_scalebuf(buf, (www) * (hhh) * sizeof(ttt))) + +static void* alloc_scalebuf(TilemLCDBuffer *buf, unsigned int size) +{ + if (TILEM_UNLIKELY(size > buf->tmpbufsize)) { + buf->tmpbufsize = size; + tilem_free(buf->tmpbuf); + buf->tmpbuf = tilem_malloc_atomic(size); + } + + return buf->tmpbuf; +} + +void tilem_draw_lcd_image_indexed(TilemLCDBuffer * restrict buf, + byte * restrict buffer, + int imgwidth, int imgheight, + int rowstride, int scaletype) +{ + int dwidth = buf->width; + int dheight = buf->height; + int i, j, v; + unsigned int * restrict ibuf; + int cbase, cfact; + byte cindex[129]; + + if (dwidth == 0 || dheight == 0 || buf->contrast == 0) { + for (i = 0; i < imgheight; i++) { + for (j = 0; j < imgwidth; j++) + buffer[j] = 0; + buffer += rowstride; + } + return; + } + + get_contrast_settings(buf->contrast, &cbase, &cfact); + + for (i = 0; i <= 128; i++) + cindex[i] = ((i * cfact) >> 7) + cbase; + + if (scaletype == TILEM_SCALE_FAST + || (imgwidth % dwidth == 0 && imgheight % dheight == 0)) { + scale2d_fast(buf->data, dwidth, dheight, buf->rowstride, + buffer, imgwidth, imgheight, rowstride); + + for (i = 0; i < imgwidth * imgheight; i++) + buffer[i] = cindex[buffer[i]]; + } + else { + ibuf = GETSCALEBUF(unsigned int, imgwidth, imgheight); + + scale2d_smooth(buf->data, dwidth, dheight, buf->rowstride, + ibuf, imgwidth, imgheight, imgwidth); + + for (i = 0; i < imgheight; i++) { + for (j = 0; j < imgwidth; j++) { + v = ibuf[j] / (dwidth * dheight); + buffer[j] = cindex[v]; + } + ibuf += imgwidth; + buffer += rowstride; + } + } +} + +void tilem_draw_lcd_image_rgb(TilemLCDBuffer * restrict buf, + byte * restrict buffer, + int imgwidth, int imgheight, int rowstride, + int pixbytes, const dword * restrict palette, + int scaletype) +{ + int dwidth = buf->width; + int dheight = buf->height; + int i, j, v; + int padbytes = rowstride - (imgwidth * pixbytes); + byte * restrict bbuf; + unsigned int * restrict ibuf; + int cbase, cfact; + dword cpalette[129]; + + if (dwidth == 0 || dheight == 0 || buf->contrast == 0) { + for (i = 0; i < imgheight; i++) { + for (j = 0; j < imgwidth; j++) { + buffer[0] = palette[0] >> 16; + buffer[1] = palette[0] >> 8; + buffer[2] = palette[0]; + buffer += pixbytes; + } + buffer += padbytes; + } + return; + } + + get_contrast_settings(buf->contrast, &cbase, &cfact); + + for (i = 0; i <= 128; i++) { + v = ((i * cfact) >> 7) + cbase; + cpalette[i] = palette[v]; + } + + if (scaletype == TILEM_SCALE_FAST + || (imgwidth % dwidth == 0 && imgheight % dheight == 0)) { + bbuf = GETSCALEBUF(byte, imgwidth, imgheight); + + scale2d_fast(buf->data, dwidth, dheight, buf->rowstride, + bbuf, imgwidth, imgheight, imgwidth); + + for (i = 0; i < imgheight; i++) { + for (j = 0; j < imgwidth; j++) { + v = bbuf[j]; + buffer[0] = cpalette[v] >> 16; + buffer[1] = cpalette[v] >> 8; + buffer[2] = cpalette[v]; + buffer += pixbytes; + } + bbuf += imgwidth; + buffer += padbytes; + } + } + else { + ibuf = GETSCALEBUF(unsigned int, imgwidth, imgheight); + + scale2d_smooth(buf->data, dwidth, dheight, buf->rowstride, + ibuf, imgwidth, imgheight, imgwidth); + + for (i = 0; i < imgheight; i++) { + for (j = 0; j < imgwidth; j++) { + v = (ibuf[j] / (dwidth * dheight)); + buffer[0] = cpalette[v] >> 16; + buffer[1] = cpalette[v] >> 8; + buffer[2] = cpalette[v]; + buffer += pixbytes; + } + ibuf += imgwidth; + buffer += padbytes; + } + } +} diff --git a/tool/tilem-src/emu/graylcd.c b/tool/tilem-src/emu/graylcd.c new file mode 100644 index 0000000..d27ddcc --- /dev/null +++ b/tool/tilem-src/emu/graylcd.c @@ -0,0 +1,263 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2010-2011 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include "tilem.h" +#include "graylcd.h" + +/* Read screen contents and update pixels that have changed */ +static void tmr_screen_update(TilemCalc *calc, void *data) +{ + TilemGrayLCD *glcd = data; + byte *np, *op, nb, ob, d; + int i, j, n; + dword delta; + + glcd->t++; + + if (calc->z80.lastlcdwrite == glcd->lcdupdatetime) + return; + glcd->lcdupdatetime = calc->z80.lastlcdwrite; + + (*calc->hw.get_lcd)(calc, glcd->newbits); + + np = glcd->newbits; + op = glcd->oldbits; + glcd->oldbits = np; + glcd->newbits = op; + n = 0; + + for (i = 0; i < glcd->bwidth * glcd->height; i++) { + nb = *np; + ob = *op; + d = nb ^ ob; + for (j = 0; j < 8; j++) { + if (d & (0x80 >> j)) { + delta = glcd->t - glcd->tchange[n]; + glcd->tchange[n] = glcd->t; + + if (ob & (0x80 >> j)) { + glcd->curpixels[n].ndark += delta; + glcd->curpixels[n].ndarkseg++; + } + else { + glcd->curpixels[n].nlight += delta; + glcd->curpixels[n].nlightseg++; + } + } + n++; + } + + np++; + op++; + } +} + +TilemGrayLCD* tilem_gray_lcd_new(TilemCalc *calc, int windowsize, int sampleint) +{ + TilemGrayLCD *glcd = tilem_new(TilemGrayLCD, 1); + int nbytes, npixels, i; + + glcd->bwidth = (calc->hw.lcdwidth + 7) / 8; + glcd->height = calc->hw.lcdheight; + nbytes = glcd->bwidth * glcd->height; + npixels = nbytes * 8; + + glcd->oldbits = tilem_new_atomic(byte, nbytes); + glcd->newbits = tilem_new_atomic(byte, nbytes); + glcd->tchange = tilem_new_atomic(dword, npixels); + glcd->tframestart = tilem_new_atomic(dword, windowsize); + glcd->framestamp = tilem_new_atomic(dword, windowsize); + glcd->curpixels = tilem_new_atomic(TilemGrayLCDPixel, npixels); + glcd->framebasepixels = tilem_new_atomic(TilemGrayLCDPixel, + npixels * windowsize); + + memset(glcd->oldbits, 0, nbytes); + memset(glcd->tchange, 0, npixels * sizeof(dword)); + memset(glcd->tframestart, 0, windowsize * sizeof(dword)); + memset(glcd->curpixels, 0, npixels * sizeof(TilemGrayLCDPixel)); + memset(glcd->framebasepixels, 0, (npixels * windowsize + * sizeof(TilemGrayLCDPixel))); + + glcd->calc = calc; + glcd->timer_id = tilem_z80_add_timer(calc, sampleint / 2, sampleint, 1, + &tmr_screen_update, glcd); + + /* assign arbitrary but unique timestamps to the initial n + frames */ + for (i = 0; i < windowsize; i++) + glcd->framestamp[i] = calc->z80.lastlcdwrite - i; + + glcd->lcdupdatetime = calc->z80.lastlcdwrite - 1; + glcd->t = 0; + glcd->windowsize = windowsize; + glcd->sampleint = sampleint; + glcd->framenum = 0; + + return glcd; +} + +void tilem_gray_lcd_free(TilemGrayLCD *glcd) +{ + tilem_z80_remove_timer(glcd->calc, glcd->timer_id); + + tilem_free(glcd->oldbits); + tilem_free(glcd->newbits); + tilem_free(glcd->tchange); + tilem_free(glcd->tframestart); + tilem_free(glcd->framestamp); + tilem_free(glcd->curpixels); + tilem_free(glcd->framebasepixels); + tilem_free(glcd); +} + +/* Update levelbuf with values based on the accumulated grayscale + data */ +void tilem_gray_lcd_get_frame(TilemGrayLCD * restrict glcd, + TilemLCDBuffer * restrict buf) +{ + int i, j, n; + unsigned int current, delta, fd, fl; + word ndark, nlight, ndarkseg, nlightseg; + dword tbase, tlimit; + dword lastwrite; + byte * restrict bp; + byte * restrict op; + TilemGrayLCDPixel * restrict pix; + TilemGrayLCDPixel * restrict basepix; + dword * restrict tchange; + + if (TILEM_UNLIKELY(buf->height != glcd->height + || buf->rowstride != glcd->bwidth * 8)) { + /* reallocate data buffer */ + tilem_free(buf->data); + buf->data = tilem_new_atomic(byte, + glcd->height * glcd->bwidth * 8); + buf->rowstride = glcd->bwidth * 8; + buf->height = glcd->height; + } + + buf->width = glcd->calc->hw.lcdwidth; + + if (!glcd->calc->lcd.active + || (glcd->calc->z80.halted && !glcd->calc->poweronhalt)) { + /* screen is turned off */ + buf->stamp = glcd->calc->z80.lastlcdwrite; + buf->contrast = 0; + return; + } + + buf->contrast = glcd->calc->lcd.contrast; + + /* If LCD remains unchanged throughout the window, set + timestamp to the time when the LCD was last changed, so + that consecutive frames have the same timestamp. If LCD + has changed during the window, values of gray pixels will + vary from one frame to another, so use a unique timestamp + for each frame */ + lastwrite = glcd->calc->z80.lastlcdwrite; + if (glcd->framestamp[glcd->framenum] == lastwrite) + buf->stamp = lastwrite; + else + buf->stamp = glcd->calc->z80.clock + 0x80000000; + glcd->framestamp[glcd->framenum] = lastwrite; + + /* set tbase to the sample number where the window began; this + is used to limit the weight of unchanging pixels */ + tbase = glcd->tframestart[glcd->framenum]; + glcd->tframestart[glcd->framenum] = glcd->t; + tlimit = glcd->t - tbase; /* number of samples per window */ + + bp = glcd->newbits; + op = buf->data; + pix = glcd->curpixels; + basepix = glcd->framebasepixels + (glcd->framenum * glcd->height + * glcd->bwidth * 8); + tchange = glcd->tchange; + + (*glcd->calc->hw.get_lcd)(glcd->calc, bp); + + n = 0; + + for (i = 0; i < glcd->bwidth * glcd->height; i++) { + for (j = 0; j < 8; j++) { + /* check if pixel is currently set */ + current = *bp & (0x80 >> j); + + /* compute number of dark and light samples + within the window */ + ndark = pix[n].ndark - basepix[n].ndark; + nlight = pix[n].nlight - basepix[n].nlight; + + /* compute number of dark and light segments + within the window */ + ndarkseg = pix[n].ndarkseg - basepix[n].ndarkseg; + nlightseg = pix[n].nlightseg - basepix[n].nlightseg; + + /* average light segment in this window is + (nlight / nlightseg); average dark segment + is (ndark / ndarkseg) */ + + /* ensure tchange is later than or equal to tbase */ + if (tchange[n] - tbase > tlimit) { + tchange[n] = tbase; + } + + /* if current segment is longer than average, + count it as well */ + delta = glcd->t - tchange[n]; + + if (current) { + if (delta * ndarkseg >= ndark) { + ndark += delta; + ndarkseg++; + } + } + else { + if (delta * nlightseg >= nlight) { + nlight += delta; + nlightseg++; + } + } + + fd = ndark * nlightseg; + fl = nlight * ndarkseg; + + if (fd + fl == 0) + *op = (ndark ? 128 : 0); + else + *op = ((fd * 128) / (fd + fl)); + + n++; + op++; + } + bp++; + } + + memcpy(basepix, pix, (glcd->height * glcd->bwidth * 8 + * sizeof(TilemGrayLCDPixel))); + + glcd->framenum = (glcd->framenum + 1) % glcd->windowsize; +} diff --git a/tool/tilem-src/emu/graylcd.h b/tool/tilem-src/emu/graylcd.h new file mode 100644 index 0000000..dbbf8da --- /dev/null +++ b/tool/tilem-src/emu/graylcd.h @@ -0,0 +1,57 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2010-2011 Benjamin Moody + * + * 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, see + * . + */ + +#ifndef _TILEM_GRAYLCD_H +#define _TILEM_GRAYLCD_H + +typedef struct _TilemGrayLCDPixel { + word ndark; /* Sum of lengths of dark intervals */ + word nlight; /* Sum of lengths of light intervals */ + word ndarkseg; /* Number of dark intervals */ + word nlightseg; /* Number of light intervals */ +} TilemGrayLCDPixel; + +struct _TilemGrayLCD { + TilemCalc *calc; /* Calculator */ + int timer_id; /* Screen update timer */ + dword lcdupdatetime; /* CPU time of last known LCD update */ + + dword t; /* Time counter */ + int windowsize; /* Number of frames in the sampling + window */ + int framenum; /* Current frame number */ + int sampleint; /* Microseconds per sample */ + + int bwidth; /* Width of LCD, bytes */ + int height; /* Height of LCD, pixels */ + byte *oldbits; /* Original pixel values (current buffer) */ + byte *newbits; /* Original pixel values (alternate buffer) */ + + dword *tchange; /* Time when pixels changed */ + dword *tframestart; /* Time at start of frame */ + dword *framestamp; /* LCD update time at start of frame */ + + TilemGrayLCDPixel *curpixels; /* Current pixel counters */ + TilemGrayLCDPixel *framebasepixels; /* Pixel counters as of + the start of each + frame */ +}; + +#endif diff --git a/tool/tilem-src/emu/keypad.c b/tool/tilem-src/emu/keypad.c new file mode 100644 index 0000000..37953e7 --- /dev/null +++ b/tool/tilem-src/emu/keypad.c @@ -0,0 +1,91 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include "tilem.h" +#include "scancodes.h" + +void tilem_keypad_reset(TilemCalc* calc) +{ + int i; + + calc->keypad.group = 0xff; + calc->keypad.onkeydown = 0; + calc->keypad.onkeyint = 0; + for (i = 0; i < 8; i++) + calc->keypad.keysdown[i] = 0; +} + +void tilem_keypad_set_group(TilemCalc* calc, byte group) +{ + calc->keypad.group = group; +} + +byte tilem_keypad_read_keys(TilemCalc* calc) +{ + int i; + byte keys, old; + + keys = 0; + for (i = 0; i < 8; i++) { + if (!(calc->keypad.group & (1 << i))) + keys |= calc->keypad.keysdown[i]; + } + + do { + old = keys; + for (i = 0; i < 8; i++) { + if (keys & calc->keypad.keysdown[i]) + keys |= calc->keypad.keysdown[i]; + } + } while (keys != old); + + return ~keys; +} + +void tilem_keypad_press_key(TilemCalc* calc, int scancode) +{ + if (scancode == TILEM_KEY_ON) { + if (!calc->keypad.onkeydown && calc->keypad.onkeyint) + calc->z80.interrupts |= TILEM_INTERRUPT_ON_KEY; + calc->keypad.onkeydown = 1; + } + else if (scancode > 0 && scancode < 65) { + scancode--; + calc->keypad.keysdown[scancode / 8] |= (1 << (scancode % 8)); + } +} + +void tilem_keypad_release_key(TilemCalc* calc, int scancode) +{ + if (scancode == TILEM_KEY_ON) { + if (calc->keypad.onkeydown && calc->keypad.onkeyint) + calc->z80.interrupts |= TILEM_INTERRUPT_ON_KEY; + calc->keypad.onkeydown = 0; + } + else if (scancode > 0 && scancode < 65) { + scancode--; + calc->keypad.keysdown[scancode / 8] &= ~(1 << (scancode % 8)); + } +} diff --git a/tool/tilem-src/emu/lcd.c b/tool/tilem-src/emu/lcd.c new file mode 100644 index 0000000..1820805 --- /dev/null +++ b/tool/tilem-src/emu/lcd.c @@ -0,0 +1,268 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include "tilem.h" + +#ifdef DISABLE_LCD_DRIVER_DELAY +# define BUSY 0 +# define SET_BUSY 0 +#else +# define BUSY check_delay_timer(calc) +# define SET_BUSY set_delay_timer(calc) + +static inline int check_delay_timer(TilemCalc* calc) +{ + int t; + + if (!calc->lcd.busy) + return 0; + + t = tilem_z80_get_timer_clocks(calc, TILEM_TIMER_LCD_DELAY); + return (t > 0); +} + +static inline void set_delay_timer(TilemCalc* calc) +{ + int delay; + + if (!(calc->lcd.emuflags & TILEM_LCD_REQUIRE_DELAY)) + return; + + if (calc->lcd.emuflags & TILEM_LCD_REQUIRE_LONG_DELAY) + delay = 70; + else + delay = 50; + + calc->lcd.busy = 1; + + tilem_z80_set_timer(calc, TILEM_TIMER_LCD_DELAY, delay, 0, 0); +} +#endif + +void tilem_lcd_reset(TilemCalc* calc) +{ + calc->lcd.active = 0; + calc->lcd.contrast = 32; + calc->lcd.addr = 0; + calc->lcd.mode = 1; + calc->lcd.nextbyte = 0; + calc->lcd.x = calc->lcd.y = 0; + calc->lcd.inc = 7; + calc->lcd.rowshift = 0; + calc->lcd.busy = 0; + + if (calc->hw.lcdmemsize) + calc->lcd.rowstride = (calc->hw.lcdmemsize + / calc->hw.lcdheight); + else + calc->lcd.rowstride = (calc->hw.lcdwidth / 8); +} + +void tilem_lcd_delay_timer(TilemCalc* calc, void* data TILEM_ATTR_UNUSED) +{ + calc->lcd.busy = 0; +} + +byte tilem_lcd_t6a04_status(TilemCalc* calc) +{ + return (calc->lcd.busy << 7 + | calc->lcd.mode << 6 + | calc->lcd.active << 5 + | (calc->lcd.inc & 3)); +} + +void tilem_lcd_t6a04_control(TilemCalc* calc, byte val) +{ + if (BUSY) return; + + if (val <= 1) { + calc->lcd.mode = val; + + } else if (val == 2) { + calc->lcd.active = 0; + + } else if (val == 3) { + calc->lcd.active = 1; + + } else if (val <= 7) { + calc->lcd.inc = val; + + } else if ((val >= 0x20) && (val <= 0x3F)){ + calc->lcd.x = val - 0x20; + + } else if ((val >= 0x80) && (val <= 0xBF)) { + calc->lcd.y = val - 0x80; + + } else if ((val >= 0x40) && (val <= 0x7F)) { + calc->lcd.rowshift = val - 0x40; + + } else if (val >= 0xc0) { + calc->lcd.contrast = val - 0xc0; + + } + + calc->z80.lastlcdwrite = calc->z80.clock; + SET_BUSY; +} + + +byte tilem_lcd_t6a04_read(TilemCalc* calc) +{ + byte retv = calc->lcd.nextbyte; + byte* lcdbuf = calc->lcdmem; + int stride = calc->lcd.rowstride; + int xlimit; + + if (BUSY) return(0); + + if (calc->lcd.mode) + xlimit = stride; + else + xlimit = (stride * 8 + 5) / 6; + + if (calc->lcd.x >= xlimit) + calc->lcd.x = 0; + else if (calc->lcd.x < 0) + calc->lcd.x = xlimit - 1; + + if (calc->lcd.y >= 0x40) + calc->lcd.y = 0; + else if (calc->lcd.y < 0) + calc->lcd.y = 0x3F; + + if (calc->lcd.mode) { + calc->lcd.nextbyte = *(lcdbuf + calc->lcd.x + stride * calc->lcd.y); + + } else { + int col = 0x06 * calc->lcd.x; + int ofs = calc->lcd.y * stride + (col >> 3); + int shift = 0x0A - (col & 0x07); + + calc->lcd.nextbyte = ((*(lcdbuf + ofs) << 8) | *(lcdbuf + ofs + 1)) >> shift; + } + + switch (calc->lcd.inc) { + case 4: calc->lcd.y--; break; + case 5: calc->lcd.y++; break; + case 6: calc->lcd.x--; break; + case 7: calc->lcd.x++; break; + } + + SET_BUSY; + return(retv); +} + + +void tilem_lcd_t6a04_write(TilemCalc* calc, byte sprite) +{ + byte* lcdbuf = calc->lcdmem; + int stride = calc->lcd.rowstride; + int xlimit; + + if (BUSY) return; + + if (calc->lcd.mode) + xlimit = stride; + else + xlimit = (stride * 8 + 5) / 6; + + if (calc->lcd.x >= xlimit) + calc->lcd.x = 0; + else if (calc->lcd.x < 0) + calc->lcd.x = xlimit - 1; + + if (calc->lcd.y >= 0x40) + calc->lcd.y = 0; + else if (calc->lcd.y < 0) + calc->lcd.y = 0x3F; + + if (calc->lcd.mode) { + *(lcdbuf + calc->lcd.x + stride * calc->lcd.y) = sprite; + + } else { + int col = 0x06 * calc->lcd.x; + int ofs = calc->lcd.y * stride + (col >> 3); + int shift = col & 0x07; + int mask; + + sprite <<= 2; + mask = ~(0xFC >> shift); + *(lcdbuf + ofs) = (*(lcdbuf + ofs) & mask) | (sprite >> shift); + if (shift > 2 && (col >> 3) < (stride - 1)) { + ofs++; + shift = 8 - shift; + mask = ~(0xFC << shift); + *(lcdbuf + ofs) = (*(lcdbuf + ofs) & mask) | (sprite << shift); + } + } + + switch (calc->lcd.inc) { + case 4: calc->lcd.y--; break; + case 5: calc->lcd.y++; break; + case 6: calc->lcd.x--; break; + case 7: calc->lcd.x++; break; + } + + calc->z80.lastlcdwrite = calc->z80.clock; + SET_BUSY; + return; +} + + +void tilem_lcd_t6a04_get_data(TilemCalc* calc, byte* data) +{ + int width = calc->hw.lcdwidth / 8; + byte* lcdbuf = calc->lcdmem; + int stride = calc->lcd.rowstride; + int i, j, k; + + for (i = 0; i < calc->hw.lcdheight; i++) { + j = (i + calc->lcd.rowshift) % 64; + for (k = 0; k < width; k++) + data[k] = lcdbuf[j * stride + k]; + data += width; + } +} + +void tilem_lcd_t6a43_get_data(TilemCalc* calc, byte* data) +{ + int width = calc->hw.lcdwidth / 8; + byte* lcdbuf = calc->ram + calc->lcd.addr; + int stride = calc->lcd.rowstride; + int i, j; + + for (i = 0; i < calc->hw.lcdheight; i++) { + for (j = 0; j < 10; j++) + data[j] = lcdbuf[j]; + for (; j < 10 + width - stride; j++) + data[j] = 0; + for (; j < width; j++) + data[j] = lcdbuf[j + stride - width]; + + data += width; + lcdbuf += stride; + } +} diff --git a/tool/tilem-src/emu/link.c b/tool/tilem-src/emu/link.c new file mode 100644 index 0000000..0bd5ca9 --- /dev/null +++ b/tool/tilem-src/emu/link.c @@ -0,0 +1,456 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include "tilem.h" + +/* Internal link port control */ + +static inline void dbus_interrupt(TilemCalc* calc, dword inttype, + dword mask) +{ + if (!(calc->linkport.mode & mask)) + return; + + calc->z80.interrupts |= inttype; +} + +static inline void dbus_set_lines(TilemCalc* calc, byte lines) +{ + if (lines != calc->linkport.lines) { + calc->linkport.lines = lines; + if (calc->linkport.linkemu == TILEM_LINK_EMULATOR_BLACK) { + tilem_z80_stop(calc, TILEM_STOP_LINK_STATE); + } + } +} + +static inline void dbus_set_extlines(TilemCalc* calc, byte lines) +{ + if ((lines ^ calc->linkport.extlines) & ~calc->linkport.lines) { + dbus_interrupt(calc, TILEM_INTERRUPT_LINK_ACTIVE, + TILEM_LINK_MODE_INT_ON_ACTIVE); + } + calc->linkport.extlines = lines; +} + +void tilem_linkport_assist_timer(TilemCalc* calc, + void* data TILEM_ATTR_UNUSED) +{ + TilemLinkport* lp = &calc->linkport; + + if (lp->assistflags & TILEM_LINK_ASSIST_WRITE_BUSY) { + lp->assistflags &= ~TILEM_LINK_ASSIST_WRITE_BUSY; + lp->assistflags |= TILEM_LINK_ASSIST_WRITE_ERROR; + } + else if (lp->assistflags & TILEM_LINK_ASSIST_READ_BUSY) { + lp->assistflags &= ~TILEM_LINK_ASSIST_READ_BUSY; + lp->assistflags |= TILEM_LINK_ASSIST_READ_ERROR; + } + else + return; + + dbus_interrupt(calc, TILEM_INTERRUPT_LINK_ERROR, + TILEM_LINK_MODE_INT_ON_ERROR); +} + +static inline void assist_set_timeout(TilemCalc* calc) +{ + if (calc->linkport.mode & TILEM_LINK_MODE_NO_TIMEOUT) + return; + + tilem_z80_set_timer(calc, TILEM_TIMER_LINK_ASSIST, 2000000, 0, 1); +} + +static inline void assist_clear_timeout(TilemCalc* calc) +{ + tilem_z80_set_timer(calc, TILEM_TIMER_LINK_ASSIST, 0, 0, 0); +} + +static void assist_update_write(TilemCalc* calc) +{ + switch (calc->linkport.extlines) { + case 0: + if (calc->linkport.lines == 0 && calc->linkport.assistoutbits > 0) { + /* Ready to send next bit */ + if (calc->linkport.assistout & 1) + dbus_set_lines(calc, 2); + else + dbus_set_lines(calc, 1); + calc->linkport.assistout >>= 1; + calc->linkport.assistoutbits--; + assist_set_timeout(calc); /* other device must + respond within 2 + seconds */ + } + else if (calc->linkport.lines == 0) { + /* Finished sending a byte */ + calc->linkport.assistflags &= ~TILEM_LINK_ASSIST_WRITE_BUSY; + assist_clear_timeout(calc); + } + break; + + case 1: + case 2: + if (calc->linkport.extlines == (calc->linkport.lines ^ 3)) { + /* Other device acknowledged our bit. Note + that the timeout is NOT set at this point. + My experiments indicate that the assist + will wait, apparently indefinitely, for the + other device to bring its lines high. */ + dbus_set_lines(calc, 0); + assist_clear_timeout(calc); + } + break; + + case 3: + /* illegal line state; flag error */ + calc->linkport.assistflags &= ~TILEM_LINK_ASSIST_WRITE_BUSY; + calc->linkport.assistflags |= TILEM_LINK_ASSIST_WRITE_ERROR; + dbus_set_lines(calc, 0); + assist_clear_timeout(calc); + dbus_interrupt(calc, TILEM_INTERRUPT_LINK_ERROR, + TILEM_LINK_MODE_INT_ON_ERROR); + break; + } +} + +static void assist_update_read(TilemCalc* calc) +{ + switch (calc->linkport.extlines) { + case 0: + /* Finished receiving a bit */ + if (calc->linkport.lines == 1) { + calc->linkport.assistin >>= 1; + calc->linkport.assistin |= 0x80; + calc->linkport.assistinbits++; + } + else if (calc->linkport.lines == 2) { + calc->linkport.assistin >>= 1; + calc->linkport.assistinbits++; + } + + if (calc->linkport.assistinbits >= 8) { + /* finished receiving a byte */ + calc->linkport.assistlastbyte = calc->linkport.assistin; + calc->linkport.assistflags &= ~TILEM_LINK_ASSIST_READ_BUSY; + calc->linkport.assistflags |= TILEM_LINK_ASSIST_READ_BYTE; + assist_clear_timeout(calc); + } + else { + assist_set_timeout(calc); /* other device must + send next bit + within 2 + seconds */ + } + + dbus_set_lines(calc, 0); /* indicate we're ready to + receive */ + break; + + case 1: + /* other device sent a zero; acknowledge it */ + calc->linkport.assistflags |= TILEM_LINK_ASSIST_READ_BUSY; + dbus_set_lines(calc, 2); + assist_set_timeout(calc); /* other device must bring + both lines high again + within 2 seconds */ + break; + + case 2: + /* same as above, but other device sent a one */ + calc->linkport.assistflags |= TILEM_LINK_ASSIST_READ_BUSY; + dbus_set_lines(calc, 1); + assist_set_timeout(calc); /* other device must bring + both lines high again + within 2 seconds */ + break; + + case 3: + /* illegal line state; flag error */ + calc->linkport.assistflags &= ~TILEM_LINK_ASSIST_READ_BUSY; + calc->linkport.assistflags |= TILEM_LINK_ASSIST_READ_ERROR; + dbus_set_lines(calc, 0); + assist_clear_timeout(calc); + dbus_interrupt(calc, TILEM_INTERRUPT_LINK_ERROR, + TILEM_LINK_MODE_INT_ON_ERROR); + break; + } +} + +static void graylink_update_write(TilemCalc* calc) +{ + switch (calc->linkport.lines) { + case 0: + if (calc->linkport.extlines == 0 && calc->linkport.graylinkoutbits > 1) { + /* Ready to send next bit */ + if (calc->linkport.graylinkout & 1) + dbus_set_extlines(calc, 2); + else + dbus_set_extlines(calc, 1); + calc->linkport.graylinkout >>= 1; + calc->linkport.graylinkoutbits--; + } + else if (calc->linkport.extlines == 0) { + /* Finished sending a byte */ + calc->linkport.graylinkoutbits = 0; + tilem_z80_stop(calc, TILEM_STOP_LINK_WRITE_BYTE); + } + break; + + case 1: + case 2: + if (calc->linkport.extlines == (calc->linkport.lines ^ 3)) + /* Other device acknowledged our bit */ + dbus_set_extlines(calc, 0); + break; + + case 3: + /* illegal line state; flag error */ + dbus_set_extlines(calc, 0); + calc->linkport.graylinkoutbits = 0; + tilem_z80_stop(calc, TILEM_STOP_LINK_ERROR); + break; + } +} + +static void graylink_update_read(TilemCalc* calc) +{ + switch (calc->linkport.lines) { + case 0: + /* Finished receiving a bit */ + if (calc->linkport.extlines == 1) { + calc->linkport.graylinkin >>= 1; + calc->linkport.graylinkin |= 0x80; + calc->linkport.graylinkinbits++; + } + else if (calc->linkport.extlines == 2) { + calc->linkport.graylinkin >>= 1; + calc->linkport.graylinkinbits++; + } + + if (calc->linkport.graylinkinbits >= 8) { + /* finished receiving a byte */ + tilem_z80_stop(calc, TILEM_STOP_LINK_READ_BYTE); + } + + dbus_set_extlines(calc, 0); + break; + + case 1: + /* other device sent a zero; acknowledge it */ + dbus_set_extlines(calc, 2); + break; + + case 2: + /* same as above, but other device sent a one */ + dbus_set_extlines(calc, 1); + break; + + case 3: + /* illegal line state; flag error */ + dbus_set_extlines(calc, 0); + calc->linkport.graylinkinbits = 0; + tilem_z80_stop(calc, TILEM_STOP_LINK_ERROR); + break; + } +} + +static void dbus_update(TilemCalc* calc) +{ + byte oldlines; + + do { + if (calc->linkport.linkemu == TILEM_LINK_EMULATOR_GRAY) { + if (calc->linkport.graylinkoutbits) { + graylink_update_write(calc); + } + else if (calc->linkport.graylinkinbits != 8) { + graylink_update_read(calc); + } + } + + oldlines = calc->linkport.lines; + if (calc->linkport.assistflags & TILEM_LINK_ASSIST_WRITE_BUSY) { + assist_update_write(calc); + } + else if (calc->linkport.mode & TILEM_LINK_MODE_ASSIST + && !(calc->linkport.assistflags & TILEM_LINK_ASSIST_READ_BYTE)) { + assist_update_read(calc); + } + } while (oldlines != calc->linkport.lines); + + if ((calc->linkport.assistflags & TILEM_LINK_ASSIST_READ_BYTE) + && (calc->linkport.mode & TILEM_LINK_MODE_INT_ON_READ)) + calc->z80.interrupts |= TILEM_INTERRUPT_LINK_READ; + else + calc->z80.interrupts &= ~TILEM_INTERRUPT_LINK_READ; + + if (!(calc->linkport.assistflags & (TILEM_LINK_ASSIST_READ_BUSY + | TILEM_LINK_ASSIST_WRITE_BUSY)) + && (calc->linkport.mode & TILEM_LINK_MODE_INT_ON_IDLE)) + calc->z80.interrupts |= TILEM_INTERRUPT_LINK_IDLE; + else + calc->z80.interrupts &= ~TILEM_INTERRUPT_LINK_IDLE; +} + +void tilem_linkport_reset(TilemCalc* calc) +{ + dbus_set_lines(calc, 0); + assist_clear_timeout(calc); + calc->linkport.mode = 0; + calc->linkport.assistflags = 0; + calc->linkport.assistin = 0; + calc->linkport.assistinbits = 0; + calc->linkport.assistout = 0; + calc->linkport.assistoutbits = 0; + calc->linkport.assistlastbyte = 0; +} + +byte tilem_linkport_get_lines(TilemCalc* calc) +{ + //dbus_update(calc); + return (~calc->linkport.lines & ~calc->linkport.extlines & 3); +} + +void tilem_linkport_set_lines(TilemCalc* calc, byte lines) +{ + if (!(calc->linkport.mode & TILEM_LINK_MODE_ASSIST) + && !(calc->linkport.assistflags & TILEM_LINK_ASSIST_WRITE_BUSY)) + dbus_set_lines(calc, lines & 3); + + dbus_update(calc); +} + +byte tilem_linkport_read_byte(TilemCalc* calc) +{ + byte value = calc->linkport.assistin; + calc->linkport.assistflags &= ~(TILEM_LINK_ASSIST_READ_BYTE + | TILEM_LINK_ASSIST_READ_BUSY); + calc->linkport.assistinbits = 0; + dbus_update(calc); + return value; +} + +void tilem_linkport_write_byte(TilemCalc* calc, byte data) +{ + if (calc->linkport.assistflags & (TILEM_LINK_ASSIST_READ_BUSY + | TILEM_LINK_ASSIST_WRITE_BUSY)) + return; + + dbus_set_lines(calc, 0); + calc->linkport.assistout = data; + calc->linkport.assistoutbits = 8; + calc->linkport.assistflags |= TILEM_LINK_ASSIST_WRITE_BUSY; + dbus_update(calc); +} + +unsigned int tilem_linkport_get_assist_flags(TilemCalc* calc) +{ + //dbus_update(calc); + return calc->linkport.assistflags; +} + +void tilem_linkport_set_mode(TilemCalc* calc, unsigned int mode) +{ + if ((mode ^ calc->linkport.mode) & TILEM_LINK_MODE_ASSIST) { + dbus_set_lines(calc, 0); + calc->linkport.assistflags &= ~(TILEM_LINK_ASSIST_READ_BUSY + | TILEM_LINK_ASSIST_WRITE_BUSY); + assist_clear_timeout(calc); + } + + if (!(mode & TILEM_LINK_MODE_INT_ON_ACTIVE)) + calc->z80.interrupts &= ~TILEM_INTERRUPT_LINK_ACTIVE; + if (!(mode & TILEM_LINK_MODE_INT_ON_ERROR)) + calc->z80.interrupts &= ~TILEM_INTERRUPT_LINK_ERROR; + + calc->linkport.mode = mode; + + dbus_update(calc); +} + + +/* External BlackLink emulation */ + +void tilem_linkport_blacklink_set_lines(TilemCalc* calc, byte lines) +{ + dbus_set_extlines(calc, lines & 3); + dbus_update(calc); +} + +byte tilem_linkport_blacklink_get_lines(TilemCalc* calc) +{ + dbus_update(calc); + return (~calc->linkport.lines & ~calc->linkport.extlines & 3); +} + + +/* External GrayLink emulation */ + +void tilem_linkport_graylink_reset(TilemCalc* calc) +{ + calc->linkport.graylinkin = 0; + calc->linkport.graylinkinbits = 0; + calc->linkport.graylinkout = 0; + calc->linkport.graylinkoutbits = 0; + dbus_set_extlines(calc, 0); + dbus_update(calc); +} + +int tilem_linkport_graylink_ready(TilemCalc* calc) +{ + if (calc->linkport.graylinkoutbits + || calc->linkport.graylinkinbits) + return 0; + else + return 1; +} + +int tilem_linkport_graylink_send_byte(TilemCalc* calc, byte value) +{ + if (!tilem_linkport_graylink_ready(calc)) + return -1; + + dbus_set_extlines(calc, 0); + + /* set to 9 because we want to wait for the calc to bring both + link lines low before we send the first bit, and also after + we send the last bit */ + calc->linkport.graylinkoutbits = 9; + + calc->linkport.graylinkout = value; + dbus_update(calc); + return 0; +} + +int tilem_linkport_graylink_get_byte(TilemCalc* calc) +{ + dbus_update(calc); + if (calc->linkport.graylinkinbits != 8) + return -1; + + calc->linkport.graylinkinbits = 0; + return calc->linkport.graylinkin; +} diff --git a/tool/tilem-src/emu/md5.c b/tool/tilem-src/emu/md5.c new file mode 100644 index 0000000..14f8996 --- /dev/null +++ b/tool/tilem-src/emu/md5.c @@ -0,0 +1,86 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include "tilem.h" + +void tilem_md5_assist_reset(TilemCalc* calc) +{ + int i; + + for (i = 0; i < 6; i++) + calc->md5assist.regs[i] = 0; + calc->md5assist.shift = 0; + calc->md5assist.mode = 0; +} + +dword tilem_md5_assist_get_value(TilemCalc* calc) +{ + /* Return the result of a complete MD5 operation: + b + ((a + f(b,c,d) + X + T) <<< s) */ + dword a, b, c, d, x, t, result; + byte mode, s; + + mode = calc->md5assist.mode; + a = calc->md5assist.regs[TILEM_MD5_REG_A]; + b = calc->md5assist.regs[TILEM_MD5_REG_B]; + c = calc->md5assist.regs[TILEM_MD5_REG_C]; + d = calc->md5assist.regs[TILEM_MD5_REG_D]; + x = calc->md5assist.regs[TILEM_MD5_REG_X]; + t = calc->md5assist.regs[TILEM_MD5_REG_T]; + s = calc->md5assist.shift; + + switch (mode) { + case TILEM_MD5_FUNC_FF: + /* F(X,Y,Z) = XY v not(X) Z */ + result = (b & c) | ((~b) & d); + break; + + case TILEM_MD5_FUNC_GG: + /* G(X,Y,Z) = XZ v Y not(Z) */ + result = (b & d) | (c & (~d)); + break; + + case TILEM_MD5_FUNC_HH: + /* H(X,Y,Z) = X xor Y xor Z */ + result = b ^ c ^ d; + break; + + case TILEM_MD5_FUNC_II: + /* I(X,Y,Z) = Y xor (X v not(Z)) */ + result = c ^ (b | (~d)); + break; + + default: + tilem_internal(calc, "Invalid MD5 mode %d", mode); + return 0; + } + + result += a + x + t; + result &= 0xffffffff; + result = (result << s) | (result >> (32 - s)); + result += b; + + return result; +} diff --git a/tool/tilem-src/emu/monolcd.c b/tool/tilem-src/emu/monolcd.c new file mode 100644 index 0000000..6c6f173 --- /dev/null +++ b/tool/tilem-src/emu/monolcd.c @@ -0,0 +1,148 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2011 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include "tilem.h" + +TilemLCDBuffer* tilem_lcd_buffer_new() +{ + return tilem_new0(TilemLCDBuffer, 1); +} + +void tilem_lcd_buffer_free(TilemLCDBuffer *buf) +{ + tilem_free(buf->data); + tilem_free(buf->tmpbuf); + tilem_free(buf); +} + +void tilem_lcd_get_frame(TilemCalc * restrict calc, + TilemLCDBuffer * restrict buf) +{ + byte * restrict bp; + byte * restrict op; + int dwidth = calc->hw.lcdwidth; + int dheight = calc->hw.lcdheight; + unsigned int size; + int bwidth = ((calc->hw.lcdwidth + 7) / 8); + int i, j; + + if (TILEM_UNLIKELY(buf->height != dheight + || buf->rowstride != bwidth * 8)) { + /* reallocate data buffer */ + tilem_free(buf->data); + buf->data = tilem_new_atomic(byte, dwidth * bwidth * 8); + buf->rowstride = bwidth * 8; + buf->height = dheight; + } + + size = bwidth * dheight * sizeof(byte); + if (TILEM_UNLIKELY(buf->tmpbufsize < size)) { + /* reallocate temp buffer */ + tilem_free(buf->tmpbuf); + buf->tmpbuf = tilem_malloc_atomic(size); + buf->tmpbufsize = size; + } + + buf->width = dwidth; + + buf->stamp = calc->z80.lastlcdwrite; + + if (!calc->lcd.active || (calc->z80.halted && !calc->poweronhalt)) { + /* screen is turned off */ + buf->contrast = 0; + return; + } + + buf->contrast = calc->lcd.contrast; + + bp = buf->tmpbuf; + op = buf->data; + (*calc->hw.get_lcd)(calc, bp); + + for (i = 0; i < bwidth * dheight; i++) { + for (j = 0; j < 8; j++) { + *op = (*bp << j) & 0x80; + op++; + } + bp++; + } +} + +/* Do the same thing as tilem_lcd_get_frame, but output is only 0 and 1 */ +void tilem_lcd_get_frame1(TilemCalc * restrict calc, + TilemLCDBuffer * restrict buf) +{ + byte * restrict bp; + byte * restrict op; + int dwidth = calc->hw.lcdwidth; + int dheight = calc->hw.lcdheight; + unsigned int size; + int bwidth = ((calc->hw.lcdwidth + 7) / 8); + int i, j; + + if (TILEM_UNLIKELY(buf->height != dheight + || buf->rowstride != bwidth * 8)) { + /* reallocate data buffer */ + tilem_free(buf->data); + buf->data = tilem_new_atomic(byte, dwidth * bwidth * 8); + buf->rowstride = bwidth * 8; + buf->height = dheight; + } + + size = bwidth * dheight * sizeof(byte); + if (TILEM_UNLIKELY(buf->tmpbufsize < size)) { + /* reallocate temp buffer */ + tilem_free(buf->tmpbuf); + buf->tmpbuf = tilem_malloc_atomic(size); + buf->tmpbufsize = size; + } + + buf->width = dwidth; + + buf->stamp = calc->z80.lastlcdwrite; + + if (!calc->lcd.active || (calc->z80.halted && !calc->poweronhalt)) { + /* screen is turned off */ + buf->contrast = 0; + return; + } + + buf->contrast = calc->lcd.contrast; + + bp = buf->tmpbuf; + op = buf->data; + (*calc->hw.get_lcd)(calc, bp); + + for (i = 0; i < bwidth * dheight; i++) { + for (j = 0; j < 8; j++) { + *op = (*bp << j) & 0x80; + if(*op != 0) + *op = 1; + op++; + } + bp++; + } +} diff --git a/tool/tilem-src/emu/rom.c b/tool/tilem-src/emu/rom.c new file mode 100644 index 0000000..9cc24c9 --- /dev/null +++ b/tool/tilem-src/emu/rom.c @@ -0,0 +1,118 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include "tilem.h" + +static int find_string(const char *str, FILE *romfile, + dword start, dword limit) +{ + char buf[256]; + int pos = 0; + int len, i; + + len = strlen(str); + + fseek(romfile, (long int) start, SEEK_SET); + + for (i = 0; i < len-1; i++) { + buf[pos] = fgetc(romfile); + pos = (pos+1)%256; + limit--; + } + + while (limit > 0 && !feof(romfile) && !ferror(romfile)) { + buf[pos] = fgetc(romfile); + pos = (pos+1)%256; + limit--; + + for (i = 0; i < len; i++) { + if (str[i] != buf[(pos + 256 - len + i)%256]) + break; + } + if (i == len) + return 1; + } + return 0; +} + +char tilem_guess_rom_type(FILE* romfile) +{ + unsigned long initpos; + dword size; + char result; + + initpos = ftell(romfile); + + fseek(romfile, 0L, SEEK_END); + size = ftell(romfile); + + if (size >= 0x8000 && size < 0x9000) { + /* 32k: TI-81 (old or new) */ + result = TILEM_CALC_TI81; + } + else if (size >= 0x20000 && size < 0x2C000) { + /* 128k: TI-82 or TI-86 */ + if (find_string("CATALOG", romfile, 0, 0x20000)) + result = TILEM_CALC_TI85; + else + result = TILEM_CALC_TI82; + } + else if (size >= 0x40000 && size < 0x4C000) { + /* 256k: TI-83 (or a variant) or TI-86 */ + if (!find_string("TI82", romfile, 0, 0x40000)) + result = TILEM_CALC_TI86; + else if (find_string("Termin\x96", romfile, 0, 0x40000)) + result = TILEM_CALC_TI76; + else + result = TILEM_CALC_TI83; + } + else if (size >= 0x80000 && size < 0x8C000) { + /* 512k: TI-83 Plus or TI-73 */ + if (find_string("TI-83 Plus", romfile, 0, 8 * 0x4000)) + result = TILEM_CALC_TI83P; + else + result = TILEM_CALC_TI73; + } + else if (size >= 0x100000 && size < 0x124000) { + /* 1024k: TI-84 Plus */ + result = TILEM_CALC_TI84P; + } + else if (size >= 0x200000 && size < 0x224000) { + /* 2048k: TI-83 Plus SE, TI-84 Plus SE */ + if (find_string("\xed\xef", romfile, 0x1FC000, 0x4000)) + result = TILEM_CALC_TI84P_NSPIRE; + else if (find_string("Operating", romfile, 0x1FC000, 0x4000)) + result = TILEM_CALC_TI84P_SE; + else + result = TILEM_CALC_TI83P_SE; + } + else { + result = 0; + } + + fseek(romfile, initpos, SEEK_SET); + return result; +} diff --git a/tool/tilem-src/emu/scancodes.h b/tool/tilem-src/emu/scancodes.h new file mode 100644 index 0000000..7662a18 --- /dev/null +++ b/tool/tilem-src/emu/scancodes.h @@ -0,0 +1,85 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifndef _TILEM_SCANCODES_H +#define _TILEM_SCANCODES_H + +#ifdef __cplusplus +extern "C" { +#endif + +enum { + TILEM_KEY_DOWN = 0x01, + TILEM_KEY_LEFT = 0x02, + TILEM_KEY_RIGHT = 0x03, + TILEM_KEY_UP = 0x04, + TILEM_KEY_ENTER = 0x09, + TILEM_KEY_ADD = 0x0A, + TILEM_KEY_SUB = 0x0B, + TILEM_KEY_MUL = 0x0C, + TILEM_KEY_DIV = 0x0D, + TILEM_KEY_POWER = 0x0E, + TILEM_KEY_CLEAR = 0x0F, + TILEM_KEY_CHS = 0x11, + TILEM_KEY_3 = 0x12, + TILEM_KEY_6 = 0x13, + TILEM_KEY_9 = 0x14, + TILEM_KEY_RPAREN = 0x15, + TILEM_KEY_TAN = 0x16, + TILEM_KEY_VARS = 0x17, + TILEM_KEY_DECPNT = 0x19, + TILEM_KEY_2 = 0x1A, + TILEM_KEY_5 = 0x1B, + TILEM_KEY_8 = 0x1C, + TILEM_KEY_LPAREN = 0x1D, + TILEM_KEY_COS = 0x1E, + TILEM_KEY_PRGM = 0x1F, + TILEM_KEY_STAT = 0x20, + TILEM_KEY_0 = 0x21, + TILEM_KEY_1 = 0x22, + TILEM_KEY_4 = 0x23, + TILEM_KEY_7 = 0x24, + TILEM_KEY_COMMA = 0x25, + TILEM_KEY_SIN = 0x26, + TILEM_KEY_MATRIX = 0x27, + TILEM_KEY_GRAPHVAR = 0x28, + TILEM_KEY_ON = 0x29, + TILEM_KEY_STORE = 0x2A, + TILEM_KEY_LN = 0x2B, + TILEM_KEY_LOG = 0x2C, + TILEM_KEY_SQUARE = 0x2D, + TILEM_KEY_RECIP = 0x2E, + TILEM_KEY_MATH = 0x2F, + TILEM_KEY_ALPHA = 0x30, + TILEM_KEY_GRAPH = 0x31, + TILEM_KEY_TRACE = 0x32, + TILEM_KEY_ZOOM = 0x33, + TILEM_KEY_WINDOW = 0x34, + TILEM_KEY_YEQU = 0x35, + TILEM_KEY_2ND = 0x36, + TILEM_KEY_MODE = 0x37, + TILEM_KEY_DEL = 0x38 +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/tool/tilem-src/emu/state.c b/tool/tilem-src/emu/state.c new file mode 100644 index 0000000..2447866 --- /dev/null +++ b/tool/tilem-src/emu/state.c @@ -0,0 +1,892 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2009-2012 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include "tilem.h" +#include "z80.h" + +static void set_hw_reg(TilemCalc* calc, const char* name, dword value) +{ + int i; + + for (i = 0; i < calc->hw.nhwregs; i++) { + if (!strcmp(name, calc->hw.hwregnames[i])) { + calc->hwregs[i] = value; + return; + } + } + + tilem_warning(calc, "Unknown hwreg %s", name); +} + +static const char* get_timer_name(TilemCalc* calc, int id) +{ + if (id == TILEM_TIMER_LCD_DELAY) + return "lcddelay"; + else if (id == TILEM_TIMER_FLASH_DELAY) + return "flashdelay"; + else if (id == TILEM_TIMER_LINK_ASSIST) + return "linkassist"; + else if (id == TILEM_TIMER_USER1) + return "user1"; + else if (id == TILEM_TIMER_USER2) + return "user2"; + else if (id == TILEM_TIMER_USER3) + return "user3"; + else if (id <= TILEM_NUM_SYS_TIMERS) + abort(); + + id -= TILEM_NUM_SYS_TIMERS + 1; + if (id < calc->hw.nhwtimers) + return calc->hw.hwtimernames[id]; + else + return NULL; +} + +static void set_ptimer(TilemCalc* calc, const char* name, dword value, + dword period, int rt) +{ + int i; + const char* tname; + + for (i = 1; i <= calc->z80.ntimers; i++) { + tname = get_timer_name(calc, i); + if (tname && !strcmp(name, tname)) { + tilem_z80_set_timer(calc, i, value, period, rt); + return; + } + } + + tilem_warning(calc, "Unknown timer %s", name); +} + +static int load_old_sav_file(TilemCalc* calc, FILE* savfile) +{ + byte b[76]; + dword regs[19]; + int i, le, be, c; + unsigned int pageA, pageB; + + /* Read memory mapping */ + + if (fread(calc->mempagemap, 1, 4, savfile) < 4) + return 1; + + /* Read CPU registers */ + + if (fread(b, 1, 76, savfile) < 76) + return 1; + + be = le = 0; + + /* determine if file is in big-endian or little-endian + format */ + + for (i = 0; i < 19; i++) { + if (b[i * 4] || b[i * 4 + 1]) + le++; + if (b[i * 4 + 2] || b[i * 4 + 3]) + be++; + } + + if (le > be) { + for (i = 0; i < 19; i++) { + regs[i] = b[i * 4] + (b[i * 4 + 1] << 8); + } + } + else { + for (i = 0; i < 19; i++) { + regs[i] = b[i * 4 + 3] + (b[i * 4 + 2] << 8); + } + } + + calc->z80.r.af.d = regs[0]; + calc->z80.r.bc.d = regs[1]; + calc->z80.r.de.d = regs[2]; + calc->z80.r.hl.d = regs[3]; + calc->z80.r.ix.d = regs[4]; + calc->z80.r.iy.d = regs[5]; + calc->z80.r.pc.d = regs[6]; + calc->z80.r.sp.d = regs[7]; + calc->z80.r.af2.d = regs[8]; + calc->z80.r.bc2.d = regs[9]; + calc->z80.r.de2.d = regs[10]; + calc->z80.r.hl2.d = regs[11]; + calc->z80.r.iff1 = regs[12] ? 1 : 0; + calc->z80.r.iff2 = regs[13] ? 1 : 0; + calc->z80.r.im = regs[15]; + calc->z80.r.ir.b.h = regs[16]; + calc->z80.r.ir.b.l = regs[17]; + calc->z80.r.r7 = regs[18] & 0x80; + + if (calc->hw.model_id == '2' || calc->hw.model_id == '3') { + if (fread(b, 1, 5, savfile) < 5) + return 1; + + if (calc->hw.model_id == '3') + set_hw_reg(calc, "rom_bank", calc->mempagemap[1] & 0x08); + calc->hw.z80_out(calc, 0x02, b[4]); + } + + /* Read RAM contents: old save files for TI-82/83/85 store RAM + pages in logical rather than physical order */ + + if (calc->hw.model_id == '2' || calc->hw.model_id == '3' + || calc->hw.model_id == '5') { + if (fread(calc->mem + calc->hw.romsize + 0x4000, 1, + 0x4000, savfile) < 0x4000) + return 1; + if (fread(calc->mem + calc->hw.romsize, 1, + 0x4000, savfile) < 0x4000) + return 1; + } + else { + if (fread(calc->mem + calc->hw.romsize, 1, + calc->hw.ramsize, savfile) < calc->hw.ramsize) + return 1; + } + + /* Read LCD contents */ + + if (calc->hw.flags & TILEM_CALC_HAS_T6A04) { + calc->lcd.rowstride = 12; /* old save files only + support the visible + portion of the screen */ + if (fread(calc->lcdmem, 1, 768, savfile) < 768) + return 1; + } + + /* Read additional HW state */ + + switch (calc->hw.model_id) { + case '1': + break; + + case '2': + case '3': + if ((c = fgetc(savfile)) != EOF) + calc->lcd.mode = c; + if ((c = fgetc(savfile)) != EOF) + calc->lcd.x = c; + if ((c = fgetc(savfile)) != EOF) + calc->lcd.y = c; + break; + + case '5': + pageA = calc->mempagemap[1]; + if (pageA >= 0x08) + pageA += 0x38; + calc->hw.z80_out(calc, 0x05, pageA); + + if ((c = fgetc(savfile)) != EOF) + calc->hw.z80_out(calc, 0x06, c); + break; + + case '6': + pageA = calc->mempagemap[1]; + pageB = calc->mempagemap[2]; + if (pageA >= 0x10) + pageA += 0x30; + if (pageB >= 0x10) + pageB += 0x30; + + calc->hw.z80_out(calc, 0x05, pageA); + calc->hw.z80_out(calc, 0x06, pageB); + break; + + default: /* TI-73/83+ series */ + if ((c = fgetc(savfile)) != EOF) + calc->lcd.mode = c; + if ((c = fgetc(savfile)) != EOF) + calc->lcd.x = c; + if ((c = fgetc(savfile)) != EOF) + calc->lcd.y = c; + if ((c = fgetc(savfile)) != EOF) + calc->lcd.inc = c; + + if ((c = fgetc(savfile)) == EOF) + c = 0; + if (c) { + pageA = calc->mempagemap[2]; + pageB = calc->mempagemap[3]; + calc->hw.z80_out(calc, 0x04, 0x77); + } + else { + pageA = calc->mempagemap[1]; + pageB = calc->mempagemap[2]; + calc->hw.z80_out(calc, 0x04, 0x76); + } + + if (pageA >= (calc->hw.romsize >> 14)) + pageA = ((pageA & 0x1f) | calc->hw.rampagemask); + if (pageB >= (calc->hw.romsize >> 14)) + pageB = ((pageB & 0x1f) | calc->hw.rampagemask); + + calc->hw.z80_out(calc, 0x06, pageA); + calc->hw.z80_out(calc, 0x07, pageB); + + if ((c = fgetc(savfile)) != EOF) + calc->flash.state = c; + if ((c = fgetc(savfile)) != EOF) + calc->flash.unlock = c; + + if ((c = fgetc(savfile)) != EOF) + calc->hw.z80_out(calc, 0x20, c); + if ((c = fgetc(savfile)) != EOF) + set_hw_reg(calc, "port21", c); + if ((c = fgetc(savfile)) != EOF) + set_hw_reg(calc, "port22", c); + if ((c = fgetc(savfile)) != EOF) + set_hw_reg(calc, "port23", c); + if ((c = fgetc(savfile)) != EOF) + calc->hw.z80_out(calc, 0x27, c); + if ((c = fgetc(savfile)) != EOF) + calc->hw.z80_out(calc, 0x28, c); + break; + } + + calc->poweronhalt = calc->lcd.active = 1; + + return 0; +} + +static int read_sav_line(FILE* savfile, char **buf) +{ + int c, n, na; + + tilem_free(*buf); + + na = 100; + *buf = tilem_malloc_atomic(na); + n = 0; + + while ((c = fgetc(savfile)) != EOF) { + if (c == '\r' || c == '\n') + break; + + n++; + if (n >= na) { + na = n * 2; + *buf = tilem_realloc(*buf, na); + } + + if (c == '#') + c = 0; + (*buf)[n - 1] = c; + } + + if (n == 0 && c == EOF) { + tilem_free(*buf); + *buf = NULL; + return 0; + } + else { + (*buf)[n] = 0; + return 1; + } +} + +static int parse_sav_definition(char* line, char** value) +{ + char *p; + + p = strchr(line, '='); + if (!p) + return 0; + + while (p != line && p[-1] == ' ') + p--; + *p = 0; + p++; + while (*p == ' ' || *p == '=') + p++; + *value = p; + return 1; +} + +static int load_new_sav_file(TilemCalc* calc, FILE* savfile) +{ + char *buf = NULL; + char *p, *q; + dword value, length; + byte *data; + int ok = 0; + byte digit; + int firstdigit; + dword period; + int rt; + + while (read_sav_line(savfile, &buf)) { + if (!parse_sav_definition(buf, &p)) + continue; + + if (*p == '{') { + p++; + if (!strcmp(buf, "RAM")) { + length = calc->hw.ramsize; + data = calc->ram; + } + else if (!strcmp(buf, "LCD")) { + length = calc->hw.lcdmemsize; + data = calc->lcdmem; + } + else { + length = 0; + data = NULL; + } + + value = 0; + firstdigit = 1; + + while (*p != '}') { + if (*p == 0 || *p == '#') { + if (!read_sav_line(savfile, &buf)) + return 1; + p = buf; + continue; + } + + if (*p >= '0' && *p <= '9') { + digit = *p - '0'; + p++; + } + else if (*p >= 'A' && *p <= 'F') { + digit = *p + 10 - 'A'; + p++; + } + else if (*p >= 'a' && *p <= 'f') { + digit = *p + 10 - 'a'; + p++; + } + else { + p++; + continue; + } + + if (firstdigit) { + value = digit << 4; + firstdigit = 0; + } + else { + value |= digit; + if (length != 0) { + *data = value; + data++; + length--; + } + firstdigit = 1; + } + } + + continue; + } + + if (!strcmp(buf, "MODEL")) { + q = p; + while (*q >= ' ') + q++; + *q = 0; + if (strcmp(p, calc->hw.name)) { + tilem_free(buf); + return 1; + } + ok = 1; + continue; + } + + value = strtol(p, &q, 16); + + /* Persistent timers */ + if (!strncmp(buf, "timer:", 6)) { + while (*q == ' ') + q++; + if (*q != ',') + continue; + q++; + while (*q == ' ') + q++; + period = strtol(q, &q, 16); + + while (*q == ' ') + q++; + if (*q != ',') + continue; + q++; + while (*q == ' ') + q++; + rt = strtol(q, &q, 16); + + set_ptimer(calc, buf + 6, value, period, rt); + continue; + } + + /* Z80 */ + if (!strcmp(buf, "af")) calc->z80.r.af.d = value; + else if (!strcmp(buf, "bc")) calc->z80.r.bc.d = value; + else if (!strcmp(buf, "de")) calc->z80.r.de.d = value; + else if (!strcmp(buf, "hl")) calc->z80.r.hl.d = value; + else if (!strcmp(buf, "af'")) calc->z80.r.af2.d = value; + else if (!strcmp(buf, "bc'")) calc->z80.r.bc2.d = value; + else if (!strcmp(buf, "de'")) calc->z80.r.de2.d = value; + else if (!strcmp(buf, "hl'")) calc->z80.r.hl2.d = value; + else if (!strcmp(buf, "ix")) calc->z80.r.ix.d = value; + else if (!strcmp(buf, "iy")) calc->z80.r.iy.d = value; + else if (!strcmp(buf, "pc")) calc->z80.r.pc.d = value; + else if (!strcmp(buf, "sp")) calc->z80.r.sp.d = value; + else if (!strcmp(buf, "ir")) { + calc->z80.r.ir.d = value; + calc->z80.r.r7 = value & 0x80; + } + else if (!strcmp(buf, "wz")) calc->z80.r.wz.d = value; + else if (!strcmp(buf, "wz'")) calc->z80.r.wz2.d = value; + else if (!strcmp(buf, "iff1")) calc->z80.r.iff1 = value; + else if (!strcmp(buf, "iff2")) calc->z80.r.iff2 = value; + else if (!strcmp(buf, "im")) calc->z80.r.im = value; + else if (!strcmp(buf, "interrupts")) + calc->z80.interrupts = value; + else if (!strcmp(buf, "clockspeed")) + calc->z80.clockspeed = value; + else if (!strcmp(buf, "halted")) calc->z80.halted = value; + + /* LCD */ + else if (!strcmp(buf, "lcd.active")) + calc->lcd.active = value; + else if (!strcmp(buf, "lcd.addr")) + calc->lcd.addr = value; + else if (!strcmp(buf, "lcd.rowshift")) + calc->lcd.rowshift = value; + else if (!strcmp(buf, "lcd.contrast")) + calc->lcd.contrast = value; + else if (!strcmp(buf, "lcd.inc")) + calc->lcd.inc = value; + else if (!strcmp(buf, "lcd.mode")) + calc->lcd.mode = value; + else if (!strcmp(buf, "lcd.x")) + calc->lcd.x = value; + else if (!strcmp(buf, "lcd.y")) + calc->lcd.y = value; + else if (!strcmp(buf, "lcd.nextbyte")) + calc->lcd.nextbyte = value; + else if (!strcmp(buf, "lcd.rowstride")) + calc->lcd.rowstride = value; + else if (!strcmp(buf, "lcd.busy")) + calc->lcd.busy = value; + + /* Link port */ + else if (!strcmp(buf, "linkport.lines")) + calc->linkport.lines = value; + else if (!strcmp(buf, "linkport.mode")) + calc->linkport.mode = value; + else if (!strcmp(buf, "linkport.assistflags")) + calc->linkport.assistflags = value; + else if (!strcmp(buf, "linkport.assistin")) + calc->linkport.assistin = value; + else if (!strcmp(buf, "linkport.assistinbits")) + calc->linkport.assistinbits = value; + else if (!strcmp(buf, "linkport.assistout")) + calc->linkport.assistout = value; + else if (!strcmp(buf, "linkport.assistoutbits")) + calc->linkport.assistoutbits = value; + else if (!strcmp(buf, "linkport.assistlastbyte")) + calc->linkport.assistlastbyte = value; + + /* Keypad */ + else if (!strcmp(buf, "keypad.group")) + calc->keypad.group = value; + else if (!strcmp(buf, "keypad.onkeyint")) + calc->keypad.onkeyint = value; + + /* MD5 assist */ + else if (!strcmp(buf, "md5assist.a")) + calc->md5assist.regs[0] = value; + else if (!strcmp(buf, "md5assist.b")) + calc->md5assist.regs[1] = value; + else if (!strcmp(buf, "md5assist.c")) + calc->md5assist.regs[2] = value; + else if (!strcmp(buf, "md5assist.d")) + calc->md5assist.regs[3] = value; + else if (!strcmp(buf, "md5assist.x")) + calc->md5assist.regs[4] = value; + else if (!strcmp(buf, "md5assist.t")) + calc->md5assist.regs[5] = value; + else if (!strcmp(buf, "md5assist.shift")) + calc->md5assist.shift = value; + else if (!strcmp(buf, "md5assist.mode")) + calc->md5assist.mode = value; + + /* Programmable timers */ + else if (!strcmp(buf, "usertimer0.frequency")) + calc->usertimers[0].frequency = value; + else if (!strcmp(buf, "usertimer0.loopvalue")) + calc->usertimers[0].loopvalue = value; + else if (!strcmp(buf, "usertimer0.status")) + calc->usertimers[0].status = value; + else if (!strcmp(buf, "usertimer1.frequency")) + calc->usertimers[1].frequency = value; + else if (!strcmp(buf, "usertimer1.loopvalue")) + calc->usertimers[1].loopvalue = value; + else if (!strcmp(buf, "usertimer1.status")) + calc->usertimers[1].status = value; + else if (!strcmp(buf, "usertimer2.frequency")) + calc->usertimers[2].frequency = value; + else if (!strcmp(buf, "usertimer2.loopvalue")) + calc->usertimers[2].loopvalue = value; + else if (!strcmp(buf, "usertimer2.status")) + calc->usertimers[2].status = value; + + /* Main power */ + else if (!strcmp(buf, "poweronhalt")) + calc->poweronhalt = value; + + /* Battery */ + else if (!strcmp(buf, "battery")) + calc->battery = value; + + /* Memory */ + else if (!strcmp(buf, "mempagemap0")) + calc->mempagemap[0] = value; + else if (!strcmp(buf, "mempagemap1")) + calc->mempagemap[1] = value; + else if (!strcmp(buf, "mempagemap2")) + calc->mempagemap[2] = value; + else if (!strcmp(buf, "mempagemap3")) + calc->mempagemap[3] = value; + else if (!strcmp(buf, "flash.unlock")) + calc->flash.unlock = value; + else if (!strcmp(buf, "flash.state")) + calc->flash.state = value; + else if (!strcmp(buf, "flash.busy")) + calc->flash.busy = value; + else if (!strcmp(buf, "flash.progaddr")) + calc->flash.progaddr = value; + else if (!strcmp(buf, "flash.progbyte")) + calc->flash.progbyte = value; + else if (!strcmp(buf, "flash.toggles")) + calc->flash.toggles = value; + else if (!strcmp(buf, "flash.overridegroup")) + calc->flash.overridegroup = value; + + else + set_hw_reg(calc, buf, value); + } + + tilem_free(buf); + + return !ok; +} + +int tilem_calc_load_state(TilemCalc* calc, FILE* romfile, FILE* savfile) +{ + int b; + int savtype = 0; + + if (romfile) { + if (fread(calc->mem, 1, calc->hw.romsize, romfile) + != calc->hw.romsize) + return 1; + } + + tilem_calc_reset(calc); + + if (savfile) { + /* first byte of old save files is always zero */ + b = fgetc(savfile); + fseek(savfile, 0L, SEEK_SET); + + if (b == 0) { + if (load_old_sav_file(calc, savfile)) { + tilem_calc_reset(calc); + return 1; + } + else + savtype = 1; + } + else { + if (load_new_sav_file(calc, savfile)) { + tilem_calc_reset(calc); + return 1; + } + else + savtype = 2; + } + } + + if (calc->hw.stateloaded) + (*calc->hw.stateloaded)(calc, savtype); + + return 0; +} + +char tilem_get_sav_type(FILE* savfile) +{ + int b; + char *buf = NULL, *p, *q; + const TilemHardware **models; + int nmodels, i; + char id = 0; + + tilem_get_supported_hardware(&models, &nmodels); + + /* first byte of old save files is always zero */ + b = fgetc(savfile); + fseek(savfile, 0L, SEEK_SET); + if (b == 0) + return 0; /* old files give no way to detect model */ + + while (read_sav_line(savfile, &buf)) { + if (parse_sav_definition(buf, &p) + && !strcmp(buf, "MODEL")) { + q = p; + while (*q >= ' ') + q++; + *q = 0; + + for (i = 0; i < nmodels; i++) + if (!strcmp(p, models[i]->name)) + id = models[i]->model_id; + + break; + } + } + + fseek(savfile, 0L, SEEK_SET); + tilem_free(buf); + return id; +} + +int tilem_calc_save_state(TilemCalc* calc, FILE* romfile, FILE* savfile) +{ + dword i; + dword t; + int j; + const char* tname; + unsigned int rowstride; + + if (romfile) { + if (fwrite(calc->mem, 1, calc->hw.romsize, romfile) + != calc->hw.romsize) + return 1; + } + + if (savfile) { + fprintf(savfile, "# Tilem II State File\n# Version: %s\n", + PACKAGE_VERSION); + fprintf(savfile, "MODEL = %s\n", calc->hw.name); + + fprintf(savfile, "\n## CPU ##\n"); + fprintf(savfile, "af = %04X\n", calc->z80.r.af.w.l); + fprintf(savfile, "bc = %04X\n", calc->z80.r.bc.w.l); + fprintf(savfile, "de = %04X\n", calc->z80.r.de.w.l); + fprintf(savfile, "hl = %04X\n", calc->z80.r.hl.w.l); + fprintf(savfile, "af' = %04X\n", calc->z80.r.af2.w.l); + fprintf(savfile, "bc' = %04X\n", calc->z80.r.bc2.w.l); + fprintf(savfile, "de' = %04X\n", calc->z80.r.de2.w.l); + fprintf(savfile, "hl' = %04X\n", calc->z80.r.hl2.w.l); + fprintf(savfile, "ix = %04X\n", calc->z80.r.ix.w.l); + fprintf(savfile, "iy = %04X\n", calc->z80.r.iy.w.l); + fprintf(savfile, "pc = %04X\n", calc->z80.r.pc.w.l); + fprintf(savfile, "sp = %04X\n", calc->z80.r.sp.w.l); + fprintf(savfile, "ir = %04X\n", + ((calc->z80.r.ir.w.l & ~0x80) | calc->z80.r.r7)); + fprintf(savfile, "wz = %04X\n", calc->z80.r.wz.w.l); + fprintf(savfile, "wz' = %04X\n", calc->z80.r.wz2.w.l); + fprintf(savfile, "iff1 = %X\n", calc->z80.r.iff1); + fprintf(savfile, "iff2 = %X\n", calc->z80.r.iff2); + fprintf(savfile, "im = %X\n", calc->z80.r.im); + fprintf(savfile, "interrupts = %08X\n", calc->z80.interrupts); + fprintf(savfile, "clockspeed = %X\n", calc->z80.clockspeed); + fprintf(savfile, "halted = %X\n", calc->z80.halted); + + fprintf(savfile, "\n## LCD Driver ##\n"); + fprintf(savfile, "lcd.active = %X\n", + calc->lcd.active); + fprintf(savfile, "lcd.contrast = %X\n", + calc->lcd.contrast); + fprintf(savfile, "lcd.rowstride = %X\n", + calc->lcd.rowstride); + if (calc->hw.flags & TILEM_CALC_HAS_T6A04) { + fprintf(savfile, "lcd.rowshift = %X\n", + calc->lcd.rowshift); + fprintf(savfile, "lcd.inc = %X\n", + calc->lcd.inc); + fprintf(savfile, "lcd.mode = %X\n", + calc->lcd.mode); + fprintf(savfile, "lcd.x = %02X\n", + calc->lcd.x); + fprintf(savfile, "lcd.y = %02X\n", + calc->lcd.y); + fprintf(savfile, "lcd.nextbyte = %02X\n", + calc->lcd.nextbyte); + fprintf(savfile, "lcd.busy = %X\n", + calc->lcd.busy); + } + fprintf(savfile, "lcd.addr = %X\n", calc->lcd.addr); + + if (calc->hw.flags & TILEM_CALC_HAS_LINK) { + fprintf(savfile, "\n## Link Port ##\n"); + fprintf(savfile, "linkport.lines = %X\n", + calc->linkport.lines); + fprintf(savfile, "linkport.mode = %08X\n", + calc->linkport.mode); + } + if (calc->hw.flags & TILEM_CALC_HAS_LINK_ASSIST) { + fprintf(savfile, "linkport.assistflags = %08X\n", + calc->linkport.assistflags); + fprintf(savfile, "linkport.assistin = %02X\n", + calc->linkport.assistin); + fprintf(savfile, "linkport.assistinbits = %X\n", + calc->linkport.assistinbits); + fprintf(savfile, "linkport.assistout = %02X\n", + calc->linkport.assistout); + fprintf(savfile, "linkport.assistoutbits = %X\n", + calc->linkport.assistoutbits); + fprintf(savfile, "linkport.assistlastbyte = %02X\n", + calc->linkport.assistlastbyte); + } + + fprintf(savfile, "\n## Keypad ##\n"); + fprintf(savfile, "keypad.group = %X\n", calc->keypad.group); + fprintf(savfile, "keypad.onkeyint = %X\n", + calc->keypad.onkeyint); + + fprintf(savfile, "\n## Memory mapping ##\n"); + fprintf(savfile, "mempagemap0 = %X\n", calc->mempagemap[0]); + fprintf(savfile, "mempagemap1 = %X\n", calc->mempagemap[1]); + fprintf(savfile, "mempagemap2 = %X\n", calc->mempagemap[2]); + fprintf(savfile, "mempagemap3 = %X\n", calc->mempagemap[3]); + + fprintf(savfile, "\n## Power ##\n"); + fprintf(savfile, "poweronhalt = %X\n", calc->poweronhalt); + fprintf(savfile, "battery = %X\n", calc->battery); + + if (calc->hw.flags & TILEM_CALC_HAS_FLASH) { + fprintf(savfile, "\n## Flash ##\n"); + fprintf(savfile, "flash.unlock = %X\n", + calc->flash.unlock); + fprintf(savfile, "flash.state = %X\n", + calc->flash.state); + fprintf(savfile, "flash.busy = %X\n", + calc->flash.busy); + fprintf(savfile, "flash.progaddr = %X\n", + calc->flash.progaddr); + fprintf(savfile, "flash.progbyte = %X\n", + calc->flash.progbyte); + fprintf(savfile, "flash.toggles = %X\n", + calc->flash.toggles); + fprintf(savfile, "flash.overridegroup = %X\n", + calc->flash.overridegroup); + } + + if (calc->hw.flags & TILEM_CALC_HAS_MD5_ASSIST) { + fprintf(savfile, "\n## MD5 assist ##\n"); + fprintf(savfile, "md5assist.a = %X\n", + calc->md5assist.regs[0]); + fprintf(savfile, "md5assist.b = %X\n", + calc->md5assist.regs[1]); + fprintf(savfile, "md5assist.c = %X\n", + calc->md5assist.regs[2]); + fprintf(savfile, "md5assist.d = %X\n", + calc->md5assist.regs[3]); + fprintf(savfile, "md5assist.x = %X\n", + calc->md5assist.regs[4]); + fprintf(savfile, "md5assist.t = %X\n", + calc->md5assist.regs[5]); + fprintf(savfile, "md5assist.shift = %X\n", + calc->md5assist.shift); + fprintf(savfile, "md5assist.mode = %X\n", + calc->md5assist.mode); + } + + for (j = 0; j < calc->hw.nusertimers; j++) { + fprintf(savfile, + "\n## Programmable timer %d ##\n", j); + fprintf(savfile, "usertimer%d.frequency = %X\n", + j, calc->usertimers[j].frequency); + fprintf(savfile, "usertimer%d.loopvalue = %X\n", + j, calc->usertimers[j].loopvalue); + fprintf(savfile, "usertimer%d.status = %X\n", + j, calc->usertimers[j].status); + } + + fprintf(savfile, "\n## Model-specific ##\n"); + for (j = 0; j < calc->hw.nhwregs; j++) { + fprintf(savfile, "%s = %X\n", calc->hw.hwregnames[j], + calc->hwregs[j]); + } + + fprintf(savfile, "\n## Timers ##\n"); + for (j = calc->z80.timer_cpu; j; + j = calc->z80.timers[j].next) { + tname = get_timer_name(calc, j); + if (tname) { + t = tilem_z80_get_timer_clocks(calc, j); + fprintf(savfile, "timer:%s = %X, %X, 0\n", + tname, t, calc->z80.timers[j].period); + } + } + for (j = calc->z80.timer_rt; j; + j = calc->z80.timers[j].next) { + tname = get_timer_name(calc, j); + if (tname) { + t = tilem_z80_get_timer_microseconds(calc, j); + fprintf(savfile, "timer:%s = %X, %X, 1\n", + tname, t, calc->z80.timers[j].period); + } + } + + fprintf(savfile, "\n## RAM contents ##\n"); + fprintf(savfile, "RAM = {\n"); + for (i = 0; i < calc->hw.ramsize; i++) { + if (i % 256 == 0) { + fprintf(savfile, "# %02X:%04X\n", + (i >> 14), (i & 0x3fff)); + } + + fprintf(savfile, "%02X", + calc->mem[i + calc->hw.romsize]); + if (i % 32 == 31) + fprintf(savfile, "\n"); + } + fprintf(savfile, "}\n## End of RAM contents ##\n"); + + if (calc->hw.lcdmemsize) { + fprintf(savfile, "\n## LCD contents ##\n"); + fprintf(savfile, "LCD = {\n"); + rowstride = calc->lcd.rowstride; + if (rowstride == 0) + rowstride = 32; + + for (i = 0; i < calc->hw.lcdmemsize; i++) { + fprintf(savfile, "%02X", calc->lcdmem[i]); + if (i % rowstride == (rowstride - 1)) + fprintf(savfile, "\n"); + } + fprintf(savfile, "}\n## End of LCD contents ##\n"); + } + } + + return 0; +} diff --git a/tool/tilem-src/emu/tilem.h b/tool/tilem-src/emu/tilem.h new file mode 100644 index 0000000..01878ad --- /dev/null +++ b/tool/tilem-src/emu/tilem.h @@ -0,0 +1,950 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2009-2012 Benjamin Moody + * + * 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, see + * . + */ + +#ifndef _TILEM_H +#define _TILEM_H + +#include "tilemint.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Basic integer types */ +typedef uint8_t byte; +typedef uint16_t word; +typedef uint32_t dword; +typedef uint64_t qword; + +/* Structure types */ +typedef struct _TilemHardware TilemHardware; +typedef struct _TilemCalc TilemCalc; + +/* Useful macros */ +#if __GNUC__ >= 3 +# define TILEM_ATTR_PURE __attribute__((__pure__)) +# define TILEM_ATTR_UNUSED __attribute__((__unused__)) +# define TILEM_ATTR_MALLOC __attribute__((__malloc__)) +# define TILEM_ATTR_PRINTF(x,y) __attribute__((__format__(__printf__,x,y))) +# define TILEM_LIKELY(xxx) (__builtin_expect((xxx), 1)) +# define TILEM_UNLIKELY(xxx) (__builtin_expect((xxx), 0)) +#else +# define TILEM_ATTR_PURE +# define TILEM_ATTR_UNUSED +# define TILEM_ATTR_MALLOC +# define TILEM_ATTR_PRINTF(x,y) +# define TILEM_LIKELY(xxx) (xxx) +# define TILEM_UNLIKELY(xxx) (xxx) +#endif + +#define TILEM_DWORD_TO_PTR(xxx) ((void*)(uintptr_t)(xxx)) +#define TILEM_PTR_TO_DWORD(xxx) ((dword)(uintptr_t)(xxx)) + +/* Memory allocation */ +void* tilem_malloc(size_t size) TILEM_ATTR_MALLOC; +void* tilem_malloc0(size_t size) TILEM_ATTR_MALLOC; +void* tilem_malloc_atomic(size_t size) TILEM_ATTR_MALLOC; +void* tilem_try_malloc(size_t size) TILEM_ATTR_MALLOC; +void* tilem_try_malloc0(size_t size) TILEM_ATTR_MALLOC; +void* tilem_try_malloc_atomic(size_t size) TILEM_ATTR_MALLOC; +void* tilem_realloc(void* ptr, size_t size) TILEM_ATTR_MALLOC; +void tilem_free(void* ptr); +#define tilem_new(ttt, nnn) ((ttt*) tilem_malloc((nnn) * sizeof(ttt))); +#define tilem_new0(ttt, nnn) ((ttt*) tilem_malloc0((nnn) * sizeof(ttt))); +#define tilem_new_atomic(ttt, nnn) ((ttt*) tilem_malloc_atomic((nnn) * sizeof(ttt))); + +#define tilem_try_new(ttt, nnn) ((ttt*) tilem_try_malloc((nnn) * sizeof(ttt))); +#define tilem_try_new0(ttt, nnn) ((ttt*) tilem_try_malloc0((nnn) * sizeof(ttt))); +#define tilem_try_new_atomic(ttt, nnn) ((ttt*) tilem_try_malloc_atomic((nnn) * sizeof(ttt))); +#define tilem_renew(ttt, ppp, nnn) ((ttt*) tilem_realloc((ppp), (nnn) * sizeof(ttt))) + +/* Message/error logging */ + +/* Write an informative message. This can be used to notify the user + of major occurences, such as changes in the Flash protection. + These messages can occur regularly in normal operation and are + provided chiefly to aid in debugging. */ +void tilem_message(TilemCalc* calc, const char* msg, ...) + TILEM_ATTR_PRINTF(2, 3); + +/* Write a warning message. These messages occur when the calculator + software (either the OS or a user program) performs an invalid + operation; these messages often indicate a bug in the calculator + software, but are otherwise harmless. */ +void tilem_warning(TilemCalc* calc, const char* msg, ...) + TILEM_ATTR_PRINTF(2, 3); + +/* Write a warning about an internal error. These messages should + never occur and indicate a bug in TilEm. */ +void tilem_internal(TilemCalc* calc, const char* msg, ...) + TILEM_ATTR_PRINTF(2, 3); + + +/* Z80 CPU */ + +/* This union allows us to manipulate register pairs as either byte or + word values. It may need to be modified for really unusual host + CPUs. */ +typedef union _TilemZ80Reg { +#ifdef WORDS_BIGENDIAN + struct { + byte h3, h2, h, l; + } b; + + struct { + word h, l; + } w; + + dword d; +#else + struct { + byte l, h, h2, h3; + } b; + + struct { + word l, h; + } w; + + dword d; +#endif +} TilemZ80Reg; + +typedef struct _TilemZ80Regs { + TilemZ80Reg af, bc, de, hl; + TilemZ80Reg ix, iy, pc, sp; + TilemZ80Reg ir, wz, wz2; + TilemZ80Reg af2, bc2, de2, hl2; + int iff1, iff2, im; + byte r7; +} TilemZ80Regs; + +/* Breakpoint types */ +enum { + TILEM_BREAK_MEM_READ = 1, /* Break after reading from memory */ + TILEM_BREAK_MEM_EXEC, /* Break prior to executing from memory */ + TILEM_BREAK_MEM_WRITE, /* Break after writing to memory */ + TILEM_BREAK_PORT_READ, /* Break after reading from port */ + TILEM_BREAK_PORT_WRITE, /* Break after writing to port */ + TILEM_BREAK_EXECUTE, /* Break after executing opcode */ + + TILEM_BREAK_TYPE_MASK = 0xffff, + + TILEM_BREAK_PHYSICAL = 0x10000, /* Use physical addresses */ + TILEM_BREAK_DISABLED = 0x20000 /* Disabled breakpoint */ +}; + +/* Emulation flags */ +enum { + TILEM_Z80_BREAK_INVALID = 1, /* Break on invalid + instructions */ + TILEM_Z80_BREAK_UNDOCUMENTED = 2, /* Break on undocumented + instructions */ + TILEM_Z80_SKIP_UNDOCUMENTED = 4, /* Ignore undocumented + instructions entirely + (act as two NOPs) */ + TILEM_Z80_RESET_UNDOCUMENTED = 8, /* Reset CPU following + undocumented instructions */ + TILEM_Z80_BREAK_EXCEPTIONS = 16, /* Break on hardware exceptions */ + TILEM_Z80_IGNORE_EXCEPTIONS = 32 /* Ignore hardware exceptions */ +}; + +/* Reasons for stopping emulation */ +enum { + TILEM_STOP_TIMEOUT = 0, /* stopped due to timeout */ + TILEM_STOP_BREAKPOINT = 1, /* stopped due to breakpoint */ + TILEM_STOP_INVALID_INST = 2, /* invalid instruction */ + TILEM_STOP_UNDOCUMENTED_INST = 4, /* undocumented instruction */ + TILEM_STOP_EXCEPTION = 8, /* hardware exception */ + TILEM_STOP_LINK_STATE = 16, /* blacklink state change */ + TILEM_STOP_LINK_READ_BYTE = 32, /* graylink finished reading byte */ + TILEM_STOP_LINK_WRITE_BYTE = 64, /* graylink finished writing byte */ + TILEM_STOP_LINK_ERROR = 128 /* graylink encountered error */ +}; + +/* Types of interrupt */ +enum { + TILEM_INTERRUPT_ON_KEY = 1, /* ON key pressed */ + TILEM_INTERRUPT_TIMER1 = 2, /* Main interrupt timer */ + TILEM_INTERRUPT_TIMER2 = 4, /* Alt. interrupt timer (83/83+) */ + TILEM_INTERRUPT_USER_TIMER1 = 8, /* Programmable timers (83+SE) */ + TILEM_INTERRUPT_USER_TIMER2 = 16, + TILEM_INTERRUPT_USER_TIMER3 = 32, + TILEM_INTERRUPT_LINK_ACTIVE = 512, /* Link port state changed */ + TILEM_INTERRUPT_LINK_READ = 1024, /* Link assist read a byte */ + TILEM_INTERRUPT_LINK_IDLE = 2048, /* Link assist is idle */ + TILEM_INTERRUPT_LINK_ERROR = 4096 /* Link assist failed */ +}; + +/* Types of hardware exception */ +enum { + TILEM_EXC_RAM_EXEC = 1, /* Executing at invalid RAM address */ + TILEM_EXC_FLASH_EXEC = 2, /* Executing at invalid Flash address */ + TILEM_EXC_FLASH_WRITE = 4, /* Writing to invalid Flash address */ + TILEM_EXC_INSTRUCTION = 8 /* Invalid instruction */ +}; + +/* Constant hardware timer IDs */ +enum { + TILEM_TIMER_NONE = 0, + TILEM_TIMER_LCD_DELAY, + TILEM_TIMER_FLASH_DELAY, + TILEM_TIMER_LINK_ASSIST, + TILEM_TIMER_USER1, + TILEM_TIMER_USER2, + TILEM_TIMER_USER3, + TILEM_TIMER_HW +}; + +#define TILEM_NUM_SYS_TIMERS (TILEM_TIMER_HW - 1) + +/* Type of a timer callback function. Second arg is the callback data + passed to tilem_z80_add_timer(). */ +typedef void (*TilemZ80TimerFunc)(TilemCalc*, void*); + +/* Type of a breakpoint test function. Second arg is the memory + address (or opcode in the case of TILEM_BREAK_EXECUTE breakpoints.) + Third arg is the callback data passed to + tilem_z80_add_breakpoint(). */ +typedef int (*TilemZ80BreakpointFunc)(TilemCalc*, dword, void*); + +typedef struct _TilemZ80Timer TilemZ80Timer; +typedef struct _TilemZ80Breakpoint TilemZ80Breakpoint; + +typedef struct _TilemZ80 { + TilemZ80Regs r; + unsigned int interrupts; /* Currently active interrupts */ + int clockspeed; /* Current CPU speed (kHz) */ + int halted; + unsigned int exception; + dword clock; + dword lastwrite; + dword lastlcdwrite; + + unsigned int emuflags; + + int ntimers; + TilemZ80Timer* timers; + int timer_cpu; /* Sorted list of timers (CPU-based) */ + int timer_rt; /* Sorted list of timers (realtime) */ + int timer_free; /* List of free timer structs */ + + int nbreakpoints; + TilemZ80Breakpoint* breakpoints; + int breakpoint_mr; /* Memory read breakpoints */ + int breakpoint_mx; /* Memory exec breakpoints */ + int breakpoint_mw; /* Memory write breakpoints */ + int breakpoint_pr; /* Port read breakpoints */ + int breakpoint_pw; /* Port write breakpoints */ + int breakpoint_op; /* Opcode breakpoints */ + int breakpoint_mpr; /* Physical mem read breakpoints */ + int breakpoint_mpx; /* Physical mem exec breakpoints */ + int breakpoint_mpw; /* Physical mem write breakpoints */ + int breakpoint_disabled; /* Disabled breakpoints */ + int breakpoint_free; /* List of free bp structs */ + + int stopping; + dword stop_reason; + dword stop_mask; + int stop_breakpoint; +} TilemZ80; + +/* Reset CPU */ +void tilem_z80_reset(TilemCalc* calc); + +/* Halt simulation */ +void tilem_z80_stop(TilemCalc* calc, dword reason); + +/* Set CPU speed (kHz) */ +void tilem_z80_set_speed(TilemCalc* calc, int speed); + +/* Raise a hardware exception */ +void tilem_z80_exception(TilemCalc* calc, unsigned type); + +/* Add a timer with the given callback function and data. The + callback function will be called after 'count' time units, and + every 'period' time units thereafter. If rt = 0, the time units + are CPU clock cycles; if rt = 1, time units are microseconds. + + Note that if a timer is set in response to a memory read or write, + the length of the delay may be off by as much as 19 clock cycles; + the precise timings for these are not (yet) properly emulated. + Timers set in response to port I/O events will be accurate to the + nearest CPU clock cycle. + + The timer is considered to have "fired" as soon as the specified + amount of time has elapsed. The callback function, however, may + not be called until after the instruction finishes. If multiple + timers fire during the same instruction, the order in which the + callback functions will be called is undefined. + + If you create a timer using this function (either repeating or + non-repeating), you must call tilem_z80_remove_timer() when the + timer is no longer needed. +*/ +int tilem_z80_add_timer(TilemCalc* calc, dword count, dword period, + int rt, TilemZ80TimerFunc func, void* data); + +/* Change settings for an existing timer. Arguments are the same as + above. If count = 0, the timer is disabled. */ +void tilem_z80_set_timer(TilemCalc* calc, int id, dword count, + dword period, int rt); + +/* Change period for an existing timer without affecting the current + interval. */ +void tilem_z80_set_timer_period(TilemCalc* calc, int id, dword period); + +/* Delete a timer. */ +void tilem_z80_remove_timer(TilemCalc* calc, int id); + +/* Check whether a timer is currently running. */ +int tilem_z80_timer_running(TilemCalc* calc, int id) + TILEM_ATTR_PURE; + +/* Get the number of clock ticks from now until the next time the + given timer fires. (This may be negative, if the timer has already + fired during this instruction.) NOTE: If the timer is disabled, + the return value is undefined. */ +int tilem_z80_get_timer_clocks(TilemCalc* calc, int id) + TILEM_ATTR_PURE; + +/* Get the number of microseconds from now until the next time the + given timer fires. */ +int tilem_z80_get_timer_microseconds(TilemCalc* calc, int id) + TILEM_ATTR_PURE; + +/* Add a breakpoint. The breakpoint will be triggered if the address, + ANDed with the given mask, falls between the given start and end + inclusive. If a callback function is specified it acts as an + additional filter, to determine whether the simulation should be + halted. */ +int tilem_z80_add_breakpoint(TilemCalc* calc, int type, + dword start, dword end, dword mask, + TilemZ80BreakpointFunc func, void* data); + +/* Remove the given breakpoint. */ +void tilem_z80_remove_breakpoint(TilemCalc* calc, int id); + +/* Enable the given breakpoint. */ +void tilem_z80_enable_breakpoint(TilemCalc* calc, int id); + +/* Disable the given breakpoint. */ +void tilem_z80_disable_breakpoint(TilemCalc* calc, int id); + +/* Check whether the given breakpoint is currently enabled. */ +int tilem_z80_breakpoint_enabled(TilemCalc* calc, int id); + +/* Get the type of the given breakpoint. */ +int tilem_z80_get_breakpoint_type(TilemCalc* calc, int id); + +/* Get the start address of the given breakpoint. */ +dword tilem_z80_get_breakpoint_address_start(TilemCalc* calc, int id); + +/* Get the start address of the given breakpoint. */ +dword tilem_z80_get_breakpoint_address_end(TilemCalc* calc, int id); + +/* Get the start address of the given breakpoint. */ +dword tilem_z80_get_breakpoint_address_mask(TilemCalc* calc, int id); + +/* Get the callback/filter function associated to the given breakpoint. */ +TilemZ80BreakpointFunc tilem_z80_get_breakpoint_callback(TilemCalc* calc, + int id); + +/* Get the data associated to the given breakpoint. */ +void* tilem_z80_get_breakpoint_data(TilemCalc* calc, int id); + +/* Set the type of the given breakpoint. */ +void tilem_z80_set_breakpoint_type(TilemCalc* calc, int id, int type); + +/* Set the start address of the given breakpoint. */ +void tilem_z80_set_breakpoint_address_start(TilemCalc* calc, int id, + dword start); + +/* Set the start address of the given breakpoint. */ +void tilem_z80_set_breakpoint_address_end(TilemCalc* calc, int id, dword end); + +/* Set the start address of the given breakpoint. */ +void tilem_z80_set_breakpoint_address_mask(TilemCalc* calc, int id, dword mask); + +/* Set the callback/filter function associated to the given breakpoint. */ +void tilem_z80_set_breakpoint_callback(TilemCalc* calc, int id, + TilemZ80BreakpointFunc func); + +/* Set the data associated to the given breakpoint. */ +void tilem_z80_set_breakpoint_data(TilemCalc* calc, int id, void* data); + + +/* Run the simulated CPU for the given number of clock + ticks/microseconds, or until a breakpoint is hit or + tilem_z80_stop() is called. */ +dword tilem_z80_run(TilemCalc* calc, int clocks, int* remaining); +dword tilem_z80_run_time(TilemCalc* calc, int microseconds, int* remaining); + + +/* LCD driver */ + +/* Emulation flags */ +enum { + TILEM_LCD_REQUIRE_DELAY = 1, /* Emulate required delay + between commands */ + TILEM_LCD_REQUIRE_LONG_DELAY = 2 /* Require extra-long delay */ +}; + +typedef struct _TilemLCD { + /* Common settings */ + byte active; /* LCD driver active */ + byte contrast; /* Contrast value (0-63) */ + int rowstride; /* Number of bytes per row */ + unsigned int emuflags; + + /* T6A43 internal driver */ + word addr; /* Memory address */ + + /* T6A04 external driver */ + byte mode; /* I/O mode (0 = 6bit, 1 = 8bit) */ + byte inc; /* Increment mode (4-7) */ + byte nextbyte; /* Output register */ + int x, y; /* Current position */ + int rowshift; /* Starting row for display */ + byte busy; +} TilemLCD; + +/* Reset LCD driver */ +void tilem_lcd_reset(TilemCalc* calc); + +/* Get LCD driver status (port 10 input) */ +byte tilem_lcd_t6a04_status(TilemCalc* calc); + +/* Send command to LCD driver (port 10 output) */ +void tilem_lcd_t6a04_control(TilemCalc* calc, byte val); + +/* Read data from LCD driver (port 11 input) */ +byte tilem_lcd_t6a04_read(TilemCalc* calc); + +/* Write data to LCD driver (port 11 output) */ +void tilem_lcd_t6a04_write(TilemCalc* calc, byte val); + +/* Get screen image (T6A04 style) */ +void tilem_lcd_t6a04_get_data(TilemCalc* calc, byte* data); + +/* Get screen image (T6A43 style) */ +void tilem_lcd_t6a43_get_data(TilemCalc* calc, byte* data); + +/* Callback for TILEM_TIMER_LCD_DELAY */ +void tilem_lcd_delay_timer(TilemCalc* calc, void* data); + + + +/* DBUS link port driver */ + +/* Link port / assist mode flags */ +enum { + TILEM_LINK_MODE_ASSIST = 1, /* Enable link assist */ + TILEM_LINK_MODE_NO_TIMEOUT = 2, /* Assist doesn't time out (xp) */ + TILEM_LINK_MODE_INT_ON_ACTIVE = 4, /* Interrupt on state change */ + TILEM_LINK_MODE_INT_ON_READ = 8, /* Interrupt on asst. read */ + TILEM_LINK_MODE_INT_ON_IDLE = 16, /* Interrupt when asst. idle */ + TILEM_LINK_MODE_INT_ON_ERROR = 32 /* Interrupt on asst. error */ +}; + +/* Link port state flags */ +enum { + TILEM_LINK_ASSIST_READ_BYTE = 1, /* Assisted read finished */ + TILEM_LINK_ASSIST_READ_BUSY = 2, /* Assisted read in progress */ + TILEM_LINK_ASSIST_READ_ERROR = 4, /* Assisted read failed */ + TILEM_LINK_ASSIST_WRITE_BUSY = 8, /* Assisted write in progress */ + TILEM_LINK_ASSIST_WRITE_ERROR = 16 /* Assisted write failed */ +}; + +/* Link emulation mode */ +enum { + TILEM_LINK_EMULATOR_NONE = 0, /* Link port disconnected */ + TILEM_LINK_EMULATOR_BLACK = 1, /* Connected to virtual BlackLink + (exit emulation on state change) */ + TILEM_LINK_EMULATOR_GRAY = 2 /* Connected to virtual GrayLink + (auto send/receive bytes) */ +}; + +typedef struct _TilemLinkport { + byte lines, extlines; /* Link line state for TI/PC + 0 = both lines high + 1 = red wire low + 2 = white wire low + 3 = both wires low */ + + unsigned int mode; /* Mode flags */ + + /* Internal link assist */ + unsigned int assistflags; /* Assist state */ + byte assistin; /* Input buffer (recv from PC) */ + byte assistinbits; /* Input bit count */ + byte assistout; /* Output buffer (send to PC) */ + byte assistoutbits; /* Output bit count */ + byte assistlastbyte; /* Last byte received */ + + /* External link emulator */ + byte linkemu; + byte graylinkin; /* Input buffer (recv from TI) */ + byte graylinkinbits; /* Input bit count */ + byte graylinkout; /* Output buffer (send to TI) */ + byte graylinkoutbits; /* Output bit count */ +} TilemLinkport; + +/* Reset link port */ +void tilem_linkport_reset(TilemCalc* calc); + +/* Read link port lines */ +byte tilem_linkport_get_lines(TilemCalc* calc); + +/* Set link port lines */ +void tilem_linkport_set_lines(TilemCalc* calc, byte lines); + +/* Read from, and clear, link assist input buffer */ +byte tilem_linkport_read_byte(TilemCalc* calc); + +/* Write to link assist output buffer */ +void tilem_linkport_write_byte(TilemCalc* calc, byte data); + +/* Get assist state */ +unsigned int tilem_linkport_get_assist_flags(TilemCalc* calc); + +/* Set link port mode */ +void tilem_linkport_set_mode(TilemCalc* calc, unsigned int mode); + +/* Set line states for virtual BlackLink */ +void tilem_linkport_blacklink_set_lines(TilemCalc* calc, byte lines); + +/* Get line states from virtual BlackLink */ +byte tilem_linkport_blacklink_get_lines(TilemCalc* calc); + +/* Reset GrayLink */ +void tilem_linkport_graylink_reset(TilemCalc* calc); + +/* Check if GrayLink is ready to send data */ +int tilem_linkport_graylink_ready(TilemCalc* calc); + +/* Send a byte via virtual GrayLink */ +int tilem_linkport_graylink_send_byte(TilemCalc* calc, byte value); + +/* Get byte received by virtual GrayLink (-1 = none available) */ +int tilem_linkport_graylink_get_byte(TilemCalc* calc); + +/* Callback for TILEM_TIMER_LINK_ASSIST */ +void tilem_linkport_assist_timer(TilemCalc* calc, void* data); + + +/* Keypad */ + +typedef struct _TilemKeypad { + byte group; + byte onkeydown; + byte onkeyint; + byte keysdown[8]; +} TilemKeypad; + +/* Reset keypad */ +void tilem_keypad_reset(TilemCalc* calc); + +/* Set current group (port 1 output) */ +void tilem_keypad_set_group(TilemCalc* calc, byte group); + +/* Read keys from current group (port 1 input) */ +byte tilem_keypad_read_keys(TilemCalc* calc); + +/* Press a key */ +void tilem_keypad_press_key(TilemCalc* calc, int scancode); + +/* Release a key */ +void tilem_keypad_release_key(TilemCalc* calc, int scancode); + + +/* Flash */ + +/* Emulation flags */ +enum { + TILEM_FLASH_REQUIRE_DELAY = 1 /* Require delay after + program/erase */ +}; + +typedef struct _TilemFlashSector { + dword start; + dword size; + byte protectgroup; +} TilemFlashSector; + +typedef struct _TilemFlash { + byte unlock; + byte state; + unsigned int emuflags; + byte busy; + dword progaddr; + byte progbyte; + byte toggles; + byte overridegroup; +} TilemFlash; + +/* Reset Flash */ +void tilem_flash_reset(TilemCalc* calc); + +/* Read a byte from the Flash chip */ +byte tilem_flash_read_byte(TilemCalc* calc, dword pa); + +/* Erase a Flash sector */ +void tilem_flash_erase_address(TilemCalc* calc, dword pa); + +/* Write a byte to the Flash chip */ +void tilem_flash_write_byte(TilemCalc* calc, dword pa, byte v); + +/* Callback for TILEM_TIMER_FLASH_DELAY */ +void tilem_flash_delay_timer(TilemCalc* calc, void* data); + + +/* MD5 assist */ + +enum { + TILEM_MD5_REG_A = 0, /* initial 'a' value */ + TILEM_MD5_REG_B = 1, /* 'b' value */ + TILEM_MD5_REG_C = 2, /* 'c' value */ + TILEM_MD5_REG_D = 3, /* 'd' value */ + TILEM_MD5_REG_X = 4, /* 'X' (or 'T') value */ + TILEM_MD5_REG_T = 5 /* 'T' (or 'X') value */ +}; + +enum { + TILEM_MD5_FUNC_FF = 0, + TILEM_MD5_FUNC_GG = 1, + TILEM_MD5_FUNC_HH = 2, + TILEM_MD5_FUNC_II = 3 +}; + +typedef struct _TilemMD5Assist { + dword regs[6]; + byte shift; + byte mode; +} TilemMD5Assist; + +/* Reset MD5 assist */ +void tilem_md5_assist_reset(TilemCalc* calc); + +/* Get output value */ +dword tilem_md5_assist_get_value(TilemCalc* calc); + + +/* Programmable timers */ + +#define TILEM_MAX_USER_TIMERS 3 + +enum { + TILEM_USER_TIMER_LOOP = 1, /* loop when counter + reaches 0 */ + TILEM_USER_TIMER_INTERRUPT = 2, /* generate interrupt when + finished */ + TILEM_USER_TIMER_OVERFLOW = 4, /* timer has expired at + least twice since last + mode setting */ + TILEM_USER_TIMER_FINISHED = 256, /* timer has expired at + least once since last + mode setting (port 4 + status bit) */ + TILEM_USER_TIMER_NO_HALT_INT = 512 /* suppress interrupt if + CPU is halted */ +}; + +typedef struct _TilemUserTimer { + byte frequency; + byte loopvalue; + unsigned int status; +} TilemUserTimer; + +/* Reset timers */ +void tilem_user_timers_reset(TilemCalc* calc); + +/* Set frequency control register */ +void tilem_user_timer_set_frequency(TilemCalc* calc, int n, byte value); + +/* Set status flags */ +void tilem_user_timer_set_mode(TilemCalc* calc, int n, byte mode); + +/* Start timer */ +void tilem_user_timer_start(TilemCalc* calc, int n, byte value); + +/* Get timer value */ +byte tilem_user_timer_get_value(TilemCalc* calc, int n); + +/* Callback function */ +void tilem_user_timer_expired(TilemCalc* calc, void* data); + + +/* Calculators */ + +/* Model IDs */ +enum { + TILEM_CALC_TI73 = '7', /* TI-73 / TI-73 Explorer */ + TILEM_CALC_TI76 = 'f', /* TI-76.fr */ + TILEM_CALC_TI81 = '1', /* TI-81 */ + TILEM_CALC_TI82 = '2', /* TI-82 */ + TILEM_CALC_TI83 = '3', /* TI-83 / TI-82 STATS [.fr] */ + TILEM_CALC_TI83P = 'p', /* TI-83 Plus */ + TILEM_CALC_TI83P_SE = 's', /* TI-83 Plus Silver Edition */ + TILEM_CALC_TI84P = '4', /* TI-84 Plus */ + TILEM_CALC_TI84P_SE = 'z', /* TI-84 Plus Silver Edition */ + TILEM_CALC_TI84P_NSPIRE = 'n', /* TI-Nspire 84 Plus emulator */ + TILEM_CALC_TI85 = '5', /* TI-85 */ + TILEM_CALC_TI86 = '6' /* TI-86 */ +}; + +/* Calculator flags */ +enum { + TILEM_CALC_HAS_LINK = 1, /* Has link port */ + TILEM_CALC_HAS_LINK_ASSIST = 2, /* Has hardware link assist */ + TILEM_CALC_HAS_USB = 4, /* Has USB controller */ + TILEM_CALC_HAS_FLASH = 8, /* Has (writable) Flash */ + TILEM_CALC_HAS_T6A04 = 16, /* Has separate LCD driver */ + TILEM_CALC_HAS_MD5_ASSIST = 32 /* Has hardware MD5 assist */ +}; + +/* Calculator hardware description */ +struct _TilemHardware { + char model_id; /* Single character identifying model */ + const char* name; /* Short name (e.g. ti83p) */ + const char* desc; /* Full name (e.g. TI-83 Plus) */ + + unsigned int flags; + + int lcdwidth, lcdheight; /* Size of LCD */ + dword romsize, ramsize; /* Size of ROM and RAM */ + dword lcdmemsize; /* Size of external LCD memory */ + byte rampagemask; /* Bit mask used for RAM page */ + + int nflashsectors; + const TilemFlashSector* flashsectors; + + int nusertimers; + + int nhwregs; /* Number of hardware registers */ + const char** hwregnames; /* Harware register names */ + + int nhwtimers; /* Number of hardware timers */ + const char** hwtimernames; /* Hardware timer names*/ + + const char** keynames; + + /* Reset calculator */ + void (*reset) (TilemCalc*); + + /* Reinitialize after loading state */ + void (*stateloaded) (TilemCalc*, int); + + /* Z80 ports and memory */ + byte (*z80_in) (TilemCalc*, dword); + void (*z80_out) (TilemCalc*, dword, byte); + void (*z80_wrmem) (TilemCalc*, dword, byte); + byte (*z80_rdmem) (TilemCalc*, dword); + byte (*z80_rdmem_m1) (TilemCalc*, dword); + + /* Evaluate a non-standard instruction */ + void (*z80_instr) (TilemCalc*, dword); + + /* Persistent timer callback */ + void (*z80_ptimer) (TilemCalc*, int); + + /* Retrieve LCD contents */ + void (*get_lcd) (TilemCalc*, byte*); + + /* Convert physical <-> logical addresses */ + dword (*mem_ltop) (TilemCalc*, dword); + dword (*mem_ptol) (TilemCalc*, dword); +}; + +/* Current state of the calculator */ +struct _TilemCalc { + TilemHardware hw; + + TilemZ80 z80; + byte* mem; + byte* ram; + byte* lcdmem; + byte mempagemap[4]; + + TilemLCD lcd; + TilemLinkport linkport; + TilemKeypad keypad; + TilemFlash flash; + TilemMD5Assist md5assist; + TilemUserTimer usertimers[TILEM_MAX_USER_TIMERS]; + + byte poweronhalt; /* System power control. If this is + zero, turn off LCD, timers, + etc. when CPU halts */ + + byte battery; /* Battery level (units of 0.1 V) */ + + dword* hwregs; +}; + +/* Get a list of supported hardware models */ +void tilem_get_supported_hardware(const TilemHardware*** models, + int* nmodels); + +/* Create a new calculator. This function returns NULL if + insufficient memory is available. */ +TilemCalc* tilem_calc_new(char id); + +/* Make an exact copy of an existing calculator (including both + internal and external state.) Be careful when using this in + conjunction with custom timer/breakpoint callback functions. This + function returns NULL if insufficient memory is available. */ +TilemCalc* tilem_calc_copy(TilemCalc* calc); + +/* Free a calculator that was previously created by tilem_calc_new() + or tilem_calc_copy(). */ +void tilem_calc_free(TilemCalc* calc); + +/* Reset calculator (essentially, remove and replace batteries.) */ +void tilem_calc_reset(TilemCalc* calc); + +/* Load calculator state from ROM and/or save files. */ +int tilem_calc_load_state(TilemCalc* calc, FILE* romfile, FILE* savfile); + +/* Save calculator state to ROM and/or save files. */ +int tilem_calc_save_state(TilemCalc* calc, FILE* romfile, FILE* savfile); + + +/* LCD image conversion/scaling */ + +/* Scaling algorithms */ +enum { + TILEM_SCALE_FAST = 0, /* Fast scaling (nearest neighbor) - + looks lousy unless the scaling + factor is fairly large */ + TILEM_SCALE_SMOOTH /* Smooth scaling - slower and looks + better at small sizes; note that + this falls back to using the "fast" + algorithm if we are scaling up by + an integer factor */ +}; + +/* Buffer representing a snapshot of the LCD state */ +typedef struct _TilemLCDBuffer { + byte width; /* Width of LCD */ + byte height; /* Height of LCD */ + byte rowstride; /* Offset between rows in buffer */ + byte contrast; /* Contrast value (0-63) */ + dword stamp; /* Timestamp */ + dword tmpbufsize; /* Size of temporary buffer */ + byte *data; /* Image data (rowstride*height bytes) */ + void *tmpbuf; /* Temporary buffer used for scaling */ +} TilemLCDBuffer; + +/* Create new TilemLCDBuffer. */ +TilemLCDBuffer* tilem_lcd_buffer_new(void) + TILEM_ATTR_MALLOC; + +/* Free a TilemLCDBuffer. */ +void tilem_lcd_buffer_free(TilemLCDBuffer *buf); + +/* Convert current LCD memory contents to a TilemLCDBuffer (i.e., a + monochrome snapshot.) */ +void tilem_lcd_get_frame(TilemCalc * restrict calc, + TilemLCDBuffer * restrict buf); + +/* Convert current LCD memory contents to a TilemLCDBuffer (i.e., a + monochrome snapshot.) + Output is only 0 and 1 */ +void tilem_lcd_get_frame1(TilemCalc * restrict calc, + TilemLCDBuffer * restrict buf); + +/* Convert and scale image to an 8-bit indexed image buffer. IMGWIDTH + and IMGHEIGHT are the width and height of the output image, + ROWSTRIDE the number of bytes from the start of one row to the next + (often equal to IMGWIDTH), and SCALETYPE the scaling algorithm to + use. */ +void tilem_draw_lcd_image_indexed(TilemLCDBuffer * restrict frm, + byte * restrict buffer, + int imgwidth, int imgheight, + int rowstride, int scaletype); + +/* Convert and scale image to a 24-bit RGB or 32-bit RGBA image + buffer. IMGWIDTH and IMGHEIGHT are the width and height of the + output image, ROWSTRIDE the number of bytes from the start of one + row to the next (often equal to 3 * IMGWIDTH), PIXBYTES the number + of bytes per pixel (3 or 4), and SCALETYPE the scaling algorithm to + use. PALETTE is an array of 256 color values. */ +void tilem_draw_lcd_image_rgb(TilemLCDBuffer * restrict frm, + byte * restrict buffer, + int imgwidth, int imgheight, int rowstride, + int pixbytes, const dword * restrict palette, + int scaletype); + +/* Calculate a color palette for use with the above functions. + RLIGHT, GLIGHT, BLIGHT are the RGB components (0 to 255) of the + lightest possible color; RDARK, GDARK, BDARK are the RGB components + of the darkest possible color. GAMMA is the gamma value for the + output device (2.2 for most current computer displays and image + file formats.) */ +dword* tilem_color_palette_new(int rlight, int glight, int blight, + int rdark, int gdark, int bdark, + double gamma); + +/* Calculate a color palette, as above, and convert it to a packed + array of bytes (R, G, B) */ +byte* tilem_color_palette_new_packed(int rlight, int glight, int blight, + int rdark, int gdark, int bdark, + double gamma); + + +/* Grayscale LCD simulation */ + +typedef struct _TilemGrayLCD TilemGrayLCD; + +/* Create a new LCD and attach to a calculator. Sampling for + grayscale is done across WINDOWSIZE frames, with samples taken + every SAMPLEINT microseconds. */ +TilemGrayLCD* tilem_gray_lcd_new(TilemCalc *calc, int windowsize, + int sampleint); + +/* Detach and free an LCD. */ +void tilem_gray_lcd_free(TilemGrayLCD *glcd); + +/* Generate a grayscale image for the next frame, based on current + calculator state. This function also updates the frame counter and + internal state; for proper grayscale behavior, this function needs + to be called at regular intervals. */ +void tilem_gray_lcd_get_frame(TilemGrayLCD * restrict glcd, + TilemLCDBuffer * restrict frm); + + +/* Miscellaneous functions */ + +/* Guess calculator type for a ROM file */ +char tilem_guess_rom_type(FILE* romfile); + +/* Get calculator type for a SAV file */ +char tilem_get_sav_type(FILE* savfile); + +/* Check validity of calculator certificate; repair if necessary */ +void tilem_calc_fix_certificate(TilemCalc* calc, byte* cert, + int app_start, int app_end, + unsigned exptab_offset); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/tool/tilem-src/emu/tilemint.h b/tool/tilem-src/emu/tilemint.h new file mode 100644 index 0000000..0e95956 --- /dev/null +++ b/tool/tilem-src/emu/tilemint.h @@ -0,0 +1,12 @@ +#ifndef _TILEMINT_H +#define _TILEMINT_H + +#ifdef HAVE_STDINTS1_H +# include +#elif defined(HAVE_STDINTS2_H) +# include +#else +# include +#endif + +#endif diff --git a/tool/tilem-src/emu/timers.c b/tool/tilem-src/emu/timers.c new file mode 100644 index 0000000..967aa73 --- /dev/null +++ b/tool/tilem-src/emu/timers.c @@ -0,0 +1,231 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include "tilem.h" + +void tilem_user_timers_reset(TilemCalc* calc) +{ + int i; + + for (i = 0; i < TILEM_MAX_USER_TIMERS; i++) { + tilem_z80_set_timer(calc, TILEM_TIMER_USER1 + i, 0, 0, 0); + calc->usertimers[i].frequency = 0; + calc->usertimers[i].loopvalue = 0; + calc->usertimers[i].status = 0; + } +} + +static inline dword get_duration(int fvalue, int nticks) +{ + qword t=0; + + if (fvalue & 0x80) { + if (fvalue & 0x20) + return 64 * nticks; + else if (fvalue & 0x10) + return 32 * nticks; + else if (fvalue & 0x08) + return 16 * nticks; + else if (fvalue & 0x04) + return 8 * nticks; + else if (fvalue & 0x02) + return 4 * nticks; + else if (fvalue & 0x01) + return 2 * nticks; + else + return nticks; + } + else if (fvalue & 0x40) { + switch (fvalue & 7) { + case 0: + t = 3000000; + break; + case 1: + t = 33000000; + break; + case 2: + t = 328000000; + break; + case 3: + t = 0xC3530D40; //3277000000; + break; + case 4: + t = 1000000; + break; + case 5: + t = 16000000; + break; + case 6: + t = 256000000; + break; + case 7: + t = 0xF4240000; //4096000000; + break; + } + + return ((t * nticks + 16384) / 32768); + } + + return 0; +} + +static dword get_normal_duration(const TilemUserTimer* tmr) +{ + if (tmr->loopvalue) + return get_duration(tmr->frequency, tmr->loopvalue); + else + return get_duration(tmr->frequency, 256); +} + +static dword get_overflow_duration(const TilemUserTimer* tmr) +{ + return get_duration(tmr->frequency, 256); +} + +void tilem_user_timer_set_frequency(TilemCalc* calc, int n, byte value) +{ + TilemUserTimer* tmr = &calc->usertimers[n]; + + /* writing to frequency control port stops timer; set + loopvalue to the current value of the counter */ + tmr->loopvalue = tilem_user_timer_get_value(calc, n); + tilem_z80_set_timer(calc, TILEM_TIMER_USER1 + n, 0, 0, 0); + tmr->frequency = value; +} + +void tilem_user_timer_set_mode(TilemCalc* calc, int n, byte mode) +{ + TilemUserTimer* tmr = &calc->usertimers[n]; + + /* setting mode clears "finished" and "overflow" flags */ + tmr->status = ((tmr->status & TILEM_USER_TIMER_NO_HALT_INT) + | (mode & 3)); + + calc->z80.interrupts &= ~(TILEM_INTERRUPT_USER_TIMER1 << n); + + /* if timer is currently running, it will not overflow the + next time it expires -> set period to normal */ + if ((mode & TILEM_USER_TIMER_LOOP) || tmr->loopvalue == 0) { + tilem_z80_set_timer_period(calc, TILEM_TIMER_USER1 + n, + get_normal_duration(tmr)); + } + else { + tilem_z80_set_timer_period(calc, TILEM_TIMER_USER1 + n, 0); + } +} + +void tilem_user_timer_start(TilemCalc* calc, int n, byte value) +{ + TilemUserTimer* tmr = &calc->usertimers[n]; + dword count, period; + + tmr->loopvalue = value; + + /* if a valid frequency is set, then writing to value port + starts timer */ + + count = get_normal_duration(tmr); + if (!count) + return; + + if (!value) { + /* input value 0 means loop indefinitely */ + period = get_overflow_duration(tmr); + } + else if (tmr->status & TILEM_USER_TIMER_FINISHED) { + /* timer has already expired once -> it will overflow + the next time it expires (note that this happens + even if the loop flag isn't set) */ + period = get_overflow_duration(tmr); + } + else if (!(tmr->status & TILEM_USER_TIMER_LOOP)) { + /* don't loop */ + period = 0; + } + else { + /* timer hasn't expired yet; second iteration starts + from the same counter value as the first */ + period = count; + } + + tilem_z80_set_timer(calc, TILEM_TIMER_USER1 + n, count, period, + (calc->usertimers[n].frequency & 0x80 ? 0 : 1)); +} + +byte tilem_user_timer_get_value(TilemCalc* calc, int n) +{ + TilemUserTimer* tmr = &calc->usertimers[n]; + dword period; + + if (!tilem_z80_timer_running(calc, TILEM_TIMER_USER1 + n)) + return tmr->loopvalue; + + period = get_overflow_duration(tmr); + + if (tmr->frequency & 0x80) { + dword t = tilem_z80_get_timer_clocks + (calc, TILEM_TIMER_USER1 + n); + return ((t * 256) / period) % 256; + } + else { + qword t = tilem_z80_get_timer_microseconds + (calc, TILEM_TIMER_USER1 + n); + return ((t * 256) / period) % 256; + } +} + +void tilem_user_timer_expired(TilemCalc* calc, void* data) +{ + int n = TILEM_PTR_TO_DWORD(data); + TilemUserTimer* tmr = &calc->usertimers[n]; + + /* input value 0 means loop indefinitely (don't set flags) */ + if (!tmr->loopvalue) { + return; + } + + /* if timer has already finished, set "overflow" flag */ + if (tmr->status & TILEM_USER_TIMER_FINISHED) { + tmr->status |= TILEM_USER_TIMER_OVERFLOW; + } + + /* set "finished" flag */ + tmr->status |= TILEM_USER_TIMER_FINISHED; + + /* generate interrupt if appropriate */ + if ((tmr->status & TILEM_USER_TIMER_INTERRUPT) + && (!(tmr->status & TILEM_USER_TIMER_NO_HALT_INT) + || !calc->z80.halted)) { + calc->z80.interrupts |= (TILEM_INTERRUPT_USER_TIMER1 << n); + } + + if (tmr->status & TILEM_USER_TIMER_LOOP) { + /* timer will overflow the next time it expires + (unless user writes to the mode port before + then) */ + tilem_z80_set_timer_period(calc, TILEM_TIMER_USER1 + n, + get_overflow_duration(tmr)); + } +} diff --git a/tool/tilem-src/emu/x1/x1.h b/tool/tilem-src/emu/x1/x1.h new file mode 100644 index 0000000..eecb19e --- /dev/null +++ b/tool/tilem-src/emu/x1/x1.h @@ -0,0 +1,53 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifndef _TILEM_X1_H +#define _TILEM_X1_H + +enum { + HW_VERSION, /* HW version: 0 = unknown + 1 = original HW (1990-1992) + 2 = revised HW (1992-1996) */ + PORT2, /* memory mapping control (new HW) */ + PORT3, /* mask of enabled interrupts */ + PORT4, /* mapping mode, timer control */ + PORT5, /* memory mapping bank A (old HW) */ + PORT6, /* memory mapping bank B (old HW) */ + NUM_HW_REGS +}; + +#define HW_REG_NAMES { "hw_version", "port2", "port3", "port4", "port5", "port6" } + +#define TIMER_INT (TILEM_NUM_SYS_TIMERS + 1) +#define NUM_HW_TIMERS 1 + +#define HW_TIMER_NAMES { "int" } + +void x1_reset(TilemCalc* calc); +byte x1_z80_in(TilemCalc* calc, dword port); +void x1_z80_out(TilemCalc* calc, dword port, byte value); +void x1_z80_ptimer(TilemCalc* calc, int id); +void x1_z80_wrmem(TilemCalc* calc, dword addr, byte value); +byte x1_z80_rdmem(TilemCalc* calc, dword addr); +dword x1_mem_ltop(TilemCalc* calc, dword addr); +dword x1_mem_ptol(TilemCalc* calc, dword addr); +void x1_get_lcd(TilemCalc* calc, byte* data); + +#endif diff --git a/tool/tilem-src/emu/x1/x1_init.c b/tool/tilem-src/emu/x1/x1_init.c new file mode 100644 index 0000000..962b4b1 --- /dev/null +++ b/tool/tilem-src/emu/x1/x1_init.c @@ -0,0 +1,50 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "x1.h" + +void x1_reset(TilemCalc* calc) +{ + calc->hwregs[PORT3] = 0x08; + calc->hwregs[PORT2] = 0x00; + calc->hwregs[PORT5] = 0x00; + calc->hwregs[PORT6] = 0x00; + + calc->mempagemap[0] = 0x00; + calc->mempagemap[1] = 0x01; + calc->mempagemap[2] = 0x00; + calc->mempagemap[3] = 0x02; + + if (calc->hwregs[HW_VERSION] != 2) + calc->lcd.rowstride = 12; + + tilem_z80_set_speed(calc, 2000); + + /* FIXME: measure actual frequency */ + tilem_z80_set_timer(calc, TIMER_INT, 6000, 6000, 1); +} diff --git a/tool/tilem-src/emu/x1/x1_io.c b/tool/tilem-src/emu/x1/x1_io.c new file mode 100644 index 0000000..b46977d --- /dev/null +++ b/tool/tilem-src/emu/x1/x1_io.c @@ -0,0 +1,237 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2011 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "x1.h" + +byte x1_z80_in(TilemCalc* calc, dword port) +{ + byte v; + + if (calc->hwregs[HW_VERSION] == 1) + port &= 7; + + switch(port&0x1f) { + case 0x01: + return(tilem_keypad_read_keys(calc)); + + case 0x02: + return(calc->hwregs[PORT2]); + + case 0x03: + v = (calc->keypad.onkeydown ? 0x00: 0x08); + + if (calc->z80.interrupts & TILEM_INTERRUPT_ON_KEY) + v |= 0x01; + if (calc->z80.interrupts & TILEM_INTERRUPT_TIMER1) + v |= 0x02; + + return(v); + + case 0x05: + return(calc->hwregs[PORT5]); + + case 0x06: + return(calc->hwregs[PORT6]); + + case 0x10: + return(tilem_lcd_t6a04_status(calc)); + + case 0x11: + return(tilem_lcd_t6a04_read(calc)); + } + + tilem_warning(calc, "Input from port %x", port); + return(0x00); +} + + +static void setup_mapping(TilemCalc* calc) +{ + int pageA, pageB; + + switch (calc->hwregs[HW_VERSION]) { + case 1: + if (calc->hwregs[PORT5] & 0x40) + pageA = 2; + else if (calc->hwregs[PORT5] & 1) + pageA = 1; + else + pageA = 0; + + if (calc->hwregs[PORT6] & 0x40) + pageB = 2; + else if (calc->hwregs[PORT6] & 1) + pageB = 1; + else + pageB = 0; + break; + + case 2: + if (calc->hwregs[PORT2] & 0x40) + pageA = 2; + else if (calc->hwregs[PORT2] & 1) + pageA = 1; + else + pageA = 0; + + if (calc->hwregs[PORT2] & 0x80) + pageB = 2; + else if (calc->hwregs[PORT2] & 8) + pageB = 1; + else + pageB = 0; + break; + + default: + /* unknown HW version - ignore all output values and + use standard mapping */ + pageA = 1; + pageB = 0; + } + + calc->mempagemap[1] = pageA; + calc->mempagemap[2] = pageB; + calc->mempagemap[3] = 2; +} + +void x1_z80_out(TilemCalc* calc, dword port, byte value) +{ + if (!calc->hwregs[HW_VERSION] && calc->z80.r.pc.d < 0x8000) { + /* detect version */ + if (port == 0x05 || port == 0x06) { + calc->hwregs[HW_VERSION] = 1; + setup_mapping(calc); + } + else if (port == 0x10 || port == 0x11) { + calc->lcd.rowstride = 15; + calc->hwregs[HW_VERSION] = 2; + setup_mapping(calc); + } + } + + if (calc->hwregs[HW_VERSION] == 1) + port &= 7; + + switch(port&0x1f) { + case 0x00: + calc->lcd.addr = ((value & 0x1f) << 8); + calc->z80.lastlcdwrite = calc->z80.clock; + break; + + case 0x01: + tilem_keypad_set_group(calc, value); + break; + + case 0x02: + calc->hwregs[PORT2] = value; + if (calc->hwregs[HW_VERSION] != 2) + calc->lcd.contrast = 16 + (value & 0x1f); + setup_mapping(calc); + break; + + case 0x03: + if (value & 0x01) { + calc->keypad.onkeyint = 1; + } + else { + calc->z80.interrupts &= ~TILEM_INTERRUPT_ON_KEY; + calc->keypad.onkeyint = 0; + } + + if (!(value & 0x02)) { + calc->z80.interrupts &= ~TILEM_INTERRUPT_TIMER1; + } + + calc->hwregs[PORT3] = value; + calc->lcd.active = calc->poweronhalt = ((value & 8) >> 3); + break; + + case 0x04: + calc->hwregs[PORT4] = value; + + if (calc->hwregs[HW_VERSION] == 1) { + switch (value & 0x18) { + case 0x00: + calc->lcd.rowstride = 10; + break; + + case 0x08: + calc->lcd.rowstride = 12; + break; + + case 0x10: + calc->lcd.rowstride = 16; + break; + + case 0x18: + calc->lcd.rowstride = 20; + break; + } + calc->z80.lastlcdwrite = calc->z80.clock; + } + break; + + case 0x05: + calc->hwregs[PORT5] = value; + setup_mapping(calc); + break; + + case 0x06: + calc->hwregs[PORT6] = value; + setup_mapping(calc); + break; + + case 0x10: + tilem_lcd_t6a04_control(calc, value); + break; + + case 0x11: + tilem_lcd_t6a04_write(calc, value); + break; + } + + return; +} + +void x1_z80_ptimer(TilemCalc* calc, int id) +{ + switch (id) { + case TIMER_INT: + if (calc->hwregs[PORT3] & 0x02) + calc->z80.interrupts |= TILEM_INTERRUPT_TIMER1; + break; + } +} + +void x1_get_lcd(TilemCalc* calc, byte* data) +{ + if (calc->hwregs[HW_VERSION] == 2) + tilem_lcd_t6a04_get_data(calc, data); + else + tilem_lcd_t6a43_get_data(calc, data); +} diff --git a/tool/tilem-src/emu/x1/x1_memory.c b/tool/tilem-src/emu/x1/x1_memory.c new file mode 100644 index 0000000..34c860e --- /dev/null +++ b/tool/tilem-src/emu/x1/x1_memory.c @@ -0,0 +1,71 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2011 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "x1.h" + +void x1_z80_wrmem(TilemCalc* calc, dword A, byte v) +{ + dword pa = 0x4000 * calc->mempagemap[(A)>>14] + (A & 0x3FFF); + + if (pa >= 0x8000) { + *(calc->mem + 0x8000 + (pa & 0x1fff)) = v; + + if ((((pa - 0x8000 - calc->lcd.addr) >> 6) + < (unsigned) calc->lcd.rowstride) + && calc->hwregs[HW_VERSION] < 2) + calc->z80.lastlcdwrite = calc->z80.clock; + } +} + +byte x1_z80_rdmem(TilemCalc* calc, dword A) +{ + dword pa = 0x4000 * calc->mempagemap[(A)>>14] + (A & 0x3FFF); + + if (pa >= 0x8000) + return (*(calc->mem + 0x8000 + (pa & 0x1fff))); + else + return (*(calc->mem + (pa & 0x7fff))); +} + +dword x1_mem_ltop(TilemCalc* calc, dword A) +{ + dword pa = 0x4000 * calc->mempagemap[(A)>>14] + (A & 0x3FFF); + + if (pa >= 0x8000) + return (0x8000 + (pa & 0x1fff)); + else + return (pa); +} + +dword x1_mem_ptol(TilemCalc* calc TILEM_ATTR_UNUSED, dword A) +{ + if (A & 0x8000) + return (0xE000 + (A & 0x1fff)); + else + return (A); +} diff --git a/tool/tilem-src/emu/x1/x1_subcore.c b/tool/tilem-src/emu/x1/x1_subcore.c new file mode 100644 index 0000000..2f82856 --- /dev/null +++ b/tool/tilem-src/emu/x1/x1_subcore.c @@ -0,0 +1,56 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "x1.h" + +static const char* hwregnames[NUM_HW_REGS] = HW_REG_NAMES; + +static const char* hwtimernames[NUM_HW_TIMERS] = HW_TIMER_NAMES; + +static const char* keynames[64] = { + "Down", "Left", "Right", "Up", 0, 0, 0, 0, + "Enter", "Add", "Sub", "Mul", "Div", "Power", "Clear", 0, + "Chs", "3", "6", "9", "RParen", "Tan", "Vars", 0, + "DecPnt", "2", "5", "8", "LParen", "Cos", "Prgm", "Mode", + "0", "1", "4", "7", "EE", "Sin", "Matrix", "Graphvar", + "On", "Store", "Ln", "Log", "Square", "Recip", "Math", "Alpha", + "Graph", "Trace", "Zoom", "Range", "YEqu", "2nd", "Ins", "Del", + 0, 0, 0, 0, 0, 0, 0, 0}; + +const TilemHardware hardware_ti81 = { + '1', "ti81", "TI-81", TILEM_CALC_HAS_T6A04, + 96, 64, 0x8000, 0x2000, 15 * 64, 0x40, + 0, NULL, 0, + NUM_HW_REGS, hwregnames, + NUM_HW_TIMERS, hwtimernames, + keynames, + x1_reset, NULL, + x1_z80_in, x1_z80_out, + x1_z80_wrmem, x1_z80_rdmem, x1_z80_rdmem, NULL, + x1_z80_ptimer, x1_get_lcd, + x1_mem_ltop, x1_mem_ptol }; diff --git a/tool/tilem-src/emu/x2/x2.h b/tool/tilem-src/emu/x2/x2.h new file mode 100644 index 0000000..cfa6093 --- /dev/null +++ b/tool/tilem-src/emu/x2/x2.h @@ -0,0 +1,51 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifndef _TILEM_X2_H +#define _TILEM_X2_H + +enum { + HW_VERSION, /* HW version: 0 = unknown + 1 = original HW (1993-2000) + 2 = revised HW (2001-2003) */ + PORT0, /* port 0 (link port control) */ + PORT2, /* port 2 (memory mapping) */ + PORT3, /* mask of enabled interrupts */ + PORT4, /* mapping mode + timer speed */ + NUM_HW_REGS +}; + +#define HW_REG_NAMES { "hw_version", "port0", "port2", "port3", "port4" } + +#define TIMER_INT (TILEM_NUM_SYS_TIMERS + 1) +#define NUM_HW_TIMERS 1 + +#define HW_TIMER_NAMES { "int" } + +void x2_reset(TilemCalc* calc); +byte x2_z80_in(TilemCalc* calc, dword port); +void x2_z80_out(TilemCalc* calc, dword port, byte value); +void x2_z80_ptimer(TilemCalc* calc, int id); +void x2_z80_wrmem(TilemCalc* calc, dword addr, byte value); +byte x2_z80_rdmem(TilemCalc* calc, dword addr); +dword x2_mem_ltop(TilemCalc* calc, dword addr); +dword x2_mem_ptol(TilemCalc* calc, dword addr); + +#endif diff --git a/tool/tilem-src/emu/x2/x2_init.c b/tool/tilem-src/emu/x2/x2_init.c new file mode 100644 index 0000000..1e83119 --- /dev/null +++ b/tool/tilem-src/emu/x2/x2_init.c @@ -0,0 +1,46 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "x2.h" + +void x2_reset(TilemCalc* calc) +{ + calc->hwregs[PORT2] = 0xF8; + calc->hwregs[PORT3] = 0x0B; + calc->hwregs[PORT4] = 0x00; + + calc->mempagemap[0] = 0x00; + calc->mempagemap[1] = 0x00; + calc->mempagemap[2] = 0x09; + calc->mempagemap[3] = 0x08; + + tilem_z80_set_speed(calc, 6000); + + /* FIXME: measure actual frequency */ + tilem_z80_set_timer(calc, TIMER_INT, 1000, 9259, 1); +} diff --git a/tool/tilem-src/emu/x2/x2_io.c b/tool/tilem-src/emu/x2/x2_io.c new file mode 100644 index 0000000..f8e3121 --- /dev/null +++ b/tool/tilem-src/emu/x2/x2_io.c @@ -0,0 +1,207 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "x2.h" + +byte x2_z80_in(TilemCalc* calc, dword port) +{ + static const byte battlevel[4] = { 33, 39, 36, 43 }; + byte v, b; + + switch(port&0xff) { + case 0x00: + v = tilem_linkport_get_lines(calc); + + if (calc->hwregs[HW_VERSION] == 1) { + /* HW version 1 uses separate PCR/PDR, as the + TI-85 does. */ + b = (calc->hwregs[PORT0] >> 4) | 0xf0; + return ((calc->hwregs[PORT0] & b) | (v & ~b)); + } + else { + /* HW version 2 uses a TI-83-like interface. + (Do the same if version is unknown, because + most code written for HW version 1 will + work fine with these values.) */ + return (0xc0 | (v * 5)); + } + + case 0x01: + return(tilem_keypad_read_keys(calc)); + + case 0x02: + return(calc->hwregs[PORT2]); + + case 0x03: + v = (calc->keypad.onkeydown ? 0x00: 0x08); + + if (calc->z80.interrupts & TILEM_INTERRUPT_ON_KEY) + v |= 0x01; + if (calc->z80.interrupts & TILEM_INTERRUPT_TIMER1) + v |= 0x02; + + return(v); + + case 0x10: + return(tilem_lcd_t6a04_status(calc)); + + case 0x11: + return(tilem_lcd_t6a04_read(calc)); + + case 0x14: + /* FIXME: determine value of this port on old + hardware, and the values of bits 1-7. (As on + TI-83, probably mirrors port 0 in both cases.) */ + b = battlevel[calc->hwregs[PORT4] >> 6]; + return(calc->battery >= b ? 1 : 0); + } + + tilem_warning(calc, "Input from port %x", port); + return(0x00); +} + + +static void setup_mapping(TilemCalc* calc) +{ + unsigned int pageA, pageB; + + /* FIXME: this is all rather hypothetical and untested, but it + makes sense based on how the TI-83 works */ + + if (calc->hwregs[PORT2] & 0x40) { + pageA = (0x08 | (calc->hwregs[PORT2] & 1)); + } + else { + pageA = (calc->hwregs[PORT2] & 7); + } + + if (calc->hwregs[PORT2] & 0x80) { + pageB = (0x08 | ((calc->hwregs[PORT2] >> 3) & 1)); + } + else { + pageB = ((calc->hwregs[PORT2] >> 3) & 7); + } + + if (calc->hwregs[PORT4] & 1) { + calc->mempagemap[1] = (pageA & ~1); + calc->mempagemap[2] = (pageA | 1); + calc->mempagemap[3] = pageB; + } + else { + calc->mempagemap[1] = pageA; + calc->mempagemap[2] = pageB; + calc->mempagemap[3] = 0x08; + } +} + +void x2_z80_out(TilemCalc* calc, dword port, byte value) +{ + switch(port&0xff) { + case 0x00: + calc->hwregs[PORT0] = value; + + if (calc->hwregs[HW_VERSION] == 1) { + /* HW version 1 */ + value = (((value >> 6) & (value >> 2)) + | ((value >> 4) & ~value)); + } + else if (calc->hwregs[HW_VERSION] == 0) { + /* HW version unknown: auto-detect */ + if ((value & 0xc3) == 0xc0) { + value = ((value >> 2) | (value >> 4)); + } + } + + tilem_linkport_set_lines(calc, value); + break; + + case 0x01: + tilem_keypad_set_group(calc, value); + break; + + case 0x02: + calc->hwregs[PORT2] = value; + setup_mapping(calc); + break; + + case 0x03: + if (value & 0x01) { + calc->keypad.onkeyint = 1; + } + else { + calc->z80.interrupts &= ~TILEM_INTERRUPT_ON_KEY; + calc->keypad.onkeyint = 0; + } + + if (!(value & 0x02)) { + calc->z80.interrupts &= ~TILEM_INTERRUPT_TIMER1; + } + + calc->poweronhalt = ((value & 8) >> 3); + calc->hwregs[PORT3] = value; + break; + + case 0x04: + calc->hwregs[PORT4] = value; + + /* Detect hardware version */ + if (calc->z80.r.pc.d < 0x4000) { + if (value & 0x10) + calc->hwregs[HW_VERSION] = 1; + else + calc->hwregs[HW_VERSION] = 2; + } + + /* FIXME: implement changing interrupt frequencies -- + somebody needs to measure them. Also check if bit + 4 works as on 83. */ + + setup_mapping(calc); + break; + + case 0x10: + tilem_lcd_t6a04_control(calc, value); + break; + + case 0x11: + tilem_lcd_t6a04_write(calc, value); + break; + } + + return; +} + +void x2_z80_ptimer(TilemCalc* calc, int id) +{ + switch (id) { + case TIMER_INT: + if (calc->hwregs[PORT3] & 0x02) + calc->z80.interrupts |= TILEM_INTERRUPT_TIMER1; + break; + } +} diff --git a/tool/tilem-src/emu/x2/x2_memory.c b/tool/tilem-src/emu/x2/x2_memory.c new file mode 100644 index 0000000..9829f4f --- /dev/null +++ b/tool/tilem-src/emu/x2/x2_memory.c @@ -0,0 +1,70 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "x2.h" + +#include + +void x2_z80_wrmem(TilemCalc* calc, dword A, byte v) +{ + dword pa = 0x4000 * calc->mempagemap[(A)>>14] + (A & 0x3FFF); + + if (pa >= 0x28000) + abort(); + + if (pa >= 0x20000) { + *(calc->mem + pa) = v; + } +} + + +byte x2_z80_rdmem(TilemCalc* calc, dword A) +{ + dword pa = 0x4000 * calc->mempagemap[(A)>>14] + (A & 0x3FFF); + return (*(calc->mem + pa)); +} + +dword x2_mem_ltop(TilemCalc* calc, dword A) +{ + byte page = calc->mempagemap[A >> 14]; + return ((page << 14) | (A & 0x3fff)); +} + +dword x2_mem_ptol(TilemCalc* calc, dword A) +{ + byte page = A >> 14; + int i; + + for (i = 0; i < 4; i++) { + if (calc->mempagemap[i] == page) { + return ((i << 14) | (A & 0x3fff)); + } + } + + return (0xffffffff); +} diff --git a/tool/tilem-src/emu/x2/x2_subcore.c b/tool/tilem-src/emu/x2/x2_subcore.c new file mode 100644 index 0000000..bdb19fe --- /dev/null +++ b/tool/tilem-src/emu/x2/x2_subcore.c @@ -0,0 +1,57 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "x2.h" + +static const char* hwregnames[NUM_HW_REGS] = HW_REG_NAMES; + +static const char* hwtimernames[NUM_HW_TIMERS] = HW_TIMER_NAMES; + +static const char* keynames[64] = { + "Down", "Left", "Right", "Up", 0, 0, 0, 0, + "Enter", "Add", "Sub", "Mul", "Div", "Power", "Clear", 0, + "Chs", "3", "6", "9", "RParen", "Tan", "Vars", 0, + "DecPnt", "2", "5", "8", "LParen", "Cos", "Prgm", "Stat", + "0", "1", "4", "7", "Comma", "Sin", "Matrix", "Graphvar", + "On", "Store", "Ln", "Log", "Square", "Recip", "Math", "Alpha", + "Graph", "Trace", "Zoom", "Window", "YEqu", "2nd", "Mode", "Del", + 0, 0, 0, 0, 0, 0, 0, 0}; + +const TilemHardware hardware_ti82 = { + '2', "ti82", "TI-82", + (TILEM_CALC_HAS_LINK | TILEM_CALC_HAS_T6A04), + 96, 64, 8 * 0x4000, 0x8000, 15 * 64, 0x40, + 0, NULL, 0, + NUM_HW_REGS, hwregnames, + NUM_HW_TIMERS, hwtimernames, + keynames, + x2_reset, NULL, + x2_z80_in, x2_z80_out, + x2_z80_wrmem, x2_z80_rdmem, x2_z80_rdmem, NULL, + x2_z80_ptimer, tilem_lcd_t6a04_get_data, + x2_mem_ltop, x2_mem_ptol }; diff --git a/tool/tilem-src/emu/x3/x3.h b/tool/tilem-src/emu/x3/x3.h new file mode 100644 index 0000000..78cbd78 --- /dev/null +++ b/tool/tilem-src/emu/x3/x3.h @@ -0,0 +1,50 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifndef _TILEM_X3_H +#define _TILEM_X3_H + +enum { + PORT2, /* port 2 (memory mapping) */ + PORT3, /* mask of enabled interrupts */ + PORT4, /* mapping mode + timer speed */ + ROM_BANK, /* current ROM bank for port 2 mapping */ + NUM_HW_REGS +}; + +#define HW_REG_NAMES { "port2", "port3", "port4", "rom_bank" } + +#define TIMER_INT1 (TILEM_NUM_SYS_TIMERS + 1) +#define TIMER_INT2A (TILEM_NUM_SYS_TIMERS + 2) +#define TIMER_INT2B (TILEM_NUM_SYS_TIMERS + 3) +#define NUM_HW_TIMERS 3 + +#define HW_TIMER_NAMES { "int1", "int2a", "int2b" } + +void x3_reset(TilemCalc* calc); +byte x3_z80_in(TilemCalc* calc, dword port); +void x3_z80_out(TilemCalc* calc, dword port, byte value); +void x3_z80_ptimer(TilemCalc* calc, int id); +void x3_z80_wrmem(TilemCalc* calc, dword addr, byte value); +byte x3_z80_rdmem(TilemCalc* calc, dword addr); +dword x3_mem_ltop(TilemCalc* calc, dword addr); +dword x3_mem_ptol(TilemCalc* calc, dword addr); + +#endif diff --git a/tool/tilem-src/emu/x3/x3_init.c b/tool/tilem-src/emu/x3/x3_init.c new file mode 100644 index 0000000..84703a8 --- /dev/null +++ b/tool/tilem-src/emu/x3/x3_init.c @@ -0,0 +1,48 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "x3.h" + +void x3_reset(TilemCalc* calc) +{ + calc->hwregs[PORT2] = 0xF8; + calc->hwregs[PORT3] = 0x0B; + calc->hwregs[PORT4] = 0x00; + calc->hwregs[ROM_BANK] = 0x00; + + calc->mempagemap[0] = 0x00; + calc->mempagemap[1] = 0x00; + calc->mempagemap[2] = 0x11; + calc->mempagemap[3] = 0x10; + + tilem_z80_set_speed(calc, 6000); + + tilem_z80_set_timer(calc, TIMER_INT1, 1600, 9259, 1); + tilem_z80_set_timer(calc, TIMER_INT2A, 1300, 9259, 1); + tilem_z80_set_timer(calc, TIMER_INT2B, 1000, 9259, 1); +} diff --git a/tool/tilem-src/emu/x3/x3_io.c b/tool/tilem-src/emu/x3/x3_io.c new file mode 100644 index 0000000..9db41c2 --- /dev/null +++ b/tool/tilem-src/emu/x3/x3_io.c @@ -0,0 +1,210 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "x3.h" + +byte x3_z80_in(TilemCalc* calc, dword port) +{ + static const byte battlevel[4] = { 33, 39, 36, 43 }; + byte v, b; + + switch(port&0x1f) { + case 0x00: + case 0x04: + case 0x08: + case 0x0C: + v = tilem_linkport_get_lines(calc); + return((calc->hwregs[ROM_BANK] << 1) | (v * 5)); + + case 0x01: + case 0x05: + case 0x09: + case 0x0D: + return(tilem_keypad_read_keys(calc)); + + case 0x02: + case 0x06: + case 0x0A: + case 0x0E: + case 0x16: + case 0x1E: + return(calc->hwregs[PORT2]); + + case 0x03: + case 0x07: + case 0x0B: + case 0x0F: + case 0x17: + case 0x1F: + v = (calc->keypad.onkeydown ? 0x00 : 0x08); + + if (calc->z80.interrupts & TILEM_INTERRUPT_ON_KEY) + v |= 0x01; + if (calc->z80.interrupts & TILEM_INTERRUPT_TIMER1) + v |= 0x02; + + return(v); + + case 0x10: + case 0x12: + case 0x18: + case 0x1A: + return(tilem_lcd_t6a04_status(calc)); + + case 0x11: + case 0x13: + case 0x19: + case 0x1B: + return(tilem_lcd_t6a04_read(calc)); + + case 0x14: + case 0x1C: + b = battlevel[calc->hwregs[PORT4] >> 6]; + v = tilem_linkport_get_lines(calc); + return((calc->battery >= b ? 1 : 0) + | (calc->hwregs[ROM_BANK] << 1) | (v << 2)); + + case 0x15: + case 0x1D: + return(tilem_keypad_read_keys(calc) & ~1); + } + + tilem_warning(calc, "Input from port %x", port); + return(0x00); +} + + +static void setup_mapping(TilemCalc* calc) +{ + unsigned int pageA, pageB; + + if (calc->hwregs[PORT2] & 0x40) { + pageA = (0x10 | (calc->hwregs[PORT2] & 1)); + } + else { + pageA = (calc->hwregs[ROM_BANK] | (calc->hwregs[PORT2] & 7)); + } + + if (calc->hwregs[PORT2] & 0x80) { + pageB = (0x10 | ((calc->hwregs[PORT2] >> 3) & 1)); + } + else { + pageB = (calc->hwregs[ROM_BANK] | ((calc->hwregs[PORT2] >> 3) & 7)); + } + + if (calc->hwregs[PORT4] & 1) { + calc->mempagemap[1] = (pageA & ~1); + calc->mempagemap[2] = (pageA | 1); + calc->mempagemap[3] = pageB; + } + else { + calc->mempagemap[1] = pageA; + calc->mempagemap[2] = pageB; + calc->mempagemap[3] = 0x10; + } +} + +void x3_z80_out(TilemCalc* calc, dword port, byte value) +{ + static const int tmrvalues[8] = { 1667, 1852, 3889, 4321, + 6111, 6790, 8333, 9259 }; + int t; + + switch(port&0x1f) { + case 0x00: + calc->hwregs[ROM_BANK] = ((value & 0x10) >> 1); + tilem_linkport_set_lines(calc, value); + setup_mapping(calc); + break; + + case 0x01: + tilem_keypad_set_group(calc, value); + break; + + case 0x02: + calc->hwregs[PORT2] = value; + setup_mapping(calc); + break; + + case 0x03: + if (value & 0x01) { + calc->keypad.onkeyint = 1; + } + else { + calc->z80.interrupts &= ~TILEM_INTERRUPT_ON_KEY; + calc->keypad.onkeyint = 0; + } + + if (!(value & 0x02)) + calc->z80.interrupts &= ~TILEM_INTERRUPT_TIMER1; + + if (!(value & 0x04)) + calc->z80.interrupts &= ~TILEM_INTERRUPT_TIMER2; + + calc->poweronhalt = ((value & 8) >> 3); + calc->hwregs[PORT3] = value; + break; + + case 0x04: + calc->hwregs[PORT4] = value; + + t = tmrvalues[((value >> 4) & 1) | (value & 6)]; + tilem_z80_set_timer_period(calc, TIMER_INT1, t); + tilem_z80_set_timer_period(calc, TIMER_INT2A, t); + tilem_z80_set_timer_period(calc, TIMER_INT2B, t); + + setup_mapping(calc); + break; + + case 0x10: + tilem_lcd_t6a04_control(calc, value); + break; + + case 0x11: + tilem_lcd_t6a04_write(calc, value); + break; + } + + return; +} + +void x3_z80_ptimer(TilemCalc* calc, int id) +{ + switch (id) { + case TIMER_INT1: + if (calc->hwregs[PORT3] & 0x02) + calc->z80.interrupts |= TILEM_INTERRUPT_TIMER1; + break; + + case TIMER_INT2A: + case TIMER_INT2B: + if (calc->hwregs[PORT3] & 0x04) + calc->z80.interrupts |= TILEM_INTERRUPT_TIMER2; + break; + } +} diff --git a/tool/tilem-src/emu/x3/x3_memory.c b/tool/tilem-src/emu/x3/x3_memory.c new file mode 100644 index 0000000..ede1da5 --- /dev/null +++ b/tool/tilem-src/emu/x3/x3_memory.c @@ -0,0 +1,64 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "x3.h" + +void x3_z80_wrmem(TilemCalc* calc, dword A, byte v) +{ + dword pa = 0x4000 * calc->mempagemap[(A)>>14] + (A & 0x3FFF); + + if (pa >= 0x40000) { + *(calc->mem + pa) = v; + } +} + +byte x3_z80_rdmem(TilemCalc* calc, dword A) +{ + dword pa = 0x4000 * calc->mempagemap[(A)>>14] + (A & 0x3FFF); + return (*(calc->mem + pa)); +} + +dword x3_mem_ltop(TilemCalc* calc, dword A) +{ + byte page = calc->mempagemap[A >> 14]; + return ((page << 14) | (A & 0x3fff)); +} + +dword x3_mem_ptol(TilemCalc* calc, dword A) +{ + byte page = A >> 14; + int i; + + for (i = 0; i < 4; i++) { + if (calc->mempagemap[i] == page) { + return ((i << 14) | (A & 0x3fff)); + } + } + + return (0xffffffff); +} diff --git a/tool/tilem-src/emu/x3/x3_subcore.c b/tool/tilem-src/emu/x3/x3_subcore.c new file mode 100644 index 0000000..a0c95c2 --- /dev/null +++ b/tool/tilem-src/emu/x3/x3_subcore.c @@ -0,0 +1,71 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "x3.h" + +static const char* hwregnames[NUM_HW_REGS] = HW_REG_NAMES; + +static const char* hwtimernames[NUM_HW_TIMERS] = HW_TIMER_NAMES; + +static const char* keynames[64] = { + "Down", "Left", "Right", "Up", 0, 0, 0, 0, + "Enter", "Add", "Sub", "Mul", "Div", "Power", "Clear", 0, + "Chs", "3", "6", "9", "RParen", "Tan", "Vars", 0, + "DecPnt", "2", "5", "8", "LParen", "Cos", "Prgm", "Stat", + "0", "1", "4", "7", "Comma", "Sin", "Matrix", "Graphvar", + "On", "Store", "Ln", "Log", "Square", "Recip", "Math", "Alpha", + "Graph", "Trace", "Zoom", "Window", "YEqu", "2nd", "Mode", "Del", + 0, 0, 0, 0, 0, 0, 0, 0}; + +const TilemHardware hardware_ti83 = { + '3', "ti83", "TI-83 / TI-82 STATS", + (TILEM_CALC_HAS_LINK | TILEM_CALC_HAS_T6A04), + 96, 64, 16 * 0x4000, 0x8000, 15 * 64, 0x40, + 0, NULL, 0, + NUM_HW_REGS, hwregnames, + NUM_HW_TIMERS, hwtimernames, + keynames, + x3_reset, NULL, + x3_z80_in, x3_z80_out, + x3_z80_wrmem, x3_z80_rdmem, x3_z80_rdmem, NULL, + x3_z80_ptimer, tilem_lcd_t6a04_get_data, + x3_mem_ltop, x3_mem_ptol }; + +const TilemHardware hardware_ti76 = { + 'f', "ti76", "TI-76.fr", + (TILEM_CALC_HAS_LINK | TILEM_CALC_HAS_T6A04), + 96, 64, 16 * 0x4000, 0x8000, 15 * 64, 0x40, + 0, NULL, 0, + NUM_HW_REGS, hwregnames, + NUM_HW_TIMERS, hwtimernames, + keynames, + x3_reset, NULL, + x3_z80_in, x3_z80_out, + x3_z80_wrmem, x3_z80_rdmem, x3_z80_rdmem, NULL, + x3_z80_ptimer, tilem_lcd_t6a04_get_data, + x3_mem_ltop, x3_mem_ptol }; diff --git a/tool/tilem-src/emu/x4/x4.h b/tool/tilem-src/emu/x4/x4.h new file mode 100644 index 0000000..9ca55dd --- /dev/null +++ b/tool/tilem-src/emu/x4/x4.h @@ -0,0 +1,105 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2009-2011 Benjamin Moody + * + * 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, see + * . + */ + +#ifndef _TILEM_X4_H +#define _TILEM_X4_H + +enum { + PORT3, /* mask of enabled interrupts */ + PORT4, /* interrupt timer speed */ + PORT5, /* memory mapping bank C */ + PORT6, /* memory mapping bank A */ + PORT7, /* memory mapping bank B */ + PORT8, /* link assist mode flags */ + PORT9, /* unknown (link assist settings?) */ + PORTA, /* unknown (timeout value?) */ + PORTB, /* unknown (timeout value?) */ + PORTC, /* unknown (timeout value?) */ + PORTD, /* unknown */ + PORTE, /* unknown */ + PORTF, /* unknown */ + + PORT20, /* CPU speed control */ + PORT21, /* hardware type / RAM no-exec control */ + PORT22, /* Flash no-exec lower limit */ + PORT23, /* Flash no-exec upper limit */ + PORT25, /* RAM no-exec lower limit */ + PORT26, /* RAM no-exec upper limit */ + PORT27, /* bank C forced-page-0 limit */ + PORT28, /* bank B forced-page-1 limit */ + PORT29, /* LCD port delay (6 MHz) */ + PORT2A, /* LCD port delay (mode 1) */ + PORT2B, /* LCD port delay (mode 2) */ + PORT2C, /* LCD port delay (mode 3) */ + PORT2D, /* unknown */ + PORT2E, /* memory delay */ + PORT2F, /* Duration of LCD wait timer */ + + CLOCK_MODE, /* clock mode */ + CLOCK_INPUT, /* clock input register */ + CLOCK_DIFF, /* clock value minus actual time */ + + RAM_READ_DELAY, + RAM_WRITE_DELAY, + RAM_EXEC_DELAY, + FLASH_READ_DELAY, + FLASH_WRITE_DELAY, + FLASH_EXEC_DELAY, + LCD_PORT_DELAY, + NO_EXEC_RAM_MASK, + NO_EXEC_RAM_LOWER, + NO_EXEC_RAM_UPPER, + + LCD_WAIT, /* LCD wait timer active */ + PROTECTSTATE, /* port protection state */ + NUM_HW_REGS +}; + +#define HW_REG_NAMES \ + { "port3", "port4", "port5", "port6", "port7", "port8", "port9", \ + "portA", "portB", "portC", "portD", "portE", "portF", "port20", \ + "port21", "port22", "port23", "port25", "port26", "port27", \ + "port28", "port29", "port2A", "port2B", "port2C", "port2D", \ + "port2E", "port2F", "clock_mode", "clock_input", "clock_diff", \ + "ram_read_delay", "ram_write_delay", "ram_exec_delay", \ + "flash_read_delay", "flash_write_delay", "flash_exec_delay", \ + "lcd_port_delay", "no_exec_ram_mask", "no_exec_ram_lower", \ + "no_exec_ram_upper", "lcd_wait", "protectstate" } + +#define TIMER_INT1 (TILEM_NUM_SYS_TIMERS + 1) +#define TIMER_INT2A (TILEM_NUM_SYS_TIMERS + 2) +#define TIMER_INT2B (TILEM_NUM_SYS_TIMERS + 3) +#define TIMER_LCD_WAIT (TILEM_NUM_SYS_TIMERS + 4) +#define NUM_HW_TIMERS 4 + +#define HW_TIMER_NAMES { "int1", "int2a", "int2b", "lcd_wait" } + +void x4_reset(TilemCalc* calc); +void x4_stateloaded(TilemCalc* calc, int savtype); +byte x4_z80_in(TilemCalc* calc, dword port); +void x4_z80_out(TilemCalc* calc, dword port, byte value); +void x4_z80_ptimer(TilemCalc* calc, int id); +void x4_z80_wrmem(TilemCalc* calc, dword addr, byte value); +byte x4_z80_rdmem(TilemCalc* calc, dword addr); +byte x4_z80_rdmem_m1(TilemCalc* calc, dword addr); +dword x4_mem_ltop(TilemCalc* calc, dword addr); +dword x4_mem_ptol(TilemCalc* calc, dword addr); + +#endif diff --git a/tool/tilem-src/emu/x4/x4_init.c b/tool/tilem-src/emu/x4/x4_init.c new file mode 100644 index 0000000..41f7477 --- /dev/null +++ b/tool/tilem-src/emu/x4/x4_init.c @@ -0,0 +1,87 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2011 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "x4.h" + +void x4_reset(TilemCalc* calc) +{ + calc->hwregs[PORT3] = 0x0B; + calc->hwregs[PORT4] = 0x07; + calc->hwregs[PORT6] = 0x3F; + calc->hwregs[PORT7] = 0x3F; + + calc->mempagemap[0] = 0x00; + calc->mempagemap[1] = 0x3E; + calc->mempagemap[2] = 0x3F; + calc->mempagemap[3] = 0x3F; + + calc->z80.r.pc.d = 0x8000; + + calc->hwregs[PORT8] = 0x80; + + calc->hwregs[PORT20] = 0; + calc->hwregs[PORT21] = 0; + calc->hwregs[PORT22] = 0x08; + calc->hwregs[PORT23] = 0x29; + calc->hwregs[PORT25] = 0x10; + calc->hwregs[PORT26] = 0x20; + calc->hwregs[PORT27] = 0; + calc->hwregs[PORT28] = 0; + calc->hwregs[PORT29] = 0x14; + calc->hwregs[PORT2A] = 0x27; + calc->hwregs[PORT2B] = 0x2F; + calc->hwregs[PORT2C] = 0x3B; + calc->hwregs[PORT2D] = 0x01; + calc->hwregs[PORT2E] = 0x44; + calc->hwregs[PORT2F] = 0x4A; + + calc->hwregs[FLASH_READ_DELAY] = 0; + calc->hwregs[FLASH_WRITE_DELAY] = 0; + calc->hwregs[FLASH_EXEC_DELAY] = 0; + calc->hwregs[RAM_READ_DELAY] = 0; + calc->hwregs[RAM_WRITE_DELAY] = 0; + calc->hwregs[RAM_EXEC_DELAY] = 0; + calc->hwregs[LCD_PORT_DELAY] = 5; + calc->hwregs[NO_EXEC_RAM_MASK] = 0x7C00; + calc->hwregs[NO_EXEC_RAM_LOWER] = 0x4000; + calc->hwregs[NO_EXEC_RAM_UPPER] = 0x8000; + + calc->hwregs[PROTECTSTATE] = 0; + + tilem_z80_set_speed(calc, 6000); + + tilem_z80_set_timer(calc, TIMER_INT1, 1600, 9277, 1); + tilem_z80_set_timer(calc, TIMER_INT2A, 1300, 9277, 1); + tilem_z80_set_timer(calc, TIMER_INT2B, 1000, 9277, 1); +} + +void x4_stateloaded(TilemCalc* calc, int savtype TILEM_ATTR_UNUSED) +{ + tilem_calc_fix_certificate(calc, calc->mem + (0x3E * 0x4000L), + 0x29, 0x0c, 0x1e50); +} diff --git a/tool/tilem-src/emu/x4/x4_io.c b/tool/tilem-src/emu/x4/x4_io.c new file mode 100644 index 0000000..e4f086b --- /dev/null +++ b/tool/tilem-src/emu/x4/x4_io.c @@ -0,0 +1,747 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2012 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include + +#include "x4.h" + +static void set_lcd_wait_timer(TilemCalc* calc) +{ + static const int delaytime[8] = { 48, 112, 176, 240, + 304, 368, 432, 496 }; + int i; + + switch (calc->hwregs[PORT20] & 3) { + case 0: + return; + case 1: + i = (calc->hwregs[PORT2F] & 3); + break; + case 2: + i = ((calc->hwregs[PORT2F] >> 2) & 7); + break; + default: + i = ((calc->hwregs[PORT2F] >> 5) & 7); + break; + } + + tilem_z80_set_timer(calc, TIMER_LCD_WAIT, delaytime[i], 0, 0); + calc->hwregs[LCD_WAIT] = 1; +} + +byte x4_z80_in(TilemCalc* calc, dword port) +{ + /* FIXME: measure actual levels */ + static const byte battlevel[4] = { 33, 39, 36, 43 }; + byte v; + unsigned int f; + time_t curtime; + + switch(port&0xff) { + case 0x00: + v = tilem_linkport_get_lines(calc); + v |= (calc->linkport.lines << 4); + return(v); + + case 0x01: + return(tilem_keypad_read_keys(calc)); + + case 0x02: + v = battlevel[calc->hwregs[PORT4] >> 6]; + return ((calc->battery >= v ? 0xe1 : 0xe0) + | (calc->hwregs[LCD_WAIT] ? 0 : 2) + | (calc->flash.unlock << 2)); + + case 0x03: + return(calc->hwregs[PORT3]); + + case 0x04: + v = (calc->keypad.onkeydown ? 0x00 : 0x08); + + if (calc->z80.interrupts & TILEM_INTERRUPT_ON_KEY) + v |= 0x01; + if (calc->z80.interrupts & TILEM_INTERRUPT_TIMER1) + v |= 0x02; + if (calc->z80.interrupts & TILEM_INTERRUPT_TIMER2) + v |= 0x04; + if (calc->z80.interrupts & TILEM_INTERRUPT_LINK_ACTIVE) + v |= 0x10; + + if (calc->usertimers[0].status & TILEM_USER_TIMER_FINISHED) + v |= 0x20; + if (calc->usertimers[1].status & TILEM_USER_TIMER_FINISHED) + v |= 0x40; + if (calc->usertimers[2].status & TILEM_USER_TIMER_FINISHED) + v |= 0x80; + + return(v); + + case 0x05: + return(calc->hwregs[PORT5] & 0x0f); + + case 0x06: + return(calc->hwregs[PORT6]); + + case 0x07: + return(calc->hwregs[PORT7]); + + case 0x08: + return(calc->hwregs[PORT8]); + + case 0x09: + f = tilem_linkport_get_assist_flags(calc); + + if (f & (TILEM_LINK_ASSIST_READ_BUSY + | TILEM_LINK_ASSIST_WRITE_BUSY)) + v = 0x00; + else + v = 0x20; + + if (calc->z80.interrupts & TILEM_INTERRUPT_LINK_READ) + v |= 0x01; + if (calc->z80.interrupts & TILEM_INTERRUPT_LINK_IDLE) + v |= 0x02; + if (calc->z80.interrupts & TILEM_INTERRUPT_LINK_ERROR) + v |= 0x04; + if (f & TILEM_LINK_ASSIST_READ_BUSY) + v |= 0x08; + if (f & TILEM_LINK_ASSIST_READ_BYTE) + v |= 0x10; + if (f & (TILEM_LINK_ASSIST_READ_ERROR + | TILEM_LINK_ASSIST_WRITE_ERROR)) + v |= 0x40; + if (f & TILEM_LINK_ASSIST_WRITE_BUSY) + v |= 0x80; + + calc->z80.interrupts &= ~TILEM_INTERRUPT_LINK_ERROR; + + return(v); + + case 0x0A: + v = calc->linkport.assistlastbyte; + tilem_linkport_read_byte(calc); + return(v); + + case 0x0E: + return(calc->hwregs[PORTE] & 3); + + case 0x0F: + return(calc->hwregs[PORTF] & 3); + + case 0x10: + case 0x12: + calc->z80.clock += calc->hwregs[LCD_PORT_DELAY]; + set_lcd_wait_timer(calc); + return(tilem_lcd_t6a04_status(calc)); + + case 0x11: + case 0x13: + calc->z80.clock += calc->hwregs[LCD_PORT_DELAY]; + set_lcd_wait_timer(calc); + return(tilem_lcd_t6a04_read(calc)); + + case 0x15: + return(0x45); /* ??? */ + + case 0x1C: + return(tilem_md5_assist_get_value(calc)); + + case 0x1D: + return(tilem_md5_assist_get_value(calc) >> 8); + + case 0x1E: + return(tilem_md5_assist_get_value(calc) >> 16); + + case 0x1F: + return(tilem_md5_assist_get_value(calc) >> 24); + + case 0x20: + return(calc->hwregs[PORT20] & 3); + + case 0x21: + return(calc->hwregs[PORT21] & 0x33); + + case 0x22: + return(calc->hwregs[PORT22]); + + case 0x23: + return(calc->hwregs[PORT23]); + + case 0x25: + return(calc->hwregs[PORT25]); + + case 0x26: + return(calc->hwregs[PORT26]); + + case 0x27: + return(calc->hwregs[PORT27]); + + case 0x28: + return(calc->hwregs[PORT28]); + + case 0x29: + return(calc->hwregs[PORT29]); + + case 0x2A: + return(calc->hwregs[PORT2A]); + + case 0x2B: + return(calc->hwregs[PORT2B]); + + case 0x2C: + return(calc->hwregs[PORT2C]); + + case 0x2D: + return(calc->hwregs[PORT2D] & 3); + + case 0x2E: + return(calc->hwregs[PORT2E]); + + case 0x2F: + return(calc->hwregs[PORT2F]); + + case 0x30: + return(calc->usertimers[0].frequency); + case 0x31: + return(calc->usertimers[0].status); + case 0x32: + return(tilem_user_timer_get_value(calc, 0)); + + case 0x33: + return(calc->usertimers[1].frequency); + case 0x34: + return(calc->usertimers[1].status); + case 0x35: + return(tilem_user_timer_get_value(calc, 1)); + + case 0x36: + return(calc->usertimers[2].frequency); + case 0x37: + return(calc->usertimers[2].status); + case 0x38: + return(tilem_user_timer_get_value(calc, 2)); + + case 0x39: + return(0xf0); /* ??? */ + + case 0x40: + return calc->hwregs[CLOCK_MODE]; + + case 0x41: + return calc->hwregs[CLOCK_INPUT]&0xff; + + case 0x42: + return (calc->hwregs[CLOCK_INPUT]>>8)&0xff; + + case 0x43: + return (calc->hwregs[CLOCK_INPUT]>>16)&0xff; + + case 0x44: + return (calc->hwregs[CLOCK_INPUT]>>24)&0xff; + + case 0x45: + case 0x46: + case 0x47: + case 0x48: + if (calc->hwregs[CLOCK_MODE] & 1) { + time(&curtime); + } + else { + curtime = 0; + } + curtime += calc->hwregs[CLOCK_DIFF]; + return (curtime >> ((port - 0x45) * 8)); + + case 0x4C: + return(0x22); + + case 0x4D: + /* USB port - not emulated, calculator should + recognize that the USB cable is + disconnected. + + Thanks go to Dan Englender for these + values. */ + + return(0xA5); + + case 0x55: + return(0x1F); + + case 0x56: + return(0x00); + + case 0x57: + return(0x50); + + case 0x0B: + case 0x0C: + case 0x0D: + case 0x14: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + return(0); + } + + tilem_warning(calc, "Input from port %x", port); + return(0x00); +} + + +static void setup_mapping(TilemCalc* calc) +{ + unsigned int pageA, pageB, pageC; + + if (calc->hwregs[PORT6] & 0x80) + pageA = (0x40 | (calc->hwregs[PORT6] & 7)); + else + pageA = (calc->hwregs[PORT6] & 0x3f); + + if (calc->hwregs[PORT7] & 0x80) + pageB = (0x40 | (calc->hwregs[PORT7] & 7)); + else + pageB = (calc->hwregs[PORT7] & 0x3f); + + pageC = (0x40 | (calc->hwregs[PORT5] & 7)); + + if (calc->hwregs[PORT4] & 1) { + calc->mempagemap[1] = (pageA & ~1); + calc->mempagemap[2] = (pageA | 1); + calc->mempagemap[3] = pageB; + } + else { + calc->mempagemap[1] = pageA; + calc->mempagemap[2] = pageB; + calc->mempagemap[3] = pageC; + } +} + +static void setup_clockdelays(TilemCalc* calc) +{ + byte lcdport = calc->hwregs[PORT29 + (calc->hwregs[PORT20] & 3)]; + byte memport = calc->hwregs[PORT2E]; + + if (!(lcdport & 1)) + memport &= ~0x07; + if (!(lcdport & 2)) + memport &= ~0x70; + + calc->hwregs[FLASH_EXEC_DELAY] = (memport & 1); + calc->hwregs[FLASH_READ_DELAY] = ((memport >> 1) & 1); + calc->hwregs[FLASH_WRITE_DELAY] = ((memport >> 2) & 1); + + calc->hwregs[RAM_EXEC_DELAY] = ((memport >> 4) & 1); + calc->hwregs[RAM_READ_DELAY] = ((memport >> 5) & 1); + calc->hwregs[RAM_WRITE_DELAY] = ((memport >> 6) & 1); + + calc->hwregs[LCD_PORT_DELAY] = (lcdport >> 2); +} + +void x4_z80_out(TilemCalc* calc, dword port, byte value) +{ + static const int tmrvalues[4] = { 1953, 4395, 6836, 9277 }; + int t, r; + unsigned int mode; + time_t curtime; + + switch(port&0xff) { + case 0x00: + tilem_linkport_set_lines(calc, value); + break; + + case 0x01: + tilem_keypad_set_group(calc, value); + break; + + case 0x03: + if (value & 0x01) { + calc->keypad.onkeyint = 1; + } + else { + calc->z80.interrupts &= ~TILEM_INTERRUPT_ON_KEY; + calc->keypad.onkeyint = 0; + } + + if (!(value & 0x02)) + calc->z80.interrupts &= ~TILEM_INTERRUPT_TIMER1; + + if (!(value & 0x04)) + calc->z80.interrupts &= ~TILEM_INTERRUPT_TIMER2; + + if (value & 0x06) { + calc->usertimers[0].status &= ~TILEM_USER_TIMER_NO_HALT_INT; + calc->usertimers[1].status &= ~TILEM_USER_TIMER_NO_HALT_INT; + calc->usertimers[2].status &= ~TILEM_USER_TIMER_NO_HALT_INT; + } + else { + calc->usertimers[0].status |= TILEM_USER_TIMER_NO_HALT_INT; + calc->usertimers[1].status |= TILEM_USER_TIMER_NO_HALT_INT; + calc->usertimers[2].status |= TILEM_USER_TIMER_NO_HALT_INT; + } + + mode = calc->linkport.mode; + if (value & 0x10) + mode |= TILEM_LINK_MODE_INT_ON_ACTIVE; + else + mode &= ~TILEM_LINK_MODE_INT_ON_ACTIVE; + + tilem_linkport_set_mode(calc, mode); + + calc->poweronhalt = ((value & 8) >> 3); + calc->hwregs[PORT3] = value; + break; + + + case 0x04: + calc->hwregs[PORT4] = value; + + t = tmrvalues[(value & 6) >> 1]; + tilem_z80_set_timer_period(calc, TIMER_INT1, t); + tilem_z80_set_timer_period(calc, TIMER_INT2A, t); + tilem_z80_set_timer_period(calc, TIMER_INT2B, t); + + setup_mapping(calc); + break; + + case 0x05: + calc->hwregs[PORT5] = value & 0x0f; + setup_mapping(calc); + break; + + case 0x06: + calc->hwregs[PORT6] = value; + setup_mapping(calc); + break; + + case 0x07: + calc->hwregs[PORT7] = value; + setup_mapping(calc); + break; + + case 0x08: + calc->hwregs[PORT8] = value; + + mode = calc->linkport.mode; + + if (value & 0x01) + mode |= TILEM_LINK_MODE_INT_ON_READ; + else + mode &= ~TILEM_LINK_MODE_INT_ON_READ; + + if (value & 0x02) + mode |= TILEM_LINK_MODE_INT_ON_IDLE; + else + mode &= ~TILEM_LINK_MODE_INT_ON_IDLE; + + if (value & 0x04) + mode |= TILEM_LINK_MODE_INT_ON_ERROR; + else + mode &= ~TILEM_LINK_MODE_INT_ON_ERROR; + + if (value & 0x80) + mode &= ~TILEM_LINK_MODE_ASSIST; + else + mode |= TILEM_LINK_MODE_ASSIST; + + tilem_linkport_set_mode(calc, mode); + break; + + case 0x09: + calc->hwregs[PORT9] = value; + break; + + case 0x0A: + calc->hwregs[PORTA] = value; + break; + + case 0x0B: + calc->hwregs[PORTB] = value; + break; + + case 0x0C: + calc->hwregs[PORTC] = value; + break; + + + case 0x0D: + if (!(calc->hwregs[PORT8] & 0x80)) + tilem_linkport_write_byte(calc, value); + break; + + case 0x0E: + calc->hwregs[PORTE] = value; + break; + + case 0x0F: + calc->hwregs[PORTF] = value; + break; + + case 0x10: + case 0x12: + calc->z80.clock += calc->hwregs[LCD_PORT_DELAY]; + set_lcd_wait_timer(calc); + tilem_lcd_t6a04_control(calc, value); + break; + + case 0x11: + case 0x13: + calc->z80.clock += calc->hwregs[LCD_PORT_DELAY]; + set_lcd_wait_timer(calc); + tilem_lcd_t6a04_write(calc, value); + break; + + case 0x14: + if (calc->hwregs[PROTECTSTATE] == 7) { + if (value & 1) + tilem_message(calc, "Flash unlocked"); + else + tilem_message(calc, "Flash locked"); + calc->flash.unlock = value&1; + } + else { + tilem_warning(calc, "Writing to protected port 14"); + } + break; + + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + r = (port & 0xff) - 0x18; + calc->md5assist.regs[r] >>= 8; + calc->md5assist.regs[r] |= (value << 24); + break; + + case 0x1E: + calc->md5assist.shift = value & 0x1f; + break; + + case 0x1F: + calc->md5assist.mode = value & 3; + break; + + case 0x20: + calc->hwregs[PORT20] = value; + + if (value & 3) { + tilem_z80_set_speed(calc, 15000); + } + else { + tilem_z80_set_speed(calc, 6000); + } + + setup_clockdelays(calc); + break; + + case 0x21: + if (calc->flash.unlock) { + calc->hwregs[PORT21] = value; + t = (value >> 4) & 3; + calc->hwregs[NO_EXEC_RAM_MASK] = (0x8000 << t) - 0x400; + calc->flash.overridegroup = value & 3; + } + else { + tilem_warning(calc, "Writing to protected port 21"); + } + break; + + case 0x22: + if (calc->flash.unlock) { + calc->hwregs[PORT22] = value; + } + else { + tilem_warning(calc, "Writing to protected port 22"); + } + break; + + case 0x23: + if (calc->flash.unlock) { + calc->hwregs[PORT23] = value; + } + else { + tilem_warning(calc, "Writing to protected port 23"); + } + break; + + case 0x25: + if (calc->flash.unlock) { + calc->hwregs[PORT25] = value; + calc->hwregs[NO_EXEC_RAM_LOWER] = value * 0x400; + } + else { + tilem_warning(calc, "Writing to protected port 25"); + } + break; + + case 0x26: + if (calc->flash.unlock) { + calc->hwregs[PORT26] = value; + calc->hwregs[NO_EXEC_RAM_UPPER] = value * 0x400; + } + else { + tilem_warning(calc, "Writing to protected port 26"); + } + break; + + case 0x27: + calc->hwregs[PORT27] = value; + break; + + case 0x28: + calc->hwregs[PORT28] = value; + break; + + case 0x29: + calc->hwregs[PORT29] = value; + setup_clockdelays(calc); + break; + + case 0x2A: + calc->hwregs[PORT2A] = value; + setup_clockdelays(calc); + break; + + case 0x2B: + calc->hwregs[PORT2B] = value; + setup_clockdelays(calc); + break; + + case 0x2C: + calc->hwregs[PORT2C] = value; + setup_clockdelays(calc); + break; + + case 0x2D: + calc->hwregs[PORT2D] = value; + break; + + case 0x2E: + calc->hwregs[PORT2E] = value; + setup_clockdelays(calc); + break; + + case 0x2F: + calc->hwregs[PORT2F] = value; + break; + + case 0x30: + tilem_user_timer_set_frequency(calc, 0, value); + break; + case 0x31: + tilem_user_timer_set_mode(calc, 0, value); + break; + case 0x32: + tilem_user_timer_start(calc, 0, value); + break; + + case 0x33: + tilem_user_timer_set_frequency(calc, 1, value); + break; + case 0x34: + tilem_user_timer_set_mode(calc, 1, value); + break; + case 0x35: + tilem_user_timer_start(calc, 1, value); + break; + + case 0x36: + tilem_user_timer_set_frequency(calc, 2, value); + break; + case 0x37: + tilem_user_timer_set_mode(calc, 2, value); + break; + case 0x38: + tilem_user_timer_start(calc, 2, value); + break; + + case 0x40: + time(&curtime); + + if ((calc->hwregs[CLOCK_MODE] & 1) != (value & 1)) { + if (value & 1) + calc->hwregs[CLOCK_DIFF] -= curtime; + else + calc->hwregs[CLOCK_DIFF] += curtime; + } + + if (!(calc->hwregs[CLOCK_MODE] & 2) && (value & 2)) { + calc->hwregs[CLOCK_DIFF] = calc->hwregs[CLOCK_INPUT]; + if (value & 1) + calc->hwregs[CLOCK_DIFF] -= curtime; + } + calc->hwregs[CLOCK_MODE] = value & 3; + break; + + case 0x41: + calc->hwregs[CLOCK_INPUT] &= 0xffffff00; + calc->hwregs[CLOCK_INPUT] |= value; + break; + + case 0x42: + calc->hwregs[CLOCK_INPUT] &= 0xffff00ff; + calc->hwregs[CLOCK_INPUT] |= (value << 8); + break; + + case 0x43: + calc->hwregs[CLOCK_INPUT] &= 0xff00ffff; + calc->hwregs[CLOCK_INPUT] |= (value << 16); + break; + + case 0x44: + calc->hwregs[CLOCK_INPUT] &= 0x00ffffff; + calc->hwregs[CLOCK_INPUT] |= (value << 24); + break; + } + + return; +} + +void x4_z80_ptimer(TilemCalc* calc, int id) +{ + switch (id) { + case TIMER_INT1: + if (calc->hwregs[PORT3] & 0x02) + calc->z80.interrupts |= TILEM_INTERRUPT_TIMER1; + break; + + case TIMER_INT2A: + case TIMER_INT2B: + if (calc->hwregs[PORT3] & 0x04) + calc->z80.interrupts |= TILEM_INTERRUPT_TIMER2; + break; + + case TIMER_LCD_WAIT: + calc->hwregs[LCD_WAIT] = 0; + break; + } +} diff --git a/tool/tilem-src/emu/x4/x4_memory.c b/tool/tilem-src/emu/x4/x4_memory.c new file mode 100644 index 0000000..f33827e --- /dev/null +++ b/tool/tilem-src/emu/x4/x4_memory.c @@ -0,0 +1,207 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2011 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "x4.h" + +void x4_z80_wrmem(TilemCalc* calc, dword A, byte v) +{ + unsigned long pa; + byte page; + + page = calc->mempagemap[A>>14]; + + if (A & 0x8000) { + if (A > (0xFFFF - 64 * calc->hwregs[PORT27])) + page = 0x40; + else if (A < (0x8000 + 64 * calc->hwregs[PORT28])) + page = 0x41; + } + + pa = (A & 0x3FFF) + 0x4000L*page; + + if (pa < 0x100000) { + calc->z80.clock += calc->hwregs[FLASH_WRITE_DELAY]; + tilem_flash_write_byte(calc, pa, v); + } + else if (pa < 0x120000) { + calc->z80.clock += calc->hwregs[RAM_WRITE_DELAY]; + *(calc->mem+pa) = v; + } +} + +static inline byte readbyte(TilemCalc* calc, dword pa) +{ + static const byte protectbytes[6] = {0x00,0x00,0xed,0x56,0xf3,0xd3}; + int state = calc->hwregs[PROTECTSTATE]; + byte value; + + if (pa < 0x100000 && (calc->flash.state || calc->flash.busy)) + value = tilem_flash_read_byte(calc, pa); + else + value = *(calc->mem + pa); + + if (pa < 0xB0000 || pa >= 0x100000 + || (pa >= 0xC0000 && pa < 0xF0000)) + calc->hwregs[PROTECTSTATE] = 0; + else if (state == 6) + calc->hwregs[PROTECTSTATE] = 7; + else if (state < 6 && value == protectbytes[state]) + calc->hwregs[PROTECTSTATE] = state + 1; + else + calc->hwregs[PROTECTSTATE] = 0; + + return (value); +} + +byte x4_z80_rdmem(TilemCalc* calc, dword A) +{ + byte page; + unsigned long pa; + byte value; + + page = calc->mempagemap[A>>14]; + + if (A & 0x8000) { + if (A > (0xFFFF - 64 * calc->hwregs[PORT27])) + page = 0x40; + else if (A < (0x8000 + 64 * calc->hwregs[PORT28])) + page = 0x41; + } + + if (TILEM_UNLIKELY(page == 0x3E && !calc->flash.unlock)) { + tilem_warning(calc, "Reading from read-protected sector"); + return (0xff); + } + + pa = (A & 0x3FFF) + 0x4000L*page; + + if (pa < 0x100000) + calc->z80.clock += calc->hwregs[FLASH_READ_DELAY]; + else + calc->z80.clock += calc->hwregs[RAM_READ_DELAY]; + + value = readbyte(calc, pa); + return (value); +} + +byte x4_z80_rdmem_m1(TilemCalc* calc, dword A) +{ + byte page; + unsigned long pa, m; + byte value; + + page = calc->mempagemap[A>>14]; + + if (A & 0x8000) { + if (A > (0xFFFF - 64 * calc->hwregs[PORT27])) + page = 0x40; + else if (A < (0x8000 + 64 * calc->hwregs[PORT28])) + page = 0x41; + } + + if (TILEM_UNLIKELY(page == 0x3E && !calc->flash.unlock)) { + tilem_warning(calc, "Reading from read-protected sector"); + return (0xff); + } + + pa = (A & 0x3FFF) + 0x4000L*page; + + if (pa < 0x100000) { + calc->z80.clock += calc->hwregs[FLASH_EXEC_DELAY]; + + if (TILEM_UNLIKELY(page >= calc->hwregs[PORT22] + && page <= calc->hwregs[PORT23])) { + tilem_warning(calc, "Executing in restricted Flash area"); + tilem_z80_exception(calc, TILEM_EXC_FLASH_EXEC); + } + } + else { + calc->z80.clock += calc->hwregs[RAM_EXEC_DELAY]; + + m = pa & calc->hwregs[NO_EXEC_RAM_MASK]; + if (TILEM_UNLIKELY(m < calc->hwregs[NO_EXEC_RAM_LOWER] + || m > calc->hwregs[NO_EXEC_RAM_UPPER])) { + tilem_warning(calc, "Executing in restricted RAM area"); + tilem_z80_exception(calc, TILEM_EXC_RAM_EXEC); + } + } + + value = readbyte(calc, pa); + + if (TILEM_UNLIKELY(value == 0xff && A == 0x0038)) { + tilem_warning(calc, "No OS installed"); + tilem_z80_exception(calc, TILEM_EXC_FLASH_EXEC); + } + + return (value); +} + +dword x4_mem_ltop(TilemCalc* calc, dword A) +{ + byte page = calc->mempagemap[A >> 14]; + + if (A & 0x8000) { + if (A > (0xFFFF - 64 * calc->hwregs[PORT27])) + page = 0x40; + else if (A < (0x8000 + 64 * calc->hwregs[PORT28])) + page = 0x41; + } + + return ((page << 14) | (A & 0x3fff)); +} + +dword x4_mem_ptol(TilemCalc* calc, dword A) +{ + byte page = A >> 14; + + if (!page) + return (A & 0x3fff); + + if (page == calc->mempagemap[1]) + return (0x4000 | (A & 0x3fff)); + + if ((A & 0x3fff) < 64 * calc->hwregs[PORT28]) { + if (page == 0x41) + return (0x8000 | (A & 0x3fff)); + } + else { + if (page == calc->mempagemap[2]) + return (0x8000 | (A & 0x3fff)); + } + + if ((A & 0x3fff) >= (0x4000 - 64 * calc->hwregs[PORT27])) { + if (page == 0x40) + return (0xC000 | (A & 0x3fff)); + } + else { + if (page == calc->mempagemap[3]) + return (0xC000 | (A & 0x3fff)); + } + + return (0xffffffff); +} diff --git a/tool/tilem-src/emu/x4/x4_subcore.c b/tool/tilem-src/emu/x4/x4_subcore.c new file mode 100644 index 0000000..b393ecf --- /dev/null +++ b/tool/tilem-src/emu/x4/x4_subcore.c @@ -0,0 +1,65 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2012 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "x4.h" + +static const TilemFlashSector flashsectors[] = { + {0x000000, 0x10000, 0}, {0x010000, 0x10000, 0}, + {0x020000, 0x10000, 0}, {0x030000, 0x10000, 0}, + {0x040000, 0x10000, 0}, {0x050000, 0x10000, 0}, + {0x060000, 0x10000, 0}, {0x070000, 0x10000, 0}, + {0x080000, 0x10000, 0}, {0x090000, 0x10000, 0}, + {0x0A0000, 0x10000, 0}, {0x0B0000, 0x10000, 1}, + {0x0C0000, 0x10000, 0}, {0x0D0000, 0x10000, 0}, + {0x0E0000, 0x10000, 0}, {0x0F0000, 0x08000, 0}, + {0x0F8000, 0x02000, 0}, {0x0FA000, 0x02000, 0}, + {0x0FC000, 0x04000, 1}}; + +#define NUM_FLASH_SECTORS (sizeof(flashsectors) / sizeof(TilemFlashSector)) + +static const char* hwregnames[NUM_HW_REGS] = HW_REG_NAMES; + +static const char* hwtimernames[NUM_HW_TIMERS] = HW_TIMER_NAMES; + +extern const char* xp_keynames[]; + +TilemHardware hardware_ti84p = { + '4', "ti84p", "TI-84 Plus", + (TILEM_CALC_HAS_LINK | TILEM_CALC_HAS_LINK_ASSIST + | TILEM_CALC_HAS_T6A04 | TILEM_CALC_HAS_FLASH + | TILEM_CALC_HAS_MD5_ASSIST), + 96, 64, 64 * 0x4000, 8 * 0x4000, 16 * 64, 0x80, + NUM_FLASH_SECTORS, flashsectors, 3, + NUM_HW_REGS, hwregnames, + NUM_HW_TIMERS, hwtimernames, + xp_keynames, + x4_reset, x4_stateloaded, + x4_z80_in, x4_z80_out, + x4_z80_wrmem, x4_z80_rdmem, x4_z80_rdmem_m1, NULL, + x4_z80_ptimer, tilem_lcd_t6a04_get_data, + x4_mem_ltop, x4_mem_ptol }; diff --git a/tool/tilem-src/emu/x5/x5.h b/tool/tilem-src/emu/x5/x5.h new file mode 100644 index 0000000..2af3ed6 --- /dev/null +++ b/tool/tilem-src/emu/x5/x5.h @@ -0,0 +1,49 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifndef _TILEM_X5_H +#define _TILEM_X5_H + +enum { + PORT3, /* mask of enabled interrupts */ + PORT4, /* mapping mode, timer control */ + PORT5, /* memory mapping bank A */ + PORT6, /* memory mapping bank B */ + PORT7, /* link port control */ + NUM_HW_REGS +}; + +#define HW_REG_NAMES { "port3", "port4", "port5", "port6", "port7" } + +#define TIMER_INT (TILEM_NUM_SYS_TIMERS + 1) +#define NUM_HW_TIMERS 1 + +#define HW_TIMER_NAMES { "int" } + +void x5_reset(TilemCalc* calc); +byte x5_z80_in(TilemCalc* calc, dword port); +void x5_z80_out(TilemCalc* calc, dword port, byte value); +void x5_z80_ptimer(TilemCalc* calc, int id); +void x5_z80_wrmem(TilemCalc* calc, dword addr, byte value); +byte x5_z80_rdmem(TilemCalc* calc, dword addr); +dword x5_mem_ltop(TilemCalc* calc, dword addr); +dword x5_mem_ptol(TilemCalc* calc, dword addr); + +#endif diff --git a/tool/tilem-src/emu/x5/x5_init.c b/tool/tilem-src/emu/x5/x5_init.c new file mode 100644 index 0000000..07ca164 --- /dev/null +++ b/tool/tilem-src/emu/x5/x5_init.c @@ -0,0 +1,49 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "x5.h" + +void x5_reset(TilemCalc* calc) +{ + calc->hwregs[PORT3] = 0x0B; + calc->hwregs[PORT4] = 0x16; + calc->hwregs[PORT5] = 0x00; + calc->hwregs[PORT6] = 0x40; + + calc->mempagemap[0] = 0x00; + calc->mempagemap[1] = 0x00; + calc->mempagemap[2] = 0x08; + calc->mempagemap[3] = 0x08; + + calc->lcd.addr = 0x3c00; + + tilem_z80_set_speed(calc, 6000); + + /* FIXME: measure actual frequency */ + tilem_z80_set_timer(calc, TIMER_INT, 1000, 5000, 1); +} diff --git a/tool/tilem-src/emu/x5/x5_io.c b/tool/tilem-src/emu/x5/x5_io.c new file mode 100644 index 0000000..cd48f55 --- /dev/null +++ b/tool/tilem-src/emu/x5/x5_io.c @@ -0,0 +1,183 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2011 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "x5.h" + +byte x5_z80_in(TilemCalc* calc, dword port) +{ + byte v, b; + + switch(port&0xff) { + case 0x01: + return(tilem_keypad_read_keys(calc)); + + case 0x03: + v = (calc->keypad.onkeydown ? 0x00 : 0x08); + + if (calc->z80.interrupts & TILEM_INTERRUPT_ON_KEY) + v |= 0x01; + if (calc->z80.interrupts & TILEM_INTERRUPT_TIMER1) + v |= 0x02; + + return(v); + + case 0x04: + return(0x01); + + case 0x05: + return(calc->hwregs[PORT5]); + + case 0x06: + return(calc->hwregs[PORT6]); + + case 0x07: + v = tilem_linkport_get_lines(calc); + b = (calc->hwregs[PORT7] >> 4) | 0xf0; + return ((calc->hwregs[PORT7] & b) | (v & ~b)); + } + + tilem_warning(calc, "Input from port %x", port); + return(0x00); +} + + +static void setup_mapping(TilemCalc* calc) +{ + unsigned int pageA, pageB; + + if (calc->hwregs[PORT5] & 0x40) { + pageA = (0x08 | (calc->hwregs[PORT5] & 1)); + } + else { + pageA = (calc->hwregs[PORT5] & 7); + } + + if (calc->hwregs[PORT6] & 0x40) { + pageB = (0x08 | (calc->hwregs[PORT6] & 1)); + } + else { + pageB = (calc->hwregs[PORT6] & 7); + } + + calc->mempagemap[1] = pageA; + calc->mempagemap[2] = pageB; + calc->mempagemap[3] = 0x08; +} + +void x5_z80_out(TilemCalc* calc, dword port, byte value) +{ + switch(port&0xff) { + case 0x00: + calc->lcd.addr = ((value & 0x3f) << 8); + calc->z80.lastlcdwrite = calc->z80.clock; + break; + + case 0x01: + tilem_keypad_set_group(calc, value); + break; + + case 0x02: + /* Contrast */ + calc->lcd.contrast = 16 + (value & 0x1f); + break; + + case 0x03: + /* Interrupts / LCD power */ + if (value & 0x01) { + calc->keypad.onkeyint = 1; + } + else { + calc->z80.interrupts &= ~TILEM_INTERRUPT_ON_KEY; + calc->keypad.onkeyint = 0; + } + + if (!(value & 0x02)) { + calc->z80.interrupts &= ~TILEM_INTERRUPT_TIMER1; + } + + calc->hwregs[PORT3] = value; + calc->lcd.active = calc->poweronhalt = ((value & 8) >> 3); + break; + + case 0x04: + /* LCD control */ + calc->hwregs[PORT4] = value; + + switch (value & 0x18) { + case 0x00: + calc->lcd.rowstride = 10; + break; + + case 0x08: + calc->lcd.rowstride = 12; + break; + + case 0x10: + calc->lcd.rowstride = 16; + break; + + case 0x18: + calc->lcd.rowstride = 20; + break; + } + calc->z80.lastlcdwrite = calc->z80.clock; + break; + + case 0x05: + calc->hwregs[PORT5] = value; + setup_mapping(calc); + break; + + case 0x06: + calc->hwregs[PORT6] = value; + setup_mapping(calc); + break; + + case 0x07: + /* Link */ + calc->hwregs[PORT7] = value; + + value = (((value >> 6) & (value >> 2)) + | ((value >> 4) & ~value)); + + tilem_linkport_set_lines(calc, value); + break; + } + + return; +} + +void x5_z80_ptimer(TilemCalc* calc, int id) +{ + switch (id) { + case TIMER_INT: + if (calc->hwregs[PORT3] & 0x02) + calc->z80.interrupts |= TILEM_INTERRUPT_TIMER1; + break; + } +} diff --git a/tool/tilem-src/emu/x5/x5_memory.c b/tool/tilem-src/emu/x5/x5_memory.c new file mode 100644 index 0000000..050e234 --- /dev/null +++ b/tool/tilem-src/emu/x5/x5_memory.c @@ -0,0 +1,68 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2011 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "x5.h" + +void x5_z80_wrmem(TilemCalc* calc, dword A, byte v) +{ + dword pa = 0x4000 * calc->mempagemap[(A)>>14] + (A & 0x3FFF); + + if (pa >= 0x20000) { + *(calc->mem + pa) = v; + + if (((pa - 0x20000 - calc->lcd.addr) >> 6) + < (unsigned) calc->lcd.rowstride) + calc->z80.lastlcdwrite = calc->z80.clock; + } +} + +byte x5_z80_rdmem(TilemCalc* calc, dword A) +{ + dword pa = 0x4000 * calc->mempagemap[(A)>>14] + (A & 0x3FFF); + return (*(calc->mem + pa)); +} + +dword x5_mem_ltop(TilemCalc* calc, dword A) +{ + byte page = calc->mempagemap[A >> 14]; + return ((page << 14) | (A & 0x3fff)); +} + +dword x5_mem_ptol(TilemCalc* calc, dword A) +{ + byte page = A >> 14; + int i; + + for (i = 0; i < 4; i++) { + if (calc->mempagemap[i] == page) { + return ((i << 14) | (A & 0x3fff)); + } + } + + return (0xffffffff); +} diff --git a/tool/tilem-src/emu/x5/x5_subcore.c b/tool/tilem-src/emu/x5/x5_subcore.c new file mode 100644 index 0000000..d8a5232 --- /dev/null +++ b/tool/tilem-src/emu/x5/x5_subcore.c @@ -0,0 +1,58 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "x5.h" + +static const char* hwregnames[NUM_HW_REGS] = HW_REG_NAMES; + +static const char* hwtimernames[NUM_HW_TIMERS] = HW_TIMER_NAMES; + +static const char* keynames[64] = { + "Down", "Left", "Right", "Up", 0, 0, 0, 0, + "Enter", "Add", "Sub", "Mul", "Div", "Power", "Clear", 0, + "Chs", "3", "6", "9", "RParen", "Tan", "Custom", 0, + "DecPnt", "2", "5", "8", "LParen", "Cos", "Prgm", "Del", + "0", "1", "4", "7", "EE", "Sin", "Stat", "XVar", + "On", "Store", "Comma", "Square", "Ln", "Log", "Graph", "Alpha", + "F5", "F4", "F3", "F2", "F1", "2nd", "Exit", "More", + 0, 0, 0, 0, 0, 0, 0, 0}; + +const TilemHardware hardware_ti85 = { + '5', "ti85", "TI-85", + TILEM_CALC_HAS_LINK, + 128, 64, 8 * 0x4000, 0x8000, 0, 0x40, + 0, NULL, 0, + NUM_HW_REGS, hwregnames, + NUM_HW_TIMERS, hwtimernames, + keynames, + x5_reset, NULL, + x5_z80_in, x5_z80_out, + x5_z80_wrmem, x5_z80_rdmem, x5_z80_rdmem, NULL, + x5_z80_ptimer, tilem_lcd_t6a43_get_data, + x5_mem_ltop, x5_mem_ptol }; + diff --git a/tool/tilem-src/emu/x6/x6.h b/tool/tilem-src/emu/x6/x6.h new file mode 100644 index 0000000..f55d3a9 --- /dev/null +++ b/tool/tilem-src/emu/x6/x6.h @@ -0,0 +1,49 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifndef _TILEM_X6_H +#define _TILEM_X6_H + +enum { + PORT3, /* mask of enabled interrupts */ + PORT4, /* mapping mode, timer control */ + PORT5, /* memory mapping bank A */ + PORT6, /* memory mapping bank B */ + PORT7, /* link port control */ + NUM_HW_REGS +}; + +#define HW_REG_NAMES { "port3", "port4", "port5", "port6", "port7" } + +#define TIMER_INT (TILEM_NUM_SYS_TIMERS + 1) +#define NUM_HW_TIMERS 1 + +#define HW_TIMER_NAMES { "int" } + +void x6_reset(TilemCalc* calc); +byte x6_z80_in(TilemCalc* calc, dword port); +void x6_z80_out(TilemCalc* calc, dword port, byte value); +void x6_z80_ptimer(TilemCalc* calc, int id); +void x6_z80_wrmem(TilemCalc* calc, dword addr, byte value); +byte x6_z80_rdmem(TilemCalc* calc, dword addr); +dword x6_mem_ltop(TilemCalc* calc, dword addr); +dword x6_mem_ptol(TilemCalc* calc, dword addr); + +#endif diff --git a/tool/tilem-src/emu/x6/x6_init.c b/tool/tilem-src/emu/x6/x6_init.c new file mode 100644 index 0000000..27e6417 --- /dev/null +++ b/tool/tilem-src/emu/x6/x6_init.c @@ -0,0 +1,49 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "x6.h" + +void x6_reset(TilemCalc* calc) +{ + calc->hwregs[PORT3] = 0x0B; + calc->hwregs[PORT4] = 0x56; + calc->hwregs[PORT5] = 0x00; + calc->hwregs[PORT6] = 0x00; + + calc->mempagemap[0] = 0x00; + calc->mempagemap[1] = 0x00; + calc->mempagemap[2] = 0x00; + calc->mempagemap[3] = 0x10 + 0x00; + + calc->lcd.addr = 0x3c00; + + tilem_z80_set_speed(calc, 6000); + + /* FIXME: measure actual frequency */ + tilem_z80_set_timer(calc, TIMER_INT, 1000, 5000, 1); +} diff --git a/tool/tilem-src/emu/x6/x6_io.c b/tool/tilem-src/emu/x6/x6_io.c new file mode 100644 index 0000000..92a0d49 --- /dev/null +++ b/tool/tilem-src/emu/x6/x6_io.c @@ -0,0 +1,183 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2011 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "x6.h" + +byte x6_z80_in(TilemCalc* calc, dword port) +{ + byte v, b; + + switch(port&0xff) { + case 0x01: + return(tilem_keypad_read_keys(calc)); + + case 0x03: + v = (calc->keypad.onkeydown ? 0x00 : 0x08); + + if (calc->z80.interrupts & TILEM_INTERRUPT_ON_KEY) + v |= 0x01; + if (calc->z80.interrupts & TILEM_INTERRUPT_TIMER1) + v |= 0x02; + + return(v); + + case 0x04: + return(0x01); + + case 0x05: + return(calc->hwregs[PORT5]); + + case 0x06: + return(calc->hwregs[PORT6]); + + case 0x07: + v = tilem_linkport_get_lines(calc); + b = (calc->hwregs[PORT7] >> 4) | 0xf0; + return (calc->hwregs[PORT7] & b) | (v & ~b); + } + + tilem_warning(calc, "Input from port %x", port); + return(0x00); +} + + +static void setup_mapping(TilemCalc* calc) +{ + unsigned int pageA, pageB; + + if (calc->hwregs[PORT5] & 0x40) { + pageA = (0x10 | (calc->hwregs[PORT5] & 7)); + } + else { + pageA = (calc->hwregs[PORT5] & 0x0f); + } + + if (calc->hwregs[PORT6] & 0x40) { + pageB = (0x10 | (calc->hwregs[PORT6] & 7)); + } + else { + pageB = (calc->hwregs[PORT6] & 0x0f); + } + + calc->mempagemap[1] = pageA; + calc->mempagemap[2] = pageB; + calc->mempagemap[3] = 0x10; +} + +void x6_z80_out(TilemCalc* calc, dword port, byte value) +{ + switch(port&0xff) { + case 0x00: + calc->lcd.addr = ((value & 0x3f) << 8); + calc->z80.lastlcdwrite = calc->z80.clock; + break; + + case 0x01: + tilem_keypad_set_group(calc, value); + break; + + case 0x02: + /* contrast */ + calc->lcd.contrast = 16 + (value & 0x1f); + break; + + case 0x03: + /* Lcd Power */ + if (value & 0x01) { + calc->keypad.onkeyint = 1; + } + else { + calc->z80.interrupts &= ~TILEM_INTERRUPT_ON_KEY; + calc->keypad.onkeyint = 0; + } + + if (!(value & 0x02)) { + calc->z80.interrupts &= ~TILEM_INTERRUPT_TIMER1; + } + + calc->hwregs[PORT3] = value; + calc->lcd.active = calc->poweronhalt = ((value & 8) >> 3); + break; + + case 0x04: + /* LCD control */ + calc->hwregs[PORT4] = value; + + switch (value & 0x18) { + case 0x00: + calc->lcd.rowstride = 10; + break; + + case 0x08: + calc->lcd.rowstride = 12; + break; + + case 0x10: + calc->lcd.rowstride = 16; + break; + + case 0x18: + calc->lcd.rowstride = 20; + break; + } + calc->z80.lastlcdwrite = calc->z80.clock; + break; + + case 0x05: + calc->hwregs[PORT5] = value; + setup_mapping(calc); + break; + + case 0x06: + calc->hwregs[PORT6] = value; + setup_mapping(calc); + break; + + case 0x07: + /* Link */ + calc->hwregs[PORT7] = value; + + value = (((value >> 6) & (value >> 2)) + | ((value >> 4) & ~value)); + + tilem_linkport_set_lines(calc, value); + break; + } + + return; +} + +void x6_z80_ptimer(TilemCalc* calc, int id) +{ + switch (id) { + case TIMER_INT: + if (calc->hwregs[PORT3] & 0x02) + calc->z80.interrupts |= TILEM_INTERRUPT_TIMER1; + break; + } +} diff --git a/tool/tilem-src/emu/x6/x6_memory.c b/tool/tilem-src/emu/x6/x6_memory.c new file mode 100644 index 0000000..f771a2f --- /dev/null +++ b/tool/tilem-src/emu/x6/x6_memory.c @@ -0,0 +1,68 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2011 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "x6.h" + +void x6_z80_wrmem(TilemCalc* calc, dword A, byte v) +{ + dword pa = 0x4000 * calc->mempagemap[(A)>>14] + (A & 0x3FFF); + + if (pa >= 0x40000) { + *(calc->mem + pa) = v; + + if (((pa - 0x40000 - calc->lcd.addr) >> 6) + < (unsigned) calc->lcd.rowstride) + calc->z80.lastlcdwrite = calc->z80.clock; + } +} + +byte x6_z80_rdmem(TilemCalc* calc, dword A) +{ + dword pa = 0x4000 * calc->mempagemap[(A)>>14] + (A & 0x3FFF); + return (*(calc->mem + pa)); +} + +dword x6_mem_ltop(TilemCalc* calc, dword A) +{ + byte page = calc->mempagemap[A >> 14]; + return ((page << 14) | (A & 0x3fff)); +} + +dword x6_mem_ptol(TilemCalc* calc, dword A) +{ + byte page = A >> 14; + int i; + + for (i = 0; i < 4; i++) { + if (calc->mempagemap[i] == page) { + return ((i << 14) | (A & 0x3fff)); + } + } + + return (0xffffffff); +} diff --git a/tool/tilem-src/emu/x6/x6_subcore.c b/tool/tilem-src/emu/x6/x6_subcore.c new file mode 100644 index 0000000..2a69455 --- /dev/null +++ b/tool/tilem-src/emu/x6/x6_subcore.c @@ -0,0 +1,57 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "x6.h" + +static const char* hwregnames[NUM_HW_REGS] = HW_REG_NAMES; + +static const char* hwtimernames[NUM_HW_TIMERS] = HW_TIMER_NAMES; + +static const char* keynames[64] = { + "Down", "Left", "Right", "Up", 0, 0, 0, 0, + "Enter", "Add", "Sub", "Mul", "Div", "Power", "Clear", 0, + "Chs", "3", "6", "9", "RParen", "Tan", "Custom", 0, + "DecPnt", "2", "5", "8", "LParen", "Cos", "Prgm", "Del", + "0", "1", "4", "7", "EE", "Sin", "Table", "XVar", + "On", "Store", "Comma", "Square", "Ln", "Log", "Graph", "Alpha", + "F5", "F4", "F3", "F2", "F1", "2nd", "Exit", "More", + 0, 0, 0, 0, 0, 0, 0, 0}; + +const TilemHardware hardware_ti86 = { + '6', "ti86", "TI-86", + TILEM_CALC_HAS_LINK, + 128, 64, 0x10 * 0x4000, 0x08 * 0x4000, 0, 0x40, + 0, NULL, 0, + NUM_HW_REGS, hwregnames, + NUM_HW_TIMERS, hwtimernames, + keynames, + x6_reset, NULL, + x6_z80_in, x6_z80_out, + x6_z80_wrmem, x6_z80_rdmem, x6_z80_rdmem, NULL, + x6_z80_ptimer, tilem_lcd_t6a43_get_data, + x6_mem_ltop, x6_mem_ptol }; diff --git a/tool/tilem-src/emu/x7/x7.h b/tool/tilem-src/emu/x7/x7.h new file mode 100644 index 0000000..53543ba --- /dev/null +++ b/tool/tilem-src/emu/x7/x7.h @@ -0,0 +1,56 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifndef _TILEM_X7_H +#define _TILEM_X7_H + +enum { + PORT3, /* mask of enabled interrupts */ + PORT4, /* interrupt timer speed */ + PORT6, /* memory mapping bank A */ + PORT7, /* memory mapping bank B */ + NOEXEC, /* no-exec sector map */ + PROTECTSTATE, /* port protection state */ + NUM_HW_REGS +}; + +#define HW_REG_NAMES \ + { "port3", "port4", "port6", "port7", "noexec", \ + "protectstate" } + +#define TIMER_INT1 (TILEM_NUM_SYS_TIMERS + 1) +#define TIMER_INT2A (TILEM_NUM_SYS_TIMERS + 2) +#define TIMER_INT2B (TILEM_NUM_SYS_TIMERS + 3) +#define NUM_HW_TIMERS 3 + +#define HW_TIMER_NAMES { "int1", "int2a", "int2b" } + +void x7_reset(TilemCalc* calc); +void x7_stateloaded(TilemCalc* calc, int savtype); +byte x7_z80_in(TilemCalc* calc, dword port); +void x7_z80_out(TilemCalc* calc, dword port, byte value); +void x7_z80_ptimer(TilemCalc* calc, int id); +void x7_z80_wrmem(TilemCalc* calc, dword addr, byte value); +byte x7_z80_rdmem(TilemCalc* calc, dword addr); +byte x7_z80_rdmem_m1(TilemCalc* calc, dword addr); +dword x7_mem_ltop(TilemCalc* calc, dword addr); +dword x7_mem_ptol(TilemCalc* calc, dword addr); + +#endif diff --git a/tool/tilem-src/emu/x7/x7_init.c b/tool/tilem-src/emu/x7/x7_init.c new file mode 100644 index 0000000..1d2a62e --- /dev/null +++ b/tool/tilem-src/emu/x7/x7_init.c @@ -0,0 +1,59 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2011 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "x7.h" + +void x7_reset(TilemCalc* calc) +{ + calc->hwregs[PORT3] = 0x0B; + calc->hwregs[PORT4] = 0x77; + calc->hwregs[PORT6] = 0x1F; + calc->hwregs[PORT7] = 0x1F; + + calc->mempagemap[0] = 0x00; + calc->mempagemap[1] = 0x1E; + calc->mempagemap[2] = 0x1F; + calc->mempagemap[3] = 0x1F; + + calc->z80.r.pc.d = 0x8000; + + calc->hwregs[NOEXEC] = 0; + calc->hwregs[PROTECTSTATE] = 0; + + tilem_z80_set_speed(calc, 6000); + + tilem_z80_set_timer(calc, TIMER_INT1, 1600, 8474, 1); + tilem_z80_set_timer(calc, TIMER_INT2A, 1300, 8474, 1); + tilem_z80_set_timer(calc, TIMER_INT2B, 1000, 8474, 1); +} + +void x7_stateloaded(TilemCalc* calc, int savtype TILEM_ATTR_UNUSED) +{ + tilem_calc_fix_certificate(calc, calc->mem + (0x1E * 0x4000L), + 0x08, 0x13, 0x1f18); +} diff --git a/tool/tilem-src/emu/x7/x7_io.c b/tool/tilem-src/emu/x7/x7_io.c new file mode 100644 index 0000000..aaca352 --- /dev/null +++ b/tool/tilem-src/emu/x7/x7_io.c @@ -0,0 +1,247 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "x7.h" + +byte x7_z80_in(TilemCalc* calc, dword port) +{ + /* FIXME: measure actual levels */ + static const byte battlevel[4] = { 33, 39, 36, 43 }; + byte v; + + /* FIXME: confirm that mirror ports are the same as on 83+ + - and figure out what, if anything, port 5 does */ + + switch(port&0x1f) { + case 0x00: + case 0x08: + v = tilem_linkport_get_lines(calc); + v |= (calc->linkport.lines << 4); + return(v); + + case 0x01: + case 0x09: + return(tilem_keypad_read_keys(calc)); + + case 0x02: + case 0x0A: + v = battlevel[calc->hwregs[PORT4] >> 6]; + return(calc->battery >= v ? 0x05 : 0x04); + + case 0x03: + case 0x0B: + return(calc->hwregs[PORT3]); + + case 0x04: + case 0x0C: + v = (calc->keypad.onkeydown ? 0x00 : 0x08); + + if (calc->z80.interrupts & TILEM_INTERRUPT_ON_KEY) + v |= 0x01; + if (calc->z80.interrupts & TILEM_INTERRUPT_TIMER1) + v |= 0x02; + if (calc->z80.interrupts & TILEM_INTERRUPT_TIMER2) + v |= 0x04; + if (calc->z80.interrupts & TILEM_INTERRUPT_LINK_ACTIVE) + v |= 0x10; + + return(v); + + case 0x06: + case 0x0E: + return(calc->hwregs[PORT6]); + + case 0x07: + case 0x0F: + return(calc->hwregs[PORT7]); + + case 0x10: + case 0x12: + case 0x18: + case 0x1A: + return(tilem_lcd_t6a04_status(calc)); + + case 0x11: + case 0x13: + case 0x19: + case 0x1B: + return(tilem_lcd_t6a04_read(calc)); + } + return(0x00); +} + + +static void setup_mapping(TilemCalc* calc) +{ + unsigned int pageA, pageB; + + if (calc->hwregs[PORT6] & 0x40) + pageA = (0x20 | (calc->hwregs[PORT6] & 1)); + else + pageA = (calc->hwregs[PORT6] & 0x1f); + + if (calc->hwregs[PORT7] & 0x40) + pageB = (0x20 | (calc->hwregs[PORT7] & 1)); + else + pageB = (calc->hwregs[PORT7] & 0x1f); + + if (calc->hwregs[PORT4] & 1) { + /* FIXME: confirm this behavior (83+-like rather than + 83-like) */ + calc->mempagemap[1] = (pageA & ~1); + calc->mempagemap[2] = pageA; + calc->mempagemap[3] = pageB; + } + else { + calc->mempagemap[1] = pageA; + calc->mempagemap[2] = pageB; + calc->mempagemap[3] = 0x20; + } +} + +void x7_z80_out(TilemCalc* calc, dword port, byte value) +{ + static const int tmrvalues[4] = { 1786, 4032, 5882, 8474 }; + int t; + unsigned int mode; + + switch(port&0x1f) { + case 0x00: + case 0x08: + tilem_linkport_set_lines(calc, value); + break; + + case 0x01: + case 0x09: + tilem_keypad_set_group(calc, value); + break; + + case 0x03: + case 0x0B: + if (value & 0x01) { + calc->keypad.onkeyint = 1; + } + else { + calc->z80.interrupts &= ~TILEM_INTERRUPT_ON_KEY; + calc->keypad.onkeyint = 0; + } + + if (!(value & 0x02)) + calc->z80.interrupts &= ~TILEM_INTERRUPT_TIMER1; + + if (!(value & 0x04)) + calc->z80.interrupts &= ~TILEM_INTERRUPT_TIMER2; + + mode = calc->linkport.mode; + if (value & 0x10) + mode |= TILEM_LINK_MODE_INT_ON_ACTIVE; + else + mode &= ~TILEM_LINK_MODE_INT_ON_ACTIVE; + + tilem_linkport_set_mode(calc, mode); + + calc->poweronhalt = ((value & 8) >> 3); + calc->hwregs[PORT3] = value; + break; + + case 0x04: + case 0x0C: + calc->hwregs[PORT4] = value; + + t = tmrvalues[(value & 6) >> 1]; + tilem_z80_set_timer_period(calc, TIMER_INT1, t); + tilem_z80_set_timer_period(calc, TIMER_INT2A, t); + tilem_z80_set_timer_period(calc, TIMER_INT2B, t); + + setup_mapping(calc); + break; + + case 0x06: + case 0x0E: + calc->hwregs[PORT6] = value & 0x7f; + setup_mapping(calc); + break; + + case 0x07: + case 0x0F: + calc->hwregs[PORT7] = value & 0x7f; + setup_mapping(calc); + break; + + case 0x10: + case 0x12: + case 0x18: + case 0x1A: + tilem_lcd_t6a04_control(calc, value); + break; + + case 0x11: + case 0x13: + case 0x19: + case 0x1B: + tilem_lcd_t6a04_write(calc, value); + break; + + case 0x14: + case 0x15: + if (calc->hwregs[PROTECTSTATE] == 7) { + if (value & 1) + tilem_message(calc, "Flash unlocked"); + else + tilem_message(calc, "Flash locked"); + calc->flash.unlock = value&1; + } + break; + + case 0x16: + case 0x17: + if (calc->flash.unlock && calc->hwregs[PROTECTSTATE] == 7) { + tilem_message(calc, "No-exec mask set to %x", value); + calc->hwregs[NOEXEC] = ((value & 0x0f) << 2); + } + break; + } + + return; +} + +void x7_z80_ptimer(TilemCalc* calc, int id) +{ + switch (id) { + case TIMER_INT1: + if (calc->hwregs[PORT3] & 0x02) + calc->z80.interrupts |= TILEM_INTERRUPT_TIMER1; + break; + + case TIMER_INT2A: + case TIMER_INT2B: + if (calc->hwregs[PORT3] & 0x04) + calc->z80.interrupts |= TILEM_INTERRUPT_TIMER2; + break; + } +} diff --git a/tool/tilem-src/emu/x7/x7_memory.c b/tool/tilem-src/emu/x7/x7_memory.c new file mode 100644 index 0000000..d39dc0a --- /dev/null +++ b/tool/tilem-src/emu/x7/x7_memory.c @@ -0,0 +1,132 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2011 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "x7.h" + +void x7_z80_wrmem(TilemCalc* calc, dword A, byte v) +{ + unsigned long pa; + + pa = (A & 0x3FFF) + 0x4000*calc->mempagemap[(A)>>14]; + + if (pa<0x80000) + tilem_flash_write_byte(calc, pa, v); + + else if (pa < 0x88000) + *(calc->mem+pa) = v; +} + +static inline byte readbyte(TilemCalc* calc, dword pa) +{ + static const byte protectbytes[6] = {0x00,0x00,0xed,0x56,0xf3,0xd3}; + int state = calc->hwregs[PROTECTSTATE]; + byte value; + + if (pa < 0x80000 && (calc->flash.state || calc->flash.busy)) + value = tilem_flash_read_byte(calc, pa); + else + value = *(calc->mem + pa); + + if (pa < 0x70000 || pa >= 0x80000) + calc->hwregs[PROTECTSTATE] = 0; + else if (state == 6) + calc->hwregs[PROTECTSTATE] = 7; + else if (state < 6 && value == protectbytes[state]) + calc->hwregs[PROTECTSTATE] = state + 1; + else + calc->hwregs[PROTECTSTATE] = 0; + + return (value); +} + +byte x7_z80_rdmem(TilemCalc* calc, dword A) +{ + byte page; + unsigned long pa; + byte value; + + page = calc->mempagemap[A>>14]; + pa = 0x4000 * page + (A & 0x3FFF); + + if (TILEM_UNLIKELY(page == 0x1E && !calc->flash.unlock)) { + tilem_warning(calc, "Reading from read-protected sector"); + return (0xff); + } + + value = readbyte(calc, pa); + return(value); +} + +byte x7_z80_rdmem_m1(TilemCalc* calc, dword A) +{ + byte page; + unsigned long pa; + byte value; + + page = calc->mempagemap[A>>14]; + pa = 0x4000 * page + (A & 0x3FFF); + + if (TILEM_UNLIKELY(calc->hwregs[NOEXEC] & (1 << (page % 4)))) { + tilem_warning(calc, "Executing in restricted Flash area"); + tilem_z80_exception(calc, TILEM_EXC_FLASH_EXEC); + } + + if (TILEM_UNLIKELY(page == 0x1E && !calc->flash.unlock)) { + tilem_warning(calc, "Reading from read-protected sector"); + tilem_z80_exception(calc, TILEM_EXC_RAM_EXEC); + } + + value = readbyte(calc, pa); + + if (TILEM_UNLIKELY(value == 0xff && A == 0x0038)) { + tilem_warning(calc, "No OS installed"); + tilem_z80_exception(calc, TILEM_EXC_FLASH_EXEC); + } + + return (value); +} + +dword x7_mem_ltop(TilemCalc* calc, dword A) +{ + byte page = calc->mempagemap[A >> 14]; + return ((page << 14) | (A & 0x3fff)); +} + +dword x7_mem_ptol(TilemCalc* calc, dword A) +{ + byte page = A >> 14; + int i; + + for (i = 0; i < 4; i++) { + if (calc->mempagemap[i] == page) { + return ((i << 14) | (A & 0x3fff)); + } + } + + return (0xffffffff); +} diff --git a/tool/tilem-src/emu/x7/x7_subcore.c b/tool/tilem-src/emu/x7/x7_subcore.c new file mode 100644 index 0000000..69e480a --- /dev/null +++ b/tool/tilem-src/emu/x7/x7_subcore.c @@ -0,0 +1,72 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2012 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "x7.h" + +static const TilemFlashSector flashsectors[] = { + {0x000000, 0x10000, 0}, + {0x010000, 0x10000, 0}, + {0x020000, 0x10000, 0}, + {0x030000, 0x10000, 0}, + {0x040000, 0x10000, 0}, + {0x050000, 0x10000, 0}, + {0x060000, 0x10000, 0}, + {0x070000, 0x08000, 0}, + {0x078000, 0x02000, 0}, + {0x07A000, 0x02000, 0}, + {0x07C000, 0x04000, 1}}; + +#define NUM_FLASH_SECTORS (sizeof(flashsectors) / sizeof(TilemFlashSector)) + +static const char* hwregnames[NUM_HW_REGS] = HW_REG_NAMES; + +static const char* hwtimernames[NUM_HW_TIMERS] = HW_TIMER_NAMES; + +static const char* keynames[64] = { + "Down", "Left", "Right", "Up", 0, 0, 0, 0, + "Enter", "Add", "Sub", "Mul", "Div", "Const", "Clear", 0, + "Chs", "3", "6", "9", "RParen", "MixSimp", "AppsMenu", 0, + "DecPnt", "2", "5", "8", "LParen", "FracDec", "Prgm", "StatEd", + "0", "1", "4", "7", "Percent", "FracSlash", "Expon", "Draw", + "On", "Store", "Comma", "VarX", "Simp", "Unit", "Square", "Math", + "Graph", "Trace", "Zoom", "Window", "YEqu", "2nd", "Mode", "Del", + 0, 0, 0, 0, 0, 0, 0, 0}; + +TilemHardware hardware_ti73 = { + '7', "ti73", "TI-73", + (TILEM_CALC_HAS_LINK | TILEM_CALC_HAS_T6A04 | TILEM_CALC_HAS_FLASH), + 96, 64, 32 * 0x4000, 2 * 0x4000, 15 * 64, 0x40, + NUM_FLASH_SECTORS, flashsectors, 0, + NUM_HW_REGS, hwregnames, + NUM_HW_TIMERS, hwtimernames, + keynames, + x7_reset, x7_stateloaded, + x7_z80_in, x7_z80_out, + x7_z80_wrmem, x7_z80_rdmem, x7_z80_rdmem_m1, NULL, + x7_z80_ptimer, tilem_lcd_t6a04_get_data, + x7_mem_ltop, x7_mem_ptol }; diff --git a/tool/tilem-src/emu/xn/xn.h b/tool/tilem-src/emu/xn/xn.h new file mode 100644 index 0000000..b5e4841 --- /dev/null +++ b/tool/tilem-src/emu/xn/xn.h @@ -0,0 +1,105 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2009-2011 Benjamin Moody + * + * 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, see + * . + */ + +#ifndef _TILEM_XN_H +#define _TILEM_XN_H + +enum { + PORT3, /* mask of enabled interrupts */ + PORT4, /* interrupt timer speed */ + PORT5, /* memory mapping bank C */ + PORT6, /* memory mapping bank A */ + PORT7, /* memory mapping bank B */ + PORT8, /* link assist mode flags */ + PORT9, /* unknown (link assist settings?) */ + PORTA, /* unknown (timeout value?) */ + PORTB, /* unknown (timeout value?) */ + PORTC, /* unknown (timeout value?) */ + PORTD, /* unknown */ + PORTE, /* unknown */ + PORTF, /* unknown */ + + PORT20, /* CPU speed control */ + PORT21, /* hardware type / RAM no-exec control */ + PORT22, /* Flash no-exec lower limit */ + PORT23, /* Flash no-exec upper limit */ + PORT25, /* unknown */ + PORT26, /* unknown */ + PORT27, /* bank C forced-page-0 limit */ + PORT28, /* bank B forced-page-1 limit */ + PORT29, /* LCD port delay (6 MHz) */ + PORT2A, /* LCD port delay (mode 1) */ + PORT2B, /* LCD port delay (mode 2) */ + PORT2C, /* LCD port delay (mode 3) */ + PORT2D, /* unknown */ + PORT2E, /* memory delay */ + PORT2F, /* Duration of LCD wait timer */ + + CLOCK_MODE, /* clock mode */ + CLOCK_INPUT, /* clock input register */ + CLOCK_DIFF, /* clock value minus actual time */ + + RAM_READ_DELAY, + RAM_WRITE_DELAY, + RAM_EXEC_DELAY, + FLASH_READ_DELAY, + FLASH_WRITE_DELAY, + FLASH_EXEC_DELAY, + LCD_PORT_DELAY, + NO_EXEC_RAM, + + LCD_WAIT, /* LCD wait timer active */ + PROTECTSTATE, /* port protection state */ + NUM_HW_REGS +}; + +#define HW_REG_NAMES \ + { "port3", "port4", "port5", "port6", "port7", "port8", "port9", \ + "portA", "portB", "portC", "portD", "portE", "portF", "port20", \ + "port21", "port22", "port23", "port25", "port26", "port27", \ + "port28", "port29", "port2A", "port2B", "port2C", "port2D", \ + "port2E", "port2F", "clock_mode", "clock_input", "clock_diff", \ + "ram_read_delay", "ram_write_delay", "ram_exec_delay", \ + "flash_read_delay", "flash_write_delay", "flash_exec_delay", \ + "lcd_port_delay", "no_exec_ram", "lcd_wait", "protectstate" } + +#define TIMER_INT1 (TILEM_NUM_SYS_TIMERS + 1) +#define TIMER_INT2A (TILEM_NUM_SYS_TIMERS + 2) +#define TIMER_INT2B (TILEM_NUM_SYS_TIMERS + 3) +#define TIMER_LCD_WAIT (TILEM_NUM_SYS_TIMERS + 4) +#define TIMER_FREEZE_LINK_PORT (TILEM_NUM_SYS_TIMERS + 5) +#define NUM_HW_TIMERS 5 + +#define HW_TIMER_NAMES { "int1", "int2a", "int2b", "lcd_wait", \ + "freeze_link_port" } + +void xn_reset(TilemCalc* calc); +void xn_stateloaded(TilemCalc* calc, int savtype); +byte xn_z80_in(TilemCalc* calc, dword port); +void xn_z80_out(TilemCalc* calc, dword port, byte value); +void xn_z80_instr(TilemCalc* calc, dword opcode); +void xn_z80_ptimer(TilemCalc* calc, int id); +void xn_z80_wrmem(TilemCalc* calc, dword addr, byte value); +byte xn_z80_rdmem(TilemCalc* calc, dword addr); +byte xn_z80_rdmem_m1(TilemCalc* calc, dword addr); +dword xn_mem_ltop(TilemCalc* calc, dword addr); +dword xn_mem_ptol(TilemCalc* calc, dword addr); + +#endif diff --git a/tool/tilem-src/emu/xn/xn_init.c b/tool/tilem-src/emu/xn/xn_init.c new file mode 100644 index 0000000..84e715e --- /dev/null +++ b/tool/tilem-src/emu/xn/xn_init.c @@ -0,0 +1,88 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2011 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "xn.h" + +void xn_reset(TilemCalc* calc) +{ + calc->hwregs[PORT3] = 0x0B; + calc->hwregs[PORT4] = 0x07; + calc->hwregs[PORT6] = 0x7F; + calc->hwregs[PORT7] = 0x7F; + + calc->mempagemap[0] = 0x00; + calc->mempagemap[1] = 0x7E; + calc->mempagemap[2] = 0x7F; + calc->mempagemap[3] = 0x7F; + + calc->z80.r.pc.d = 0x8000; + + calc->hwregs[PORT8] = 0x80; + + calc->hwregs[PORT20] = 0; + calc->hwregs[PORT21] = 0; + calc->hwregs[PORT22] = 0x08; + calc->hwregs[PORT23] = 0x69; + calc->hwregs[PORT25] = 0x10; + calc->hwregs[PORT26] = 0x20; + calc->hwregs[PORT27] = 0; + calc->hwregs[PORT28] = 0; + calc->hwregs[PORT29] = 0x14; + calc->hwregs[PORT2A] = 0x27; + calc->hwregs[PORT2B] = 0x2F; + calc->hwregs[PORT2C] = 0x3B; + calc->hwregs[PORT2D] = 0x01; + calc->hwregs[PORT2E] = 0x44; + calc->hwregs[PORT2F] = 0x4A; + + calc->hwregs[FLASH_READ_DELAY] = 0; + calc->hwregs[FLASH_WRITE_DELAY] = 0; + calc->hwregs[FLASH_EXEC_DELAY] = 0; + calc->hwregs[RAM_READ_DELAY] = 0; + calc->hwregs[RAM_WRITE_DELAY] = 0; + calc->hwregs[RAM_EXEC_DELAY] = 0; + calc->hwregs[LCD_PORT_DELAY] = 5; + calc->hwregs[NO_EXEC_RAM] = 0x5555; + + calc->hwregs[PROTECTSTATE] = 0; + + tilem_z80_set_speed(calc, 6000); + calc->z80.emuflags |= TILEM_Z80_RESET_UNDOCUMENTED; + + calc->lcd.emuflags &= ~TILEM_LCD_REQUIRE_DELAY; + + tilem_z80_set_timer(calc, TIMER_INT1, 1600, 9277, 1); + tilem_z80_set_timer(calc, TIMER_INT2A, 1300, 9277, 1); + tilem_z80_set_timer(calc, TIMER_INT2B, 1000, 9277, 1); +} + +void xn_stateloaded(TilemCalc* calc, int savtype TILEM_ATTR_UNUSED) +{ + tilem_calc_fix_certificate(calc, calc->mem + (0x7E * 0x4000L), + 0x69, 0x0c, 0x1e50); +} diff --git a/tool/tilem-src/emu/xn/xn_io.c b/tool/tilem-src/emu/xn/xn_io.c new file mode 100644 index 0000000..7b4c85e --- /dev/null +++ b/tool/tilem-src/emu/xn/xn_io.c @@ -0,0 +1,881 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2011 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include + +#include "xn.h" + +static void set_lcd_wait_timer(TilemCalc* calc) +{ + static const int delaytime[8] = { 48, 112, 176, 240, + 304, 368, 432, 496 }; + int i; + + switch (calc->hwregs[PORT20] & 3) { + case 0: + return; + case 1: + i = (calc->hwregs[PORT2F] & 3); + break; + case 2: + i = ((calc->hwregs[PORT2F] >> 2) & 7); + break; + default: + i = ((calc->hwregs[PORT2F] >> 5) & 7); + break; + } + + tilem_z80_set_timer(calc, TIMER_LCD_WAIT, delaytime[i], 0, 0); + calc->hwregs[LCD_WAIT] = 1; +} + +byte xn_z80_in(TilemCalc* calc, dword port) +{ + /* FIXME: measure actual levels */ + static const byte battlevel[4] = { 33, 39, 36, 43 }; + byte v; + unsigned int f; + time_t curtime; + + switch(port&0xff) { + case 0x00: + if (tilem_z80_timer_running(calc, TIMER_FREEZE_LINK_PORT)) + return(3); + + v = tilem_linkport_get_lines(calc); + v |= (calc->linkport.lines << 4); + return(v); + + case 0x01: + return(tilem_keypad_read_keys(calc)); + + case 0x02: + v = battlevel[calc->hwregs[PORT4] >> 6]; + return ((calc->battery >= v ? 0xe1 : 0xe0) + | (calc->hwregs[LCD_WAIT] ? 0 : 2) + | (calc->flash.unlock << 2)); + + case 0x03: + return(calc->hwregs[PORT3]); + + case 0x04: + v = (calc->keypad.onkeydown ? 0x00 : 0x08); + + if (calc->z80.interrupts & TILEM_INTERRUPT_ON_KEY) + v |= 0x01; + if (calc->z80.interrupts & TILEM_INTERRUPT_TIMER1) + v |= 0x02; + if (calc->z80.interrupts & TILEM_INTERRUPT_TIMER2) + v |= 0x04; + if (calc->z80.interrupts & TILEM_INTERRUPT_LINK_ACTIVE) + v |= 0x10; + + if (calc->usertimers[0].status & TILEM_USER_TIMER_FINISHED) + v |= 0x20; + if (calc->usertimers[1].status & TILEM_USER_TIMER_FINISHED) + v |= 0x40; + if (calc->usertimers[2].status & TILEM_USER_TIMER_FINISHED) + v |= 0x80; + + return(v); + + case 0x05: + return(calc->hwregs[PORT5] & 0x0f); + + case 0x06: + return(calc->hwregs[PORT6]); + + case 0x07: + return(calc->hwregs[PORT7]); + + case 0x08: + return(calc->hwregs[PORT8]); + + case 0x09: + f = tilem_linkport_get_assist_flags(calc); + + if (f & (TILEM_LINK_ASSIST_READ_BUSY + | TILEM_LINK_ASSIST_WRITE_BUSY)) + v = 0x00; + else + v = 0x20; + + if (calc->z80.interrupts & TILEM_INTERRUPT_LINK_READ) + v |= 0x01; + if (calc->z80.interrupts & TILEM_INTERRUPT_LINK_IDLE) + v |= 0x02; + if (calc->z80.interrupts & TILEM_INTERRUPT_LINK_ERROR) + v |= 0x04; + if (f & TILEM_LINK_ASSIST_READ_BUSY) + v |= 0x08; + if (f & TILEM_LINK_ASSIST_READ_BYTE) + v |= 0x10; + if (f & (TILEM_LINK_ASSIST_READ_ERROR + | TILEM_LINK_ASSIST_WRITE_ERROR)) + v |= 0x40; + if (f & TILEM_LINK_ASSIST_WRITE_BUSY) + v |= 0x80; + + calc->z80.interrupts &= ~TILEM_INTERRUPT_LINK_ERROR; + + return(v); + + case 0x0A: + v = calc->linkport.assistlastbyte; + tilem_linkport_read_byte(calc); + return(v); + + case 0x0E: + return(calc->hwregs[PORTE] & 3); + + case 0x0F: + return(calc->hwregs[PORTF] & 3); + + case 0x10: + case 0x12: + calc->z80.clock += calc->hwregs[LCD_PORT_DELAY]; + set_lcd_wait_timer(calc); + return(tilem_lcd_t6a04_status(calc)); + + case 0x11: + case 0x13: + calc->z80.clock += calc->hwregs[LCD_PORT_DELAY]; + set_lcd_wait_timer(calc); + return(tilem_lcd_t6a04_read(calc)); + + case 0x15: + return(0x45); /* ??? */ + + case 0x1C: + return(tilem_md5_assist_get_value(calc)); + + case 0x1D: + return(tilem_md5_assist_get_value(calc) >> 8); + + case 0x1E: + return(tilem_md5_assist_get_value(calc) >> 16); + + case 0x1F: + return(tilem_md5_assist_get_value(calc) >> 24); + + case 0x20: + return(calc->hwregs[PORT20] & 3); + + case 0x21: + return(calc->hwregs[PORT21] & 0x33); + + case 0x22: + return(calc->hwregs[PORT22]); + + case 0x23: + return(calc->hwregs[PORT23]); + + case 0x25: + return(calc->hwregs[PORT25]); + + case 0x26: + return(calc->hwregs[PORT26]); + + case 0x27: + return(calc->hwregs[PORT27]); + + case 0x28: + return(calc->hwregs[PORT28]); + + case 0x29: + return(calc->hwregs[PORT29]); + + case 0x2A: + return(calc->hwregs[PORT2A]); + + case 0x2B: + return(calc->hwregs[PORT2B]); + + case 0x2C: + return(calc->hwregs[PORT2C]); + + case 0x2D: + return(calc->hwregs[PORT2D] & 3); + + case 0x2E: + return(calc->hwregs[PORT2E]); + + case 0x2F: + return(calc->hwregs[PORT2F]); + + case 0x30: + return(calc->usertimers[0].frequency); + case 0x31: + return(calc->usertimers[0].status); + case 0x32: + return(tilem_user_timer_get_value(calc, 0)); + + case 0x33: + return(calc->usertimers[1].frequency); + case 0x34: + return(calc->usertimers[1].status); + case 0x35: + return(tilem_user_timer_get_value(calc, 1)); + + case 0x36: + return(calc->usertimers[2].frequency); + case 0x37: + return(calc->usertimers[2].status); + case 0x38: + return(tilem_user_timer_get_value(calc, 2)); + + case 0x39: + return(0xf0); /* ??? */ + + case 0x40: + return calc->hwregs[CLOCK_MODE]; + + case 0x41: + return calc->hwregs[CLOCK_INPUT]&0xff; + + case 0x42: + return (calc->hwregs[CLOCK_INPUT]>>8)&0xff; + + case 0x43: + return (calc->hwregs[CLOCK_INPUT]>>16)&0xff; + + case 0x44: + return (calc->hwregs[CLOCK_INPUT]>>24)&0xff; + + case 0x45: + case 0x46: + case 0x47: + case 0x48: + if (calc->hwregs[CLOCK_MODE] & 1) { + time(&curtime); + } + else { + curtime = 0; + } + curtime += calc->hwregs[CLOCK_DIFF]; + return (curtime >> ((port - 0x45) * 8)); + + case 0x4C: + return(0x22); + + case 0x4D: + /* USB port - not emulated, calculator should + recognize that the USB cable is + disconnected. + + Thanks go to Dan Englender for these + values. */ + + return(0xA5); + + case 0x55: + return(0x1F); + + case 0x56: + return(0x00); + + case 0x57: + return(0x50); + + case 0x0B: + case 0x0C: + case 0x0D: + case 0x14: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + return(0); + } + + tilem_warning(calc, "Input from port %x", port); + return(0x00); +} + + +static void setup_mapping(TilemCalc* calc) +{ + unsigned int pageA, pageB, pageC; + + if (calc->hwregs[PORT6] & 0x80) + pageA = (0x80 | (calc->hwregs[PORT6] & 7)); + else + pageA = (calc->hwregs[PORT6] & 0x7f); + + if (calc->hwregs[PORT7] & 0x80) + pageB = (0x80 | (calc->hwregs[PORT7] & 7)); + else + pageB = (calc->hwregs[PORT7] & 0x7f); + + pageC = (0x80 | (calc->hwregs[PORT5] & 7)); + + if (calc->hwregs[PORT4] & 1) { + calc->mempagemap[1] = (pageA & ~1); + calc->mempagemap[2] = (pageA | 1); + calc->mempagemap[3] = pageB; + } + else { + calc->mempagemap[1] = pageA; + calc->mempagemap[2] = pageB; + calc->mempagemap[3] = pageC; + } +} + +static void setup_clockdelays(TilemCalc* calc) +{ + byte lcdport = calc->hwregs[PORT29 + (calc->hwregs[PORT20] & 3)]; + byte memport = calc->hwregs[PORT2E]; + + if (!(lcdport & 1)) + memport &= ~0x07; + if (!(lcdport & 2)) + memport &= ~0x70; + + calc->hwregs[FLASH_EXEC_DELAY] = (memport & 1); + calc->hwregs[FLASH_READ_DELAY] = ((memport >> 1) & 1); + calc->hwregs[FLASH_WRITE_DELAY] = ((memport >> 2) & 1); + + calc->hwregs[RAM_EXEC_DELAY] = ((memport >> 4) & 1); + calc->hwregs[RAM_READ_DELAY] = ((memport >> 5) & 1); + calc->hwregs[RAM_WRITE_DELAY] = ((memport >> 6) & 1); + + calc->hwregs[LCD_PORT_DELAY] = (lcdport >> 2); +} + +void xn_z80_out(TilemCalc* calc, dword port, byte value) +{ + static const int tmrvalues[4] = { 1953, 4395, 6836, 9277 }; + int t, r; + unsigned int mode; + time_t curtime; + + switch(port&0xff) { + case 0x00: + if (value == 0 + && calc->linkport.lines != 0 + && calc->linkport.extlines == 0) { + /* Kludge to work around TI's broken + RecAByteIO implementation on 2.46+, which + will fail if the sending device is too + fast. */ + tilem_z80_set_timer(calc, TIMER_FREEZE_LINK_PORT, + 100, 0, 0); + } + + tilem_linkport_set_lines(calc, value); + break; + + case 0x01: + tilem_keypad_set_group(calc, value); + break; + + case 0x03: + if (value & 0x01) { + calc->keypad.onkeyint = 1; + } + else { + calc->z80.interrupts &= ~TILEM_INTERRUPT_ON_KEY; + calc->keypad.onkeyint = 0; + } + + if (!(value & 0x02)) + calc->z80.interrupts &= ~TILEM_INTERRUPT_TIMER1; + + if (!(value & 0x04)) + calc->z80.interrupts &= ~TILEM_INTERRUPT_TIMER2; + + if (value & 0x06) { + calc->usertimers[0].status &= ~TILEM_USER_TIMER_NO_HALT_INT; + calc->usertimers[1].status &= ~TILEM_USER_TIMER_NO_HALT_INT; + calc->usertimers[2].status &= ~TILEM_USER_TIMER_NO_HALT_INT; + } + else { + calc->usertimers[0].status |= TILEM_USER_TIMER_NO_HALT_INT; + calc->usertimers[1].status |= TILEM_USER_TIMER_NO_HALT_INT; + calc->usertimers[2].status |= TILEM_USER_TIMER_NO_HALT_INT; + } + + mode = calc->linkport.mode; + if (value & 0x10) + mode |= TILEM_LINK_MODE_INT_ON_ACTIVE; + else + mode &= ~TILEM_LINK_MODE_INT_ON_ACTIVE; + + tilem_linkport_set_mode(calc, mode); + + calc->poweronhalt = ((value & 8) >> 3); + calc->hwregs[PORT3] = value; + break; + + + case 0x04: + calc->hwregs[PORT4] = value; + + t = tmrvalues[(value & 6) >> 1]; + tilem_z80_set_timer_period(calc, TIMER_INT1, t); + tilem_z80_set_timer_period(calc, TIMER_INT2A, t); + tilem_z80_set_timer_period(calc, TIMER_INT2B, t); + + setup_mapping(calc); + break; + + case 0x05: + calc->hwregs[PORT5] = value & 0x0f; + setup_mapping(calc); + break; + + case 0x06: + calc->hwregs[PORT6] = value; + setup_mapping(calc); + break; + + case 0x07: + calc->hwregs[PORT7] = value; + setup_mapping(calc); + break; + + case 0x08: + calc->hwregs[PORT8] = value; + + mode = calc->linkport.mode; + + if (value & 0x01) + mode |= TILEM_LINK_MODE_INT_ON_READ; + else + mode &= ~TILEM_LINK_MODE_INT_ON_READ; + + if (value & 0x02) + mode |= TILEM_LINK_MODE_INT_ON_IDLE; + else + mode &= ~TILEM_LINK_MODE_INT_ON_IDLE; + + if (value & 0x04) + mode |= TILEM_LINK_MODE_INT_ON_ERROR; + else + mode &= ~TILEM_LINK_MODE_INT_ON_ERROR; + + if (value & 0x80) + mode &= ~TILEM_LINK_MODE_ASSIST; + else + mode |= TILEM_LINK_MODE_ASSIST; + + tilem_linkport_set_mode(calc, mode); + break; + + case 0x09: + calc->hwregs[PORT9] = value; + break; + + case 0x0A: + calc->hwregs[PORTA] = value; + break; + + case 0x0B: + calc->hwregs[PORTB] = value; + break; + + case 0x0C: + calc->hwregs[PORTC] = value; + break; + + + case 0x0D: + if (!(calc->hwregs[PORT8] & 0x80)) + tilem_linkport_write_byte(calc, value); + break; + + case 0x0E: + calc->hwregs[PORTE] = value; + break; + + case 0x0F: + calc->hwregs[PORTF] = value; + break; + + case 0x10: + case 0x12: + calc->z80.clock += calc->hwregs[LCD_PORT_DELAY]; + set_lcd_wait_timer(calc); + tilem_lcd_t6a04_control(calc, value); + break; + + case 0x11: + case 0x13: + calc->z80.clock += calc->hwregs[LCD_PORT_DELAY]; + set_lcd_wait_timer(calc); + tilem_lcd_t6a04_write(calc, value); + break; + + case 0x14: + if (calc->hwregs[PROTECTSTATE] == 7) { + /* + if (value & 1) + tilem_message(calc, "Flash unlocked"); + else + tilem_message(calc, "Flash locked"); + */ + calc->flash.unlock = value&1; + } + break; + + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + r = (port & 0xff) - 0x18; + calc->md5assist.regs[r] >>= 8; + calc->md5assist.regs[r] |= (value << 24); + break; + + case 0x1E: + calc->md5assist.shift = value & 0x1f; + break; + + case 0x1F: + calc->md5assist.mode = value & 3; + break; + + case 0x20: + calc->hwregs[PORT20] = value; + + if (value & 3) { + tilem_z80_set_speed(calc, 15000); + } + else { + tilem_z80_set_speed(calc, 6000); + } + + setup_clockdelays(calc); + break; + + case 0x21: + if (calc->flash.unlock && calc->hwregs[PROTECTSTATE] == 7) { + calc->hwregs[PORT21] = value; + + /* FIXME: these restrictions were tested on + 83+ SE; someone should confirm them for + 84+ */ + switch (value & 0x30) { + case 0x00: + /* restrict pp. 0, 2, 4, 6, 8, A, C, E */ + calc->hwregs[NO_EXEC_RAM] = 0x5555; + break; + + case 0x10: + /* restrict pp. 0, 3, 4, 7, 8, B, C, F */ + calc->hwregs[NO_EXEC_RAM] = 0x9999; + break; + + case 0x20: + /* restrict pp. 0, 3-7, 8, B-F */ + calc->hwregs[NO_EXEC_RAM] = 0xF9F9; + break; + + case 0x30: + /* restrict pp. 0, 3-F */ + calc->hwregs[NO_EXEC_RAM] = 0xFFF9; + break; + } + } + break; + + case 0x22: + if (calc->flash.unlock && calc->hwregs[PROTECTSTATE] == 7) { + calc->hwregs[PORT22] = value; + } + break; + + case 0x23: + if (calc->flash.unlock && calc->hwregs[PROTECTSTATE] == 7) { + calc->hwregs[PORT23] = value; + } + break; + + case 0x25: + if (calc->flash.unlock && calc->hwregs[PROTECTSTATE] == 7) { + calc->hwregs[PORT25] = value; + } + break; + + case 0x26: + if (calc->flash.unlock && calc->hwregs[PROTECTSTATE] == 7) { + calc->hwregs[PORT26] = value; + } + break; + + case 0x27: + calc->hwregs[PORT27] = value; + break; + + case 0x28: + calc->hwregs[PORT28] = value; + break; + + case 0x29: + calc->hwregs[PORT29] = value; + setup_clockdelays(calc); + break; + + case 0x2A: + calc->hwregs[PORT2A] = value; + setup_clockdelays(calc); + break; + + case 0x2B: + calc->hwregs[PORT2B] = value; + setup_clockdelays(calc); + break; + + case 0x2C: + calc->hwregs[PORT2C] = value; + setup_clockdelays(calc); + break; + + case 0x2D: + calc->hwregs[PORT2D] = value; + break; + + case 0x2E: + calc->hwregs[PORT2E] = value; + setup_clockdelays(calc); + break; + + case 0x2F: + calc->hwregs[PORT2F] = value; + break; + + case 0x30: + tilem_user_timer_set_frequency(calc, 0, value); + break; + case 0x31: + tilem_user_timer_set_mode(calc, 0, value); + break; + case 0x32: + tilem_user_timer_start(calc, 0, value); + break; + + case 0x33: + tilem_user_timer_set_frequency(calc, 1, value); + break; + case 0x34: + tilem_user_timer_set_mode(calc, 1, value); + break; + case 0x35: + tilem_user_timer_start(calc, 1, value); + break; + + case 0x36: + tilem_user_timer_set_frequency(calc, 2, value); + break; + case 0x37: + tilem_user_timer_set_mode(calc, 2, value); + break; + case 0x38: + tilem_user_timer_start(calc, 2, value); + break; + + case 0x40: + time(&curtime); + + if ((calc->hwregs[CLOCK_MODE] & 1) != (value & 1)) { + if (value & 1) + calc->hwregs[CLOCK_DIFF] -= curtime; + else + calc->hwregs[CLOCK_DIFF] += curtime; + } + + if (!(calc->hwregs[CLOCK_MODE] & 2) && (value & 2)) { + calc->hwregs[CLOCK_DIFF] = calc->hwregs[CLOCK_INPUT]; + if (value & 1) + calc->hwregs[CLOCK_DIFF] -= curtime; + } + calc->hwregs[CLOCK_MODE] = value & 3; + break; + + case 0x41: + calc->hwregs[CLOCK_INPUT] &= 0xffffff00; + calc->hwregs[CLOCK_INPUT] |= value; + break; + + case 0x42: + calc->hwregs[CLOCK_INPUT] &= 0xffff00ff; + calc->hwregs[CLOCK_INPUT] |= (value << 8); + break; + + case 0x43: + calc->hwregs[CLOCK_INPUT] &= 0xff00ffff; + calc->hwregs[CLOCK_INPUT] |= (value << 16); + break; + + case 0x44: + calc->hwregs[CLOCK_INPUT] &= 0x00ffffff; + calc->hwregs[CLOCK_INPUT] |= (value << 24); + break; + } + + return; +} + +void xn_z80_instr(TilemCalc* calc, dword opcode) +{ + dword pa; + byte l, h; + + switch (opcode) { + case 0xeded: + /* emulator control instruction */ + l = xn_z80_rdmem(calc, calc->z80.r.pc.d); + h = xn_z80_rdmem(calc, calc->z80.r.pc.d + 1); + + calc->z80.r.pc.d += 2; + + opcode = (l | (h << 8)); + switch (opcode) { + case 0x1000: /* Power off */ + case 0x1001: /* Power on */ + case 0x1002: /* Prepare for power off */ + break; + + case 0x1003: + /* Disable Nspire keypad */ + tilem_message(calc, "Keypad locked"); + break; + + case 0x1004: + /* Enable Nspire keypad */ + tilem_message(calc, "Keypad unlocked"); + break; + + case 0x1005: + /* ??? */ + break; + + case 0x1008: + /* check if USB data waiting (?) */ + calc->z80.r.af.d |= 0x40; + break; + + case 0x100C: + /* ??? */ + calc->z80.r.af.d &= ~0x40; + break; + + case 0x100D: + /* check if USB link should be used (???) */ + calc->z80.r.af.d &= ~0x40; + break; + + case 0x100E: + case 0x100F: + /* ??? */ + break; + + case 0x101C: + /* disable USB device (???) */ + break; + + case 0x1020: + /* check for something USB-related */ + calc->z80.r.af.d |= 0x40; + break; + + case 0x1024: + /* check if USB data waiting */ + calc->z80.r.af.d |= 0x40; + break; + + case 0x1029: + /* check for something USB-related */ + calc->z80.r.af.d |= 0x40; + break; + + case 0x1027: + /* check for something USB-related */ + calc->z80.r.af.d |= 0x40; + break; + + case 0x102E: + /* ??? */ + break; + + case 0x102F: + /* ??? */ + break; + + default: + tilem_warning(calc, "Unknown control instruction %x", + opcode); + } + break; + + case 0xedee: + /* erase Flash at address HL */ + if (calc->flash.unlock) { + pa = xn_mem_ltop(calc, calc->z80.r.hl.w.l); + if (pa < 0x200000) { + tilem_flash_erase_address(calc, pa); + } + } + break; + + case 0xedef: + /* enable Flash writing for following instruction */ + if (calc->flash.unlock) { + calc->flash.state = 3; + } + break; + + default: + tilem_warning(calc, "Invalid opcode %x", opcode); + tilem_z80_exception(calc, TILEM_EXC_INSTRUCTION); + break; + } +} + +void xn_z80_ptimer(TilemCalc* calc, int id) +{ + switch (id) { + case TIMER_INT1: + if (calc->hwregs[PORT3] & 0x02) + calc->z80.interrupts |= TILEM_INTERRUPT_TIMER1; + break; + + case TIMER_INT2A: + case TIMER_INT2B: + if (calc->hwregs[PORT3] & 0x04) + calc->z80.interrupts |= TILEM_INTERRUPT_TIMER2; + break; + + case TIMER_LCD_WAIT: + calc->hwregs[LCD_WAIT] = 0; + break; + } +} diff --git a/tool/tilem-src/emu/xn/xn_memory.c b/tool/tilem-src/emu/xn/xn_memory.c new file mode 100644 index 0000000..0956550 --- /dev/null +++ b/tool/tilem-src/emu/xn/xn_memory.c @@ -0,0 +1,204 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2011 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "xn.h" + +void xn_z80_wrmem(TilemCalc* calc, dword A, byte v) +{ + unsigned long pa; + byte page; + + page = calc->mempagemap[A>>14]; + + if (A & 0x8000) { + if (A > (0xFFFF - 64 * calc->hwregs[PORT27])) + page = 0x80; + else if (A < (0x8000 + 64 * calc->hwregs[PORT28])) + page = 0x81; + } + + pa = (A & 0x3FFF) + 0x4000L*page; + + if (pa < 0x200000) { + calc->z80.clock += calc->hwregs[FLASH_WRITE_DELAY]; + if (calc->flash.state == 3) { + *(calc->mem+pa) = v; + calc->flash.state = 0; + } + } + else if (pa < 0x220000) { + calc->z80.clock += calc->hwregs[RAM_WRITE_DELAY]; + *(calc->mem+pa) = v; + } +} + +static inline byte readbyte(TilemCalc* calc, dword pa) +{ + static const byte protectbytes[6] = {0x00,0x00,0xed,0x56,0xf3,0xd3}; + int state = calc->hwregs[PROTECTSTATE]; + byte value; + + value = *(calc->mem + pa); + + if (pa < 0x1B0000 || pa >= 0x200000 + || (pa >= 0x1C0000 && pa < 0x1F0000)) + calc->hwregs[PROTECTSTATE] = 0; + else if (state == 6) + calc->hwregs[PROTECTSTATE] = 7; + else if (state < 6 && value == protectbytes[state]) + calc->hwregs[PROTECTSTATE] = state + 1; + else + calc->hwregs[PROTECTSTATE] = 0; + + return (value); +} + +byte xn_z80_rdmem(TilemCalc* calc, dword A) +{ + byte page; + unsigned long pa; + byte value; + + page = calc->mempagemap[A>>14]; + + if (A & 0x8000) { + if (A > (0xFFFF - 64 * calc->hwregs[PORT27])) + page = 0x80; + else if (A < (0x8000 + 64 * calc->hwregs[PORT28])) + page = 0x81; + } + + if (TILEM_UNLIKELY(page == 0x7E && !calc->flash.unlock)) { + tilem_warning(calc, "Reading from read-protected sector"); + return (0xff); + } + + pa = (A & 0x3FFF) + 0x4000L*page; + + if (pa < 0x200000) + calc->z80.clock += calc->hwregs[FLASH_READ_DELAY]; + else + calc->z80.clock += calc->hwregs[RAM_READ_DELAY]; + + value = readbyte(calc, pa); + return (value); +} + +byte xn_z80_rdmem_m1(TilemCalc* calc, dword A) +{ + byte page; + unsigned long pa; + byte value; + + page = calc->mempagemap[A>>14]; + + if (A & 0x8000) { + if (A > (0xFFFF - 64 * calc->hwregs[PORT27])) + page = 0x80; + else if (A < (0x8000 + 64 * calc->hwregs[PORT28])) + page = 0x81; + } + + if (TILEM_UNLIKELY((page & 0x80) + && calc->hwregs[NO_EXEC_RAM] & (1 << (page&7)))) { + tilem_warning(calc, "Executing in restricted RAM area"); + tilem_z80_exception(calc, TILEM_EXC_RAM_EXEC); + } + + if (TILEM_UNLIKELY(page >= calc->hwregs[PORT22] + && page <= calc->hwregs[PORT23])) { + tilem_warning(calc, "Executing in restricted Flash area"); + tilem_z80_exception(calc, TILEM_EXC_FLASH_EXEC); + } + + if (TILEM_UNLIKELY(page == 0x7E && !calc->flash.unlock)) { + tilem_warning(calc, "Reading from read-protected sector"); + return (0xff); + } + + pa = (A & 0x3FFF) + 0x4000L*page; + + if (pa < 0x200000) + calc->z80.clock += calc->hwregs[FLASH_EXEC_DELAY]; + else + calc->z80.clock += calc->hwregs[RAM_EXEC_DELAY]; + + value = readbyte(calc, pa); + + if (TILEM_UNLIKELY(value == 0xff && A == 0x0038)) { + tilem_warning(calc, "No OS installed"); + tilem_z80_exception(calc, TILEM_EXC_FLASH_EXEC); + } + + return (value); +} + +dword xn_mem_ltop(TilemCalc* calc, dword A) +{ + byte page = calc->mempagemap[A >> 14]; + + if (A & 0x8000) { + if (A > (0xFFFF - 64 * calc->hwregs[PORT27])) + page = 0x80; + else if (A < (0x8000 + 64 * calc->hwregs[PORT28])) + page = 0x81; + } + + return ((page << 14) | (A & 0x3fff)); +} + +dword xn_mem_ptol(TilemCalc* calc, dword A) +{ + byte page = A >> 14; + + if (!page) + return (A & 0x3fff); + + if (page == calc->mempagemap[1]) + return (0x4000 | (A & 0x3fff)); + + if ((A & 0x3fff) < 64 * calc->hwregs[PORT28]) { + if (page == 0x81) + return (0x8000 | (A & 0x3fff)); + } + else { + if (page == calc->mempagemap[2]) + return (0x8000 | (A & 0x3fff)); + } + + if ((A & 0x3fff) >= (0x4000 - 64 * calc->hwregs[PORT27])) { + if (page == 0x80) + return (0xC000 | (A & 0x3fff)); + } + else { + if (page == calc->mempagemap[3]) + return (0xC000 | (A & 0x3fff)); + } + + return (0xffffffff); +} diff --git a/tool/tilem-src/emu/xn/xn_subcore.c b/tool/tilem-src/emu/xn/xn_subcore.c new file mode 100644 index 0000000..fb26037 --- /dev/null +++ b/tool/tilem-src/emu/xn/xn_subcore.c @@ -0,0 +1,73 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2012 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "xn.h" + +static const TilemFlashSector flashsectors[] = { + {0x000000, 0x10000, 0}, {0x010000, 0x10000, 0}, + {0x020000, 0x10000, 0}, {0x030000, 0x10000, 0}, + {0x040000, 0x10000, 0}, {0x050000, 0x10000, 0}, + {0x060000, 0x10000, 0}, {0x070000, 0x10000, 0}, + {0x080000, 0x10000, 0}, {0x090000, 0x10000, 0}, + {0x0A0000, 0x10000, 0}, {0x0B0000, 0x10000, 0}, + {0x0C0000, 0x10000, 0}, {0x0D0000, 0x10000, 0}, + {0x0E0000, 0x10000, 0}, {0x0F0000, 0x10000, 0}, + {0x100000, 0x10000, 0}, {0x110000, 0x10000, 0}, + {0x120000, 0x10000, 0}, {0x130000, 0x10000, 0}, + {0x140000, 0x10000, 0}, {0x150000, 0x10000, 0}, + {0x160000, 0x10000, 0}, {0x170000, 0x10000, 0}, + {0x180000, 0x10000, 0}, {0x190000, 0x10000, 0}, + {0x1A0000, 0x10000, 0}, {0x1B0000, 0x10000, 0}, + {0x1C0000, 0x10000, 0}, {0x1D0000, 0x10000, 0}, + {0x1E0000, 0x10000, 0}, {0x1F0000, 0x08000, 0}, + {0x1F8000, 0x02000, 0}, {0x1FA000, 0x02000, 0}, + {0x1FC000, 0x04000, 0}}; + +#define NUM_FLASH_SECTORS (sizeof(flashsectors) / sizeof(TilemFlashSector)) + +static const char* hwregnames[NUM_HW_REGS] = HW_REG_NAMES; + +static const char* hwtimernames[NUM_HW_TIMERS] = HW_TIMER_NAMES; + +extern const char* xp_keynames[]; + +TilemHardware hardware_ti84pns = { + 'n', "ti84pns", "TI-Nspire (TI-84 Plus mode)", + (TILEM_CALC_HAS_LINK | TILEM_CALC_HAS_LINK_ASSIST + | TILEM_CALC_HAS_T6A04 | TILEM_CALC_HAS_FLASH + | TILEM_CALC_HAS_MD5_ASSIST), + 96, 64, 128 * 0x4000, 8 * 0x4000, 15 * 64, 0x80, + NUM_FLASH_SECTORS, flashsectors, 3, + NUM_HW_REGS, hwregnames, + NUM_HW_TIMERS, hwtimernames, + xp_keynames, + xn_reset, xn_stateloaded, + xn_z80_in, xn_z80_out, + xn_z80_wrmem, xn_z80_rdmem, xn_z80_rdmem_m1, xn_z80_instr, + xn_z80_ptimer, tilem_lcd_t6a04_get_data, + xn_mem_ltop, xn_mem_ptol }; diff --git a/tool/tilem-src/emu/xp/xp.h b/tool/tilem-src/emu/xp/xp.h new file mode 100644 index 0000000..3d78152 --- /dev/null +++ b/tool/tilem-src/emu/xp/xp.h @@ -0,0 +1,62 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifndef _TILEM_XP_H +#define _TILEM_XP_H + +enum { + PORT3, /* mask of enabled interrupts */ + PORT4, /* interrupt timer speed */ + PORT5, /* no-exec map index */ + PORT6, /* memory mapping bank A */ + PORT7, /* memory mapping bank B */ + NOEXEC0, /* no-exec map */ + NOEXEC1, + NOEXEC2, + NOEXEC3, + NOEXEC4, + PROTECTSTATE, /* port protection state */ + NUM_HW_REGS +}; + +#define HW_REG_NAMES \ + { "port3", "port4", "port5", "port6", "port7", \ + "noexec0", "noexec1", "noexec2", "noexec3", \ + "noexec4", "protectstate" } + +#define TIMER_INT1 (TILEM_NUM_SYS_TIMERS + 1) +#define TIMER_INT2A (TILEM_NUM_SYS_TIMERS + 2) +#define TIMER_INT2B (TILEM_NUM_SYS_TIMERS + 3) +#define NUM_HW_TIMERS 3 + +#define HW_TIMER_NAMES { "int1", "int2a", "int2b" } + +void xp_reset(TilemCalc* calc); +void xp_stateloaded(TilemCalc* calc, int savtype); +byte xp_z80_in(TilemCalc* calc, dword port); +void xp_z80_out(TilemCalc* calc, dword port, byte value); +void xp_z80_ptimer(TilemCalc* calc, int id); +void xp_z80_wrmem(TilemCalc* calc, dword addr, byte value); +byte xp_z80_rdmem(TilemCalc* calc, dword addr); +byte xp_z80_rdmem_m1(TilemCalc* calc, dword addr); +dword xp_mem_ltop(TilemCalc* calc, dword addr); +dword xp_mem_ptol(TilemCalc* calc, dword addr); + +#endif diff --git a/tool/tilem-src/emu/xp/xp_init.c b/tool/tilem-src/emu/xp/xp_init.c new file mode 100644 index 0000000..0189236 --- /dev/null +++ b/tool/tilem-src/emu/xp/xp_init.c @@ -0,0 +1,67 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2011 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "xp.h" + +void xp_reset(TilemCalc* calc) +{ + calc->hwregs[PORT3] = 0x0B; + calc->hwregs[PORT4] = 0x77; + calc->hwregs[PORT6] = 0x1F; + calc->hwregs[PORT7] = 0x1F; + + calc->mempagemap[0] = 0x00; + calc->mempagemap[1] = 0x1E; + calc->mempagemap[2] = 0x1F; + calc->mempagemap[3] = 0x1F; + + calc->z80.r.pc.d = 0x8000; + + calc->hwregs[PORT5] = 0; + calc->hwregs[NOEXEC0] = 0; + calc->hwregs[NOEXEC1] = 0; + calc->hwregs[NOEXEC2] = 0; + calc->hwregs[NOEXEC3] = 0; + calc->hwregs[NOEXEC4] = 0; + + calc->hwregs[PROTECTSTATE] = 0; + + tilem_linkport_set_mode(calc, TILEM_LINK_MODE_NO_TIMEOUT); + + tilem_z80_set_speed(calc, 6000); + + tilem_z80_set_timer(calc, TIMER_INT1, 1600, 8474, 1); + tilem_z80_set_timer(calc, TIMER_INT2A, 1300, 8474, 1); + tilem_z80_set_timer(calc, TIMER_INT2B, 1000, 8474, 1); +} + +void xp_stateloaded(TilemCalc* calc, int savtype TILEM_ATTR_UNUSED) +{ + tilem_calc_fix_certificate(calc, calc->mem + (0x1E * 0x4000L), + 0x15, 0x0c, 0x1f18); +} diff --git a/tool/tilem-src/emu/xp/xp_io.c b/tool/tilem-src/emu/xp/xp_io.c new file mode 100644 index 0000000..d3fe73f --- /dev/null +++ b/tool/tilem-src/emu/xp/xp_io.c @@ -0,0 +1,284 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "xp.h" + +byte xp_z80_in(TilemCalc* calc, dword port) +{ + /* FIXME: measure actual levels */ + static const byte battlevel[4] = { 33, 39, 36, 43 }; + byte v; + + switch(port&0x1f) { + case 0x00: + case 0x08: + v = tilem_linkport_get_lines(calc); + v |= (calc->linkport.lines << 4); + if (calc->linkport.mode & TILEM_LINK_MODE_ASSIST) + v |= 0x04; + if (calc->linkport.assistflags & TILEM_LINK_ASSIST_READ_BYTE) + v |= 0x08; + else if (calc->linkport.assistflags + & TILEM_LINK_ASSIST_READ_BUSY) + v |= 0x40; + + return(v); + + case 0x01: + case 0x09: + return(tilem_keypad_read_keys(calc)); + + case 0x02: + case 0x0A: + v = battlevel[calc->hwregs[PORT4] >> 6]; + return((calc->battery >= v ? 3 : 2) + | (calc->flash.unlock << 2) + | (calc->hwregs[PORT5] << 3)); + + case 0x03: + case 0x0B: + return(calc->hwregs[PORT3]); + + case 0x04: + case 0x0C: + v = (calc->keypad.onkeydown ? 0x00 : 0x08); + + if (calc->z80.interrupts & TILEM_INTERRUPT_ON_KEY) + v |= 0x01; + if (calc->z80.interrupts & TILEM_INTERRUPT_TIMER1) + v |= 0x02; + if (calc->z80.interrupts & TILEM_INTERRUPT_TIMER2) + v |= 0x04; + if (calc->z80.interrupts & TILEM_INTERRUPT_LINK_ACTIVE) + v |= 0x10; + + return(v); + + case 0x05: + case 0x0D: + return(tilem_linkport_read_byte(calc)); + + case 0x06: + case 0x0E: + return(calc->hwregs[PORT6]); + + case 0x07: + case 0x0F: + return(calc->hwregs[PORT7]); + + case 0x10: + case 0x12: + case 0x18: + case 0x1A: + return(tilem_lcd_t6a04_status(calc)); + + case 0x11: + case 0x13: + case 0x19: + case 0x1B: + return(tilem_lcd_t6a04_read(calc)); + } + return(0x00); +} + + +static void setup_mapping(TilemCalc* calc) +{ + unsigned int pageA, pageB; + + if (calc->hwregs[PORT6] & 0x40) + pageA = (0x20 | (calc->hwregs[PORT6] & 1)); + else + pageA = (calc->hwregs[PORT6] & 0x1f); + + if (calc->hwregs[PORT7] & 0x40) + pageB = (0x20 | (calc->hwregs[PORT7] & 1)); + else + pageB = (calc->hwregs[PORT7] & 0x1f); + + if (calc->hwregs[PORT4] & 1) { + calc->mempagemap[1] = (pageA & ~1); + calc->mempagemap[2] = pageA; + calc->mempagemap[3] = pageB; + } + else { + calc->mempagemap[1] = pageA; + calc->mempagemap[2] = pageB; + calc->mempagemap[3] = 0x20; + } +} + +void xp_z80_out(TilemCalc* calc, dword port, byte value) +{ + static const int tmrvalues[4] = { 1786, 4032, 5882, 8474 }; + int t; + unsigned int mode; + + switch(port&0x1f) { + case 0x00: + case 0x08: + mode = calc->linkport.mode; + if (value & 4) + mode |= TILEM_LINK_MODE_ASSIST; + else + mode &= ~TILEM_LINK_MODE_ASSIST; + + tilem_linkport_set_mode(calc, mode); + tilem_linkport_set_lines(calc, value); + break; + + case 0x01: + case 0x09: + tilem_keypad_set_group(calc, value); + break; + + case 0x03: + case 0x0B: + if (value & 0x01) { + calc->keypad.onkeyint = 1; + } + else { + calc->z80.interrupts &= ~TILEM_INTERRUPT_ON_KEY; + calc->keypad.onkeyint = 0; + } + + if (!(value & 0x02)) + calc->z80.interrupts &= ~TILEM_INTERRUPT_TIMER1; + + if (!(value & 0x04)) + calc->z80.interrupts &= ~TILEM_INTERRUPT_TIMER2; + + mode = calc->linkport.mode; + if (value & 0x10) + mode |= TILEM_LINK_MODE_INT_ON_ACTIVE; + else + mode &= ~TILEM_LINK_MODE_INT_ON_ACTIVE; + + tilem_linkport_set_mode(calc, mode); + + calc->poweronhalt = ((value & 8) >> 3); + calc->hwregs[PORT3] = value; + break; + + case 0x04: + case 0x0C: + calc->hwregs[PORT4] = value; + + t = tmrvalues[(value & 6) >> 1]; + tilem_z80_set_timer_period(calc, TIMER_INT1, t); + tilem_z80_set_timer_period(calc, TIMER_INT2A, t); + tilem_z80_set_timer_period(calc, TIMER_INT2B, t); + + setup_mapping(calc); + break; + + case 0x05: + case 0x0D: + calc->hwregs[PORT5] = value & 0x07; + break; + + case 0x06: + case 0x0E: + calc->hwregs[PORT6] = value & 0x7f; + setup_mapping(calc); + break; + + case 0x07: + case 0x0F: + calc->hwregs[PORT7] = value & 0x7f; + setup_mapping(calc); + break; + + case 0x10: + case 0x12: + case 0x18: + case 0x1A: + tilem_lcd_t6a04_control(calc, value); + break; + + case 0x11: + case 0x13: + case 0x19: + case 0x1B: + tilem_lcd_t6a04_write(calc, value); + break; + + case 0x14: + case 0x15: + if (calc->hwregs[PROTECTSTATE] == 7) { + if (value & 1) + tilem_message(calc, "Flash unlocked"); + else + tilem_message(calc, "Flash locked"); + calc->flash.unlock = value&1; + } + break; + + case 0x16: + case 0x17: + if (calc->flash.unlock && calc->hwregs[PROTECTSTATE] == 7) { + switch(calc->hwregs[PORT5]) { + case 0: + tilem_message(calc, "No-exec mask for 08-0F set to %x", value); + calc->hwregs[NOEXEC1] = value; + break; + case 1: + tilem_message(calc, "No-exec mask for 10-17 set to %x", value); + calc->hwregs[NOEXEC2] = value; + break; + case 2: + tilem_message(calc, "No-exec mask for 18-1B set to %x", value); + calc->hwregs[NOEXEC3] = value & 0x0f; + break; + case 7: + tilem_message(calc, "No-exec mask for RAM set to %x", value); + calc->hwregs[NOEXEC4] = (value & 1) | ((value>>4) & 2); + break; + } + } + break; + } + + return; +} + +void xp_z80_ptimer(TilemCalc* calc, int id) +{ + switch (id) { + case TIMER_INT1: + if (calc->hwregs[PORT3] & 0x02) + calc->z80.interrupts |= TILEM_INTERRUPT_TIMER1; + break; + + case TIMER_INT2A: + case TIMER_INT2B: + if (calc->hwregs[PORT3] & 0x04) + calc->z80.interrupts |= TILEM_INTERRUPT_TIMER2; + break; + } +} diff --git a/tool/tilem-src/emu/xp/xp_memory.c b/tool/tilem-src/emu/xp/xp_memory.c new file mode 100644 index 0000000..ad717ad --- /dev/null +++ b/tool/tilem-src/emu/xp/xp_memory.c @@ -0,0 +1,135 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2011 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "xp.h" + +void xp_z80_wrmem(TilemCalc* calc, dword A, byte v) +{ + unsigned long pa; + + pa = (A & 0x3FFF) + 0x4000*calc->mempagemap[(A)>>14]; + + if (pa < 0x80000) + tilem_flash_write_byte(calc, pa, v); + + else if (pa < 0x88000) + *(calc->mem+pa) = v; +} + +static inline byte readbyte(TilemCalc* calc, dword pa) +{ + static const byte protectbytes[6] = {0x00,0x00,0xed,0x56,0xf3,0xd3}; + int state = calc->hwregs[PROTECTSTATE]; + byte value; + + if (pa < 0x80000 && (calc->flash.state || calc->flash.busy)) + value = tilem_flash_read_byte(calc, pa); + else + value = *(calc->mem + pa); + + if (pa < 0x70000 || pa >= 0x80000) + calc->hwregs[PROTECTSTATE] = 0; + else if (state == 6) + calc->hwregs[PROTECTSTATE] = 7; + else if (state < 6 && value == protectbytes[state]) + calc->hwregs[PROTECTSTATE] = state + 1; + else + calc->hwregs[PROTECTSTATE] = 0; + + return (value); +} + +byte xp_z80_rdmem(TilemCalc* calc, dword A) +{ + byte page; + unsigned long pa; + byte value; + + page = calc->mempagemap[A>>14]; + pa = 0x4000 * page + (A & 0x3FFF); + + if (TILEM_UNLIKELY(page == 0x1E && !calc->flash.unlock)) { + tilem_warning(calc, "Reading from read-protected sector"); + return (0xff); + } + + value = readbyte(calc, pa); + return (value); +} + +byte xp_z80_rdmem_m1(TilemCalc* calc, dword A) +{ + byte page; + unsigned long pa; + byte value; + + page = calc->mempagemap[A>>14]; + pa = 0x4000 * page + (A & 0x3FFF); + + if (TILEM_UNLIKELY(calc->hwregs[NOEXEC0+page/8] & (1<<(page%8)))) { + tilem_warning(calc, "Executing in restricted %s area", + page>0x1f?"RAM":"Flash"); + tilem_z80_exception(calc, (page > 0x1f + ? TILEM_EXC_RAM_EXEC + : TILEM_EXC_FLASH_EXEC)); + } + + if (TILEM_UNLIKELY(page == 0x1E && !calc->flash.unlock)) { + tilem_warning(calc, "Reading from read-protected sector"); + return (0xff); + } + + value = readbyte(calc, pa); + + if (TILEM_UNLIKELY(value == 0xff && A == 0x0038)) { + tilem_warning(calc, "No OS installed"); + tilem_z80_exception(calc, TILEM_EXC_FLASH_EXEC); + } + + return (value); +} + +dword xp_mem_ltop(TilemCalc* calc, dword A) +{ + byte page = calc->mempagemap[A >> 14]; + return ((page << 14) | (A & 0x3fff)); +} + +dword xp_mem_ptol(TilemCalc* calc, dword A) +{ + byte page = A >> 14; + int i; + + for (i = 0; i < 4; i++) { + if (calc->mempagemap[i] == page) { + return ((i << 14) | (A & 0x3fff)); + } + } + + return (0xffffffff); +} diff --git a/tool/tilem-src/emu/xp/xp_subcore.c b/tool/tilem-src/emu/xp/xp_subcore.c new file mode 100644 index 0000000..3c6ed28 --- /dev/null +++ b/tool/tilem-src/emu/xp/xp_subcore.c @@ -0,0 +1,73 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2012 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "xp.h" + +static const TilemFlashSector flashsectors[] = { + {0x000000, 0x10000, 0}, + {0x010000, 0x10000, 0}, + {0x020000, 0x10000, 0}, + {0x030000, 0x10000, 0}, + {0x040000, 0x10000, 0}, + {0x050000, 0x10000, 0}, + {0x060000, 0x10000, 0}, + {0x070000, 0x08000, 0}, + {0x078000, 0x02000, 0}, + {0x07A000, 0x02000, 0}, + {0x07C000, 0x04000, 1}}; + +#define NUM_FLASH_SECTORS (sizeof(flashsectors) / sizeof(TilemFlashSector)) + +static const char* hwregnames[NUM_HW_REGS] = HW_REG_NAMES; + +static const char* hwtimernames[NUM_HW_TIMERS] = HW_TIMER_NAMES; + +const char* xp_keynames[64] = { + "Down", "Left", "Right", "Up", 0, 0, 0, 0, + "Enter", "Add", "Sub", "Mul", "Div", "Power", "Clear", 0, + "Chs", "3", "6", "9", "RParen", "Tan", "Vars", 0, + "DecPnt", "2", "5", "8", "LParen", "Cos", "Prgm", "Stat", + "0", "1", "4", "7", "Comma", "Sin", "Apps", "Graphvar", + "On", "Store", "Ln", "Log", "Square", "Recip", "Math", "Alpha", + "Graph", "Trace", "Zoom", "Window", "YEqu", "2nd", "Mode", "Del", + 0, 0, 0, 0, 0, 0, 0, 0}; + +TilemHardware hardware_ti83p = { + 'p', "ti83p", "TI-83 Plus", + (TILEM_CALC_HAS_LINK | TILEM_CALC_HAS_LINK_ASSIST + | TILEM_CALC_HAS_T6A04 | TILEM_CALC_HAS_FLASH), + 96, 64, 32 * 0x4000, 2 * 0x4000, 15 * 64, 0x40, + NUM_FLASH_SECTORS, flashsectors, 0, + NUM_HW_REGS, hwregnames, + NUM_HW_TIMERS, hwtimernames, + xp_keynames, + xp_reset, xp_stateloaded, + xp_z80_in, xp_z80_out, + xp_z80_wrmem, xp_z80_rdmem, xp_z80_rdmem_m1, NULL, + xp_z80_ptimer, tilem_lcd_t6a04_get_data, + xp_mem_ltop, xp_mem_ptol }; diff --git a/tool/tilem-src/emu/xs/xs.h b/tool/tilem-src/emu/xs/xs.h new file mode 100644 index 0000000..6e3e602 --- /dev/null +++ b/tool/tilem-src/emu/xs/xs.h @@ -0,0 +1,101 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2009-2011 Benjamin Moody + * + * 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, see + * . + */ + +#ifndef _TILEM_XS_H +#define _TILEM_XS_H + +enum { + PORT3, /* mask of enabled interrupts */ + PORT4, /* interrupt timer speed */ + PORT5, /* memory mapping bank C */ + PORT6, /* memory mapping bank A */ + PORT7, /* memory mapping bank B */ + PORT8, /* link assist mode flags */ + PORT9, /* unknown (link assist settings?) */ + PORTA, /* unknown (timeout value?) */ + PORTB, /* unknown (timeout value?) */ + PORTC, /* unknown (timeout value?) */ + PORTD, /* unknown */ + PORTE, /* unknown */ + PORTF, /* unknown */ + + PORT20, /* CPU speed control */ + PORT21, /* hardware type / RAM no-exec control */ + PORT22, /* Flash no-exec lower limit */ + PORT23, /* Flash no-exec upper limit */ + PORT25, /* RAM no-exec lower limit */ + PORT26, /* RAM no-exec upper limit */ + PORT27, /* bank C forced-page-0 limit */ + PORT28, /* bank B forced-page-1 limit */ + PORT29, /* LCD port delay (6 MHz) */ + PORT2A, /* LCD port delay (mode 1) */ + PORT2B, /* LCD port delay (mode 2) */ + PORT2C, /* LCD port delay (mode 3) */ + PORT2D, /* unknown */ + PORT2E, /* memory delay */ + PORT2F, /* Duration of LCD wait timer */ + + RAM_READ_DELAY, + RAM_WRITE_DELAY, + RAM_EXEC_DELAY, + FLASH_READ_DELAY, + FLASH_WRITE_DELAY, + FLASH_EXEC_DELAY, + LCD_PORT_DELAY, + NO_EXEC_RAM_MASK, + NO_EXEC_RAM_LOWER, + NO_EXEC_RAM_UPPER, + + LCD_WAIT, /* LCD wait timer active */ + PROTECTSTATE, /* port protection state */ + NUM_HW_REGS +}; + +#define HW_REG_NAMES \ + { "port3", "port4", "port5", "port6", "port7", "port8", "port9", \ + "portA", "portB", "portC", "portD", "portE", "portF", "port20", \ + "port21", "port22", "port23", "port25", "port26", "port27", \ + "port28", "port29", "port2A", "port2B", "port2C", "port2D", \ + "port2E", "port2F", "ram_read_delay", "ram_write_delay", \ + "ram_exec_delay", "flash_read_delay", "flash_write_delay", \ + "flash_exec_delay", "lcd_port_delay", "no_exec_ram_mask", \ + "no_exec_ram_lower", "no_exec_ram_upper", \ + "lcd_wait", "protectstate" } + +#define TIMER_INT1 (TILEM_NUM_SYS_TIMERS + 1) +#define TIMER_INT2A (TILEM_NUM_SYS_TIMERS + 2) +#define TIMER_INT2B (TILEM_NUM_SYS_TIMERS + 3) +#define TIMER_LCD_WAIT (TILEM_NUM_SYS_TIMERS + 4) +#define NUM_HW_TIMERS 4 + +#define HW_TIMER_NAMES { "int1", "int2a", "int2b", "lcd_wait" } + +void xs_reset(TilemCalc* calc); +void xs_stateloaded(TilemCalc* calc, int savtype); +byte xs_z80_in(TilemCalc* calc, dword port); +void xs_z80_out(TilemCalc* calc, dword port, byte value); +void xs_z80_ptimer(TilemCalc* calc, int id); +void xs_z80_wrmem(TilemCalc* calc, dword addr, byte value); +byte xs_z80_rdmem(TilemCalc* calc, dword addr); +byte xs_z80_rdmem_m1(TilemCalc* calc, dword addr); +dword xs_mem_ltop(TilemCalc* calc, dword addr); +dword xs_mem_ptol(TilemCalc* calc, dword addr); + +#endif diff --git a/tool/tilem-src/emu/xs/xs_init.c b/tool/tilem-src/emu/xs/xs_init.c new file mode 100644 index 0000000..1e05164 --- /dev/null +++ b/tool/tilem-src/emu/xs/xs_init.c @@ -0,0 +1,91 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2012 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "xs.h" + +void xp_fix_cert(TilemCalc* calc, byte *cert); + +void xs_reset(TilemCalc* calc) +{ + calc->hwregs[PORT3] = 0x0B; + calc->hwregs[PORT4] = 0x77; + calc->hwregs[PORT6] = 0x7F; + calc->hwregs[PORT7] = 0x7F; + + calc->mempagemap[0] = 0x00; + calc->mempagemap[1] = 0x7E; + calc->mempagemap[2] = 0x7F; + calc->mempagemap[3] = 0x7F; + + calc->z80.r.pc.d = 0x8000; + + calc->hwregs[PORT8] = 0x80; + + calc->hwregs[PORT20] = 0; + calc->hwregs[PORT21] = 1; + calc->hwregs[PORT22] = 0x08; + calc->hwregs[PORT23] = 0x69; + calc->hwregs[PORT25] = 0x10; + calc->hwregs[PORT26] = 0x20; + calc->hwregs[PORT27] = 0; + calc->hwregs[PORT28] = 0; + calc->hwregs[PORT29] = 0x14; + calc->hwregs[PORT2A] = 0x27; + calc->hwregs[PORT2B] = 0x2F; + calc->hwregs[PORT2C] = 0x3B; + calc->hwregs[PORT2D] = 0x01; + calc->hwregs[PORT2E] = 0x44; + calc->hwregs[PORT2F] = 0x4A; + + calc->hwregs[FLASH_READ_DELAY] = 0; + calc->hwregs[FLASH_WRITE_DELAY] = 0; + calc->hwregs[FLASH_EXEC_DELAY] = 0; + calc->hwregs[RAM_READ_DELAY] = 0; + calc->hwregs[RAM_WRITE_DELAY] = 0; + calc->hwregs[RAM_EXEC_DELAY] = 0; + calc->hwregs[LCD_PORT_DELAY] = 5; + calc->hwregs[NO_EXEC_RAM_MASK] = 0x7C00; + calc->hwregs[NO_EXEC_RAM_LOWER] = 0x4000; + calc->hwregs[NO_EXEC_RAM_UPPER] = 0x8000; + + calc->hwregs[PROTECTSTATE] = 0; + + calc->flash.overridegroup = 1; + + tilem_z80_set_speed(calc, 6000); + + tilem_z80_set_timer(calc, TIMER_INT1, 1600, 9277, 1); + tilem_z80_set_timer(calc, TIMER_INT2A, 1300, 9277, 1); + tilem_z80_set_timer(calc, TIMER_INT2B, 1000, 9277, 1); +} + +void xs_stateloaded(TilemCalc* calc, int savtype TILEM_ATTR_UNUSED) +{ + tilem_calc_fix_certificate(calc, calc->mem + (0x7E * 0x4000L), + 0x69, 0x0c, 0x1e50); +} diff --git a/tool/tilem-src/emu/xs/xs_io.c b/tool/tilem-src/emu/xs/xs_io.c new file mode 100644 index 0000000..ef6f27f --- /dev/null +++ b/tool/tilem-src/emu/xs/xs_io.c @@ -0,0 +1,658 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2012 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "xs.h" + +static void set_lcd_wait_timer(TilemCalc* calc) +{ + static const int delaytime[8] = { 48, 112, 176, 240, + 304, 368, 432, 496 }; + int i; + + switch (calc->hwregs[PORT20] & 3) { + case 0: + return; + case 1: + i = (calc->hwregs[PORT2F] & 3); + break; + case 2: + i = ((calc->hwregs[PORT2F] >> 2) & 7); + break; + default: + i = ((calc->hwregs[PORT2F] >> 5) & 7); + break; + } + + tilem_z80_set_timer(calc, TIMER_LCD_WAIT, delaytime[i], 0, 0); + calc->hwregs[LCD_WAIT] = 1; +} + +byte xs_z80_in(TilemCalc* calc, dword port) +{ + /* FIXME: measure actual levels */ + static const byte battlevel[4] = { 33, 39, 36, 43 }; + byte v; + unsigned int f; + + switch(port&0xff) { + case 0x00: + v = tilem_linkport_get_lines(calc); + v |= (calc->linkport.lines << 4); + return(v); + + case 0x01: + return(tilem_keypad_read_keys(calc)); + + case 0x02: + v = battlevel[calc->hwregs[PORT4] >> 6]; + return((calc->battery >= v ? 0xc1 : 0xc0) + | (calc->hwregs[LCD_WAIT] ? 0 : 2) + | (calc->flash.unlock << 2)); + + case 0x03: + return(calc->hwregs[PORT3]); + + case 0x04: + v = (calc->keypad.onkeydown ? 0x00 : 0x08); + + if (calc->z80.interrupts & TILEM_INTERRUPT_ON_KEY) + v |= 0x01; + if (calc->z80.interrupts & TILEM_INTERRUPT_TIMER1) + v |= 0x02; + if (calc->z80.interrupts & TILEM_INTERRUPT_TIMER2) + v |= 0x04; + if (calc->z80.interrupts & TILEM_INTERRUPT_LINK_ACTIVE) + v |= 0x10; + + if (calc->usertimers[0].status & TILEM_USER_TIMER_FINISHED) + v |= 0x20; + if (calc->usertimers[1].status & TILEM_USER_TIMER_FINISHED) + v |= 0x40; + if (calc->usertimers[2].status & TILEM_USER_TIMER_FINISHED) + v |= 0x80; + + return(v); + + case 0x05: + return(calc->hwregs[PORT5] & 0x0f); + + case 0x06: + return(calc->hwregs[PORT6]); + + case 0x07: + return(calc->hwregs[PORT7]); + + case 0x08: + return(calc->hwregs[PORT8]); + + case 0x09: + f = tilem_linkport_get_assist_flags(calc); + + if (f & (TILEM_LINK_ASSIST_READ_BUSY + | TILEM_LINK_ASSIST_WRITE_BUSY)) + v = 0x00; + else + v = 0x20; + + if (calc->z80.interrupts & TILEM_INTERRUPT_LINK_READ) + v |= 0x01; + if (calc->z80.interrupts & TILEM_INTERRUPT_LINK_IDLE) + v |= 0x02; + if (calc->z80.interrupts & TILEM_INTERRUPT_LINK_ERROR) + v |= 0x04; + if (f & TILEM_LINK_ASSIST_READ_BUSY) + v |= 0x08; + if (f & TILEM_LINK_ASSIST_READ_BYTE) + v |= 0x10; + if (f & (TILEM_LINK_ASSIST_READ_ERROR + | TILEM_LINK_ASSIST_WRITE_ERROR)) + v |= 0x40; + if (f & TILEM_LINK_ASSIST_WRITE_BUSY) + v |= 0x80; + + calc->z80.interrupts &= ~TILEM_INTERRUPT_LINK_ERROR; + + return(v); + + case 0x0A: + v = calc->linkport.assistlastbyte; + tilem_linkport_read_byte(calc); + return(v); + + case 0x0E: + return(calc->hwregs[PORTE] & 3); + + case 0x0F: + return(calc->hwregs[PORTF] & 3); + + case 0x10: + case 0x12: + calc->z80.clock += calc->hwregs[LCD_PORT_DELAY]; + set_lcd_wait_timer(calc); + return(tilem_lcd_t6a04_status(calc)); + + case 0x11: + case 0x13: + calc->z80.clock += calc->hwregs[LCD_PORT_DELAY]; + set_lcd_wait_timer(calc); + return(tilem_lcd_t6a04_read(calc)); + + case 0x15: + return(0x33); /* ??? */ + + case 0x1C: + return(tilem_md5_assist_get_value(calc)); + + case 0x1D: + return(tilem_md5_assist_get_value(calc) >> 8); + + case 0x1E: + return(tilem_md5_assist_get_value(calc) >> 16); + + case 0x1F: + return(tilem_md5_assist_get_value(calc) >> 24); + + case 0x20: + return(calc->hwregs[PORT20] & 3); + + case 0x21: + return(calc->hwregs[PORT21] & 0x33); + + case 0x22: + return(calc->hwregs[PORT22]); + + case 0x23: + return(calc->hwregs[PORT23]); + + case 0x25: + return(calc->hwregs[PORT25]); + + case 0x26: + return(calc->hwregs[PORT26]); + + case 0x27: + return(calc->hwregs[PORT27]); + + case 0x28: + return(calc->hwregs[PORT28]); + + case 0x29: + return(calc->hwregs[PORT29]); + + case 0x2A: + return(calc->hwregs[PORT2A]); + + case 0x2B: + return(calc->hwregs[PORT2B]); + + case 0x2C: + return(calc->hwregs[PORT2C]); + + case 0x2D: + return(calc->hwregs[PORT2D] & 3); + + case 0x2E: + return(calc->hwregs[PORT2E]); + + case 0x2F: + return(calc->hwregs[PORT2F]); + + case 0x30: + return(calc->usertimers[0].frequency); + case 0x31: + return(calc->usertimers[0].status); + case 0x32: + return(tilem_user_timer_get_value(calc, 0)); + + case 0x33: + return(calc->usertimers[1].frequency); + case 0x34: + return(calc->usertimers[1].status); + case 0x35: + return(tilem_user_timer_get_value(calc, 1)); + + case 0x36: + return(calc->usertimers[2].frequency); + case 0x37: + return(calc->usertimers[2].status); + case 0x38: + return(tilem_user_timer_get_value(calc, 2)); + + case 0x0B: + case 0x0C: + case 0x0D: + case 0x14: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + case 0x39: + case 0x3A: + case 0x3B: + case 0x3C: + case 0x3D: + case 0x3E: + case 0x3F: + return(0); + } + + return(0xff); +} + + +static void setup_mapping(TilemCalc* calc) +{ + unsigned int pageA, pageB, pageC; + + if (calc->hwregs[PORT6] & 0x80) + pageA = (0x80 | (calc->hwregs[PORT6] & 7)); + else + pageA = (calc->hwregs[PORT6] & 0x7f); + + if (calc->hwregs[PORT7] & 0x80) + pageB = (0x80 | (calc->hwregs[PORT7] & 7)); + else + pageB = (calc->hwregs[PORT7] & 0x7f); + + pageC = (0x80 | (calc->hwregs[PORT5] & 7)); + + if (calc->hwregs[PORT4] & 1) { + calc->mempagemap[1] = (pageA & ~1); + calc->mempagemap[2] = (pageA | 1); + calc->mempagemap[3] = pageB; + } + else { + calc->mempagemap[1] = pageA; + calc->mempagemap[2] = pageB; + calc->mempagemap[3] = pageC; + } +} + +static void setup_clockdelays(TilemCalc* calc) +{ + byte lcdport = calc->hwregs[PORT29 + (calc->hwregs[PORT20] & 3)]; + byte memport = calc->hwregs[PORT2E]; + + if (!(lcdport & 1)) + memport &= ~0x07; + if (!(lcdport & 2)) + memport &= ~0x70; + + calc->hwregs[FLASH_EXEC_DELAY] = (memport & 1); + calc->hwregs[FLASH_READ_DELAY] = ((memport >> 1) & 1); + calc->hwregs[FLASH_WRITE_DELAY] = ((memport >> 2) & 1); + + calc->hwregs[RAM_EXEC_DELAY] = ((memport >> 4) & 1); + calc->hwregs[RAM_READ_DELAY] = ((memport >> 5) & 1); + calc->hwregs[RAM_WRITE_DELAY] = ((memport >> 6) & 1); + + calc->hwregs[LCD_PORT_DELAY] = (lcdport >> 2); +} + +void xs_z80_out(TilemCalc* calc, dword port, byte value) +{ + static const int tmrvalues[4] = { 1953, 4395, 6836, 9277 }; + int t, r; + unsigned int mode; + + switch(port&0xff) { + case 0x00: + tilem_linkport_set_lines(calc, value); + break; + + case 0x01: + tilem_keypad_set_group(calc, value); + break; + + case 0x03: + if (value & 0x01) { + calc->keypad.onkeyint = 1; + } + else { + calc->z80.interrupts &= ~TILEM_INTERRUPT_ON_KEY; + calc->keypad.onkeyint = 0; + } + + if (!(value & 0x02)) + calc->z80.interrupts &= ~TILEM_INTERRUPT_TIMER1; + + if (!(value & 0x04)) + calc->z80.interrupts &= ~TILEM_INTERRUPT_TIMER2; + + if (value & 0x06) { + calc->usertimers[0].status &= ~TILEM_USER_TIMER_NO_HALT_INT; + calc->usertimers[1].status &= ~TILEM_USER_TIMER_NO_HALT_INT; + calc->usertimers[2].status &= ~TILEM_USER_TIMER_NO_HALT_INT; + } + else { + calc->usertimers[0].status |= TILEM_USER_TIMER_NO_HALT_INT; + calc->usertimers[1].status |= TILEM_USER_TIMER_NO_HALT_INT; + calc->usertimers[2].status |= TILEM_USER_TIMER_NO_HALT_INT; + } + + mode = calc->linkport.mode; + if (value & 0x10) + mode |= TILEM_LINK_MODE_INT_ON_ACTIVE; + else + mode &= ~TILEM_LINK_MODE_INT_ON_ACTIVE; + + tilem_linkport_set_mode(calc, mode); + + calc->poweronhalt = ((value & 8) >> 3); + calc->hwregs[PORT3] = value; + break; + + case 0x04: + calc->hwregs[PORT4] = value; + + t = tmrvalues[(value & 6) >> 1]; + tilem_z80_set_timer_period(calc, TIMER_INT1, t); + tilem_z80_set_timer_period(calc, TIMER_INT2A, t); + tilem_z80_set_timer_period(calc, TIMER_INT2B, t); + + setup_mapping(calc); + break; + + case 0x05: + calc->hwregs[PORT5] = value & 0x0f; + setup_mapping(calc); + break; + + case 0x06: + calc->hwregs[PORT6] = value; + setup_mapping(calc); + break; + + case 0x07: + calc->hwregs[PORT7] = value; + setup_mapping(calc); + break; + + case 0x08: + calc->hwregs[PORT8] = value; + + mode = calc->linkport.mode; + + if (value & 0x01) + mode |= TILEM_LINK_MODE_INT_ON_READ; + else + mode &= ~TILEM_LINK_MODE_INT_ON_READ; + + if (value & 0x02) + mode |= TILEM_LINK_MODE_INT_ON_IDLE; + else + mode &= ~TILEM_LINK_MODE_INT_ON_IDLE; + + if (value & 0x04) + mode |= TILEM_LINK_MODE_INT_ON_ERROR; + else + mode &= ~TILEM_LINK_MODE_INT_ON_ERROR; + + if (value & 0x80) + mode &= ~TILEM_LINK_MODE_ASSIST; + else + mode |= TILEM_LINK_MODE_ASSIST; + + tilem_linkport_set_mode(calc, mode); + break; + + case 0x09: + calc->hwregs[PORT9] = value; + break; + + case 0x0A: + calc->hwregs[PORTA] = value; + break; + + case 0x0B: + calc->hwregs[PORTB] = value; + break; + + case 0x0C: + calc->hwregs[PORTC] = value; + break; + + case 0x0D: + if (!(calc->hwregs[PORT8] & 0x80)) + tilem_linkport_write_byte(calc, value); + break; + + case 0x0E: + calc->hwregs[PORTE] = value; + break; + + case 0x0F: + calc->hwregs[PORTF] = value; + break; + + case 0x10: + case 0x12: + calc->z80.clock += calc->hwregs[LCD_PORT_DELAY]; + set_lcd_wait_timer(calc); + tilem_lcd_t6a04_control(calc, value); + break; + + case 0x11: + case 0x13: + calc->z80.clock += calc->hwregs[LCD_PORT_DELAY]; + set_lcd_wait_timer(calc); + tilem_lcd_t6a04_write(calc, value); + break; + + case 0x14: + if (calc->hwregs[PROTECTSTATE] == 7) { + if (value & 1) + tilem_message(calc, "Flash unlocked"); + else + tilem_message(calc, "Flash locked"); + calc->flash.unlock = value&1; + } + else { + tilem_warning(calc, "Writing to protected port 14"); + } + break; + + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + r = (port & 0xff) - 0x18; + calc->md5assist.regs[r] >>= 8; + calc->md5assist.regs[r] |= (value << 24); + break; + + case 0x1E: + calc->md5assist.shift = value & 0x1f; + break; + + case 0x1F: + calc->md5assist.mode = value & 3; + break; + + case 0x20: + calc->hwregs[PORT20] = value; + + if (value & 3) { + tilem_z80_set_speed(calc, 15000); + } + else { + tilem_z80_set_speed(calc, 6000); + } + + setup_clockdelays(calc); + break; + + case 0x21: + if (calc->flash.unlock) { + calc->hwregs[PORT21] = value; + t = (value >> 4) & 3; + calc->hwregs[NO_EXEC_RAM_MASK] = (0x8000 << t) - 0x400; + calc->flash.overridegroup = value & 3; + } + else { + tilem_warning(calc, "Writing to protected port 21"); + } + break; + + case 0x22: + if (calc->flash.unlock) { + calc->hwregs[PORT22] = value; + } + else { + tilem_warning(calc, "Writing to protected port 22"); + } + break; + + case 0x23: + if (calc->flash.unlock) { + calc->hwregs[PORT23] = value; + } + else { + tilem_warning(calc, "Writing to protected port 23"); + } + break; + + case 0x25: + if (calc->flash.unlock) { + calc->hwregs[PORT25] = value; + calc->hwregs[NO_EXEC_RAM_LOWER] = value * 0x400; + } + else { + tilem_warning(calc, "Writing to protected port 25"); + } + break; + + case 0x26: + if (calc->flash.unlock) { + calc->hwregs[PORT26] = value; + calc->hwregs[NO_EXEC_RAM_UPPER] = value * 0x400; + } + else { + tilem_warning(calc, "Writing to protected port 26"); + } + break; + + case 0x27: + calc->hwregs[PORT27] = value; + break; + + case 0x28: + calc->hwregs[PORT28] = value; + break; + + case 0x29: + calc->hwregs[PORT29] = value; + setup_clockdelays(calc); + break; + + case 0x2A: + calc->hwregs[PORT2A] = value; + setup_clockdelays(calc); + break; + + case 0x2B: + calc->hwregs[PORT2B] = value; + setup_clockdelays(calc); + break; + + case 0x2C: + calc->hwregs[PORT2C] = value; + setup_clockdelays(calc); + break; + + case 0x2D: + calc->hwregs[PORT2D] = value; + setup_clockdelays(calc); + break; + + case 0x2E: + calc->hwregs[PORT2E] = value; + setup_clockdelays(calc); + break; + + case 0x2F: + calc->hwregs[PORT2F] = value; + break; + + case 0x30: + tilem_user_timer_set_frequency(calc, 0, value); + break; + case 0x31: + tilem_user_timer_set_mode(calc, 0, value); + break; + case 0x32: + tilem_user_timer_start(calc, 0, value); + break; + + case 0x33: + tilem_user_timer_set_frequency(calc, 1, value); + break; + case 0x34: + tilem_user_timer_set_mode(calc, 1, value); + break; + case 0x35: + tilem_user_timer_start(calc, 1, value); + break; + + case 0x36: + tilem_user_timer_set_frequency(calc, 2, value); + break; + case 0x37: + tilem_user_timer_set_mode(calc, 2, value); + break; + case 0x38: + tilem_user_timer_start(calc, 2, value); + break; + } + + return; +} + +void xs_z80_ptimer(TilemCalc* calc, int id) +{ + switch (id) { + case TIMER_INT1: + if (calc->hwregs[PORT3] & 0x02) + calc->z80.interrupts |= TILEM_INTERRUPT_TIMER1; + break; + + case TIMER_INT2A: + case TIMER_INT2B: + if (calc->hwregs[PORT3] & 0x04) + calc->z80.interrupts |= TILEM_INTERRUPT_TIMER2; + break; + + case TIMER_LCD_WAIT: + calc->hwregs[LCD_WAIT] = 0; + break; + } +} diff --git a/tool/tilem-src/emu/xs/xs_memory.c b/tool/tilem-src/emu/xs/xs_memory.c new file mode 100644 index 0000000..c007e1a --- /dev/null +++ b/tool/tilem-src/emu/xs/xs_memory.c @@ -0,0 +1,213 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2011 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "xs.h" + +/* FIXME: what effect, if any, do ports 27 and 28 have in memory + mapping mode 1? */ + +void xs_z80_wrmem(TilemCalc* calc, dword A, byte v) +{ + unsigned long pa; + byte page; + + page = calc->mempagemap[A>>14]; + + if (A & 0x8000) { + if (A > (0xFFFF - 64 * calc->hwregs[PORT27])) + page = 0x80; + else if (A < (0x8000 + 64 * calc->hwregs[PORT28])) + page = 0x81; + } + + pa = (A & 0x3FFF) + 0x4000L*page; + + if (pa<0x200000) { + calc->z80.clock += calc->hwregs[FLASH_WRITE_DELAY]; + tilem_flash_write_byte(calc, pa, v); + } + else if (pa < 0x220000) { + calc->z80.clock += calc->hwregs[RAM_WRITE_DELAY]; + *(calc->mem+pa) = v; + } +} + +static inline byte readbyte(TilemCalc* calc, dword pa) +{ + static const byte protectbytes[6] = {0x00,0x00,0xed,0x56,0xf3,0xd3}; + int state = calc->hwregs[PROTECTSTATE]; + byte value; + + if (pa < 0x200000 && (calc->flash.state || calc->flash.busy)) + value = tilem_flash_read_byte(calc, pa); + else + value = *(calc->mem + pa); + + if (pa < 0x1F0000 || pa >= 0x200000) + calc->hwregs[PROTECTSTATE] = 0; + else if (state == 6) + calc->hwregs[PROTECTSTATE] = 7; + else if (state < 6 && value == protectbytes[state]) + calc->hwregs[PROTECTSTATE] = state + 1; + else + calc->hwregs[PROTECTSTATE] = 0; + + return (value); +} + +byte xs_z80_rdmem(TilemCalc* calc, dword A) +{ + byte page; + unsigned long pa; + byte value; + + page = calc->mempagemap[A>>14]; + + if (A & 0x8000) { + if (A > (0xFFFF - 64 * calc->hwregs[PORT27])) + page = 0x80; + else if (A < (0x8000 + 64 * calc->hwregs[PORT28])) + page = 0x81; + } + + if (TILEM_UNLIKELY(page == 0x7E && !calc->flash.unlock)) { + tilem_warning(calc, "Reading from read-protected sector"); + return (0xff); + } + + pa = (A & 0x3FFF) + 0x4000L*page; + + if (pa < 0x200000) + calc->z80.clock += calc->hwregs[FLASH_READ_DELAY]; + else + calc->z80.clock += calc->hwregs[RAM_READ_DELAY]; + + value = readbyte(calc, pa); + return (value); +} + +byte xs_z80_rdmem_m1(TilemCalc* calc, dword A) +{ + byte page; + unsigned long pa, m; + byte value; + + page = calc->mempagemap[A>>14]; + + if (A & 0x8000) { + if (A > (0xFFFF - 64 * calc->hwregs[PORT27])) + page = 0x80; + else if (A < (0x8000 + 64 * calc->hwregs[PORT28])) + page = 0x81; + } + + if (TILEM_UNLIKELY(page == 0x7E && !calc->flash.unlock)) { + tilem_warning(calc, "Reading from read-protected sector"); + return (0xff); + } + + pa = (A & 0x3FFF) + 0x4000L*page; + + if (pa < 0x200000) { + calc->z80.clock += calc->hwregs[FLASH_EXEC_DELAY]; + + if (TILEM_UNLIKELY(page >= calc->hwregs[PORT22] + && page <= calc->hwregs[PORT23])) { + tilem_warning(calc, "Executing in restricted Flash area"); + tilem_z80_exception(calc, TILEM_EXC_FLASH_EXEC); + } + } + else { + calc->z80.clock += calc->hwregs[RAM_EXEC_DELAY]; + + /* Note: this isn't quite strict enough; when port 21 + is set to 30h, the "ghost" RAM pages 88-8F are + treated as distinct pages for restriction purposes. + This detail probably isn't worth emulating. */ + m = pa & calc->hwregs[NO_EXEC_RAM_MASK]; + if (TILEM_UNLIKELY(m < calc->hwregs[NO_EXEC_RAM_LOWER] + || m > calc->hwregs[NO_EXEC_RAM_UPPER])) { + tilem_warning(calc, "Executing in restricted RAM area"); + tilem_z80_exception(calc, TILEM_EXC_RAM_EXEC); + } + } + + value = readbyte(calc, pa); + + if (TILEM_UNLIKELY(value == 0xff && A == 0x0038)) { + tilem_warning(calc, "No OS installed"); + tilem_z80_exception(calc, TILEM_EXC_FLASH_EXEC); + } + + return (value); +} + +dword xs_mem_ltop(TilemCalc* calc, dword A) +{ + byte page = calc->mempagemap[A >> 14]; + + if (A & 0x8000) { + if (A > (0xFFFF - 64 * calc->hwregs[PORT27])) + page = 0x80; + else if (A < (0x8000 + 64 * calc->hwregs[PORT28])) + page = 0x81; + } + + return ((page << 14) | (A & 0x3fff)); +} + +dword xs_mem_ptol(TilemCalc* calc, dword A) +{ + byte page = A >> 14; + + if (!page) + return (A & 0x3fff); + + if (page == calc->mempagemap[1]) + return (0x4000 | (A & 0x3fff)); + + if ((A & 0x3fff) < 64 * calc->hwregs[PORT28]) { + if (page == 0x81) + return (0x8000 | (A & 0x3fff)); + } + else { + if (page == calc->mempagemap[2]) + return (0x8000 | (A & 0x3fff)); + } + + if ((A & 0x3fff) >= (0x4000 - 64 * calc->hwregs[PORT27])) { + if (page == 0x80) + return (0xC000 | (A & 0x3fff)); + } + else { + if (page == calc->mempagemap[3]) + return (0xC000 | (A & 0x3fff)); + } + + return (0xffffffff); +} diff --git a/tool/tilem-src/emu/xs/xs_subcore.c b/tool/tilem-src/emu/xs/xs_subcore.c new file mode 100644 index 0000000..121be93 --- /dev/null +++ b/tool/tilem-src/emu/xs/xs_subcore.c @@ -0,0 +1,73 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2012 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "xs.h" + +static const TilemFlashSector flashsectors[] = { + {0x000000, 0x10000, 0}, {0x010000, 0x10000, 0}, + {0x020000, 0x10000, 0}, {0x030000, 0x10000, 0}, + {0x040000, 0x10000, 0}, {0x050000, 0x10000, 0}, + {0x060000, 0x10000, 0}, {0x070000, 0x10000, 0}, + {0x080000, 0x10000, 0}, {0x090000, 0x10000, 0}, + {0x0A0000, 0x10000, 0}, {0x0B0000, 0x10000, 0}, + {0x0C0000, 0x10000, 0}, {0x0D0000, 0x10000, 0}, + {0x0E0000, 0x10000, 0}, {0x0F0000, 0x10000, 0}, + {0x100000, 0x10000, 0}, {0x110000, 0x10000, 0}, + {0x120000, 0x10000, 0}, {0x130000, 0x10000, 0}, + {0x140000, 0x10000, 0}, {0x150000, 0x10000, 0}, + {0x160000, 0x10000, 0}, {0x170000, 0x10000, 0}, + {0x180000, 0x10000, 0}, {0x190000, 0x10000, 0}, + {0x1A0000, 0x10000, 0}, {0x1B0000, 0x10000, 0}, + {0x1C0000, 0x10000, 0}, {0x1D0000, 0x10000, 0}, + {0x1E0000, 0x10000, 0}, {0x1F0000, 0x08000, 0}, + {0x1F8000, 0x02000, 0}, {0x1FA000, 0x02000, 0}, + {0x1FC000, 0x04000, 2}}; + +#define NUM_FLASH_SECTORS (sizeof(flashsectors) / sizeof(TilemFlashSector)) + +static const char* hwregnames[NUM_HW_REGS] = HW_REG_NAMES; + +static const char* hwtimernames[NUM_HW_TIMERS] = HW_TIMER_NAMES; + +extern const char* xp_keynames[]; + +TilemHardware hardware_ti83pse = { + 's', "ti83pse", "TI-83 Plus Silver Edition", + (TILEM_CALC_HAS_LINK | TILEM_CALC_HAS_LINK_ASSIST + | TILEM_CALC_HAS_T6A04 | TILEM_CALC_HAS_FLASH + | TILEM_CALC_HAS_MD5_ASSIST), + 96, 64, 128 * 0x4000, 8 * 0x4000, 16 * 64, 0x80, + NUM_FLASH_SECTORS, flashsectors, 3, + NUM_HW_REGS, hwregnames, + NUM_HW_TIMERS, hwtimernames, + xp_keynames, + xs_reset, xs_stateloaded, + xs_z80_in, xs_z80_out, + xs_z80_wrmem, xs_z80_rdmem, xs_z80_rdmem_m1, NULL, + xs_z80_ptimer, tilem_lcd_t6a04_get_data, + xs_mem_ltop, xs_mem_ptol }; diff --git a/tool/tilem-src/emu/xz/xz.h b/tool/tilem-src/emu/xz/xz.h new file mode 100644 index 0000000..6f6d440 --- /dev/null +++ b/tool/tilem-src/emu/xz/xz.h @@ -0,0 +1,105 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2009-2011 Benjamin Moody + * + * 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, see + * . + */ + +#ifndef _TILEM_XZ_H +#define _TILEM_XZ_H + +enum { + PORT3, /* mask of enabled interrupts */ + PORT4, /* interrupt timer speed */ + PORT5, /* memory mapping bank C */ + PORT6, /* memory mapping bank A */ + PORT7, /* memory mapping bank B */ + PORT8, /* link assist mode flags */ + PORT9, /* unknown (link assist settings?) */ + PORTA, /* unknown (timeout value?) */ + PORTB, /* unknown (timeout value?) */ + PORTC, /* unknown (timeout value?) */ + PORTD, /* unknown */ + PORTE, /* unknown */ + PORTF, /* unknown */ + + PORT20, /* CPU speed control */ + PORT21, /* hardware type / RAM no-exec control */ + PORT22, /* Flash no-exec lower limit */ + PORT23, /* Flash no-exec upper limit */ + PORT25, /* RAM no-exec lower limit */ + PORT26, /* RAM no-exec upper limit */ + PORT27, /* bank C forced-page-0 limit */ + PORT28, /* bank B forced-page-1 limit */ + PORT29, /* LCD port delay (6 MHz) */ + PORT2A, /* LCD port delay (mode 1) */ + PORT2B, /* LCD port delay (mode 2) */ + PORT2C, /* LCD port delay (mode 3) */ + PORT2D, /* unknown */ + PORT2E, /* memory delay */ + PORT2F, /* Duration of LCD wait timer */ + + CLOCK_MODE, /* clock mode */ + CLOCK_INPUT, /* clock input register */ + CLOCK_DIFF, /* clock value minus actual time */ + + RAM_READ_DELAY, + RAM_WRITE_DELAY, + RAM_EXEC_DELAY, + FLASH_READ_DELAY, + FLASH_WRITE_DELAY, + FLASH_EXEC_DELAY, + LCD_PORT_DELAY, + NO_EXEC_RAM_MASK, + NO_EXEC_RAM_LOWER, + NO_EXEC_RAM_UPPER, + + LCD_WAIT, /* LCD wait timer active */ + PROTECTSTATE, /* port protection state */ + NUM_HW_REGS +}; + +#define HW_REG_NAMES \ + { "port3", "port4", "port5", "port6", "port7", "port8", "port9", \ + "portA", "portB", "portC", "portD", "portE", "portF", "port20", \ + "port21", "port22", "port23", "port25", "port26", "port27", \ + "port28", "port29", "port2A", "port2B", "port2C", "port2D", \ + "port2E", "port2F", "clock_mode", "clock_input", "clock_diff", \ + "ram_read_delay", "ram_write_delay", "ram_exec_delay", \ + "flash_read_delay", "flash_write_delay", "flash_exec_delay", \ + "lcd_port_delay", "no_exec_ram_mask", "no_exec_ram_lower", \ + "no_exec_ram_upper", "lcd_wait", "protectstate" } + +#define TIMER_INT1 (TILEM_NUM_SYS_TIMERS + 1) +#define TIMER_INT2A (TILEM_NUM_SYS_TIMERS + 2) +#define TIMER_INT2B (TILEM_NUM_SYS_TIMERS + 3) +#define TIMER_LCD_WAIT (TILEM_NUM_SYS_TIMERS + 4) +#define NUM_HW_TIMERS 4 + +#define HW_TIMER_NAMES { "int1", "int2a", "int2b", "lcd_wait" } + +void xz_reset(TilemCalc* calc); +void xz_stateloaded(TilemCalc* calc, int savtype); +byte xz_z80_in(TilemCalc* calc, dword port); +void xz_z80_out(TilemCalc* calc, dword port, byte value); +void xz_z80_ptimer(TilemCalc* calc, int id); +void xz_z80_wrmem(TilemCalc* calc, dword addr, byte value); +byte xz_z80_rdmem(TilemCalc* calc, dword addr); +byte xz_z80_rdmem_m1(TilemCalc* calc, dword addr); +dword xz_mem_ltop(TilemCalc* calc, dword addr); +dword xz_mem_ptol(TilemCalc* calc, dword addr); + +#endif diff --git a/tool/tilem-src/emu/xz/xz_init.c b/tool/tilem-src/emu/xz/xz_init.c new file mode 100644 index 0000000..eace5a7 --- /dev/null +++ b/tool/tilem-src/emu/xz/xz_init.c @@ -0,0 +1,89 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2012 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "xz.h" + +void xz_reset(TilemCalc* calc) +{ + calc->hwregs[PORT3] = 0x0B; + calc->hwregs[PORT4] = 0x07; + calc->hwregs[PORT6] = 0x7F; + calc->hwregs[PORT7] = 0x7F; + + calc->mempagemap[0] = 0x00; + calc->mempagemap[1] = 0x7E; + calc->mempagemap[2] = 0x7F; + calc->mempagemap[3] = 0x7F; + + calc->z80.r.pc.d = 0x8000; + + calc->hwregs[PORT8] = 0x80; + + calc->hwregs[PORT20] = 0; + calc->hwregs[PORT21] = 1; + calc->hwregs[PORT22] = 0x08; + calc->hwregs[PORT23] = 0x69; + calc->hwregs[PORT25] = 0x10; + calc->hwregs[PORT26] = 0x20; + calc->hwregs[PORT27] = 0; + calc->hwregs[PORT28] = 0; + calc->hwregs[PORT29] = 0x14; + calc->hwregs[PORT2A] = 0x27; + calc->hwregs[PORT2B] = 0x2F; + calc->hwregs[PORT2C] = 0x3B; + calc->hwregs[PORT2D] = 0x01; + calc->hwregs[PORT2E] = 0x44; + calc->hwregs[PORT2F] = 0x4A; + + calc->hwregs[FLASH_READ_DELAY] = 0; + calc->hwregs[FLASH_WRITE_DELAY] = 0; + calc->hwregs[FLASH_EXEC_DELAY] = 0; + calc->hwregs[RAM_READ_DELAY] = 0; + calc->hwregs[RAM_WRITE_DELAY] = 0; + calc->hwregs[RAM_EXEC_DELAY] = 0; + calc->hwregs[LCD_PORT_DELAY] = 5; + calc->hwregs[NO_EXEC_RAM_MASK] = 0x7C00; + calc->hwregs[NO_EXEC_RAM_LOWER] = 0x4000; + calc->hwregs[NO_EXEC_RAM_UPPER] = 0x8000; + + calc->hwregs[PROTECTSTATE] = 0; + + calc->flash.overridegroup = 1; + + tilem_z80_set_speed(calc, 6000); + + tilem_z80_set_timer(calc, TIMER_INT1, 1600, 9277, 1); + tilem_z80_set_timer(calc, TIMER_INT2A, 1300, 9277, 1); + tilem_z80_set_timer(calc, TIMER_INT2B, 1000, 9277, 1); +} + +void xz_stateloaded(TilemCalc* calc, int savtype TILEM_ATTR_UNUSED) +{ + tilem_calc_fix_certificate(calc, calc->mem + (0x7E * 0x4000L), + 0x69, 0x0c, 0x1e50); +} diff --git a/tool/tilem-src/emu/xz/xz_io.c b/tool/tilem-src/emu/xz/xz_io.c new file mode 100644 index 0000000..557e878 --- /dev/null +++ b/tool/tilem-src/emu/xz/xz_io.c @@ -0,0 +1,747 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2012 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include + +#include "xz.h" + +static void set_lcd_wait_timer(TilemCalc* calc) +{ + static const int delaytime[8] = { 48, 112, 176, 240, + 304, 368, 432, 496 }; + int i; + + switch (calc->hwregs[PORT20] & 3) { + case 0: + return; + case 1: + i = (calc->hwregs[PORT2F] & 3); + break; + case 2: + i = ((calc->hwregs[PORT2F] >> 2) & 7); + break; + default: + i = ((calc->hwregs[PORT2F] >> 5) & 7); + break; + } + + tilem_z80_set_timer(calc, TIMER_LCD_WAIT, delaytime[i], 0, 0); + calc->hwregs[LCD_WAIT] = 1; +} + +byte xz_z80_in(TilemCalc* calc, dword port) +{ + /* FIXME: measure actual levels */ + static const byte battlevel[4] = { 33, 39, 36, 43 }; + byte v; + unsigned int f; + time_t curtime; + + switch(port&0xff) { + case 0x00: + v = tilem_linkport_get_lines(calc); + v |= (calc->linkport.lines << 4); + return(v); + + case 0x01: + return(tilem_keypad_read_keys(calc)); + + case 0x02: + v = battlevel[calc->hwregs[PORT4] >> 6]; + return ((calc->battery >= v ? 0xe1 : 0xe0) + | (calc->hwregs[LCD_WAIT] ? 0 : 2) + | (calc->flash.unlock << 2)); + + case 0x03: + return(calc->hwregs[PORT3]); + + case 0x04: + v = (calc->keypad.onkeydown ? 0x00 : 0x08); + + if (calc->z80.interrupts & TILEM_INTERRUPT_ON_KEY) + v |= 0x01; + if (calc->z80.interrupts & TILEM_INTERRUPT_TIMER1) + v |= 0x02; + if (calc->z80.interrupts & TILEM_INTERRUPT_TIMER2) + v |= 0x04; + if (calc->z80.interrupts & TILEM_INTERRUPT_LINK_ACTIVE) + v |= 0x10; + + if (calc->usertimers[0].status & TILEM_USER_TIMER_FINISHED) + v |= 0x20; + if (calc->usertimers[1].status & TILEM_USER_TIMER_FINISHED) + v |= 0x40; + if (calc->usertimers[2].status & TILEM_USER_TIMER_FINISHED) + v |= 0x80; + + return(v); + + case 0x05: + return(calc->hwregs[PORT5] & 0x0f); + + case 0x06: + return(calc->hwregs[PORT6]); + + case 0x07: + return(calc->hwregs[PORT7]); + + case 0x08: + return(calc->hwregs[PORT8]); + + case 0x09: + f = tilem_linkport_get_assist_flags(calc); + + if (f & (TILEM_LINK_ASSIST_READ_BUSY + | TILEM_LINK_ASSIST_WRITE_BUSY)) + v = 0x00; + else + v = 0x20; + + if (calc->z80.interrupts & TILEM_INTERRUPT_LINK_READ) + v |= 0x01; + if (calc->z80.interrupts & TILEM_INTERRUPT_LINK_IDLE) + v |= 0x02; + if (calc->z80.interrupts & TILEM_INTERRUPT_LINK_ERROR) + v |= 0x04; + if (f & TILEM_LINK_ASSIST_READ_BUSY) + v |= 0x08; + if (f & TILEM_LINK_ASSIST_READ_BYTE) + v |= 0x10; + if (f & (TILEM_LINK_ASSIST_READ_ERROR + | TILEM_LINK_ASSIST_WRITE_ERROR)) + v |= 0x40; + if (f & TILEM_LINK_ASSIST_WRITE_BUSY) + v |= 0x80; + + calc->z80.interrupts &= ~TILEM_INTERRUPT_LINK_ERROR; + + return(v); + + case 0x0A: + v = calc->linkport.assistlastbyte; + tilem_linkport_read_byte(calc); + return(v); + + case 0x0E: + return(calc->hwregs[PORTE] & 3); + + case 0x0F: + return(calc->hwregs[PORTF] & 3); + + case 0x10: + case 0x12: + calc->z80.clock += calc->hwregs[LCD_PORT_DELAY]; + set_lcd_wait_timer(calc); + return(tilem_lcd_t6a04_status(calc)); + + case 0x11: + case 0x13: + calc->z80.clock += calc->hwregs[LCD_PORT_DELAY]; + set_lcd_wait_timer(calc); + return(tilem_lcd_t6a04_read(calc)); + + case 0x15: + return(0x45); /* ??? */ + + case 0x1C: + return(tilem_md5_assist_get_value(calc)); + + case 0x1D: + return(tilem_md5_assist_get_value(calc) >> 8); + + case 0x1E: + return(tilem_md5_assist_get_value(calc) >> 16); + + case 0x1F: + return(tilem_md5_assist_get_value(calc) >> 24); + + case 0x20: + return(calc->hwregs[PORT20] & 3); + + case 0x21: + return(calc->hwregs[PORT21] & 0x33); + + case 0x22: + return(calc->hwregs[PORT22]); + + case 0x23: + return(calc->hwregs[PORT23]); + + case 0x25: + return(calc->hwregs[PORT25]); + + case 0x26: + return(calc->hwregs[PORT26]); + + case 0x27: + return(calc->hwregs[PORT27]); + + case 0x28: + return(calc->hwregs[PORT28]); + + case 0x29: + return(calc->hwregs[PORT29]); + + case 0x2A: + return(calc->hwregs[PORT2A]); + + case 0x2B: + return(calc->hwregs[PORT2B]); + + case 0x2C: + return(calc->hwregs[PORT2C]); + + case 0x2D: + return(calc->hwregs[PORT2D] & 3); + + case 0x2E: + return(calc->hwregs[PORT2E]); + + case 0x2F: + return(calc->hwregs[PORT2F]); + + case 0x30: + return(calc->usertimers[0].frequency); + case 0x31: + return(calc->usertimers[0].status); + case 0x32: + return(tilem_user_timer_get_value(calc, 0)); + + case 0x33: + return(calc->usertimers[1].frequency); + case 0x34: + return(calc->usertimers[1].status); + case 0x35: + return(tilem_user_timer_get_value(calc, 1)); + + case 0x36: + return(calc->usertimers[2].frequency); + case 0x37: + return(calc->usertimers[2].status); + case 0x38: + return(tilem_user_timer_get_value(calc, 2)); + + case 0x39: + return(0xf0); /* ??? */ + + case 0x40: + return calc->hwregs[CLOCK_MODE]; + + case 0x41: + return calc->hwregs[CLOCK_INPUT]&0xff; + + case 0x42: + return (calc->hwregs[CLOCK_INPUT]>>8)&0xff; + + case 0x43: + return (calc->hwregs[CLOCK_INPUT]>>16)&0xff; + + case 0x44: + return (calc->hwregs[CLOCK_INPUT]>>24)&0xff; + + case 0x45: + case 0x46: + case 0x47: + case 0x48: + if (calc->hwregs[CLOCK_MODE] & 1) { + time(&curtime); + } + else { + curtime = 0; + } + curtime += calc->hwregs[CLOCK_DIFF]; + return (curtime >> ((port - 0x45) * 8)); + + case 0x4C: + return(0x22); + + case 0x4D: + /* USB port - not emulated, calculator should + recognize that the USB cable is + disconnected. + + Thanks go to Dan Englender for these + values. */ + + return(0xA5); + + case 0x55: + return(0x1F); + + case 0x56: + return(0x00); + + case 0x57: + return(0x50); + + case 0x0B: + case 0x0C: + case 0x0D: + case 0x14: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + return(0); + } + + tilem_warning(calc, "Input from port %x", port); + return(0x00); +} + + +static void setup_mapping(TilemCalc* calc) +{ + unsigned int pageA, pageB, pageC; + + if (calc->hwregs[PORT6] & 0x80) + pageA = (0x80 | (calc->hwregs[PORT6] & 7)); + else + pageA = (calc->hwregs[PORT6] & 0x7f); + + if (calc->hwregs[PORT7] & 0x80) + pageB = (0x80 | (calc->hwregs[PORT7] & 7)); + else + pageB = (calc->hwregs[PORT7] & 0x7f); + + pageC = (0x80 | (calc->hwregs[PORT5] & 7)); + + if (calc->hwregs[PORT4] & 1) { + calc->mempagemap[1] = (pageA & ~1); + calc->mempagemap[2] = (pageA | 1); + calc->mempagemap[3] = pageB; + } + else { + calc->mempagemap[1] = pageA; + calc->mempagemap[2] = pageB; + calc->mempagemap[3] = pageC; + } +} + +static void setup_clockdelays(TilemCalc* calc) +{ + byte lcdport = calc->hwregs[PORT29 + (calc->hwregs[PORT20] & 3)]; + byte memport = calc->hwregs[PORT2E]; + + if (!(lcdport & 1)) + memport &= ~0x07; + if (!(lcdport & 2)) + memport &= ~0x70; + + calc->hwregs[FLASH_EXEC_DELAY] = (memport & 1); + calc->hwregs[FLASH_READ_DELAY] = ((memport >> 1) & 1); + calc->hwregs[FLASH_WRITE_DELAY] = ((memport >> 2) & 1); + + calc->hwregs[RAM_EXEC_DELAY] = ((memport >> 4) & 1); + calc->hwregs[RAM_READ_DELAY] = ((memport >> 5) & 1); + calc->hwregs[RAM_WRITE_DELAY] = ((memport >> 6) & 1); + + calc->hwregs[LCD_PORT_DELAY] = (lcdport >> 2); +} + +void xz_z80_out(TilemCalc* calc, dword port, byte value) +{ + static const int tmrvalues[4] = { 1953, 4395, 6836, 9277 }; + int t, r; + unsigned int mode; + time_t curtime; + + switch(port&0xff) { + case 0x00: + tilem_linkport_set_lines(calc, value); + break; + + case 0x01: + tilem_keypad_set_group(calc, value); + break; + + case 0x03: + if (value & 0x01) { + calc->keypad.onkeyint = 1; + } + else { + calc->z80.interrupts &= ~TILEM_INTERRUPT_ON_KEY; + calc->keypad.onkeyint = 0; + } + + if (!(value & 0x02)) + calc->z80.interrupts &= ~TILEM_INTERRUPT_TIMER1; + + if (!(value & 0x04)) + calc->z80.interrupts &= ~TILEM_INTERRUPT_TIMER2; + + if (value & 0x06) { + calc->usertimers[0].status &= ~TILEM_USER_TIMER_NO_HALT_INT; + calc->usertimers[1].status &= ~TILEM_USER_TIMER_NO_HALT_INT; + calc->usertimers[2].status &= ~TILEM_USER_TIMER_NO_HALT_INT; + } + else { + calc->usertimers[0].status |= TILEM_USER_TIMER_NO_HALT_INT; + calc->usertimers[1].status |= TILEM_USER_TIMER_NO_HALT_INT; + calc->usertimers[2].status |= TILEM_USER_TIMER_NO_HALT_INT; + } + + mode = calc->linkport.mode; + if (value & 0x10) + mode |= TILEM_LINK_MODE_INT_ON_ACTIVE; + else + mode &= ~TILEM_LINK_MODE_INT_ON_ACTIVE; + + tilem_linkport_set_mode(calc, mode); + + calc->poweronhalt = ((value & 8) >> 3); + calc->hwregs[PORT3] = value; + break; + + + case 0x04: + calc->hwregs[PORT4] = value; + + t = tmrvalues[(value & 6) >> 1]; + tilem_z80_set_timer_period(calc, TIMER_INT1, t); + tilem_z80_set_timer_period(calc, TIMER_INT2A, t); + tilem_z80_set_timer_period(calc, TIMER_INT2B, t); + + setup_mapping(calc); + break; + + case 0x05: + calc->hwregs[PORT5] = value & 0x0f; + setup_mapping(calc); + break; + + case 0x06: + calc->hwregs[PORT6] = value; + setup_mapping(calc); + break; + + case 0x07: + calc->hwregs[PORT7] = value; + setup_mapping(calc); + break; + + case 0x08: + calc->hwregs[PORT8] = value; + + mode = calc->linkport.mode; + + if (value & 0x01) + mode |= TILEM_LINK_MODE_INT_ON_READ; + else + mode &= ~TILEM_LINK_MODE_INT_ON_READ; + + if (value & 0x02) + mode |= TILEM_LINK_MODE_INT_ON_IDLE; + else + mode &= ~TILEM_LINK_MODE_INT_ON_IDLE; + + if (value & 0x04) + mode |= TILEM_LINK_MODE_INT_ON_ERROR; + else + mode &= ~TILEM_LINK_MODE_INT_ON_ERROR; + + if (value & 0x80) + mode &= ~TILEM_LINK_MODE_ASSIST; + else + mode |= TILEM_LINK_MODE_ASSIST; + + tilem_linkport_set_mode(calc, mode); + break; + + case 0x09: + calc->hwregs[PORT9] = value; + break; + + case 0x0A: + calc->hwregs[PORTA] = value; + break; + + case 0x0B: + calc->hwregs[PORTB] = value; + break; + + case 0x0C: + calc->hwregs[PORTC] = value; + break; + + + case 0x0D: + if (!(calc->hwregs[PORT8] & 0x80)) + tilem_linkport_write_byte(calc, value); + break; + + case 0x0E: + calc->hwregs[PORTE] = value; + break; + + case 0x0F: + calc->hwregs[PORTF] = value; + break; + + case 0x10: + case 0x12: + calc->z80.clock += calc->hwregs[LCD_PORT_DELAY]; + set_lcd_wait_timer(calc); + tilem_lcd_t6a04_control(calc, value); + break; + + case 0x11: + case 0x13: + calc->z80.clock += calc->hwregs[LCD_PORT_DELAY]; + set_lcd_wait_timer(calc); + tilem_lcd_t6a04_write(calc, value); + break; + + case 0x14: + if (calc->hwregs[PROTECTSTATE] == 7) { + if (value & 1) + tilem_message(calc, "Flash unlocked"); + else + tilem_message(calc, "Flash locked"); + calc->flash.unlock = value&1; + } + else { + tilem_warning(calc, "Writing to protected port 14"); + } + break; + + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + r = (port & 0xff) - 0x18; + calc->md5assist.regs[r] >>= 8; + calc->md5assist.regs[r] |= (value << 24); + break; + + case 0x1E: + calc->md5assist.shift = value & 0x1f; + break; + + case 0x1F: + calc->md5assist.mode = value & 3; + break; + + case 0x20: + calc->hwregs[PORT20] = value; + + if (value & 3) { + tilem_z80_set_speed(calc, 15000); + } + else { + tilem_z80_set_speed(calc, 6000); + } + + setup_clockdelays(calc); + break; + + case 0x21: + if (calc->flash.unlock) { + calc->hwregs[PORT21] = value; + t = (value >> 4) & 3; + calc->hwregs[NO_EXEC_RAM_MASK] = (0x8000 << t) - 0x400; + calc->flash.overridegroup = value & 3; + } + else { + tilem_warning(calc, "Writing to protected port 21"); + } + break; + + case 0x22: + if (calc->flash.unlock) { + calc->hwregs[PORT22] = value; + } + else { + tilem_warning(calc, "Writing to protected port 22"); + } + break; + + case 0x23: + if (calc->flash.unlock) { + calc->hwregs[PORT23] = value; + } + else { + tilem_warning(calc, "Writing to protected port 23"); + } + break; + + case 0x25: + if (calc->flash.unlock) { + calc->hwregs[PORT25] = value; + calc->hwregs[NO_EXEC_RAM_LOWER] = value * 0x400; + } + else { + tilem_warning(calc, "Writing to protected port 25"); + } + break; + + case 0x26: + if (calc->flash.unlock) { + calc->hwregs[PORT26] = value; + calc->hwregs[NO_EXEC_RAM_UPPER] = value * 0x400; + } + else { + tilem_warning(calc, "Writing to protected port 26"); + } + break; + + case 0x27: + calc->hwregs[PORT27] = value; + break; + + case 0x28: + calc->hwregs[PORT28] = value; + break; + + case 0x29: + calc->hwregs[PORT29] = value; + setup_clockdelays(calc); + break; + + case 0x2A: + calc->hwregs[PORT2A] = value; + setup_clockdelays(calc); + break; + + case 0x2B: + calc->hwregs[PORT2B] = value; + setup_clockdelays(calc); + break; + + case 0x2C: + calc->hwregs[PORT2C] = value; + setup_clockdelays(calc); + break; + + case 0x2D: + calc->hwregs[PORT2D] = value; + break; + + case 0x2E: + calc->hwregs[PORT2E] = value; + setup_clockdelays(calc); + break; + + case 0x2F: + calc->hwregs[PORT2F] = value; + break; + + case 0x30: + tilem_user_timer_set_frequency(calc, 0, value); + break; + case 0x31: + tilem_user_timer_set_mode(calc, 0, value); + break; + case 0x32: + tilem_user_timer_start(calc, 0, value); + break; + + case 0x33: + tilem_user_timer_set_frequency(calc, 1, value); + break; + case 0x34: + tilem_user_timer_set_mode(calc, 1, value); + break; + case 0x35: + tilem_user_timer_start(calc, 1, value); + break; + + case 0x36: + tilem_user_timer_set_frequency(calc, 2, value); + break; + case 0x37: + tilem_user_timer_set_mode(calc, 2, value); + break; + case 0x38: + tilem_user_timer_start(calc, 2, value); + break; + + case 0x40: + time(&curtime); + + if ((calc->hwregs[CLOCK_MODE] & 1) != (value & 1)) { + if (value & 1) + calc->hwregs[CLOCK_DIFF] -= curtime; + else + calc->hwregs[CLOCK_DIFF] += curtime; + } + + if (!(calc->hwregs[CLOCK_MODE] & 2) && (value & 2)) { + calc->hwregs[CLOCK_DIFF] = calc->hwregs[CLOCK_INPUT]; + if (value & 1) + calc->hwregs[CLOCK_DIFF] -= curtime; + } + calc->hwregs[CLOCK_MODE] = value & 3; + break; + + case 0x41: + calc->hwregs[CLOCK_INPUT] &= 0xffffff00; + calc->hwregs[CLOCK_INPUT] |= value; + break; + + case 0x42: + calc->hwregs[CLOCK_INPUT] &= 0xffff00ff; + calc->hwregs[CLOCK_INPUT] |= (value << 8); + break; + + case 0x43: + calc->hwregs[CLOCK_INPUT] &= 0xff00ffff; + calc->hwregs[CLOCK_INPUT] |= (value << 16); + break; + + case 0x44: + calc->hwregs[CLOCK_INPUT] &= 0x00ffffff; + calc->hwregs[CLOCK_INPUT] |= (value << 24); + break; + } + + return; +} + +void xz_z80_ptimer(TilemCalc* calc, int id) +{ + switch (id) { + case TIMER_INT1: + if (calc->hwregs[PORT3] & 0x02) + calc->z80.interrupts |= TILEM_INTERRUPT_TIMER1; + break; + + case TIMER_INT2A: + case TIMER_INT2B: + if (calc->hwregs[PORT3] & 0x04) + calc->z80.interrupts |= TILEM_INTERRUPT_TIMER2; + break; + + case TIMER_LCD_WAIT: + calc->hwregs[LCD_WAIT] = 0; + break; + } +} diff --git a/tool/tilem-src/emu/xz/xz_memory.c b/tool/tilem-src/emu/xz/xz_memory.c new file mode 100644 index 0000000..a8f083c --- /dev/null +++ b/tool/tilem-src/emu/xz/xz_memory.c @@ -0,0 +1,207 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2011 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "xz.h" + +void xz_z80_wrmem(TilemCalc* calc, dword A, byte v) +{ + unsigned long pa; + byte page; + + page = calc->mempagemap[A>>14]; + + if (A & 0x8000) { + if (A > (0xFFFF - 64 * calc->hwregs[PORT27])) + page = 0x80; + else if (A < (0x8000 + 64 * calc->hwregs[PORT28])) + page = 0x81; + } + + pa = (A & 0x3FFF) + 0x4000L*page; + + if (pa < 0x200000) { + calc->z80.clock += calc->hwregs[FLASH_WRITE_DELAY]; + tilem_flash_write_byte(calc, pa, v); + } + else if (pa < 0x220000) { + calc->z80.clock += calc->hwregs[RAM_WRITE_DELAY]; + *(calc->mem+pa) = v; + } +} + +static inline byte readbyte(TilemCalc* calc, dword pa) +{ + static const byte protectbytes[6] = {0x00,0x00,0xed,0x56,0xf3,0xd3}; + int state = calc->hwregs[PROTECTSTATE]; + byte value; + + if (pa < 0x200000 && (calc->flash.state || calc->flash.busy)) + value = tilem_flash_read_byte(calc, pa); + else + value = *(calc->mem + pa); + + if (pa < 0x1B0000 || pa >= 0x200000 + || (pa >= 0x1C0000 && pa < 0x1F0000)) + calc->hwregs[PROTECTSTATE] = 0; + else if (state == 6) + calc->hwregs[PROTECTSTATE] = 7; + else if (state < 6 && value == protectbytes[state]) + calc->hwregs[PROTECTSTATE] = state + 1; + else + calc->hwregs[PROTECTSTATE] = 0; + + return (value); +} + +byte xz_z80_rdmem(TilemCalc* calc, dword A) +{ + byte page; + unsigned long pa; + byte value; + + page = calc->mempagemap[A>>14]; + + if (A & 0x8000) { + if (A > (0xFFFF - 64 * calc->hwregs[PORT27])) + page = 0x80; + else if (A < (0x8000 + 64 * calc->hwregs[PORT28])) + page = 0x81; + } + + if (TILEM_UNLIKELY(page == 0x7E && !calc->flash.unlock)) { + tilem_warning(calc, "Reading from read-protected sector"); + return (0xff); + } + + pa = (A & 0x3FFF) + 0x4000L*page; + + if (pa < 0x200000) + calc->z80.clock += calc->hwregs[FLASH_READ_DELAY]; + else + calc->z80.clock += calc->hwregs[RAM_READ_DELAY]; + + value = readbyte(calc, pa); + return (value); +} + +byte xz_z80_rdmem_m1(TilemCalc* calc, dword A) +{ + byte page; + unsigned long pa, m; + byte value; + + page = calc->mempagemap[A>>14]; + + if (A & 0x8000) { + if (A > (0xFFFF - 64 * calc->hwregs[PORT27])) + page = 0x80; + else if (A < (0x8000 + 64 * calc->hwregs[PORT28])) + page = 0x81; + } + + if (TILEM_UNLIKELY(page == 0x7E && !calc->flash.unlock)) { + tilem_warning(calc, "Reading from read-protected sector"); + return (0xff); + } + + pa = (A & 0x3FFF) + 0x4000L*page; + + if (pa < 0x200000) { + calc->z80.clock += calc->hwregs[FLASH_EXEC_DELAY]; + + if (TILEM_UNLIKELY(page >= calc->hwregs[PORT22] + && page <= calc->hwregs[PORT23])) { + tilem_warning(calc, "Executing in restricted Flash area"); + tilem_z80_exception(calc, TILEM_EXC_FLASH_EXEC); + } + } + else { + calc->z80.clock += calc->hwregs[RAM_EXEC_DELAY]; + + m = pa & calc->hwregs[NO_EXEC_RAM_MASK]; + if (TILEM_UNLIKELY(m < calc->hwregs[NO_EXEC_RAM_LOWER] + || m > calc->hwregs[NO_EXEC_RAM_UPPER])) { + tilem_warning(calc, "Executing in restricted RAM area"); + tilem_z80_exception(calc, TILEM_EXC_RAM_EXEC); + } + } + + value = readbyte(calc, pa); + + if (TILEM_UNLIKELY(value == 0xff && A == 0x0038)) { + tilem_warning(calc, "No OS installed"); + tilem_z80_exception(calc, TILEM_EXC_FLASH_EXEC); + } + + return (value); +} + +dword xz_mem_ltop(TilemCalc* calc, dword A) +{ + byte page = calc->mempagemap[A >> 14]; + + if (A & 0x8000) { + if (A > (0xFFFF - 64 * calc->hwregs[PORT27])) + page = 0x80; + else if (A < (0x8000 + 64 * calc->hwregs[PORT28])) + page = 0x81; + } + + return ((page << 14) | (A & 0x3fff)); +} + +dword xz_mem_ptol(TilemCalc* calc, dword A) +{ + byte page = A >> 14; + + if (!page) + return (A & 0x3fff); + + if (page == calc->mempagemap[1]) + return (0x4000 | (A & 0x3fff)); + + if ((A & 0x3fff) < 64 * calc->hwregs[PORT28]) { + if (page == 0x81) + return (0x8000 | (A & 0x3fff)); + } + else { + if (page == calc->mempagemap[2]) + return (0x8000 | (A & 0x3fff)); + } + + if ((A & 0x3fff) >= (0x4000 - 64 * calc->hwregs[PORT27])) { + if (page == 0x80) + return (0xC000 | (A & 0x3fff)); + } + else { + if (page == calc->mempagemap[3]) + return (0xC000 | (A & 0x3fff)); + } + + return (0xffffffff); +} diff --git a/tool/tilem-src/emu/xz/xz_subcore.c b/tool/tilem-src/emu/xz/xz_subcore.c new file mode 100644 index 0000000..3692447 --- /dev/null +++ b/tool/tilem-src/emu/xz/xz_subcore.c @@ -0,0 +1,73 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2001 Solignac Julien + * Copyright (C) 2004-2012 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "xz.h" + +static const TilemFlashSector flashsectors[] = { + {0x000000, 0x10000, 0}, {0x010000, 0x10000, 0}, + {0x020000, 0x10000, 0}, {0x030000, 0x10000, 0}, + {0x040000, 0x10000, 0}, {0x050000, 0x10000, 0}, + {0x060000, 0x10000, 0}, {0x070000, 0x10000, 0}, + {0x080000, 0x10000, 0}, {0x090000, 0x10000, 0}, + {0x0A0000, 0x10000, 0}, {0x0B0000, 0x10000, 0}, + {0x0C0000, 0x10000, 0}, {0x0D0000, 0x10000, 0}, + {0x0E0000, 0x10000, 0}, {0x0F0000, 0x10000, 0}, + {0x100000, 0x10000, 0}, {0x110000, 0x10000, 0}, + {0x120000, 0x10000, 0}, {0x130000, 0x10000, 0}, + {0x140000, 0x10000, 0}, {0x150000, 0x10000, 0}, + {0x160000, 0x10000, 0}, {0x170000, 0x10000, 0}, + {0x180000, 0x10000, 0}, {0x190000, 0x10000, 0}, + {0x1A0000, 0x10000, 0}, {0x1B0000, 0x10000, 2}, + {0x1C0000, 0x10000, 0}, {0x1D0000, 0x10000, 0}, + {0x1E0000, 0x10000, 0}, {0x1F0000, 0x08000, 0}, + {0x1F8000, 0x02000, 0}, {0x1FA000, 0x02000, 0}, + {0x1FC000, 0x04000, 2}}; + +#define NUM_FLASH_SECTORS (sizeof(flashsectors) / sizeof(TilemFlashSector)) + +static const char* hwregnames[NUM_HW_REGS] = HW_REG_NAMES; + +static const char* hwtimernames[NUM_HW_TIMERS] = HW_TIMER_NAMES; + +extern const char* xp_keynames[]; + +TilemHardware hardware_ti84pse = { + 'z', "ti84pse", "TI-84 Plus Silver Edition", + (TILEM_CALC_HAS_LINK | TILEM_CALC_HAS_LINK_ASSIST + | TILEM_CALC_HAS_T6A04 | TILEM_CALC_HAS_FLASH + | TILEM_CALC_HAS_MD5_ASSIST), + 96, 64, 128 * 0x4000, 8 * 0x4000, 16 * 64, 0x80, + NUM_FLASH_SECTORS, flashsectors, 3, + NUM_HW_REGS, hwregnames, + NUM_HW_TIMERS, hwtimernames, + xp_keynames, + xz_reset, xz_stateloaded, + xz_z80_in, xz_z80_out, + xz_z80_wrmem, xz_z80_rdmem, xz_z80_rdmem_m1, NULL, + xz_z80_ptimer, tilem_lcd_t6a04_get_data, + xz_mem_ltop, xz_mem_ptol }; diff --git a/tool/tilem-src/emu/z80.c b/tool/tilem-src/emu/z80.c new file mode 100644 index 0000000..51399ba --- /dev/null +++ b/tool/tilem-src/emu/z80.c @@ -0,0 +1,990 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2009-2011 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include "tilem.h" +#include "z80.h" + +/* Timer manipulation */ + +/* +static void dumptimers(TilemZ80* z80) +{ + int tmr; + int t; + + printf("*** RT:"); + for (tmr = z80->timer_rt; tmr; tmr = z80->timers[tmr].next) { + t = z80->timers[tmr].count - z80->clock; + printf(" %d:%d", tmr, t); + } + printf("\n*** CPU:"); + for (tmr = z80->timer_cpu; tmr; tmr = z80->timers[tmr].next) { + t = z80->timers[tmr].count - z80->clock; + printf(" %d:%d", tmr, t); + } + printf("\n*** Free:"); + for (tmr = z80->timer_free; tmr; tmr = z80->timers[tmr].next) { + printf(" %d", tmr); + } + printf("\n"); +} +*/ + +static inline void timer_free(TilemZ80* z80, int tmr) +{ + z80->timers[tmr].callback = NULL; + z80->timers[tmr].callbackdata = NULL; + z80->timers[tmr].next = z80->timer_free; + z80->timers[tmr].prev = 0; + z80->timer_free = tmr; +} + +static inline int timer_alloc(TilemZ80* z80) +{ + int tmr, i; + + if (z80->timer_free) { + tmr = z80->timer_free; + z80->timer_free = z80->timers[tmr].next; + z80->timers[tmr].next = 0; + return tmr; + } + + i = z80->ntimers; + z80->ntimers = i * 2 + 1; + z80->timers = tilem_renew(TilemZ80Timer, z80->timers, z80->ntimers); + while (i < z80->ntimers) { + timer_free(z80, i); + i++; + } + + tmr = z80->timer_free; + z80->timer_free = z80->timers[tmr].next; + z80->timers[tmr].next = 0; + return tmr; +} + +static inline int timer_earlier(TilemZ80* z80, int tmr1, int tmr2) +{ + dword count1, count2; + + count1 = z80->timers[tmr1].count + 10000 - z80->clock; + count2 = z80->timers[tmr2].count + 10000 - z80->clock; + + return (count1 < count2); +} + +static inline void timer_insert(TilemZ80* z80, int* list, int tmr) +{ + int prev, next; + + if (!*list || timer_earlier(z80, tmr, *list)) { + z80->timers[tmr].prev = 0; + z80->timers[tmr].next = *list; + z80->timers[*list].prev = tmr; + *list = tmr; + return; + } + + prev = *list; + next = z80->timers[prev].next; + + while (next && timer_earlier(z80, next, tmr)) { + prev = next; + next = z80->timers[prev].next; + } + + z80->timers[prev].next = tmr; + z80->timers[next].prev = tmr; + z80->timers[tmr].prev = prev; + z80->timers[tmr].next = next; +} + +static inline void timer_set(TilemZ80* z80, int tmr, dword count, + dword period, int rt, dword extra) +{ + dword clocks; + qword kclocks; + + if (!count) { + /* leave timer disabled */ + z80->timers[tmr].prev = 0; + z80->timers[tmr].next = 0; + } + else if (rt) { + kclocks = z80->clockspeed; + kclocks *= count; + clocks = (kclocks + 500) / 1000 - extra; + z80->timers[tmr].count = z80->clock + clocks; + z80->timers[tmr].period = period; + timer_insert(z80, &z80->timer_rt, tmr); + } + else { + clocks = count - extra; + z80->timers[tmr].count = z80->clock + clocks; + z80->timers[tmr].period = period; + timer_insert(z80, &z80->timer_cpu, tmr); + } +} + +static inline void timer_unset(TilemZ80* z80, int tmr) +{ + int prev, next; + + if (tmr == z80->timer_cpu) + z80->timer_cpu = z80->timers[tmr].next; + if (tmr == z80->timer_rt) + z80->timer_rt = z80->timers[tmr].next; + + prev = z80->timers[tmr].prev; + next = z80->timers[tmr].next; + z80->timers[prev].next = next; + z80->timers[next].prev = prev; + z80->timers[tmr].prev = 0; + z80->timers[tmr].next = 0; +} + + +/* Breakpoint manipulation */ + +static inline void bp_free(TilemZ80* z80, int bp) +{ + z80->breakpoints[bp].type = 0; + z80->breakpoints[bp].testfunc = NULL; + z80->breakpoints[bp].testdata = NULL; + z80->breakpoints[bp].next = z80->breakpoint_free; + z80->breakpoints[bp].prev = 0; + z80->breakpoint_free = bp; +} + +static inline int bp_alloc(TilemZ80* z80) +{ + int bp, i; + + if (z80->breakpoint_free) { + bp = z80->breakpoint_free; + z80->breakpoint_free = z80->breakpoints[bp].next; + return bp; + } + + i = z80->nbreakpoints; + z80->nbreakpoints = i * 2 + 2; + z80->breakpoints = tilem_renew(TilemZ80Breakpoint, z80->breakpoints, + z80->nbreakpoints); + while (i < z80->nbreakpoints) { + bp_free(z80, i); + i++; + } + + bp = z80->breakpoint_free; + z80->breakpoint_free = z80->breakpoints[bp].next; + return bp; +} + +static int* bp_head(TilemCalc *calc, int type) +{ + if (type & TILEM_BREAK_DISABLED) + return &calc->z80.breakpoint_disabled; + + switch (type & TILEM_BREAK_TYPE_MASK) { + case TILEM_BREAK_MEM_READ: + return (type & TILEM_BREAK_PHYSICAL + ? &calc->z80.breakpoint_mpr + : &calc->z80.breakpoint_mr); + + case TILEM_BREAK_MEM_EXEC: + return (type & TILEM_BREAK_PHYSICAL + ? &calc->z80.breakpoint_mpx + : &calc->z80.breakpoint_mx); + + case TILEM_BREAK_MEM_WRITE: + return (type & TILEM_BREAK_PHYSICAL + ? &calc->z80.breakpoint_mpw + : &calc->z80.breakpoint_mw); + + case TILEM_BREAK_PORT_READ: + return &calc->z80.breakpoint_pr; + + case TILEM_BREAK_PORT_WRITE: + return &calc->z80.breakpoint_pw; + + case TILEM_BREAK_EXECUTE: + return &calc->z80.breakpoint_op; + + default: + tilem_internal(calc, "invalid bp type"); + return 0; + } +} + +static int bp_add(TilemCalc *calc, int bp, int type) +{ + int *head = bp_head(calc, type); + + if (!head) { + bp_free(&calc->z80, bp); + return 0; + } + + calc->z80.breakpoints[bp].next = *head; + calc->z80.breakpoints[*head].prev = *head ? bp : 0; + *head = bp; + + return bp; +} + +static void bp_rem(TilemCalc *calc, int bp, int type) +{ + int prev, next; + int *head = bp_head(calc, type); + + prev = calc->z80.breakpoints[bp].prev; + next = calc->z80.breakpoints[bp].next; + + if (bp == *head) + *head = next; + + calc->z80.breakpoints[prev].next = prev ? next : 0; + calc->z80.breakpoints[next].prev = next ? prev : 0; +} + +static void invoke_ptimer(TilemCalc* calc, void* data) +{ + (*calc->hw.z80_ptimer)(calc, TILEM_PTR_TO_DWORD(data)); +} + +/* Z80 API */ + +void tilem_z80_reset(TilemCalc* calc) +{ + int i; + + AF = BC = DE = HL = AF2 = BC2 = DE2 = HL2 = 0xffff; + IX = IY = IR = SP = WZ = WZ2 = 0xffff; + PC = 0; + Rh = 0x80; + IFF1 = IFF2 = IM = 0; + calc->z80.interrupts = 0; + calc->z80.halted = 0; + + /* Set up hardware timers */ + if (!calc->z80.ntimers) { + calc->z80.ntimers = (calc->hw.nhwtimers + + TILEM_NUM_SYS_TIMERS + 1); + tilem_free(calc->z80.timers); + calc->z80.timers = tilem_new(TilemZ80Timer, calc->z80.ntimers); + + for (i = 1; i < calc->z80.ntimers; i++) { + calc->z80.timers[i].next = 0; + calc->z80.timers[i].prev = 0; + calc->z80.timers[i].count = 0; + calc->z80.timers[i].period = 0; + calc->z80.timers[i].callback = &invoke_ptimer; + calc->z80.timers[i].callbackdata = TILEM_DWORD_TO_PTR(i); + } + + calc->z80.timers[TILEM_TIMER_LCD_DELAY].callback + = &tilem_lcd_delay_timer; + calc->z80.timers[TILEM_TIMER_FLASH_DELAY].callback + = tilem_flash_delay_timer; + calc->z80.timers[TILEM_TIMER_LINK_ASSIST].callback + = tilem_linkport_assist_timer; + + for (i = 0; i < TILEM_MAX_USER_TIMERS; i++) { + calc->z80.timers[TILEM_TIMER_USER1 + i].callback + = tilem_user_timer_expired; + calc->z80.timers[TILEM_TIMER_USER1 + i].callbackdata + = TILEM_DWORD_TO_PTR(i); + } + } +} + +void tilem_z80_stop(TilemCalc* calc, dword reason) +{ + if (!(reason & calc->z80.stop_mask)) { + calc->z80.stop_reason |= reason; + calc->z80.stopping = 1; + } +} + +void tilem_z80_exception(TilemCalc* calc, unsigned type) +{ + calc->z80.exception |= type; +} + +void tilem_z80_set_speed(TilemCalc* calc, int speed) +{ + int tmr; + qword t; + int oldspeed = calc->z80.clockspeed; + + if (oldspeed == speed) + return; + + for (tmr = calc->z80.timer_rt; tmr; tmr = calc->z80.timers[tmr].next) { + if ((calc->z80.clock - calc->z80.timers[tmr].count) < 10000) + continue; + + t = calc->z80.timers[tmr].count - calc->z80.clock; + t = (t * speed + oldspeed / 2) / oldspeed; + calc->z80.timers[tmr].count = calc->z80.clock + t; + } + + calc->z80.clockspeed = speed; +} + +int tilem_z80_add_timer(TilemCalc* calc, dword count, dword period, + int rt, TilemZ80TimerFunc func, void* data) +{ + int id; + + id = timer_alloc(&calc->z80); + calc->z80.timers[id].callback = func; + calc->z80.timers[id].callbackdata = data; + timer_set(&calc->z80, id, count, period, rt, 0); + return id; +} + +void tilem_z80_set_timer(TilemCalc* calc, int id, dword count, + dword period, int rt) +{ + if (id < 1 || id > calc->z80.ntimers + || !calc->z80.timers[id].callback) { + tilem_internal(calc, "setting invalid timer %d", id); + return; + } + timer_unset(&calc->z80, id); + timer_set(&calc->z80, id, count, period, rt, 0); +} + +void tilem_z80_set_timer_period(TilemCalc* calc, int id, dword period) +{ + if (id < 1 || id > calc->z80.ntimers + || !calc->z80.timers[id].callback) { + tilem_internal(calc, "setting invalid timer %d", id); + return; + } + + calc->z80.timers[id].period = period; +} + +void tilem_z80_remove_timer(TilemCalc* calc, int id) +{ + if (id <= calc->hw.nhwtimers + TILEM_NUM_SYS_TIMERS + || id > calc->z80.ntimers || !calc->z80.timers[id].callback) { + tilem_internal(calc, "removing invalid timer %d", id); + return; + } + timer_unset(&calc->z80, id); + timer_free(&calc->z80, id); +} + +int tilem_z80_timer_running(TilemCalc* calc, int id) +{ + if (id < 1 || id > calc->z80.ntimers + || !calc->z80.timers[id].callback) { + tilem_internal(calc, "querying invalid timer %d", id); + return 0; + } + + if (id == calc->z80.timer_rt || id == calc->z80.timer_cpu) + return 1; + if (calc->z80.timers[id].prev) + return 1; + return 0; +} + +int tilem_z80_get_timer_clocks(TilemCalc* calc, int id) +{ + if (id < 1 || id > calc->z80.ntimers + || !calc->z80.timers[id].callback) { + tilem_internal(calc, "querying invalid timer %d", id); + return 0; + } + return (calc->z80.timers[id].count - calc->z80.clock); +} + +int tilem_z80_get_timer_microseconds(TilemCalc* calc, int id) +{ + int n = tilem_z80_get_timer_clocks(calc, id); + + if (n < 0) { + n = ((((qword) -n * 1000) + (calc->z80.clockspeed / 2)) + / calc->z80.clockspeed); + return -n; + } + else { + n = ((((qword) n * 1000) + (calc->z80.clockspeed / 2)) + / calc->z80.clockspeed); + return n; + } +} + +int tilem_z80_add_breakpoint(TilemCalc* calc, int type, + dword start, dword end, dword mask, + TilemZ80BreakpointFunc func, + void* data) +{ + int bp; + + bp = bp_alloc(&calc->z80); + + calc->z80.breakpoints[bp].type = type; + calc->z80.breakpoints[bp].start = start; + calc->z80.breakpoints[bp].end = end; + calc->z80.breakpoints[bp].mask = mask; + calc->z80.breakpoints[bp].testfunc = func; + calc->z80.breakpoints[bp].testdata = data; + calc->z80.breakpoints[bp].prev = 0; + + return bp_add(calc, bp, type); +} + +void tilem_z80_remove_breakpoint(TilemCalc* calc, int id) +{ + if (id < 1 || id > calc->z80.nbreakpoints + || !calc->z80.breakpoints[id].type) { + tilem_internal(calc, + "attempt to remove invalid breakpoint %d", id); + return; + } + + bp_rem(calc, id, calc->z80.breakpoints[id].type); + + bp_free(&calc->z80, id); +} + +void tilem_z80_enable_breakpoint(TilemCalc* calc, int id) +{ + int type = tilem_z80_get_breakpoint_type(calc, id); + tilem_z80_set_breakpoint_type(calc, id, type & ~TILEM_BREAK_DISABLED); +} + +void tilem_z80_disable_breakpoint(TilemCalc* calc, int id) +{ + int type = tilem_z80_get_breakpoint_type(calc, id); + tilem_z80_set_breakpoint_type(calc, id, type | TILEM_BREAK_DISABLED); +} + +int tilem_z80_breakpoint_enabled(TilemCalc* calc, int id) +{ + int type = tilem_z80_get_breakpoint_type(calc, id); + return !(type & TILEM_BREAK_DISABLED); +} + +int tilem_z80_get_breakpoint_type(TilemCalc* calc, int id) +{ + if (id < 1 || id > calc->z80.nbreakpoints + || !calc->z80.breakpoints[id].type) { + tilem_internal(calc, + "attempt to access invalid breakpoint %d", id); + return -1; + } + + return calc->z80.breakpoints[id].type; +} + +dword tilem_z80_get_breakpoint_address_start(TilemCalc* calc, int id) +{ + if (id < 1 || id > calc->z80.nbreakpoints + || !calc->z80.breakpoints[id].type) { + tilem_internal(calc, + "attempt to access invalid breakpoint %d", id); + return -1; + } + + return calc->z80.breakpoints[id].start; +} + +dword tilem_z80_get_breakpoint_address_end(TilemCalc* calc, int id) +{ + if (id < 1 || id > calc->z80.nbreakpoints + || !calc->z80.breakpoints[id].type) { + tilem_internal(calc, + "attempt to access invalid breakpoint %d", id); + return -1; + } + + return calc->z80.breakpoints[id].end; +} + +dword tilem_z80_get_breakpoint_address_mask(TilemCalc* calc, int id) +{ + if (id < 1 || id > calc->z80.nbreakpoints + || !calc->z80.breakpoints[id].type) { + tilem_internal(calc, + "attempt to access invalid breakpoint %d", id); + return -1; + } + + return calc->z80.breakpoints[id].mask; +} + +TilemZ80BreakpointFunc tilem_z80_get_breakpoint_callback(TilemCalc* calc, int id) +{ + if (id < 1 || id > calc->z80.nbreakpoints + || !calc->z80.breakpoints[id].type) { + tilem_internal(calc, + "attempt to access invalid breakpoint %d", id); + return 0; + } + + return calc->z80.breakpoints[id].testfunc; +} + +void* tilem_z80_get_breakpoint_data(TilemCalc* calc, int id) +{ + if (id < 1 || id > calc->z80.nbreakpoints + || !calc->z80.breakpoints[id].type) { + tilem_internal(calc, + "attempt to access invalid breakpoint %d", id); + return 0; + } + + return calc->z80.breakpoints[id].testdata; +} + +void tilem_z80_set_breakpoint_type(TilemCalc* calc, int id, int type) +{ + if (id < 1 || id > calc->z80.nbreakpoints + || !calc->z80.breakpoints[id].type) { + tilem_internal(calc, + "attempt to modify invalid breakpoint %d", id); + return; + } + + if (type == calc->z80.breakpoints[id].type) + return; + + bp_rem(calc, id, calc->z80.breakpoints[id].type); + + calc->z80.breakpoints[id].type = type; + + bp_add(calc, id, type); +} + +void tilem_z80_set_breakpoint_address_start(TilemCalc* calc, int id, dword start) +{ + if (id < 1 || id > calc->z80.nbreakpoints + || !calc->z80.breakpoints[id].type) { + tilem_internal(calc, + "attempt to modify invalid breakpoint %d", id); + return; + } + + calc->z80.breakpoints[id].start = start; +} + +void tilem_z80_set_breakpoint_address_end(TilemCalc* calc, int id, dword end) +{ + if (id < 1 || id > calc->z80.nbreakpoints + || !calc->z80.breakpoints[id].type) { + tilem_internal(calc, + "attempt to modify invalid breakpoint %d", id); + return; + } + + calc->z80.breakpoints[id].end = end; +} + +void tilem_z80_set_breakpoint_address_mask(TilemCalc* calc, int id, dword mask) +{ + if (id < 1 || id > calc->z80.nbreakpoints + || !calc->z80.breakpoints[id].type) { + tilem_internal(calc, + "attempt to modify invalid breakpoint %d", id); + return; + } + + calc->z80.breakpoints[id].mask = mask; +} + +void tilem_z80_set_breakpoint_callback(TilemCalc* calc, int id, + TilemZ80BreakpointFunc func) +{ + if (id < 1 || id > calc->z80.nbreakpoints + || !calc->z80.breakpoints[id].type) { + tilem_internal(calc, + "attempt to modify invalid breakpoint %d", id); + return; + } + + calc->z80.breakpoints[id].testfunc = func; +} + +void tilem_z80_set_breakpoint_data(TilemCalc* calc, int id, void* data) +{ + if (id < 1 || id > calc->z80.nbreakpoints + || !calc->z80.breakpoints[id].type) { + tilem_internal(calc, + "attempt to modify invalid breakpoint %d", id); + return; + } + + calc->z80.breakpoints[id].testdata = data; +} + + +static inline void check_timers(TilemCalc* calc) +{ + int tmr; + dword t; + TilemZ80TimerFunc callback; + void* callbackdata; + + while (calc->z80.timer_cpu) { + tmr = calc->z80.timer_cpu; + t = calc->z80.clock - calc->z80.timers[tmr].count; + if (t >= 10000) + break; + + callback = calc->z80.timers[tmr].callback; + callbackdata = calc->z80.timers[tmr].callbackdata; + + timer_unset(&calc->z80, tmr); + timer_set(&calc->z80, tmr, calc->z80.timers[tmr].period, + calc->z80.timers[tmr].period, 0, t); + + (*callback)(calc, callbackdata); + } + + while (calc->z80.timer_rt) { + tmr = calc->z80.timer_rt; + t = calc->z80.clock - calc->z80.timers[tmr].count; + if (t >= 10000) + break; + + callback = calc->z80.timers[tmr].callback; + callbackdata = calc->z80.timers[tmr].callbackdata; + + timer_unset(&calc->z80, tmr); + timer_set(&calc->z80, tmr, calc->z80.timers[tmr].period, + calc->z80.timers[tmr].period, 1, t); + + (*callback)(calc, callbackdata); + } +} + +static inline void check_breakpoints(TilemCalc* calc, int list, dword addr) +{ + dword masked; + int bp; + TilemZ80BreakpointFunc testfunc; + void* testdata; + + for (bp = list; bp; bp = calc->z80.breakpoints[bp].next) { + masked = addr & calc->z80.breakpoints[bp].mask; + if (masked < calc->z80.breakpoints[bp].start + || masked > calc->z80.breakpoints[bp].end) + continue; + + testfunc = calc->z80.breakpoints[bp].testfunc; + testdata = calc->z80.breakpoints[bp].testdata; + + if (testfunc && !(*testfunc)(calc, addr, testdata)) + continue; + + calc->z80.stop_breakpoint = bp; + tilem_z80_stop(calc, TILEM_STOP_BREAKPOINT); + } +} + +static inline void check_mem_breakpoints(TilemCalc* calc, int list_l, + int list_p, dword addr) +{ + check_breakpoints(calc, list_l, addr); + + if (list_p) { + addr = (*calc->hw.mem_ltop)(calc, addr); + check_breakpoints(calc, list_p, addr); + } +} + +static inline byte z80_readb_m1(TilemCalc* calc, dword addr) +{ + byte b; + addr &= 0xffff; + b = (*calc->hw.z80_rdmem_m1)(calc, addr); + check_mem_breakpoints(calc, calc->z80.breakpoint_mx, + calc->z80.breakpoint_mpx, addr); + Rl++; + return b; +} + +static inline byte z80_readb(TilemCalc* calc, dword addr) +{ + byte b; + addr &= 0xffff; + b = (*calc->hw.z80_rdmem)(calc, addr); + check_mem_breakpoints(calc, calc->z80.breakpoint_mr, + calc->z80.breakpoint_mpr, addr); + return b; +} + +static inline dword z80_readw(TilemCalc* calc, dword addr) +{ + dword v; + addr &= 0xffff; + v = (*calc->hw.z80_rdmem)(calc, addr); + check_mem_breakpoints(calc, calc->z80.breakpoint_mr, + calc->z80.breakpoint_mpr, addr); + addr = (addr + 1) & 0xffff; + v |= (*calc->hw.z80_rdmem)(calc, addr) << 8; + check_mem_breakpoints(calc, calc->z80.breakpoint_mr, + calc->z80.breakpoint_mpr, addr); + return v; +} + +static inline byte z80_input(TilemCalc* calc, dword addr) +{ + byte b; + addr &= 0xffff; + check_timers(calc); + b = (*calc->hw.z80_in)(calc, addr); + check_breakpoints(calc, calc->z80.breakpoint_pr, addr); + return b; +} + +static inline void z80_writeb(TilemCalc* calc, dword addr, byte value) +{ + addr &= 0xffff; + (*calc->hw.z80_wrmem)(calc, addr, value); + check_mem_breakpoints(calc, calc->z80.breakpoint_mw, + calc->z80.breakpoint_mpw, addr); + calc->z80.lastwrite = calc->z80.clock; +} + +static inline void z80_writew(TilemCalc* calc, dword addr, word value) +{ + addr &= 0xffff; + (*calc->hw.z80_wrmem)(calc, addr, value); + check_mem_breakpoints(calc, calc->z80.breakpoint_mw, + calc->z80.breakpoint_mpw, addr); + addr = (addr + 1) & 0xffff; + value >>= 8; + (*calc->hw.z80_wrmem)(calc, addr, value); + check_mem_breakpoints(calc, calc->z80.breakpoint_mw, + calc->z80.breakpoint_mpw, addr); + calc->z80.lastwrite = calc->z80.clock; +} + +static inline void z80_output(TilemCalc* calc, dword addr, byte value) +{ + addr &= 0xffff; + check_timers(calc); + (*calc->hw.z80_out)(calc, addr, value); + check_breakpoints(calc, calc->z80.breakpoint_pw, addr); +} + +#define readb_m1(aaa) z80_readb_m1(calc, aaa) +#define readb(aaa) z80_readb(calc, aaa) +#define readw(aaa) z80_readw(calc, aaa) +#define input(aaa) z80_input(calc, aaa) +#define writeb(aaa, vvv) z80_writeb(calc, aaa, vvv) +#define writew(aaa, vvv) z80_writew(calc, aaa, vvv) +#define output(aaa, vvv) z80_output(calc, aaa, vvv) +#define delay(nnn) calc->z80.clock += (nnn) + +#include "z80cmds.h" + +static dword z80_execute_opcode(TilemCalc* calc, byte op) +{ + byte tmp1; + word tmp2; + int offs; +#ifdef DISABLE_Z80_WZ_REGISTER + TilemZ80Reg temp_wz, temp_wz2; +#endif + + opcode_main: +#include "z80main.h" + return op; + + opcode_cb: +#include "z80cb.h" + return op | 0xcb00; + + opcode_ed: +#include "z80ed.h" + return op | 0xed00; + +#define PREFIX_DD + opcode_dd: +#include "z80ddfd.h" + return op | 0xdd00; + opcode_ddcb: +#include "z80cb.h" + return op | 0xddcb0000; +#undef PREFIX_DD + +#define PREFIX_FD + opcode_fd: +#include "z80ddfd.h" + return op | 0xfd00; + opcode_fdcb: +#include "z80cb.h" + return op | 0xfdcb0000; +#undef PREFIX_FD +} + +static void z80_execute(TilemCalc* calc) +{ + TilemZ80* z80 = &calc->z80; + byte busbyte; + dword op; + dword t1, t2; + + z80->stopping = 0; + z80->stop_reason = 0; + z80->stop_breakpoint = 0; + + if (!z80->timer_cpu && !z80->timer_rt) { + tilem_internal(calc, "No timers set"); + return; + } + + while (!z80->stopping) { + z80->exception = 0; + op = (*calc->hw.z80_rdmem_m1)(calc, PC); + PC++; + Rl++; + op = z80_execute_opcode(calc, op); + check_breakpoints(calc, z80->breakpoint_op, op); + check_timers(calc); + + if (z80->interrupts && IFF1 && op != 0xfb + && op != 0xddfb && op != 0xfdfb) { + IFF1 = IFF2 = 0; + Rl++; + z80->halted = 0; + + /* Depending on the calculator, this value + varies somewhat randomly from one interrupt + to the next (making IM 2 rather difficult + to use, and IM 0 essentially worthless.) + Most likely, there is nothing connected to + the data bus at interrupt time. I seem to + remember somebody (sigma, perhaps?) + experimenting with this on the TI-83+ and + finding it usually 3F, 7F, BF, or FF. Or + maybe I'm completely wrong. In any case it + is unwise for programs to depend on this + value! */ + + busbyte = rand() & 0xff; + + switch (IM) { + case 0: + delay(2); + z80_execute_opcode(calc, busbyte); + break; + + case 1: + push(PC); + PC = 0x0038; + delay(13); + break; + + case 2: + /* FIXME: does accepting an IM 2 + interrupt affect WZ? It seems very + likely. */ + push(PC); + PC = readw((IR & 0xff00) | busbyte); + delay(19); + } + check_mem_breakpoints(calc, z80->breakpoint_mx, z80->breakpoint_mpx, PC); + check_timers(calc); + } + else if (op != 0x76) { + check_mem_breakpoints(calc, z80->breakpoint_mx, z80->breakpoint_mpx, PC); + } + else { + z80->halted = 1; + PC--; + if (z80->stopping) + break; + + /* CPU halted: fast-forward to next timer event */ + if (z80->timer_cpu && z80->timer_rt) { + t1 = (z80->timers[z80->timer_cpu].count + - z80->clock); + t2 = (z80->timers[z80->timer_rt].count + - z80->clock); + if (t1 > t2) + t1 = t2; + } + else if (z80->timer_cpu) { + t1 = (z80->timers[z80->timer_cpu].count + - z80->clock); + } + else if (z80->timer_rt) { + t1 = (z80->timers[z80->timer_rt].count + - z80->clock); + } + else { + tilem_internal(calc, "No timers set"); + return; + } + + z80->clock += t1 & ~3; + Rl += t1 / 4; + check_timers(calc); + } + + if (TILEM_UNLIKELY(z80->exception)) { + if (z80->emuflags & TILEM_Z80_BREAK_EXCEPTIONS) + tilem_z80_stop(calc, TILEM_STOP_EXCEPTION); + if (!(z80->emuflags & TILEM_Z80_IGNORE_EXCEPTIONS)) + tilem_calc_reset(calc); + } + } +} + +static void tmr_stop(TilemCalc* calc, void* data TILEM_ATTR_UNUSED) +{ + tilem_z80_stop(calc, TILEM_STOP_TIMEOUT); +} + +dword tilem_z80_run(TilemCalc* calc, int clocks, int* remaining) +{ + int tmr = tilem_z80_add_timer(calc, clocks, 0, 0, &tmr_stop, 0); + z80_execute(calc); + if (remaining) + *remaining = tilem_z80_get_timer_clocks(calc, tmr); + tilem_z80_remove_timer(calc, tmr); + return calc->z80.stop_reason; +} + +dword tilem_z80_run_time(TilemCalc* calc, int microseconds, int* remaining) +{ + int tmr = tilem_z80_add_timer(calc, microseconds, 0, 1, &tmr_stop, 0); + z80_execute(calc); + if (remaining) + *remaining = tilem_z80_get_timer_microseconds(calc, tmr); + tilem_z80_remove_timer(calc, tmr); + return calc->z80.stop_reason; +} diff --git a/tool/tilem-src/emu/z80.h b/tool/tilem-src/emu/z80.h new file mode 100644 index 0000000..f48c483 --- /dev/null +++ b/tool/tilem-src/emu/z80.h @@ -0,0 +1,110 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifndef _TILEM_Z80_H +#define _TILEM_Z80_H + +/* Internal Z80 data structures */ + +struct _TilemZ80Timer { + int next, prev; + dword count; + dword period; + TilemZ80TimerFunc callback; + void* callbackdata; +}; + +struct _TilemZ80Breakpoint { + int next, prev; + int type; + dword start; + dword end; + dword mask; + TilemZ80BreakpointFunc testfunc; + void* testdata; +}; + +/* Useful definitions */ + +#define AF (calc->z80.r.af.d) +#define BC (calc->z80.r.bc.d) +#define DE (calc->z80.r.de.d) +#define HL (calc->z80.r.hl.d) +#define AF2 (calc->z80.r.af2.d) +#define BC2 (calc->z80.r.bc2.d) +#define DE2 (calc->z80.r.de2.d) +#define HL2 (calc->z80.r.hl2.d) +#define IX (calc->z80.r.ix.d) +#define IY (calc->z80.r.iy.d) +#define SP (calc->z80.r.sp.d) +#define PC (calc->z80.r.pc.d) +#define IR (calc->z80.r.ir.d) + +#define A (calc->z80.r.af.b.h) +#define F (calc->z80.r.af.b.l) +#define B (calc->z80.r.bc.b.h) +#define C (calc->z80.r.bc.b.l) +#define D (calc->z80.r.de.b.h) +#define E (calc->z80.r.de.b.l) +#define H (calc->z80.r.hl.b.h) +#define L (calc->z80.r.hl.b.l) +#define IXh (calc->z80.r.ix.b.h) +#define IXl (calc->z80.r.ix.b.l) +#define IYh (calc->z80.r.iy.b.h) +#define IYl (calc->z80.r.iy.b.l) +#define I (calc->z80.r.ir.b.h) +#define Rh (calc->z80.r.r7) +#define Rl (calc->z80.r.ir.b.l) +#define R ((Rl & 0x7f) | Rh) + +#ifdef DISABLE_Z80_WZ_REGISTER +# define WZ temp_wz.d +# define WZ2 temp_wz2.d +# define W temp_wz.b.h +# define Z temp_wz.b.l +#else +# define WZ (calc->z80.r.wz.d) +# define WZ2 (calc->z80.r.wz2.d) +# define W (calc->z80.r.wz.b.h) +# define Z (calc->z80.r.wz.b.l) +#endif + +#define IFF1 (calc->z80.r.iff1) +#define IFF2 (calc->z80.r.iff2) +#define IM (calc->z80.r.im) + +#define FLAG_S 0x80 +#define FLAG_Z 0x40 +#define FLAG_Y 0x20 +#define FLAG_H 0x10 +#define FLAG_X 0x08 +#define FLAG_P 0x04 +#define FLAG_V FLAG_P +#define FLAG_N 0x02 +#define FLAG_C 0x01 + +#define BCw (calc->z80.r.bc.w.l) +#define DEw (calc->z80.r.de.w.l) +#define HLw (calc->z80.r.hl.w.l) +#define SPw (calc->z80.r.sp.w.l) +#define IXw (calc->z80.r.ix.w.l) +#define IYw (calc->z80.r.iy.w.l) + +#endif diff --git a/tool/tilem-src/emu/z80cb.h b/tool/tilem-src/emu/z80cb.h new file mode 100644 index 0000000..ef276ee --- /dev/null +++ b/tool/tilem-src/emu/z80cb.h @@ -0,0 +1,426 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2009 Benjamin Moody + * + * 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, see + * . + */ + +#if defined(PREFIX_DD) || defined(PREFIX_FD) + +# define CBINST(fnc, reg) do { \ + UNDOCUMENTED(16); \ + tmp1 = readb(WZ); \ + fnc(tmp1); \ + writeb(WZ, tmp1); \ + (reg) = tmp1; \ + delay(19); \ + } while (0) + +# define CBINST_HL(fnc) do { \ + tmp1 = readb(WZ); \ + fnc(tmp1); \ + writeb(WZ, tmp1); \ + delay(19); \ + } while (0) + +# define CBINST_UNDOC(fnc, reg) CBINST(fnc, reg) + +# define CBINST_UNDOC_HL(fnc) do { \ + UNDOCUMENTED(12); \ + CBINST_HL(fnc); \ + } while (0) + +# define CB_BIT(b, reg) do { \ + UNDOCUMENTED(12); \ + CB_BIT_HL(b); \ + } while (0) + +# define CB_BIT_HL(b) do { \ + tmp1 = readb(WZ) & (1 << b); \ + F = ((tmp1 & FLAG_S) /* S */ \ + | (W & FLAG_XY) /* X/Y */ \ + | (tmp1 ? 0 : FLAG_ZP) /* Z/P */ \ + | (FLAG_H) /* H */ \ + | (F & FLAG_C)); \ + delay(16); \ + } while (0) + +# define CB_RES(b, reg) do { \ + UNDOCUMENTED(16); \ + tmp1 = readb(WZ) & ~(1 << b); \ + writeb(WZ, tmp1); \ + (reg) = tmp1; \ + delay(19); \ + } while (0) + +# define CB_RES_HL(b) do { \ + tmp1 = readb(WZ) & ~(1 << b); \ + writeb(WZ, tmp1); \ + delay(19); \ + } while (0) + +# define CB_SET(b, reg) do { \ + UNDOCUMENTED(16); \ + tmp1 = readb(WZ) | (1 << b); \ + writeb(WZ, tmp1); \ + (reg) = tmp1; \ + delay(19); \ + } while (0) + +# define CB_SET_HL(b) do { \ + tmp1 = readb(WZ) | (1 << b); \ + writeb(WZ, tmp1); \ + delay(19); \ + } while (0) + +#else /* ! PREFIX_DD, ! PREFIX_FD */ + +# define CBINST(fnc, reg) do { \ + fnc(reg); \ + delay(8); \ + } while (0) + +# define CBINST_HL(fnc) do { \ + tmp1 = readb(HL); \ + fnc(tmp1); \ + writeb(HL, tmp1); \ + delay(15); \ + } while (0) + +# define CBINST_UNDOC(fnc, reg) do { \ + UNDOCUMENTED(8); \ + CBINST(fnc, reg); \ + } while (0) + +# define CBINST_UNDOC_HL(fnc) do { \ + UNDOCUMENTED(8); \ + CBINST_HL(fnc); \ + } while (0) + +# define CB_BIT(b, reg) do { \ + tmp1 = (reg) & (1 << b); \ + F = ((tmp1 & FLAG_SXY) /* S/X/Y */ \ + | (tmp1 ? 0 : FLAG_ZP) /* Z/P */ \ + | (FLAG_H) /* H */ \ + | (F & FLAG_C)); \ + delay(8); \ + } while (0) + +# define CB_BIT_HL(b) do { \ + tmp1 = readb(HL) & (1 << b); \ + F = ((tmp1 & FLAG_S) /* S */ \ + | (W & FLAG_XY) /* X/Y */ \ + | (tmp1 ? 0 : FLAG_ZP) /* Z/P */ \ + | (FLAG_H) /* H */ \ + | (F & FLAG_C)); \ + delay(12); \ + } while (0) + +# define CB_RES(b, reg) do { \ + (reg) &= ~(1 << b); \ + delay(8); \ + } while (0) + +# define CB_RES_HL(b) do { \ + writeb(HL, readb(HL) & ~(1 << b)); \ + delay(15); \ + } while (0) + +# define CB_SET(b, reg) do { \ + (reg) |= (1 << b); \ + delay(8); \ + } while (0) + +# define CB_SET_HL(b) do { \ + writeb(HL, readb(HL) | (1 << b)); \ + delay(15); \ + } while (0) + +#endif + +switch (op) { + case 0x00: CBINST(rlc, B); break; + case 0x01: CBINST(rlc, C); break; + case 0x02: CBINST(rlc, D); break; + case 0x03: CBINST(rlc, E); break; + case 0x04: CBINST(rlc, H); break; + case 0x05: CBINST(rlc, L); break; + case 0x06: CBINST_HL(rlc); break; + case 0x07: CBINST(rlc, A); break; + case 0x08: CBINST(rrc, B); break; + case 0x09: CBINST(rrc, C); break; + case 0x0A: CBINST(rrc, D); break; + case 0x0B: CBINST(rrc, E); break; + case 0x0C: CBINST(rrc, H); break; + case 0x0D: CBINST(rrc, L); break; + case 0x0E: CBINST_HL(rrc); break; + case 0x0F: CBINST(rrc, A); break; + case 0x10: CBINST(rl, B); break; + case 0x11: CBINST(rl, C); break; + case 0x12: CBINST(rl, D); break; + case 0x13: CBINST(rl, E); break; + case 0x14: CBINST(rl, H); break; + case 0x15: CBINST(rl, L); break; + case 0x16: CBINST_HL(rl); break; + case 0x17: CBINST(rl, A); break; + case 0x18: CBINST(rr, B); break; + case 0x19: CBINST(rr, C); break; + case 0x1A: CBINST(rr, D); break; + case 0x1B: CBINST(rr, E); break; + case 0x1C: CBINST(rr, H); break; + case 0x1D: CBINST(rr, L); break; + case 0x1E: CBINST_HL(rr); break; + case 0x1F: CBINST(rr, A); break; + case 0x20: CBINST(sla, B); break; + case 0x21: CBINST(sla, C); break; + case 0x22: CBINST(sla, D); break; + case 0x23: CBINST(sla, E); break; + case 0x24: CBINST(sla, H); break; + case 0x25: CBINST(sla, L); break; + case 0x26: CBINST_HL(sla); break; + case 0x27: CBINST(sla, A); break; + case 0x28: CBINST(sra, B); break; + case 0x29: CBINST(sra, C); break; + case 0x2A: CBINST(sra, D); break; + case 0x2B: CBINST(sra, E); break; + case 0x2C: CBINST(sra, H); break; + case 0x2D: CBINST(sra, L); break; + case 0x2E: CBINST_HL(sra); break; + case 0x2F: CBINST(sra, A); break; + case 0x30: CBINST_UNDOC(slia, B); break; + case 0x31: CBINST_UNDOC(slia, C); break; + case 0x32: CBINST_UNDOC(slia, D); break; + case 0x33: CBINST_UNDOC(slia, E); break; + case 0x34: CBINST_UNDOC(slia, H); break; + case 0x35: CBINST_UNDOC(slia, L); break; + case 0x36: CBINST_UNDOC_HL(slia); break; + case 0x37: CBINST_UNDOC(slia, A); break; + case 0x38: CBINST(srl, B); break; + case 0x39: CBINST(srl, C); break; + case 0x3A: CBINST(srl, D); break; + case 0x3B: CBINST(srl, E); break; + case 0x3C: CBINST(srl, H); break; + case 0x3D: CBINST(srl, L); break; + case 0x3E: CBINST_HL(srl); break; + case 0x3F: CBINST(srl, A); break; + + case 0x40: CB_BIT(0, B); break; + case 0x41: CB_BIT(0, C); break; + case 0x42: CB_BIT(0, D); break; + case 0x43: CB_BIT(0, E); break; + case 0x44: CB_BIT(0, H); break; + case 0x45: CB_BIT(0, L); break; + case 0x46: CB_BIT_HL(0); break; + case 0x47: CB_BIT(0, A); break; + case 0x48: CB_BIT(1, B); break; + case 0x49: CB_BIT(1, C); break; + case 0x4A: CB_BIT(1, D); break; + case 0x4B: CB_BIT(1, E); break; + case 0x4C: CB_BIT(1, H); break; + case 0x4D: CB_BIT(1, L); break; + case 0x4E: CB_BIT_HL(1); break; + case 0x4F: CB_BIT(1, A); break; + case 0x50: CB_BIT(2, B); break; + case 0x51: CB_BIT(2, C); break; + case 0x52: CB_BIT(2, D); break; + case 0x53: CB_BIT(2, E); break; + case 0x54: CB_BIT(2, H); break; + case 0x55: CB_BIT(2, L); break; + case 0x56: CB_BIT_HL(2); break; + case 0x57: CB_BIT(2, A); break; + case 0x58: CB_BIT(3, B); break; + case 0x59: CB_BIT(3, C); break; + case 0x5A: CB_BIT(3, D); break; + case 0x5B: CB_BIT(3, E); break; + case 0x5C: CB_BIT(3, H); break; + case 0x5D: CB_BIT(3, L); break; + case 0x5E: CB_BIT_HL(3); break; + case 0x5F: CB_BIT(3, A); break; + case 0x60: CB_BIT(4, B); break; + case 0x61: CB_BIT(4, C); break; + case 0x62: CB_BIT(4, D); break; + case 0x63: CB_BIT(4, E); break; + case 0x64: CB_BIT(4, H); break; + case 0x65: CB_BIT(4, L); break; + case 0x66: CB_BIT_HL(4); break; + case 0x67: CB_BIT(4, A); break; + case 0x68: CB_BIT(5, B); break; + case 0x69: CB_BIT(5, C); break; + case 0x6A: CB_BIT(5, D); break; + case 0x6B: CB_BIT(5, E); break; + case 0x6C: CB_BIT(5, H); break; + case 0x6D: CB_BIT(5, L); break; + case 0x6E: CB_BIT_HL(5); break; + case 0x6F: CB_BIT(5, A); break; + case 0x70: CB_BIT(6, B); break; + case 0x71: CB_BIT(6, C); break; + case 0x72: CB_BIT(6, D); break; + case 0x73: CB_BIT(6, E); break; + case 0x74: CB_BIT(6, H); break; + case 0x75: CB_BIT(6, L); break; + case 0x76: CB_BIT_HL(6); break; + case 0x77: CB_BIT(6, A); break; + case 0x78: CB_BIT(7, B); break; + case 0x79: CB_BIT(7, C); break; + case 0x7A: CB_BIT(7, D); break; + case 0x7B: CB_BIT(7, E); break; + case 0x7C: CB_BIT(7, H); break; + case 0x7D: CB_BIT(7, L); break; + case 0x7E: CB_BIT_HL(7); break; + case 0x7F: CB_BIT(7, A); break; + + case 0x80: CB_RES(0, B); break; + case 0x81: CB_RES(0, C); break; + case 0x82: CB_RES(0, D); break; + case 0x83: CB_RES(0, E); break; + case 0x84: CB_RES(0, H); break; + case 0x85: CB_RES(0, L); break; + case 0x86: CB_RES_HL(0); break; + case 0x87: CB_RES(0, A); break; + case 0x88: CB_RES(1, B); break; + case 0x89: CB_RES(1, C); break; + case 0x8A: CB_RES(1, D); break; + case 0x8B: CB_RES(1, E); break; + case 0x8C: CB_RES(1, H); break; + case 0x8D: CB_RES(1, L); break; + case 0x8E: CB_RES_HL(1); break; + case 0x8F: CB_RES(1, A); break; + case 0x90: CB_RES(2, B); break; + case 0x91: CB_RES(2, C); break; + case 0x92: CB_RES(2, D); break; + case 0x93: CB_RES(2, E); break; + case 0x94: CB_RES(2, H); break; + case 0x95: CB_RES(2, L); break; + case 0x96: CB_RES_HL(2); break; + case 0x97: CB_RES(2, A); break; + case 0x98: CB_RES(3, B); break; + case 0x99: CB_RES(3, C); break; + case 0x9A: CB_RES(3, D); break; + case 0x9B: CB_RES(3, E); break; + case 0x9C: CB_RES(3, H); break; + case 0x9D: CB_RES(3, L); break; + case 0x9E: CB_RES_HL(3); break; + case 0x9F: CB_RES(3, A); break; + case 0xA0: CB_RES(4, B); break; + case 0xA1: CB_RES(4, C); break; + case 0xA2: CB_RES(4, D); break; + case 0xA3: CB_RES(4, E); break; + case 0xA4: CB_RES(4, H); break; + case 0xA5: CB_RES(4, L); break; + case 0xA6: CB_RES_HL(4); break; + case 0xA7: CB_RES(4, A); break; + case 0xA8: CB_RES(5, B); break; + case 0xA9: CB_RES(5, C); break; + case 0xAA: CB_RES(5, D); break; + case 0xAB: CB_RES(5, E); break; + case 0xAC: CB_RES(5, H); break; + case 0xAD: CB_RES(5, L); break; + case 0xAE: CB_RES_HL(5); break; + case 0xAF: CB_RES(5, A); break; + case 0xB0: CB_RES(6, B); break; + case 0xB1: CB_RES(6, C); break; + case 0xB2: CB_RES(6, D); break; + case 0xB3: CB_RES(6, E); break; + case 0xB4: CB_RES(6, H); break; + case 0xB5: CB_RES(6, L); break; + case 0xB6: CB_RES_HL(6); break; + case 0xB7: CB_RES(6, A); break; + case 0xB8: CB_RES(7, B); break; + case 0xB9: CB_RES(7, C); break; + case 0xBA: CB_RES(7, D); break; + case 0xBB: CB_RES(7, E); break; + case 0xBC: CB_RES(7, H); break; + case 0xBD: CB_RES(7, L); break; + case 0xBE: CB_RES_HL(7); break; + case 0xBF: CB_RES(7, A); break; + + case 0xC0: CB_SET(0, B); break; + case 0xC1: CB_SET(0, C); break; + case 0xC2: CB_SET(0, D); break; + case 0xC3: CB_SET(0, E); break; + case 0xC4: CB_SET(0, H); break; + case 0xC5: CB_SET(0, L); break; + case 0xC6: CB_SET_HL(0); break; + case 0xC7: CB_SET(0, A); break; + case 0xC8: CB_SET(1, B); break; + case 0xC9: CB_SET(1, C); break; + case 0xCA: CB_SET(1, D); break; + case 0xCB: CB_SET(1, E); break; + case 0xCC: CB_SET(1, H); break; + case 0xCD: CB_SET(1, L); break; + case 0xCE: CB_SET_HL(1); break; + case 0xCF: CB_SET(1, A); break; + case 0xD0: CB_SET(2, B); break; + case 0xD1: CB_SET(2, C); break; + case 0xD2: CB_SET(2, D); break; + case 0xD3: CB_SET(2, E); break; + case 0xD4: CB_SET(2, H); break; + case 0xD5: CB_SET(2, L); break; + case 0xD6: CB_SET_HL(2); break; + case 0xD7: CB_SET(2, A); break; + case 0xD8: CB_SET(3, B); break; + case 0xD9: CB_SET(3, C); break; + case 0xDA: CB_SET(3, D); break; + case 0xDB: CB_SET(3, E); break; + case 0xDC: CB_SET(3, H); break; + case 0xDD: CB_SET(3, L); break; + case 0xDE: CB_SET_HL(3); break; + case 0xDF: CB_SET(3, A); break; + case 0xE0: CB_SET(4, B); break; + case 0xE1: CB_SET(4, C); break; + case 0xE2: CB_SET(4, D); break; + case 0xE3: CB_SET(4, E); break; + case 0xE4: CB_SET(4, H); break; + case 0xE5: CB_SET(4, L); break; + case 0xE6: CB_SET_HL(4); break; + case 0xE7: CB_SET(4, A); break; + case 0xE8: CB_SET(5, B); break; + case 0xE9: CB_SET(5, C); break; + case 0xEA: CB_SET(5, D); break; + case 0xEB: CB_SET(5, E); break; + case 0xEC: CB_SET(5, H); break; + case 0xED: CB_SET(5, L); break; + case 0xEE: CB_SET_HL(5); break; + case 0xEF: CB_SET(5, A); break; + case 0xF0: CB_SET(6, B); break; + case 0xF1: CB_SET(6, C); break; + case 0xF2: CB_SET(6, D); break; + case 0xF3: CB_SET(6, E); break; + case 0xF4: CB_SET(6, H); break; + case 0xF5: CB_SET(6, L); break; + case 0xF6: CB_SET_HL(6); break; + case 0xF7: CB_SET(6, A); break; + case 0xF8: CB_SET(7, B); break; + case 0xF9: CB_SET(7, C); break; + case 0xFA: CB_SET(7, D); break; + case 0xFB: CB_SET(7, E); break; + case 0xFC: CB_SET(7, H); break; + case 0xFD: CB_SET(7, L); break; + case 0xFE: CB_SET_HL(7); break; + case 0xFF: CB_SET(7, A); break; + } + +#undef CBINST +#undef CBINST_HL +#undef CBINST_UNDOC +#undef CBINST_UNDOC_HL +#undef CB_BIT +#undef CB_BIT_HL +#undef CB_RES +#undef CB_RES_HL +#undef CB_SET +#undef CB_SET_HL + diff --git a/tool/tilem-src/emu/z80cmds.h b/tool/tilem-src/emu/z80cmds.h new file mode 100644 index 0000000..8ce23b2 --- /dev/null +++ b/tool/tilem-src/emu/z80cmds.h @@ -0,0 +1,840 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2009-2011 Benjamin Moody + * + * 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, see + * . + */ + +/* Flag magic: + + S (the Sign flag) is set when the result is negative (i.e., copied + from the MS bit.) + + Z (the Zero flag) is set when the result is zero. + + Y (undocumented flag) is usually copied from the result. + + H (the Half-carry flag) is set when a carry occurs from LS to MS + nibble. Since bit 4 of the result is equal to (bit 4 of first arg) + xor (bit 4 of second arg) xor H, we can infer that H equals (bit 4 + of first arg) xor (bit 4 of second arg) xor (bit 4 of result). + + X (undocumented flag) is copied from the same place as is Y. + + P (parity flag) is set -- by logic operations -- when the result + has even parity; i.e., it's the xor of all the bits of the result + and 1. + + V (overflow flag, which is another name for the parity flag) is set + -- by arithmetic operations -- when the result overflows. This can + happen when a positive plus a positive is negative, or a negative + plus a negative is positive, or a positive minus a negative is + negative, or a negative minus a positive is positive. + + (In 8 bits, a positive plus a negative is at least 0 + -128 = -128 + and at most 127 + -1 + 1 = 127. A positive minus a positive is at + least 0 - 127 - 1 = -128 and at most 127 - 0 = 127. A negative + minus a negative is at least -128 - -1 - 1 = -128 and at most -1 - + -128 = 127. Thus these cases can never overflow.) + + When adding, then, overflow occurs if the args are equal in the + MS bit and the result differs in the MS bit. + + When subtracting, overflow occurs if the args differ in the MS + bit and the result differs from the first arg in the MS bit. + + N (subtract flag) is set or cleared depending on the operation. + + C (carry flag) is the leftover bit after an addition or + subtraction. +*/ + +#define FLAG_XY (FLAG_X | FLAG_Y) +#define FLAG_XYC (FLAG_X | FLAG_Y | FLAG_C) +#define FLAG_SXY (FLAG_S | FLAG_X | FLAG_Y) +#define FLAG_SXYC (FLAG_S | FLAG_X | FLAG_Y | FLAG_C) +#define FLAG_ZP (FLAG_Z | FLAG_P) +#define FLAG_SZPC (FLAG_S | FLAG_Z | FLAG_P | FLAG_C) + +#define lsb(xxx) ((xxx) & 0xff) + +#define UNDOCUMENTED(clks) \ + if (calc->z80.emuflags & TILEM_Z80_BREAK_UNDOCUMENTED) \ + tilem_z80_stop(calc, TILEM_STOP_UNDOCUMENTED_INST); \ + if (calc->z80.emuflags & TILEM_Z80_SKIP_UNDOCUMENTED) { \ + delay(clks); \ + break; \ + } \ + if (calc->z80.emuflags & TILEM_Z80_RESET_UNDOCUMENTED) { \ + tilem_warning(calc, "Invalid opcode %x", op); \ + tilem_z80_exception(calc, TILEM_EXC_INSTRUCTION); \ + break; \ + } + +#define add8(dst, src) do { \ + word arg1 = (dst); \ + word arg2 = (src); \ + word res = arg1 + arg2; \ + byte resb = res; \ + F = ((res & FLAG_SXY) /* S/X/Y */ \ + | (resb ? 0 : FLAG_Z) /* Z */ \ + | ((arg1 ^ arg2 ^ res) & FLAG_H) /* H */ \ + | (((arg1 ^ ~arg2) & (arg1 ^ res) & 0x80) >> 5) \ + | (res >> 8)); /* C */ \ + (dst) = resb; \ + } while (0) + +#define adc8(dst, src) do { \ + word arg1 = (dst); \ + word arg2 = (src); \ + word res = arg1 + arg2 + (F & 1); \ + byte resb = res; \ + F = ((res & FLAG_SXY) /* S/X/Y */ \ + | (resb ? 0 : FLAG_Z) /* Z */ \ + | ((arg1 ^ arg2 ^ res) & FLAG_H) /* H */ \ + | (((arg1 ^ ~arg2) & (arg1 ^ res) & 0x80) >> 5) \ + | (res >> 8)); /* C */ \ + (dst) = resb; \ + } while (0) + +#define sub8(dst, src) do { \ + word arg1 = (dst); \ + word arg2 = (src); \ + word res = arg1 - arg2; \ + byte resb = res; \ + F = ((res & FLAG_SXY) /* S/X/Y */ \ + | (resb ? 0 : FLAG_Z) /* Z */ \ + | ((arg1 ^ arg2 ^ res) & FLAG_H) /* H */ \ + | (((arg1 ^ arg2) & (arg1 ^ res) & 0x80) >> 5) \ + | (FLAG_N) /* N */ \ + | ((res >> 8) & 1)); /* C */ \ + (dst) = resb; \ + } while (0) + +#define sbc8(dst, src) do { \ + word arg1 = (dst); \ + word arg2 = (src); \ + word res = arg1 - arg2 - (F & 1); \ + byte resb = res; \ + F = ((res & FLAG_SXY) /* S/X/Y */ \ + | (resb ? 0 : FLAG_Z) /* Z */ \ + | ((arg1 ^ arg2 ^ res) & FLAG_H) /* H */ \ + | (((arg1 ^ arg2) & (arg1 ^ res) & 0x80) >> 5) \ + | (FLAG_N) /* N */ \ + | ((res >> 8) & 1)); /* C */ \ + (dst) = resb; \ + } while (0) + +#define and(dst, src) do { \ + byte arg1 = (dst); \ + byte arg2 = (src); \ + byte res = (arg1 & arg2); \ + F = ((res & FLAG_SXY) /* S/X/Y */ \ + | (res ? 0 : FLAG_Z) /* Z */ \ + | (FLAG_H) /* H */ \ + | parity_table[res]); /* P */ \ + (dst) = res; \ + } while (0) + +#define xor(dst, src) do { \ + byte arg1 = (dst); \ + byte arg2 = (src); \ + byte res = (arg1 ^ arg2); \ + F = ((res & FLAG_SXY) /* S/X/Y */ \ + | (res ? 0 : FLAG_Z) /* Z */ \ + | parity_table[res]); /* P */ \ + (dst) = res; \ + } while (0) + +#define or(dst, src) do { \ + byte arg1 = (dst); \ + byte arg2 = (src); \ + byte res = (arg1 | arg2); \ + F = ((res & FLAG_SXY) /* S/X/Y */ \ + | (res ? 0 : FLAG_Z) /* Z */ \ + | parity_table[res]); /* P */ \ + (dst) = res; \ + } while (0) + +#define cp(dst, src) do { \ + word arg1 = (dst); \ + word arg2 = (src); \ + word res = arg1 - arg2; \ + byte resb = res; \ + F = ((res & FLAG_SXY) /* S/X/Y */ \ + | (resb ? 0 : FLAG_Z) /* Z */ \ + | ((arg1 ^ arg2 ^ res) & FLAG_H) /* H */ \ + | (((arg1 ^ arg2) & (arg1 ^ res) & 0x80) >> 5) \ + | (FLAG_N) /* N */ \ + | ((res >> 8) & 1)); /* C */ \ + } while (0) + + +#define add16(dst, src) do { \ + dword arg1 = (dst); \ + dword arg2 = (src); \ + dword res = arg1 + arg2; \ + F = ((F & (FLAG_S | FLAG_Z | FLAG_P)) \ + | ((res >> 8) & FLAG_XY) /* X/Y */ \ + | (((arg1 ^ arg2 ^ res) >> 8) & FLAG_H) /* H */ \ + | (res >> 16)); /* C */ \ + (dst) = res; \ + } while (0) + +#define adc16(dst, src) do { \ + dword arg1 = (dst); \ + dword arg2 = (src); \ + dword res = arg1 + arg2 + (F & 1); \ + word resw = res; \ + F = (((res >> 8) & FLAG_SXY) /* S/X/Y */\ + | (resw ? 0 : FLAG_Z) /* Z */ \ + | (((arg1 ^ arg2 ^ res) >> 8) & FLAG_H) /* H */ \ + | (((arg1 ^ ~arg2) & (arg1 ^ res) & 0x8000) >> 11) \ + | (res >> 16)); /* C */ \ + (dst) = resw; \ + } while (0) + +#define sbc16(dst, src) do { \ + dword arg1 = (dst); \ + dword arg2 = (src); \ + dword res = arg1 - arg2 - (F & 1); \ + word resw = res; \ + F = (((res >> 8) & FLAG_SXY) /* S/X/Y */\ + | (resw ? 0 : FLAG_Z) /* Z */ \ + | (((arg1 ^ arg2 ^ res) >> 8) & FLAG_H) /* H */ \ + | (((arg1 ^ arg2) & (arg1 ^ res) & 0x8000) >> 11) \ + | (FLAG_N) /* N */ \ + | ((res >> 16) & 1)); /* C */ \ + (dst) = resw; \ + } while (0) + + +#define inc(reg) do { \ + byte arg = (reg); \ + byte res = arg + 1; \ + F = ((res & FLAG_SXY) /* S/X/Y */ \ + | (res ? 0 : FLAG_Z) /* Z */ \ + | ((arg ^ res) & FLAG_H) /* H */ \ + | (res == 0x80 ? FLAG_V : 0) /* V */ \ + | (F & FLAG_C)); \ + (reg) = res; \ + } while (0) + +#define dec(reg) do { \ + byte arg = (reg); \ + byte res = arg - 1; \ + F = ((res & FLAG_SXY) /* S/X/Y */ \ + | (res ? 0 : FLAG_Z) /* Z */ \ + | ((arg ^ res) & FLAG_H) /* H */ \ + | (res == 0x7f ? FLAG_V : 0) /* V */ \ + | (FLAG_N) /* N */ \ + | (F & FLAG_C)); \ + (reg) = res; \ + } while (0) + + +#define cpl(reg) do { \ + byte arg = (reg); \ + byte res = ~arg; \ + F = ((res & FLAG_XY) /* X/Y */ \ + | FLAG_H | FLAG_N /* H/N */ \ + | (F & FLAG_SZPC)); \ + (reg) = res; \ + } while (0) + +#define neg(reg) do { \ + byte arg = (reg); \ + byte res = -arg; \ + F = ((res & FLAG_SXY) /* S/X/Y */ \ + | (res ? 0 : FLAG_Z) /* Z */ \ + | ((arg ^ res) & FLAG_H) /* H */ \ + | (arg == 0x80 ? FLAG_V : 0) /* V */ \ + | (FLAG_N) /* N */ \ + | (!!arg)); /* C */ \ + (reg) = res; \ + } while (0) + +#define daa do { \ + word idx = (((F & 0x10) << 6) | ((F & 0x03) << 8) | A); \ + AF = daa_table[idx]; \ + } while (0) + + +#define rlca do { \ + byte arg = A; \ + byte res = ((arg << 1) | (arg >> 7)); \ + F = ((F & (FLAG_S | FLAG_Z | FLAG_P)) \ + | (res & FLAG_XYC)); /* X/Y/C */ \ + A = res; \ + } while (0) + +#define rrca do { \ + byte arg = A; \ + byte res = ((arg >> 1) | (arg << 7)); \ + F = ((F & (FLAG_S | FLAG_Z | FLAG_P)) \ + | (res & FLAG_XY) /* X/Y */ \ + | (arg & FLAG_C)); /* C */ \ + A = res; \ + } while (0) + +#define rla do { \ + byte arg = A; \ + byte res = ((arg << 1) | (F & 1)); \ + F = ((F & (FLAG_S | FLAG_Z | FLAG_P)) \ + | (res & FLAG_XY) /* X/Y */ \ + | (arg >> 7)); /* C */ \ + A = res; \ + } while (0) + +#define rra do { \ + byte arg = A; \ + byte res = ((arg >> 1) | (F << 7)); \ + F = ((F & (FLAG_S | FLAG_Z | FLAG_P)) \ + | (res & FLAG_XY) /* X/Y */ \ + | (arg & FLAG_C)); /* C */ \ + A = res; \ + } while (0) + +#define rlc(reg) do { \ + byte arg = (reg); \ + byte res = ((arg << 1) | (arg >> 7)); \ + F = ((res & FLAG_SXYC) /* S/X/Y/C */ \ + | (res ? 0 : FLAG_Z) /* Z */ \ + | parity_table[res]); /* P */ \ + (reg) = res; \ + } while (0) + +#define rrc(reg) do { \ + byte arg = (reg); \ + byte res = ((arg >> 1) | (arg << 7)); \ + F = ((res & FLAG_SXY) /* S/X/Y */ \ + | (res ? 0 : FLAG_Z) /* Z */ \ + | parity_table[res] /* P */ \ + | (arg & FLAG_C)); /* C */ \ + (reg) = res; \ + } while (0) + +#define rl(reg) do { \ + byte arg = (reg); \ + byte res = ((arg << 1) | (F & 1)); \ + F = ((res & FLAG_SXY) /* S/X/Y */ \ + | (res ? 0 : FLAG_Z) /* Z */ \ + | parity_table[res] /* P */ \ + | (arg >> 7)); /* C */ \ + (reg) = res; \ + } while (0) + +#define rr(reg) do { \ + byte arg = (reg); \ + byte res = ((arg >> 1) | (F << 7)); \ + F = ((res & FLAG_SXY) /* S/X/Y */ \ + | (res ? 0 : FLAG_Z) /* Z */ \ + | parity_table[res] /* P */ \ + | (arg & FLAG_C)); /* C */ \ + (reg) = res; \ + } while (0) + +#define sla(reg) do { \ + byte arg = (reg); \ + byte res = (arg << 1); \ + F = ((res & FLAG_SXY) /* S/X/Y */ \ + | (res ? 0 : FLAG_Z) /* Z */ \ + | parity_table[res] /* P */ \ + | (arg >> 7)); /* C */ \ + (reg) = res; \ + } while (0) + +#define sra(reg) do { \ + byte arg = (reg); \ + byte res = ((signed char) arg >> 1); \ + F = ((res & FLAG_SXY) /* S/X/Y */ \ + | (res ? 0 : FLAG_Z) /* Z */ \ + | parity_table[res] /* P */ \ + | (arg & FLAG_C)); /* C */ \ + (reg) = res; \ + } while (0) + +#define slia(reg) do { \ + byte arg = (reg); \ + byte res = ((arg << 1) | 1); \ + F = ((res & FLAG_SXY) /* S/X/Y */ \ + | (res ? 0 : FLAG_Z) /* Z */ \ + | parity_table[res] /* P */ \ + | (arg >> 7)); /* C */ \ + (reg) = res; \ + } while (0) + +#define srl(reg) do { \ + byte arg = (reg); \ + byte res = (arg >> 1); \ + F = ((res & FLAG_SXY) /* S/X/Y */ \ + | (res ? 0 : FLAG_Z) /* Z */ \ + | parity_table[res] /* P */ \ + | (arg & FLAG_C)); /* C */ \ + (reg) = res; \ + } while (0) + +#define rld do { \ + byte arg1 = readb(HL); \ + byte arg2 = A; \ + byte res = ((arg2 & 0xf0) | (arg1 >> 4)); \ + WZ = HL + 1; \ + writeb(HL, (arg1 << 4) | (arg2 & 0xf)); \ + F = ((res & FLAG_SXY) /* S/X/Y */ \ + | (res ? 0 : FLAG_Z) /* Z */ \ + | parity_table[res] /* P */ \ + | (F & FLAG_C)); \ + A = res; \ + } while (0) + +#define rrd do { \ + byte arg1 = readb(HL); \ + byte arg2 = A; \ + byte res = ((arg2 & 0xf0) | (arg1 & 0x0f)); \ + WZ = HL + 1; \ + writeb(HL, (arg1 >> 4) | (arg2 << 4)); \ + F = ((res & FLAG_SXY) /* S/X/Y */ \ + | (res ? 0 : FLAG_Z) /* Z */ \ + | parity_table[res] /* P */ \ + | (F & FLAG_C)); \ + A = res; \ + } while (0) + +#define push(reg) do { \ + SP -= 2; \ + writew(SP, (reg)); \ + } while (0) + +#define pop(reg) do { \ + (reg) = readw(SP); \ + SP += 2; \ + } while (0) + +#define ex(aaa, bbb) do { \ + tmp2 = (aaa); \ + (aaa) = (bbb); \ + (bbb) = tmp2; \ + } while (0) + +#define in(reg) do { \ + byte res = input(WZ); \ + F = ((res & FLAG_SXY) /* S/X/Y */ \ + | (res ? 0 : FLAG_Z) /* Z */ \ + | parity_table[res] /* P */ \ + | (F & FLAG_C)); \ + (reg) = res; \ + } while (0) + + +#define ld_a_ir(reg) do { \ + byte res = (reg); \ + A = res; \ + F = ((res & FLAG_SXY) /* S/X/Y */ \ + | (res ? 0 : FLAG_Z) /* Z */ \ + | (IFF2 ? FLAG_P : 0) /* P */ \ + | (F & FLAG_C)); \ + } while (0) + +#define ldi do { \ + byte res = readb(HL++); \ + writeb(DE++, res); \ + BC--; \ + F = ((F & (FLAG_S | FLAG_Z | FLAG_C)) \ + | ((res << 4) & FLAG_Y) /* Y */ \ + | (res & FLAG_X) /* X */ \ + | (BCw ? FLAG_P : 0)); /* P */ \ + } while (0) + +#define ldd do { \ + byte res = readb(HL--); \ + writeb(DE--, res); \ + BC--; \ + F = ((F & (FLAG_S | FLAG_Z | FLAG_C)) \ + | ((res << 4) & FLAG_Y) /* Y */ \ + | (res & FLAG_X) /* X */ \ + | (BCw ? FLAG_P : 0)); /* P */ \ + } while (0) + +/* FIXME: CPI and CPD obviously use WZ, but I haven't yet figured out + precisely how. */ + +#define cpi do { \ + word arg1 = A; \ + word arg2 = readb(HL++); \ + word res = arg1 - arg2; \ + byte hc = ((arg1 ^ arg2 ^ res) & 0x10); \ + byte res2 = res - (hc >> 4); \ + BC--; \ + F = ((res & FLAG_S) /* S */ \ + | (lsb(res) ? 0 : FLAG_Z) /* Z */ \ + | ((res2 << 4) & FLAG_Y) /* Y */ \ + | hc /* H */ \ + | (res2 & FLAG_X) /* X */ \ + | (BCw ? FLAG_P : 0) /* P */ \ + | FLAG_N /* N */ \ + | (F & FLAG_C)); \ + } while (0) + +#define cpd do { \ + word arg1 = A; \ + word arg2 = readb(HL--); \ + word res = arg1 - arg2; \ + byte hc = ((arg1 ^ arg2 ^ res) & 0x10); \ + byte res2 = res - (hc >> 4); \ + BC--; \ + F = ((res & FLAG_S) /* S */ \ + | (lsb(res) ? 0 : FLAG_Z) /* Z */ \ + | ((res2 << 4) & FLAG_Y) /* Y */ \ + | hc /* H */ \ + | (res2 & FLAG_X) /* X */ \ + | (BCw ? FLAG_P : 0) /* P */ \ + | FLAG_N /* N */ \ + | (F & FLAG_C)); \ + } while (0) + +#define ini do { \ + byte value, count; \ + word k; \ + value = input(BC); \ + writeb(HL++, value); \ + WZ = BC + 1; \ + k = Z + value; \ + count = --B; \ + F = ((count & FLAG_SXY) /* S/X/Y */ \ + | (count ? 0 : FLAG_Z) /* Z */ \ + | ((k >> 8) ? 0x11 : 0) /* H/C */ \ + | parity_table[(k & 7) ^ count] /* P */ \ + | ((value >> 6) & FLAG_N)); /* N */ \ + } while (0) + +#define ind do { \ + byte value, count; \ + word k; \ + value = input(BC); \ + writeb(HL--, value); \ + WZ = BC - 1; \ + k = Z + value; \ + count = --B; \ + F = ((count & FLAG_SXY) /* S/X/Y */ \ + | (count ? 0 : FLAG_Z) /* Z */ \ + | ((k >> 8) ? 0x11 : 0) /* H/C */ \ + | parity_table[(k & 7) ^ count] /* P */ \ + | ((value >> 6) & FLAG_N)); /* N */ \ + } while (0) + +#define outi do { \ + byte value, count; \ + word k; \ + value = readb(HL++); \ + count = --B; \ + output(BC, value); \ + k = L + value; \ + WZ = BC + 1; \ + F = ((count & FLAG_SXY) /* S/X/Y */ \ + | (count ? 0 : FLAG_Z) /* Z */ \ + | ((k >> 8) ? 0x11 : 0) /* H/C */ \ + | parity_table[(k & 7) ^ count] /* P */ \ + | ((value >> 6) & FLAG_N)); /* N */ \ + } while (0) + +#define outd do { \ + byte value, count; \ + word k; \ + value = readb(HL--); \ + count = --B; \ + output(BC, value); \ + k = L + value; \ + WZ = BC - 1; \ + F = ((count & FLAG_SXY) /* S/X/Y */ \ + | (count ? 0 : FLAG_Z) /* Z */ \ + | ((k >> 8) ? 0x11 : 0) /* H/C */ \ + | parity_table[(k & 7) ^ count] /* P */ \ + | ((value >> 6) & FLAG_N)); /* N */ \ + } while (0) + +/* Table giving parity flag values. (Also known as the Thue-Morse + sequence.) */ +static const byte parity_table[256] = { + 4,0,0,4,0,4,4,0, 0,4,4,0,4,0,0,4, 0,4,4,0,4,0,0,4, 4,0,0,4,0,4,4,0, + 0,4,4,0,4,0,0,4, 4,0,0,4,0,4,4,0, 4,0,0,4,0,4,4,0, 0,4,4,0,4,0,0,4, + 0,4,4,0,4,0,0,4, 4,0,0,4,0,4,4,0, 4,0,0,4,0,4,4,0, 0,4,4,0,4,0,0,4, + 4,0,0,4,0,4,4,0, 0,4,4,0,4,0,0,4, 0,4,4,0,4,0,0,4, 4,0,0,4,0,4,4,0, + + 0,4,4,0,4,0,0,4, 4,0,0,4,0,4,4,0, 4,0,0,4,0,4,4,0, 0,4,4,0,4,0,0,4, + 4,0,0,4,0,4,4,0, 0,4,4,0,4,0,0,4, 0,4,4,0,4,0,0,4, 4,0,0,4,0,4,4,0, + 4,0,0,4,0,4,4,0, 0,4,4,0,4,0,0,4, 0,4,4,0,4,0,0,4, 4,0,0,4,0,4,4,0, + 0,4,4,0,4,0,0,4, 4,0,0,4,0,4,4,0, 4,0,0,4,0,4,4,0, 0,4,4,0,4,0,0,4, +}; + +/* Table giving AF values following DAA */ +static const word daa_table[2048] = { + 0x0044, 0x0100, 0x0200, 0x0304, 0x0400, 0x0504, 0x0604, 0x0700, + 0x0808, 0x090c, 0x1010, 0x1114, 0x1214, 0x1310, 0x1414, 0x1510, + 0x1000, 0x1104, 0x1204, 0x1300, 0x1404, 0x1500, 0x1600, 0x1704, + 0x180c, 0x1908, 0x2030, 0x2134, 0x2234, 0x2330, 0x2434, 0x2530, + 0x2020, 0x2124, 0x2224, 0x2320, 0x2424, 0x2520, 0x2620, 0x2724, + 0x282c, 0x2928, 0x3034, 0x3130, 0x3230, 0x3334, 0x3430, 0x3534, + 0x3024, 0x3120, 0x3220, 0x3324, 0x3420, 0x3524, 0x3624, 0x3720, + 0x3828, 0x392c, 0x4010, 0x4114, 0x4214, 0x4310, 0x4414, 0x4510, + 0x4000, 0x4104, 0x4204, 0x4300, 0x4404, 0x4500, 0x4600, 0x4704, + 0x480c, 0x4908, 0x5014, 0x5110, 0x5210, 0x5314, 0x5410, 0x5514, + 0x5004, 0x5100, 0x5200, 0x5304, 0x5400, 0x5504, 0x5604, 0x5700, + 0x5808, 0x590c, 0x6034, 0x6130, 0x6230, 0x6334, 0x6430, 0x6534, + 0x6024, 0x6120, 0x6220, 0x6324, 0x6420, 0x6524, 0x6624, 0x6720, + 0x6828, 0x692c, 0x7030, 0x7134, 0x7234, 0x7330, 0x7434, 0x7530, + 0x7020, 0x7124, 0x7224, 0x7320, 0x7424, 0x7520, 0x7620, 0x7724, + 0x782c, 0x7928, 0x8090, 0x8194, 0x8294, 0x8390, 0x8494, 0x8590, + 0x8080, 0x8184, 0x8284, 0x8380, 0x8484, 0x8580, 0x8680, 0x8784, + 0x888c, 0x8988, 0x9094, 0x9190, 0x9290, 0x9394, 0x9490, 0x9594, + 0x9084, 0x9180, 0x9280, 0x9384, 0x9480, 0x9584, 0x9684, 0x9780, + 0x9888, 0x998c, 0x0055, 0x0111, 0x0211, 0x0315, 0x0411, 0x0515, + 0x0045, 0x0101, 0x0201, 0x0305, 0x0401, 0x0505, 0x0605, 0x0701, + 0x0809, 0x090d, 0x1011, 0x1115, 0x1215, 0x1311, 0x1415, 0x1511, + 0x1001, 0x1105, 0x1205, 0x1301, 0x1405, 0x1501, 0x1601, 0x1705, + 0x180d, 0x1909, 0x2031, 0x2135, 0x2235, 0x2331, 0x2435, 0x2531, + 0x2021, 0x2125, 0x2225, 0x2321, 0x2425, 0x2521, 0x2621, 0x2725, + 0x282d, 0x2929, 0x3035, 0x3131, 0x3231, 0x3335, 0x3431, 0x3535, + 0x3025, 0x3121, 0x3221, 0x3325, 0x3421, 0x3525, 0x3625, 0x3721, + 0x3829, 0x392d, 0x4011, 0x4115, 0x4215, 0x4311, 0x4415, 0x4511, + 0x4001, 0x4105, 0x4205, 0x4301, 0x4405, 0x4501, 0x4601, 0x4705, + 0x480d, 0x4909, 0x5015, 0x5111, 0x5211, 0x5315, 0x5411, 0x5515, + 0x5005, 0x5101, 0x5201, 0x5305, 0x5401, 0x5505, 0x5605, 0x5701, + 0x5809, 0x590d, 0x6035, 0x6131, 0x6231, 0x6335, 0x6431, 0x6535, + 0x6025, 0x6121, 0x6221, 0x6325, 0x6421, 0x6525, 0x6625, 0x6721, + 0x6829, 0x692d, 0x7031, 0x7135, 0x7235, 0x7331, 0x7435, 0x7531, + 0x7021, 0x7125, 0x7225, 0x7321, 0x7425, 0x7521, 0x7621, 0x7725, + 0x782d, 0x7929, 0x8091, 0x8195, 0x8295, 0x8391, 0x8495, 0x8591, + 0x8081, 0x8185, 0x8285, 0x8381, 0x8485, 0x8581, 0x8681, 0x8785, + 0x888d, 0x8989, 0x9095, 0x9191, 0x9291, 0x9395, 0x9491, 0x9595, + 0x9085, 0x9181, 0x9281, 0x9385, 0x9481, 0x9585, 0x9685, 0x9781, + 0x9889, 0x998d, 0xa0b5, 0xa1b1, 0xa2b1, 0xa3b5, 0xa4b1, 0xa5b5, + 0xa0a5, 0xa1a1, 0xa2a1, 0xa3a5, 0xa4a1, 0xa5a5, 0xa6a5, 0xa7a1, + 0xa8a9, 0xa9ad, 0xb0b1, 0xb1b5, 0xb2b5, 0xb3b1, 0xb4b5, 0xb5b1, + 0xb0a1, 0xb1a5, 0xb2a5, 0xb3a1, 0xb4a5, 0xb5a1, 0xb6a1, 0xb7a5, + 0xb8ad, 0xb9a9, 0xc095, 0xc191, 0xc291, 0xc395, 0xc491, 0xc595, + 0xc085, 0xc181, 0xc281, 0xc385, 0xc481, 0xc585, 0xc685, 0xc781, + 0xc889, 0xc98d, 0xd091, 0xd195, 0xd295, 0xd391, 0xd495, 0xd591, + 0xd081, 0xd185, 0xd285, 0xd381, 0xd485, 0xd581, 0xd681, 0xd785, + 0xd88d, 0xd989, 0xe0b1, 0xe1b5, 0xe2b5, 0xe3b1, 0xe4b5, 0xe5b1, + 0xe0a1, 0xe1a5, 0xe2a5, 0xe3a1, 0xe4a5, 0xe5a1, 0xe6a1, 0xe7a5, + 0xe8ad, 0xe9a9, 0xf0b5, 0xf1b1, 0xf2b1, 0xf3b5, 0xf4b1, 0xf5b5, + 0xf0a5, 0xf1a1, 0xf2a1, 0xf3a5, 0xf4a1, 0xf5a5, 0xf6a5, 0xf7a1, + 0xf8a9, 0xf9ad, 0x0055, 0x0111, 0x0211, 0x0315, 0x0411, 0x0515, + 0x0045, 0x0101, 0x0201, 0x0305, 0x0401, 0x0505, 0x0605, 0x0701, + 0x0809, 0x090d, 0x1011, 0x1115, 0x1215, 0x1311, 0x1415, 0x1511, + 0x1001, 0x1105, 0x1205, 0x1301, 0x1405, 0x1501, 0x1601, 0x1705, + 0x180d, 0x1909, 0x2031, 0x2135, 0x2235, 0x2331, 0x2435, 0x2531, + 0x2021, 0x2125, 0x2225, 0x2321, 0x2425, 0x2521, 0x2621, 0x2725, + 0x282d, 0x2929, 0x3035, 0x3131, 0x3231, 0x3335, 0x3431, 0x3535, + 0x3025, 0x3121, 0x3221, 0x3325, 0x3421, 0x3525, 0x3625, 0x3721, + 0x3829, 0x392d, 0x4011, 0x4115, 0x4215, 0x4311, 0x4415, 0x4511, + 0x4001, 0x4105, 0x4205, 0x4301, 0x4405, 0x4501, 0x4601, 0x4705, + 0x480d, 0x4909, 0x5015, 0x5111, 0x5211, 0x5315, 0x5411, 0x5515, + 0x5005, 0x5101, 0x5201, 0x5305, 0x5401, 0x5505, 0x5605, 0x5701, + 0x5809, 0x590d, 0x6035, 0x6131, 0x6231, 0x6335, 0x6431, 0x6535, + 0x0046, 0x0102, 0x0202, 0x0306, 0x0402, 0x0506, 0x0606, 0x0702, + 0x080a, 0x090e, 0x0402, 0x0506, 0x0606, 0x0702, 0x080a, 0x090e, + 0x1002, 0x1106, 0x1206, 0x1302, 0x1406, 0x1502, 0x1602, 0x1706, + 0x180e, 0x190a, 0x1406, 0x1502, 0x1602, 0x1706, 0x180e, 0x190a, + 0x2022, 0x2126, 0x2226, 0x2322, 0x2426, 0x2522, 0x2622, 0x2726, + 0x282e, 0x292a, 0x2426, 0x2522, 0x2622, 0x2726, 0x282e, 0x292a, + 0x3026, 0x3122, 0x3222, 0x3326, 0x3422, 0x3526, 0x3626, 0x3722, + 0x382a, 0x392e, 0x3422, 0x3526, 0x3626, 0x3722, 0x382a, 0x392e, + 0x4002, 0x4106, 0x4206, 0x4302, 0x4406, 0x4502, 0x4602, 0x4706, + 0x480e, 0x490a, 0x4406, 0x4502, 0x4602, 0x4706, 0x480e, 0x490a, + 0x5006, 0x5102, 0x5202, 0x5306, 0x5402, 0x5506, 0x5606, 0x5702, + 0x580a, 0x590e, 0x5402, 0x5506, 0x5606, 0x5702, 0x580a, 0x590e, + 0x6026, 0x6122, 0x6222, 0x6326, 0x6422, 0x6526, 0x6626, 0x6722, + 0x682a, 0x692e, 0x6422, 0x6526, 0x6626, 0x6722, 0x682a, 0x692e, + 0x7022, 0x7126, 0x7226, 0x7322, 0x7426, 0x7522, 0x7622, 0x7726, + 0x782e, 0x792a, 0x7426, 0x7522, 0x7622, 0x7726, 0x782e, 0x792a, + 0x8082, 0x8186, 0x8286, 0x8382, 0x8486, 0x8582, 0x8682, 0x8786, + 0x888e, 0x898a, 0x8486, 0x8582, 0x8682, 0x8786, 0x888e, 0x898a, + 0x9086, 0x9182, 0x9282, 0x9386, 0x9482, 0x9586, 0x9686, 0x9782, + 0x988a, 0x998e, 0x3423, 0x3527, 0x3627, 0x3723, 0x382b, 0x392f, + 0x4003, 0x4107, 0x4207, 0x4303, 0x4407, 0x4503, 0x4603, 0x4707, + 0x480f, 0x490b, 0x4407, 0x4503, 0x4603, 0x4707, 0x480f, 0x490b, + 0x5007, 0x5103, 0x5203, 0x5307, 0x5403, 0x5507, 0x5607, 0x5703, + 0x580b, 0x590f, 0x5403, 0x5507, 0x5607, 0x5703, 0x580b, 0x590f, + 0x6027, 0x6123, 0x6223, 0x6327, 0x6423, 0x6527, 0x6627, 0x6723, + 0x682b, 0x692f, 0x6423, 0x6527, 0x6627, 0x6723, 0x682b, 0x692f, + 0x7023, 0x7127, 0x7227, 0x7323, 0x7427, 0x7523, 0x7623, 0x7727, + 0x782f, 0x792b, 0x7427, 0x7523, 0x7623, 0x7727, 0x782f, 0x792b, + 0x8083, 0x8187, 0x8287, 0x8383, 0x8487, 0x8583, 0x8683, 0x8787, + 0x888f, 0x898b, 0x8487, 0x8583, 0x8683, 0x8787, 0x888f, 0x898b, + 0x9087, 0x9183, 0x9283, 0x9387, 0x9483, 0x9587, 0x9687, 0x9783, + 0x988b, 0x998f, 0x9483, 0x9587, 0x9687, 0x9783, 0x988b, 0x998f, + 0xa0a7, 0xa1a3, 0xa2a3, 0xa3a7, 0xa4a3, 0xa5a7, 0xa6a7, 0xa7a3, + 0xa8ab, 0xa9af, 0xa4a3, 0xa5a7, 0xa6a7, 0xa7a3, 0xa8ab, 0xa9af, + 0xb0a3, 0xb1a7, 0xb2a7, 0xb3a3, 0xb4a7, 0xb5a3, 0xb6a3, 0xb7a7, + 0xb8af, 0xb9ab, 0xb4a7, 0xb5a3, 0xb6a3, 0xb7a7, 0xb8af, 0xb9ab, + 0xc087, 0xc183, 0xc283, 0xc387, 0xc483, 0xc587, 0xc687, 0xc783, + 0xc88b, 0xc98f, 0xc483, 0xc587, 0xc687, 0xc783, 0xc88b, 0xc98f, + 0xd083, 0xd187, 0xd287, 0xd383, 0xd487, 0xd583, 0xd683, 0xd787, + 0xd88f, 0xd98b, 0xd487, 0xd583, 0xd683, 0xd787, 0xd88f, 0xd98b, + 0xe0a3, 0xe1a7, 0xe2a7, 0xe3a3, 0xe4a7, 0xe5a3, 0xe6a3, 0xe7a7, + 0xe8af, 0xe9ab, 0xe4a7, 0xe5a3, 0xe6a3, 0xe7a7, 0xe8af, 0xe9ab, + 0xf0a7, 0xf1a3, 0xf2a3, 0xf3a7, 0xf4a3, 0xf5a7, 0xf6a7, 0xf7a3, + 0xf8ab, 0xf9af, 0xf4a3, 0xf5a7, 0xf6a7, 0xf7a3, 0xf8ab, 0xf9af, + 0x0047, 0x0103, 0x0203, 0x0307, 0x0403, 0x0507, 0x0607, 0x0703, + 0x080b, 0x090f, 0x0403, 0x0507, 0x0607, 0x0703, 0x080b, 0x090f, + 0x1003, 0x1107, 0x1207, 0x1303, 0x1407, 0x1503, 0x1603, 0x1707, + 0x180f, 0x190b, 0x1407, 0x1503, 0x1603, 0x1707, 0x180f, 0x190b, + 0x2023, 0x2127, 0x2227, 0x2323, 0x2427, 0x2523, 0x2623, 0x2727, + 0x282f, 0x292b, 0x2427, 0x2523, 0x2623, 0x2727, 0x282f, 0x292b, + 0x3027, 0x3123, 0x3223, 0x3327, 0x3423, 0x3527, 0x3627, 0x3723, + 0x382b, 0x392f, 0x3423, 0x3527, 0x3627, 0x3723, 0x382b, 0x392f, + 0x4003, 0x4107, 0x4207, 0x4303, 0x4407, 0x4503, 0x4603, 0x4707, + 0x480f, 0x490b, 0x4407, 0x4503, 0x4603, 0x4707, 0x480f, 0x490b, + 0x5007, 0x5103, 0x5203, 0x5307, 0x5403, 0x5507, 0x5607, 0x5703, + 0x580b, 0x590f, 0x5403, 0x5507, 0x5607, 0x5703, 0x580b, 0x590f, + 0x6027, 0x6123, 0x6223, 0x6327, 0x6423, 0x6527, 0x6627, 0x6723, + 0x682b, 0x692f, 0x6423, 0x6527, 0x6627, 0x6723, 0x682b, 0x692f, + 0x7023, 0x7127, 0x7227, 0x7323, 0x7427, 0x7523, 0x7623, 0x7727, + 0x782f, 0x792b, 0x7427, 0x7523, 0x7623, 0x7727, 0x782f, 0x792b, + 0x8083, 0x8187, 0x8287, 0x8383, 0x8487, 0x8583, 0x8683, 0x8787, + 0x888f, 0x898b, 0x8487, 0x8583, 0x8683, 0x8787, 0x888f, 0x898b, + 0x9087, 0x9183, 0x9283, 0x9387, 0x9483, 0x9587, 0x9687, 0x9783, + 0x988b, 0x998f, 0x9483, 0x9587, 0x9687, 0x9783, 0x988b, 0x998f, + 0x0604, 0x0700, 0x0808, 0x090c, 0x0a0c, 0x0b08, 0x0c0c, 0x0d08, + 0x0e08, 0x0f0c, 0x1010, 0x1114, 0x1214, 0x1310, 0x1414, 0x1510, + 0x1600, 0x1704, 0x180c, 0x1908, 0x1a08, 0x1b0c, 0x1c08, 0x1d0c, + 0x1e0c, 0x1f08, 0x2030, 0x2134, 0x2234, 0x2330, 0x2434, 0x2530, + 0x2620, 0x2724, 0x282c, 0x2928, 0x2a28, 0x2b2c, 0x2c28, 0x2d2c, + 0x2e2c, 0x2f28, 0x3034, 0x3130, 0x3230, 0x3334, 0x3430, 0x3534, + 0x3624, 0x3720, 0x3828, 0x392c, 0x3a2c, 0x3b28, 0x3c2c, 0x3d28, + 0x3e28, 0x3f2c, 0x4010, 0x4114, 0x4214, 0x4310, 0x4414, 0x4510, + 0x4600, 0x4704, 0x480c, 0x4908, 0x4a08, 0x4b0c, 0x4c08, 0x4d0c, + 0x4e0c, 0x4f08, 0x5014, 0x5110, 0x5210, 0x5314, 0x5410, 0x5514, + 0x5604, 0x5700, 0x5808, 0x590c, 0x5a0c, 0x5b08, 0x5c0c, 0x5d08, + 0x5e08, 0x5f0c, 0x6034, 0x6130, 0x6230, 0x6334, 0x6430, 0x6534, + 0x6624, 0x6720, 0x6828, 0x692c, 0x6a2c, 0x6b28, 0x6c2c, 0x6d28, + 0x6e28, 0x6f2c, 0x7030, 0x7134, 0x7234, 0x7330, 0x7434, 0x7530, + 0x7620, 0x7724, 0x782c, 0x7928, 0x7a28, 0x7b2c, 0x7c28, 0x7d2c, + 0x7e2c, 0x7f28, 0x8090, 0x8194, 0x8294, 0x8390, 0x8494, 0x8590, + 0x8680, 0x8784, 0x888c, 0x8988, 0x8a88, 0x8b8c, 0x8c88, 0x8d8c, + 0x8e8c, 0x8f88, 0x9094, 0x9190, 0x9290, 0x9394, 0x9490, 0x9594, + 0x9684, 0x9780, 0x9888, 0x998c, 0x9a8c, 0x9b88, 0x9c8c, 0x9d88, + 0x9e88, 0x9f8c, 0x0055, 0x0111, 0x0211, 0x0315, 0x0411, 0x0515, + 0x0605, 0x0701, 0x0809, 0x090d, 0x0a0d, 0x0b09, 0x0c0d, 0x0d09, + 0x0e09, 0x0f0d, 0x1011, 0x1115, 0x1215, 0x1311, 0x1415, 0x1511, + 0x1601, 0x1705, 0x180d, 0x1909, 0x1a09, 0x1b0d, 0x1c09, 0x1d0d, + 0x1e0d, 0x1f09, 0x2031, 0x2135, 0x2235, 0x2331, 0x2435, 0x2531, + 0x2621, 0x2725, 0x282d, 0x2929, 0x2a29, 0x2b2d, 0x2c29, 0x2d2d, + 0x2e2d, 0x2f29, 0x3035, 0x3131, 0x3231, 0x3335, 0x3431, 0x3535, + 0x3625, 0x3721, 0x3829, 0x392d, 0x3a2d, 0x3b29, 0x3c2d, 0x3d29, + 0x3e29, 0x3f2d, 0x4011, 0x4115, 0x4215, 0x4311, 0x4415, 0x4511, + 0x4601, 0x4705, 0x480d, 0x4909, 0x4a09, 0x4b0d, 0x4c09, 0x4d0d, + 0x4e0d, 0x4f09, 0x5015, 0x5111, 0x5211, 0x5315, 0x5411, 0x5515, + 0x5605, 0x5701, 0x5809, 0x590d, 0x5a0d, 0x5b09, 0x5c0d, 0x5d09, + 0x5e09, 0x5f0d, 0x6035, 0x6131, 0x6231, 0x6335, 0x6431, 0x6535, + 0x6625, 0x6721, 0x6829, 0x692d, 0x6a2d, 0x6b29, 0x6c2d, 0x6d29, + 0x6e29, 0x6f2d, 0x7031, 0x7135, 0x7235, 0x7331, 0x7435, 0x7531, + 0x7621, 0x7725, 0x782d, 0x7929, 0x7a29, 0x7b2d, 0x7c29, 0x7d2d, + 0x7e2d, 0x7f29, 0x8091, 0x8195, 0x8295, 0x8391, 0x8495, 0x8591, + 0x8681, 0x8785, 0x888d, 0x8989, 0x8a89, 0x8b8d, 0x8c89, 0x8d8d, + 0x8e8d, 0x8f89, 0x9095, 0x9191, 0x9291, 0x9395, 0x9491, 0x9595, + 0x9685, 0x9781, 0x9889, 0x998d, 0x9a8d, 0x9b89, 0x9c8d, 0x9d89, + 0x9e89, 0x9f8d, 0xa0b5, 0xa1b1, 0xa2b1, 0xa3b5, 0xa4b1, 0xa5b5, + 0xa6a5, 0xa7a1, 0xa8a9, 0xa9ad, 0xaaad, 0xaba9, 0xacad, 0xada9, + 0xaea9, 0xafad, 0xb0b1, 0xb1b5, 0xb2b5, 0xb3b1, 0xb4b5, 0xb5b1, + 0xb6a1, 0xb7a5, 0xb8ad, 0xb9a9, 0xbaa9, 0xbbad, 0xbca9, 0xbdad, + 0xbead, 0xbfa9, 0xc095, 0xc191, 0xc291, 0xc395, 0xc491, 0xc595, + 0xc685, 0xc781, 0xc889, 0xc98d, 0xca8d, 0xcb89, 0xcc8d, 0xcd89, + 0xce89, 0xcf8d, 0xd091, 0xd195, 0xd295, 0xd391, 0xd495, 0xd591, + 0xd681, 0xd785, 0xd88d, 0xd989, 0xda89, 0xdb8d, 0xdc89, 0xdd8d, + 0xde8d, 0xdf89, 0xe0b1, 0xe1b5, 0xe2b5, 0xe3b1, 0xe4b5, 0xe5b1, + 0xe6a1, 0xe7a5, 0xe8ad, 0xe9a9, 0xeaa9, 0xebad, 0xeca9, 0xedad, + 0xeead, 0xefa9, 0xf0b5, 0xf1b1, 0xf2b1, 0xf3b5, 0xf4b1, 0xf5b5, + 0xf6a5, 0xf7a1, 0xf8a9, 0xf9ad, 0xfaad, 0xfba9, 0xfcad, 0xfda9, + 0xfea9, 0xffad, 0x0055, 0x0111, 0x0211, 0x0315, 0x0411, 0x0515, + 0x0605, 0x0701, 0x0809, 0x090d, 0x0a0d, 0x0b09, 0x0c0d, 0x0d09, + 0x0e09, 0x0f0d, 0x1011, 0x1115, 0x1215, 0x1311, 0x1415, 0x1511, + 0x1601, 0x1705, 0x180d, 0x1909, 0x1a09, 0x1b0d, 0x1c09, 0x1d0d, + 0x1e0d, 0x1f09, 0x2031, 0x2135, 0x2235, 0x2331, 0x2435, 0x2531, + 0x2621, 0x2725, 0x282d, 0x2929, 0x2a29, 0x2b2d, 0x2c29, 0x2d2d, + 0x2e2d, 0x2f29, 0x3035, 0x3131, 0x3231, 0x3335, 0x3431, 0x3535, + 0x3625, 0x3721, 0x3829, 0x392d, 0x3a2d, 0x3b29, 0x3c2d, 0x3d29, + 0x3e29, 0x3f2d, 0x4011, 0x4115, 0x4215, 0x4311, 0x4415, 0x4511, + 0x4601, 0x4705, 0x480d, 0x4909, 0x4a09, 0x4b0d, 0x4c09, 0x4d0d, + 0x4e0d, 0x4f09, 0x5015, 0x5111, 0x5211, 0x5315, 0x5411, 0x5515, + 0x5605, 0x5701, 0x5809, 0x590d, 0x5a0d, 0x5b09, 0x5c0d, 0x5d09, + 0x5e09, 0x5f0d, 0x6035, 0x6131, 0x6231, 0x6335, 0x6431, 0x6535, + 0xfabe, 0xfbba, 0xfcbe, 0xfdba, 0xfeba, 0xffbe, 0x0046, 0x0102, + 0x0202, 0x0306, 0x0402, 0x0506, 0x0606, 0x0702, 0x080a, 0x090e, + 0x0a1e, 0x0b1a, 0x0c1e, 0x0d1a, 0x0e1a, 0x0f1e, 0x1002, 0x1106, + 0x1206, 0x1302, 0x1406, 0x1502, 0x1602, 0x1706, 0x180e, 0x190a, + 0x1a1a, 0x1b1e, 0x1c1a, 0x1d1e, 0x1e1e, 0x1f1a, 0x2022, 0x2126, + 0x2226, 0x2322, 0x2426, 0x2522, 0x2622, 0x2726, 0x282e, 0x292a, + 0x2a3a, 0x2b3e, 0x2c3a, 0x2d3e, 0x2e3e, 0x2f3a, 0x3026, 0x3122, + 0x3222, 0x3326, 0x3422, 0x3526, 0x3626, 0x3722, 0x382a, 0x392e, + 0x3a3e, 0x3b3a, 0x3c3e, 0x3d3a, 0x3e3a, 0x3f3e, 0x4002, 0x4106, + 0x4206, 0x4302, 0x4406, 0x4502, 0x4602, 0x4706, 0x480e, 0x490a, + 0x4a1a, 0x4b1e, 0x4c1a, 0x4d1e, 0x4e1e, 0x4f1a, 0x5006, 0x5102, + 0x5202, 0x5306, 0x5402, 0x5506, 0x5606, 0x5702, 0x580a, 0x590e, + 0x5a1e, 0x5b1a, 0x5c1e, 0x5d1a, 0x5e1a, 0x5f1e, 0x6026, 0x6122, + 0x6222, 0x6326, 0x6422, 0x6526, 0x6626, 0x6722, 0x682a, 0x692e, + 0x6a3e, 0x6b3a, 0x6c3e, 0x6d3a, 0x6e3a, 0x6f3e, 0x7022, 0x7126, + 0x7226, 0x7322, 0x7426, 0x7522, 0x7622, 0x7726, 0x782e, 0x792a, + 0x7a3a, 0x7b3e, 0x7c3a, 0x7d3e, 0x7e3e, 0x7f3a, 0x8082, 0x8186, + 0x8286, 0x8382, 0x8486, 0x8582, 0x8682, 0x8786, 0x888e, 0x898a, + 0x8a9a, 0x8b9e, 0x8c9a, 0x8d9e, 0x8e9e, 0x8f9a, 0x9086, 0x9182, + 0x9282, 0x9386, 0x3423, 0x3527, 0x3627, 0x3723, 0x382b, 0x392f, + 0x3a3f, 0x3b3b, 0x3c3f, 0x3d3b, 0x3e3b, 0x3f3f, 0x4003, 0x4107, + 0x4207, 0x4303, 0x4407, 0x4503, 0x4603, 0x4707, 0x480f, 0x490b, + 0x4a1b, 0x4b1f, 0x4c1b, 0x4d1f, 0x4e1f, 0x4f1b, 0x5007, 0x5103, + 0x5203, 0x5307, 0x5403, 0x5507, 0x5607, 0x5703, 0x580b, 0x590f, + 0x5a1f, 0x5b1b, 0x5c1f, 0x5d1b, 0x5e1b, 0x5f1f, 0x6027, 0x6123, + 0x6223, 0x6327, 0x6423, 0x6527, 0x6627, 0x6723, 0x682b, 0x692f, + 0x6a3f, 0x6b3b, 0x6c3f, 0x6d3b, 0x6e3b, 0x6f3f, 0x7023, 0x7127, + 0x7227, 0x7323, 0x7427, 0x7523, 0x7623, 0x7727, 0x782f, 0x792b, + 0x7a3b, 0x7b3f, 0x7c3b, 0x7d3f, 0x7e3f, 0x7f3b, 0x8083, 0x8187, + 0x8287, 0x8383, 0x8487, 0x8583, 0x8683, 0x8787, 0x888f, 0x898b, + 0x8a9b, 0x8b9f, 0x8c9b, 0x8d9f, 0x8e9f, 0x8f9b, 0x9087, 0x9183, + 0x9283, 0x9387, 0x9483, 0x9587, 0x9687, 0x9783, 0x988b, 0x998f, + 0x9a9f, 0x9b9b, 0x9c9f, 0x9d9b, 0x9e9b, 0x9f9f, 0xa0a7, 0xa1a3, + 0xa2a3, 0xa3a7, 0xa4a3, 0xa5a7, 0xa6a7, 0xa7a3, 0xa8ab, 0xa9af, + 0xaabf, 0xabbb, 0xacbf, 0xadbb, 0xaebb, 0xafbf, 0xb0a3, 0xb1a7, + 0xb2a7, 0xb3a3, 0xb4a7, 0xb5a3, 0xb6a3, 0xb7a7, 0xb8af, 0xb9ab, + 0xbabb, 0xbbbf, 0xbcbb, 0xbdbf, 0xbebf, 0xbfbb, 0xc087, 0xc183, + 0xc283, 0xc387, 0xc483, 0xc587, 0xc687, 0xc783, 0xc88b, 0xc98f, + 0xca9f, 0xcb9b, 0xcc9f, 0xcd9b, 0xce9b, 0xcf9f, 0xd083, 0xd187, + 0xd287, 0xd383, 0xd487, 0xd583, 0xd683, 0xd787, 0xd88f, 0xd98b, + 0xda9b, 0xdb9f, 0xdc9b, 0xdd9f, 0xde9f, 0xdf9b, 0xe0a3, 0xe1a7, + 0xe2a7, 0xe3a3, 0xe4a7, 0xe5a3, 0xe6a3, 0xe7a7, 0xe8af, 0xe9ab, + 0xeabb, 0xebbf, 0xecbb, 0xedbf, 0xeebf, 0xefbb, 0xf0a7, 0xf1a3, + 0xf2a3, 0xf3a7, 0xf4a3, 0xf5a7, 0xf6a7, 0xf7a3, 0xf8ab, 0xf9af, + 0xfabf, 0xfbbb, 0xfcbf, 0xfdbb, 0xfebb, 0xffbf, 0x0047, 0x0103, + 0x0203, 0x0307, 0x0403, 0x0507, 0x0607, 0x0703, 0x080b, 0x090f, + 0x0a1f, 0x0b1b, 0x0c1f, 0x0d1b, 0x0e1b, 0x0f1f, 0x1003, 0x1107, + 0x1207, 0x1303, 0x1407, 0x1503, 0x1603, 0x1707, 0x180f, 0x190b, + 0x1a1b, 0x1b1f, 0x1c1b, 0x1d1f, 0x1e1f, 0x1f1b, 0x2023, 0x2127, + 0x2227, 0x2323, 0x2427, 0x2523, 0x2623, 0x2727, 0x282f, 0x292b, + 0x2a3b, 0x2b3f, 0x2c3b, 0x2d3f, 0x2e3f, 0x2f3b, 0x3027, 0x3123, + 0x3223, 0x3327, 0x3423, 0x3527, 0x3627, 0x3723, 0x382b, 0x392f, + 0x3a3f, 0x3b3b, 0x3c3f, 0x3d3b, 0x3e3b, 0x3f3f, 0x4003, 0x4107, + 0x4207, 0x4303, 0x4407, 0x4503, 0x4603, 0x4707, 0x480f, 0x490b, + 0x4a1b, 0x4b1f, 0x4c1b, 0x4d1f, 0x4e1f, 0x4f1b, 0x5007, 0x5103, + 0x5203, 0x5307, 0x5403, 0x5507, 0x5607, 0x5703, 0x580b, 0x590f, + 0x5a1f, 0x5b1b, 0x5c1f, 0x5d1b, 0x5e1b, 0x5f1f, 0x6027, 0x6123, + 0x6223, 0x6327, 0x6423, 0x6527, 0x6627, 0x6723, 0x682b, 0x692f, + 0x6a3f, 0x6b3b, 0x6c3f, 0x6d3b, 0x6e3b, 0x6f3f, 0x7023, 0x7127, + 0x7227, 0x7323, 0x7427, 0x7523, 0x7623, 0x7727, 0x782f, 0x792b, + 0x7a3b, 0x7b3f, 0x7c3b, 0x7d3f, 0x7e3f, 0x7f3b, 0x8083, 0x8187, + 0x8287, 0x8383, 0x8487, 0x8583, 0x8683, 0x8787, 0x888f, 0x898b, + 0x8a9b, 0x8b9f, 0x8c9b, 0x8d9f, 0x8e9f, 0x8f9b, 0x9087, 0x9183, + 0x9283, 0x9387, 0x9483, 0x9587, 0x9687, 0x9783, 0x988b, 0x998f +}; diff --git a/tool/tilem-src/emu/z80ddfd.h b/tool/tilem-src/emu/z80ddfd.h new file mode 100644 index 0000000..63288f6 --- /dev/null +++ b/tool/tilem-src/emu/z80ddfd.h @@ -0,0 +1,343 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2009 Benjamin Moody + * + * 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, see + * . + */ + +#ifdef PREFIX_DD +# define RegH IXh +# define RegL IXl +# define RegHL IX +#else +# define RegH IYh +# define RegL IYl +# define RegHL IY +#endif + +switch (op) { + case 0x09: /* ADD IX, BC */ + WZ = RegHL + 1; + add16(RegHL, BC); + delay(11); + break; + case 0x19: /* ADD IX, DE */ + WZ = RegHL + 1; + add16(RegHL, DE); + delay(11); + break; + case 0x21: /* LD IX, nn */ + RegHL = readw(PC); + PC += 2; + delay(10); + break; + case 0x22: /* LD (nn), IX */ + WZ = readw(PC); + PC += 2; + writeb(WZ, RegL); + WZ++; + writeb(WZ, RegH); + delay(16); + break; + case 0x23: /* INC IX */ + RegHL++; + delay(6); + break; + case 0x24: /* INC IXH */ + UNDOCUMENTED(4); + inc(RegH); + delay(4); + break; + case 0x25: /* DEC IXH */ + UNDOCUMENTED(4); + dec(RegH); + delay(4); + break; + case 0x26: /* LD IXH, n */ + UNDOCUMENTED(4); + RegH = readb(PC++); + delay(7); + break; + case 0x29: /* ADD IX, IX */ + WZ = RegHL + 1; + add16(RegHL, RegHL); + delay(11); + break; + case 0x2A: /* LD IX, (nn) */ + WZ = readw(PC); + PC += 2; + RegL = readb(WZ); + WZ++; + RegH = readb(WZ); + delay(16); + break; + case 0x2B: /* DEC IX */ + RegHL--; + delay(6); + break; + case 0x2C: /* INC IXL */ + UNDOCUMENTED(4); + inc(RegL); + delay(4); + break; + case 0x2D: /* DEC IXL */ + UNDOCUMENTED(4); + dec(RegL); + delay(4); + break; + case 0x2E: /* LD IXL,n */ + UNDOCUMENTED(4); + RegL = readb(PC++); + delay(7); + break; + + case 0x34: /* INC (IX + n) */ + offs = (int) (signed char) readb(PC++); + WZ = RegHL + offs; + tmp1 = readb(WZ); + inc(tmp1); + writeb(WZ, tmp1); + delay(19); + break; + case 0x35: /* DEC (IX + n) */ + offs = (int) (signed char) readb(PC++); + WZ = RegHL + offs; + tmp1 = readb(WZ); + dec(tmp1); + writeb(WZ, tmp1); + delay(19); + break; + case 0x36: /* LD (IX + n), n */ + offs = (int) (signed char) readb(PC++); + writeb(RegHL + offs, readb(PC++)); + delay(15); /* Yes, really! */ + break; + + case 0x39: /* ADD IX, SP */ + WZ = RegHL + 1; + add16(RegHL, SP); + delay(11); + break; + + case 0x44: UNDOCUMENTED(4); B = RegH; delay(4); break; + case 0x45: UNDOCUMENTED(4); B = RegL; delay(4); break; + case 0x46: + offs = (int) (signed char) readb(PC++); + B = readb(RegHL + offs); + delay(15); + break; + + case 0x4C: UNDOCUMENTED(4); C = RegH; delay(4); break; + case 0x4D: UNDOCUMENTED(4); C = RegL; delay(4); break; + case 0x4E: + offs = (int) (signed char) readb(PC++); + C = readb(RegHL + offs); + delay(15); + break; + + case 0x54: UNDOCUMENTED(4); D = RegH; delay(4); break; + case 0x55: UNDOCUMENTED(4); D = RegL; delay(4); break; + case 0x56: + offs = (int) (signed char) readb(PC++); + D = readb(RegHL + offs); + delay(15); + break; + + case 0x5C: UNDOCUMENTED(4); E = RegH; delay(4); break; + case 0x5D: UNDOCUMENTED(4); E = RegL; delay(4); break; + case 0x5E: + offs = (int) (signed char) readb(PC++); + E = readb(RegHL + offs); + delay(15); + break; + + case 0x60: UNDOCUMENTED(4); RegH = B; delay(4); break; + case 0x61: UNDOCUMENTED(4); RegH = C; delay(4); break; + case 0x62: UNDOCUMENTED(4); RegH = D; delay(4); break; + case 0x63: UNDOCUMENTED(4); RegH = E; delay(4); break; + case 0x64: UNDOCUMENTED(4); RegH = RegH; delay(4); break; + case 0x65: UNDOCUMENTED(4); RegH = RegL; delay(4); break; + case 0x66: + offs = (int) (signed char) readb(PC++); + H = readb(RegHL + offs); + delay(15); + break; + case 0x67: UNDOCUMENTED(4); RegH = A; delay(4); break; + + case 0x68: UNDOCUMENTED(4); RegL = B; delay(4); break; + case 0x69: UNDOCUMENTED(4); RegL = C; delay(4); break; + case 0x6A: UNDOCUMENTED(4); RegL = D; delay(4); break; + case 0x6B: UNDOCUMENTED(4); RegL = E; delay(4); break; + case 0x6C: UNDOCUMENTED(4); RegL = RegH; delay(4); break; + case 0x6D: UNDOCUMENTED(4); RegL = RegL; delay(4); break; + case 0x6E: + offs = (int) (signed char) readb(PC++); + L = readb(RegHL + offs); + delay(15); + break; + case 0x6F: UNDOCUMENTED(4); RegL = A; delay(4); break; + + case 0x70: + offs = (int) (signed char) readb(PC++); + writeb(RegHL + offs, B); + delay(15); + break; + case 0x71: + offs = (int) (signed char) readb(PC++); + writeb(RegHL + offs, C); + delay(15); + break; + case 0x72: + offs = (int) (signed char) readb(PC++); + writeb(RegHL + offs, D); + delay(15); + break; + case 0x73: + offs = (int) (signed char) readb(PC++); + writeb(RegHL + offs, E); + delay(15); + break; + case 0x74: + offs = (int) (signed char) readb(PC++); + writeb(RegHL + offs, H); + delay(15); + break; + case 0x75: + offs = (int) (signed char) readb(PC++); + writeb(RegHL + offs, L); + delay(15); + break; + case 0x77: + offs = (int) (signed char) readb(PC++); + writeb(RegHL + offs, A); + delay(15); + break; + + case 0x7C: UNDOCUMENTED(4); A = RegH; delay(4); break; + case 0x7D: UNDOCUMENTED(4); A = RegL; delay(4); break; + case 0x7E: + offs = (int) (signed char) readb(PC++); + A = readb(RegHL + offs); + delay(15); + break; + + case 0x84: UNDOCUMENTED(4); add8(A, RegH); delay(4); break; + case 0x85: UNDOCUMENTED(4); add8(A, RegL); delay(4); break; + case 0x86: + offs = (int) (signed char) readb(PC++); + add8(A, readb(RegHL + offs)); + delay(7); + break; + + case 0x8C: UNDOCUMENTED(4); adc8(A, RegH); delay(4); break; + case 0x8D: UNDOCUMENTED(4); adc8(A, RegL); delay(4); break; + case 0x8E: + offs = (int) (signed char) readb(PC++); + adc8(A, readb(RegHL + offs)); + delay(15); + break; + + case 0x94: UNDOCUMENTED(4); sub8(A, RegH); delay(4); break; + case 0x95: UNDOCUMENTED(4); sub8(A, RegL); delay(4); break; + case 0x96: + offs = (int) (signed char) readb(PC++); + sub8(A, readb(RegHL + offs)); + delay(15); + break; + + case 0x9C: UNDOCUMENTED(4); sbc8(A, RegH); delay(4); break; + case 0x9D: UNDOCUMENTED(4); sbc8(A, RegL); delay(4); break; + case 0x9E: + offs = (int) (signed char) readb(PC++); + sbc8(A, readb(RegHL + offs)); + delay(15); + break; + + case 0xA4: UNDOCUMENTED(4); and(A, RegH); delay(4); break; + case 0xA5: UNDOCUMENTED(4); and(A, RegL); delay(4); break; + case 0xA6: + offs = (int) (signed char) readb(PC++); + and(A, readb(RegHL + offs)); + delay(15); + break; + + case 0xAC: UNDOCUMENTED(4); xor(A, RegH); delay(4); break; + case 0xAD: UNDOCUMENTED(4); xor(A, RegL); delay(4); break; + case 0xAE: + offs = (int) (signed char) readb(PC++); + xor(A, readb(RegHL + offs)); + delay(15); + break; + + case 0xB4: UNDOCUMENTED(4); or(A, RegH); delay(4); break; + case 0xB5: UNDOCUMENTED(4); or(A, RegL); delay(4); break; + case 0xB6: + offs = (int) (signed char) readb(PC++); + or(A, readb(RegHL + offs)); + delay(15); + break; + + case 0xBC: UNDOCUMENTED(4); cp(A, RegH); delay(4); break; + case 0xBD: UNDOCUMENTED(4); cp(A, RegL); delay(4); break; + case 0xBE: + offs = (int) (signed char) readb(PC++); + cp(A, readb(RegHL + offs)); + delay(15); + break; + + case 0xCB: + offs = (int) (signed char) readb(PC++); + WZ = RegHL + offs; + op = readb(PC++); +#ifdef PREFIX_DD + goto opcode_ddcb; +#else + goto opcode_fdcb; +#endif + + case 0xE1: /* POP IX */ + pop(RegHL); + delay(10); + break; + case 0xE3: /* EX (SP), IX */ + WZ = readw(SP); + writew(SP, RegHL); + RegHL = WZ; + delay(19); + break; + case 0xE5: /* PUSH IX */ + push(RegHL); + delay(11); + break; + + case 0xE9: /* JP IX */ + PC = RegHL; + delay(4); + break; + + case 0xF9: /* LD SP, IX */ + SP = RegHL; + delay(4); + break; + + default: + goto opcode_main; + } + +#undef RegH +#undef RegL +#undef RegHL + diff --git a/tool/tilem-src/emu/z80ed.h b/tool/tilem-src/emu/z80ed.h new file mode 100644 index 0000000..930bf63 --- /dev/null +++ b/tool/tilem-src/emu/z80ed.h @@ -0,0 +1,457 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2009 Benjamin Moody + * + * 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, see + * . + */ + +switch (op) { + case 0x40: /* IN B, (C) */ + WZ = BC; + delay(12); + in(B); + break; + case 0x41: /* OUT (C), B */ + delay(12); + output(BC, B); + break; + case 0x42: /* SBC HL, BC */ + WZ = HL + 1; + sbc16(HLw, BCw); + delay(15); + break; + case 0x43: /* LD (nn), BC */ + WZ = readw(PC); + PC += 2; + writew(WZ++, BC); + delay(20); + break; + case 0x44: /* NEG */ + neg(A); + delay(8); + break; + case 0x45: /* RETN */ + IFF1 = IFF2; + pop(PC); + delay(14); + break; + case 0x46: /* IM 0 */ + IM = 0; + delay(8); + break; + case 0x47: /* LD I,A */ + I = A; + delay(9); + break; + + case 0x48: /* IN C, (C) */ + WZ = BC; + delay(12); + in(C); + break; + case 0x49: /* OUT (C), C */ + delay(12); + output(BC, C); + break; + case 0x4A: /* ADC HL, BC */ + WZ = HL + 1; + adc16(HLw, BCw); + delay(15); + break; + case 0x4B: /* LD BC, (nn) */ + WZ = readw(PC); + PC += 2; + BC = readw(WZ++); + delay(20); + break; + case 0x4C: /* NEG */ + UNDOCUMENTED(8); + neg(A); + delay(8); + break; + case 0x4D: /* RETI */ + IFF1 = IFF2; + pop(PC); + delay(14); + break; + case 0x4E: /* IM 0 */ + UNDOCUMENTED(8); + IM = 0; + delay(8); + break; + case 0x4F: /* LD R,A */ + Rl = A; + Rh = A & 0x80; + delay(9); + break; + + case 0x50: /* IN D, (C) */ + WZ = BC; + delay(12); + in(D); + break; + case 0x51: /* OUT (C), D */ + delay(12); + output(BC, D); + break; + case 0x52: /* SBC HL, DE */ + WZ = HL + 1; + sbc16(HLw, DEw); + delay(15); + break; + case 0x53: /* LD (nn), DE */ + WZ = readw(PC); + PC += 2; + writew(WZ++, DE); + delay(20); + break; + case 0x54: /* NEG */ + UNDOCUMENTED(8); + neg(A); + delay(8); + break; + case 0x55: /* RETN */ + UNDOCUMENTED(8); + IFF1 = IFF2; + pop(PC); + delay(14); + break; + case 0x56: /* IM 1 */ + IM = 1; + delay(8); + break; + case 0x57: /* LD A,I */ + ld_a_ir(I); + delay(9); + break; + + case 0x58: /* IN E, (C) */ + WZ = BC; + delay(12); + in(E); + break; + case 0x59: /* OUT (C), E */ + delay(12); + output(BC, E); + break; + case 0x5A: /* ADC HL, DE */ + WZ = HL + 1; + adc16(HLw, DEw); + delay(15); + break; + case 0x5B: /* LD DE, (nn) */ + WZ = readw(PC); + PC += 2; + DE = readw(WZ++); + delay(20); + break; + case 0x5C: /* NEG */ + UNDOCUMENTED(8); + neg(A); + delay(8); + break; + case 0x5D: /* RETN */ + UNDOCUMENTED(8); + IFF1 = IFF2; + pop(PC); + delay(14); + break; + case 0x5E: /* IM 2 */ + IM = 2; + delay(8); + break; + case 0x5F: /* LD A,R */ + ld_a_ir(R); + delay(9); + break; + + case 0x60: /* IN H, (C) */ + WZ = BC; + delay(12); + in(H); + break; + case 0x61: /* OUT (C), H */ + delay(12); + output(BC, H); + break; + case 0x62: /* SBC HL, HL */ + WZ = HL + 1; + sbc16(HLw, HLw); + delay(15); + break; + case 0x63: /* LD (nn), HL */ + WZ = readw(PC); + PC += 2; + writew(WZ++, HL); + delay(20); + break; + case 0x64: /* NEG */ + UNDOCUMENTED(8); + neg(A); + delay(8); + break; + case 0x65: /* RETN */ + UNDOCUMENTED(8); + IFF1 = IFF2; + pop(PC); + delay(14); + break; + case 0x66: /* IM 0 */ + UNDOCUMENTED(8); + IM = 0; + delay(8); + break; + case 0x67: /* RRD */ + rrd; + delay(18); + break; + + case 0x68: /* IN L, (C) */ + WZ = BC; + delay(12); + in(L); + break; + case 0x69: /* OUT (C), L */ + delay(12); + output(BC, L); + break; + case 0x6A: /* ADC HL, HL */ + WZ = HL + 1; + adc16(HLw, HLw); + delay(15); + break; + case 0x6B: /* LD HL, (nn) */ + WZ = readw(PC); + PC += 2; + HL = readw(WZ++); + delay(20); + break; + case 0x6C: /* NEG */ + UNDOCUMENTED(8); + neg(A); + delay(8); + break; + case 0x6D: /* RETN */ + UNDOCUMENTED(8); + IFF1 = IFF2; + pop(PC); + delay(14); + break; + case 0x6E: /* IM 0 */ + UNDOCUMENTED(8); + IM = 0; + delay(8); + break; + case 0x6F: /* RLD */ + rld; + delay(18); + break; + + case 0x70: /* IN (C) */ + UNDOCUMENTED(8); + WZ = BC; + delay(12); + in(tmp1); + break; + case 0x71: /* OUT (C), 0 */ + UNDOCUMENTED(8); + delay(12); + output(BC, 0); + break; + case 0x72: /* SBC HL, SP */ + WZ = HL + 1; + sbc16(HLw, SPw); + delay(15); + break; + case 0x73: /* LD (nn), SP */ + WZ = readw(PC); + PC += 2; + writew(WZ++, SP); + delay(20); + break; + case 0x74: /* NEG */ + UNDOCUMENTED(8); + neg(A); + delay(8); + break; + case 0x75: /* RETN */ + UNDOCUMENTED(8); + IFF1 = IFF2; + pop(PC); + delay(14); + break; + case 0x76: /* IM 1 */ + UNDOCUMENTED(8); + IM = 1; + delay(8); + break; + + case 0x78: /* IN A, (C) */ + WZ = BC; + delay(12); + in(A); + break; + case 0x79: /* OUT (C), A */ + delay(12); + output(BC, A); + break; + case 0x7A: /* ADC HL, SP */ + WZ = HL + 1; + adc16(HLw, SPw); + delay(15); + break; + case 0x7B: /* LD SP, (nn) */ + WZ = readw(PC); + PC += 2; + SP = readw(WZ); + WZ++; + delay(20); + break; + case 0x7C: /* NEG */ + UNDOCUMENTED(8); + neg(A); + delay(8); + break; + case 0x7D: /* RETN */ + UNDOCUMENTED(8); + IFF1 = IFF2; + pop(PC); + delay(14); + break; + case 0x7E: /* IM 2 */ + UNDOCUMENTED(8); + IM = 2; + delay(8); + break; + + case 0xA0: /* LDI */ + ldi; + delay(16); + break; + case 0xA1: /* CPI */ + cpi; + delay(16); + break; + case 0xA2: /* INI */ + delay(13); + ini; + delay(3); + break; + case 0xA3: /* OUTI */ + delay(16); + outi; + break; + + case 0xA8: /* LDD */ + ldd; + delay(16); + break; + case 0xA9: /* CPD */ + cpd; + delay(16); + break; + case 0xAA: /* IND */ + delay(13); + ind; + delay(3); + break; + case 0xAB: /* OUTD */ + delay(16); + outd; + break; + + case 0xB0: /* LDIR */ + ldi; + if (BCw) { + PC -= 2; + delay(21); + } + else + delay(16); + break; + case 0xB1: /* CPIR */ + cpi; + if (BCw && !(F & FLAG_Z)) { + PC -= 2; + delay(21); + } + else + delay(16); + break; + case 0xB2: /* INIR */ + delay(13); + ini; + if (B) { + PC -= 2; + delay(8); + } + else + delay(3); + break; + case 0xB3: /* OTIR */ + delay(16); + outi; + if (B) { + PC -= 2; + delay(5); + } + break; + + case 0xB8: /* LDDR */ + ldd; + if (BCw) { + PC -= 2; + delay(21); + } + else + delay(16); + break; + case 0xB9: /* CPDR */ + cpd; + if (BCw && !(F & FLAG_Z)) { + PC -= 2; + delay(21); + } + else + delay(16); + break; + case 0xBA: /* INDR */ + delay(13); + ind; + if (B) { + PC -= 2; + delay(8); + } + else + delay(3); + break; + case 0xBB: /* OTDR */ + delay(16); + outd; + if (B) { + PC -= 2; + delay(5); + } + break; + + default: + delay(8); + if (calc->hw.z80_instr) + (*calc->hw.z80_instr)(calc, 0xed00 | op); + else if (calc->z80.emuflags & TILEM_Z80_BREAK_INVALID) + tilem_z80_stop(calc, TILEM_STOP_INVALID_INST); + break; + } diff --git a/tool/tilem-src/emu/z80main.h b/tool/tilem-src/emu/z80main.h new file mode 100644 index 0000000..26d83e7 --- /dev/null +++ b/tool/tilem-src/emu/z80main.h @@ -0,0 +1,893 @@ +/* + * libtilemcore - Graphing calculator emulation library + * + * Copyright (C) 2009 Benjamin Moody + * + * 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, see + * . + */ + +switch (op) { + case 0x00: /* NOP */ + delay(4); + break; + case 0x01: /* LD BC, nn */ + BC = readw(PC); + PC += 2; + delay(10); + break; + case 0x02: /* LD (BC), A */ + W = A; + writeb(BC, A); + delay(7); + break; + case 0x03: /* INC BC */ + BC++; + delay(6); + break; + case 0x04: /* INC B */ + inc(B); + delay(4); + break; + case 0x05: /* DEC B */ + dec(B); + delay(4); + break; + case 0x06: /* LD B, n */ + B = readb(PC++); + delay(7); + break; + case 0x07: /* RLCA */ + rlca; + delay(4); + break; + + case 0x08: /* EX AF, AF' */ + ex(AF, AF2); + delay(4); + break; + case 0x09: /* ADD HL, BC */ + WZ = HL + 1; + add16(HLw, BCw); + delay(11); + break; + case 0x0A: /* LD A, (BC) */ + WZ = BC; + A = readb(WZ++); + delay(7); + break; + case 0x0B: /* DEC BC */ + BC--; + delay(6); + break; + case 0x0C: /* INC C */ + inc(C); + delay(4); + break; + case 0x0D: /* DEC C */ + dec(C); + delay(4); + break; + case 0x0E: /* LD C, n */ + C = readb(PC++); + delay(7); + break; + case 0x0F: /* RRCA */ + rrca; + delay(4); + break; + + case 0x10: /* DJNZ $+n */ + offs = (int) (signed char) readb(PC++); + B--; + if (B) { + WZ = PC + offs; + PC = WZ; + delay(13); + } + else + delay(8); + break; + case 0x11: /* LD DE, nn */ + DE = readw(PC); + PC += 2; + delay(10); + break; + case 0x12: /* LD (DE), A */ + W = A; + writeb(DE, A); + delay(7); + break; + case 0x13: /* INC DE */ + DE++; + delay(6); + break; + case 0x14: /* INC D */ + inc(D); + delay(4); + break; + case 0x15: /* DEC D */ + dec(D); + delay(4); + break; + case 0x16: /* LD D, n */ + D = readb(PC++); + delay(7); + break; + case 0x17: /* RLA */ + rla; + delay(4); + break; + + case 0x18: /* JR $+n */ + offs = (int) (signed char) readb(PC++); + WZ = PC + offs; + PC = WZ; + delay(12); + break; + case 0x19: /* ADD HL, DE */ + WZ = HL + 1; + add16(HLw, DEw); + delay(11); + break; + case 0x1A: /* LD A, (DE) */ + WZ = DE; + A = readb(WZ++); + delay(7); + break; + case 0x1B: /* DEC DE */ + DE--; + delay(6); + break; + case 0x1C: /* INC E */ + inc(E); + delay(4); + break; + case 0x1D: /* DEC E */ + dec(E); + delay(4); + break; + case 0x1E: /* LD E, n */ + E = readb(PC++); + delay(7); + break; + case 0x1F: /* RRA */ + rra; + delay(4); + break; + + case 0x20: /* JR NZ, $+n */ + offs = (int) (signed char) readb(PC++); + if (!(F & FLAG_Z)) { + WZ = PC + offs; + PC = WZ; + delay(12); + } + else + delay(7); + break; + case 0x21: /* LD HL, nn */ + HL = readw(PC); + PC += 2; + delay(10); + break; + case 0x22: /* LD (nn), HL */ + WZ = readw(PC); + PC += 2; + writew(WZ++, HL); + delay(16); + break; + case 0x23: /* INC HL */ + HL++; + delay(6); + break; + case 0x24: /* INC H */ + inc(H); + delay(4); + break; + case 0x25: /* DEC H */ + dec(H); + delay(4); + break; + case 0x26: /* LD H, n */ + H = readb(PC++); + delay(7); + break; + case 0x27: /* DAA */ + daa; + delay(4); + break; + + case 0x28: /* JR Z, $+n */ + offs = (int) (signed char) readb(PC++); + if (F & FLAG_Z) { + WZ = PC + offs; + PC = WZ; + delay(12); + } + else + delay(7); + break; + case 0x29: /* ADD HL, HL */ + WZ = HL + 1; + add16(HLw, HLw); + delay(11); + break; + case 0x2A: /* LD HL, (nn) */ + WZ = readw(PC); + PC += 2; + HL = readw(WZ++); + delay(16); + break; + case 0x2B: /* DEC HL */ + HL--; + delay(6); + break; + case 0x2C: /* INC L */ + inc(L); + delay(4); + break; + case 0x2D: /* DEC L */ + dec(L); + delay(4); + break; + case 0x2E: /* LD L,n */ + L = readb(PC++); + delay(7); + break; + case 0x2F: /* CPL */ + cpl(A); + delay(4); + break; + + case 0x30: /* JR NC, $+n */ + offs = (int) (signed char) readb(PC++); + if (!(F & FLAG_C)) { + WZ = PC + offs; + PC = WZ; + delay(12); + } + else + delay(7); + break; + case 0x31: /* LD SP, nn */ + SP = readw(PC); + PC += 2; + delay(10); + break; + case 0x32: /* LD (nn), A */ + tmp2 = readw(PC); + PC += 2; + writeb(tmp2, A); + W = A; /* is this really correct?! */ + delay(13); + break; + case 0x33: /* INC SP */ + SP++; + delay(6); + break; + case 0x34: /* INC (HL) */ + tmp1 = readb(HL); + inc(tmp1); + writeb(HL, tmp1); + delay(11); + break; + case 0x35: /* DEC (HL) */ + tmp1 = readb(HL); + dec(tmp1); + writeb(HL, tmp1); + delay(11); + break; + case 0x36: /* LD (HL), n */ + tmp1 = readb(PC++); + writeb(HL, tmp1); + delay(10); + break; + case 0x37: /* SCF */ + F |= FLAG_C; + delay(4); + break; + case 0x38: /* JR C, $+n */ + offs = (int) (signed char) readb(PC++); + if (F & FLAG_C) { + WZ = PC + offs; + PC = WZ; + delay(12); + } + else + delay(7); + break; + case 0x39: /* ADD HL, SP */ + WZ = HL + 1; + add16(HLw, SPw); + delay(11); + break; + case 0x3A: /* LD A, (nn) */ + WZ = readw(PC); + PC += 2; + A = readb(WZ++); + delay(13); + break; + case 0x3B: /* DEC SP */ + SP--; + delay(6); + break; + case 0x3C: /* INC A */ + inc(A); + delay(4); + break; + case 0x3D: /* DEC A */ + dec(A); + delay(4); + break; + case 0x3E: /* LD A, n */ + A = readb(PC++); + delay(7); + break; + case 0x3F: /* CCF */ + F ^= FLAG_C; + delay(4); + break; + + case 0x40: B = B; delay(4); break; + case 0x41: B = C; delay(4); break; + case 0x42: B = D; delay(4); break; + case 0x43: B = E; delay(4); break; + case 0x44: B = H; delay(4); break; + case 0x45: B = L; delay(4); break; + case 0x46: B = readb(HL); delay(7); break; + case 0x47: B = A; delay(4); break; + case 0x48: C = B; delay(4); break; + case 0x49: C = C; delay(4); break; + case 0x4A: C = D; delay(4); break; + case 0x4B: C = E; delay(4); break; + case 0x4C: C = H; delay(4); break; + case 0x4D: C = L; delay(4); break; + case 0x4E: C = readb(HL); delay(7); break; + case 0x4F: C = A; delay(4); break; + case 0x50: D = B; delay(4); break; + case 0x51: D = C; delay(4); break; + case 0x52: D = D; delay(4); break; + case 0x53: D = E; delay(4); break; + case 0x54: D = H; delay(4); break; + case 0x55: D = L; delay(4); break; + case 0x56: D = readb(HL); delay(7); break; + case 0x57: D = A; delay(4); break; + case 0x58: E = B; delay(4); break; + case 0x59: E = C; delay(4); break; + case 0x5A: E = D; delay(4); break; + case 0x5B: E = E; delay(4); break; + case 0x5C: E = H; delay(4); break; + case 0x5D: E = L; delay(4); break; + case 0x5E: E = readb(HL); delay(7); break; + case 0x5F: E = A; delay(4); break; + case 0x60: H = B; delay(4); break; + case 0x61: H = C; delay(4); break; + case 0x62: H = D; delay(4); break; + case 0x63: H = E; delay(4); break; + case 0x64: H = H; delay(4); break; + case 0x65: H = L; delay(4); break; + case 0x66: H = readb(HL); delay(7); break; + case 0x67: H = A; delay(4); break; + case 0x68: L = B; delay(4); break; + case 0x69: L = C; delay(4); break; + case 0x6A: L = D; delay(4); break; + case 0x6B: L = E; delay(4); break; + case 0x6C: L = H; delay(4); break; + case 0x6D: L = L; delay(4); break; + case 0x6E: L = readb(HL); delay(7); break; + case 0x6F: L = A; delay(4); break; + case 0x70: writeb(HL, B); delay(7); break; + case 0x71: writeb(HL, C); delay(7); break; + case 0x72: writeb(HL, D); delay(7); break; + case 0x73: writeb(HL, E); delay(7); break; + case 0x74: writeb(HL, H); delay(7); break; + case 0x75: writeb(HL, L); delay(7); break; + case 0x76: delay(4); break; + case 0x77: writeb(HL, A); delay(7); break; + case 0x78: A = B; delay(4); break; + case 0x79: A = C; delay(4); break; + case 0x7A: A = D; delay(4); break; + case 0x7B: A = E; delay(4); break; + case 0x7C: A = H; delay(4); break; + case 0x7D: A = L; delay(4); break; + case 0x7E: A = readb(HL); delay(7); break; + case 0x7F: A = A; delay(4); break; + + case 0x80: add8(A, B); delay(4); break; + case 0x81: add8(A, C); delay(4); break; + case 0x82: add8(A, D); delay(4); break; + case 0x83: add8(A, E); delay(4); break; + case 0x84: add8(A, H); delay(4); break; + case 0x85: add8(A, L); delay(4); break; + case 0x86: add8(A, readb(HL)); delay(7); break; + case 0x87: add8(A, A); delay(4); break; + case 0x88: adc8(A, B); delay(4); break; + case 0x89: adc8(A, C); delay(4); break; + case 0x8A: adc8(A, D); delay(4); break; + case 0x8B: adc8(A, E); delay(4); break; + case 0x8C: adc8(A, H); delay(4); break; + case 0x8D: adc8(A, L); delay(4); break; + case 0x8E: adc8(A, readb(HL)); delay(7); break; + case 0x8F: adc8(A, A); delay(4); break; + case 0x90: sub8(A, B); delay(4); break; + case 0x91: sub8(A, C); delay(4); break; + case 0x92: sub8(A, D); delay(4); break; + case 0x93: sub8(A, E); delay(4); break; + case 0x94: sub8(A, H); delay(4); break; + case 0x95: sub8(A, L); delay(4); break; + case 0x96: sub8(A, readb(HL)); delay(7); break; + case 0x97: sub8(A, A); delay(4); break; + case 0x98: sbc8(A, B); delay(4); break; + case 0x99: sbc8(A, C); delay(4); break; + case 0x9A: sbc8(A, D); delay(4); break; + case 0x9B: sbc8(A, E); delay(4); break; + case 0x9C: sbc8(A, H); delay(4); break; + case 0x9D: sbc8(A, L); delay(4); break; + case 0x9E: sbc8(A, readb(HL)); delay(7); break; + case 0x9F: sbc8(A, A); delay(4); break; + case 0xA0: and(A, B); delay(4); break; + case 0xA1: and(A, C); delay(4); break; + case 0xA2: and(A, D); delay(4); break; + case 0xA3: and(A, E); delay(4); break; + case 0xA4: and(A, H); delay(4); break; + case 0xA5: and(A, L); delay(4); break; + case 0xA6: and(A, readb(HL)); delay(7); break; + case 0xA7: and(A, A); delay(4); break; + case 0xA8: xor(A, B); delay(4); break; + case 0xA9: xor(A, C); delay(4); break; + case 0xAA: xor(A, D); delay(4); break; + case 0xAB: xor(A, E); delay(4); break; + case 0xAC: xor(A, H); delay(4); break; + case 0xAD: xor(A, L); delay(4); break; + case 0xAE: xor(A, readb(HL)); delay(7); break; + case 0xAF: xor(A, A); delay(4); break; + case 0xB0: or(A, B); delay(4); break; + case 0xB1: or(A, C); delay(4); break; + case 0xB2: or(A, D); delay(4); break; + case 0xB3: or(A, E); delay(4); break; + case 0xB4: or(A, H); delay(4); break; + case 0xB5: or(A, L); delay(4); break; + case 0xB6: or(A, readb(HL)); delay(7); break; + case 0xB7: or(A, A); delay(4); break; + case 0xB8: cp(A, B); delay(4); break; + case 0xB9: cp(A, C); delay(4); break; + case 0xBA: cp(A, D); delay(4); break; + case 0xBB: cp(A, E); delay(4); break; + case 0xBC: cp(A, H); delay(4); break; + case 0xBD: cp(A, L); delay(4); break; + case 0xBE: cp(A, readb(HL)); delay(7); break; + case 0xBF: cp(A, A); delay(4); break; + + case 0xC0: /* RET NZ */ + if (!(F & FLAG_Z)) { + pop(WZ); + PC = WZ; + delay(11); + } + else + delay(5); + break; + case 0xC1: /* POP BC */ + pop(BC); + delay(10); + break; + case 0xC2: /* JP NZ, nn */ + WZ = readw(PC); + if (!(F & FLAG_Z)) + PC = WZ; + else + PC += 2; + delay(10); + break; + case 0xC3: /* JP nn */ + WZ = readw(PC); + PC = WZ; + delay(10); + break; + case 0xC4: /* CALL NZ, nn */ + WZ = readw(PC); + PC += 2; + if (!(F & FLAG_Z)) { + push(PC); + PC = WZ; + delay(17); + } + else + delay(10); + break; + case 0xC5: /* PUSH BC */ + push(BC); + delay(11); + break; + case 0xC6: /* ADD A, n */ + add8(A, readb(PC++)); + delay(7); + break; + case 0xC7: /* RST 00h */ + /* FIXME: I have not tested whether RST affects WZ */ + push(PC); + PC = 0x0000; + delay(11); + break; + + case 0xC8: /* RET Z */ + if (F & FLAG_Z) { + pop(WZ); + PC = WZ; + delay(11); + } + else + delay(5); + break; + case 0xC9: /* RET */ + pop(WZ); + PC = WZ; + delay(10); + break; + case 0xCA: /* JP Z, nn */ + WZ = readw(PC); + if (F & FLAG_Z) + PC = WZ; + else + PC += 2; + delay(10); + break; + + case 0xCB: + op = readb_m1(PC++); + goto opcode_cb; + + case 0xCC: /* CALL Z, nn */ + WZ = readw(PC); + PC += 2; + if (F & FLAG_Z) { + push(PC); + PC = WZ; + delay(17); + } + else + delay(10); + break; + case 0xCD: /* CALL nn */ + WZ = readw(PC); + PC += 2; + push(PC); + PC = WZ; + delay(17); + break; + case 0xCE: /* ADC A, n */ + adc8(A, readb(PC++)); + delay(7); + break; + case 0xCF: /* RST 08h */ + push(PC); + PC = 0x0008; + delay(11); + break; + + case 0xD0: /* RET NC */ + if (!(F & FLAG_C)) { + pop(WZ); + PC = WZ; + delay(11); + } + else + delay(5); + break; + case 0xD1: /* POP DE */ + pop(DE); + delay(10); + break; + case 0xD2: /* JP NC, nn */ + WZ = readw(PC); + if (!(F & FLAG_C)) + PC = WZ; + else + PC += 2; + delay(10); + break; + case 0xD3: /* OUT (n), A */ + W = A; + Z = readb(PC++); + delay(11); + output(WZ, A); + break; + case 0xD4: /* CALL NC, nn */ + WZ = readw(PC); + PC += 2; + if (!(F & FLAG_C)) { + push(PC); + PC = WZ; + delay(17); + } + else + delay(10); + break; + case 0xD5: /* PUSH DE */ + push(DE); + delay(11); + break; + case 0xD6: /* SUB n */ + sub8(A, readb(PC++)); + delay(7); + break; + case 0xD7: /* RST 10h */ + push(PC); + PC = 0x0010; + delay(11); + break; + + case 0xD8: /* RET C */ + if (F & FLAG_C) { + pop(WZ); + PC = WZ; + delay(11); + } + else + delay(5); + break; + case 0xD9: /* EXX */ + ex(BC, BC2); + ex(DE, DE2); + ex(HL, HL2); + ex(WZ, WZ2); + delay(4); + break; + case 0xDA: /* JP C, nn */ + WZ = readw(PC); + if (F & FLAG_C) + PC = WZ; + else + PC += 2; + delay(10); + break; + case 0xDB: /* IN A, (n) */ + W = A; + Z = readb(PC++); + delay(11); + A = input(WZ); + break; + case 0xDC: /* CALL C, nn */ + WZ = readw(PC); + PC += 2; + if (F & FLAG_C) { + push(PC); + PC = WZ; + delay(17); + } + else + delay(10); + break; + + case 0xDD: + op = readb_m1(PC++); + delay(4); + goto opcode_dd; + + case 0xDE: /* SBC A, n */ + sbc8(A, readb(PC++)); + delay(7); + break; + case 0xDF: /* RST 18h */ + push(PC); + PC = 0x0018; + delay(11); + break; + + case 0xE0: /* RET PO */ + if (!(F & FLAG_P)) { + pop(WZ); + PC = WZ; + delay(11); + } + else + delay(5); + break; + case 0xE1: /* POP HL */ + pop(HL); + delay(10); + break; + case 0xE2: /* JP PO, nn */ + WZ = readw(PC); + if (!(F & FLAG_P)) + PC = WZ; + else + PC += 2; + delay(10); + break; + case 0xE3: /* EX (SP), HL */ + WZ = readw(SP); + writew(SP, HL); + HL = WZ; + delay(19); + break; + case 0xE4: /* CALL PO, nn */ + WZ = readw(PC); + PC += 2; + if (!(F & FLAG_P)) { + push(PC); + PC = WZ; + delay(17); + } + else + delay(10); + break; + case 0xE5: /* PUSH HL */ + push(HL); + delay(11); + break; + case 0xE6: /* AND n */ + and(A, readb(PC++)); + delay(7); + break; + case 0xE7: /* RST 20h */ + push(PC); + PC = 0x0020; + delay(11); + break; + + case 0xE8: /* RET PE */ + if (F & FLAG_P) { + pop(WZ); + PC = WZ; + delay(11); + } + else + delay(5); + break; + case 0xE9: /* JP HL */ + PC = HL; + delay(4); + break; + case 0xEA: /* JP PE, nn */ + WZ = readw(PC); + if (F & FLAG_P) + PC = WZ; + else + PC += 2; + delay(10); + break; + case 0xEB: /* EX DE,HL */ + ex(DE, HL); + delay(4); + break; + case 0xEC: /* CALL PE, nn */ + WZ = readw(PC); + PC += 2; + if (F & FLAG_P) { + push(PC); + PC = WZ; + delay(17); + } + else + delay(10); + break; + + case 0xED: + op = readb_m1(PC++); + goto opcode_ed; + + case 0xEE: /* XOR n */ + xor(A, readb(PC++)); + delay(7); + break; + case 0xEF: /* RST 28h */ + push(PC); + PC = 0x0028; + delay(11); + break; + + case 0xF0: /* RET P */ + if (!(F & FLAG_S)) { + pop(WZ); + PC = WZ; + delay(11); + } + else + delay(5); + break; + case 0xF1: /* POP AF */ + pop(AF); + delay(10); + break; + case 0xF2: /* JP P, nn */ + WZ = readw(PC); + if (!(F & FLAG_S)) + PC = WZ; + else + PC += 2; + delay(10); + break; + case 0xF3: /* DI */ + IFF1 = IFF2 = 0; + delay(4); + break; + case 0xF4: /* CALL P, nn */ + WZ = readw(PC); + PC += 2; + if (!(F & FLAG_S)) { + push(PC); + PC = WZ; + delay(17); + } + else + delay(10); + break; + case 0xF5: /* PUSH AF */ + push(AF); + delay(11); + break; + case 0xF6: /* OR n */ + or(A, readb(PC++)); + delay(7); + break; + case 0xF7: /* RST 30h */ + push(PC); + PC = 0x0030; + delay(11); + break; + + case 0xF8: /* RET M */ + if (F & FLAG_S) { + pop(WZ); + PC = WZ; + delay(11); + } + else + delay(5); + break; + case 0xF9: /* LD SP, HL */ + SP = HL; + delay(4); + break; + case 0xFA: /* JP M, nn */ + WZ = readw(PC); + if (F & FLAG_S) + PC = WZ; + else + PC += 2; + delay(10); + break; + case 0xFB: /* EI */ + IFF1 = IFF2 = 1; + delay(4); + break; + case 0xFC: /* CALL M, nn */ + WZ = readw(PC); + PC += 2; + if (F & FLAG_S) { + push(PC); + PC = WZ; + delay(17); + } + else + delay(10); + break; + + case 0xFD: + op = readb_m1(PC++); + delay(4); + goto opcode_fd; + + case 0xFE: /* CP n */ + cp(A, readb(PC++)); + delay(7); + break; + case 0xFF: /* RST 38h */ + push(PC); + PC = 0x0038; + delay(11); + break; + } diff --git a/tool/tilem-src/gui/Makefile.in b/tool/tilem-src/gui/Makefile.in new file mode 100644 index 0000000..4057e5b --- /dev/null +++ b/tool/tilem-src/gui/Makefile.in @@ -0,0 +1,263 @@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ +datarootdir = @datarootdir@ +bindir = @bindir@ +datadir = @datadir@ +pkgdatadir = @datadir@/tilem2 +mandir = @mandir@ + +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +srcdir = @srcdir@ +VPATH = @srcdir@ +@SET_MAKE@ + +CC = @CC@ +CFLAGS = @CFLAGS@ +CPPFLAGS = @CPPFLAGS@ +DEFS = @DEFS@ +GUI_LDFLAGS = @GUI_LDFLAGS@ +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +SHELL = @SHELL@ +WINDRES = @WINDRES@ + +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ + +TICALCS_CFLAGS = @TICALCS_CFLAGS@ +TICALCS_LIBS = @TICALCS_LIBS@ + +TILEMCORE_CFLAGS = -I$(top_srcdir)/emu +TILEMCORE_LIBS = -L$(top_builddir)/emu -ltilemcore + +TILEMDB_CFLAGS = -I$(top_srcdir)/db +TILEMDB_LIBS = -L$(top_builddir)/db -ltilemdb + +DEF_SHARE_DIR = -DSHARE_DIR=\"$(pkgdatadir)\" \ + -DUNINSTALLED_SHARE_DIR=\"$(top_srcdir)/data\" + +gui_extra_objects = @gui_extra_objects@ + +objects = tilem2.o \ + address.o \ + animatedgif.o \ + animation.o \ + breakpoints.o \ + config.o \ + charmap.o \ + debugger.o \ + disasmview.o \ + emulator.o \ + emucore.o \ + emuwin.o \ + event.o \ + filedlg.o \ + files.o \ + fixedtreeview.o \ + gifencod.o \ + icons.o \ + keybindings.o \ + keypaddlg.o \ + link.o \ + macro.o \ + memmodel.o \ + memview.o \ + memory.o \ + pbar.o \ + preferences.o \ + sendfile.o \ + screenshot.o \ + skinops.o \ + ti81prg.o \ + menu.o \ + rcvmenu.o \ + tool.o \ + $(gui_extra_objects) + +libs = $(TILEMDB_LIBS) $(TILEMCORE_LIBS) $(GTK_LIBS) $(TICALCS_LIBS) $(LIBS) + +compile = $(CC) -I$(top_builddir) -I$(srcdir) $(CFLAGS) $(CPPFLAGS) $(DEFS) \ + $(TILEMCORE_CFLAGS) $(TILEMDB_CFLAGS) \ + $(GTK_CFLAGS) $(TICALCS_CFLAGS) + +link = $(CC) $(CFLAGS) $(LDFLAGS) $(GUI_LDFLAGS) + +common_headers = ../config.h ../emu/tilem.h ../db/tilemdb.h \ + gui.h emulator.h debugger.h emuwin.h skinops.h animation.h \ + gtk-compat.h msgbox.h fixedtreeview.h + +all: tilem2@EXEEXT@ + +#Main emulator GUI +tilem2@EXEEXT@: $(objects) ../emu/libtilemcore.a + $(link) -o tilem2@EXEEXT@ $(objects) $(libs) + +tilem2.o: tilem2.c icons.h files.h $(common_headers) + $(compile) -c $(srcdir)/tilem2.c + +# Debugger +debugger.o: debugger.c disasmview.h $(common_headers) + $(compile) -c $(srcdir)/debugger.c + +# Disassembly view +disasmview.o: disasmview.c disasmview.h $(common_headers) + $(compile) -c $(srcdir)/disasmview.c + +# Memory view +memview.o: memview.c memmodel.h $(common_headers) + $(compile) -c $(srcdir)/memview.c + +# Tree model interface for calc memory +memmodel.o: memmodel.c memmodel.h $(common_headers) + $(compile) -c $(srcdir)/memmodel.c + +# Breakpoint dialog +breakpoints.o: breakpoints.c $(common_headers) + $(compile) -c $(srcdir)/breakpoints.c + +# Utility functions for debugging +address.o: address.c $(common_headers) + $(compile) -c $(srcdir)/address.c + +# Keypad dialog +keypaddlg.o: keypaddlg.c $(common_headers) + $(compile) -c $(srcdir)/keypaddlg.c + +# Memory management and messages +memory.o: memory.c ../emu/tilem.h + $(compile) -c $(srcdir)/memory.c + +# Emulator management +emulator.o: emulator.c emucore.h $(common_headers) + $(compile) -c $(srcdir)/emulator.c + +# Emulator main loop +emucore.o: emucore.c emucore.h $(common_headers) + $(compile) -c $(srcdir)/emucore.c + +# Emulator GUI (main window) +emuwin.o: emuwin.c $(common_headers) + $(compile) -c $(srcdir)/emuwin.c + +# Handle events +event.o: event.c $(common_headers) + $(compile) -c $(srcdir)/event.c + +# Preferences dialog +preferences.o: preferences.c $(common_headers) + $(compile) -c $(srcdir)/preferences.c + +# Open skin (skn format file) originally created by Julien Blache and Romain Lievins +skinops.o: skinops.c skinops.h + $(compile) -c $(srcdir)/skinops.c + +# Popups and other stuff +tool.o: tool.c $(common_headers) + $(compile) -c $(srcdir)/tool.c + +# Manage config.ini +config.o: config.c files.h $(common_headers) + $(compile) -c $(srcdir)/config.c + +# Handle internal link +link.o: link.c emucore.h ti81prg.h $(common_headers) + $(compile) -c $(srcdir)/link.c + +# Handle macro +macro.o: macro.c $(common_headers) + $(compile) -c $(srcdir)/macro.c + +# Create and modify animated gif +gifencod.o: gifencod.c gifencod.h + $(compile) -c $(srcdir)/gifencod.c + +# Handle screenshot anim (animated gif) +animatedgif.o: animatedgif.c $(common_headers) + $(compile) -c $(srcdir)/animatedgif.c + +# Screenshot widget +screenshot.o: screenshot.c $(common_headers) + $(compile) -c $(srcdir)/screenshot.c + +# Progress bar widget +pbar.o: pbar.c $(common_headers) + $(compile) -c $(srcdir)/pbar.c + +# Screenshot/animation recording +animation.o: animation.c $(common_headers) + $(compile) -c $(srcdir)/animation.c + + +# Shared/configuration files +files.o: files.c files.h + $(compile) $(DEF_SHARE_DIR) -c $(srcdir)/files.c + +# Custom icons +icons.o: icons.c icons.h + $(compile) $(DEF_SHARE_DIR) -c $(srcdir)/icons.c + +# Keybindings +keybindings.o: keybindings.c files.h $(common_headers) + $(compile) -c $(srcdir)/keybindings.c + +# Menu +menu.o: menu.c $(common_headers) + $(compile) -c $(srcdir)/menu.c + +# Link receive dialog +rcvmenu.o: rcvmenu.c $(common_headers) + $(compile) -c $(srcdir)/rcvmenu.c + +# Link send dialog +sendfile.o: sendfile.c emucore.h $(common_headers) + $(compile) -c $(srcdir)/sendfile.c + +# File open/save dialogs +filedlg.o: filedlg.c filedlg.h + $(compile) -c $(srcdir)/filedlg.c + +# Fixed-width tree view +fixedtreeview.o: fixedtreeview.c fixedtreeview.h + $(compile) -c $(srcdir)/fixedtreeview.c + +# TI-81 program file functions +ti81prg.o: ti81prg.c ti81prg.h ../emu/tilem.h + $(compile) -c $(srcdir)/ti81prg.c + +# Character conversion +charmap.o: charmap.c charmap.h ../emu/tilem.h + $(compile) -c $(srcdir)/charmap.c + +# Windows resource file +tilem2rc.o: tilem2.rc + major=`echo "@PACKAGE_VERSION@" | sed 's/\..*//'` ; \ + minor=`echo "@PACKAGE_VERSION@" | sed 's/.*\.//;s/[^0-9].*//'` ; \ + svnver=`svnversion "$(top_srcdir)" 2>/dev/null | sed 's/[^0-9].*//'` ; \ + [ -n "$$svnver" ] || svnver=0 ; \ + $(WINDRES) -DBUILD_VERSION=$$major,$$minor,0,$$svnver tilem2.rc tilem2rc.o + +tilem2.rc: tilem2.rc.in $(top_builddir)/config.status + cd $(top_builddir) && $(SHELL) ./config.status gui/tilem2.rc + +install: tilem2@EXEEXT@ + $(INSTALL) -d -m 755 $(DESTDIR)$(bindir) + $(INSTALL_PROGRAM) -m 755 tilem2@EXEEXT@ $(DESTDIR)$(bindir) + +uninstall: + rm -f $(DESTDIR)$(bindir)/tilem2@EXEEXT@ + +clean: + rm -f *.o + rm -f tilem2@EXEEXT@ + +Makefile: Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && $(SHELL) ./config.status + +$(top_builddir)/config.status: $(top_srcdir)/configure + cd $(top_builddir) && $(SHELL) ./config.status --recheck + +.PRECIOUS: Makefile $(top_builddir)/config.status +.PHONY: all clean install uninstall diff --git a/tool/tilem-src/gui/address.c b/tool/tilem-src/gui/address.c new file mode 100644 index 0000000..997d6bc --- /dev/null +++ b/tool/tilem-src/gui/address.c @@ -0,0 +1,242 @@ +/* + * TilEm II + * + * Copyright (c) 2011 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include "gui.h" + +char * tilem_format_addr(TilemDebugger *dbg, dword addr, gboolean physical) +{ + dword page, addr_l; + + g_return_val_if_fail(dbg != NULL, NULL); + g_return_val_if_fail(dbg->emu != NULL, NULL); + g_return_val_if_fail(dbg->emu->calc != NULL, NULL); + + if (!physical) + return g_strdup_printf("%04X", addr); + + if (addr >= dbg->emu->calc->hw.romsize) + page = (((addr - dbg->emu->calc->hw.romsize) >> 14) + + dbg->emu->calc->hw.rampagemask); + else + page = addr >> 14; + + addr_l = (*dbg->emu->calc->hw.mem_ptol)(dbg->emu->calc, addr); + if (addr_l == 0xffffffff) + addr_l = (addr & 0x3fff) | 0x4000; + + return g_strdup_printf("%02X:%04X", page, addr_l); +} + +static gboolean parse_hex(const char *string, dword *value) +{ + const char *n; + char *e; + dword a; + + if (string[0] == '$') + n = string + 1; + else if (string[0] == '0' && (string[1] == 'x' || string[1] == 'X')) + n = string + 2; + else + n = string; + + a = strtol(n, &e, 16); + if (value) + *value = a; + + if (e == n) + return FALSE; + + if (*e == 'h' || *e == 'H') + e++; + + return (*e == 0); +} + +gboolean tilem_parse_paged_addr(TilemDebugger *dbg, const char *pagestr, + const char *offsstr, dword *value) +{ + dword page, offs; + + g_return_val_if_fail(dbg != NULL, FALSE); + g_return_val_if_fail(dbg->emu != NULL, FALSE); + g_return_val_if_fail(dbg->emu->calc != NULL, FALSE); + + if (!parse_hex(pagestr, &page)) + return FALSE; + if (!tilem_parse_addr(dbg, offsstr, &offs, NULL)) + return FALSE; + + offs &= 0x3fff; + if (page & dbg->emu->calc->hw.rampagemask) { + page &= ~dbg->emu->calc->hw.rampagemask; + offs += (offs << 14); + if (offs > dbg->emu->calc->hw.ramsize) + return FALSE; + offs += dbg->emu->calc->hw.romsize; + } + else { + offs += (page << 14); + if (offs > dbg->emu->calc->hw.romsize) + return FALSE; + } + + if (value) *value = offs; + return TRUE; +} + +gboolean tilem_parse_addr(TilemDebugger *dbg, const char *string, + dword *value, gboolean *physical) +{ + const char *offstr; + char *pagestr; + + g_return_val_if_fail(dbg != NULL, FALSE); + g_return_val_if_fail(dbg->emu != NULL, FALSE); + g_return_val_if_fail(dbg->emu->calc != NULL, FALSE); + + if (parse_hex(string, value)) { + if (physical) *physical = FALSE; + return TRUE; + } + + if (physical && (offstr = strchr(string, ':'))) { + pagestr = g_strndup(string, offstr - string); + offstr++; + if (tilem_parse_paged_addr(dbg, pagestr, offstr, value)) { + *physical = TRUE; + return TRUE; + } + } + + if (dbg->dasm && tilem_disasm_get_label(dbg->dasm, string, value)) { + if (physical) *physical = FALSE; + return TRUE; + } + + return FALSE; +} + +struct addrdlg { + GtkWidget *dlg; + TilemDebugger *dbg; + gboolean physical; +}; + +static void edited(GtkEntry *entry, gpointer data) +{ + struct addrdlg *adlg = data; + const char *text; + gboolean valid, phys; + + text = gtk_entry_get_text(entry); + valid = tilem_parse_addr(adlg->dbg, text, NULL, + adlg->physical ? &phys : NULL); + gtk_dialog_set_response_sensitive(GTK_DIALOG(adlg->dlg), + GTK_RESPONSE_OK, + valid); +} + +gboolean tilem_prompt_address(TilemDebugger *dbg, GtkWindow *parent, + const char *title, const char *prompt, + dword *value, gboolean physical, + gboolean usedefault) +{ + GtkWidget *dlg, *hbox, *vbox, *lbl, *ent; + struct addrdlg adlg; + const char *text; + gboolean phys; + char *s; + + g_return_val_if_fail(dbg != NULL, FALSE); + g_return_val_if_fail(dbg->emu != NULL, FALSE); + g_return_val_if_fail(dbg->emu->calc != NULL, FALSE); + + dlg = gtk_dialog_new_with_buttons(title, parent, GTK_DIALOG_MODAL, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_set_alternative_button_order(GTK_DIALOG(dlg), + GTK_RESPONSE_OK, + GTK_RESPONSE_CANCEL, + -1); + gtk_dialog_set_default_response(GTK_DIALOG(dlg), + GTK_RESPONSE_OK); + + hbox = gtk_hbox_new(FALSE, 6); + gtk_container_set_border_width(GTK_CONTAINER(hbox), 6); + + lbl = gtk_label_new(prompt); + gtk_box_pack_start(GTK_BOX(hbox), lbl, FALSE, FALSE, 0); + + ent = gtk_entry_new(); + gtk_entry_set_activates_default(GTK_ENTRY(ent), TRUE); + gtk_box_pack_start(GTK_BOX(hbox), ent, TRUE, TRUE, 0); + + if (usedefault) { + s = tilem_format_addr(dbg, *value, physical); + gtk_entry_set_text(GTK_ENTRY(ent), s); + g_free(s); + } + + adlg.dlg = dlg; + adlg.dbg = dbg; + adlg.physical = physical; + + g_signal_connect(ent, "changed", + G_CALLBACK(edited), &adlg); + edited(GTK_ENTRY(ent), &adlg); + + gtk_widget_show_all(hbox); + vbox = gtk_dialog_get_content_area(GTK_DIALOG(dlg)); + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + + if (gtk_dialog_run(GTK_DIALOG(dlg)) != GTK_RESPONSE_OK) { + gtk_widget_destroy(dlg); + return FALSE; + } + + text = gtk_entry_get_text(GTK_ENTRY(ent)); + if (!tilem_parse_addr(dbg, text, value, physical ? &phys : NULL)) { + gtk_widget_destroy(dlg); + return FALSE; + } + + if (physical && !phys) { + tilem_calc_emulator_lock(dbg->emu); + *value &= 0xffff; + *value = (*dbg->emu->calc->hw.mem_ltop)(dbg->emu->calc, *value); + tilem_calc_emulator_unlock(dbg->emu); + } + + gtk_widget_destroy(dlg); + return TRUE; +} diff --git a/tool/tilem-src/gui/animatedgif.c b/tool/tilem-src/gui/animatedgif.c new file mode 100644 index 0000000..a45ba6b --- /dev/null +++ b/tool/tilem-src/gui/animatedgif.c @@ -0,0 +1,251 @@ +/* + * TilEm II + * + * Copyright (c) 2010-2011 Thibault Duponchelle + * Copyright (c) 2011 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include "gui.h" + + +static void write_global_header(FILE* fp, int width, int height, byte* palette, int palette_size); +static void write_global_footer(FILE* fp); +static void write_extension_block(FILE* fout, word delay); +static void write_image_block_start(FILE *fp, int width, int height); +static void write_image_block_end(FILE *fp); +static void write_comment(FILE* fp); +static void write_application_extension(FILE * fp) ; + +static void write_global_header(FILE* fp, int width, int height, byte* palette, int palette_size) { + + /* Magic number for Gif file format */ + char global_header_magic_number[] = {'G', 'I', 'F', '8', '9', 'a'}; + /* Size of canvas width on 2 bytes, heigth on 2 bytes */ + char global_header_canvas[] = {96, 0, 64, 0 }; + + global_header_canvas[0] = width; + global_header_canvas[1] = (width >> 8) ; + global_header_canvas[2] = height; + global_header_canvas[3] = (height >> 8); + + /* Flag */ + /* The 11th byte is a set of flags : + bit 0: Global Color Table Flag (GCTF) + bit 1..3: Color Resolution + bit 4: Sort Flag to Global Color Table + bit 5..7: Size of Global Color Table: 2^(1+n) + It means "use the GCT wich is given after (from the size bit 5..7) and a resolution bit 1..3 + The Background color is an index in the Global Color Table + */ + /* FIXME : if we change the palette size, we need to change this flag too and I don't do this currently */ + char global_header_flag[] = { 0xf7 }; + /* The index in global color table */ + char global_header_background_index[] = {0x00}; + /* Aspect pixel ratio (unknown) */ + char global_header_aspect_pixel_ratio[] = {0x00}; + + + fwrite(global_header_magic_number, 6, 1, fp); + fwrite(global_header_canvas, 4, 1, fp); + fwrite(global_header_flag, 1, 1, fp); + fwrite(global_header_background_index, 1, 1, fp); + fwrite(global_header_aspect_pixel_ratio, 1, 1, fp); + + //byte* palette = tilem_color_palette_new_packed(255, 255, 255, 0, 0, 0, 2.2); + + fwrite(palette, palette_size * 3, 1, fp); +} + +static void write_global_footer(FILE* fp) { + + /* This value means end of gif file */ + char footer_trailer[1] = { 0x3b}; + + fwrite(footer_trailer, 1, 1,fp); +} + + +static void write_extension_block(FILE* fp, word delay) { + + /* Extension block introduced by 0x21 ('!'), size before extension_block_terminator, flag byte, delay (10/100) 2 bytes */ + char extension_block_header[2] = {0x21, 0xf9}; + /* Size before extension_block_terminator */ + char extension_block_size[1] = { 0x04} ; + /* Flag (unknown) */ + char extension_block_flag[1] = { 0x00} ; + /* Delay (x/100 sec) on 2 bytes*/ + char extension_block_delay[2] = {10, 0} ; + extension_block_delay[0] = delay; + /* The index designed by this variable become transparent even if palette gives a black(or something else) color. */ + char extension_block_transparent_index[1] = {0xff}; + /* End of extension block */ + char extension_block_terminator[1] = {0x00}; + + fwrite(extension_block_header, 2, 1, fp); + fwrite(extension_block_size, 1, 1, fp); + fwrite(extension_block_flag, 1, 1, fp); + fwrite(extension_block_delay, 2, 1, fp); + fwrite(extension_block_transparent_index, 1, 1, fp); + fwrite(extension_block_terminator, 1, 1, fp); + +} + +static void write_image_block_start(FILE *fp, int width, int height) { + + /* Header */ + char image_block_header[] = { 0x2c}; + /* Left corner x (2 bytes), left corner y (2 bytes), width (2 bytes), height (2 bytes) */ + char image_block_canvas[] = { 0, 0, 0, 0, 96, 0, 64, 0}; + + image_block_canvas[4] = width; + image_block_canvas[5] = (width >> 8) ; + image_block_canvas[6] = height; + image_block_canvas[7] = (height >> 8); + /* Flag */ + char image_block_flag[] = { 0x00 }; + + fwrite(image_block_header, 1, 1, fp); + fwrite(image_block_canvas, 8, 1, fp); + fwrite(image_block_flag, 1, 1, fp); + +} + +static void write_image_block_end(FILE *fp) { + + /* Give an end to the image block */ + char image_block_end[1] = {0x00}; + + fwrite(image_block_end, 1, 1,fp); +} + +static void write_comment(FILE* fp) { + + char comment[] = {0x21, 0xfe, 8, 'T', 'i', 'l', 'E', 'm', '2', 0, 0, 0}; + fwrite(comment, 12, 1, fp); +} + +static void write_application_extension(FILE * fp) { + + /* Magic number to start the block */ + char application_extension_magic_number[] = { 0x21, 0xff, 0x0b }; + /* Application name */ + char application_extension_application_name[] = { 'N', 'E', 'T', 'S', 'C', 'A', 'P', 'E', '2', '.', '0' }; + /* magic number */ + char application_extension_data_follow[] = { 0x03, 0x01 }; + /* 0 to 65535 loop */ + char application_extension_number_of_loop[] = { 0xff, 0xff}; + /* the end of the block */ + char application_extension_terminator[] = { 0x00 }; + + //char gif_infos[31] = { + //0x21, 0xff, 0x0b, 'N', 'E', 'T', 'S', 'C', 'A', 'P', 'E', '2', '.', '0', 3, 1, 0xff, 0xff, 0x00 }; + + //fwrite(gif_infos, 19, 1, fp); + fwrite(application_extension_magic_number, 3, 1, fp); + fwrite(application_extension_application_name, 11, 1, fp); + fwrite(application_extension_data_follow, 2, 1, fp); + fwrite(application_extension_number_of_loop, 2, 1, fp); + fwrite(application_extension_terminator, 1, 1, fp); +} + +/* Apparently, most current web browsers are seriously and + deliberately broken in their handling of animated GIFs. Internet + Explorer does not allow any frame to be shorter than 60 ms, and + Gecko does not allow any frame shorter than 20 ms. Furthermore, + rather than simply imposing a lower limit, or skipping frames, + these browsers take any frame they deem "too short" and extend it + to a full 100 ms out of sheer spite. + + If we want animations to look correct in all web browsers (which + is, after all, the main reason for using GIF animations in the + first place), we have to limit ourselves to 60-ms frames or + longer. */ +#define MIN_FRAME_DELAY 6 + +void tilem_animation_write_gif(TilemAnimation *anim, byte* palette, int palette_size, FILE *fp) +{ + GdkPixbufAnimation *ganim; + int width, height, delay, n; + gdouble time_stretch, t; + byte *image; + TilemAnimFrame *frm, *next; + gboolean is_static; + + g_return_if_fail(TILEM_IS_ANIMATION(anim)); + g_return_if_fail(fp != NULL); + + ganim = GDK_PIXBUF_ANIMATION(anim); + width = gdk_pixbuf_animation_get_width(ganim); + height = gdk_pixbuf_animation_get_height(ganim); + is_static = gdk_pixbuf_animation_is_static_image(ganim); + time_stretch = 1.0 / tilem_animation_get_speed(anim); + + frm = tilem_animation_next_frame(anim, NULL); + g_return_if_fail(frm != NULL); + + write_global_header(fp, width, height, palette, palette_size); + + if (!is_static) + write_application_extension(fp); + + write_comment(fp); + + t = MIN_FRAME_DELAY * 5.0; + + /* FIXME: combine multiple frames by averaging rather than + simply taking the last one */ + + while (frm) { + next = tilem_animation_next_frame(anim, frm); + + if (!is_static) { + delay = tilem_anim_frame_get_duration(frm); + t += delay * time_stretch; + n = t / 10.0; + + if (n < MIN_FRAME_DELAY && next != NULL) { + frm = next; + continue; + } + + t -= n * 10.0; + if (n > 0xffff) + n = 0xffff; + else if (n < MIN_FRAME_DELAY) + n = MIN_FRAME_DELAY; + write_extension_block(fp, n); + } + + tilem_animation_get_indexed_image(anim, frm, &image, + &width, &height); + write_image_block_start(fp, width, height); + GifEncode(fp, image, 8, width * height); + write_image_block_end(fp); + g_free(image); + + frm = next; + } + + write_global_footer(fp); +} diff --git a/tool/tilem-src/gui/animation.c b/tool/tilem-src/gui/animation.c new file mode 100644 index 0000000..f40e727 --- /dev/null +++ b/tool/tilem-src/gui/animation.c @@ -0,0 +1,594 @@ +/* + * TilEm II + * + * Copyright (c) 2011 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#define GDK_PIXBUF_ENABLE_BACKEND + +#include +#include +#include +#include +#include +#include +#include + +#include "gui.h" + +#define GAMMA 2.2 + +struct _TilemAnimFrame { + struct _TilemAnimFrame *next; + unsigned duration : 24; + unsigned contrast : 8; + byte data[1]; +}; + +struct _TilemAnimation { + GdkPixbufAnimation parent; + + int num_frames; + TilemAnimFrame *start; + TilemAnimFrame *end; + dword last_stamp; + + TilemLCDBuffer *temp_buffer; + + GdkPixbuf *static_pixbuf; + + int base_contrast; + int display_width; + int display_height; + int frame_rowstride; + int frame_size; + int image_width; + int image_height; + dword *palette; + gdouble speed; + gdouble time_stretch; + + gboolean out_of_memory; +}; + +struct _TilemAnimationClass { + GdkPixbufAnimationClass parent_class; +}; + +#define TILEM_TYPE_ANIM_ITER (tilem_anim_iter_get_type()) +#define TILEM_ANIM_ITER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), TILEM_TYPE_ANIM_ITER, TilemAnimIter)) +#define TILEM_ANIM_ITER_CLASS(cls) (G_TYPE_CHECK_CLASS_CAST((cls), TILEM_TYPE_ANIM_ITER, TilemAnimIterClass)) +#define TILEM_IS_ANIM_ITER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), TILEM_TYPE_ANIM_ITER)) +#define TILEM_IS_ANIM_ITER_CLASS(cls) (G_TYPE_CHECK_CLASS_TYPE((cls), TILEM_TYPE_ANIM_ITER)) +#define TILEM_ANIM_ITER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), TILEM_TYPE_ANIM_ITER, TilemAnimIterClass)) + +typedef struct _TilemAnimIter { + GdkPixbufAnimationIter parent; + GTimeVal current_time; + int time_elapsed; + TilemAnimation *anim; + TilemAnimFrame *frame; + GdkPixbuf *pixbuf; +} TilemAnimIter; + +typedef struct _TilemAnimIterClass { + GdkPixbufAnimationIterClass parent_class; +} TilemAnimIterClass; + +G_DEFINE_TYPE(TilemAnimation, tilem_animation, + GDK_TYPE_PIXBUF_ANIMATION); + +G_DEFINE_TYPE(TilemAnimIter, tilem_anim_iter, + GDK_TYPE_PIXBUF_ANIMATION_ITER); + +static TilemAnimFrame * alloc_frame(int bufsize) +{ + TilemAnimFrame *frm; + + frm = g_try_malloc(sizeof(TilemAnimFrame) + bufsize - 1); + if (!frm) + return NULL; + frm->next = NULL; + return frm; +} + +static void free_frame(TilemAnimFrame *frm) +{ + g_free(frm); +} + +static int adjust_contrast(TilemAnimation *anim, int contrast) +{ + TilemAnimFrame *frm; + + if (!contrast) + return 0; + + if (!anim->base_contrast) { + for (frm = anim->start; frm; frm = frm->next) { + if (frm->contrast != 0) { + anim->base_contrast = frm->contrast; + break; + } + } + } + + contrast = (contrast - anim->base_contrast + 32); + return CLAMP(contrast, 0, 63); +} + +static void set_lcdbuf_from_frame(TilemAnimation *anim, + TilemLCDBuffer *buf, + const TilemAnimFrame *frm) +{ + buf->width = anim->display_width; + buf->height = anim->display_height; + buf->rowstride = anim->frame_rowstride; + buf->contrast = adjust_contrast(anim, frm->contrast); + buf->data = (byte *) frm->data; +} + +static GdkPixbuf * frame_to_pixbuf(TilemAnimation *anim, + const TilemAnimFrame *frm) +{ + GdkPixbuf *pb; + + pb = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, + anim->image_width, anim->image_height); + + set_lcdbuf_from_frame(anim, anim->temp_buffer, frm); + tilem_draw_lcd_image_rgb(anim->temp_buffer, + gdk_pixbuf_get_pixels(pb), + anim->image_width, + anim->image_height, + gdk_pixbuf_get_rowstride(pb), + 3, anim->palette, + TILEM_SCALE_SMOOTH); + anim->temp_buffer->data = NULL; + + return pb; +} + +static gboolean tilem_animation_is_static_image(GdkPixbufAnimation *ganim) +{ + TilemAnimation *anim = TILEM_ANIMATION(ganim); + + g_return_val_if_fail(TILEM_IS_ANIMATION(ganim), FALSE); + + if (anim->start == anim->end) + return TRUE; + else + return FALSE; +} + +static GdkPixbuf * tilem_animation_get_static_image(GdkPixbufAnimation *ganim) +{ + TilemAnimation *anim = TILEM_ANIMATION(ganim); + + g_return_val_if_fail(TILEM_IS_ANIMATION(anim), NULL); + g_return_val_if_fail(anim->start != NULL, NULL); + + if (!anim->static_pixbuf) + anim->static_pixbuf = frame_to_pixbuf(anim, anim->start); + + return anim->static_pixbuf; +} + +static void tilem_animation_get_size(GdkPixbufAnimation *ganim, + int *width, int *height) +{ + TilemAnimation *anim = TILEM_ANIMATION(ganim); + + g_return_if_fail(TILEM_IS_ANIMATION(anim)); + + if (width) *width = anim->image_width; + if (height) *height = anim->image_height; +} + +static GdkPixbufAnimationIter * +tilem_animation_get_iter(GdkPixbufAnimation *ganim, + const GTimeVal *start_time) +{ + TilemAnimation *anim = TILEM_ANIMATION(ganim); + TilemAnimIter *iter; + + g_return_val_if_fail(TILEM_IS_ANIMATION(anim), NULL); + + iter = g_object_new(TILEM_TYPE_ANIM_ITER, NULL); + iter->anim = anim; + iter->frame = anim->start; + iter->current_time = *start_time; + + g_object_ref(anim); + + return GDK_PIXBUF_ANIMATION_ITER(iter); +} + +static void tilem_animation_init(G_GNUC_UNUSED TilemAnimation *anim) +{ +} + +static void tilem_animation_finalize(GObject *obj) +{ + TilemAnimation *anim = TILEM_ANIMATION(obj); + TilemAnimFrame *frm; + + g_return_if_fail(TILEM_IS_ANIMATION(anim)); + + while (anim->start) { + frm = anim->start; + anim->start = frm->next; + free_frame(frm); + } + + anim->start = anim->end = NULL; + + if (anim->temp_buffer) + tilem_lcd_buffer_free(anim->temp_buffer); + anim->temp_buffer = NULL; + + if (anim->palette) + tilem_free(anim->palette); + anim->palette = NULL; + + if (anim->static_pixbuf) + g_object_unref(anim->static_pixbuf); + anim->static_pixbuf = NULL; + + if (G_OBJECT_CLASS(tilem_animation_parent_class)->finalize) + (*G_OBJECT_CLASS(tilem_animation_parent_class)->finalize)(obj); +} + +static void tilem_animation_class_init(TilemAnimationClass *klass) +{ + GdkPixbufAnimationClass *aclass = GDK_PIXBUF_ANIMATION_CLASS(klass); + GObjectClass *oclass = G_OBJECT_CLASS(klass); + + aclass->is_static_image = tilem_animation_is_static_image; + aclass->get_static_image = tilem_animation_get_static_image; + aclass->get_size = tilem_animation_get_size; + aclass->get_iter = tilem_animation_get_iter; + + oclass->finalize = tilem_animation_finalize; +} + +static int tilem_anim_iter_get_delay_time(GdkPixbufAnimationIter *giter) +{ + TilemAnimIter *iter = TILEM_ANIM_ITER(giter); + + g_return_val_if_fail(TILEM_IS_ANIM_ITER(iter), 0); + g_return_val_if_fail(iter->anim != NULL, 0); + g_return_val_if_fail(iter->frame != NULL, 0); + + if (iter->anim->start == iter->anim->end) + return -1; + else + return ((iter->frame->duration - iter->time_elapsed) + * iter->anim->time_stretch); +} + +static GdkPixbuf * tilem_anim_iter_get_pixbuf(GdkPixbufAnimationIter *giter) +{ + TilemAnimIter *iter = TILEM_ANIM_ITER(giter); + + g_return_val_if_fail(TILEM_IS_ANIM_ITER(iter), NULL); + g_return_val_if_fail(iter->anim != NULL, NULL); + g_return_val_if_fail(iter->frame != NULL, NULL); + + if (!iter->pixbuf) + iter->pixbuf = frame_to_pixbuf(iter->anim, iter->frame); + + return iter->pixbuf; +} + +static gboolean tilem_anim_iter_on_currently_loading_frame(G_GNUC_UNUSED GdkPixbufAnimationIter *giter) +{ + return FALSE; +} + +static gboolean +tilem_anim_iter_advance(GdkPixbufAnimationIter *giter, + const GTimeVal *current_time) +{ + TilemAnimIter *iter = TILEM_ANIM_ITER(giter); + int ms; + + g_return_val_if_fail(TILEM_IS_ANIM_ITER(iter), FALSE); + g_return_val_if_fail(iter->anim != NULL, FALSE); + g_return_val_if_fail(iter->frame != NULL, FALSE); + + ms = ((current_time->tv_usec - iter->current_time.tv_usec) / 1000 + + (current_time->tv_sec - iter->current_time.tv_sec) * 1000); + + g_time_val_add(&iter->current_time, ms * 1000); + + ms *= iter->anim->speed; + + ms += iter->time_elapsed; + if (ms < iter->frame->duration) { + iter->time_elapsed = ms; + return FALSE; + } + + if (iter->pixbuf) + g_object_unref(iter->pixbuf); + iter->pixbuf = NULL; + + while (ms >= iter->frame->duration) { + ms -= iter->frame->duration; + if (iter->frame->next) + iter->frame = iter->frame->next; + else + iter->frame = iter->anim->start; + } + + iter->time_elapsed = ms; + return TRUE; +} + +static void tilem_anim_iter_init(G_GNUC_UNUSED TilemAnimIter *iter) +{ +} + +static void tilem_anim_iter_finalize(GObject *obj) +{ + TilemAnimIter *iter = TILEM_ANIM_ITER(obj); + + g_return_if_fail(TILEM_IS_ANIM_ITER(obj)); + + if (iter->anim) + g_object_unref(iter->anim); + iter->anim = NULL; + + if (iter->pixbuf) + g_object_unref(iter->pixbuf); + iter->pixbuf = NULL; + + if (G_OBJECT_CLASS(tilem_anim_iter_parent_class)->finalize) + (*G_OBJECT_CLASS(tilem_anim_iter_parent_class)->finalize)(obj); +} + +static void tilem_anim_iter_class_init(TilemAnimIterClass *klass) +{ + GdkPixbufAnimationIterClass *iclass = GDK_PIXBUF_ANIMATION_ITER_CLASS(klass); + GObjectClass *oclass = G_OBJECT_CLASS(klass); + + iclass->get_delay_time = tilem_anim_iter_get_delay_time; + iclass->get_pixbuf = tilem_anim_iter_get_pixbuf; + iclass->on_currently_loading_frame = tilem_anim_iter_on_currently_loading_frame; + iclass->advance = tilem_anim_iter_advance; + + oclass->finalize = tilem_anim_iter_finalize; +} + +TilemAnimation * tilem_animation_new(int display_width, int display_height) +{ + TilemAnimation *anim; + TilemAnimFrame *dummy_frame; + + g_return_val_if_fail(display_width > 0, NULL); + g_return_val_if_fail(display_height > 0, NULL); + + anim = g_object_new(TILEM_TYPE_ANIMATION, NULL); + anim->display_width = display_width; + anim->display_height = display_height; + anim->frame_rowstride = (display_width + 7) & ~7; + anim->frame_size = anim->frame_rowstride * display_height; + + anim->image_width = display_width; + anim->image_height = display_height; + anim->speed = 1.0; + anim->time_stretch = 1.0; + + anim->temp_buffer = tilem_lcd_buffer_new(); + anim->palette = tilem_color_palette_new(255, 255, 255, 0, 0, 0, GAMMA); + + dummy_frame = alloc_frame(anim->frame_size); + dummy_frame->duration = 0; + dummy_frame->contrast = 0; + anim->start = anim->end = dummy_frame; + + return anim; +} + +gboolean tilem_animation_append_frame(TilemAnimation *anim, + const TilemLCDBuffer *buf, + int duration) +{ + TilemAnimFrame *frm; + + g_return_val_if_fail(TILEM_IS_ANIMATION(anim), FALSE); + g_return_val_if_fail(anim->end != NULL, FALSE); + g_return_val_if_fail(buf != NULL, FALSE); + g_return_val_if_fail(buf->data != NULL, FALSE); + g_return_val_if_fail(buf->height == anim->display_height, FALSE); + g_return_val_if_fail(buf->rowstride == anim->frame_rowstride, FALSE); + + if (anim->out_of_memory) + return FALSE; + + if (anim->end->contrast == buf->contrast + && (anim->last_stamp == buf->stamp + || !memcmp(anim->end->data, buf->data, anim->frame_size))) { + anim->end->duration += duration; + } + else { + if (anim->end->duration == 0) { + frm = anim->end; + } + else { + frm = alloc_frame(anim->frame_size); + if (!frm) { + anim->out_of_memory = TRUE; + return FALSE; + } + anim->end->next = frm; + anim->end = frm; + } + + frm->contrast = buf->contrast; + frm->duration = duration; + memcpy(frm->data, buf->data, anim->frame_size); + } + + anim->last_stamp = buf->stamp; + return TRUE; +} + +void tilem_animation_set_size(TilemAnimation *anim, int width, int height) +{ + g_return_if_fail(TILEM_IS_ANIMATION(anim)); + anim->image_width = width; + anim->image_height = height; +} + +void tilem_animation_set_colors(TilemAnimation *anim, + const GdkColor *foreground, + const GdkColor *background) +{ + g_return_if_fail(TILEM_IS_ANIMATION(anim)); + g_return_if_fail(foreground != NULL); + g_return_if_fail(background != NULL); + + if (anim->palette) + tilem_free(anim->palette); + + anim->palette = tilem_color_palette_new(background->red >> 8, + background->green >> 8, + background->blue >> 8, + foreground->red >> 8, + foreground->green >> 8, + foreground->blue >> 8, + GAMMA); +} + +void tilem_animation_set_speed(TilemAnimation *anim, gdouble factor) +{ + g_return_if_fail(TILEM_IS_ANIMATION(anim)); + g_return_if_fail(factor > 0.0); + anim->speed = factor; + anim->time_stretch = 1.0 / factor; +} + +gdouble tilem_animation_get_speed(TilemAnimation *anim) +{ + g_return_val_if_fail(TILEM_IS_ANIMATION(anim), 1.0); + return anim->speed; +} + +TilemAnimFrame *tilem_animation_next_frame(TilemAnimation *anim, + TilemAnimFrame *frm) +{ + g_return_val_if_fail(TILEM_IS_ANIMATION(anim), NULL); + if (frm) + return frm->next; + else + return anim->start; +} + +int tilem_anim_frame_get_duration(TilemAnimFrame *frm) +{ + g_return_val_if_fail(frm != NULL, 0); + return frm->duration; +} + +void tilem_animation_get_indexed_image(TilemAnimation *anim, + TilemAnimFrame *frm, + byte **buffer, + int *width, int *height) +{ + g_return_if_fail(TILEM_IS_ANIMATION(anim)); + g_return_if_fail(frm != NULL); + g_return_if_fail(buffer != NULL); + g_return_if_fail(width != NULL); + g_return_if_fail(height != NULL); + + *width = anim->image_width; + *height = anim->image_height; + *buffer = g_new(byte, anim->image_width * anim->image_height); + + set_lcdbuf_from_frame(anim, anim->temp_buffer, frm); + tilem_draw_lcd_image_indexed(anim->temp_buffer, *buffer, + anim->image_width, anim->image_height, + anim->image_width, + TILEM_SCALE_SMOOTH); + anim->temp_buffer->data = NULL; +} + +gboolean tilem_animation_save(TilemAnimation *anim, + const char *fname, const char *type, + char **option_keys, char **option_values, + GError **err) +{ + FILE *fp; + char *dname; + int errnum; + GdkPixbuf *pb; + gboolean status; + byte palette[768]; + int i; + + g_return_val_if_fail(TILEM_IS_ANIMATION(anim), FALSE); + g_return_val_if_fail(fname != NULL, FALSE); + g_return_val_if_fail(type != NULL, FALSE); + g_return_val_if_fail(err == NULL || *err == NULL, FALSE); + + if (strcmp(type, "gif") != 0) { + pb = gdk_pixbuf_animation_get_static_image + (GDK_PIXBUF_ANIMATION(anim)); + status = gdk_pixbuf_savev(pb, fname, type, + option_keys, option_values, + err); + return status; + } + + fp = g_fopen(fname, "wb"); + if (!fp) { + errnum = errno; + dname = g_filename_display_name(fname); + g_set_error(err, G_FILE_ERROR, + g_file_error_from_errno(errnum), + "Failed to open '%s' for writing: %s", + dname, g_strerror(errnum)); + g_free(dname); + return FALSE; + } + + for (i = 0; i < 256; i++) { + palette[3 * i] = anim->palette[i] >> 16; + palette[3 * i + 1] = anim->palette[i] >> 8; + palette[3 * i + 2] = anim->palette[i]; + } + + tilem_animation_write_gif(anim, palette, 256, fp); + + if (fclose(fp)) { + errnum = errno; + dname = g_filename_display_name(fname); + g_set_error(err, G_FILE_ERROR, + g_file_error_from_errno(errnum), + "Error while closing '%s': %s", + dname, g_strerror(errnum)); + g_free(dname); + return FALSE; + } + + return TRUE; +} diff --git a/tool/tilem-src/gui/animation.h b/tool/tilem-src/gui/animation.h new file mode 100644 index 0000000..ec14391 --- /dev/null +++ b/tool/tilem-src/gui/animation.h @@ -0,0 +1,88 @@ +/* + * TilEm II + * + * Copyright (c) 2011 Benjamin Moody + * + * 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 . + */ + +#include + +G_BEGIN_DECLS + +#define TILEM_TYPE_ANIMATION (tilem_animation_get_type()) +#define TILEM_ANIMATION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), TILEM_TYPE_ANIMATION, TilemAnimation)) +#define TILEM_ANIMATION_CLASS(cls) (G_TYPE_CHECK_CLASS_CAST((cls), TILEM_TYPE_ANIMATION, TilemAnimationClass)) +#define TILEM_IS_ANIMATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), TILEM_TYPE_ANIMATION)) +#define TILEM_IS_ANIMATION_CLASS(cls) (G_TYPE_CHECK_CLASS_TYPE((cls), TILEM_TYPE_ANIMATION)) +#define TILEM_ANIMATION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), TILEM_TYPE_ANIMATION, TilemAnimationClass)) + +typedef struct _TilemAnimation TilemAnimation; +typedef struct _TilemAnimationClass TilemAnimationClass; +typedef struct _TilemAnimFrame TilemAnimFrame; + +GType tilem_animation_get_type(void) G_GNUC_CONST; + +/* Create a new TilemAnimation for the given display dimensions. */ +TilemAnimation * tilem_animation_new(int display_width, + int display_height); + +/* Add a frame to the animation. BUF holds the LCD contents, DURATION + is the length of time this frame should be displayed (in + milliseconds.) */ +gboolean tilem_animation_append_frame(TilemAnimation *anim, + const TilemLCDBuffer *buf, + int duration); + +/* Set output image size. */ +void tilem_animation_set_size(TilemAnimation *anim, int width, int height); + +/* Set output image colors. */ +void tilem_animation_set_colors(TilemAnimation *anim, + const GdkColor *foreground, + const GdkColor *background); + +/* Set animation speed factor */ +void tilem_animation_set_speed(TilemAnimation *anim, gdouble factor); + +/* Get animation speed factor */ +gdouble tilem_animation_get_speed(TilemAnimation *anim); + +/* Retrieve the next frame of the animation. If FRM is NULL, retrieve + the first frame. If FRM is non-null, it must be a frame belonging + to this animation. */ +TilemAnimFrame *tilem_animation_next_frame(TilemAnimation *anim, + TilemAnimFrame *frm); + +/* Get the duration of this frame (milliseconds by the original + clock.) */ +int tilem_anim_frame_get_duration(TilemAnimFrame *frm); + +/* Convert frame to an indexed-color image buffer. FRM must be a + frame belonging to this animation. The returned buffer must be + freed with g_free(). */ +void tilem_animation_get_indexed_image(TilemAnimation *anim, + TilemAnimFrame *frm, + byte **buffer, + int *width, int *height); + +/* Save animation to a file. TYPE is an ASCII string describing the + type. Options are specified by OPTION_KEYS and OPTION_VALUES (see + gdk_pixbuf_savev().) */ +gboolean tilem_animation_save(TilemAnimation *anim, + const char *fname, const char *type, + char **option_keys, char **option_values, + GError **err); + +G_END_DECLS diff --git a/tool/tilem-src/gui/breakpoints.c b/tool/tilem-src/gui/breakpoints.c new file mode 100644 index 0000000..e1f9e5c --- /dev/null +++ b/tool/tilem-src/gui/breakpoints.c @@ -0,0 +1,1060 @@ +/* + * TilEm II + * + * Copyright (c) 2011 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gui.h" +#include "disasmview.h" +#include "fixedtreeview.h" + +/**************** Add/edit breakpoint dialog ****************/ + +struct hex_entry { + GtkWidget *addr_label; + GtkWidget *addr_entry; + GtkWidget *page_label; + GtkWidget *page_entry; +}; + +struct breakpoint_dlg { + TilemDebugger *dbg; + + GtkWidget *dlg; + GtkWidget *box; + + GtkWidget *type_combo; + GtkWidget *access_cb[3]; + GtkWidget *single_rb; + GtkWidget *range_rb; + GtkWidget *access_label; + GtkWidget *address_label; + + struct hex_entry start; + struct hex_entry end; +}; + +static const struct { + char abbrev; + const char *desc; + const char *value_label; + int use_pages; + guint access_mask; +} type_info[] = { + { 'M', "Memory address (logical)", "Address", 0, 7 }, + { 'M', "Memory address (absolute)", "Address", 1, 7 }, + { 'P', "I/O port", "Port Number", 0, 6 }, + { 'I', "Z80 instruction", "Opcode", 0, 0 } +}; + +/* Determine currently selected address type */ +static guint get_bp_type(struct breakpoint_dlg *bpdlg) +{ + int i = gtk_combo_box_get_active(GTK_COMBO_BOX(bpdlg->type_combo)); + return (i < 0 ? 0 : i); +} + +/* Format address as a string */ +static void hex_entry_set_value(struct hex_entry *he, TilemDebugger *dbg, + int type, dword value) +{ + const TilemCalc *calc; + char buf[20]; + unsigned int page; + + g_return_if_fail(dbg->emu != NULL); + g_return_if_fail(dbg->emu->calc != NULL); + + calc = dbg->emu->calc; + + switch (type) { + case TILEM_DB_BREAK_LOGICAL: + g_snprintf(buf, sizeof(buf), "%04X", value); + break; + + case TILEM_DB_BREAK_PHYSICAL: + if (value >= calc->hw.romsize) { + value -= calc->hw.romsize; + page = (value >> 14) + calc->hw.rampagemask; + } + else { + page = (value >> 14); + } + + g_snprintf(buf, sizeof(buf), "%02X", page); + gtk_entry_set_text(GTK_ENTRY(he->page_entry), buf); + + g_snprintf(buf, sizeof(buf), "%04X", value & 0x3fff); + break; + + case TILEM_DB_BREAK_PORT: + g_snprintf(buf, sizeof(buf), "%02X", value); + break; + + case TILEM_DB_BREAK_OPCODE: + if (value < 0x100) + g_snprintf(buf, sizeof(buf), "%02X", value); + else if (value < 0x10000) + g_snprintf(buf, sizeof(buf), "%04X", value); + else if (value < 0x1000000) + g_snprintf(buf, sizeof(buf), "%06X", value); + else + g_snprintf(buf, sizeof(buf), "%08X", value); + break; + + default: + g_return_if_reached(); + } + + gtk_entry_set_text(GTK_ENTRY(he->addr_entry), buf); +} + +/* Parse contents of entry */ +static gboolean parse_num(TilemDebugger *dbg, const char *s, dword *a) +{ + const char *n; + char *e; + + g_return_val_if_fail(s != NULL, FALSE); + + if (s[0] == '$') + n = s + 1; + else if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) + n = s + 2; + else + n = s; + + *a = strtol(n, &e, 16); + if (e != n) { + if (*e == 'h' || *e == 'H') + e++; + if (*e == 0) + return TRUE; + } + + if (dbg->dasm && tilem_disasm_get_label(dbg->dasm, s, a)) + return TRUE; + + return FALSE; +} + +/* Parse user input from hex entry */ +static gboolean hex_entry_parse_value(struct hex_entry *he, TilemDebugger *dbg, + int type, dword *value) +{ + const TilemCalc *calc = dbg->emu->calc; + dword page; + const char *s; + + g_return_val_if_fail(calc != NULL, 0); + + s = gtk_entry_get_text(GTK_ENTRY(he->addr_entry)); + if (!parse_num(dbg, s, value)) + return FALSE; + + if (type != TILEM_DB_BREAK_PHYSICAL) + return TRUE; + + s = gtk_entry_get_text(GTK_ENTRY(he->page_entry)); + if (!parse_num(dbg, s, &page)) + return FALSE; + + *value &= 0x3fff; + + if (page >= calc->hw.rampagemask) { + *value += ((page - calc->hw.rampagemask) << 14); + *value %= calc->hw.ramsize; + *value += calc->hw.romsize; + } + else { + *value += (page << 14); + *value %= calc->hw.romsize; + } + + return TRUE; +} + +/* Parse input fields and check if they make sense */ +static gboolean parse_input(struct breakpoint_dlg *bpdlg, + TilemDebugBreakpoint *bp) +{ + int i; + dword addr0, addr1; + + bp->mask = bp->start = bp->end = 0xffffffff; + bp->type = get_bp_type(bpdlg); + bp->mode = 0; + + for (i = 0; i < 3; i++) + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(bpdlg->access_cb[i]))) + bp->mode += (1 << i); + + bp->mode &= type_info[bp->type].access_mask; + if (bp->type == TILEM_DB_BREAK_OPCODE) + bp->mode = TILEM_DB_BREAK_EXEC; + else if (bp->mode == 0) + return FALSE; + + if (!hex_entry_parse_value(&bpdlg->start, bpdlg->dbg, + bp->type, &addr0)) + return FALSE; + + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(bpdlg->range_rb))) { + if (!hex_entry_parse_value(&bpdlg->end, bpdlg->dbg, + bp->type, &addr1)) + return FALSE; + } + else { + addr1 = addr0; + } + + if (bp->type == TILEM_DB_BREAK_LOGICAL) + bp->mask = 0xffff; + else if (bp->type == TILEM_DB_BREAK_PORT) + bp->mask = 0xff; + else + bp->mask = 0xffffffff; + + bp->start = addr0 & bp->mask; + bp->end = addr1 & bp->mask; + if (bp->end < bp->start) + return FALSE; + + return TRUE; +} + +/* Check if input fields are valid, and enable/disable OK response as + appropriate */ +static void validate(struct breakpoint_dlg *bpdlg) +{ + TilemDebugBreakpoint tmpbp; + + if (parse_input(bpdlg, &tmpbp)) + gtk_dialog_set_response_sensitive(GTK_DIALOG(bpdlg->dlg), + GTK_RESPONSE_OK, TRUE); + else + gtk_dialog_set_response_sensitive(GTK_DIALOG(bpdlg->dlg), + GTK_RESPONSE_OK, FALSE); +} + +/* Enable/disable check buttons for access mode */ +static void set_access_mask(struct breakpoint_dlg *bpdlg, guint mask) +{ + int i; + + if (mask) + gtk_widget_show(bpdlg->access_label); + else + gtk_widget_hide(bpdlg->access_label); + + for (i = 0; i < 3; i++) { + if (mask & (1 << i)) + gtk_widget_show(bpdlg->access_cb[i]); + else + gtk_widget_hide(bpdlg->access_cb[i]); + } +} + +/* Combo box changed */ +static void addr_type_changed(G_GNUC_UNUSED GtkComboBox *combo, gpointer data) +{ + struct breakpoint_dlg *bpdlg = data; + int type = get_bp_type(bpdlg); + gboolean range = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(bpdlg->range_rb)); + char *s; + + s = g_strdup_printf("%s", type_info[type].value_label); + gtk_label_set_markup(GTK_LABEL(bpdlg->address_label), s); + g_free(s); + + set_access_mask(bpdlg, type_info[type].access_mask); + + if (type_info[type].use_pages) { + gtk_widget_show(bpdlg->start.page_label); + gtk_widget_show(bpdlg->start.page_entry); + } + else { + gtk_widget_hide(bpdlg->start.page_label); + gtk_widget_hide(bpdlg->start.page_entry); + } + + if (range) { + gtk_label_set_text_with_mnemonic(GTK_LABEL(bpdlg->start.addr_label), + "_Start:"); + gtk_widget_show(bpdlg->end.addr_label); + gtk_widget_show(bpdlg->end.addr_entry); + } + else { + gtk_label_set_text_with_mnemonic(GTK_LABEL(bpdlg->start.addr_label), + "_Value:"); + gtk_widget_hide(bpdlg->end.addr_label); + gtk_widget_hide(bpdlg->end.addr_entry); + } + + if (type_info[type].use_pages && range) { + gtk_widget_show(bpdlg->end.page_label); + gtk_widget_show(bpdlg->end.page_entry); + } + else { + gtk_widget_hide(bpdlg->end.page_label); + gtk_widget_hide(bpdlg->end.page_entry); + } + + validate(bpdlg); +} + +/* Access mode changed */ +static void access_changed(G_GNUC_UNUSED GtkToggleButton *tb, gpointer data) +{ + struct breakpoint_dlg *bpdlg = data; + validate(bpdlg); +} + +/* Single/range mode changed */ +static void range_mode_changed(G_GNUC_UNUSED GtkToggleButton *tb, gpointer data) +{ + struct breakpoint_dlg *bpdlg = data; + addr_type_changed(NULL, bpdlg); +} + +/* Text of entry changed */ +static void entry_edited(G_GNUC_UNUSED GtkEntry *entry, + gpointer data) +{ + struct breakpoint_dlg *bpdlg = data; + validate(bpdlg); +} + +/* Key presssed in entry */ +static gboolean entry_key_event(G_GNUC_UNUSED GtkWidget *entry, + GdkEventKey *ev, gpointer data) +{ + struct breakpoint_dlg *bpdlg = data; + TilemDebugBreakpoint tmpbp; + + if (ev->state & GDK_MODIFIER_MASK) + return FALSE; + + if (ev->keyval != GDK_Return + && ev->keyval != GDK_KP_Enter + && ev->keyval != GDK_ISO_Enter) + return FALSE; + + if (parse_input(bpdlg, &tmpbp)) + gtk_dialog_response(GTK_DIALOG(bpdlg->dlg), GTK_RESPONSE_OK); + else + gtk_widget_child_focus(bpdlg->box, GTK_DIR_TAB_FORWARD); + + return TRUE; +} + +static void init_hex_entry(struct breakpoint_dlg *bpdlg, + struct hex_entry *he, const char *label, + GtkTable *tbl, int ypos) +{ + GtkWidget *align, *lbl; + + he->addr_label = lbl = gtk_label_new_with_mnemonic(label); + gtk_misc_set_alignment(GTK_MISC(lbl), LABEL_X_ALIGN, 0.5); + align = gtk_alignment_new(0.5, 0.5, 1.0, 1.0); + gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 0, 12, 6); + gtk_container_add(GTK_CONTAINER(align), lbl); + gtk_table_attach(tbl, align, 0, 1, ypos, ypos + 1, + GTK_FILL, GTK_FILL, 0, 0); + + he->addr_entry = gtk_entry_new(); + gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), he->addr_entry); + gtk_table_attach(tbl, he->addr_entry, 1, 2, ypos, ypos + 1, + GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); + + g_signal_connect(he->addr_entry, "changed", + G_CALLBACK(entry_edited), bpdlg); + g_signal_connect(he->addr_entry, "key-press-event", + G_CALLBACK(entry_key_event), bpdlg); + + he->page_label = lbl = gtk_label_new("Page:"); + gtk_misc_set_alignment(GTK_MISC(lbl), LABEL_X_ALIGN, 0.5); + gtk_table_attach(tbl, lbl, 2, 3, ypos, ypos + 1, + GTK_FILL, GTK_FILL, 6, 0); + + he->page_entry = gtk_entry_new(); + gtk_entry_set_width_chars(GTK_ENTRY(he->page_entry), 5); + gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), he->page_entry); + gtk_table_attach(tbl, he->page_entry, 3, 4, ypos, ypos + 1, + GTK_FILL, GTK_FILL, 0, 0); + + g_signal_connect(he->page_entry, "changed", + G_CALLBACK(entry_edited), bpdlg); + g_signal_connect(he->page_entry, "key-press-event", + G_CALLBACK(entry_key_event), bpdlg); +} + +static gboolean edit_breakpoint(TilemDebugger *dbg, + GtkWindow *parent_window, + const char *title, + TilemDebugBreakpoint *bp, + gboolean edit_existing) +{ + GtkWidget *dlg, *vbox, *frame, *tbl, *hbox, *lbl, *combo, *cb, *rb; + struct breakpoint_dlg bpdlg; + gsize i; + + g_return_val_if_fail(bp != NULL, FALSE); + g_return_val_if_fail(dbg != NULL, FALSE); + g_return_val_if_fail(dbg->emu != NULL, FALSE); + g_return_val_if_fail(dbg->emu->calc != NULL, FALSE); + + bpdlg.dbg = dbg; + + dlg = gtk_dialog_new_with_buttons(title, parent_window, + GTK_DIALOG_MODAL, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_set_alternative_button_order(GTK_DIALOG(dlg), + GTK_RESPONSE_OK, + GTK_RESPONSE_CANCEL, + -1); + gtk_dialog_set_default_response(GTK_DIALOG(dlg), + GTK_RESPONSE_OK); + + bpdlg.dlg = dlg; + + bpdlg.box = gtk_vbox_new(FALSE, 6); + gtk_container_set_border_width(GTK_CONTAINER(bpdlg.box), 6); + + tbl = gtk_table_new(2, 2, FALSE); + gtk_table_set_row_spacings(GTK_TABLE(tbl), 6); + gtk_table_set_col_spacings(GTK_TABLE(tbl), 6); + + /* Breakpoint type */ + + lbl = gtk_label_new_with_mnemonic("Breakpoint _type:"); + gtk_misc_set_alignment(GTK_MISC(lbl), LABEL_X_ALIGN, 0.5); + gtk_table_attach(GTK_TABLE(tbl), lbl, 0, 1, 0, 1, + GTK_FILL, GTK_FILL, 0, 0); + + combo = gtk_combo_box_new_text(); + for (i = 0; i < G_N_ELEMENTS(type_info); i++) + gtk_combo_box_append_text(GTK_COMBO_BOX(combo), type_info[i].desc); + + bpdlg.type_combo = combo; + gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), combo); + gtk_table_attach(GTK_TABLE(tbl), combo, 1, 2, 0, 1, + GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); + + gtk_combo_box_set_active(GTK_COMBO_BOX(combo), bp->type); + + /* Access mode */ + + bpdlg.access_label = lbl = gtk_label_new("Break when:"); + gtk_misc_set_alignment(GTK_MISC(lbl), LABEL_X_ALIGN, 0.5); + gtk_table_attach(GTK_TABLE(tbl), lbl, 0, 1, 1, 2, + GTK_FILL, GTK_FILL, 0, 0); + + hbox = gtk_hbox_new(FALSE, 6); + + cb = gtk_check_button_new_with_mnemonic("_Reading"); + gtk_box_pack_start(GTK_BOX(hbox), cb, FALSE, FALSE, 0); + bpdlg.access_cb[2] = cb; + + cb = gtk_check_button_new_with_mnemonic("_Writing"); + gtk_box_pack_start(GTK_BOX(hbox), cb, FALSE, FALSE, 0); + bpdlg.access_cb[1] = cb; + + cb = gtk_check_button_new_with_mnemonic("E_xecuting"); + gtk_box_pack_start(GTK_BOX(hbox), cb, FALSE, FALSE, 0); + bpdlg.access_cb[0] = cb; + + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bpdlg.access_cb[0]), + bp->mode & 1); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bpdlg.access_cb[1]), + bp->mode & 2); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bpdlg.access_cb[2]), + bp->mode & 4); + + gtk_table_attach(GTK_TABLE(tbl), hbox, 1, 2, 1, 2, + GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); + + frame = new_frame("Breakpoint Condition", tbl); + gtk_box_pack_start(GTK_BOX(bpdlg.box), frame, FALSE, FALSE, 0); + + /* Addresses */ + + tbl = gtk_table_new(3, 4, FALSE); + gtk_table_set_row_spacings(GTK_TABLE(tbl), 6); + + hbox = gtk_hbox_new(FALSE, 6); + + rb = gtk_radio_button_new_with_mnemonic(NULL, "Si_ngle"); + gtk_box_pack_start(GTK_BOX(hbox), rb, FALSE, FALSE, 0); + bpdlg.single_rb = rb; + + rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(rb), "R_ange"); + gtk_box_pack_start(GTK_BOX(hbox), rb, FALSE, FALSE, 0); + bpdlg.range_rb = rb; + + if (edit_existing && bp->end != bp->start) + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rb), TRUE); + + gtk_table_attach(GTK_TABLE(tbl), hbox, 0, 2, 0, 1, + GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); + + init_hex_entry(&bpdlg, &bpdlg.start, "S_tart:", GTK_TABLE(tbl), 1); + init_hex_entry(&bpdlg, &bpdlg.end, "_End:", GTK_TABLE(tbl), 2); + + frame = new_frame("Address", tbl); + bpdlg.address_label = gtk_frame_get_label_widget(GTK_FRAME(frame)); + gtk_box_pack_start(GTK_BOX(bpdlg.box), frame, FALSE, FALSE, 0); + gtk_widget_show_all(bpdlg.box); + + vbox = gtk_dialog_get_content_area(GTK_DIALOG(dlg)); + gtk_box_pack_start(GTK_BOX(vbox), bpdlg.box, FALSE, FALSE, 0); + + if (edit_existing) { + hex_entry_set_value(&bpdlg.start, dbg, bp->type, bp->start); + hex_entry_set_value(&bpdlg.end, dbg, bp->type, bp->end); + } + + g_signal_connect(combo, "changed", + G_CALLBACK(addr_type_changed), &bpdlg); + g_signal_connect(bpdlg.access_cb[0], "toggled", + G_CALLBACK(access_changed), &bpdlg); + g_signal_connect(bpdlg.access_cb[1], "toggled", + G_CALLBACK(access_changed), &bpdlg); + g_signal_connect(bpdlg.access_cb[2], "toggled", + G_CALLBACK(access_changed), &bpdlg); + g_signal_connect(bpdlg.single_rb, "toggled", + G_CALLBACK(range_mode_changed), &bpdlg); + + addr_type_changed(NULL, &bpdlg); + + gtk_widget_grab_focus(bpdlg.start.addr_entry); + + do { + if (gtk_dialog_run(GTK_DIALOG(dlg)) != GTK_RESPONSE_OK) { + gtk_widget_destroy(dlg); + return FALSE; + } + } while (!parse_input(&bpdlg, bp)); + + gtk_widget_destroy(dlg); + return TRUE; +} + +/**************** Breakpoint list dialog ****************/ + +enum { + COL_BP, + COL_START, + COL_END, + COL_TYPE_STR, + COL_START_STR, + COL_END_STR, + COL_ENABLED, + N_COLUMNS +}; + +struct bplist_dlg { + TilemDebugger *dbg; + GtkWidget *dlg; + GtkListStore *store; + GtkWidget *treeview; + GtkWidget *remove_btn; + GtkWidget *edit_btn; + GtkWidget *clear_btn; +}; + +/* Convert address into a displayable string */ +static void format_address(TilemDebugger *dbg, + char *buf, int bufsize, + int type, dword value) +{ + const TilemCalc *calc; + unsigned int page; + + g_return_if_fail(dbg->emu != NULL); + g_return_if_fail(dbg->emu->calc != NULL); + + calc = dbg->emu->calc; + + switch (type) { + case TILEM_DB_BREAK_LOGICAL: + g_snprintf(buf, bufsize, "%04X", value); + break; + + case TILEM_DB_BREAK_PHYSICAL: + if (value >= calc->hw.romsize) { + value -= calc->hw.romsize; + page = (value >> 14) + calc->hw.rampagemask; + } + else { + page = (value >> 14); + } + + g_snprintf(buf, bufsize, "%02X:%04X", page, value & 0x3fff); + break; + + case TILEM_DB_BREAK_PORT: + g_snprintf(buf, bufsize, "%02X", value); + break; + + case TILEM_DB_BREAK_OPCODE: + if (value < 0x100) + g_snprintf(buf, bufsize, "%02X", value); + else if (value < 0x10000) + g_snprintf(buf, bufsize, "%04X", value); + else if (value < 0x1000000) + g_snprintf(buf, bufsize, "%06X", value); + else + g_snprintf(buf, bufsize, "%08X", value); + break; + + default: + g_return_if_reached(); + } +} + +/* Store breakpoint properties in tree model */ +static void set_iter_from_bp(struct bplist_dlg *bpldlg, GtkTreeIter *iter, + const TilemDebugBreakpoint *bp) +{ + char tbuf[5], sbuf[10], ebuf[10]; + int i, j; + + g_return_if_fail(bp != NULL); + + tbuf[0] = type_info[bp->type].abbrev; + j = 1; + for (i = 0; i < 3; i++) + if (bp->mode & (4 >> i)) + tbuf[j++] = "RWX"[i]; + tbuf[j] = 0; + + format_address(bpldlg->dbg, sbuf, sizeof(sbuf), bp->type, bp->start); + format_address(bpldlg->dbg, ebuf, sizeof(ebuf), bp->type, bp->end); + + gtk_list_store_set(bpldlg->store, iter, + COL_BP, bp, + COL_START, bp->start, + COL_END, bp->end, + COL_TYPE_STR, tbuf, + COL_START_STR, sbuf, + COL_END_STR, ebuf, + COL_ENABLED, !bp->disabled, + -1); +} + +/* Get breakpoint pointer for the given tree model row */ +static TilemDebugBreakpoint *get_iter_bp(struct bplist_dlg *bpldlg, + GtkTreeIter *iter) +{ + gpointer ptr; + gtk_tree_model_get(GTK_TREE_MODEL(bpldlg->store), iter, + COL_BP, &ptr, -1); + return (TilemDebugBreakpoint *) ptr; +} + +/* Set buttons sensitive or insensitive depending on whether any BPs + are selected */ +static void update_buttons(struct bplist_dlg *bpldlg) +{ + GtkTreeSelection *sel; + gboolean any_sel; + + sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(bpldlg->treeview)); + + any_sel = gtk_tree_selection_get_selected(sel, NULL, NULL); + gtk_widget_set_sensitive(bpldlg->remove_btn, any_sel); + gtk_widget_set_sensitive(bpldlg->edit_btn, any_sel); + + gtk_widget_set_sensitive(bpldlg->clear_btn, + bpldlg->dbg->breakpoints != NULL); +} + +/* "Add breakpoint" button clicked */ +static void add_clicked(G_GNUC_UNUSED GtkButton *btn, gpointer data) +{ + struct bplist_dlg *bpldlg = data; + TilemDebugBreakpoint tmpbp, *newbp; + TilemDebugger *dbg = bpldlg->dbg; + GtkTreeIter iter; + + memset(&tmpbp, 0, sizeof(tmpbp)); + tmpbp.type = dbg->last_bp_type; + tmpbp.mode = dbg->last_bp_mode; + + if (!edit_breakpoint(dbg, GTK_WINDOW(bpldlg->dlg), + "Add Breakpoint", &tmpbp, FALSE)) + return; + + dbg->last_bp_type = tmpbp.type; + dbg->last_bp_mode = tmpbp.mode; + + newbp = tilem_debugger_add_breakpoint(dbg, &tmpbp); + gtk_list_store_append(bpldlg->store, &iter); + set_iter_from_bp(bpldlg, &iter, newbp); + + update_buttons(bpldlg); +} + +/* "Remove breakpoint" button clicked */ +static void remove_clicked(G_GNUC_UNUSED GtkButton *btn, gpointer data) +{ + struct bplist_dlg *bpldlg = data; + GtkTreeSelection *sel; + GtkTreeIter iter; + TilemDebugBreakpoint *bp; + + sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(bpldlg->treeview)); + + if (!gtk_tree_selection_get_selected(sel, NULL, &iter)) + return; + + bp = get_iter_bp(bpldlg, &iter); + g_return_if_fail(bp != NULL); + gtk_list_store_remove(bpldlg->store, &iter); + tilem_debugger_remove_breakpoint(bpldlg->dbg, bp); + + update_buttons(bpldlg); +} + +/* Edit an existing breakpoint */ +static void edit_row(struct bplist_dlg *bpldlg, GtkTreeIter *iter) +{ + TilemDebugBreakpoint *bp, tmpbp; + + bp = get_iter_bp(bpldlg, iter); + g_return_if_fail(bp != NULL); + tmpbp = *bp; + + if (!edit_breakpoint(bpldlg->dbg, GTK_WINDOW(bpldlg->dlg), + "Edit Breakpoint", &tmpbp, TRUE)) + return; + + tmpbp.disabled = 0; + tilem_debugger_change_breakpoint(bpldlg->dbg, bp, &tmpbp); + set_iter_from_bp(bpldlg, iter, bp); + + update_buttons(bpldlg); +} + +/* "Edit breakpoint" button clicked */ +static void edit_clicked(G_GNUC_UNUSED GtkButton *btn, gpointer data) +{ + struct bplist_dlg *bpldlg = data; + GtkTreeSelection *sel; + GtkTreeIter iter; + + sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(bpldlg->treeview)); + + if (!gtk_tree_selection_get_selected(sel, NULL, &iter)) + return; + + edit_row(bpldlg, &iter); +} + +/* "Clear breakpoints" button clicked */ +static void clear_clicked(G_GNUC_UNUSED GtkButton *btn, gpointer data) +{ + struct bplist_dlg *bpldlg = data; + GtkWidget *dlg; + TilemDebugBreakpoint *bp; + + dlg = gtk_message_dialog_new(GTK_WINDOW(bpldlg->dlg), + GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, + GTK_BUTTONS_NONE, + "Clear all breakpoints?"); + gtk_message_dialog_format_secondary_markup + (GTK_MESSAGE_DIALOG(dlg), + "All existing breakpoints will be deleted and" + " cannot be restored."); + gtk_dialog_add_buttons(GTK_DIALOG(dlg), + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_CLEAR, GTK_RESPONSE_ACCEPT, + NULL); + gtk_dialog_set_alternative_button_order(GTK_DIALOG(dlg), + GTK_RESPONSE_ACCEPT, + GTK_RESPONSE_CANCEL, + -1); + + if (gtk_dialog_run(GTK_DIALOG(dlg)) == GTK_RESPONSE_ACCEPT) { + while (bpldlg->dbg->breakpoints) { + bp = bpldlg->dbg->breakpoints->data; + tilem_debugger_remove_breakpoint(bpldlg->dbg, bp); + } + gtk_list_store_clear(bpldlg->store); + update_buttons(bpldlg); + } + + gtk_widget_destroy(dlg); +} + +/* Row activated (double-clicked, usually) */ +static void row_activated(G_GNUC_UNUSED GtkTreeView *treeview, + GtkTreePath *path, + G_GNUC_UNUSED GtkTreeViewColumn *col, + gpointer data) +{ + struct bplist_dlg *bpldlg = data; + GtkTreeIter iter; + + if (gtk_tree_model_get_iter(GTK_TREE_MODEL(bpldlg->store), + &iter, path)) + edit_row(bpldlg, &iter); +} + +/* Toggle button clicked for a breakpoint */ +static void enabled_toggled(G_GNUC_UNUSED GtkCellRendererToggle *cell, + gchar *pathstr, gpointer data) +{ + struct bplist_dlg *bpldlg = data; + GtkTreePath *path; + GtkTreeIter iter; + TilemDebugBreakpoint *bp, tmpbp; + + path = gtk_tree_path_new_from_string(pathstr); + if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(bpldlg->store), + &iter, path)) { + gtk_tree_path_free(path); + return; + } + gtk_tree_path_free(path); + + bp = get_iter_bp(bpldlg, &iter); + g_return_if_fail(bp != NULL); + tmpbp = *bp; + tmpbp.disabled = !tmpbp.disabled; + tilem_debugger_change_breakpoint(bpldlg->dbg, bp, &tmpbp); + set_iter_from_bp(bpldlg, &iter, bp); +} + +/* Selection changed */ +static void selection_changed(G_GNUC_UNUSED GtkTreeSelection *sel, + gpointer data) +{ + struct bplist_dlg *bpldlg = data; + update_buttons(bpldlg); +} + +/* Show a dialog letting the user add, remove, and edit breakpoints */ +void tilem_debugger_edit_breakpoints(TilemDebugger *dbg) +{ + struct bplist_dlg bpldlg; + GtkWidget *dlg, *hbox, *treeview, *sw, *bbox, *btn, *vbox, *vbox2, + *invalid_cb, *undoc_cb; + GtkListStore *store; + GtkTreeViewColumn *col; + GtkCellRenderer *cell; + GtkTreeIter iter; + GSList *l; + GtkTreeSelection *sel; + unsigned int flags; + + g_return_if_fail(dbg != NULL); + g_return_if_fail(dbg->emu != NULL); + g_return_if_fail(dbg->emu->calc != NULL); + + bpldlg.dbg = dbg; + + dlg = gtk_dialog_new_with_buttons("Breakpoints", + GTK_WINDOW(dbg->window), + GTK_DIALOG_MODAL, + GTK_STOCK_CLOSE, + GTK_RESPONSE_ACCEPT, + NULL); + + gtk_window_set_default_size(GTK_WINDOW(dlg), -1, 300); + + store = gtk_list_store_new(N_COLUMNS, + G_TYPE_POINTER, + G_TYPE_INT, + G_TYPE_INT, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_BOOLEAN); + + bpldlg.dlg = dlg; + bpldlg.store = store; + + vbox = gtk_vbox_new(FALSE, 6); + gtk_container_set_border_width(GTK_CONTAINER(vbox), 6); + + hbox = gtk_hbox_new(FALSE, 6); + + for (l = dbg->breakpoints; l; l = l->next) { + gtk_list_store_append(store, &iter); + set_iter_from_bp(&bpldlg, &iter, l->data); + } + + treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), TRUE); + gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(treeview), TRUE); + gtk_tree_view_set_fixed_height_mode(GTK_TREE_VIEW(treeview), TRUE); + bpldlg.treeview = treeview; + + fixed_tree_view_init(treeview, 0, + COL_TYPE_STR, "MRWX ", + COL_START_STR, "DD:DDDD ", + COL_END_STR, "DD:DDDD ", + COL_ENABLED, TRUE, + -1); + + g_signal_connect(treeview, "row-activated", + G_CALLBACK(row_activated), &bpldlg); + + /* Enabled/type column */ + + col = gtk_tree_view_column_new(); + gtk_tree_view_column_set_title(col, "Type"); + gtk_tree_view_column_set_sort_column_id(col, COL_TYPE_STR); + gtk_tree_view_column_set_sizing(col, GTK_TREE_VIEW_COLUMN_FIXED); + + cell = gtk_cell_renderer_toggle_new(); + gtk_tree_view_column_pack_start(col, cell, FALSE); + gtk_tree_view_column_set_attributes(col, cell, + "active", COL_ENABLED, + NULL); + g_signal_connect(cell, "toggled", + G_CALLBACK(enabled_toggled), &bpldlg); + + cell = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(col, cell, TRUE); + gtk_tree_view_column_set_attributes(col, cell, + "text", COL_TYPE_STR, + NULL); + + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), col); + + /* Start column */ + + cell = gtk_cell_renderer_text_new(); + col = gtk_tree_view_column_new_with_attributes + ("Start", cell, "text", COL_START_STR, NULL); + gtk_tree_view_column_set_sort_column_id(col, COL_START); + gtk_tree_view_column_set_sizing(col, GTK_TREE_VIEW_COLUMN_FIXED); + + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), col); + + /* End column */ + + cell = gtk_cell_renderer_text_new(); + col = gtk_tree_view_column_new_with_attributes + ("End", cell, "text", COL_END_STR, NULL); + gtk_tree_view_column_set_sort_column_id(col, COL_END); + gtk_tree_view_column_set_sizing(col, GTK_TREE_VIEW_COLUMN_FIXED); + + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), col); + + sw = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), + GTK_POLICY_NEVER, + GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), + GTK_SHADOW_IN); + gtk_container_add(GTK_CONTAINER(sw), treeview); + + gtk_box_pack_start(GTK_BOX(hbox), sw, TRUE, TRUE, 0); + + /* Buttons */ + + bbox = gtk_vbutton_box_new(); + gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_START); + gtk_box_set_spacing(GTK_BOX(bbox), 6); + + btn = gtk_button_new_from_stock(GTK_STOCK_ADD); + g_signal_connect(btn, "clicked", + G_CALLBACK(add_clicked), &bpldlg); + gtk_container_add(GTK_CONTAINER(bbox), btn); + + btn = gtk_button_new_from_stock(GTK_STOCK_REMOVE); + g_signal_connect(btn, "clicked", + G_CALLBACK(remove_clicked), &bpldlg); + gtk_container_add(GTK_CONTAINER(bbox), btn); + bpldlg.remove_btn = btn; + + btn = gtk_button_new_from_stock(GTK_STOCK_EDIT); + g_signal_connect(btn, "clicked", + G_CALLBACK(edit_clicked), &bpldlg); + gtk_container_add(GTK_CONTAINER(bbox), btn); + bpldlg.edit_btn = btn; + + btn = gtk_button_new_from_stock(GTK_STOCK_CLEAR); + g_signal_connect(btn, "clicked", + G_CALLBACK(clear_clicked), &bpldlg); + gtk_container_add(GTK_CONTAINER(bbox), btn); + bpldlg.clear_btn = btn; + + sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); + g_signal_connect(sel, "changed", + G_CALLBACK(selection_changed), &bpldlg); + + update_buttons(&bpldlg); + + gtk_box_pack_start(GTK_BOX(hbox), bbox, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0); + + invalid_cb = gtk_check_button_new_with_mnemonic + ("Break on _invalid instructions"); + undoc_cb = gtk_check_button_new_with_mnemonic + ("Break on _undocumented instructions"); + + tilem_calc_emulator_lock(dbg->emu); + flags = dbg->emu->calc->z80.emuflags; + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(invalid_cb), + (flags & TILEM_Z80_BREAK_INVALID)); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(undoc_cb), + (flags & TILEM_Z80_BREAK_UNDOCUMENTED)); + tilem_calc_emulator_unlock(dbg->emu); + + gtk_box_pack_start(GTK_BOX(vbox), invalid_cb, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox), undoc_cb, FALSE, FALSE, 0); + + gtk_widget_show_all(vbox); + + gtk_widget_grab_focus(treeview); + + vbox2 = gtk_dialog_get_content_area(GTK_DIALOG(dlg)); + gtk_box_pack_start(GTK_BOX(vbox2), vbox, TRUE, TRUE, 0); + + gtk_dialog_run(GTK_DIALOG(dlg)); + + tilem_calc_emulator_lock(dbg->emu); + flags = dbg->emu->calc->z80.emuflags; + flags &= ~(TILEM_Z80_BREAK_INVALID | TILEM_Z80_BREAK_UNDOCUMENTED); + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(invalid_cb))) + flags |= TILEM_Z80_BREAK_INVALID; + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(undoc_cb))) + flags |= TILEM_Z80_BREAK_UNDOCUMENTED; + dbg->emu->calc->z80.emuflags = flags; + tilem_calc_emulator_unlock(dbg->emu); + + gtk_widget_destroy(dlg); +} diff --git a/tool/tilem-src/gui/charmap.c b/tool/tilem-src/gui/charmap.c new file mode 100644 index 0000000..c3acf69 --- /dev/null +++ b/tool/tilem-src/gui/charmap.c @@ -0,0 +1,127 @@ +/* + * TilEm II + * + * Copyright (c) 2011 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include + +#include "charmap.h" + +#define UNDEF 0xfffd + +static const unsigned long ti81chars[256] = { + 0, ' ', 0x2192, 0x2191, 0x2193, 0x25B6, '<', 0x2264, + '=', 0x2260, '>', 0x2265, 0x3D20DE, 0x207C, '+', '-', + '*', '/', '^', 0x221A, '(', ')', '[', ']', + '{', '}', '?', '!', ':', ',', 0x2026, 0x207B00B9, + 0x207B, 0xB7, 0x2070, 0xB9, 0xB2, 0xB3, 0x2074, 0x2075, + 0x2076, 0x2077, 0x2078, 0x2079, 'E', 0x2081, 0x2082, 0x2083, + 0x2084, 0x23E8, 0x209C, '"', 0x207B, '.', '0', '1', + '2', '3', '4', '5', '6', '7', '8', '9', + 'E', 0x2B3, 0xB0, 0x3B8, 'R', 'T', 0x2E3, 0x2B8, + 0x780305, 0x790305, 0x3A3, 0x3C3, 0x3C0, 'A', 'B', 'C', + 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', + 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', + 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 0x3B8, + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', + 'i', 'l', 'm', 'n', 'o', 'p', 'q', 'r', + 's', 't', 'u', 'v', 'w', 'x', 'y', 0xD7, + 0x2588, 0x219120DE, 0x4120DE, '_', 0x21910332, 0x410332, UNDEF, UNDEF, + UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, + UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, + UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, + UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, + UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, + UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, + UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, + UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, + UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, + UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, + UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, + UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, + UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, + UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, + UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF }; + +static const unsigned long * getmap(int model) +{ + switch (model) { + case TILEM_CALC_TI73: + return ti73_charset; + case TILEM_CALC_TI81: + return ti81chars; + case TILEM_CALC_TI82: + return ti82_charset; + case TILEM_CALC_TI76: + case TILEM_CALC_TI83: + return ti83_charset; + case TILEM_CALC_TI83P: + case TILEM_CALC_TI83P_SE: + case TILEM_CALC_TI84P: + case TILEM_CALC_TI84P_SE: + case TILEM_CALC_TI84P_NSPIRE: + return ti83p_charset; + case TILEM_CALC_TI85: + return ti85_charset; + case TILEM_CALC_TI86: + return ti86_charset; + default: + return ti83p_charset; + } +} + +/* Convert a byte value from the calculator large-font character set + into a printable UTF-8 string. */ +char *ti_to_unicode(int model, unsigned int value) +{ + const unsigned long *map = getmap(model); + unsigned long v; + char buf[12]; + int n; + + v = map[value]; + if (v == 0) + v = 0x2400; /* SYMBOL FOR NULL */ + else if (v == '\n') + v = 0x240A; /* SYMBOL FOR LINE FEED */ + else if (v == ' ') + v = 0x2423; /* OPEN BOX */ + + /* in the ticonv character tables, non-BMP characters are + represented by a surrogate pair */ + if ((v & 0xfc00fc00) == 0xd800dc00) { + v = (((v & 0x3ff0000) >> 6) | (v & 0x3ff)) + 0x10000; + n = g_unichar_to_utf8(v, buf); + } + else if (v & 0xffff0000) { + n = g_unichar_to_utf8(v >> 16, buf); + n += g_unichar_to_utf8(v & 0xffff, buf + n); + } + else { + n = g_unichar_to_utf8(v, buf); + } + + return g_strndup(buf, n); +} diff --git a/tool/tilem-src/gui/charmap.h b/tool/tilem-src/gui/charmap.h new file mode 100644 index 0000000..c383a94 --- /dev/null +++ b/tool/tilem-src/gui/charmap.h @@ -0,0 +1,22 @@ +/* + * TilEm II + * + * Copyright (c) 2011 Benjamin Moody + * + * 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 . + */ + +/* Convert a byte value from the calculator large-font character set + into a printable UTF-8 string. */ +char *ti_to_unicode(int model, unsigned int value); diff --git a/tool/tilem-src/gui/config.c b/tool/tilem-src/gui/config.c new file mode 100644 index 0000000..4a00827 --- /dev/null +++ b/tool/tilem-src/gui/config.c @@ -0,0 +1,338 @@ +/* + * TilEm II + * + * Copyright (c) 2010-2011 Thibault Duponchelle + * Copyright (c) 2011 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include "gui.h" +#include "files.h" +#include "msgbox.h" + +#ifndef CONFIG_FILE +#define CONFIG_FILE "config.ini" +#endif + +#define MAX_RECENT_FILES 10 + +/* Store a filename in a GKeyFile. Any control characters or + non-UTF-8 filenames are stored in octal. Note that + g_key_file_set/get_string() can't be used because they only allow + UTF-8 */ +static void key_file_set_filename(GKeyFile *gkf, const char *group, + const char *key, const char *value) +{ + char *escaped; + const char *p; + char *q; + gunichar uc; + int b; + + q = escaped = g_new(char, strlen(value) * 4 + 1); + + while (*value != 0) { + uc = g_utf8_get_char_validated(value, -1); + if (uc < 0x20 || uc == 0x7F || !g_unichar_validate(uc)) { + b = (unsigned char) *value; + q[0] = '\\'; + q[1] = '0' + (b >> 6); + q[2] = '0' + ((b >> 3) & 7); + q[3] = '0' + (b & 7); + q += 4; + value++; + } + else if (uc == '\\') { + q[0] = q[1] = '\\'; + q += 2; + value++; + } + else { + p = g_utf8_next_char(value); + while (value != p) + *q++ = *value++; + } + } + + *q = 0; + + g_key_file_set_value(gkf, group, key, escaped); + g_free(escaped); +} + +/* Retrieve a filename from a GKeyFile. */ +static char *key_file_get_filename(GKeyFile *gkf, const char *group, + const char *key, GError **error) +{ + char *value, *unescaped; + + value = g_key_file_get_value(gkf, group, key, error); + if (!value) + return NULL; + + unescaped = g_strcompress(value); + g_free(value); + return unescaped; +} + +/* Load and parse the configuration file. */ +static GKeyFile *load_config(gboolean writable) +{ + static gboolean warned; + GKeyFile *gkf; + GKeyFileFlags flags; + char *cfname, *dname; + GError *err = NULL; + + gkf = g_key_file_new(); + + cfname = get_shared_file_path(CONFIG_FILE, NULL); + if (!cfname) + return gkf; + + if (writable) + flags = (G_KEY_FILE_KEEP_COMMENTS + | G_KEY_FILE_KEEP_TRANSLATIONS); + else + flags = 0; + + if (!g_key_file_load_from_file(gkf, cfname, flags, &err)) { + /* don't bother the user more than once */ + if (!warned) { + dname = g_filename_display_name(cfname); + messagebox02(NULL, GTK_MESSAGE_ERROR, + "Unable to read settings", + "An error occurred while reading %s: %s", + dname, err->message); + g_free(dname); + warned = TRUE; + } + g_error_free(err); + } + + g_free(cfname); + return gkf; +} + +/* Save the configuration file. */ +static void save_config(GKeyFile *gkf) +{ + static gboolean warned; + char *cfname, *dname; + char *data; + gsize length; + GError *err = NULL; + + data = g_key_file_to_data(gkf, &length, NULL); + + cfname = get_config_file_path(CONFIG_FILE, NULL); + + if (!g_file_set_contents(cfname, data, length, &err)) { + /* don't bother the user more than once */ + if (!warned) { + dname = g_filename_display_name(cfname); + messagebox02(NULL, GTK_MESSAGE_ERROR, + "Unable to save settings", + "An error occurred while writing %s: %s", + dname, err->message); + g_free(dname); + warned = TRUE; + } + g_error_free(err); + } + + g_free(cfname); + g_free(data); +} + +/* Retrieve settings from the configuration file. */ +void tilem_config_get(const char *group, const char *option, ...) +{ + va_list ap; + GKeyFile *gkf; + const char *type, *defvalue; + GError *err = NULL; + char *key, *p; + char **strp; + int *intp; + double *dblp; + GdkColor *colorp; + + g_return_if_fail(group != NULL); + g_return_if_fail(option != NULL); + + gkf = load_config(FALSE); + + va_start(ap, option); + while (option != NULL) { + type = strrchr(option, '/'); + if (type == NULL || type[1] == 0 + || (type[2] != 0 && type[2] != '=')) { + g_critical("invalid argument\n"); + break; + } + + if (type[2] == '=') + defvalue = &type[3]; + else + defvalue = NULL; + + key = g_strndup(option, type - option); + + if (type[1] == 'f') { + strp = va_arg(ap, char **); + *strp = key_file_get_filename(gkf, group, key, &err); + if (err && defvalue) + *strp = g_strdup(defvalue); + } + else if (type[1] == 's') { + strp = va_arg(ap, char **); + *strp = g_key_file_get_string(gkf, group, key, &err); + if (err && defvalue) + *strp = g_strdup(defvalue); + } + else if (type[1] == 'i') { + intp = va_arg(ap, int *); + *intp = g_key_file_get_integer(gkf, group, key, &err); + if (err && defvalue) + *intp = g_ascii_strtoll(defvalue, NULL, 10); + } + else if (type[1] == 'r') { + dblp = va_arg(ap, double *); + *dblp = g_key_file_get_double(gkf, group, key, &err); + if (err && defvalue) + *dblp = g_ascii_strtod(defvalue, NULL); + } + else if (type[1] == 'b') { + intp = va_arg(ap, int *); + *intp = g_key_file_get_boolean(gkf, group, key, &err); + if (err && defvalue) + *intp = g_ascii_strtoll(defvalue, NULL, 10); + } + else if (type[1] == 'c') { + colorp = va_arg(ap, GdkColor *); + p = g_key_file_get_string(gkf, group, key, &err); + if (p == NULL || !gdk_color_parse(p, colorp)) { + if (defvalue) { + gdk_color_parse(defvalue, colorp); + } + else { + colorp->red = 0; + colorp->green = 0; + colorp->blue = 0; + } + } + g_free(p); + } + else { + g_critical("invalid argument\n"); + g_free(key); + break; + } + + g_clear_error(&err); + g_free(key); + option = va_arg(ap, const char *); + } + va_end(ap); + + g_key_file_free(gkf); +} + +/* Save settings to the configuration file. */ +void tilem_config_set(const char *group, const char *option, ...) +{ + va_list ap; + GKeyFile *gkf; + const char *type; + char *key; + const char *strv; + int intv; + double dblv; + const GdkColor *colorv; + char *p; + + g_return_if_fail(group != NULL); + g_return_if_fail(option != NULL); + + gkf = load_config(TRUE); + + va_start(ap, option); + while (option != NULL) { + type = strrchr(option, '/'); + if (type == NULL || type[1] == 0 || type[2] != 0) { + g_critical("invalid argument\n"); + break; + } + + key = g_strndup(option, type - option); + + if (type[1] == 'f') { + strv = va_arg(ap, const char *); + key_file_set_filename(gkf, group, key, strv); + } + else if (type[1] == 's') { + strv = va_arg(ap, const char *); + g_key_file_set_string(gkf, group, key, strv); + } + else if (type[1] == 'i') { + intv = va_arg(ap, int); + g_key_file_set_integer(gkf, group, key, intv); + } + else if (type[1] == 'r') { + dblv = va_arg(ap, double); + g_key_file_set_double(gkf, group, key, dblv); + } + else if (type[1] == 'b') { + intv = va_arg(ap, int); + g_key_file_set_boolean(gkf, group, key, !!intv); + } + else if (type[1] == 'c') { + colorv = va_arg(ap, const GdkColor *); + p = g_strdup_printf("#%02x%02x%02x", + colorv->red >> 8, + colorv->green >> 8, + colorv->blue >> 8); + g_key_file_set_string(gkf, group, key, p); + g_free(p); + } + else { + g_critical("invalid argument\n"); + g_free(key); + break; + } + + g_free(key); + + option = va_arg(ap, const char *); + } + va_end(ap); + + save_config(gkf); + g_key_file_free(gkf); +} + diff --git a/tool/tilem-src/gui/debugger.c b/tool/tilem-src/gui/debugger.c new file mode 100644 index 0000000..aac8708 --- /dev/null +++ b/tool/tilem-src/gui/debugger.c @@ -0,0 +1,1420 @@ +/* + * TilEm II + * + * Copyright (c) 2010-2011 Thibault Duponchelle + * Copyright (c) 2010-2012 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gui.h" +#include "disasmview.h" +#include "files.h" +#include "msgbox.h" +#include "fixedtreeview.h" +#include "memmodel.h" + +/* Stack list */ +enum +{ + COL_OFFSET_STK = 0, + COL_VALUE_STK, + NUM_COLS_STK +}; + +/* Indices in reg_entries */ +enum { + R_AF, R_BC, R_DE, R_HL, R_IX, R_SP, + R_AF2, R_BC2, R_DE2, R_HL2, R_IY, R_PC, + R_IM, R_I, + NUM_REGS +}; + +/* Labels for the entries */ +static const char * const reg_labels[] = { + "A_F:", "B_C:", "D_E:", "H_L:", "I_X:", "SP:", + "AF':", "BC':", "DE':", "HL':", "I_Y:", "PC:", + "IM:", "I:" +}; + +/* Labels for the flag buttons */ +static const char flag_labels[][2] = { + "C", "N", "P", "X", "H", "Y", "Z", "S" +}; + +/* Read a word */ +static dword read_mem_word(TilemCalc *calc, dword addr) +{ + dword phys, v; + + phys = (*calc->hw.mem_ltop)(calc, addr & 0xffff); + v = calc->mem[phys]; + phys = (*calc->hw.mem_ltop)(calc, (addr + 1) & 0xffff); + v += calc->mem[phys] << 8; + return v; +} + +/* Determine model name for the purpose of looking up default system + symbols */ +static const char *get_sys_name(const TilemCalc *calc) +{ + g_return_val_if_fail(calc != NULL, NULL); + + switch (calc->hw.model_id) { + case TILEM_CALC_TI83: + case TILEM_CALC_TI76: + return "ti83"; + + case TILEM_CALC_TI83P: + case TILEM_CALC_TI83P_SE: + case TILEM_CALC_TI84P: + case TILEM_CALC_TI84P_SE: + case TILEM_CALC_TI84P_NSPIRE: + return "ti83p"; + + default: + return calc->hw.name; + } +} + +/* Load default system symbols */ +static void load_default_symbols(TilemDebugger *dbg) +{ + char *base, *path, *dname; + const char *errstr; + FILE *symfile; + + base = g_strdup_printf("%s.sym", get_sys_name(dbg->emu->calc)); + path = get_shared_file_path("symbols", base, NULL); + g_free(base); + if (!path) + return; + + symfile = g_fopen(path, "rb"); + if (!symfile) { + errstr = g_strerror(errno); + dname = g_filename_display_name(path); + messagebox02(NULL, GTK_MESSAGE_ERROR, + "Unable to read symbols", + "An error occurred while reading %s: %s", + dname, errstr); + g_free(dname); + g_free(path); + return; + } + + tilem_disasm_read_symbol_file(dbg->dasm, symfile); + + fclose(symfile); + g_free(path); +} + +/* Cancel temporary breakpoint */ +static void cancel_step_bp(TilemDebugger *dbg) +{ + if (!dbg->step_bp) + return; + + g_return_if_fail(dbg->emu->calc != NULL); + tilem_calc_emulator_lock(dbg->emu); + tilem_z80_remove_breakpoint(dbg->emu->calc, dbg->step_bp); + tilem_calc_emulator_unlock(dbg->emu); + dbg->step_bp = 0; +} + +/* Actions */ + +/* Run (but leave debugger window open) */ +static void action_run(G_GNUC_UNUSED GtkAction *a, gpointer data) +{ + TilemDebugger *dbg = data; + cancel_step_bp(dbg); + tilem_calc_emulator_run(dbg->emu); + tilem_debugger_refresh(dbg, TRUE); +} + +/* Pause */ +static void action_pause(G_GNUC_UNUSED GtkAction *a, gpointer data) +{ + TilemDebugger *dbg = data; + tilem_debugger_show(dbg); + cancel_step_bp(dbg); +} + +/* Stepping */ + +static int bptest_step(TilemCalc *calc, dword op, G_GNUC_UNUSED void *data) +{ + /* Single step condition: if calculator is halted, wait until + an interrupt occurs; otherwise, stop after any + instruction. */ + + if (op != 0x76 && (op & ~0x2000) != 0xdd76) + /* not a HALT instruction */ + return 1; + else if (calc->z80.interrupts != 0 && calc->z80.r.iff1) + return 1; + else + return 0; +} + +static int bptest_step_over(TilemCalc *calc, dword op, void *data) +{ + TilemDebugger *dbg = data; + dword destaddr; + + /* Step-over condition: behavior depends on what instruction + is executed. + + For most instructions, stop when we reach the "next line" + as determined by disassembly. This means skipping over + CALLs, RSTs, HALTs, and macros. + + For jump and return instructions, stop at the current PC, + whatever that is. + + In both cases, wait until we actually reach the target PC, + rather than halting immediately; the effect of this is that + if an interrupt has occurred, we also "step over" the + ISR. */ + + if ((op & ~0x20ff) == 0xdd00) + op &= 0xff; + + if (op == 0xc3 /* JP */ + || op == 0xc9 /* RET */ + || op == 0xe9 /* JP HL/IX/IY */ + || (op & ~0x38) == 0 /* JR, DJNZ, NOP, or EX AF,AF' */ + || (op & ~0x38) == 0xc2 /* conditional JP */ + || (op & ~0x38) == 0xc0 /* conditional RET */ + || (op & ~0x38) == 0xed45) /* RETI/RETN */ + destaddr = calc->z80.r.pc.d; + else + destaddr = dbg->step_next_addr; + + destaddr &= 0xffff; + + /* Delete this breakpoint, and replace it with a simple exec + breakpoint at the target address. */ + + tilem_z80_remove_breakpoint(calc, dbg->step_bp); + dbg->step_bp = tilem_z80_add_breakpoint(calc, TILEM_BREAK_MEM_EXEC, + destaddr, destaddr, 0xffff, + NULL, NULL); + return 0; +} + +static int bptest_finish(TilemCalc *calc, dword op, void *data) +{ + dword exitsp = TILEM_PTR_TO_DWORD(data); + byte f; + + /* Finish condition: wait until stack pointer is greater than + a certain value, and we execute a return instruction. JP + HL/IX/IY are also considered return instructions. */ + + if (calc->z80.r.sp.w.l <= exitsp) + return 0; + + if ((op & ~0x20ff) == 0xdd00) + op &= 0xff; + + f = calc->z80.r.af.b.l; + + switch (op) { + case 0xc9: /* RET */ + case 0xe9: /* JP HL/IX/IY */ + case 0xed45: /* RETN */ + case 0xed4d: /* RETI */ + case 0xed55: + case 0xed5d: + case 0xed65: + case 0xed6d: + case 0xed75: + case 0xed7d: + return 1; + + /* conditionals: check if condition was true */ + case 0xc0: return !(f & 0x40); + case 0xc8: return (f & 0x40); + case 0xd0: return !(f & 0x01); + case 0xd8: return (f & 0x01); + case 0xe0: return !(f & 0x04); + case 0xe8: return (f & 0x04); + case 0xf0: return !(f & 0x80); + case 0xf8: return (f & 0x80); + + default: + return 0; + } +} + +static gboolean post_resume_refresh(gpointer data) +{ + TilemDebugger *dbg = data; + tilem_debugger_refresh(dbg, FALSE); + return FALSE; +} + +static void run_with_step_condition(TilemDebugger *dbg, + TilemZ80BreakpointFunc func, + void *data) +{ + tilem_calc_emulator_lock(dbg->emu); + dbg->step_bp = tilem_z80_add_breakpoint(dbg->emu->calc, + TILEM_BREAK_EXECUTE, 0, 0, 0, + func, data); + tilem_calc_emulator_unlock(dbg->emu); + tilem_calc_emulator_run(dbg->emu); + /* Don't refresh right away, to avoid flickering */ + g_timeout_add(10, &post_resume_refresh, dbg); +} + +/* Execute one instruction */ +static void action_step(G_GNUC_UNUSED GtkAction *a, gpointer data) +{ + TilemDebugger *dbg = data; + + if (!dbg->emu->paused) + return; + + g_return_if_fail(dbg->emu->calc != NULL); + + cancel_step_bp(dbg); + + run_with_step_condition(dbg, &bptest_step, NULL); +} + +/* Skip over an instruction */ +static void action_step_over(G_GNUC_UNUSED GtkAction *a, gpointer data) +{ + TilemDebugger *dbg = data; + + if (!dbg->emu->paused) + return; + + g_return_if_fail(dbg->emu->calc != NULL); + + cancel_step_bp(dbg); + + tilem_calc_emulator_lock(dbg->emu); + tilem_disasm_disassemble(dbg->dasm, dbg->emu->calc, 0, + dbg->emu->calc->z80.r.pc.w.l, + &dbg->step_next_addr, + NULL, 0); + tilem_calc_emulator_unlock(dbg->emu); + + run_with_step_condition(dbg, &bptest_step_over, dbg); +} + +/* Run until current subroutine finishes */ +static void action_finish(G_GNUC_UNUSED GtkAction *a, gpointer data) +{ + TilemDebugger *dbg = data; + dword sp; + + if (!dbg->emu->paused) + return; + + g_return_if_fail(dbg->emu->calc != NULL); + + cancel_step_bp(dbg); + + tilem_calc_emulator_lock(dbg->emu); + sp = dbg->emu->calc->z80.r.sp.w.l; + tilem_calc_emulator_unlock(dbg->emu); + + run_with_step_condition(dbg, &bptest_finish, + TILEM_DWORD_TO_PTR(sp)); +} + +/* Toggle breakpoint at selected line */ +static void action_toggle_breakpoint(G_GNUC_UNUSED GtkAction *a, gpointer data) +{ + TilemDebugger *dbg = data; + GtkWidget *focus; + + focus = gtk_window_get_focus(GTK_WINDOW(dbg->window)); + if (TILEM_IS_DISASM_VIEW(focus)) + tilem_disasm_view_toggle_breakpoint(TILEM_DISASM_VIEW(focus)); +} + +/* Edit breakpoints */ +static void action_edit_breakpoints(G_GNUC_UNUSED GtkAction *a, gpointer data) +{ + TilemDebugger *dbg = data; + tilem_debugger_edit_breakpoints(dbg); +} + +/* Close debugger window */ +static void action_close(G_GNUC_UNUSED GtkAction *a, gpointer data) +{ + TilemDebugger *dbg = data; + tilem_debugger_hide(dbg); +} + +static void keypad_dlg_response(G_GNUC_UNUSED GtkDialog *dlg, + G_GNUC_UNUSED int response, + gpointer data) +{ + gtk_toggle_action_set_active(data, FALSE); +} + +/* Show/hide keypad dialog */ +static void action_view_keypad(GtkToggleAction *action, gpointer data) +{ + TilemDebugger *dbg = data; + + if (!dbg->keypad_dialog) { + dbg->keypad_dialog = tilem_keypad_dialog_new(dbg); + g_signal_connect(dbg->keypad_dialog->window, "response", + G_CALLBACK(keypad_dlg_response), action); + } + + if (gtk_toggle_action_get_active(action)) + gtk_window_present(GTK_WINDOW(dbg->keypad_dialog->window)); + else + gtk_widget_hide(dbg->keypad_dialog->window); +} + +/* Set memory addressing mode */ +static void action_mem_mode(GtkRadioAction *action, + G_GNUC_UNUSED GtkRadioAction *current, + gpointer data) +{ + TilemDebugger *dbg = data; + + dbg->mem_logical = gtk_radio_action_get_current_value(action); + + tilem_disasm_view_set_logical(TILEM_DISASM_VIEW(dbg->disasm_view), + dbg->mem_logical); + + tilem_debugger_mem_view_configure(dbg->mem_view, + dbg->emu, dbg->mem_rowsize, + dbg->mem_start, dbg->mem_logical); + + tilem_config_set("debugger", + "mem_logical/b", dbg->mem_logical, + NULL); +} + +/* Prompt for an address to view */ +static void action_go_to_address(G_GNUC_UNUSED GtkAction *action, gpointer data) +{ + TilemDebugger *dbg = data; + TilemDisasmView *dv = TILEM_DISASM_VIEW(dbg->disasm_view); + dword addr; + gboolean addr_set, logical; + + addr_set = tilem_disasm_view_get_cursor(dv, &addr, &logical); + + if (!tilem_prompt_address(dbg, GTK_WINDOW(dbg->window), + "Go to Address", "Address:", + &addr, !logical, addr_set)) + return; + + tilem_disasm_view_go_to_address(dv, addr, logical); + gtk_widget_grab_focus(dbg->disasm_view); +} + +/* Jump to address at given stack index */ +static void go_to_stack_pos(TilemDebugger *dbg, int pos) +{ + dword addr; + GtkTreePath *path; + GtkTreeSelection *sel; + + dbg->stack_index = pos; + + tilem_calc_emulator_lock(dbg->emu); + if (pos < 0) + addr = dbg->emu->calc->z80.r.pc.d; + else + addr = read_mem_word(dbg->emu->calc, + dbg->emu->calc->z80.r.sp.d + 2 * pos); + tilem_calc_emulator_unlock(dbg->emu); + + tilem_disasm_view_go_to_address(TILEM_DISASM_VIEW(dbg->disasm_view), + addr, TRUE); + gtk_widget_grab_focus(dbg->disasm_view); + + if (pos >= 0) { + path = gtk_tree_path_new_from_indices(pos, -1); + gtk_tree_view_set_cursor(GTK_TREE_VIEW(dbg->stack_view), + path, NULL, FALSE); + gtk_tree_path_free(path); + } + else { + sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(dbg->stack_view)); + gtk_tree_selection_unselect_all(sel); + } + + gtk_action_set_sensitive(dbg->prev_stack_action, (pos >= 0)); +} + +/* Jump to current PC */ +static void action_go_to_pc(G_GNUC_UNUSED GtkAction *action, gpointer data) +{ + TilemDebugger *dbg = data; + go_to_stack_pos(dbg, -1); +} + +/* Jump to previous stack entry */ +static void action_prev_stack_entry(G_GNUC_UNUSED GtkAction *action, + gpointer data) +{ + TilemDebugger *dbg = data; + if (dbg->stack_index >= 0) + go_to_stack_pos(dbg, dbg->stack_index - 1); +} + +/* Jump to next stack entry */ +static void action_next_stack_entry(G_GNUC_UNUSED GtkAction *action, + gpointer data) +{ + TilemDebugger *dbg = data; + go_to_stack_pos(dbg, dbg->stack_index + 1); +} + + +static const GtkActionEntry run_action_ents[] = + {{ "pause", GTK_STOCK_MEDIA_PAUSE, "_Pause", "Escape", + "Pause emulation", G_CALLBACK(action_pause) }}; + +static const GtkActionEntry paused_action_ents[] = + {{ "run", GTK_STOCK_MEDIA_PLAY, "_Run", "F5", + "Resume emulation", G_CALLBACK(action_run) }, + { "step", "tilem-db-step", "_Step", "F7", + "Execute one instruction", G_CALLBACK(action_step) }, + { "step-over", "tilem-db-step-over", "Step _Over", "F8", + "Run to the next line (skipping over subroutines)", + G_CALLBACK(action_step_over) }, + { "finish", "tilem-db-finish", "_Finish Subroutine", "F9", + "Run to end of the current subroutine", G_CALLBACK(action_finish) }, + { "toggle-breakpoint", NULL, "Toggle Breakpoint", "F2", + "Enable or disable breakpoint at the selected address", + G_CALLBACK(action_toggle_breakpoint) }, + { "edit-breakpoints", NULL, "_Breakpoints", "B", + "Add, remove, or modify breakpoints", + G_CALLBACK(action_edit_breakpoints) }, + { "go-to-address", GTK_STOCK_JUMP_TO, "_Address...", "L", + "Jump to an address", + G_CALLBACK(action_go_to_address) }, + { "go-to-pc", NULL, "Current P_C", "Home", + "Jump to the current program counter", + G_CALLBACK(action_go_to_pc) }, + { "prev-stack-entry", GTK_STOCK_GO_UP, "_Previous Stack Entry", "Page_Up", + "Jump to the previous address in the stack", + G_CALLBACK(action_prev_stack_entry) }, + { "next-stack-entry", GTK_STOCK_GO_DOWN, "_Next Stack Entry", "Page_Down", + "Jump to the next address in the stack", + G_CALLBACK(action_next_stack_entry) }}; + +static const GtkRadioActionEntry mem_mode_ents[] = + {{ "view-logical", 0, "_Logical Addresses", 0, + "Show contents of the current Z80 address space", 1 }, + { "view-absolute", 0, "_Absolute Addresses", 0, + "Show all memory contents", 0 }}; + +static const GtkActionEntry misc_action_ents[] = + {{ "debug-menu", 0, "_Debug", 0, 0, 0 }, + { "view-menu", 0, "_View", 0, 0, 0 }, + { "go-menu", 0, "_Go", 0, 0, 0 }, + { "close", GTK_STOCK_CLOSE, 0, 0, + "Close the debugger", G_CALLBACK(action_close) }}; + +static const GtkToggleActionEntry misc_toggle_ents[] = + {{ "view-keypad", 0, "_Keypad", 0, + "Show the calculator keypad state", + G_CALLBACK(action_view_keypad), FALSE }}; + +/* Callbacks */ + +/* Register edited */ +static void reg_edited(GtkEntry *ent, gpointer data) +{ + TilemDebugger *dbg = data; + TilemCalc *calc; + const char *text; + char *end; + dword value; + int i; + + if (dbg->refreshing) + return; + + calc = dbg->emu->calc; + g_return_if_fail(calc != NULL); + + text = gtk_entry_get_text(ent); + value = strtol(text, &end, 16); + + for (i = 0; i < NUM_REGS; i++) + if (ent == (GtkEntry*) dbg->reg_entries[i]) + break; + + tilem_calc_emulator_lock(dbg->emu); + switch (i) { + case R_AF: calc->z80.r.af.d = value; break; + case R_BC: calc->z80.r.bc.d = value; break; + case R_DE: calc->z80.r.de.d = value; break; + case R_HL: calc->z80.r.hl.d = value; break; + case R_AF2: calc->z80.r.af2.d = value; break; + case R_BC2: calc->z80.r.bc2.d = value; break; + case R_DE2: calc->z80.r.de2.d = value; break; + case R_HL2: calc->z80.r.hl2.d = value; break; + case R_SP: calc->z80.r.sp.d = value; break; + case R_PC: calc->z80.r.pc.d = value; break; + case R_IX: calc->z80.r.ix.d = value; break; + case R_IY: calc->z80.r.iy.d = value; break; + case R_I: calc->z80.r.ir.b.h = value; break; + } + tilem_calc_emulator_unlock(dbg->emu); + + /* Set the value of the register immediately, but don't + refresh the display: refreshing the registers themselves + while user is trying to edit them would just be obnoxious, + and refreshing stack and disassembly would be at least + distracting. Instead, we'll refresh only when focus + changes. */ + + dbg->delayed_refresh = TRUE; +} + +/* Flag button toggled */ +static void flag_edited(GtkToggleButton *btn, gpointer data) +{ + TilemDebugger *dbg = data; + TilemCalc *calc; + int i; + + if (dbg->refreshing) + return; + + calc = dbg->emu->calc; + g_return_if_fail(calc != NULL); + + for (i = 0; i < 8; i++) + if (btn == (GtkToggleButton*) dbg->flag_buttons[i]) + break; + + tilem_calc_emulator_lock(dbg->emu); + if (gtk_toggle_button_get_active(btn)) + calc->z80.r.af.d |= (1 << i); + else + calc->z80.r.af.d &= ~(1 << i); + tilem_calc_emulator_unlock(dbg->emu); + + /* refresh AF */ + tilem_debugger_refresh(dbg, FALSE); +} + +/* IM edited */ +static void im_edited(GtkEntry *ent, gpointer data) +{ + TilemDebugger *dbg = data; + TilemCalc *calc; + const char *text; + char *end; + int value; + + if (dbg->refreshing) + return; + + calc = dbg->emu->calc; + g_return_if_fail(calc != NULL); + + text = gtk_entry_get_text(ent); + value = strtol(text, &end, 0); + + tilem_calc_emulator_lock(dbg->emu); + if (value >= 0 && value <= 2) + calc->z80.r.im = value; + tilem_calc_emulator_unlock(dbg->emu); + /* no need to refresh */ +} + +/* IFF button toggled */ +static void iff_edited(GtkToggleButton *btn, gpointer data) +{ + TilemDebugger *dbg = data; + TilemCalc *calc; + + if (dbg->refreshing) + return; + + calc = dbg->emu->calc; + g_return_if_fail(calc != NULL); + + tilem_calc_emulator_lock(dbg->emu); + if (gtk_toggle_button_get_active(btn)) + calc->z80.r.iff1 = calc->z80.r.iff2 = 1; + else + calc->z80.r.iff1 = calc->z80.r.iff2 = 0; + tilem_calc_emulator_unlock(dbg->emu); + /* no need to refresh */ +} + +/* Main window's focus widget changed */ +static void focus_changed(G_GNUC_UNUSED GtkWindow *win, + G_GNUC_UNUSED GtkWidget *widget, + gpointer data) +{ + TilemDebugger *dbg = data; + + /* delayed refresh - see reg_edited() above */ + if (dbg->delayed_refresh) + tilem_debugger_refresh(dbg, FALSE); +} + +/* Main window received a "delete" message */ +static gboolean delete_win(G_GNUC_UNUSED GtkWidget *w, + G_GNUC_UNUSED GdkEvent *ev, + gpointer data) +{ + TilemDebugger *dbg = data; + tilem_debugger_hide(dbg); + return TRUE; +} + +/* Create table of widgets for editing registers */ +static GtkWidget *create_registers(TilemDebugger *dbg) +{ + GtkWidget *vbox, *tbl, *lbl, *hbox, *ent, *btn; + int i; + + vbox = gtk_vbox_new(FALSE, 6); + + tbl = gtk_table_new(6, 4, FALSE); + gtk_table_set_row_spacings(GTK_TABLE(tbl), 6); + gtk_table_set_col_spacings(GTK_TABLE(tbl), 6); + gtk_table_set_col_spacing(GTK_TABLE(tbl), 1, 12); + + for (i = 0; i < 12; i++) { + lbl = gtk_label_new_with_mnemonic(reg_labels[i]); + gtk_misc_set_alignment(GTK_MISC(lbl), LABEL_X_ALIGN, 0.5); + gtk_table_attach(GTK_TABLE(tbl), lbl, + 2 * (i / 6), 2 * (i / 6) + 1, + (i % 6), (i % 6) + 1, + GTK_FILL, GTK_FILL, 0, 0); + + dbg->reg_entries[i] = ent = gtk_entry_new(); + gtk_entry_set_width_chars(GTK_ENTRY(ent), 5); + g_signal_connect(ent, "changed", G_CALLBACK(reg_edited), dbg); + gtk_table_attach(GTK_TABLE(tbl), ent, + 2 * (i / 6) + 1, 2 * (i / 6) + 2, + (i % 6), (i % 6) + 1, + GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); + + gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), ent); + } + + gtk_box_pack_start(GTK_BOX(vbox), tbl, FALSE, FALSE, 0); + + hbox = gtk_hbox_new(TRUE, 0); + + for (i = 7; i >= 0; i--) { + btn = gtk_toggle_button_new_with_label(flag_labels[i]); + dbg->flag_buttons[i] = btn; + g_signal_connect(btn, "toggled", G_CALLBACK(flag_edited), dbg); + gtk_box_pack_start(GTK_BOX(hbox), btn, TRUE, TRUE, 0); + } + + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + + hbox = gtk_hbox_new(FALSE, 6); + + for (i = 12; i < 14; i++) { + lbl = gtk_label_new(reg_labels[i]); + gtk_box_pack_start(GTK_BOX(hbox), lbl, FALSE, FALSE, 0); + + dbg->reg_entries[i] = ent = gtk_entry_new(); + gtk_box_pack_start(GTK_BOX(hbox), ent, TRUE, TRUE, 0); + } + + g_signal_connect(dbg->reg_entries[R_I], "changed", + G_CALLBACK(reg_edited), dbg); + g_signal_connect(dbg->reg_entries[R_IM], "changed", + G_CALLBACK(im_edited), dbg); + + gtk_entry_set_width_chars(GTK_ENTRY(dbg->reg_entries[R_IM]), 2); + gtk_entry_set_width_chars(GTK_ENTRY(dbg->reg_entries[R_I]), 3); + + dbg->iff_checkbox = btn = gtk_check_button_new_with_label("EI"); + g_signal_connect(btn, "toggled", G_CALLBACK(iff_edited), dbg); + gtk_box_pack_start(GTK_BOX(hbox), btn, TRUE, TRUE, 0); + + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + + return vbox; +} + +/* Create the GtkTreeView to show the stack */ +static GtkWidget *create_stack_view() +{ + GtkCellRenderer *renderer; + GtkWidget *treeview; + GtkTreeViewColumn *column; + + /* Create the stack list tree view and set title invisible */ + treeview = gtk_tree_view_new(); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE); + gtk_tree_view_set_fixed_height_mode(GTK_TREE_VIEW(treeview), TRUE); + gtk_tree_view_set_search_column(GTK_TREE_VIEW(treeview), + COL_VALUE_STK); + + /* Create the columns */ + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes + ("ADDR", renderer, "text", COL_OFFSET_STK, NULL); + + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes + ("VAL", renderer, "text", COL_VALUE_STK, NULL); + + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + + return treeview; +} + +/* Create a new scrolled window with sensible default settings. */ +static GtkWidget *new_scrolled_window(GtkWidget *contents) +{ + GtkWidget *sw; + sw = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), + GTK_SHADOW_IN); + gtk_container_add(GTK_CONTAINER(sw), contents); + return sw; +} + +static const char uidesc[] = + "" + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + "" + "" + " " + " " + " " + " " + " " + " " + "" + ""; + +/* Create a new TilemDebugger. */ +TilemDebugger *tilem_debugger_new(TilemCalcEmulator *emu) +{ + TilemDebugger *dbg; + GtkWidget *hbox, *vbox, *vbox2, *vpaned, *sw, *menubar, *toolbar; + GtkUIManager *uimgr; + GtkAccelGroup *accelgrp; + GError *err = NULL; + int defwidth, defheight; + + g_return_val_if_fail(emu != NULL, NULL); + + dbg = g_slice_new0(TilemDebugger); + dbg->emu = emu; + dbg->dasm = tilem_disasm_new(); + + dbg->last_bp_type = TILEM_DB_BREAK_LOGICAL; + dbg->last_bp_mode = TILEM_DB_BREAK_EXEC; + + dbg->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(dbg->window), "TilEm Debugger"); + gtk_window_set_role(GTK_WINDOW(dbg->window), "Debugger"); + + tilem_config_get("debugger", + "width/i", &defwidth, + "height/i", &defheight, + "mem_width/i", &dbg->mem_rowsize, + "mem_start/i", &dbg->mem_start, + "mem_logical/b=1", &dbg->mem_logical, + NULL); + + if (dbg->mem_rowsize <= 0) + dbg->mem_rowsize = 8; + if (dbg->mem_start < 0 || dbg->mem_start >= dbg->mem_rowsize) + dbg->mem_start = 0; + + if (defwidth <= 0 || defheight <= 0) { + defwidth = 600; + defheight = 400; + } + + gtk_window_set_default_size(GTK_WINDOW(dbg->window), + defwidth, defheight); + + g_signal_connect(dbg->window, "set-focus", + G_CALLBACK(focus_changed), dbg); + g_signal_connect(dbg->window, "delete-event", + G_CALLBACK(delete_win), dbg); + + vbox2 = gtk_vbox_new(FALSE, 0); + + /* Actions and menu bar */ + + uimgr = gtk_ui_manager_new(); + dbg->run_actions = gtk_action_group_new("Debug"); + gtk_action_group_add_actions(dbg->run_actions, run_action_ents, + G_N_ELEMENTS(run_action_ents), dbg); + gtk_ui_manager_insert_action_group(uimgr, dbg->run_actions, 0); + + dbg->paused_actions = gtk_action_group_new("Debug"); + gtk_action_group_add_actions(dbg->paused_actions, paused_action_ents, + G_N_ELEMENTS(paused_action_ents), dbg); + gtk_action_group_add_radio_actions(dbg->paused_actions, mem_mode_ents, + G_N_ELEMENTS(mem_mode_ents), + dbg->mem_logical, + G_CALLBACK(action_mem_mode), dbg); + gtk_ui_manager_insert_action_group(uimgr, dbg->paused_actions, 0); + + dbg->misc_actions = gtk_action_group_new("Debug"); + gtk_action_group_add_actions(dbg->misc_actions, misc_action_ents, + G_N_ELEMENTS(misc_action_ents), dbg); + gtk_action_group_add_toggle_actions(dbg->misc_actions, misc_toggle_ents, + G_N_ELEMENTS(misc_toggle_ents), dbg); + gtk_ui_manager_insert_action_group(uimgr, dbg->misc_actions, 0); + + dbg->prev_stack_action = gtk_action_group_get_action(dbg->paused_actions, + "prev-stack-entry"); + + accelgrp = gtk_ui_manager_get_accel_group(uimgr); + gtk_window_add_accel_group(GTK_WINDOW(dbg->window), accelgrp); + + if (!gtk_ui_manager_add_ui_from_string(uimgr, uidesc, -1, &err)) + g_error("Failed to create menus: %s", err->message); + + menubar = gtk_ui_manager_get_widget(uimgr, "/menu-bar"); + gtk_box_pack_start(GTK_BOX(vbox2), menubar, FALSE, FALSE, 0); + + toolbar = gtk_ui_manager_get_widget(uimgr, "/toolbar"); + gtk_box_pack_start(GTK_BOX(vbox2), toolbar, FALSE, FALSE, 0); + + g_object_unref(uimgr); + + hbox = gtk_hbox_new(FALSE, 6); + + vpaned = gtk_vpaned_new(); + + /* Disassembly view */ + + dbg->disasm_view = tilem_disasm_view_new(dbg); + tilem_disasm_view_set_logical(TILEM_DISASM_VIEW(dbg->disasm_view), + dbg->mem_logical); + sw = new_scrolled_window(dbg->disasm_view); + gtk_paned_pack1(GTK_PANED(vpaned), sw, TRUE, TRUE); + + /* Memory view */ + + dbg->mem_view = tilem_debugger_mem_view_new(dbg); + sw = new_scrolled_window(dbg->mem_view); + gtk_paned_pack2(GTK_PANED(vpaned), sw, TRUE, TRUE); + + gtk_box_pack_start(GTK_BOX(hbox), vpaned, TRUE, TRUE, 0); + + vbox = gtk_vbox_new(FALSE, 6); + + /* Registers */ + + dbg->regbox = create_registers(dbg); + gtk_box_pack_start(GTK_BOX(vbox), dbg->regbox, FALSE, FALSE, 0); + + /* Stack view */ + + dbg->stack_view = create_stack_view(); + sw = new_scrolled_window(dbg->stack_view); + gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0); + + gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); + + gtk_box_pack_start(GTK_BOX(vbox2), hbox, TRUE, TRUE, 0); + gtk_widget_show_all(vbox2); + + gtk_container_add(GTK_CONTAINER(dbg->window), vbox2); + + tilem_debugger_calc_changed(dbg); + + return dbg; +} + +/* Save the dimension for the debugger */ +static void save_debugger_dimension(TilemDebugger *dbg) +{ + gint width, height; + + if (!dbg->window) + return; + + gtk_window_get_size(GTK_WINDOW(dbg->window), &width, &height); + + if (width <= 0 || height <= 0) + return; + + tilem_config_set("debugger", + "width/i", width, + "height/i", height, + NULL); +} + +static void free_all_breakpoints(TilemDebugger *dbg) +{ + GSList *l; + TilemDebugBreakpoint *bp; + + for (l = dbg->breakpoints; l; l = l->next) { + bp = l->data; + g_slice_free(TilemDebugBreakpoint, bp); + } + + g_slist_free(dbg->breakpoints); + dbg->breakpoints = NULL; +} + +/* Free a TilemDebugger. */ +void tilem_debugger_free(TilemDebugger *dbg) +{ + g_return_if_fail(dbg != NULL); + + save_debugger_dimension(dbg); + + if (dbg->emu && dbg->emu->dbg == dbg) + dbg->emu->dbg = NULL; + if (dbg->window) { + gtk_widget_destroy(dbg->window); + } + if (dbg->dasm) + tilem_disasm_free(dbg->dasm); + if (dbg->run_actions) + g_object_unref(dbg->run_actions); + if (dbg->paused_actions) + g_object_unref(dbg->paused_actions); + if (dbg->misc_actions) + g_object_unref(dbg->misc_actions); + + free_all_breakpoints(dbg); + + g_slice_free(TilemDebugger, dbg); +} + +static void entry_printf(GtkWidget *ent, const char *s, ...) +{ + char buf[20]; + va_list ap; + va_start(ap, s); + g_vsnprintf(buf, sizeof(buf), s, ap); + va_end(ap); + gtk_entry_set_text(GTK_ENTRY(ent), buf); +} + +static void refresh_regs(TilemDebugger *dbg) +{ + TilemCalc *calc = dbg->emu->calc; + int i; + GtkToggleButton *btn; + + entry_printf(dbg->reg_entries[R_AF], "%04X", calc->z80.r.af.w.l); + entry_printf(dbg->reg_entries[R_BC], "%04X", calc->z80.r.bc.w.l); + entry_printf(dbg->reg_entries[R_DE], "%04X", calc->z80.r.de.w.l); + entry_printf(dbg->reg_entries[R_HL], "%04X", calc->z80.r.hl.w.l); + entry_printf(dbg->reg_entries[R_AF2], "%04X", calc->z80.r.af2.w.l); + entry_printf(dbg->reg_entries[R_BC2], "%04X", calc->z80.r.bc2.w.l); + entry_printf(dbg->reg_entries[R_DE2], "%04X", calc->z80.r.de2.w.l); + entry_printf(dbg->reg_entries[R_HL2], "%04X", calc->z80.r.hl2.w.l); + entry_printf(dbg->reg_entries[R_SP], "%04X", calc->z80.r.sp.w.l); + entry_printf(dbg->reg_entries[R_PC], "%04X", calc->z80.r.pc.w.l); + entry_printf(dbg->reg_entries[R_IX], "%04X", calc->z80.r.ix.w.l); + entry_printf(dbg->reg_entries[R_IY], "%04X", calc->z80.r.iy.w.l); + entry_printf(dbg->reg_entries[R_I], "%02X", calc->z80.r.ir.b.h); + entry_printf(dbg->reg_entries[R_IM], "%d", calc->z80.r.im); + + for (i = 0; i < 8; i++) { + btn = GTK_TOGGLE_BUTTON(dbg->flag_buttons[i]); + gtk_toggle_button_set_active(btn, calc->z80.r.af.d & (1 << i)); + } + + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dbg->iff_checkbox), + calc->z80.r.iff1); +} + +/* Create GtkListStore and attach it */ +static GtkTreeModel* fill_stk_list(TilemDebugger *dbg) +{ + GtkListStore *store; + GtkTreeIter iter; + char stack_offset[10]; + char stack_value[10]; + dword i, v; + int n = 0; + + store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING); + i = dbg->emu->calc->z80.r.sp.w.l; + while (i < 0x10000 && n < 512) { + g_snprintf(stack_offset, sizeof(stack_offset), "%04X:", i); + + v = read_mem_word(dbg->emu->calc, i); + g_snprintf(stack_value, sizeof(stack_value), "%04X", v); + + gtk_list_store_append(store, &iter); + gtk_list_store_set(store, &iter, + COL_OFFSET_STK, stack_offset, + COL_VALUE_STK, stack_value, -1); + + i += 0x0002; + n++; + } + + return GTK_TREE_MODEL (store); +} + +static void refresh_stack(TilemDebugger *dbg) +{ + GtkTreeModel *model = fill_stk_list(dbg); + gtk_tree_view_set_model(GTK_TREE_VIEW(dbg->stack_view), model); + g_object_unref(model); + + fixed_tree_view_init(dbg->stack_view, 0, + COL_OFFSET_STK, "DDDD: ", + COL_VALUE_STK, "DDDD ", + -1); +} + +static void unselect_all(GtkTreeView *tv) +{ + GtkTreeSelection *sel = gtk_tree_view_get_selection(tv); + gtk_tree_selection_unselect_all(sel); +} + +static void refresh_all(TilemDebugger *dbg, gboolean updatemem) +{ + TilemCalc *calc; + gboolean paused; + gboolean updatedasm = FALSE; + GtkTreeModel *model; + + dbg->refreshing = TRUE; + dbg->delayed_refresh = FALSE; + + tilem_calc_emulator_lock(dbg->emu); + calc = dbg->emu->calc; + paused = dbg->emu->paused; + + if (calc) { + refresh_regs(dbg); + + if (dbg->lastwrite != calc->z80.lastwrite) + updatemem = TRUE; + + if (updatemem || dbg->lastsp != calc->z80.r.sp.d) + refresh_stack(dbg); + + if (paused && dbg->lastpc != calc->z80.r.pc.d) + updatedasm = TRUE; + + dbg->lastwrite = calc->z80.lastwrite; + dbg->lastsp = calc->z80.r.sp.d; + dbg->lastpc = calc->z80.r.pc.d; + } + + tilem_calc_emulator_unlock(dbg->emu); + + model = gtk_tree_view_get_model(GTK_TREE_VIEW(dbg->mem_view)); + tilem_mem_model_clear_cache(TILEM_MEM_MODEL(model)); + + gtk_widget_queue_draw(dbg->mem_view); + + if (paused != dbg->paused) { + dbg->paused = paused; + gtk_widget_set_sensitive(dbg->regbox, paused); + gtk_widget_set_sensitive(dbg->disasm_view, paused); + gtk_widget_set_sensitive(dbg->mem_view, paused); + gtk_widget_set_sensitive(dbg->stack_view, paused); + gtk_action_group_set_sensitive(dbg->run_actions, !paused); + gtk_action_group_set_sensitive(dbg->paused_actions, paused); + updatedasm = TRUE; /* need to redraw icons */ + } + + if (updatemem || updatedasm) + tilem_disasm_view_refresh(TILEM_DISASM_VIEW(dbg->disasm_view)); + + if (!paused) { + unselect_all(GTK_TREE_VIEW(dbg->disasm_view)); + unselect_all(GTK_TREE_VIEW(dbg->mem_view)); + unselect_all(GTK_TREE_VIEW(dbg->stack_view)); + } + + if (dbg->keypad_dialog) + tilem_keypad_dialog_refresh(dbg->keypad_dialog); + + dbg->refreshing = FALSE; +} + +/* Show debugger, and pause emulator if not already paused. */ +void tilem_debugger_show(TilemDebugger *dbg) +{ + g_return_if_fail(dbg != NULL); + g_return_if_fail(dbg->emu->calc != NULL); + tilem_calc_emulator_pause(dbg->emu); + cancel_step_bp(dbg); + refresh_all(dbg, TRUE); + go_to_stack_pos(dbg, -1); + gtk_window_present(GTK_WINDOW(dbg->window)); +} + +/* Hide debugger, and resume emulation if not already running. */ +void tilem_debugger_hide(TilemDebugger *dbg) +{ + g_return_if_fail(dbg != NULL); + gtk_widget_hide(dbg->window); + tilem_calc_emulator_run(dbg->emu); + save_debugger_dimension(dbg); +} + +/* New calculator loaded. */ +void tilem_debugger_calc_changed(TilemDebugger *dbg) +{ + TilemCalc *calc; + + g_return_if_fail(dbg != NULL); + + tilem_disasm_free(dbg->dasm); + dbg->dasm = tilem_disasm_new(); + + dbg->step_bp = 0; + + free_all_breakpoints(dbg); + + calc = dbg->emu->calc; + if (!calc) + return; + + load_default_symbols(dbg); + + tilem_debugger_mem_view_configure(dbg->mem_view, + dbg->emu, dbg->mem_rowsize, + dbg->mem_start, dbg->mem_logical); + + tilem_debugger_refresh(dbg, TRUE); + + if (dbg->keypad_dialog) + tilem_keypad_dialog_calc_changed(dbg->keypad_dialog); +} + +/* Update display. */ +void tilem_debugger_refresh(TilemDebugger *dbg, gboolean updatemem) +{ + g_return_if_fail(dbg != NULL); + + if (!gtk_widget_get_visible(dbg->window)) + return; + + refresh_all(dbg, updatemem); +} + +/* Breakpoint manipulation */ + +/* Convert debugger type/mode into a core breakpoint type (core + breakpoints have only a single access type, for efficiency, so a + single TilemDebugBreakpoint may correspond to up to 3 core + breakpoints) */ +static int get_core_bp_type(int type, int mode) +{ + switch (type) { + case TILEM_DB_BREAK_LOGICAL: + switch (mode) { + case TILEM_DB_BREAK_READ: + return TILEM_BREAK_MEM_READ; + case TILEM_DB_BREAK_WRITE: + return TILEM_BREAK_MEM_WRITE; + case TILEM_DB_BREAK_EXEC: + return TILEM_BREAK_MEM_EXEC; + } + break; + + case TILEM_DB_BREAK_PHYSICAL: + switch (mode) { + case TILEM_DB_BREAK_READ: + return TILEM_BREAK_MEM_READ | TILEM_BREAK_PHYSICAL; + case TILEM_DB_BREAK_WRITE: + return TILEM_BREAK_MEM_WRITE | TILEM_BREAK_PHYSICAL; + case TILEM_DB_BREAK_EXEC: + return TILEM_BREAK_MEM_EXEC | TILEM_BREAK_PHYSICAL; + } + break; + + case TILEM_DB_BREAK_PORT: + switch (mode) { + case TILEM_DB_BREAK_READ: + return TILEM_BREAK_PORT_READ; + case TILEM_DB_BREAK_WRITE: + return TILEM_BREAK_PORT_WRITE; + } + break; + + case TILEM_DB_BREAK_OPCODE: + return TILEM_BREAK_EXECUTE; + } + + g_return_val_if_reached(0); +} + +/* Install core breakpoint(s) */ +static void set_bp(TilemDebugger *dbg, TilemDebugBreakpoint *bp) +{ + int i, t, n; + + tilem_calc_emulator_lock(dbg->emu); + for (i = 0; i < 3; i++) { + if (!bp->disabled && (bp->mode & (1 << i))) { + t = get_core_bp_type(bp->type, (1 << i)); + n = tilem_z80_add_breakpoint(dbg->emu->calc, t, + bp->start, bp->end, + bp->mask, + NULL, NULL); + bp->id[i] = n; + } + else { + bp->id[i] = 0; + } + } + tilem_calc_emulator_unlock(dbg->emu); +} + +/* Remove core breakpoint(s) */ +static void unset_bp(TilemDebugger *dbg, TilemDebugBreakpoint *bp) +{ + int i; + tilem_calc_emulator_lock(dbg->emu); + for (i = 0; i < 3; i++) { + if (bp->id[i]) + tilem_z80_remove_breakpoint(dbg->emu->calc, bp->id[i]); + bp->id[i] = 0; + } + tilem_calc_emulator_unlock(dbg->emu); +} + +static gboolean is_mem_exec_bp(const TilemDebugBreakpoint *bp) +{ + return ((bp->type == TILEM_DB_BREAK_LOGICAL + || bp->type == TILEM_DB_BREAK_PHYSICAL) + && (bp->mode & TILEM_DB_BREAK_EXEC)); +} + +/* Add a new debugger breakpoint */ +TilemDebugBreakpoint * tilem_debugger_add_breakpoint(TilemDebugger *dbg, + const TilemDebugBreakpoint *bp) +{ + TilemDebugBreakpoint *bp2; + + g_return_val_if_fail(dbg != NULL, NULL); + g_return_val_if_fail(bp != NULL, NULL); + g_return_val_if_fail(bp->mode != 0, NULL); + + bp2 = g_slice_new(TilemDebugBreakpoint); + *bp2 = *bp; + dbg->breakpoints = g_slist_append(dbg->breakpoints, bp2); + set_bp(dbg, bp2); + + if (is_mem_exec_bp(bp) && dbg->disasm_view) + tilem_disasm_view_refresh(TILEM_DISASM_VIEW(dbg->disasm_view)); + + return bp2; +} + +/* Remove a debugger breakpoint */ +void tilem_debugger_remove_breakpoint(TilemDebugger *dbg, + TilemDebugBreakpoint *bp) +{ + gboolean isexec; + + g_return_if_fail(dbg != NULL); + g_return_if_fail(bp != NULL); + g_return_if_fail(g_slist_index(dbg->breakpoints, bp) != -1); + + isexec = is_mem_exec_bp(bp); + + unset_bp(dbg, bp); + dbg->breakpoints = g_slist_remove(dbg->breakpoints, bp); + g_slice_free(TilemDebugBreakpoint, bp); + + if (isexec && dbg->disasm_view) + tilem_disasm_view_refresh(TILEM_DISASM_VIEW(dbg->disasm_view)); +} + +/* Modify a debugger breakpoint */ +void tilem_debugger_change_breakpoint(TilemDebugger *dbg, + TilemDebugBreakpoint *bp, + const TilemDebugBreakpoint *newbp) +{ + gboolean isexec; + + g_return_if_fail(dbg != NULL); + g_return_if_fail(bp != NULL); + g_return_if_fail(newbp != NULL); + g_return_if_fail(g_slist_index(dbg->breakpoints, bp) != -1); + + isexec = (is_mem_exec_bp(bp) || is_mem_exec_bp(newbp)); + + unset_bp(dbg, bp); + *bp = *newbp; + set_bp(dbg, bp); + + if (isexec && dbg->disasm_view) + tilem_disasm_view_refresh(TILEM_DISASM_VIEW(dbg->disasm_view)); +} diff --git a/tool/tilem-src/gui/debugger.h b/tool/tilem-src/gui/debugger.h new file mode 100644 index 0000000..a0e9823 --- /dev/null +++ b/tool/tilem-src/gui/debugger.h @@ -0,0 +1,164 @@ +/* + * TilEm II + * + * Copyright (c) 2010-2011 Thibault Duponchelle + * Copyright (c) 2011 Benjamin Moody + * + * 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 . + */ + +typedef struct _TilemDebugBreakpoint { + enum { + TILEM_DB_BREAK_LOGICAL, + TILEM_DB_BREAK_PHYSICAL, + TILEM_DB_BREAK_PORT, + TILEM_DB_BREAK_OPCODE + } type; + + enum { + TILEM_DB_BREAK_READ = 4, + TILEM_DB_BREAK_WRITE = 2, + TILEM_DB_BREAK_EXEC = 1 + } mode; + + dword start; + dword end; + dword mask; + + int disabled; + int id[3]; +} TilemDebugBreakpoint; + +typedef struct _TilemDebugger { + struct _TilemCalcEmulator *emu; + struct _TilemDisasm *dasm; + + /* Debugger widgets */ + GtkWidget *window; /* Main debugger window */ + + GtkWidget *disasm_view; /* Disassembly view */ + GtkWidget *mem_view; /* Memory view */ + GtkWidget *stack_view; /* Stack view */ + + GtkWidget *regbox; /* Box containing registers */ + GtkWidget *reg_entries[14]; /* Entries for registers */ + GtkWidget *iff_checkbox; /* Checkbox for IFF */ + GtkWidget *flag_buttons[8]; /* Buttons for flags */ + + /* Action groups */ + GtkActionGroup *run_actions; + GtkActionGroup *paused_actions; + GtkActionGroup *misc_actions; + + /* Memory settings */ + int mem_rowsize; + int mem_start; + gboolean mem_logical; + + /* Stack navigation */ + GtkAction *prev_stack_action; + int stack_index; + + /* Breakpoints */ + GSList *breakpoints; + int last_bp_type; + int last_bp_mode; + + /* Temporary breakpoint info */ + int step_bp; /* Breakpoint ID */ + dword step_next_addr; /* Target address */ + + dword lastwrite; + dword lastsp; + dword lastpc; + gboolean paused; + gboolean refreshing; + gboolean delayed_refresh; + + /* Other windows */ + struct _TilemKeypadDialog *keypad_dialog; +} TilemDebugger; + +/* Create a new TilemDebugger. */ +TilemDebugger *tilem_debugger_new(TilemCalcEmulator *emu); + +/* Free a TilemDebugger. */ +void tilem_debugger_free(TilemDebugger *dbg); + +/* Show debugger, and pause emulator if not already paused. */ +void tilem_debugger_show(TilemDebugger *dbg); + +/* Hide debugger, and resume emulation if not already running. */ +void tilem_debugger_hide(TilemDebugger *dbg); + +/* New calculator loaded. */ +void tilem_debugger_calc_changed(TilemDebugger *dbg); + +/* Update display. */ +void tilem_debugger_refresh(TilemDebugger *dbg, gboolean updatemem); + +/* Add a new breakpoint. */ +TilemDebugBreakpoint * tilem_debugger_add_breakpoint(TilemDebugger *dbg, + const TilemDebugBreakpoint *bp); + +/* Remove an existing breakpoint. */ +void tilem_debugger_remove_breakpoint(TilemDebugger *dbg, + TilemDebugBreakpoint *bp); + +/* Modify an existing breakpoint. */ +void tilem_debugger_change_breakpoint(TilemDebugger *dbg, + TilemDebugBreakpoint *bp, + const TilemDebugBreakpoint *newbp); + +/* Show a dialog letting the user add, remove, and edit breakpoints. */ +void tilem_debugger_edit_breakpoints(TilemDebugger *dbg); + + +/* Memory view */ + +/* Create the memory view */ +GtkWidget *tilem_debugger_mem_view_new(TilemDebugger *dbg); + +/* Set memory view settings */ +void tilem_debugger_mem_view_configure(GtkWidget *mem_view, + TilemCalcEmulator *emu, + int rowsize, int start, + gboolean logical); + + +/* Keypad dialog */ + +typedef struct _TilemKeypadDialog { + TilemDebugger *dbg; + + gboolean refreshing; + + GtkWidget *window; + GtkWidget *output[7]; + GtkWidget *keys[7][8]; + GtkWidget *input[8]; +} TilemKeypadDialog; + +/* Create a new TilemKeypadDialog. */ +TilemKeypadDialog *tilem_keypad_dialog_new(TilemDebugger *dbg); + +/* Free a TilemKeypadDialog. */ +void tilem_keypad_dialog_free(TilemKeypadDialog *kpdlg); + +/* New calculator loaded. */ +void tilem_keypad_dialog_calc_changed(TilemKeypadDialog *kpdlg); + +/* Refresh key states. */ +void tilem_keypad_dialog_refresh(TilemKeypadDialog *kpdlg); + diff --git a/tool/tilem-src/gui/disasmview.c b/tool/tilem-src/gui/disasmview.c new file mode 100644 index 0000000..a664b90 --- /dev/null +++ b/tool/tilem-src/gui/disasmview.c @@ -0,0 +1,1200 @@ +/* + * TilEm II + * + * Copyright (c) 2011-2012 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include + +#include "gui.h" +#include "disasmview.h" + +G_DEFINE_TYPE(TilemDisasmView, tilem_disasm_view, GTK_TYPE_TREE_VIEW); + +/* + This is a HORRIBLE kludge. Don't ever do anything like this. ;) + + We want a widget that has the look and feel of a GtkTreeView. But + our "data model" isn't consistent with a GtkTreeModel, since it + changes depending on where we are. + + This widget keeps track of how high each row will be once rendered, + and uses that to construct a GtkListStore with the appropriate + number of rows to fill the window. We also override the move-cursor + signal so that we can handle the boundaries. + */ + +/* Model columns */ +enum { + COL_POSITION, + COL_ADDRESS, + COL_MNEMONIC, + COL_ARGUMENTS, + COL_SHOW_MNEMONIC, + COL_ICON, + NUM_COLUMNS +}; + +static GtkTreeViewClass *parent_class; + +/* We define two "positions" for each actual address; the second is + used if there's a label to be displayed at that address. */ + +#define POS_TO_ADDR(x) ((x) >> 1) +#define ADDR_TO_POS(x) ((x) << 1) + +/* Disassembly */ + +/* Convert physical to logical address; if address is not currently + mapped, use the bank-A address */ +static dword default_ptol(TilemCalc *calc, dword addr) +{ + dword addr_l; + + g_return_val_if_fail(calc != NULL, 0); + + addr_l = (*calc->hw.mem_ptol)(calc, addr); + if (addr_l == 0xffffffff) + addr_l = (addr & 0x3fff) | 0x4000; + + return addr_l; +} + +/* Check for a label at the given address (physical or logical + depending on the mode of the DisasmView) */ +static const char *get_label(TilemDisasmView *dv, TilemCalc *calc, + dword addr) +{ + g_return_val_if_fail(calc != NULL, NULL); + g_return_val_if_fail(dv->dbg->dasm != NULL, NULL); + + if (!dv->use_logical) + addr = default_ptol(calc, addr); + + return tilem_disasm_get_label_at_address(dv->dbg->dasm, addr); +} + +/* Disassemble a line */ +static void disassemble(TilemDisasmView *dv, TilemCalc *calc, dword pos, + dword *nextpos, char **mnemonic, char **args) +{ + dword addr = POS_TO_ADDR(pos); + const char *lbl; + char buf[500], *p; + + g_return_if_fail(calc != NULL); + g_return_if_fail(dv->dbg->dasm != NULL); + + if (!(pos & 1) && (lbl = get_label(dv, calc, addr))) { + if (mnemonic) { + *mnemonic = NULL; + *args = g_strdup_printf("%s:", lbl); + } + + if (nextpos) + *nextpos = pos + 1; + } + else if (mnemonic) { + tilem_disasm_disassemble(dv->dbg->dasm, calc, + !dv->use_logical, addr, + &addr, buf, sizeof(buf)); + + p = strchr(buf, '\t'); + if (p) { + *mnemonic = g_strndup(buf, p - buf); + *args = g_strdup(p + 1); + } + else { + *mnemonic = g_strdup(buf); + *args = NULL; + } + + if (nextpos) + *nextpos = ADDR_TO_POS(addr); + } + else { + tilem_disasm_disassemble(dv->dbg->dasm, calc, + !dv->use_logical, addr, + &addr, NULL, 0); + if (nextpos) + *nextpos = ADDR_TO_POS(addr); + } +} + +/* Get "next" position */ +static dword get_next_pos(TilemDisasmView *dv, TilemCalc *calc, dword pos) +{ + disassemble(dv, calc, pos, &pos, NULL, NULL); + return pos; +} + +/* Get "previous" position */ +static dword get_prev_pos(TilemDisasmView *dv, TilemCalc *calc, dword pos) +{ + dword addr = POS_TO_ADDR(pos); + + g_return_val_if_fail(calc != NULL, 0); + + if (pos & 1) { + return pos - 1; + } + else { + if (addr > 0) + addr--; + else if (dv->use_logical) + addr = 0xffff; + else + addr = (calc->hw.romsize + calc->hw.ramsize - 1); + + if (get_label(dv, calc, addr)) + return ADDR_TO_POS(addr) + 1; + else + return ADDR_TO_POS(addr); + } +} + +/* Convert physical to logical position */ +static dword pos_ptol(TilemCalc *calc, dword pos) +{ + dword addr; + + g_return_val_if_fail(calc != NULL, 0); + + if (pos == (dword) -1) + return pos; + + addr = default_ptol(calc, POS_TO_ADDR(pos)); + return ADDR_TO_POS(addr) + (pos & 1); +} + +/* Convert logical to physical position */ +static dword pos_ltop(TilemCalc *calc, dword pos) +{ + dword addr; + + g_return_val_if_fail(calc != NULL, 0); + + if (pos == (dword) -1) + return pos; + + addr = (*calc->hw.mem_ltop)(calc, POS_TO_ADDR(pos)); + return ADDR_TO_POS(addr) + (pos & 1); +} + +/* Icons */ + +static GdkPixbuf *get_icon(TilemDisasmView *dv, gboolean ispc, gboolean isbp) +{ + const char *name; + + if (ispc && isbp) + name = "tilem-disasm-break-pc"; + else if (isbp) + name = "tilem-disasm-break"; + else if (ispc) + name = "tilem-disasm-pc"; + else + return NULL; + + return gtk_widget_render_icon(GTK_WIDGET(dv), name, + GTK_ICON_SIZE_MENU, NULL); +} + +/* List model management */ + +/* Create a new list store for disassembly */ +static GtkTreeModel * new_dasm_model() +{ + GtkListStore *store; + + g_assert(NUM_COLUMNS == 6); + store = gtk_list_store_new(6, + G_TYPE_INT, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_BOOLEAN, + GDK_TYPE_PIXBUF); + + return GTK_TREE_MODEL(store); +} + +/* Append dummy data to the model; used for sizing */ +static void append_dummy_line(TilemDisasmView *dv, GtkTreeModel *model, + GtkTreeIter *iter) +{ + GtkTreeIter iter1; + GdkPixbuf *icon; + + gtk_list_store_append(GTK_LIST_STORE(model), &iter1); + + icon = get_icon(dv, TRUE, FALSE); + + gtk_list_store_set(GTK_LIST_STORE(model), &iter1, + COL_ICON, icon, + COL_ADDRESS, "DD:DDDD", + COL_MNEMONIC, "ROM_CALL", + COL_ARGUMENTS, "_fnord", + COL_SHOW_MNEMONIC, TRUE, + -1); + + if (icon) + g_object_unref(icon); + + if (iter) + *iter = iter1; +} + +/* Check if given logical address is a breakpoint (according to + current mapping) */ +static TilemDebugBreakpoint *find_bp_logical(TilemDebugger *dbg, + TilemCalc *calc, + dword addr) +{ + GSList *l; + TilemDebugBreakpoint *bp; + dword pa = (*calc->hw.mem_ltop)(calc, addr); + + for (l = dbg->breakpoints; l; l = l->next) { + bp = l->data; + if (!(bp->mode & TILEM_DB_BREAK_EXEC)) + continue; + + if (bp->type == TILEM_DB_BREAK_LOGICAL + && bp->start <= addr + && bp->end >= addr + && !bp->disabled) + return bp; + + if (bp->type == TILEM_DB_BREAK_PHYSICAL + && bp->start <= pa + && bp->end >= pa + && !bp->disabled) + return bp; + } + + return NULL; +} + +/* Check if given physical address is a breakpoint (according to + current mapping) */ +static TilemDebugBreakpoint *find_bp_physical(TilemDebugger *dbg, + TilemCalc *calc, + dword addr) +{ + GSList *l; + TilemDebugBreakpoint *bp; + dword la, pa; + int i, mapped[4]; + + /* NOTE: this assumes that bits 0-13 are unaffected by the + mapping! This is true for all current models, but might + need to be changed in the future */ + for (i = 0; i < 4; i++) { + la = (i << 14) + (addr & 0x3fff); + pa = (*calc->hw.mem_ltop)(calc, la); + mapped[i] = (addr == pa); + } + + for (l = dbg->breakpoints; l; l = l->next) { + bp = l->data; + if (!(bp->mode & TILEM_DB_BREAK_EXEC)) + continue; + + if (bp->type == TILEM_DB_BREAK_PHYSICAL + && bp->start <= addr + && bp->end >= addr + && !bp->disabled) + return bp; + + if (bp->type == TILEM_DB_BREAK_LOGICAL + && !bp->disabled) { + for (i = 0; i < 4; i++) { + la = (i << 14) + (addr & 0x3fff); + if (bp->start <= la + && bp->end >= la + && mapped[i]) + return bp; + } + } + } + + return NULL; +} + +/* Check if line has a breakpoint set */ +static TilemDebugBreakpoint *find_line_bp(TilemDisasmView *dv, dword pos) +{ + TilemDebugBreakpoint *bp; + dword addr = POS_TO_ADDR(pos); + TilemCalc *calc; + + tilem_calc_emulator_lock(dv->dbg->emu); + calc = dv->dbg->emu->calc; + + if (dv->use_logical) + bp = find_bp_logical(dv->dbg, calc, addr); + else + bp = find_bp_physical(dv->dbg, calc, addr); + + tilem_calc_emulator_unlock(dv->dbg->emu); + + return bp; +} + +/* Enable breakpoint on the given line */ +static void enable_line_bp(TilemDisasmView *dv, dword pos) +{ + TilemDebugBreakpoint *bp, tmpbp; + + if ((bp = find_line_bp(dv, pos))) + return; + + tmpbp.type = (dv->use_logical + ? TILEM_DB_BREAK_LOGICAL + : TILEM_DB_BREAK_PHYSICAL); + tmpbp.mode = TILEM_DB_BREAK_EXEC; + tmpbp.start = POS_TO_ADDR(pos); + tmpbp.end = POS_TO_ADDR(pos); + tmpbp.mask = (dv->use_logical ? 0xffff : 0xffffffff); + tmpbp.disabled = 0; + tilem_debugger_add_breakpoint(dv->dbg, &tmpbp); +} + +/* Disable breakpoint on the given line */ +static void disable_line_bp(TilemDisasmView *dv, dword pos) +{ + TilemDebugBreakpoint *bp, tmpbp; + + if (!(bp = find_line_bp(dv, pos))) + return; + + if (bp->mode != TILEM_DB_BREAK_EXEC || bp->start != bp->end) { + /* special breakpoint; do not delete it, just disable it */ + tmpbp = *bp; + tmpbp.disabled = 1; + tilem_debugger_change_breakpoint(dv->dbg, bp, &tmpbp); + } + else { + /* regular breakpoint */ + tilem_debugger_remove_breakpoint(dv->dbg, bp); + } +} + +/* Append a line to the dasm model */ +static void append_dasm_line(TilemDisasmView *dv, TilemCalc *calc, + GtkTreeModel *model, GtkTreeIter *iter, + dword pos, dword *nextpos) +{ + GtkTreeIter iter1; + char *astr, *mnem, *args; + dword addr, pc; + gboolean ispc; + TilemDebugBreakpoint *bp; + GdkPixbuf *icon; + + g_return_if_fail(calc != NULL); + + gtk_list_store_append(GTK_LIST_STORE(model), &iter1); + + addr = POS_TO_ADDR(pos); + astr = tilem_format_addr(dv->dbg, addr, !dv->use_logical); + + disassemble(dv, calc, pos, nextpos, &mnem, &args); + + if (!mnem) + bp = NULL; + else if (dv->use_logical) + bp = find_bp_logical(dv->dbg, calc, addr); + else + bp = find_bp_physical(dv->dbg, calc, addr); + + if (!mnem || !dv->dbg->emu->paused) { + ispc = FALSE; + } + else { + pc = calc->z80.r.pc.w.l; + if (!dv->use_logical) + pc = (*calc->hw.mem_ltop)(calc, pc); + ispc = (addr == pc); + } + + icon = get_icon(dv, ispc, (bp != NULL)); + + gtk_list_store_set(GTK_LIST_STORE(model), &iter1, + COL_POSITION, (int) pos, + COL_ADDRESS, astr, + COL_MNEMONIC, mnem, + COL_SHOW_MNEMONIC, (mnem ? TRUE : FALSE), + COL_ARGUMENTS, args, + COL_ICON, icon, + -1); + + if (icon) + g_object_unref(icon); + + g_free(astr); + g_free(mnem); + g_free(args); + + if (iter) + *iter = iter1; +} + +/* Refresh the view by creating and populating a new model */ +static void refresh_disassembly(TilemDisasmView *dv, dword pos, int nlines, + dword selectpos) +{ + GtkTreeModel *model; + GtkTreeIter iter; + GtkTreePath *selectpath = NULL; + TilemCalc *calc; + dword nextpos; + int i; + + model = new_dasm_model(); + + dv->startpos = pos; + + tilem_calc_emulator_lock(dv->dbg->emu); + calc = dv->dbg->emu->calc; + + if (!calc) + nlines = 0; + + for (i = 0; i < nlines; i++) { + append_dasm_line(dv, calc, model, &iter, pos, &nextpos); + + if (pos == selectpos) + selectpath = gtk_tree_model_get_path(model, &iter); + + pos = nextpos; + } + + tilem_calc_emulator_unlock(dv->dbg->emu); + + dv->endpos = pos; + dv->nlines = nlines; + + gtk_tree_view_set_model(GTK_TREE_VIEW(dv), model); + g_object_unref(model); + + if (selectpath) { + gtk_tree_view_set_cursor(GTK_TREE_VIEW(dv), selectpath, + NULL, FALSE); + gtk_tree_path_free(selectpath); + } +} + +/* Determine the (absolute) position and (display-relative) line + number of the cursor, if any */ +static gboolean get_cursor_line(TilemDisasmView *dv, dword *pos, + int *linenum) +{ + GtkTreePath *path; + GtkTreeModel *model; + GtkTreeIter iter; + gint *i, p; + + gtk_tree_view_get_cursor(GTK_TREE_VIEW(dv), &path, NULL); + if (!path) { + if (pos) *pos = (dword) -1; + if (linenum) *linenum = -1; + return FALSE; + } + + if (pos) { + model = gtk_tree_view_get_model(GTK_TREE_VIEW(dv)); + if (gtk_tree_model_get_iter(model, &iter, path)) { + gtk_tree_model_get(model, &iter, + COL_POSITION, &p, -1); + *pos = p; + } + else { + *pos = (dword) -1; + } + } + + if (linenum) { + i = gtk_tree_path_get_indices(path); + *linenum = i[0]; + } + + gtk_tree_path_free(path); + + return TRUE; +} + +/* Size allocation */ + +/* Get the desired height for the tree view (based on size of the data + we've inserted into the model) */ +static int get_parent_request_height(GtkWidget *w) +{ + GtkRequisition req; + (*GTK_WIDGET_CLASS(parent_class)->size_request)(w, &req); + return req.height; +} + +/* Widget is assigned a size and position */ +static void tilem_disasm_view_size_allocate(GtkWidget *w, + GtkAllocation *alloc) +{ + TilemDisasmView *dv; + GtkTreeModel *model; + dword curpos; + int n, height1, height2; + + g_return_if_fail(TILEM_IS_DISASM_VIEW(w)); + dv = TILEM_DISASM_VIEW(w); + + (*GTK_WIDGET_CLASS(parent_class)->size_allocate)(w, alloc); + + if (alloc->height < 1) + return; + + get_cursor_line(dv, &curpos, NULL); + + /* Calculate line height */ + if (!dv->line_height) { + model = new_dasm_model(); + + append_dummy_line(dv, model, NULL); + gtk_tree_view_set_model(GTK_TREE_VIEW(dv), model); + height1 = get_parent_request_height(w); + + append_dummy_line(dv, model, NULL); + height2 = get_parent_request_height(w); + + dv->line_height = height2 - height1; + dv->base_height = height1 - dv->line_height; + + g_object_unref(model); + + dv->nlines = 0; + + if (dv->line_height <= 0) { + dv->line_height = 0; + return; + } + } + + n = (alloc->height - dv->base_height) / dv->line_height; + + if (n < 1) + n = 1; + + if (n != dv->nlines) + refresh_disassembly(dv, dv->startpos, n, curpos); +} + +/* Get widget's desired size */ +static void tilem_disasm_view_size_request(GtkWidget *w, GtkRequisition *req) +{ + (*GTK_WIDGET_CLASS(parent_class)->size_request)(w, req); + req->height = 100; /* ignore requested height */ +} + +/* Widget style set */ +static void tilem_disasm_view_style_set(GtkWidget *w, GtkStyle *oldstyle) +{ + TilemDisasmView *dv; + GtkTreeModel *model; + GtkTreeIter iter; + GList *cols, *cp; + GtkTreeViewColumn *col; + int width; + + g_return_if_fail(TILEM_IS_DISASM_VIEW(w)); + dv = TILEM_DISASM_VIEW(w); + + (*GTK_WIDGET_CLASS(parent_class)->style_set)(w, oldstyle); + + /* line height must be recalculated */ + dv->line_height = 0; + + /* set column widths based on a dummy model */ + + model = new_dasm_model(); + append_dummy_line(dv, model, &iter); + + cols = gtk_tree_view_get_columns(GTK_TREE_VIEW(dv)); + for (cp = cols; cp; cp = cp->next) { + col = cp->data; + gtk_tree_view_column_cell_set_cell_data(col, model, &iter, + FALSE, FALSE); + gtk_tree_view_column_cell_get_size(col, NULL, NULL, NULL, + &width, NULL); + gtk_tree_view_column_set_fixed_width(col, width + 2); + } + g_list_free(cols); + + g_object_unref(model); +} + +/* Cursor movement commands */ + +/* Move up by COUNT lines */ +static gboolean move_up_lines(TilemDisasmView *dv, int count) +{ + TilemCalc *calc; + dword pos; + int linenum; + + if (!get_cursor_line(dv, NULL, &linenum)) + linenum = 0; + + if (linenum >= count) + return FALSE; + + tilem_calc_emulator_lock(dv->dbg->emu); + calc = dv->dbg->emu->calc; + + pos = dv->startpos; + count -= linenum; + while (count > 0) { + pos = get_prev_pos(dv, calc, pos); + count--; + } + + tilem_calc_emulator_unlock(dv->dbg->emu); + + refresh_disassembly(dv, pos, dv->nlines, pos); + + return TRUE; +} + +/* Move down by COUNT lines */ +static gboolean move_down_lines(TilemDisasmView *dv, int count) +{ + TilemCalc *calc; + dword startpos, selpos; + int linenum; + + if (!get_cursor_line(dv, NULL, &linenum)) + linenum = -1; + + if (linenum + count < dv->nlines) + return FALSE; + + tilem_calc_emulator_lock(dv->dbg->emu); + calc = dv->dbg->emu->calc; + + startpos = get_next_pos(dv, calc, dv->startpos); + selpos = dv->endpos; + count -= dv->nlines - linenum; + + while (count > 0) { + startpos = get_next_pos(dv, calc, startpos); + selpos = get_next_pos(dv, calc, selpos); + count--; + } + + tilem_calc_emulator_unlock(dv->dbg->emu); + + refresh_disassembly(dv, startpos, dv->nlines, selpos); + + return TRUE; +} + +/* Move down by COUNT bytes */ +static void move_bytes(TilemDisasmView *dv, int count) +{ + dword pos, addr; + const TilemCalc *calc = dv->dbg->emu->calc; + + g_return_if_fail(calc != NULL); + + if (!get_cursor_line(dv, &pos, NULL)) + pos = dv->startpos; + + addr = POS_TO_ADDR(pos); + + if (dv->use_logical) + addr = (addr + count) & 0xffff; + else { + addr += calc->hw.romsize + calc->hw.ramsize + count; + addr %= calc->hw.romsize + calc->hw.ramsize; + } + + pos = ADDR_TO_POS(addr); + refresh_disassembly(dv, pos, dv->nlines, pos - 1); +} + +/* Move the cursor (action signal) */ +static gboolean tilem_disasm_view_move_cursor(GtkTreeView *tv, + GtkMovementStep step, + gint count) +{ + TilemDisasmView *dv; + + g_return_val_if_fail(TILEM_IS_DISASM_VIEW(tv), FALSE); + dv = TILEM_DISASM_VIEW(tv); + + if (!dv->dbg->emu->calc) + return FALSE; + + switch (step) { + case GTK_MOVEMENT_DISPLAY_LINES: + if (count < 0) { + if (move_up_lines(dv, -count)) + return TRUE; + } + else { + if (move_down_lines(dv, count)) + return TRUE; + } + break; + + case GTK_MOVEMENT_PARAGRAPHS: + case GTK_MOVEMENT_PARAGRAPH_ENDS: + case GTK_MOVEMENT_PAGES: + /* FIXME: might be better to move by actual "pages" of code */ + move_bytes(dv, count * 0x100); + return TRUE; + + case GTK_MOVEMENT_BUFFER_ENDS: + move_bytes(dv, count * 0x4000); + return TRUE; + + case GTK_MOVEMENT_LOGICAL_POSITIONS: + case GTK_MOVEMENT_VISUAL_POSITIONS: + case GTK_MOVEMENT_WORDS: + case GTK_MOVEMENT_DISPLAY_LINE_ENDS: + case GTK_MOVEMENT_HORIZONTAL_PAGES: + default: + break; + } + + return (*GTK_TREE_VIEW_CLASS(parent_class)->move_cursor)(tv, step, count); +} + +/* Popup menu */ + +static void toggle_bp(G_GNUC_UNUSED GtkCheckMenuItem *item, gpointer data) +{ + TilemDisasmView *dv = data; + tilem_disasm_view_toggle_breakpoint(dv); +} + +void tilem_disasm_view_toggle_breakpoint(TilemDisasmView *dv) +{ + dword curpos; + + g_return_if_fail(TILEM_IS_DISASM_VIEW(dv)); + + get_cursor_line(dv, &curpos, NULL); + if (curpos == (dword) -1) + return; + + if (find_line_bp(dv, curpos)) + disable_line_bp(dv, curpos); + else + enable_line_bp(dv, curpos); +} + +static void prompt_go_to(G_GNUC_UNUSED GtkMenuItem *item, gpointer data) +{ + TilemDisasmView *dv = data; + GtkWidget *window; + dword curpos, addr; + + window = gtk_widget_get_toplevel(GTK_WIDGET(dv)); + + get_cursor_line(dv, &curpos, NULL); + addr = POS_TO_ADDR(curpos); + + if (tilem_prompt_address(dv->dbg, GTK_WINDOW(window), + "Go to Address", "Address:", + &addr, !dv->use_logical, + (curpos != (dword) -1))) + tilem_disasm_view_go_to_address(dv, addr, dv->use_logical); +} + +static void go_to_pc(G_GNUC_UNUSED GtkMenuItem *item, gpointer data) +{ + TilemDisasmView *dv = data; + TilemCalc *calc; + dword pc; + + g_return_if_fail(dv->dbg != NULL); + g_return_if_fail(dv->dbg->emu != NULL); + g_return_if_fail(dv->dbg->emu->calc != NULL); + + tilem_calc_emulator_lock(dv->dbg->emu); + calc = dv->dbg->emu->calc; + pc = calc->z80.r.pc.w.l; + tilem_calc_emulator_unlock(dv->dbg->emu); + + tilem_disasm_view_go_to_address(dv, pc, TRUE); +} + +/* Determine where to pop up menu (if not activated by a mouse event) */ +static void place_menu(GtkMenu *menu, gint *x, gint *y, + gboolean *push_in, gpointer data) +{ + TilemDisasmView *dv = data; + GtkTreePath *path; + GdkRectangle rect; + GdkWindow *win; + GdkScreen *screen; + int n; + + win = gtk_tree_view_get_bin_window(GTK_TREE_VIEW(dv)); + gdk_window_get_origin(win, x, y); + + gtk_tree_view_get_cursor(GTK_TREE_VIEW(dv), &path, NULL); + if (path) { + gtk_tree_view_get_cell_area(GTK_TREE_VIEW(dv), path, NULL, &rect); + gtk_tree_path_free(path); + *y += rect.y + rect.height; + } + + screen = gdk_drawable_get_screen(win); + n = gdk_screen_get_monitor_at_point(screen, *x, *y); + gtk_menu_set_monitor(menu, n); + + *push_in = FALSE; +} + +/* Create and show the popup menu */ +static void show_popup_menu(TilemDisasmView *dv, GdkEventButton *event) +{ + GtkWidget *menu, *item; + dword curpos; + + if (dv->popup_menu) + gtk_widget_destroy(dv->popup_menu); + dv->popup_menu = menu = gtk_menu_new(); + + /* Enable/disable breakpoint */ + + item = gtk_check_menu_item_new_with_mnemonic("_Breakpoint Here"); + + get_cursor_line(dv, &curpos, NULL); + if (curpos == (dword) -1) + gtk_widget_set_sensitive(item, FALSE); + else if (find_line_bp(dv, curpos)) + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), TRUE); + + g_signal_connect(item, "toggled", + G_CALLBACK(toggle_bp), dv); + + gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); + gtk_widget_show(item); + + item = gtk_separator_menu_item_new(); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); + gtk_widget_show(item); + + /* Jump to address */ + + item = gtk_menu_item_new_with_mnemonic("_Go to Address..."); + g_signal_connect(item, "activate", G_CALLBACK(prompt_go_to), dv); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); + gtk_widget_show(item); + + item = gtk_menu_item_new_with_mnemonic("Go to P_C"); + g_signal_connect(item, "activate", G_CALLBACK(go_to_pc), dv); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); + gtk_widget_show(item); + + if (event) + gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, + event->button, event->time); + else + gtk_menu_popup(GTK_MENU(menu), NULL, NULL, &place_menu, dv, + 0, gtk_get_current_event_time()); +} + +/* Button pressed */ +static gboolean tilem_disasm_view_button_press(GtkWidget *w, + GdkEventButton *event) +{ + g_return_val_if_fail(TILEM_IS_DISASM_VIEW(w), FALSE); + + (*GTK_WIDGET_CLASS(parent_class)->button_press_event)(w, event); + + if (event->button == 3) + show_popup_menu(TILEM_DISASM_VIEW(w), event); + + return TRUE; +} + +/* Key pressed to activate context menu */ +static gboolean tilem_disasm_view_popup_menu(GtkWidget *w) +{ + g_return_val_if_fail(TILEM_IS_DISASM_VIEW(w), FALSE); + show_popup_menu(TILEM_DISASM_VIEW(w), NULL); + return TRUE; +} + +/* Row activated (double-clicked) */ +static void tilem_disasm_view_row_activated(GtkTreeView *tv, GtkTreePath *path, + GtkTreeViewColumn *col) +{ + TilemDisasmView *dv = TILEM_DISASM_VIEW(tv); + GtkTreeModel *model; + GtkTreeIter iter; + gint pos; + + model = gtk_tree_view_get_model(tv); + if (!gtk_tree_model_get_iter(model, &iter, path)) + return; + + gtk_tree_model_get(model, &iter, COL_POSITION, &pos, -1); + + if (col == dv->icon_column) { + if (find_line_bp(dv, pos)) + disable_line_bp(dv, pos); + else + enable_line_bp(dv, pos); + } +} + +/* Unrealize widget */ +static void tilem_disasm_view_unrealize(GtkWidget *w) +{ + TilemDisasmView *dv = TILEM_DISASM_VIEW(w); + + if (dv->popup_menu) + gtk_widget_destroy(dv->popup_menu); + dv->popup_menu = NULL; + + (*GTK_WIDGET_CLASS(parent_class)->unrealize)(w); +} + +/* Initialize a new TilemDisasmView */ +static void tilem_disasm_view_init(TilemDisasmView *dv) +{ + GtkTreeView *tv = GTK_TREE_VIEW(dv); + GtkCellRenderer *cell; + GtkTreeViewColumn *col; + + dv->use_logical = TRUE; + + gtk_tree_view_set_enable_search(tv, FALSE); + gtk_tree_view_set_fixed_height_mode(tv, TRUE); + gtk_tree_view_set_headers_visible(tv, FALSE); + + cell = gtk_cell_renderer_pixbuf_new(); + col = gtk_tree_view_column_new_with_attributes(NULL, cell, + "pixbuf", COL_ICON, + NULL); + gtk_tree_view_column_set_sizing(col, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_append_column(tv, col); + dv->icon_column = col; + + cell = gtk_cell_renderer_text_new(); + col = gtk_tree_view_column_new_with_attributes("Addr", cell, + "text", COL_ADDRESS, + NULL); + gtk_tree_view_column_set_sizing(col, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_append_column(tv, col); + + col = gtk_tree_view_column_new(); + gtk_tree_view_column_set_title(col, "Disassembly"); + + cell = gtk_cell_renderer_text_new(); + g_object_set(cell, "xpad", 10, NULL); + gtk_tree_view_column_pack_start(col, cell, FALSE); + gtk_tree_view_column_set_attributes(col, cell, + "text", COL_MNEMONIC, + "visible", COL_SHOW_MNEMONIC, + NULL); + + cell = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(col, cell, TRUE); + gtk_tree_view_column_set_attributes(col, cell, + "text", COL_ARGUMENTS, + NULL); + + gtk_tree_view_column_set_sizing(col, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_expand(col, TRUE); + gtk_tree_view_append_column(tv, col); +} + +static const char default_style[] = + "style \"tilem-disasm-default\" { font_name = \"Monospace\" } " + "widget \"*.TilemDisasmView\" style:application \"tilem-disasm-default\""; + +/* Initialize the TilemDisasmView class */ +static void tilem_disasm_view_class_init(TilemDisasmViewClass *klass) +{ + GtkTreeViewClass *tv_class = GTK_TREE_VIEW_CLASS(klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass); + + gtk_rc_parse_string(default_style); + + parent_class = g_type_class_peek_parent(klass); + + widget_class->style_set = &tilem_disasm_view_style_set; + widget_class->size_request = &tilem_disasm_view_size_request; + widget_class->size_allocate = &tilem_disasm_view_size_allocate; + widget_class->button_press_event = &tilem_disasm_view_button_press; + widget_class->popup_menu = &tilem_disasm_view_popup_menu; + widget_class->unrealize = &tilem_disasm_view_unrealize; + tv_class->move_cursor = &tilem_disasm_view_move_cursor; + tv_class->row_activated = &tilem_disasm_view_row_activated; +} + +GtkWidget * tilem_disasm_view_new(TilemDebugger *dbg) +{ + TilemDisasmView *dv; + + g_return_val_if_fail(dbg != NULL, NULL); + + dv = g_object_new(TILEM_TYPE_DISASM_VIEW, NULL); + dv->dbg = dbg; + + return GTK_WIDGET(dv); +} + +/* Select memory addressing mode. */ +void tilem_disasm_view_set_logical(TilemDisasmView *dv, gboolean logical) +{ + dword start, curpos; + TilemCalc *calc; + + g_return_if_fail(TILEM_IS_DISASM_VIEW(dv)); + g_return_if_fail(dv->dbg->emu->calc != NULL); + + get_cursor_line(dv, &curpos, NULL); + + if (logical && !dv->use_logical) { + tilem_calc_emulator_lock(dv->dbg->emu); + calc = dv->dbg->emu->calc; + curpos = pos_ptol(calc, curpos); + start = pos_ptol(calc, dv->startpos); + tilem_calc_emulator_unlock(dv->dbg->emu); + + dv->use_logical = TRUE; + refresh_disassembly(dv, start, dv->nlines, curpos); + } + else if (!logical && dv->use_logical) { + tilem_calc_emulator_lock(dv->dbg->emu); + calc = dv->dbg->emu->calc; + curpos = pos_ltop(calc, curpos); + start = pos_ltop(calc, dv->startpos); + tilem_calc_emulator_unlock(dv->dbg->emu); + + dv->use_logical = FALSE; + refresh_disassembly(dv, start, dv->nlines, curpos); + } +} + +/* Refresh contents of view. */ +void tilem_disasm_view_refresh(TilemDisasmView *dv) +{ + dword curpos; + g_return_if_fail(TILEM_IS_DISASM_VIEW(dv)); + get_cursor_line(dv, &curpos, NULL); + refresh_disassembly(dv, dv->startpos, dv->nlines, curpos); +} + +/* Find tree path for the given position */ +static GtkTreePath *find_path_for_position(GtkTreeModel *model, int pos) +{ + gint p; + GtkTreeIter iter; + + if (!gtk_tree_model_get_iter_first(model, &iter)) + return NULL; + + do { + gtk_tree_model_get(model, &iter, COL_POSITION, &p, -1); + if (p == pos) { + return gtk_tree_model_get_path(model, &iter); + } + } while (gtk_tree_model_iter_next(model, &iter)); + + return NULL; +} + +/* Highlight the specified address. */ +void tilem_disasm_view_go_to_address(TilemDisasmView *dv, dword addr, + gboolean logical) +{ + dword pos; + GtkTreeModel *model; + GtkTreePath *path; + TilemCalc *calc; + + g_return_if_fail(TILEM_IS_DISASM_VIEW(dv)); + + tilem_calc_emulator_lock(dv->dbg->emu); + calc = dv->dbg->emu->calc; + + if (logical) { + addr &= 0xffff; + if (dv->use_logical) + pos = ADDR_TO_POS(addr); + else + pos = pos_ltop(calc, ADDR_TO_POS(addr)); + } + else { + if (dv->use_logical) { + addr = (*calc->hw.mem_ptol)(calc, addr); + if (addr == (dword) -1) { + tilem_calc_emulator_unlock(dv->dbg->emu); + return; + } + } + pos = ADDR_TO_POS(addr); + } + + tilem_calc_emulator_unlock(dv->dbg->emu); + + if (pos >= dv->startpos && pos < dv->endpos) { + model = gtk_tree_view_get_model(GTK_TREE_VIEW(dv)); + path = find_path_for_position(model, pos); + if (path) { + gtk_tree_view_set_cursor(GTK_TREE_VIEW(dv), path, + NULL, FALSE); + gtk_tree_path_free(path); + return; + } + } + + refresh_disassembly(dv, pos, dv->nlines, pos); +} + +/* Get currently selected address. */ +gboolean tilem_disasm_view_get_cursor(TilemDisasmView *dv, dword *addr, + gboolean *is_logical) +{ + dword pos; + + g_return_val_if_fail(TILEM_IS_DISASM_VIEW(dv), FALSE); + + if (is_logical) *is_logical = dv->use_logical; + + if (!get_cursor_line(dv, &pos, NULL)) + return FALSE; + + if (addr) *addr = POS_TO_ADDR(pos); + return TRUE; +} + diff --git a/tool/tilem-src/gui/disasmview.h b/tool/tilem-src/gui/disasmview.h new file mode 100644 index 0000000..58463e4 --- /dev/null +++ b/tool/tilem-src/gui/disasmview.h @@ -0,0 +1,73 @@ +/* + * TilEm II + * + * Copyright (c) 2011-2012 Benjamin Moody + * + * 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 . + */ + +G_BEGIN_DECLS + +#define TILEM_TYPE_DISASM_VIEW (tilem_disasm_view_get_type()) +#define TILEM_DISASM_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), TILEM_TYPE_DISASM_VIEW, TilemDisasmView)) +#define TILEM_DISASM_VIEW_CLASS(cls) (G_TYPE_CHECK_CLASS_CAST((cls), TILEM_TYPE_DISASM_VIEW, TilemDisasmViewClass)) +#define TILEM_IS_DISASM_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), TILEM_TYPE_DISASM_VIEW)) +#define TILEM_IS_DISASM_VIEW_CLASS(cls) (G_TYPE_CHECK_CLASS_TYPE((cls), TILEM_TYPE_DISASM_VIEW)) +#define TILEM_DISASM_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), TILEM_TYPE_DISASM_VIEW, TilemDisasmViewClass)) + +typedef struct _TilemDisasmView { + GtkTreeView parent; + + TilemDebugger *dbg; + + gboolean use_logical; + + int base_height; /* base height of tree view */ + int line_height; /* height of each row */ + + dword startpos; /* position at start of window */ + dword endpos; /* position at end of window */ + int nlines; /* number of lines visible */ + + GtkTreeViewColumn *icon_column; + GtkWidget *popup_menu; +} TilemDisasmView; + +typedef struct _TilemDisasmViewClass { + GtkTreeViewClass parent_class; +} TilemDisasmViewClass; + +GType tilem_disasm_view_get_type(void) G_GNUC_CONST; + +/* Create a new TilemDisasmView. */ +GtkWidget * tilem_disasm_view_new(TilemDebugger *dbg); + +/* Select memory addressing mode. */ +void tilem_disasm_view_set_logical(TilemDisasmView *dv, gboolean logical); + +/* Refresh contents of view. */ +void tilem_disasm_view_refresh(TilemDisasmView *dv); + +/* Highlight the specified address. */ +void tilem_disasm_view_go_to_address(TilemDisasmView *dv, dword addr, + gboolean logical); + +/* Get currently selected address. */ +gboolean tilem_disasm_view_get_cursor(TilemDisasmView *dv, dword *addr, + gboolean *is_logical); + +/* Toggle breakpoint at selected address. */ +void tilem_disasm_view_toggle_breakpoint(TilemDisasmView *dv); + +G_END_DECLS diff --git a/tool/tilem-src/gui/emucore.c b/tool/tilem-src/gui/emucore.c new file mode 100644 index 0000000..a5840ab --- /dev/null +++ b/tool/tilem-src/gui/emucore.c @@ -0,0 +1,436 @@ +/* + * TilEm II + * + * Copyright (c) 2011 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include "gui.h" +#include "emucore.h" + +#define MICROSEC_PER_TICK 10000 + +typedef struct { + TilemCalcEmulator *emu; + TilemTaskMainFunc mainf; + TilemTaskFinishedFunc finishedf; + gpointer userdata; + gboolean cancelled; +} Task; + +/* Add a task to the queue. */ +void tilem_calc_emulator_begin(TilemCalcEmulator *emu, + TilemTaskMainFunc mainf, + TilemTaskFinishedFunc finishedf, + gpointer data) +{ + Task *task; + + g_return_if_fail(emu != NULL); + g_return_if_fail(mainf != NULL); + + task = g_slice_new0(Task); + task->emu = emu; + task->mainf = mainf; + task->finishedf = finishedf; + task->userdata = data; + + tilem_calc_emulator_lock(emu); + g_queue_push_tail(emu->task_queue, task); + tilem_calc_emulator_unlock(emu); +} + +/* Cancel all pending tasks. If a task is currently running, this + will wait for it to finish. */ +void tilem_calc_emulator_cancel_tasks(TilemCalcEmulator *emu) +{ + GQueue *oldqueue; + Task *task; + + tilem_calc_emulator_lock(emu); + emu->task_abort = TRUE; + emu->link_update->cancel = TRUE; + oldqueue = emu->task_queue; + emu->task_queue = g_queue_new(); + tilem_calc_emulator_unlock(emu); + + while ((task = g_queue_pop_head(oldqueue))) { + if (task->finishedf) + (*task->finishedf)(emu, task->userdata, TRUE); + g_slice_free(Task, task); + } + + g_queue_free(oldqueue); + + g_mutex_lock(emu->calc_mutex); + while (emu->task_busy) + g_cond_wait(emu->task_finished_cond, emu->calc_mutex); + emu->task_abort = FALSE; + emu->link_update->cancel = FALSE; + g_cond_broadcast(emu->calc_wakeup_cond); + g_mutex_unlock(emu->calc_mutex); +} + +/* Check if calculator is powered off */ +static gboolean calc_asleep(TilemCalcEmulator *emu) +{ + return (emu->calc->z80.halted + && !emu->calc->z80.interrupts + && !emu->calc->poweronhalt + && !emu->key_queue_timer); +} + +static gboolean refresh_lcd(gpointer data) +{ + TilemCalcEmulator* emu = data; + + if (emu->ewin) + tilem_emulator_window_refresh_lcd(emu->ewin); + + return FALSE; +} + +/* Update screen for display while paused */ +static void update_screen_mono(TilemCalcEmulator *emu) +{ + g_mutex_lock(emu->lcd_mutex); + + tilem_lcd_get_frame(emu->calc, emu->lcd_buffer); + + if (!emu->lcd_update_pending) { + emu->lcd_update_pending = TRUE; + g_idle_add_full(G_PRIORITY_DEFAULT, &refresh_lcd, emu, NULL); + } + + g_mutex_unlock(emu->lcd_mutex); +} + +/* idle callback to update progress bar */ +static gboolean pbar_update(gpointer data) +{ + TilemCalcEmulator *emu = data; + progress_bar_update(emu); + return FALSE; +} + +static void update_progress(TilemCalcEmulator *emu, gboolean force) +{ + if (force || emu->progress_changed) + g_idle_add(&pbar_update, emu); + emu->progress_changed = FALSE; +} + +static gboolean show_debugger(gpointer data) +{ + TilemCalcEmulator* emu = data; + + if (emu->dbg) + tilem_debugger_show(emu->dbg); + + return FALSE; +} + +#define BREAK_MASK (TILEM_STOP_BREAKPOINT \ + | TILEM_STOP_INVALID_INST \ + | TILEM_STOP_UNDOCUMENTED_INST) + +/* Run one iteration of the emulator. */ +dword tilem_em_run(TilemCalcEmulator *emu, int linkmode, + dword events, dword ff_events, gboolean keep_awake, + int timeout, int *elapsed) +{ + dword all_events, ev_auto, ev_user; + int rem; + gulong tcur, delaytime; + + if (emu->exiting || emu->task_abort) { + if (elapsed) *elapsed = 0; + return 0; + } + else if (emu->paused) { + update_screen_mono(emu); + update_progress(emu, TRUE); + g_cond_wait(emu->calc_wakeup_cond, emu->calc_mutex); + update_progress(emu, TRUE); + g_timer_elapsed(emu->timer, &emu->timevalue); + if (elapsed) *elapsed = 0; + return 0; + } + else if (!keep_awake && calc_asleep(emu)) { + update_progress(emu, FALSE); + update_screen_mono(emu); + g_cond_wait(emu->calc_wakeup_cond, emu->calc_mutex); + g_timer_elapsed(emu->timer, &emu->timevalue); + if (elapsed) *elapsed = timeout; + return 0; + } + + update_progress(emu, FALSE); + + all_events = events | BREAK_MASK; + + emu->calc->linkport.linkemu = linkmode; + emu->calc->z80.stop_mask = ~all_events; + + tilem_z80_run_time(emu->calc, timeout, &rem); + + ev_user = emu->calc->z80.stop_reason & events; + ev_auto = emu->calc->z80.stop_reason & ~events; + + if (elapsed) *elapsed = timeout - rem; + + if (ev_auto & BREAK_MASK) { + emu->paused = TRUE; + g_idle_add(&show_debugger, emu); + } + + if (emu->limit_speed + && !(ff_events & ev_user) + && ff_events != TILEM_EM_ALWAYS_FF) { + emu->timevalue += timeout - rem; + g_timer_elapsed(emu->timer, &tcur); + + /* emu->timevalue is the "ideal" time when the + operation should be completed. If emu->timevalue + is greater than tcur, we're running faster than + real time. Try to sleep for (emu->timevalue - + tcur) microseconds. + + If emu->timevalue is less than tcur, we're running + slower than real time. If the difference is small, + just keep going and hope we'll catch up later. + + If the difference is substantial (more than 1/10 + second in either direction), re-synchronize. */ + + delaytime = emu->timevalue - tcur; + + if (delaytime <= (gulong) 100000 + timeout) { + tilem_em_unlock(emu); + g_usleep(delaytime); + tilem_em_lock(emu); + } + else { + tilem_em_check_yield(emu); + if (delaytime < (gulong) -100000) + emu->timevalue = tcur; + } + } + else { + tilem_em_check_yield(emu); + } + + return ev_user; +} + +static gboolean taskfinished(gpointer data) +{ + Task *task = data; + + if (task->finishedf) + (*task->finishedf)(task->emu, task->userdata, task->cancelled); + + g_slice_free(Task, task); + return FALSE; +} + +static void run_task(TilemCalcEmulator *emu, Task *task) +{ + gboolean status; + + emu->task_busy = TRUE; + status = (*task->mainf)(emu, task->userdata); + + g_idle_add(&taskfinished, task); + + if (!status) { + while ((task = g_queue_pop_head(emu->task_queue))) { + task->cancelled = TRUE; + g_idle_add(&taskfinished, task); + } + } + emu->task_busy = FALSE; +} + +/* Main loop */ +gpointer tilem_em_main(gpointer data) +{ + TilemCalcEmulator *emu = data; + Task *task; + + tilem_em_lock(emu); + + g_timer_start(emu->timer); + g_timer_elapsed(emu->timer, &emu->timevalue); + + while (!emu->exiting) { + task = g_queue_pop_head(emu->task_queue); + if (task) { + run_task(emu, task); + } + else if (emu->task_abort) { + g_cond_broadcast(emu->task_finished_cond); + g_cond_wait(emu->calc_wakeup_cond, emu->calc_mutex); + } + else { + tilem_em_run(emu, 0, 0, 0, FALSE, + MICROSEC_PER_TICK, NULL); + } + } + + tilem_em_unlock(emu); + return NULL; +} + +/* Run the calculator for a short time. */ +void tilem_em_delay(TilemCalcEmulator *emu, int timeout, gboolean ff) +{ + int t; + G_GNUC_UNUSED dword events; + + while (!emu->task_abort && timeout > 0) { + t = MIN(MICROSEC_PER_TICK, timeout); + events = tilem_em_run(emu, 0, 0, + (ff ? TILEM_EM_ALWAYS_FF : 0), TRUE, + t, &t); + timeout -= t; + } +} + +#define LINK_EVENTS (TILEM_STOP_LINK_READ_BYTE \ + | TILEM_STOP_LINK_WRITE_BYTE \ + | TILEM_STOP_LINK_ERROR) + +static int run_until_ready(TilemCalcEmulator *emu, int timeout, gboolean ff) +{ + int t; + dword events; + + emu->calc->linkport.linkemu = TILEM_LINK_EMULATOR_GRAY; + while (!emu->task_abort && timeout > 0) { + if (tilem_linkport_graylink_ready(emu->calc)) + return 0; + + t = MIN(MICROSEC_PER_TICK, timeout); + events = tilem_em_run(emu, TILEM_LINK_EMULATOR_GRAY, + LINK_EVENTS, (ff ? LINK_EVENTS : 0), TRUE, + t, &t); + + timeout -= t; + if (events & TILEM_STOP_LINK_ERROR) + break; + } + return -1; +} + +/* Send a byte to the calculator. */ +int tilem_em_send_byte(TilemCalcEmulator *emu, unsigned value, + int timeout, gboolean ff) +{ + if (run_until_ready(emu, timeout, ff)) + return -1; + if (tilem_linkport_graylink_send_byte(emu->calc, value)) + return -1; + if (run_until_ready(emu, timeout, ff)) + return -1; + return 0; +} + +/* Receive a byte from the calculator. */ +int tilem_em_get_byte(TilemCalcEmulator *emu, int timeout, gboolean ff) +{ + int t, v; + dword events; + + while (!emu->task_abort && timeout > 0) { + v = tilem_linkport_graylink_get_byte(emu->calc); + if (v >= 0) + return v; + + t = MIN(MICROSEC_PER_TICK, timeout); + events = tilem_em_run(emu, TILEM_LINK_EMULATOR_GRAY, + LINK_EVENTS, (ff ? LINK_EVENTS : 0), FALSE, + t, &t); + timeout -= t; + if (events & TILEM_STOP_LINK_ERROR) + break; + } + return -1; +} + +/* Wake up calculator if currently turned off. */ +void tilem_em_wake_up(TilemCalcEmulator *emu, gboolean ff) +{ + tilem_em_delay(emu, 1000000, ff); + + if (!calc_asleep(emu)) + return; + + tilem_keypad_press_key(emu->calc, TILEM_KEY_ON); + tilem_em_delay(emu, 500000, ff); + tilem_keypad_release_key(emu->calc, TILEM_KEY_ON); + tilem_em_delay(emu, 500000, ff); +} + +/* Set progress window title. Set TITLE to NULL to disable progress + window. */ +void tilem_em_set_progress_title(TilemCalcEmulator *emu, const char *title) +{ + g_mutex_lock(emu->pbar_mutex); + g_free(emu->pbar_title); + g_free(emu->pbar_status); + emu->pbar_title = title ? g_strdup(title) : NULL; + emu->pbar_status = NULL; + emu->pbar_progress = 0.0; + if (!emu->pbar_update_pending) + emu->progress_changed = TRUE; + emu->pbar_update_pending = TRUE; + g_mutex_unlock(emu->pbar_mutex); +} + +/* Set current progress information. FRAC is the estimated fraction + of the task completed; STATUS is a text description of the current + operation. */ +void tilem_em_set_progress(TilemCalcEmulator *emu, gdouble frac, + const char *status) +{ + g_mutex_lock(emu->pbar_mutex); + + if (!emu->pbar_status || !status + || strcmp(status, emu->pbar_status)) { + g_free(emu->pbar_status); + emu->pbar_status = status ? g_strdup(status) : NULL; + } + + emu->pbar_progress = frac; + + if (!emu->pbar_update_pending) + emu->progress_changed = TRUE; + emu->pbar_update_pending = TRUE; + + g_mutex_unlock(emu->pbar_mutex); +} diff --git a/tool/tilem-src/gui/emucore.h b/tool/tilem-src/gui/emucore.h new file mode 100644 index 0000000..391b17f --- /dev/null +++ b/tool/tilem-src/gui/emucore.h @@ -0,0 +1,95 @@ +/* + * TilEm II + * + * Copyright (c) 2011 Benjamin Moody + * + * 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 . + */ + +/* IMPORTANT: The following functions may ONLY be used within + tilem_em_main() or a task function, and must be called while + holding the emulator lock. */ + +#define TILEM_EM_ALWAYS_FF 0xffffffff + +/* Run one iteration of the emulator. LINKMODE is the link port + emulation mode. EVENTS is a mask of events we are interested in; + emulation will stop early if any of these events occur, or possibly + for other reasons (e.g., a breakpoint being hit.) + + FF_EVENTS is a mask of events we want to fast-forward through + (i.e., not apply speed limiting even if enabled.) If FF_EVENTS is + set to the constant ALWAYS_FF, speed limiting is completely + disabled. + + If KEEP_AWAKE is FALSE and the calculator CPU is turned off, this + function may block until another thread wakes it up; in that case, + no timer events will be triggered, and the elapsed time cannot be + measured in any meaningful way. If KEEP_AWAKE is TRUE, the + emulator continues running even when the CPU is turned off. + + TIMEOUT is the length of time (microseconds) to run the emulator. + If ELAPSED is non-null, *ELAPSED will be set to the actual number + of microseconds elapsed. + + The return value is a mask indicating which of the requested events + occurred. */ +dword tilem_em_run(TilemCalcEmulator *emu, int linkmode, + dword events, dword ff_events, gboolean keep_awake, + int timeout, int *elapsed); + +/* Main loop */ +gpointer tilem_em_main(gpointer data); + +/* Run the calculator for a short time. */ +void tilem_em_delay(TilemCalcEmulator *emu, int timeout, gboolean ff); + +/* Send a byte to the calculator. */ +int tilem_em_send_byte(TilemCalcEmulator *emu, unsigned value, + int timeout, gboolean ff); + +/* Receive a byte from the calculator. */ +int tilem_em_get_byte(TilemCalcEmulator *emu, int timeout, gboolean ff); + +/* Wake up calculator if currently turned off. */ +void tilem_em_wake_up(TilemCalcEmulator *emu, gboolean ff); + +/* Set progress window title. Set TITLE to NULL to disable progress + window. */ +void tilem_em_set_progress_title(TilemCalcEmulator *emu, const char *title); + +/* Set current progress information. FRAC is the estimated fraction + of the task completed; STATUS is a text description of the current + operation. */ +void tilem_em_set_progress(TilemCalcEmulator *emu, gdouble frac, + const char *status); + +/* Lock emulator. */ +#define tilem_em_lock(emu) \ + g_mutex_lock(emu->calc_mutex) + +/* Unlock temporarily if another thread is waiting. */ +#define tilem_em_check_yield(emu) \ + do { \ + if (g_atomic_int_get(&emu->calc_lock_waiting)) \ + g_cond_wait(emu->calc_wakeup_cond, emu->calc_mutex); \ + } while (0) + +/* Unlock emulator. */ +#define tilem_em_unlock(emu) \ + do { \ + tilem_em_check_yield(emu); \ + g_mutex_unlock(emu->calc_mutex); \ + } while (0) + diff --git a/tool/tilem-src/gui/emulator.c b/tool/tilem-src/gui/emulator.c new file mode 100644 index 0000000..1cd68a3 --- /dev/null +++ b/tool/tilem-src/gui/emulator.c @@ -0,0 +1,899 @@ +/* + * TilEm II + * + * Copyright (c) 2011-2012 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include "gui.h" +#include "emucore.h" +#include "msgbox.h" +#include "filedlg.h" + +#define MILLISEC_PER_FRAME 30 +#define MICROSEC_PER_FRAME (MILLISEC_PER_FRAME * 1000) + +#define GRAY_WINDOW_SIZE 4 +#define GRAY_SAMPLE_INT 200 + + +/* Lock emulator. Notify the core loop that we wish to do so - note + that if the core is running at full speed, it keeps the mutex + locked almost all the time, so we need to explicitly ask it to + yield. (This may not be necessary with all mutex implementations, + but definitely is necessary with some.) */ +void tilem_calc_emulator_lock(TilemCalcEmulator *emu) +{ + g_atomic_int_inc(&emu->calc_lock_waiting); + g_mutex_lock(emu->calc_mutex); +} + +/* Unlock emulator and (if no other threads are waiting to lock it) + wake up the core thread. This also serves to resume emulation if + the calculator has been powered off. */ +void tilem_calc_emulator_unlock(TilemCalcEmulator *emu) +{ + if (g_atomic_int_dec_and_test(&emu->calc_lock_waiting)) + g_cond_signal(emu->calc_wakeup_cond); + g_mutex_unlock(emu->calc_mutex); +} + +static gboolean refresh_lcd(gpointer data) +{ + TilemCalcEmulator* emu = data; + + if (emu->ewin) + tilem_emulator_window_refresh_lcd(emu->ewin); + + return FALSE; +} + +static void tmr_screen_update(TilemCalc *calc, void *data) +{ + TilemCalcEmulator *emu = data; + + g_mutex_lock(emu->lcd_mutex); + + if (emu->glcd) + tilem_gray_lcd_get_frame(emu->glcd, emu->lcd_buffer); + else + tilem_lcd_get_frame(calc, emu->lcd_buffer); + + if (emu->anim) { + if (emu->anim_grayscale) { + tilem_animation_append_frame(emu->anim, + emu->lcd_buffer, + MILLISEC_PER_FRAME); + } + else { + tilem_lcd_get_frame(calc, emu->tmp_lcd_buffer); + tilem_animation_append_frame(emu->anim, + emu->tmp_lcd_buffer, + MILLISEC_PER_FRAME); + } + } + + if (!emu->lcd_update_pending) { + emu->lcd_update_pending = TRUE; + g_idle_add_full(G_PRIORITY_DEFAULT, &refresh_lcd, emu, NULL); + } + + g_mutex_unlock(emu->lcd_mutex); +} + +static void cancel_animation(TilemCalcEmulator *emu) +{ + if (emu->anim) + g_object_unref(emu->anim); + emu->anim = NULL; +} + +static GtkWidget *get_toplevel(TilemCalcEmulator *emu) +{ + if (emu->ewin) + return emu->ewin->window; + else + return NULL; +} + +static void link_update_nop() +{ +} + +TilemCalcEmulator *tilem_calc_emulator_new() +{ + TilemCalcEmulator *emu = g_new0(TilemCalcEmulator, 1); + CalcUpdate *update; + + emu->calc_mutex = g_mutex_new(); + emu->calc_wakeup_cond = g_cond_new(); + emu->lcd_mutex = g_mutex_new(); + + tilem_config_get("emulation", + "grayscale/b=1", &emu->grayscale, + "limit_speed/b=1", &emu->limit_speed, + NULL); + + emu->task_queue = g_queue_new(); + emu->task_finished_cond = g_cond_new(); + + emu->timer = g_timer_new(); + + emu->pbar_mutex = g_mutex_new(); + + update = g_new0(CalcUpdate, 1); + update->start = &link_update_nop; + update->stop = &link_update_nop; + update->refresh = &link_update_nop; + update->pbar = &link_update_nop; + update->label = &link_update_nop; + emu->link_update = update; + + return emu; +} + +void tilem_calc_emulator_free(TilemCalcEmulator *emu) +{ + g_return_if_fail(emu != NULL); + + tilem_calc_emulator_cancel_tasks(emu); + + tilem_calc_emulator_lock(emu); + cancel_animation(emu); + emu->exiting = TRUE; + tilem_calc_emulator_unlock(emu); + + if (emu->z80_thread) + g_thread_join(emu->z80_thread); + + g_free(emu->key_queue); + + g_free(emu->rom_file_name); + g_free(emu->state_file_name); + + g_mutex_free(emu->calc_mutex); + g_mutex_free(emu->lcd_mutex); + g_cond_free(emu->calc_wakeup_cond); + + g_cond_free(emu->task_finished_cond); + g_queue_free(emu->task_queue); + + g_timer_destroy(emu->timer); + + g_mutex_free(emu->pbar_mutex); + g_free(emu->link_update); + + if (emu->lcd_buffer) + tilem_lcd_buffer_free(emu->lcd_buffer); + if (emu->tmp_lcd_buffer) + tilem_lcd_buffer_free(emu->tmp_lcd_buffer); + if (emu->glcd) + tilem_gray_lcd_free(emu->glcd); + if (emu->calc) + tilem_calc_free(emu->calc); + + g_free(emu); +} + +static char *get_sav_name(const char *romname) +{ + char *dname, *bname, *sname, *suff; + + dname = g_path_get_dirname(romname); + bname = g_path_get_basename(romname); + + if ((suff = strrchr(bname, '.'))) + *suff = 0; + sname = g_strconcat(dname, G_DIR_SEPARATOR_S, bname, ".sav", NULL); + + g_free(dname); + g_free(bname); + return sname; +} + +gboolean tilem_calc_emulator_load_state(TilemCalcEmulator *emu, + const char *romfname, + const char *statefname, + int model, GError **err) +{ + const char *modelname; + FILE *romfile, *savfile; + char *rname = NULL, *sname = NULL; + TilemCalc *calc; + char *dname; + int errnum; + + g_return_val_if_fail(emu != NULL, FALSE); + g_return_val_if_fail(err == NULL || *err == NULL, FALSE); + + tilem_calc_emulator_cancel_tasks(emu); + + if (romfname) + rname = g_strdup(romfname); + if (!sname && statefname) + sname = g_strdup(statefname); + + /* Choose ROM file */ + + if (!rname && model) { + modelname = model_to_name(model); + g_return_val_if_fail(modelname != NULL, FALSE); + if (sname) g_free(sname); + tilem_config_get(modelname, + "rom_file/f", &rname, + "state_file/f", &sname, + NULL); + } + + if (!rname) { + g_set_error(err, TILEM_EMULATOR_ERROR, + TILEM_EMULATOR_ERROR_NO_ROM, + "No ROM file specified"); + g_free(rname); + g_free(sname); + return FALSE; + } + + /* Open ROM file */ + + romfile = g_fopen(rname, "rb"); + if (!romfile) { + errnum = errno; + dname = g_filename_display_basename(rname); + g_set_error(err, G_FILE_ERROR, + g_file_error_from_errno(errnum), + "Unable to open %s for reading: %s", + dname, g_strerror(errnum)); + g_free(dname); + g_free(rname); + g_free(sname); + return FALSE; + } + + /* Open state file */ + + if (!sname) + sname = get_sav_name(rname); + + savfile = g_fopen(sname, "rb"); + + if (!savfile && errno != ENOENT) { + errnum = errno; + dname = g_filename_display_basename(sname); + g_set_error(err, G_FILE_ERROR, + g_file_error_from_errno(errnum), + "Unable to open %s for reading: %s", + dname, g_strerror(errnum)); + g_free(dname); + g_free(rname); + g_free(sname); + fclose(romfile); + return FALSE; + } + + /* Determine model from state file, if possible */ + + if (!model && savfile) + model = tilem_get_sav_type(savfile); + + /* Otherwise, guess from ROM file; ask user if ambiguous */ + + if (!model) { + model = tilem_guess_rom_type(romfile); + if (model) { + model = choose_rom_popup(get_toplevel(emu), + rname, model); + } + else { + dname = g_filename_display_basename(rname); + g_set_error(err, TILEM_EMULATOR_ERROR, + TILEM_EMULATOR_ERROR_INVALID_ROM, + "The file %s is not a recognized" + " calculator ROM file.", + dname); + g_free(dname); + } + } + + if (!model) { + fclose(romfile); + if (savfile) fclose(savfile); + g_free(rname); + g_free(sname); + return FALSE; + } + + /* Create new calc, and load state */ + + calc = tilem_calc_new(model); + if (tilem_calc_load_state(calc, romfile, savfile)) { + g_set_error(err, TILEM_EMULATOR_ERROR, + TILEM_EMULATOR_ERROR_INVALID_STATE, + "The specified ROM or state file is invalid."); + fclose(romfile); + if (savfile) fclose(savfile); + g_free(rname); + g_free(sname); + return FALSE; + } + + if (!savfile) { + /* save model as default for the future */ + savfile = g_fopen(sname, "wb"); + if (savfile) + fprintf(savfile, "MODEL = %s\n", calc->hw.name); + } + + fclose(romfile); + if (savfile) fclose(savfile); + + /* Switch to new calc */ + + tilem_calc_emulator_lock(emu); + + cancel_animation(emu); + + if (emu->glcd) + tilem_gray_lcd_free(emu->glcd); + if (emu->calc) + tilem_calc_free(emu->calc); + + emu->calc = calc; + emu->lcd_buffer = tilem_lcd_buffer_new(); + emu->tmp_lcd_buffer = tilem_lcd_buffer_new(); + + if (emu->grayscale) + emu->glcd = tilem_gray_lcd_new(calc, GRAY_WINDOW_SIZE, + GRAY_SAMPLE_INT); + else + emu->glcd = NULL; + + tilem_z80_add_timer(calc, MICROSEC_PER_FRAME, + MICROSEC_PER_FRAME, 1, + &tmr_screen_update, emu); + + tilem_calc_emulator_unlock(emu); + + if (emu->rom_file_name) + g_free(emu->rom_file_name); + emu->rom_file_name = rname; + + if (emu->state_file_name) + g_free(emu->state_file_name); + emu->state_file_name = sname; + + tilem_keybindings_init(emu, calc->hw.name); + + if (emu->ewin) + tilem_emulator_window_calc_changed(emu->ewin); + if (emu->dbg) + tilem_debugger_calc_changed(emu->dbg); + + if (emu->rcvdlg) + tilem_receive_dialog_free(emu->rcvdlg); + emu->rcvdlg = NULL; + + return TRUE; +} + +gboolean tilem_calc_emulator_revert_state(TilemCalcEmulator *emu, GError **err) +{ + FILE *romfile, *savfile; + char *dname; + int errnum = 0; + gboolean status = TRUE; + + g_return_val_if_fail(emu != NULL, FALSE); + g_return_val_if_fail(emu->calc != NULL, FALSE); + g_return_val_if_fail(emu->rom_file_name != NULL, FALSE); + g_return_val_if_fail(emu->state_file_name != NULL, FALSE); + g_return_val_if_fail(err == NULL || *err == NULL, FALSE); + + /* Open ROM file */ + + if (emu->calc->hw.flags & TILEM_CALC_HAS_FLASH) { + romfile = g_fopen(emu->rom_file_name, "rb"); + if (!romfile) { + errnum = errno; + dname = g_filename_display_basename(emu->rom_file_name); + g_set_error(err, G_FILE_ERROR, + g_file_error_from_errno(errnum), + "Unable to open %s for reading: %s", + dname, g_strerror(errnum)); + g_free(dname); + return FALSE; + } + } + else { + romfile = NULL; + } + + /* Open state file */ + + savfile = g_fopen(emu->state_file_name, "rb"); + if (!savfile) { + errnum = errno; + dname = g_filename_display_basename(emu->state_file_name); + g_set_error(err, G_FILE_ERROR, + g_file_error_from_errno(errnum), + "Unable to open %s for reading: %s", + dname, g_strerror(errnum)); + g_free(dname); + if (romfile) fclose(romfile); + return FALSE; + } + + /* Read state */ + + tilem_calc_emulator_lock(emu); + + if (tilem_calc_load_state(emu->calc, romfile, savfile)) { + g_set_error(err, TILEM_EMULATOR_ERROR, + TILEM_EMULATOR_ERROR_INVALID_STATE, + "The specified ROM or state file is invalid."); + status = FALSE; + } + + tilem_calc_emulator_unlock(emu); + + if (emu->dbg) + tilem_debugger_refresh(emu->dbg, TRUE); + + if (romfile) fclose(romfile); + fclose(savfile); + return status; +} + +gboolean tilem_calc_emulator_save_state(TilemCalcEmulator *emu, GError **err) +{ + FILE *romfile, *savfile; + char *dname; + int errnum = 0; + + g_return_val_if_fail(emu != NULL, FALSE); + g_return_val_if_fail(emu->calc != NULL, FALSE); + g_return_val_if_fail(emu->rom_file_name != NULL, FALSE); + g_return_val_if_fail(emu->state_file_name != NULL, FALSE); + g_return_val_if_fail(err == NULL || *err == NULL, FALSE); + + /* Open ROM file */ + + if (emu->calc->hw.flags & TILEM_CALC_HAS_FLASH) { + romfile = g_fopen(emu->rom_file_name, "r+b"); + if (!romfile) { + errnum = errno; + dname = g_filename_display_basename(emu->rom_file_name); + g_set_error(err, G_FILE_ERROR, + g_file_error_from_errno(errnum), + "Unable to open %s for writing: %s", + dname, g_strerror(errnum)); + g_free(dname); + return FALSE; + } + } + else { + romfile = NULL; + } + + /* Open state file */ + + savfile = g_fopen(emu->state_file_name, "wb"); + if (!savfile) { + errnum = errno; + dname = g_filename_display_basename(emu->state_file_name); + g_set_error(err, G_FILE_ERROR, + g_file_error_from_errno(errnum), + "Unable to open %s for writing: %s", + dname, g_strerror(errnum)); + g_free(dname); + if (romfile) fclose(romfile); + return FALSE; + } + + /* Write state */ + + tilem_calc_emulator_lock(emu); + + if (romfile && tilem_calc_save_state(emu->calc, romfile, NULL)) + errnum = errno; + if (romfile && fclose(romfile)) + errnum = errno; + + if (errnum) { + dname = g_filename_display_basename(emu->rom_file_name); + g_set_error(err, G_FILE_ERROR, + g_file_error_from_errno(errnum), + "Error writing %s: %s", + dname, g_strerror(errnum)); + g_free(dname); + fclose(savfile); + tilem_calc_emulator_unlock(emu); + return FALSE; + } + + if (tilem_calc_save_state(emu->calc, NULL, savfile)) + errnum = errno; + if (fclose(savfile)) + errnum = errno; + + tilem_calc_emulator_unlock(emu); + + if (errnum) { + dname = g_filename_display_basename(emu->state_file_name); + g_set_error(err, G_FILE_ERROR, + g_file_error_from_errno(errnum), + "Error writing %s: %s", + dname, g_strerror(errnum)); + g_free(dname); + return FALSE; + } + + return TRUE; +} + +void tilem_calc_emulator_reset(TilemCalcEmulator *emu) +{ + g_return_if_fail(emu != NULL); + g_return_if_fail(emu->calc != NULL); + + tilem_calc_emulator_lock(emu); + tilem_calc_reset(emu->calc); + tilem_calc_emulator_unlock(emu); + + if (emu->dbg) + tilem_debugger_refresh(emu->dbg, TRUE); +} + +void tilem_calc_emulator_pause(TilemCalcEmulator *emu) +{ + g_return_if_fail(emu != NULL); + + tilem_calc_emulator_lock(emu); + emu->paused = TRUE; + tilem_calc_emulator_unlock(emu); +} + +void tilem_calc_emulator_run(TilemCalcEmulator *emu) +{ + g_return_if_fail(emu != NULL); + g_return_if_fail(emu->calc != NULL); + + tilem_calc_emulator_lock(emu); + emu->paused = FALSE; + tilem_calc_emulator_unlock(emu); + + if (!emu->z80_thread) + emu->z80_thread = g_thread_create(&tilem_em_main, emu, TRUE, NULL); +} + +void tilem_calc_emulator_set_limit_speed(TilemCalcEmulator *emu, + gboolean limit) +{ + emu->limit_speed = limit; +} + +void tilem_calc_emulator_set_grayscale(TilemCalcEmulator *emu, + gboolean grayscale) +{ + emu->grayscale = grayscale; + + if (grayscale && emu->calc && !emu->glcd) { + tilem_calc_emulator_lock(emu); + emu->glcd = tilem_gray_lcd_new(emu->calc, GRAY_WINDOW_SIZE, + GRAY_SAMPLE_INT); + tilem_calc_emulator_unlock(emu); + } + else if (!grayscale && emu->glcd) { + tilem_calc_emulator_lock(emu); + tilem_gray_lcd_free(emu->glcd); + emu->glcd = NULL; + tilem_calc_emulator_unlock(emu); + } +} + +/* If currently recording a macro, record a keypress */ +static void record_key(TilemCalcEmulator* emu, int code) +{ + char* codechar; + int type = 0; + + if (emu->isMacroRecording) { + codechar = g_strdup_printf("%04d", code); + tilem_macro_add_action(emu->macro, type, codechar); + g_free(codechar); + } +} + +void tilem_calc_emulator_press_key(TilemCalcEmulator *emu, int key) +{ + g_return_if_fail(emu != NULL); + + if (key == 0) + return; + + tilem_calc_emulator_lock(emu); + tilem_keypad_press_key(emu->calc, key); + tilem_calc_emulator_unlock(emu); + + record_key(emu, key); + + if (emu->dbg && emu->dbg->keypad_dialog) + tilem_keypad_dialog_refresh(emu->dbg->keypad_dialog); +} + +void tilem_calc_emulator_release_key(TilemCalcEmulator *emu, int key) +{ + g_return_if_fail(emu != NULL); + + if (key == 0) + return; + + tilem_calc_emulator_lock(emu); + tilem_keypad_release_key(emu->calc, key); + tilem_calc_emulator_unlock(emu); + + if (emu->dbg && emu->dbg->keypad_dialog) + tilem_keypad_dialog_refresh(emu->dbg->keypad_dialog); +} + +static gboolean refresh_kpd(gpointer data) +{ + TilemCalcEmulator *emu = data; + + if (emu->dbg && emu->dbg->keypad_dialog) + tilem_keypad_dialog_refresh(emu->dbg->keypad_dialog); + + return FALSE; +} + +/* Timer callback for key sequences */ +static void tmr_key_queue(TilemCalc* calc, void* data) +{ + TilemCalcEmulator *emu = data; + int nextkey; + + if (emu->key_queue_pressed) { + if (emu->key_queue_len > 0 || !emu->key_queue_hold) { + tilem_keypad_release_key(calc, emu->key_queue_cur); + emu->key_queue_pressed = 0; + emu->key_queue_cur = 0; + tilem_z80_set_timer(calc, emu->key_queue_timer, + 50000, 0, 1); + } + else { + tilem_z80_remove_timer(calc, emu->key_queue_timer); + emu->key_queue_timer = 0; + } + } + else { + if (emu->key_queue_len > 0) { + nextkey = emu->key_queue[--emu->key_queue_len]; + tilem_keypad_press_key(calc, nextkey); + emu->key_queue_pressed = 1; + emu->key_queue_cur = nextkey; + tilem_z80_set_timer(calc, emu->key_queue_timer, + 20000, 0, 1); + } + else { + tilem_z80_remove_timer(calc, emu->key_queue_timer); + emu->key_queue_timer = 0; + } + } + + g_idle_add(&refresh_kpd, emu); +} + +static void queue_keys(TilemCalcEmulator *emu, const byte *keys, int nkeys) +{ + byte *q; + int i; + + q = g_new(byte, emu->key_queue_len + nkeys); + + for (i = 0; i < nkeys; i++) { + q[nkeys - i - 1] = keys[i]; + record_key(emu, keys[i]); + } + + if (emu->key_queue_len) + memcpy(q + nkeys, emu->key_queue, emu->key_queue_len); + + g_free(emu->key_queue); + emu->key_queue = q; + emu->key_queue_len += nkeys; + emu->key_queue_hold = 1; + + if (!emu->key_queue_timer) { + emu->key_queue_timer + = tilem_z80_add_timer(emu->calc, 1, 0, 1, + &tmr_key_queue, emu); + } +} + +void tilem_calc_emulator_queue_keys(TilemCalcEmulator *emu, + const byte *keys, int nkeys) +{ + g_return_if_fail(emu != NULL); + g_return_if_fail(keys != NULL); + g_return_if_fail(nkeys > 0); + + tilem_calc_emulator_lock(emu); + queue_keys(emu, keys, nkeys); + tilem_calc_emulator_unlock(emu); +} + +void tilem_calc_emulator_release_queued_key(TilemCalcEmulator *emu) +{ + g_return_if_fail(emu != NULL); + + tilem_calc_emulator_lock(emu); + if (emu->key_queue_timer) { + emu->key_queue_hold = 0; + } + else if (emu->key_queue_pressed) { + tilem_keypad_release_key(emu->calc, emu->key_queue_cur); + emu->key_queue_pressed = 0; + emu->key_queue_cur = 0; + } + tilem_calc_emulator_unlock(emu); + + if (emu->dbg && emu->dbg->keypad_dialog) + tilem_keypad_dialog_refresh(emu->dbg->keypad_dialog); +} + +gboolean tilem_calc_emulator_press_or_queue(TilemCalcEmulator *emu, + int key) +{ + byte b; + gboolean status; + + g_return_val_if_fail(emu != NULL, FALSE); + + tilem_calc_emulator_lock(emu); + + if (emu->key_queue_timer) { + b = key; + queue_keys(emu, &b, 1); + status = TRUE; + } + else { + tilem_keypad_press_key(emu->calc, key); + status = FALSE; + } + tilem_calc_emulator_unlock(emu); + + if (emu->dbg && emu->dbg->keypad_dialog) + tilem_keypad_dialog_refresh(emu->dbg->keypad_dialog); + + return status; +} + +TilemAnimation * tilem_calc_emulator_get_screenshot(TilemCalcEmulator *emu, + gboolean grayscale) +{ + TilemAnimation *anim; + + g_return_val_if_fail(emu != NULL, NULL); + g_return_val_if_fail(emu->calc != NULL, NULL); + + anim = tilem_animation_new(emu->calc->hw.lcdwidth, + emu->calc->hw.lcdheight); + + tilem_calc_emulator_lock(emu); + + if (grayscale && emu->glcd) + tilem_gray_lcd_get_frame(emu->glcd, emu->tmp_lcd_buffer); + else + tilem_lcd_get_frame(emu->calc, emu->tmp_lcd_buffer); + + tilem_animation_append_frame(anim, emu->tmp_lcd_buffer, 1); + + tilem_calc_emulator_unlock(emu); + + return anim; +} + +void tilem_calc_emulator_begin_animation(TilemCalcEmulator *emu, + gboolean grayscale) +{ + g_return_if_fail(emu != NULL); + g_return_if_fail(emu->calc != NULL); + + tilem_calc_emulator_lock(emu); + cancel_animation(emu); + emu->anim = tilem_animation_new(emu->calc->hw.lcdwidth, + emu->calc->hw.lcdheight); + emu->anim_grayscale = grayscale; + tilem_calc_emulator_unlock(emu); +} + +TilemAnimation * tilem_calc_emulator_end_animation(TilemCalcEmulator *emu) +{ + TilemAnimation *anim; + + g_return_val_if_fail(emu != NULL, NULL); + g_return_val_if_fail(emu->anim != NULL, NULL); + + tilem_calc_emulator_lock(emu); + anim = emu->anim; + emu->anim = NULL; + tilem_calc_emulator_unlock(emu); + + return anim; +} + +/* Prompt for a ROM file to open */ +int tilem_calc_emulator_prompt_open_rom(TilemCalcEmulator *emu) +{ + char *dir, *filename; + GError *err = NULL; + const char *modelname; + + if (emu->rom_file_name) + dir = g_path_get_dirname(emu->rom_file_name); + else + dir = g_get_current_dir(); + + filename = prompt_open_file("Open Calculator", GTK_WINDOW(get_toplevel(emu)), + dir, "ROM files", "*.rom;*.clc;*.bin", + "All files", "*", NULL); + g_free(dir); + if (!filename) + return 0; + + if (tilem_calc_emulator_load_state(emu, filename, NULL, + 0, &err)) { + modelname = emu->calc->hw.name; + tilem_config_set(modelname, + "rom_file/f", emu->rom_file_name, + "state_file/f", emu->state_file_name, + NULL); + tilem_config_set("recent", "last_model/s", modelname, NULL); + } + g_free(filename); + + if (err) { + messagebox01(GTK_WINDOW(get_toplevel(emu)), GTK_MESSAGE_ERROR, + "Unable to load calculator state", + "%s", err->message); + g_error_free(err); + return -1; + } + else { + return 1; + } +} + +/* Run slowly to play macro (used instead run_with_key() function) */ +void run_with_key_slowly(TilemCalc* calc, int key) +{ + tilem_z80_run_time(calc, 5000000, NULL); /* Wait */ + tilem_keypad_press_key(calc, key); /* Press */ + tilem_z80_run_time(calc, 10000, NULL); /* Wait (don't forget to wait) */ + tilem_keypad_release_key(calc, key); /* Release */ + tilem_z80_run_time(calc, 50, NULL); /* Wait */ +} diff --git a/tool/tilem-src/gui/emulator.h b/tool/tilem-src/gui/emulator.h new file mode 100644 index 0000000..640006f --- /dev/null +++ b/tool/tilem-src/gui/emulator.h @@ -0,0 +1,263 @@ +/* + * TilEm II + * + * Copyright (c) 2011-2012 Benjamin Moody + * Copyright (c) 2011 Duponchelle Thibault + * + * 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 . + */ + +/* Key binding */ +typedef struct _TilemKeyBinding { + unsigned int keysym; /* host keysym value */ + unsigned int modifiers; /* modifier mask */ + int nscancodes; /* number of calculator scancodes */ + byte *scancodes; /* calculator scancodes */ +} TilemKeyBinding; + +/* A single action */ +typedef struct _TilemMacroAtom { + char* value; + int type; +} TilemMacroAtom; + +/* All the actions */ +typedef struct _TilemMacro { + TilemMacroAtom** actions; + int n; +} TilemMacro; + + + +typedef struct _TilemCalcEmulator { + GThread *z80_thread; + + /* Mutex controlling access to the calc. Use + tilem_calc_emulator_lock()/unlock() rather than + g_mutex_lock()/unlock() directly. */ + GMutex *calc_mutex; + int calc_lock_waiting; + + GCond *calc_wakeup_cond; + TilemCalc *calc; + gboolean paused; + gboolean exiting; + gboolean limit_speed; /* limit to actual speed */ + + /* Timer used for speed limiting */ + GTimer *timer; + gulong timevalue; + + /* Queue of tasks to be performed */ + GQueue *task_queue; + gboolean task_busy; + gboolean task_abort; + GCond *task_finished_cond; + + /* Sequence of keys to be pressed */ + byte *key_queue; + int key_queue_len; + int key_queue_timer; + int key_queue_pressed; + int key_queue_cur; + int key_queue_hold; + + GMutex *lcd_mutex; + TilemLCDBuffer *lcd_buffer; + TilemLCDBuffer *tmp_lcd_buffer; + TilemGrayLCD *glcd; + gboolean grayscale; + gboolean lcd_update_pending; + + TilemAnimation *anim; /* animation being recorded */ + gboolean anim_grayscale; /* use grayscale in animation */ + + char *rom_file_name; + char *state_file_name; + + /* List of key bindings */ + TilemKeyBinding *keybindings; + int nkeybindings; + + struct _TilemMacro *macro; + + /* Link transfer state */ + gboolean ilp_active; + CalcUpdate *link_update; /* CalcUpdate (status and callbacks for ticalcs) */ + GMutex *pbar_mutex; + char *pbar_title; + char *pbar_status; + gdouble pbar_progress; + gboolean pbar_update_pending; + gboolean progress_changed; + + /* GUI widgets */ + struct _TilemDebugger *dbg; + struct _TilemEmulatorWindow *ewin; + struct _TilemScreenshotDialog *ssdlg; + struct _TilemReceiveDialog *rcvdlg; + struct _TilemLinkProgress *linkpb; + + + FILE * macro_file; /* The macro file */ + gboolean isMacroRecording; /* A flag to know everywhere that macro is recording */ + +} TilemCalcEmulator; + +/* Errors */ +#define TILEM_EMULATOR_ERROR g_quark_from_static_string("tilem-emulator-error") +enum { + TILEM_EMULATOR_ERROR_NO_ROM, + TILEM_EMULATOR_ERROR_INVALID_ROM, + TILEM_EMULATOR_ERROR_INVALID_STATE +}; + +/* Create a new TilemCalcEmulator. */ +TilemCalcEmulator *tilem_calc_emulator_new(void); + +/* Free a TilemCalcEmulator. */ +void tilem_calc_emulator_free(TilemCalcEmulator *emu); + +/* Lock calculator so we can directly access it from outside the core + thread. */ +void tilem_calc_emulator_lock(TilemCalcEmulator *emu); + +/* Unlock calculator and allow emulation to continue. */ +void tilem_calc_emulator_unlock(TilemCalcEmulator *emu); + +/* Load the calculator state from the given ROM file (and accompanying + sav file, if any.) */ +gboolean tilem_calc_emulator_load_state(TilemCalcEmulator *emu, + const char *romfname, + const char *statefname, + int model, GError **err); + +/* Reload the calculator state from the most recently loaded file. */ +gboolean tilem_calc_emulator_revert_state(TilemCalcEmulator *emu, + GError **err); + +/* Save the calculator state. */ +gboolean tilem_calc_emulator_save_state(TilemCalcEmulator *emu, + GError **err); + +/* Reset the calculator. */ +void tilem_calc_emulator_reset(TilemCalcEmulator *emu); + +/* Pause emulation (if currently running.) */ +void tilem_calc_emulator_pause(TilemCalcEmulator *emu); + +/* Resume emulation (if currently paused.) */ +void tilem_calc_emulator_run(TilemCalcEmulator *emu); + +/* Enable/disable speed limiting (TRUE means attempt to run at the + actual CPU speed; FALSE means run as fast as we can.) */ +void tilem_calc_emulator_set_limit_speed(TilemCalcEmulator *emu, + gboolean limit); + +/* Enable/disable grayscale */ +void tilem_calc_emulator_set_grayscale(TilemCalcEmulator *emu, + gboolean grayscale); + +/* Press a single key. */ +void tilem_calc_emulator_press_key(TilemCalcEmulator *emu, int key); + +/* Release a single key. */ +void tilem_calc_emulator_release_key(TilemCalcEmulator *emu, int key); + +/* Add keys to the input queue. */ +void tilem_calc_emulator_queue_keys(TilemCalcEmulator *emu, + const byte *keys, int nkeys); + +/* Release final key in input queue. */ +void tilem_calc_emulator_release_queued_key(TilemCalcEmulator *emu); + +/* If input queue is empty, press key immediately; otherwise, add to + the input queue. Return TRUE if key was added to the queue. */ +gboolean tilem_calc_emulator_press_or_queue(TilemCalcEmulator *emu, int key); + +/* Retrieve a static screenshot of current calculator screen. + Returned object has a reference count of 1 (free it with + g_object_unref().) */ +TilemAnimation * tilem_calc_emulator_get_screenshot(TilemCalcEmulator *emu, + gboolean grayscale); + +/* Begin recording an animated screenshot. */ +void tilem_calc_emulator_begin_animation(TilemCalcEmulator *emu, + gboolean grayscale); + +/* Finish recording an animated screenshot. Returned object has a + reference count of 1 (free it with g_object_unref().) */ +TilemAnimation * tilem_calc_emulator_end_animation(TilemCalcEmulator *emu); + +/* Prompt for a ROM file to open */ +int tilem_calc_emulator_prompt_open_rom(TilemCalcEmulator *emu); + + +/* Run slowly to play macro */ +void run_with_key_slowly(TilemCalc* calc, int key); + + +/* Task handling */ + +typedef gboolean (*TilemTaskMainFunc)(TilemCalcEmulator *emu, gpointer data); +typedef void (*TilemTaskFinishedFunc)(TilemCalcEmulator *emu, gpointer data, + gboolean cancelled); + +/* Add a task to the queue. MAINF is a function to perform in the + core thread. If it returns FALSE, all further tasks will be + cancelled. Tasks can also be cancelled early by calling + tilem_calc_emulator_cancel_tasks(). + + After the task finishes or is cancelled, FINISHEDF will be called + in the GUI thread. Task-finished functions might not be called in + the same order the tasks were originally added to the queue. */ +void tilem_calc_emulator_begin(TilemCalcEmulator *emu, + TilemTaskMainFunc taskf, + TilemTaskFinishedFunc finishedf, + gpointer data); + +/* Cancel all pending tasks. If a task is currently running, this + will attempt to cancel it and wait for it to exit. */ +void tilem_calc_emulator_cancel_tasks(TilemCalcEmulator *emu); + + +/* Macros */ + +/* Start to record a macro */ +void tilem_macro_start(TilemCalcEmulator *emu); + + +/* Add an action to the macro */ +void tilem_macro_add_action(TilemMacro* macro, int type, char * value); + + +/* Stop recording a macro */ +void tilem_macro_stop(TilemCalcEmulator *emu); + + +/* Print the macro (debug) */ +void tilem_macro_print(TilemMacro *macro); + + +/* Write a macro file */ +void tilem_macro_write_file(TilemCalcEmulator *emu); + + +/* Play a macro (loaded or recorded before) */ +void tilem_macro_play(TilemCalcEmulator *emu); + + +/* Load a macro from filename or if filename == NULL prompt user */ +void tilem_macro_load(TilemCalcEmulator *emu, char* filename); + diff --git a/tool/tilem-src/gui/emuwin.c b/tool/tilem-src/gui/emuwin.c new file mode 100644 index 0000000..68c563e --- /dev/null +++ b/tool/tilem-src/gui/emuwin.c @@ -0,0 +1,621 @@ +/* + * TilEm II + * + * Copyright (c) 2010-2011 Thibault Duponchelle + * Copyright (c) 2010-2012 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include + +#include "gui.h" +#include "files.h" +#include "msgbox.h" + +/* Set size hints for the toplevel window */ +static void set_size_hints(GtkWidget *widget, gpointer data) +{ + TilemEmulatorWindow *ewin = data; + + /* Don't use gtk_window_set_geometry_hints() (which would + appear to do what we want) because, in addition to setting + the hints we want, that function causes GTK+ to argue with + the window manager. + + Instead, we call this function after the check-resize + signal (which is when GTK+ itself would normally set the + hints.) + + FIXME: check that this works as desired on Win32/Quartz. */ + + if (gtk_widget_get_window(widget)) + gdk_window_set_geometry_hints(gtk_widget_get_window(widget), + &ewin->geomhints, + ewin->geomhintmask); +} + +static void window_state_changed(G_GNUC_UNUSED GtkWidget *w, + GdkEventWindowState *event, gpointer data) +{ + TilemEmulatorWindow *ewin = data; + ewin->window_state = event->new_window_state; +} + +static gboolean window_maximized(TilemEmulatorWindow *ewin) +{ + return (ewin->window_state & (GDK_WINDOW_STATE_MAXIMIZED + | GDK_WINDOW_STATE_FULLSCREEN)); +} + +static gboolean screen_repaint(GtkWidget *w, GdkEventExpose *ev G_GNUC_UNUSED, + TilemEmulatorWindow *ewin) +{ + GtkAllocation alloc; + GdkWindow *win; + GtkStyle *style; + + gtk_widget_get_allocation(w, &alloc); + + /* If image buffer is not the correct size, allocate a new one */ + + if (!ewin->lcd_image_buf + || alloc.width != ewin->lcd_image_width + || alloc.height != ewin->lcd_image_height) { + ewin->lcd_image_width = alloc.width; + ewin->lcd_image_height = alloc.height; + g_free(ewin->lcd_image_buf); + ewin->lcd_image_buf = g_new(byte, alloc.width * alloc.height); + } + + /* Draw LCD contents into the image buffer */ + + g_mutex_lock(ewin->emu->lcd_mutex); + ewin->emu->lcd_update_pending = FALSE; + tilem_draw_lcd_image_indexed(ewin->emu->lcd_buffer, + ewin->lcd_image_buf, + alloc.width, alloc.height, alloc.width, + (ewin->lcd_smooth_scale + ? TILEM_SCALE_SMOOTH + : TILEM_SCALE_FAST)); + g_mutex_unlock(ewin->emu->lcd_mutex); + + /* Render buffer to the screen */ + + win = gtk_widget_get_window(w); + style = gtk_widget_get_style(w); + gdk_draw_indexed_image(win, style->fg_gc[GTK_STATE_NORMAL], 0, 0, + alloc.width, alloc.height, GDK_RGB_DITHER_NONE, + ewin->lcd_image_buf, alloc.width, + ewin->lcd_cmap); + return TRUE; +} + +/* Set the color palette for drawing the emulated LCD. */ +static void screen_restyle(GtkWidget* w, GtkStyle* oldstyle G_GNUC_UNUSED, + TilemEmulatorWindow* ewin) +{ + dword* palette; + GtkStyle *style; + int r_dark, g_dark, b_dark; + int r_light, g_light, b_light; + double gamma = 2.2; + + if (!ewin->skin) { + /* no skin -> use standard GTK colors */ + + style = gtk_widget_get_style(w); + + r_dark = style->text[GTK_STATE_NORMAL].red / 257; + g_dark = style->text[GTK_STATE_NORMAL].green / 257; + b_dark = style->text[GTK_STATE_NORMAL].blue / 257; + + r_light = style->base[GTK_STATE_NORMAL].red / 257; + g_light = style->base[GTK_STATE_NORMAL].green / 257; + b_light = style->base[GTK_STATE_NORMAL].blue / 257; + } + else { + /* use skin colors */ + + r_dark = ((ewin->skin->lcd_black >> 16) & 0xff); + g_dark = ((ewin->skin->lcd_black >> 8) & 0xff); + b_dark = (ewin->skin->lcd_black & 0xff); + + r_light = ((ewin->skin->lcd_white >> 16) & 0xff); + g_light = ((ewin->skin->lcd_white >> 8) & 0xff); + b_light = (ewin->skin->lcd_white & 0xff); + } + + /* Generate a new palette, and convert it into GDK format */ + + if (ewin->lcd_cmap) + gdk_rgb_cmap_free(ewin->lcd_cmap); + + palette = tilem_color_palette_new(r_light, g_light, b_light, + r_dark, g_dark, b_dark, gamma); + ewin->lcd_cmap = gdk_rgb_cmap_new(palette, 256); + tilem_free(palette); + + gtk_widget_queue_draw(ewin->lcd); +} + +static void skin_size_allocate(GtkWidget *widget, GtkAllocation *alloc, + gpointer data) +{ + TilemEmulatorWindow *ewin = data; + int rawwidth, rawheight, scaledwidth, scaledheight; + int lcdleft, lcdright, lcdtop, lcdbottom; + double rx, ry, r; + + g_return_if_fail(ewin->skin != NULL); + + rawwidth = gdk_pixbuf_get_width(ewin->skin->raw); + rawheight = gdk_pixbuf_get_height(ewin->skin->raw); + + rx = (double) alloc->width / rawwidth; + ry = (double) alloc->height / rawheight; + r = MIN(rx, ry); + + scaledwidth = rawwidth * r; + scaledheight = rawheight * r; + + if (ewin->skin->width == scaledwidth + && ewin->skin->height == scaledheight) + return; + + ewin->skin->width = scaledwidth; + ewin->skin->height = scaledheight; + ewin->skin->sx = ewin->skin->sy = 1.0 / r; + + if (ewin->skin->image) + g_object_unref(ewin->skin->image); + ewin->skin->image = gdk_pixbuf_scale_simple(ewin->skin->raw, + scaledwidth, + scaledheight, + GDK_INTERP_BILINEAR); + + gtk_image_set_from_pixbuf(GTK_IMAGE(ewin->background), + ewin->skin->image); + + lcdleft = ewin->skin->lcd_pos.left * r + 0.5; + lcdright = ewin->skin->lcd_pos.right * r + 0.5; + lcdtop = ewin->skin->lcd_pos.top * r + 0.5; + lcdbottom = ewin->skin->lcd_pos.bottom * r + 0.5; + + gtk_widget_set_size_request(ewin->lcd, + MAX(lcdright - lcdleft, 1), + MAX(lcdbottom - lcdtop, 1)); + + gtk_layout_move(GTK_LAYOUT(widget), ewin->lcd, + lcdleft, lcdtop); + + ewin->zoom_factor = r / ewin->base_zoom; + + if (ewin->zoom_factor <= 1.0) + ewin->zoom_factor = 1.0; +} + +static void noskin_size_allocate(G_GNUC_UNUSED GtkWidget *widget, + GtkAllocation *alloc, gpointer data) +{ + TilemEmulatorWindow *ewin = data; + int lcdwidth, lcdheight; + + g_return_if_fail(ewin->emu->calc != NULL); + + lcdwidth = ewin->emu->calc->hw.lcdwidth; + lcdheight = ewin->emu->calc->hw.lcdheight; + + if (alloc->width > alloc->height) + ewin->zoom_factor = (gdouble) alloc->width / lcdwidth; + else + ewin->zoom_factor = (gdouble) alloc->height / lcdheight; + + if (ewin->zoom_factor <= 1.0) + ewin->zoom_factor = 1.0; +} + +/* Used when you load another skin */ +void redraw_screen(TilemEmulatorWindow *ewin) +{ + GtkWidget *pImage; + GtkWidget *emuwin; + int lcdwidth, lcdheight; + int screenwidth, screenheight; + int minwidth, minheight, defwidth, defheight, + curwidth, curheight; + double sx, sy, s, a1, a2; + GError *err = NULL; + + if (ewin->skin) { + skin_unload(ewin->skin); + g_free(ewin->skin); + } + + if (ewin->skin_disabled || !ewin->skin_file_name) { + ewin->skin = NULL; + } + else { + ewin->skin = g_new0(SKIN_INFOS, 1); + if (skin_load(ewin->skin, ewin->skin_file_name, &err)) { + skin_unload(ewin->skin); + ewin->skin = NULL; + } + } + + if (ewin->emu->calc) { + lcdwidth = ewin->emu->calc->hw.lcdwidth; + lcdheight = ewin->emu->calc->hw.lcdheight; + } + else { + lcdwidth = lcdheight = 1; + } + + if (ewin->lcd) + gtk_widget_destroy(ewin->lcd); + if (ewin->background) + gtk_widget_destroy(ewin->background); + if (ewin->layout) + gtk_widget_destroy(ewin->layout); + + /* create LCD widget */ + ewin->lcd = gtk_drawing_area_new(); + gtk_widget_set_double_buffered(ewin->lcd, FALSE); + + /* create background image and layout */ + if (ewin->skin) { + ewin->layout = gtk_layout_new(NULL, NULL); + + pImage = gtk_image_new(); + gtk_layout_put(GTK_LAYOUT(ewin->layout), pImage, 0, 0); + ewin->background = pImage; + + screenwidth = (ewin->skin->lcd_pos.right + - ewin->skin->lcd_pos.left); + screenheight = (ewin->skin->lcd_pos.bottom + - ewin->skin->lcd_pos.top); + + gtk_widget_set_size_request(ewin->lcd, + screenwidth, screenheight); + gtk_layout_put(GTK_LAYOUT(ewin->layout), ewin->lcd, + ewin->skin->lcd_pos.left, + ewin->skin->lcd_pos.top); + + g_signal_connect(ewin->layout, "size-allocate", + G_CALLBACK(skin_size_allocate), ewin); + + emuwin = ewin->layout; + + defwidth = ewin->skin->width; + defheight = ewin->skin->height; + + sx = (double) lcdwidth / screenwidth; + sy = (double) lcdheight / screenheight; + s = MAX(sx, sy); + minwidth = defwidth * s + 0.5; + minheight = defheight * s + 0.5; + ewin->base_zoom = s; + } + else { + ewin->layout = NULL; + ewin->background = NULL; + + emuwin = ewin->lcd; + + g_signal_connect(ewin->lcd, "size-allocate", + G_CALLBACK(noskin_size_allocate), ewin); + + defwidth = minwidth = lcdwidth; + defheight = minheight = lcdheight; + ewin->base_zoom = 1.0; + } + + curwidth = defwidth * ewin->base_zoom * ewin->zoom_factor + 0.5; + curheight = defheight * ewin->base_zoom * ewin->zoom_factor + 0.5; + + gtk_widget_set_can_focus(emuwin, TRUE); + + gtk_widget_add_events(emuwin, (GDK_BUTTON_PRESS_MASK + | GDK_BUTTON_RELEASE_MASK + | GDK_BUTTON1_MOTION_MASK + | GDK_POINTER_MOTION_HINT_MASK + | GDK_DROP_FINISHED + | GDK_DRAG_MOTION)); + + g_signal_connect(ewin->lcd, "expose-event", + G_CALLBACK(screen_repaint), ewin); + g_signal_connect(ewin->lcd, "style-set", + G_CALLBACK(screen_restyle), ewin); + + g_signal_connect(emuwin, "button-press-event", + G_CALLBACK(mouse_press_event), ewin); + g_signal_connect(emuwin, "motion-notify-event", + G_CALLBACK(pointer_motion_event), ewin); + g_signal_connect(emuwin, "button-release-event", + G_CALLBACK(mouse_release_event), ewin); + g_signal_connect(emuwin, "popup-menu", + G_CALLBACK(popup_menu_event), ewin); + + /* FIXME: this is rather broken; GTK_DEST_DEFAULT_ALL sends a + successful "finished" message to any drop that matches the + list of targets. Files/URIs we can't accept should be + rejected, and we shouldn't send the "finished" message + until it's actually finished. */ + gtk_drag_dest_set(emuwin, GTK_DEST_DEFAULT_ALL, + NULL, 0, GDK_ACTION_COPY); + gtk_drag_dest_add_uri_targets(emuwin); + g_signal_connect(emuwin, "drag-data-received", + G_CALLBACK(drag_data_received), ewin); + + + /* Hint calculation assumes the emulator is the only thing in + the window; if other widgets are added, this will have to + change accordingly + */ + ewin->geomhints.min_width = minwidth; + ewin->geomhints.min_height = minheight; + a1 = (double) minwidth / minheight; + a2 = (double) defwidth / defheight; + ewin->geomhints.min_aspect = MIN(a1, a2) - 0.0001; + ewin->geomhints.max_aspect = MAX(a1, a2) + 0.0001; + ewin->geomhintmask = (GDK_HINT_MIN_SIZE | GDK_HINT_ASPECT); + + /* If the window is already realized, set the hints now, so + that the WM will see the new hints before we try to resize + the window */ + set_size_hints(ewin->window, ewin); + + gtk_widget_set_size_request(emuwin, minwidth, minheight); + gtk_container_add(GTK_CONTAINER(ewin->window), emuwin); + + if (!window_maximized(ewin)) + gtk_window_resize(GTK_WINDOW(ewin->window), + curwidth, curheight); + + gtk_widget_show_all(emuwin); + + if (err) { + messagebox01(GTK_WINDOW(ewin->window), GTK_MESSAGE_ERROR, + "Unable to load skin", "%s", err->message); + g_error_free(err); + } +} + +static void window_destroy(G_GNUC_UNUSED GtkWidget *w, gpointer data) +{ + TilemEmulatorWindow *ewin = data; + + if (!window_maximized(ewin)) + tilem_config_set("settings", + "zoom/r", ewin->zoom_factor, + NULL); + + ewin->window = ewin->layout = ewin->lcd = ewin->background = NULL; +} + +TilemEmulatorWindow *tilem_emulator_window_new(TilemCalcEmulator *emu) +{ + TilemEmulatorWindow *ewin; + + g_return_val_if_fail(emu != NULL, NULL); + + ewin = g_slice_new0(TilemEmulatorWindow); + ewin->emu = emu; + + tilem_config_get("settings", + "skin_disabled/b", &ewin->skin_disabled, + "smooth_scaling/b=1", &ewin->lcd_smooth_scale, + "zoom/r=2.0", &ewin->zoom_factor, + NULL); + + if (ewin->zoom_factor <= 1.0) + ewin->zoom_factor = 1.0; + + /* Create the window */ + ewin->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + + g_signal_connect(ewin->window, "window-state-event", + G_CALLBACK(window_state_changed), ewin); + g_signal_connect(ewin->window, "destroy", + G_CALLBACK(window_destroy), ewin); + + g_signal_connect_after(ewin->window, "check-resize", + G_CALLBACK(set_size_hints), ewin); + + gtk_widget_add_events(ewin->window, (GDK_KEY_PRESS_MASK + | GDK_KEY_RELEASE_MASK)); + + g_signal_connect(ewin->window, "key-press-event", + G_CALLBACK(key_press_event), ewin); + g_signal_connect(ewin->window, "key-release-event", + G_CALLBACK(key_release_event), ewin); + + build_menu(ewin); + + tilem_emulator_window_calc_changed(ewin); + + return ewin; +} + +void tilem_emulator_window_free(TilemEmulatorWindow *ewin) +{ + g_return_if_fail(ewin != NULL); + + if (ewin->lcd) + gtk_widget_destroy(ewin->lcd); + if (ewin->background) + gtk_widget_destroy(ewin->background); + if (ewin->layout) + gtk_widget_destroy(ewin->layout); + if (ewin->window) + gtk_widget_destroy(ewin->window); + if (ewin->popup_menu) + gtk_widget_destroy(ewin->popup_menu); + if (ewin->actions) + g_object_unref(ewin->actions); + + g_free(ewin->lcd_image_buf); + + g_free(ewin->skin_file_name); + if (ewin->skin) { + skin_unload(ewin->skin); + g_free(ewin->skin); + } + + if (ewin->lcd_cmap) + gdk_rgb_cmap_free(ewin->lcd_cmap); + + g_slice_free(TilemEmulatorWindow, ewin); +} + +void tilem_emulator_window_set_skin(TilemEmulatorWindow *ewin, + const char *filename) +{ + g_return_if_fail(ewin != NULL); + + g_free(ewin->skin_file_name); + if (filename) + ewin->skin_file_name = g_strdup(filename); + else + ewin->skin_file_name = NULL; + redraw_screen(ewin); +} + +/* Switch between skin and LCD-only mode */ +void tilem_emulator_window_set_skin_disabled(TilemEmulatorWindow *ewin, + gboolean disabled) +{ + g_return_if_fail(ewin != NULL); + + if (ewin->skin_disabled != !!disabled) { + ewin->skin_disabled = !!disabled; + redraw_screen(ewin); + } +} + +void tilem_emulator_window_calc_changed(TilemEmulatorWindow *ewin) +{ + const char *model; + char *name = NULL, *path; + + g_return_if_fail(ewin != NULL); + g_return_if_fail(ewin->emu != NULL); + + g_free(ewin->skin_file_name); + ewin->skin_file_name = NULL; + + if (!ewin->emu->calc) + return; + + model = ewin->emu->calc->hw.name; + + tilem_config_get(model, + "skin/f", &name, + NULL); + + if (!name) + name = g_strdup_printf("%s.skn", model); + + if (!g_path_is_absolute(name)) { + path = get_shared_file_path("skins", name, NULL); + tilem_emulator_window_set_skin(ewin, path); + g_free(path); + } + else { + tilem_emulator_window_set_skin(ewin, name); + } + + g_free(name); +} + +void tilem_emulator_window_refresh_lcd(TilemEmulatorWindow *ewin) +{ + g_return_if_fail(ewin != NULL); + if (ewin->lcd) + gtk_widget_queue_draw(ewin->lcd); +} + + + + +/* Display the lcd image into the terminal */ +void display_lcdimage_into_terminal(TilemEmulatorWindow *ewin) +{ + + int width, height; + guchar* lcddata; + int x, y; + char c; + width = ewin->emu->calc->hw.lcdwidth; + height = ewin->emu->calc->hw.lcdheight; + FILE* lcd_content_file; + /* Alloc mmem */ + lcddata = g_new(guchar, (width / 8) * height); + + /* Get the lcd content using the function 's pointer from Benjamin's core */ + (*ewin->emu->calc->hw.get_lcd)(ewin->emu->calc, lcddata); + + /* Print a little demo just for fun;) */ + printf("\n\n\n"); + printf(" r rr r rrrrr rrr r rrrrr r r rr r rr r \n"); + printf(" r r r r r r r r rr rr r r r r r r r \n"); + printf(" r r r r r r r r r r r r r r r r r r \n"); + printf("rrrrr r r r r r r rrrr r r r r r r r rrrrr rrrrr rrrrr \n"); + printf(" r r r r r r r r r r rrr r r r r r r \n"); + printf(" r r r r r r r r r r r r r r r r \n"); + printf(" r rr r r rrr rrrrr rrrrr r r r rr r \n"); + printf("\n(Here is just a sample...)\n\n"); + + /* Request user to know which char user wants */ + + printf("Which char to display FOR BLACK?\n"); + scanf("%c", &c); /* Choose wich char for the black */ + + //printf("Which char to display FOR GRAY ?\n"); + //scanf("%c", &b); /* Choose wich char for the black */ + + lcd_content_file = g_fopen("lcd_content.txt", "w"); + + printf("\n\n\n### LCD CONTENT ###\n\n\n\n"); + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + /*printf("%d ", lcddata[y * width + x]); */ + if (lcddata[(y * width + x) / 8] & (0x80 >> (x % 8))) { + printf("%c", c); + if(lcd_content_file != NULL) + fprintf(lcd_content_file,"%c", c); + } else { + printf("%c", ' '); + if(lcd_content_file != NULL) + fprintf(lcd_content_file,"%c", ' '); + } + } + printf("\n"); + if(lcd_content_file != NULL) + fprintf(lcd_content_file,"%c", '\n'); + } + if(lcd_content_file != NULL) { + fclose(lcd_content_file); + printf("\n### END ###\n\nSaved into lcd_content.txt\n"); + } + +} diff --git a/tool/tilem-src/gui/emuwin.h b/tool/tilem-src/gui/emuwin.h new file mode 100644 index 0000000..74fb3ca --- /dev/null +++ b/tool/tilem-src/gui/emuwin.h @@ -0,0 +1,78 @@ +/* + * TilEm II + * + * Copyright (c) 2010-2011 Thibault Duponchelle + * Copyright (c) 2010-2012 Benjamin Moody + * + * 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 . + */ + +/* Root window view (widgets and flags) */ +typedef struct _TilemEmulatorWindow { + TilemCalcEmulator *emu; + + GtkWidget *window; /* The top level window */ + GtkWidget *layout; /* Layout */ + GtkWidget *lcd; + GtkWidget *background; + GtkWidget *popup_menu; + + GtkActionGroup *actions; + + GdkGeometry geomhints; + GdkWindowHints geomhintmask; + + byte* lcd_image_buf; + int lcd_image_width; + int lcd_image_height; + GdkRgbCmap* lcd_cmap; + gboolean lcd_smooth_scale; + + char *skin_file_name; + SKIN_INFOS *skin; + gboolean skin_disabled; /* A flag to know if skinless or not */ + gdouble base_zoom; + gdouble zoom_factor; + GdkWindowState window_state; + + int mouse_key; /* Key currently pressed by mouse button */ + + /* Host keycode used to activate each key, if any */ + int keypress_keycodes[64]; + int sequence_keycode; + +} TilemEmulatorWindow; + +/* Create a new TilemEmulatorWindow. */ +TilemEmulatorWindow *tilem_emulator_window_new(TilemCalcEmulator *emu); + +/* Free a TilemEmulatorWindow. */ +void tilem_emulator_window_free(TilemEmulatorWindow *ewin); + +/* Load a skin file. */ +void tilem_emulator_window_set_skin(TilemEmulatorWindow *ewin, + const char *filename); + +/* Enable or disable skin. */ +void tilem_emulator_window_set_skin_disabled(TilemEmulatorWindow *ewin, + gboolean disabled); + +/* New calculator loaded. */ +void tilem_emulator_window_calc_changed(TilemEmulatorWindow *ewin); + +/* Redraw LCD contents. */ +void tilem_emulator_window_refresh_lcd(TilemEmulatorWindow *ewin); + +/* Prompt for a ROM file to open */ +gboolean tilem_emulator_window_prompt_open_rom(TilemEmulatorWindow *ewin); diff --git a/tool/tilem-src/gui/event.c b/tool/tilem-src/gui/event.c new file mode 100644 index 0000000..33fd478 --- /dev/null +++ b/tool/tilem-src/gui/event.c @@ -0,0 +1,436 @@ +/* + * TilEm II + * + * Copyright (c) 2010-2011 Thibault Duponchelle + * Copyright (c) 2010-2011 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include "gui.h" +#include "files.h" +#include "filedlg.h" + +/* Table for translating skin-file key number (based on actual + position, and defined by the VTI/TiEmu file formats) into a + scancode. Note that the TILEM_KEY_* constants are named according + to the TI-83 keypad layout; other models use different names for + the keys, but the same scancodes. */ +static const int keycode_map[] = + { TILEM_KEY_YEQU, + TILEM_KEY_WINDOW, + TILEM_KEY_ZOOM, + TILEM_KEY_TRACE, + TILEM_KEY_GRAPH, + + TILEM_KEY_2ND, + TILEM_KEY_MODE, + TILEM_KEY_DEL, + TILEM_KEY_LEFT, + TILEM_KEY_RIGHT, + TILEM_KEY_UP, + TILEM_KEY_DOWN, + TILEM_KEY_ALPHA, + TILEM_KEY_GRAPHVAR, + TILEM_KEY_STAT, + + TILEM_KEY_MATH, + TILEM_KEY_MATRIX, + TILEM_KEY_PRGM, + TILEM_KEY_VARS, + TILEM_KEY_CLEAR, + + TILEM_KEY_RECIP, + TILEM_KEY_SIN, + TILEM_KEY_COS, + TILEM_KEY_TAN, + TILEM_KEY_POWER, + + TILEM_KEY_SQUARE, + TILEM_KEY_COMMA, + TILEM_KEY_LPAREN, + TILEM_KEY_RPAREN, + TILEM_KEY_DIV, + + TILEM_KEY_LOG, + TILEM_KEY_7, + TILEM_KEY_8, + TILEM_KEY_9, + TILEM_KEY_MUL, + + TILEM_KEY_LN, + TILEM_KEY_4, + TILEM_KEY_5, + TILEM_KEY_6, + TILEM_KEY_SUB, + + TILEM_KEY_STORE, + TILEM_KEY_1, + TILEM_KEY_2, + TILEM_KEY_3, + TILEM_KEY_ADD, + + TILEM_KEY_ON, + TILEM_KEY_0, + TILEM_KEY_DECPNT, + TILEM_KEY_CHS, + TILEM_KEY_ENTER }; + +/* Find the keycode for the key (if any) at the given position. If + the keys overlap, choose the "nearest" (according to Manhattan + distance to the midpoint.) */ +static int scan_click(const SKIN_INFOS* skin, double x, double y) +{ + guint ix, iy, nearest = 0, i; + int dx, dy, d, best_d = G_MAXINT; + + if (!skin) + return 0; + + ix = (x * skin->sx + 0.5); + iy = (y * skin->sy + 0.5); + + for (i = 0; i < G_N_ELEMENTS(keycode_map); i++) { + if (ix >= skin->keys_pos[i].left + && ix < skin->keys_pos[i].right + && iy >= skin->keys_pos[i].top + && iy < skin->keys_pos[i].bottom) { + dx = (skin->keys_pos[i].left + skin->keys_pos[i].right + - 2 * ix); + dy = (skin->keys_pos[i].top + skin->keys_pos[i].bottom + - 2 * iy); + d = ABS(dx) + ABS(dy); + + if (d < best_d) { + best_d = d; + nearest = keycode_map[i]; + } + } + } + + return nearest; +} + +/* Retrieve pointer coordinates for an input device. */ +static void get_device_pointer(GdkWindow *win, GdkDevice *dev, + gdouble *x, gdouble *y, GdkModifierType *mask) +{ + gdouble *axes; + int i; + + axes = g_new(gdouble, dev->num_axes); + gdk_device_get_state(dev, win, axes, mask); + + for (i = 0; i < dev->num_axes; i++) { + if (x && dev->axes[i].use == GDK_AXIS_X) + *x = axes[i]; + else if (y && dev->axes[i].use == GDK_AXIS_Y) + *y = axes[i]; + } + + g_free(axes); +} + +/* Show a nice GtkAboutDialog */ +void show_about() +{ + GtkWidget *dialog = gtk_about_dialog_new(); + gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(dialog), "2.0"); + gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(dialog), "(c) Benjamin Moody\n(c) Thibault Duponchelle\n(c) Luc Bruant\n"); + gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(dialog), "TilEm is a TI Linux Emulator.\n It emulates all current z80 models.\n TI73, TI76, TI81, TI82, TI83(+)(SE), TI84+(SE), TI85 and TI86 ;D"); + gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(dialog), "http://lpg.ticalc.org/prj_tilem/"); + + /* Add the logo */ + char* tilem_ban = get_shared_file_path("pixs", "tilem_ban.png", NULL); + if(tilem_ban) { + GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file(tilem_ban, NULL); + gtk_about_dialog_set_logo(GTK_ABOUT_DIALOG(dialog), pixbuf); + g_object_unref(pixbuf), pixbuf = NULL; + } + + gtk_dialog_run(GTK_DIALOG (dialog)); + gtk_widget_destroy(dialog); + +} + + +void launch_debugger(TilemEmulatorWindow *ewin) +{ + if (!ewin->emu->dbg) + ewin->emu->dbg = tilem_debugger_new(ewin->emu); + tilem_debugger_show(ewin->emu->dbg); +} + +/* Press a key, ensuring that at most one key is "pressed" at a time + due to this function (if pointer moves or is released, we don't + want the old key held down.) + + FIXME: on multi-pointer displays, allow each input device to act + separately */ +static void press_mouse_key(TilemEmulatorWindow* ewin, int key) +{ + if (ewin->mouse_key == key) + return; + + tilem_calc_emulator_release_key(ewin->emu, ewin->mouse_key); + tilem_calc_emulator_press_key(ewin->emu, key); + ewin->mouse_key = key; +} + +/* Mouse button pressed */ +gboolean mouse_press_event(G_GNUC_UNUSED GtkWidget* w, GdkEventButton *event, + gpointer data) +{ + TilemEmulatorWindow* ewin = data; + int key; + + key = scan_click(ewin->skin, event->x, event->y); + + if (event->button == 1) { + /* button 1: press key until button is released or + pointer moves away */ + press_mouse_key(ewin, key); + return TRUE; + } + else if (event->button == 2) { + /* button 2: hold key down permanently */ + tilem_calc_emulator_press_key(ewin->emu, key); + return TRUE; + } + else if (event->button == 3) { + /* button 3: popup menu */ + gtk_menu_popup(GTK_MENU(ewin->popup_menu), + NULL, NULL, NULL, NULL, + event->button, event->time); + return TRUE; + } + else + return FALSE; +} + +/* Mouse pointer moved */ +gboolean pointer_motion_event(G_GNUC_UNUSED GtkWidget* w, GdkEventMotion *event, + gpointer data) +{ + TilemEmulatorWindow* ewin = data; + int key; + + if (event->is_hint) + get_device_pointer(event->window, event->device, + &event->x, &event->y, &event->state); + + if (event->state & GDK_BUTTON1_MASK) + key = scan_click(ewin->skin, event->x, event->y); + else + key = 0; + + press_mouse_key(ewin, key); + + return FALSE; +} + +/* Mouse button released */ +gboolean mouse_release_event(G_GNUC_UNUSED GtkWidget* w, GdkEventButton *event, + gpointer data) +{ + TilemEmulatorWindow* ewin = data; + + if (event->button == 1) + press_mouse_key(ewin, 0); + + return FALSE; +} + +/* Find key binding for the given keysym and modifiers */ +static TilemKeyBinding* find_key_binding_for_keysym(TilemCalcEmulator* emu, + guint keyval, + GdkModifierType mods) +{ + int i; + + for (i = 0; i < emu->nkeybindings; i++) + if (keyval == emu->keybindings[i].keysym + && mods == emu->keybindings[i].modifiers) + return &emu->keybindings[i]; + + return NULL; +} + +/* Find key binding matching the given event */ +static TilemKeyBinding* find_key_binding(TilemCalcEmulator* emu, + GdkEventKey* event) +{ + GdkDisplay *dpy; + GdkKeymap *km; + guint keyval; + GdkModifierType consumed, mods; + TilemKeyBinding *kb; + + dpy = gdk_drawable_get_display(event->window); + km = gdk_keymap_get_for_display(dpy); + + /* determine the relevant set of modifiers */ + + gdk_keymap_translate_keyboard_state(km, event->hardware_keycode, + event->state, event->group, + &keyval, NULL, NULL, &consumed); + + mods = (event->state & ~consumed + & (GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_MOD1_MASK)); + + if (event->state & GDK_LOCK_MASK + && (kb = find_key_binding_for_keysym(emu, keyval, + mods | GDK_LOCK_MASK))) { + return kb; + } + + return find_key_binding_for_keysym(emu, keyval, mods); +} + +/* Key-press event */ +gboolean key_press_event(G_GNUC_UNUSED GtkWidget* w, GdkEventKey* event, + gpointer data) +{ + TilemEmulatorWindow *ewin = data; + TilemKeyBinding *kb; + int i, key; + unsigned int hwkey; + + /* Ignore repeating keys */ + for (i = 0; i < 64; i++) + if (ewin->keypress_keycodes[i] == event->hardware_keycode) + return TRUE; + if (ewin->sequence_keycode == event->hardware_keycode) + return TRUE; + + if (!(kb = find_key_binding(ewin->emu, event))) + return FALSE; + + hwkey = event->hardware_keycode; + + if (kb->nscancodes == 1) { + /* if queue is empty, just press the key; otherwise + add it to the queue */ + key = kb->scancodes[0]; + if (tilem_calc_emulator_press_or_queue(ewin->emu, key)) + ewin->sequence_keycode = hwkey; + else + ewin->keypress_keycodes[key] = hwkey; + } + else { + tilem_calc_emulator_queue_keys(ewin->emu, kb->scancodes, + kb->nscancodes); + ewin->sequence_keycode = hwkey; + } + + return TRUE; +} + +/* Key-release event */ +gboolean key_release_event(G_GNUC_UNUSED GtkWidget* w, GdkEventKey* event, + gpointer data) +{ + TilemEmulatorWindow *ewin = data; + int i; + + /* Check if the key that was just released was one that + activated a calculator keypress. (Do not try to look up + event->keyval; modifiers may have changed since the key was + pressed.) */ + for (i = 0; i < 64; i++) { + if (ewin->keypress_keycodes[i] == event->hardware_keycode) { + tilem_calc_emulator_release_key(ewin->emu, i); + ewin->keypress_keycodes[i] = 0; + } + } + + if (ewin->sequence_keycode == event->hardware_keycode) { + tilem_calc_emulator_release_queued_key(ewin->emu); + ewin->sequence_keycode = 0; + } + + return FALSE; +} + +static void place_menu(GtkMenu *menu, gint *x, gint *y, + gboolean *push_in, gpointer data) +{ + GtkWidget *w = data; + GdkWindow *win; + GdkScreen *screen; + int n; + + win = gtk_widget_get_window(w); + gdk_window_get_origin(win, x, y); + + screen = gdk_drawable_get_screen(win); + n = gdk_screen_get_monitor_at_point(screen, *x, *y); + gtk_menu_set_monitor(menu, n); + + *push_in = FALSE; +} + +/* Pop up menu on main window */ +gboolean popup_menu_event(GtkWidget* w, gpointer data) +{ + TilemEmulatorWindow *ewin = data; + + gtk_menu_popup(GTK_MENU(ewin->popup_menu), + NULL, NULL, &place_menu, w, + 0, gtk_get_current_event_time()); + + return TRUE; +} + +/* Callback function for the drag and drop event */ +void drag_data_received(G_GNUC_UNUSED GtkWidget *win, + G_GNUC_UNUSED GdkDragContext *dc, + G_GNUC_UNUSED gint x, G_GNUC_UNUSED gint y, + GtkSelectionData *seldata, + G_GNUC_UNUSED guint info, G_GNUC_UNUSED guint t, + gpointer data) +{ + TilemEmulatorWindow *ewin = data; + gchar **uris, **filenames; + gint i, j, n; + + uris = gtk_selection_data_get_uris(seldata); + if (!uris) + return; + + n = g_strv_length(uris); + filenames = g_new0(gchar *, n + 1); + + for (i = j = 0; i < n; i++) { + filenames[j] = g_filename_from_uri(uris[i], NULL, NULL); + if (filenames[j]) + j++; + } + filenames[j] = NULL; + + load_files(ewin, filenames); + g_strfreev(filenames); +} diff --git a/tool/tilem-src/gui/filedlg.c b/tool/tilem-src/gui/filedlg.c new file mode 100644 index 0000000..0aefa6d --- /dev/null +++ b/tool/tilem-src/gui/filedlg.c @@ -0,0 +1,1039 @@ +/* + * TilEm II + * + * Copyright (c) 2011 Benjamin Moody + * Copyright (c) 2011 Thibault Duponchelle // FIXME : My work is based on yours benjamin. Should I put "portions"?! Or something else ? + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include + +#include "gtk-compat.h" +#include "filedlg.h" + +#ifdef GDK_WINDOWING_WIN32 +# define WIN32_LEAN_AND_MEAN +# include +# include +# include +# include +# include + +# ifndef OPENFILENAME_SIZE_VERSION_400 +# define OPENFILENAME_SIZE_VERSION_400 sizeof(OPENFILENAMEA) +# endif + +struct fcinfo { + const char *title; + gboolean save; + HWND parent_window; + char *filename; + char *dirname; + char *extension; + const char *filters; + unsigned int flags; +}; + +#define BUFFER_SIZE 32768 + +static char * file_chooser_main(const struct fcinfo *fci) +{ + if (G_WIN32_HAVE_WIDECHAR_API()) { + OPENFILENAMEW ofnw; + wchar_t *titlew, *filterw, *initdirw, *defextw; + wchar_t filenamew[BUFFER_SIZE + 1]; + wchar_t *p; + int result; + int i; + + titlew = g_utf8_to_utf16(fci->title, -1, 0, 0, 0); + + filterw = g_utf8_to_utf16(fci->filters, -1, 0, 0, 0); + for (i = 0; filterw[i]; i++) + if (filterw[i] == '\n') filterw[i] = 0; + + memset(&ofnw, 0, sizeof(ofnw)); + ofnw.lStructSize = OPENFILENAME_SIZE_VERSION_400; + + ofnw.hwndOwner = fci->parent_window; + ofnw.lpstrTitle = titlew; + ofnw.lpstrFilter = filterw; + ofnw.nFilterIndex = 1; + ofnw.lpstrFile = filenamew; + ofnw.nMaxFile = BUFFER_SIZE; + + memset(filenamew, 0, sizeof(filenamew)); + + if (fci->filename) { + p = g_utf8_to_utf16(fci->filename, -1, 0, 0, 0); + if (p) { + wcsncpy(filenamew, p, BUFFER_SIZE); + g_free(p); + } + } + + if (fci->dirname) + initdirw = g_utf8_to_utf16(fci->dirname, -1, 0, 0, 0); + else + initdirw = NULL; + + if (fci->extension) + defextw = g_utf8_to_utf16(fci->extension, -1, 0, 0, 0); + else + defextw = NULL; + + ofnw.lpstrInitialDir = initdirw; + ofnw.lpstrDefExt = defextw; + + ofnw.Flags = fci->flags; + + result = (fci->save + ? GetSaveFileNameW(&ofnw) + : GetOpenFileNameW(&ofnw)); + + g_free(titlew); + g_free(filterw); + g_free(initdirw); + g_free(defextw); + + if (!result) + return NULL; + + if ((fci->flags & OFN_ALLOWMULTISELECT)) { + for (i = 0; i < BUFFER_SIZE; i++) { + if (filenamew[i] == 0 && filenamew[i + 1] == 0) + break; + else if (filenamew[i] == '/') + filenamew[i] = '\\'; + else if (filenamew[i] == 0) + filenamew[i] = '/'; + } + } + + return g_utf16_to_utf8(filenamew, -1, 0, 0, 0); + } + else { + OPENFILENAMEA ofna; + char *titlel, *filterl, *initdirl, *defextl; + char filenamel[BUFFER_SIZE + 1]; + char *p; + int result; + int i; + + titlel = g_locale_from_utf8(fci->title, -1, 0, 0, 0); + + filterl = g_locale_from_utf8(fci->filters, -1, 0, 0, 0); + for (i = 0; filterl[i]; i++) + if (filterl[i] == '\n') filterl[i] = 0; + + memset(&ofna, 0, sizeof(ofna)); + ofna.lStructSize = OPENFILENAME_SIZE_VERSION_400; + + ofna.hwndOwner = fci->parent_window; + ofna.lpstrTitle = titlel; + ofna.lpstrFilter = filterl; + ofna.nFilterIndex = 1; + ofna.lpstrFile = filenamel; + ofna.nMaxFile = BUFFER_SIZE; + + memset(filenamel, 0, sizeof(filenamel)); + + if (fci->filename) { + p = g_locale_from_utf8(fci->filename, -1, 0, 0, 0); + if (p) { + strncpy(filenamel, p, BUFFER_SIZE); + g_free(p); + } + } + + if (fci->dirname) + initdirl = g_locale_from_utf8(fci->dirname, -1, 0, 0, 0); + else + initdirl = NULL; + + if (fci->extension) + defextl = g_locale_from_utf8(fci->extension, -1, 0, 0, 0); + else + defextl = NULL; + + ofna.lpstrInitialDir = initdirl; + ofna.lpstrDefExt = defextl; + + ofna.Flags = fci->flags; + + result = (fci->save + ? GetSaveFileNameA(&ofna) + : GetOpenFileNameA(&ofna)); + + g_free(titlel); + g_free(filterl); + g_free(initdirl); + g_free(defextl); + + if (!result) + return NULL; + + if ((fci->flags & OFN_ALLOWMULTISELECT)) { + for (i = 0; i < BUFFER_SIZE; i++) { + if (filenamel[i] == 0 && filenamel[i + 1] == 0) + break; + else if (filenamel[i] == '/') + filenamel[i] = '\\'; + else if (filenamel[i] == 0) + filenamel[i] = '/'; + } + } + + return g_locale_to_utf8(filenamel, -1, 0, 0, 0); + } +} + +static gboolean wakeup(G_GNUC_UNUSED gpointer data) +{ + gtk_main_quit(); + return FALSE; +} + +static gpointer file_chooser_thread(gpointer data) +{ + struct fcinfo *fci = data; + gpointer res = file_chooser_main(fci); + g_idle_add(wakeup, NULL); + return res; +} + +static char * build_filter_string(const char *desc1, + const char *pattern1, + va_list ap) +{ + GString *str = g_string_new(NULL); + + while (desc1 && pattern1) { + if (pattern1[0]) { + g_string_append(str, desc1); + g_string_append_c(str, '\n'); + g_string_append(str, pattern1); + g_string_append_c(str, '\n'); + } + + desc1 = va_arg(ap, char *); + if (!desc1) break; + pattern1 = va_arg(ap, char *); + } + + return g_string_free(str, FALSE); +} + +static char ** run_file_chooser1(const char *title, + GtkWindow *parent, + gboolean save, + gboolean multiple, + const char *suggest_name, + const char *suggest_dir, + const char *filters) +{ + struct fcinfo fci; + GThread *thread; + GtkWidget *dummy; + GdkWindow *pwin; + char *fname, *p, *dir; + char **result; + int i; + + if (!g_thread_supported()) + g_thread_init(NULL); + + fci.title = title; + fci.save = save; + + if (parent && (pwin = gtk_widget_get_window(GTK_WIDGET(parent)))) + fci.parent_window = GDK_WINDOW_HWND(pwin); + else + fci.parent_window = NULL; + + if (suggest_name && suggest_dir) { + fci.filename = g_build_filename(suggest_dir, + suggest_name, NULL); + fci.dirname = NULL; + } + else if (suggest_name) { + fci.filename = g_strdup(suggest_name); + fci.dirname = NULL; + } + else if (suggest_dir) { + fci.filename = NULL; + fci.dirname = g_strdup(suggest_dir); + } + else { + fci.filename = fci.dirname = NULL; + } + + if (suggest_name && (p = strrchr(suggest_name, '.'))) + fci.extension = g_strdup(p + 1); + else + fci.extension = NULL; + + fci.filters = filters; + + fci.flags = (OFN_HIDEREADONLY | OFN_EXPLORER); + + if (save) + fci.flags |= OFN_OVERWRITEPROMPT; + else { + fci.flags |= OFN_FILEMUSTEXIST; + if (multiple) + fci.flags |= OFN_ALLOWMULTISELECT; + } + + if ((thread = g_thread_create(file_chooser_thread, &fci, TRUE, NULL))) { + dummy = gtk_invisible_new(); + gtk_grab_add(dummy); + gtk_main(); + fname = g_thread_join(thread); + gtk_widget_destroy(dummy); + } + else { + fname = file_chooser_main(&fci); + } + + g_free(fci.filename); + g_free(fci.dirname); + g_free(fci.extension); + + if (!fname) { + return NULL; + } + else if (multiple && (p = strchr(fname, '/'))) { + dir = g_strndup(fname, p - fname); + result = g_strsplit(p + 1, "/", -1); + + for (i = 0; result[i]; i++) { + p = result[i]; + result[i] = g_build_filename(dir, p, NULL); + g_free(p); + } + + g_free(fname); + return result; + } + else { + result = g_new(char *, 2); + result[0] = fname; + result[1] = NULL; + return result; + } +} + +static char ** run_file_chooser(const char *title, + GtkWindow *parent, + gboolean save, + gboolean multiple, + const char *suggest_name, + const char *suggest_dir, + const char *desc1, + const char *pattern1, + va_list ap) +{ + char *filters; + char **result; + filters = build_filter_string(desc1, pattern1, ap); + result = run_file_chooser1(title, parent, save, multiple, + suggest_name, suggest_dir, filters); + g_free(filters); + return result; +} + +struct dcinfo { + const char *title; + HWND parent_window; + wchar_t *suggest_dir_w; + char *suggest_dir_l; +}; + +static int CALLBACK dir_chooser_callback(HWND hwnd, UINT uMsg, + G_GNUC_UNUSED LPARAM lParam, + LPARAM lpData) +{ + const struct dcinfo *dci = (struct dcinfo*) lpData; + + if (uMsg != BFFM_INITIALIZED) + return 0; + + if (G_WIN32_HAVE_WIDECHAR_API()) + SendMessageW(hwnd, BFFM_SETSELECTIONW, + TRUE, (LPARAM) dci->suggest_dir_w); + else + SendMessageA(hwnd, BFFM_SETSELECTIONA, + TRUE, (LPARAM) dci->suggest_dir_l); + return 0; +} + +static char * dir_chooser_main(const struct dcinfo *dci) +{ + LPITEMIDLIST idl; + char *result = NULL; + + CoInitialize(NULL); + + if (G_WIN32_HAVE_WIDECHAR_API()) { + BROWSEINFOW bifw; + wchar_t dirnamew[MAX_PATH + 1]; + + memset(&bifw, 0, sizeof(bifw)); + bifw.hwndOwner = dci->parent_window; + bifw.lpszTitle = g_utf8_to_utf16(dci->title, -1, 0, 0, 0); + bifw.ulFlags = (BIF_RETURNONLYFSDIRS | BIF_USENEWUI); + bifw.lpfn = &dir_chooser_callback; + bifw.lParam = (LPARAM) dci; + + idl = SHBrowseForFolderW(&bifw); + if (idl && SHGetPathFromIDListW(idl, dirnamew)) + result = g_utf16_to_utf8(dirnamew, -1, 0, 0, 0); + } + else { + BROWSEINFOA bifa; + char dirnamel[MAX_PATH + 1]; + + memset(&bifa, 0, sizeof(bifa)); + bifa.hwndOwner = dci->parent_window; + bifa.lpszTitle = g_locale_from_utf8(dci->title, -1, 0, 0, 0); + bifa.ulFlags = (BIF_RETURNONLYFSDIRS | BIF_USENEWUI); + bifa.lpfn = &dir_chooser_callback; + bifa.lParam = (LPARAM) dci; + + idl = SHBrowseForFolderA(&bifa); + if (idl && SHGetPathFromIDListA(idl, dirnamel)) + result = g_locale_to_utf8(dirnamel, -1, 0, 0, 0); + } + + if (idl) + CoTaskMemFree(idl); + + CoUninitialize(); + + return result; +} + +static gpointer dir_chooser_thread(gpointer data) +{ + struct dcinfo *dci = data; + gpointer res = dir_chooser_main(dci); + g_idle_add(wakeup, NULL); + return res; +} + +static char* run_dir_chooser(G_GNUC_UNUSED const char *title, + GtkWindow *parent, + G_GNUC_UNUSED gboolean save, + const char *suggest_dir) +{ + struct dcinfo dci; + GdkWindow *pwin; + GThread *thread; + GtkWidget *dummy; + char *dname; + + if (!g_thread_supported()) + g_thread_init(NULL); + + dci.title = "Select a folder to save received files."; + + if (parent && (pwin = gtk_widget_get_window(GTK_WIDGET(parent)))) + dci.parent_window = GDK_WINDOW_HWND(pwin); + else + dci.parent_window = NULL; + + if (suggest_dir) { + dci.suggest_dir_w = g_utf8_to_utf16(suggest_dir, -1, 0, 0, 0); + dci.suggest_dir_l = g_locale_from_utf8(suggest_dir, -1, 0, 0, 0); + } + else { + dci.suggest_dir_w = NULL; + dci.suggest_dir_l = NULL; + } + + if ((thread = g_thread_create(dir_chooser_thread, &dci, TRUE, NULL))) { + dummy = gtk_invisible_new(); + gtk_grab_add(dummy); + gtk_main(); + dname = g_thread_join(thread); + gtk_widget_destroy(dummy); + } + else { + dname = dir_chooser_main(&dci); + } + + g_free(dci.suggest_dir_w); + g_free(dci.suggest_dir_l); + + return dname; +} + +#else /* ! GDK_WINDOWING_WIN32 */ + +/* Case insensitive filter function */ +static gboolean filter_lowercase(const GtkFileFilterInfo *info, + gpointer data) +{ + GSList *list = data; + const char *base; + char *lowercase, *reversed; + int length; + gboolean matched = FALSE; + + if ((base = strrchr(info->filename, G_DIR_SEPARATOR))) + base++; + else + base = info->filename; + + lowercase = g_ascii_strdown(base, -1); + length = strlen(lowercase); + reversed = g_memdup(lowercase, length + 1); + g_strreverse(reversed); + + while (list) { + if (g_pattern_match(list->data, length, + lowercase, reversed)) { + matched = TRUE; + break; + } + list = list->next; + } + + g_free(lowercase); + g_free(reversed); + return matched; +} + +static void free_filter_info(gpointer data) +{ + GSList *list = data, *l; + for (l = list; l; l = l->next) + g_pattern_spec_free(l->data); + g_slist_free(list); +} + +static void setup_file_filters(GtkFileChooser *chooser, + const char *desc1, + const char *pattern1, + va_list ap) +{ + GtkFileFilter *ffilt; + char **pats; + GPatternSpec *pspec; + GSList *pspeclist; + int i; + + while (desc1 && pattern1) { + if (pattern1[0]) { + ffilt = gtk_file_filter_new(); + gtk_file_filter_set_name(ffilt, desc1); + + pats = g_strsplit(pattern1, ";", -1); + pspeclist = NULL; + for (i = 0; pats && pats[i]; i++) { + pspec = g_pattern_spec_new(pats[i]); + pspeclist = g_slist_prepend(pspeclist, pspec); + } + g_strfreev(pats); + + gtk_file_filter_add_custom(ffilt, GTK_FILE_FILTER_FILENAME, + &filter_lowercase, + pspeclist, + &free_filter_info); + + gtk_file_chooser_add_filter(chooser, ffilt); + } + + desc1 = va_arg(ap, char *); + if (!desc1) break; + pattern1 = va_arg(ap, char *); + } +} + +static gboolean prompt_overwrite(const char *fname, + GtkWindow *parent) +{ + GtkWidget *dlg; + GtkWidget *button; + char *p, *q; + + if (!g_file_test(fname, G_FILE_TEST_EXISTS)) + return TRUE; + + if (!g_file_test(fname, G_FILE_TEST_IS_REGULAR)) + return FALSE; + + p = g_filename_display_basename(fname); + dlg = gtk_message_dialog_new(parent, + GTK_DIALOG_MODAL, + GTK_MESSAGE_QUESTION, + GTK_BUTTONS_NONE, + "A file named \"%s\" already exists. " + "Do you want to replace it?", + p); + g_free(p); + + p = g_path_get_dirname(fname); + q = g_filename_display_basename(p); + gtk_message_dialog_format_secondary_markup + (GTK_MESSAGE_DIALOG(dlg), + "The file already exists in \"%s\". Replacing it will " + "overwrite its contents.", q); + g_free(p); + g_free(q); + + gtk_dialog_add_button(GTK_DIALOG(dlg), + GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL); + + button = gtk_button_new_with_mnemonic("_Replace"); + gtk_widget_set_can_default(button, TRUE); + gtk_button_set_image(GTK_BUTTON(button), + gtk_image_new_from_stock(GTK_STOCK_SAVE, + GTK_ICON_SIZE_BUTTON)); + gtk_widget_show(button); + gtk_dialog_add_action_widget(GTK_DIALOG(dlg), button, + GTK_RESPONSE_ACCEPT); + + gtk_dialog_set_alternative_button_order(GTK_DIALOG(dlg), + GTK_RESPONSE_ACCEPT, + GTK_RESPONSE_CANCEL, + -1); + + if (gtk_dialog_run(GTK_DIALOG(dlg)) == GTK_RESPONSE_ACCEPT) { + gtk_widget_destroy(dlg); + return TRUE; + } + + gtk_widget_destroy(dlg); + return FALSE; +} + +static char ** run_file_chooser(const char *title, + GtkWindow *parent, + gboolean save, + gboolean multiple, + const char *suggest_name, + const char *suggest_dir, + const char *desc1, + const char *pattern1, + va_list ap) +{ + GtkWidget *filesel; + GSList *filelist, *l; + char *fname; + char **fnames; + int i, n; + + filesel = gtk_file_chooser_dialog_new(title, parent, + (save + ? GTK_FILE_CHOOSER_ACTION_SAVE + : GTK_FILE_CHOOSER_ACTION_OPEN), + GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL, + (save + ? GTK_STOCK_SAVE + : GTK_STOCK_OPEN), + GTK_RESPONSE_ACCEPT, + NULL); + + gtk_dialog_set_alternative_button_order(GTK_DIALOG(filesel), + GTK_RESPONSE_ACCEPT, + GTK_RESPONSE_CANCEL, + -1); + + gtk_dialog_set_default_response(GTK_DIALOG(filesel), + GTK_RESPONSE_ACCEPT); + + if (suggest_dir) + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(filesel), + suggest_dir); + + if (suggest_name) + gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(filesel), + suggest_name); + + gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(filesel), + multiple); + + setup_file_filters(GTK_FILE_CHOOSER(filesel), desc1, pattern1, ap); + + while (gtk_dialog_run(GTK_DIALOG(filesel)) == GTK_RESPONSE_ACCEPT) { + if (save) { + fname = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filesel)); + if (!fname || !prompt_overwrite(fname, GTK_WINDOW(filesel))) { + g_free(fname); + continue; + } + + fnames = g_new(char *, 2); + fnames[0] = fname; + fnames[1] = NULL; + + gtk_widget_destroy(filesel); + return fnames; + } + else { + filelist = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(filesel)); + if (!filelist) + continue; + + n = g_slist_length(filelist); + fnames = g_new(char *, n + 1); + i = 0; + for (l = filelist; l; l = l->next) + fnames[i++] = l->data; + g_slist_free(filelist); + fnames[n] = NULL; + + for (i = 0; i < n; i++) + if (!g_file_test(fnames[i], + G_FILE_TEST_IS_REGULAR)) + break; + if (i < n) { + g_strfreev(fnames); + continue; + } + + gtk_widget_destroy(filesel); + return fnames; + } + } + + gtk_widget_destroy(filesel); + return NULL; +} + +static char* run_dir_chooser(const char *title, + GtkWindow *parent, + gboolean save, + const char *suggest_dir) +{ + GtkWidget *filesel; + char *fname; + + filesel = gtk_file_chooser_dialog_new(title, parent, + GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, + GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL, + (save + ? GTK_STOCK_SAVE + : GTK_STOCK_OPEN), + GTK_RESPONSE_ACCEPT, + NULL); + + gtk_dialog_set_alternative_button_order(GTK_DIALOG(filesel), + GTK_RESPONSE_ACCEPT, + GTK_RESPONSE_CANCEL, + -1); + + gtk_dialog_set_default_response(GTK_DIALOG(filesel), + GTK_RESPONSE_ACCEPT); + + if (suggest_dir) + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(filesel), + suggest_dir); + + while (gtk_dialog_run(GTK_DIALOG(filesel)) == GTK_RESPONSE_ACCEPT) { + fname = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(filesel)); + if (!fname) { + g_free(fname); + continue; + } + + gtk_widget_destroy(filesel); + return fname; + } + + gtk_widget_destroy(filesel); + return NULL; +} + +#endif /* ! GDK_WINDOWING_WIN32 */ + +char * prompt_open_file(const char *title, + GtkWindow *parent, + const char *suggest_dir, + const char *desc1, + const char *pattern1, + ...) +{ + char **result, *fname; + va_list ap; + + va_start(ap, pattern1); + result = run_file_chooser(title, parent, FALSE, FALSE, + NULL, suggest_dir, + desc1, pattern1, ap); + va_end(ap); + + if (!result || !result[0] || result[1]) { + g_strfreev(result); + return NULL; + } + else { + fname = result[0]; + g_free(result); + return fname; + } +} + +char ** prompt_open_files(const char *title, + GtkWindow *parent, + const char *suggest_dir, + const char *desc1, + const char *pattern1, + ...) +{ + char **result; + va_list ap; + + va_start(ap, pattern1); + result = run_file_chooser(title, parent, FALSE, TRUE, + NULL, suggest_dir, + desc1, pattern1, ap); + va_end(ap); + return result; +} + +char * prompt_save_file(const char *title, + GtkWindow *parent, + const char *suggest_name, + const char *suggest_dir, + const char *desc1, + const char *pattern1, + ...) +{ + char **result, *fname; + va_list ap; + + va_start(ap, pattern1); + result = run_file_chooser(title, parent, TRUE, FALSE, + suggest_name, suggest_dir, + desc1, pattern1, ap); + va_end(ap); + + if (!result || !result[0] || result[1]) { + g_strfreev(result); + return NULL; + } + else { + fname = result[0]; + g_free(result); + return fname; + } +} + +char * prompt_select_dir(const char *title, GtkWindow *parent, const char *suggest_dir) +{ + char *dirname; + + dirname = run_dir_chooser(title, parent, TRUE, suggest_dir); + + if (!dirname) { + return NULL; + } else { + return dirname; + } +} + + + +/**************** File entry ****************/ + +#ifdef GDK_WINDOWING_WIN32 + +typedef struct _FileEntry { + GtkHBox parent; + GtkWidget *entry; + GtkWidget *button; + char *title; + char *filters; + char *filename; +} FileEntry; + +typedef struct _FileEntryClass { + GtkHBoxClass parent; +} FileEntryClass; + +static guint selection_changed_signal = 0; + +G_DEFINE_TYPE(FileEntry, file_entry, GTK_TYPE_HBOX); + +static void file_entry_finalize(GObject *obj) +{ + FileEntry *fe = (FileEntry*) obj; + g_free(fe->title); + g_free(fe->filters); + g_free(fe->filename); +} + +void file_entry_set_filename(GtkWidget *entry, + const char *filename) +{ + FileEntry *fe = (FileEntry*) entry; + + if (filename && filename[0]) { + if (!fe->filename || strcmp(filename, fe->filename)) { + g_free(fe->filename); + fe->filename = g_strdup(filename); + gtk_entry_set_text(GTK_ENTRY(fe->entry), filename); + g_signal_emit(fe, selection_changed_signal, 0, NULL); + } + } + else if (fe->filename) { + g_free(fe->filename); + fe->filename = NULL; + g_signal_emit(fe, selection_changed_signal, 0, NULL); + } +} + +char * file_entry_get_filename(GtkWidget *entry) +{ + FileEntry *fe = (FileEntry*) entry; + if (fe->filename) + return g_strdup(fe->filename); + else + return NULL; +} + +static void focus_changed(G_GNUC_UNUSED GObject *obj, + G_GNUC_UNUSED GParamSpec *pspec, + gpointer data) +{ + FileEntry *fe = data; + const char *text; + text = gtk_entry_get_text(GTK_ENTRY(fe->entry)); + file_entry_set_filename(GTK_WIDGET(fe), text); +} + +static void browse_for_files(G_GNUC_UNUSED GtkButton *btn, gpointer data) +{ + FileEntry *fe = data; + GtkWidget *parent; + char **result; + char *bname, *dname; + + parent = gtk_widget_get_toplevel(GTK_WIDGET(fe)); + + if (fe->filename) { + bname = g_path_get_basename(fe->filename); + dname = g_path_get_dirname(fe->filename); + } + else { + bname = dname = NULL; + } + + result = run_file_chooser1(fe->title, GTK_WINDOW(parent), FALSE, FALSE, + bname, dname, fe->filters); + g_free(bname); + g_free(dname); + + if (result && result[0]) + file_entry_set_filename(GTK_WIDGET(fe), result[0]); + + g_strfreev(result); +} + +static void file_entry_init(FileEntry *fe) +{ + gtk_box_set_spacing(GTK_BOX(fe), 6); + + fe->entry = gtk_entry_new(); + fe->button = gtk_button_new_with_label("Browse..."); + gtk_box_pack_start(GTK_BOX(fe), fe->entry, TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(fe), fe->button, FALSE, FALSE, 0); + gtk_widget_show(fe->entry); + gtk_widget_show(fe->button); + + g_signal_connect(fe->entry, "notify::is-focus", + G_CALLBACK(focus_changed), fe); + g_signal_connect(fe->button, "clicked", + G_CALLBACK(browse_for_files), fe); +} + +static void file_entry_class_init(FileEntryClass *class) +{ + GObjectClass *obj_class; + + obj_class = G_OBJECT_CLASS(class); + obj_class->finalize = file_entry_finalize; + + selection_changed_signal = + g_signal_new("selection-changed", + G_OBJECT_CLASS_TYPE(obj_class), + G_SIGNAL_RUN_LAST, + 0, NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); +} + +GtkWidget * file_entry_new(const char *title, + const char *desc1, + const char *pattern1, + ...) +{ + FileEntry *fe = g_object_new(file_entry_get_type(), NULL); + va_list ap; + + fe->title = g_strdup(title); + + va_start(ap, pattern1); + fe->filters = build_filter_string(desc1, pattern1, ap); + va_end(ap); + + return GTK_WIDGET(fe); +} + + +#else /* ! GDK_WINDOWING_WIN32 */ + +GtkWidget * file_entry_new(const char *title, + const char *desc1, + const char *pattern1, + ...) +{ + GtkWidget *btn; + va_list ap; + + btn = gtk_file_chooser_button_new(title, GTK_FILE_CHOOSER_ACTION_OPEN); + + va_start(ap, pattern1); + setup_file_filters(GTK_FILE_CHOOSER(btn), desc1, pattern1, ap); + va_end(ap); + + return btn; +} + +void file_entry_set_filename(GtkWidget *fe, + const char *filename) +{ + gtk_file_chooser_select_filename(GTK_FILE_CHOOSER(fe), filename); +} + +char * file_entry_get_filename(GtkWidget *fe) +{ + return gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fe)); +} + +#endif /* ! GDK_WINDOWING_WIN32 */ diff --git a/tool/tilem-src/gui/filedlg.h b/tool/tilem-src/gui/filedlg.h new file mode 100644 index 0000000..10e672f --- /dev/null +++ b/tool/tilem-src/gui/filedlg.h @@ -0,0 +1,91 @@ +/* + * TilEm II + * + * Copyright (c) 2011 Benjamin Moody + * + * 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 . + */ + +/* Run a file chooser dialog, allowing user to select a single + existing file to open. + + TITLE is the title of the dialog (UTF-8.) + + PARENT is the "parent" (transient-for) window, if any. + + SUGGEST_DIR is the directory to start in (GLib filename encoding.) + + Remaining arguments are a series of pairs of strings describing the + permitted file types. First string in each pair is the + description; second is a pattern set (consisting of one or more + glob-style patterns, separated by semicolons.) Patterns must be + lowercase; they will be checked case-insensitively. The list is + terminated by NULL. + + A pattern may be the empty string (""); if so, that file type is + disabled. + + Result is NULL if dialog was cancelled; otherwise, a string in + filename encoding, which must be freed with g_free(). + */ +char * prompt_open_file(const char *title, /* UTF-8 */ + GtkWindow *parent, + const char *suggest_dir, /* filename encoding */ + const char *desc1, /* UTF-8 */ + const char *pattern1, /* ASCII */ + ...) + G_GNUC_NULL_TERMINATED; + +/* Run a file chooser dialog, allowing user to select one or more + files to open. Result is either NULL or an array of strings, which + must be freed with g_strfreev(). */ +char ** prompt_open_files(const char *title, /* UTF-8 */ + GtkWindow *parent, + const char *suggest_dir, /* filename encoding */ + const char *desc1, /* UTF-8 */ + const char *pattern1, /* ASCII */ + ...) + G_GNUC_NULL_TERMINATED; + +/* Run a file chooser dialog, allowing user to enter a new filename to + be created. SUGGEST_NAME is a suggested name for the new file; + note that this is UTF-8. */ +char * prompt_save_file(const char *title, /* UTF-8 */ + GtkWindow *parent, + const char *suggest_name, /* UTF-8 (!) */ + const char *suggest_dir, /* filename encoding */ + const char *desc1, /* UTF-8 */ + const char *pattern1, /* ASCII */ + ...) + G_GNUC_NULL_TERMINATED; + +/* Create a file entry or file-chooser button widget, allowing user to + select a single existing file to open. */ +GtkWidget * file_entry_new(const char *title, /* UTF-8 */ + const char *desc1, /* UTF-8 */ + const char *pattern1, /* ASCII */ + ...) + G_GNUC_NULL_TERMINATED; + +/* Set filename in a file entry. */ +void file_entry_set_filename(GtkWidget *fe, + const char *filename); /* filename encoding */ + +/* Get filename in a file entry. Result is NULL if no file is + selected; otherwise, a string in filename encoding, which must be + freed with g_free(). */ +char * file_entry_get_filename(GtkWidget *fe); + +/* Run a directory chooser dialog, allowing user to select a directory. */ +char * prompt_select_dir(const char *title, GtkWindow *parent, const char *suggest_dir); diff --git a/tool/tilem-src/gui/files.c b/tool/tilem-src/gui/files.c new file mode 100644 index 0000000..ec06d72 --- /dev/null +++ b/tool/tilem-src/gui/files.c @@ -0,0 +1,270 @@ +/* + * TilEm II + * + * Copyright (c) 2011-2012 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include + +#ifdef G_OS_WIN32 +# include +#endif + +#include "files.h" + +static char *program_dir; + +/* Set the name used to invoke this program */ +void set_program_path(const char *path) +{ + if (path && strchr(path, G_DIR_SEPARATOR)) + program_dir = g_path_get_dirname(path); +} + +/* Build a filename out of varargs */ +static char *build_filenamev(const char *start, va_list rest) +{ + char *args[10]; + int i; + + args[0] = (char*) start; + for (i = 1; i < 10; i++) { + args[i] = (char*) va_arg(rest, const char *); + if (!args[i]) + break; + } + g_assert(i < 10); + + return g_build_filenamev(args); +} + +#ifdef G_OS_WIN32 +static char * get_special_folder(int csidl) +{ + char lpath[MAX_PATH+1]; + wchar_t wpath[MAX_PATH+1]; + LPITEMIDLIST pidl = NULL; + gchar *s = NULL; + + if (SHGetSpecialFolderLocation(NULL, csidl, &pidl)) + return NULL; + + if (G_WIN32_HAVE_WIDECHAR_API()) { + if (SHGetPathFromIDListW(pidl, wpath)) + s = g_utf16_to_utf8(wpath, -1, NULL, NULL, NULL); + } + else { + if (SHGetPathFromIDListA(pidl, lpath)) + s = g_locale_to_utf8(lpath, -1, NULL, NULL, NULL); + } + + CoTaskMemFree(pidl); + return s; +} +#endif + +/* Get the default configuration directory. + + On Unix, this is $XDG_CONFIG_HOME/tilem2 (where $XDG_CONFIG_HOME + defaults to $HOME/.config/ if not set.) + + On Windows, this is $CSIDL_LOCAL_APPDATA\tilem2 (where + $CSIDL_LOCAL_APPDATA is typically "Local Settings\Application Data" + in the user's profile.) + + Result is cached and should not be freed. */ +static char * get_default_config_dir() +{ + static char *result; + + if (!result) { +#ifdef G_OS_WIN32 + /* Do not use g_get_user_config_dir() on Windows, + because the behavior of that function is not + consistent across versions of GLib. */ + char *s = get_special_folder(CSIDL_LOCAL_APPDATA); + if (s) + result = g_build_filename(s, "tilem2", NULL); + g_free(s); +#else + result = g_build_filename(g_get_user_config_dir(), + "tilem2", NULL); +#endif + } + + return result; +} + +/* Search for an existing file. + + The default package configuration directory (defined above) is + searched first; if the file is not found there, try to find the + file that was installed along with the package, or (in case the + package hasn't yet been installed) the copy included in the source + package. */ +static char * find_filev(GFileTest test, const char *name, va_list rest) +{ + char *fullname, *dname, *path; + const char *userdir; + const char * const *sysdirs; + + fullname = build_filenamev(name, rest); + + dname = get_default_config_dir(); + path = g_build_filename(dname, fullname, NULL); + if (g_file_test(path, test)) { + g_free(fullname); + return path; + } + g_free(path); + +#ifdef G_OS_WIN32 + if ((dname = g_win32_get_package_installation_directory(NULL, NULL))) { + path = g_build_filename(dname, "share", "tilem2", fullname, NULL); + g_free(dname); + if (g_file_test(path, test)) { + g_free(fullname); + return path; + } + g_free(path); + } +#endif + +#ifdef UNINSTALLED_SHARE_DIR + if (program_dir) { + path = g_build_filename(program_dir, UNINSTALLED_SHARE_DIR, + fullname, NULL); + if (g_file_test(path, test)) { + g_free(fullname); + return path; + } + g_free(path); + } +#endif + +#ifdef SHARE_DIR + path = g_build_filename(SHARE_DIR, fullname, NULL); + if (g_file_test(path, test)) { + g_free(fullname); + return path; + } + g_free(path); +#endif + + userdir = g_get_user_data_dir(); + if (userdir) { + path = g_build_filename(userdir, "tilem2", fullname, NULL); + if (g_file_test(path, test)) { + g_free(fullname); + return path; + } + } + + sysdirs = g_get_system_data_dirs(); + while (sysdirs && sysdirs[0]) { + path = g_build_filename(sysdirs[0], "tilem2", fullname, NULL); + if (g_file_test(path, test)) { + g_free(fullname); + return path; + } + sysdirs++; + } + + g_free(fullname); + return NULL; +} + +/* Locate an existing configuration or data file */ +char * get_shared_file_path(const char *name, ...) +{ + va_list ap; + char *path; + va_start(ap, name); + path = find_filev(G_FILE_TEST_IS_REGULAR, name, ap); + va_end(ap); + return path; +} + +/* Locate an existing configuration or data directory */ +char * get_shared_dir_path(const char *name, ...) +{ + va_list ap; + char *path; + va_start(ap, name); + path = find_filev(G_FILE_TEST_IS_DIR, name, ap); + va_end(ap); + return path; +} + +/* Return the path to the user's configuration directory, where any + new or modified config files should be written. Result is cached + and should not be freed. */ +static char * get_config_dir() +{ + static char *result; + char *fname; + FILE *f; + + if (result) + return result; + + /* If config.ini already exists, in any of the standard + locations, and is writable, use the directory containing + it. This will allow building the package as a relocatable + bundle. */ + fname = get_shared_file_path("config.ini", NULL); + if (fname) { + f = g_fopen(fname, "r+"); + if (f) { + result = g_path_get_dirname(fname); + fclose(f); + } + g_free(fname); + } + + /* Otherwise use default config directory */ + if (!result) + result = g_strdup(get_default_config_dir()); + + return result; +} + +/* Get path for writing a new or modified configuration file */ +char * get_config_file_path(const char *name, ...) +{ + va_list ap; + const char *cfgdir; + char *fullname, *path; + + cfgdir = get_config_dir(); + g_mkdir_with_parents(cfgdir, 0775); + + va_start(ap, name); + fullname = build_filenamev(name, ap); + va_end(ap); + path = g_build_filename(cfgdir, fullname, NULL); + g_free(fullname); + return path; +} + diff --git a/tool/tilem-src/gui/files.h b/tool/tilem-src/gui/files.h new file mode 100644 index 0000000..9772d36 --- /dev/null +++ b/tool/tilem-src/gui/files.h @@ -0,0 +1,42 @@ +/* + * TilEm II + * + * Copyright (c) 2011 Benjamin Moody + * + * 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 . + */ + +/* Set the name used to invoke this program. Data files can be + located relative to this path if the package is not installed */ +void set_program_path(const char *path); + +/* Locate an existing configuration or data file. Arguments will be + concatenated, separated by / or \, as with g_build_filename(). + NULL is returned if the file isn't found. Free result with + g_free(). */ +char * get_shared_file_path(const char *name, ...) + G_GNUC_NULL_TERMINATED; + +/* Locate an existing configuration or data directory. NULL is + returned if the file isn't found. Free result with g_free(). */ +char * get_shared_dir_path(const char *name, ...) + G_GNUC_NULL_TERMINATED; + +/* Get the full path where a configuration file should be written; + attempt to create the directory if it doesn't exist. This function + will always return a valid filename (although it may not actually + be writable.) Free result with g_free(). */ +char * get_config_file_path(const char *name, ...) + G_GNUC_NULL_TERMINATED; + diff --git a/tool/tilem-src/gui/fixedtreeview.c b/tool/tilem-src/gui/fixedtreeview.c new file mode 100644 index 0000000..74c384c --- /dev/null +++ b/tool/tilem-src/gui/fixedtreeview.c @@ -0,0 +1,165 @@ +/* + * TilEm II + * + * Copyright (c) 2011 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include + +#include "fixedtreeview.h" + +/* Style set on tree view; update column sizes */ +static void ftv_style_set(GtkWidget *treeview, + G_GNUC_UNUSED GtkStyle *oldstyle, + G_GNUC_UNUSED gpointer data) +{ + GtkTreeModel *template; + GtkTreeIter iter; + GList *cols, *cp; + GtkTreeViewColumn *col; + int width; + + template = g_object_get_data(G_OBJECT(treeview), "ftv-template"); + if (!template) + return; + + if (!gtk_tree_model_get_iter_first(template, &iter)) + return; + + cols = gtk_tree_view_get_columns(GTK_TREE_VIEW(treeview)); + for (cp = cols; cp; cp = cp->next) { + col = cp->data; + gtk_tree_view_column_cell_set_cell_data(col, template, &iter, + FALSE, FALSE); + gtk_tree_view_column_cell_get_size(col, NULL, NULL, NULL, + &width, NULL); + gtk_tree_view_column_set_fixed_width(col, width + 2); + } + g_list_free(cols); +} + +/* Widget destroyed */ +static void ftv_destroy(GtkWidget *treeview, G_GNUC_UNUSED gpointer data) +{ + GtkTreeModel *template; + + template = g_object_get_data(G_OBJECT(treeview), "ftv-template"); + if (template) + g_object_unref(template); + g_object_set_data(G_OBJECT(treeview), "ftv-template", NULL); +} + +void fixed_tree_view_init_with_template(GtkWidget *treeview, + GtkTreeModel *template) +{ + GtkTreeModel *oldtemplate; + + if (template) + g_object_ref_sink(template); + + oldtemplate = g_object_get_data(G_OBJECT(treeview), "ftv-template"); + if (oldtemplate) { + g_object_unref(oldtemplate); + } + else { + g_signal_connect(treeview, "style-set", + G_CALLBACK(ftv_style_set), NULL); + g_signal_connect(treeview, "destroy", + G_CALLBACK(ftv_destroy), NULL); + } + g_object_set_data(G_OBJECT(treeview), "ftv-template", template); + + if (template && GTK_WIDGET_REALIZED(treeview)) + ftv_style_set(treeview, NULL, NULL); +} + +void fixed_tree_view_init(GtkWidget *treeview, int colgroupsize, ...) +{ + GtkTreeModel *real_model; + int ncols, i, col; + GType *types; + GtkListStore *store; + GtkTreeIter iter; + GValue value; + gchar *error = NULL; + va_list ap; + + g_return_if_fail(GTK_IS_TREE_VIEW(treeview)); + g_return_if_fail(colgroupsize >= 0); + + real_model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview)); + g_return_if_fail(real_model != NULL); + + ncols = gtk_tree_model_get_n_columns(real_model); + g_return_if_fail(ncols > 0); + + if (colgroupsize == 0) + colgroupsize = ncols; + + g_return_if_fail(ncols % colgroupsize == 0); + + types = g_new(GType, ncols); + for (i = 0; i < ncols; i++) { + types[i] = gtk_tree_model_get_column_type(real_model, i); + if (i > colgroupsize) + g_return_if_fail(types[i] == types[i - colgroupsize]); + } + store = gtk_list_store_newv(ncols, types); + + va_start(ap, colgroupsize); + gtk_list_store_append(store, &iter); + + memset(&value, 0, sizeof(value)); + + col = va_arg(ap, int); + while (col != -1) { + if (col < 0 || col >= colgroupsize) { + g_critical("missing sentinel"); + break; + } + + g_value_init(&value, types[col]); + + G_VALUE_COLLECT(&value, ap, 0, &error); + + if (error) { + g_critical("%s", error); + g_free(error); + break; + } + + for (i = col; i < ncols; i += colgroupsize) + gtk_list_store_set_value(store, &iter, i, &value); + + g_value_unset(&value); + + col = va_arg(ap, int); + } + + va_end(ap); + + g_free(types); + + fixed_tree_view_init_with_template(treeview, GTK_TREE_MODEL(store)); +} diff --git a/tool/tilem-src/gui/fixedtreeview.h b/tool/tilem-src/gui/fixedtreeview.h new file mode 100644 index 0000000..f2292bf --- /dev/null +++ b/tool/tilem-src/gui/fixedtreeview.h @@ -0,0 +1,40 @@ +/* + * TilEm II + * + * Copyright (c) 2011 Benjamin Moody + * + * 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 . + */ + +/* Set up a tree view with fixed-size columns, where the column sizes + are determined automatically based on a template. The template + model must contain the same number and types of data columns as the + tree view's data model. The first row of the template model will + be used to compute column sizes; any additional rows are + ignored. */ +void fixed_tree_view_init_with_template(GtkWidget *treeview, + GtkTreeModel *template); + +/* As above, but the template model is constructed automatically. The + tree view must have a data model attached already. + + Arguments following COLGROUPSIZE are a sequence of (column, data) + pairs, as you would pass to gtk_list_store_set(). The list must be + terminated with -1. + + If COLGROUPSIZE is a positive integer N, then the template will be + constructed by repeating the first N columns as many times as + necessary. In this case, columns K and K+N must always have the + same type. */ +void fixed_tree_view_init(GtkWidget *treeview, int colgroupsize, ...); diff --git a/tool/tilem-src/gui/gifencod.c b/tool/tilem-src/gui/gifencod.c new file mode 100644 index 0000000..e622c8a --- /dev/null +++ b/tool/tilem-src/gui/gifencod.c @@ -0,0 +1,326 @@ +/* Fast GIF encoder + * taken from http://www.msg.net/utility/whirlgif/gifencod.html - go there for the algorithm explanation + * + * gifencode.c + * + * Copyright (c) 1997,1998,1999 by Hans Dinsen-Hansen + * The algorithms are inspired by those of gifcode.c + * Copyright (c) 1995,1996 Michael A. Mayer + * All rights reserved. + * + * This software may be freely copied, modified and redistributed + * without fee provided that above copyright notices are preserved + * intact on all copies and modified copies. + * + * There is no warranty or other guarantee of fitness of this software. + * It is provided solely "as is". The author(s) disclaim(s) all + * responsibility and liability with respect to this software's usage + * or its effect upon hardware or computer systems. + * + * The Graphics Interchange format (c) is the Copyright property of + * Compuserve Incorporated. Gif(sm) is a Service Mark property of + * Compuserve Incorporated. + * + * + * Implements GIF encoding by means of a tree search. + * -------------------------------------------------- + * + * - The string table may be thought of being stored in a "b-tree of + * steroids," or more specifically, a {256,128,...,4}-tree, depending on + * the size of the color map. + * - Each (non-NULL) node contains the string table index (or code) and + * {256,128,...,4} pointers to other nodes. + * - For example, the index associated with the string 0-3-173-25 would be + * stored in: + * first->node[0]->node[3]->node[173]->node[25]->code + * + * - Speed and effectivity considerations, however, have made this + * implementation somewhat obscure, because it is costly to initialize + * a node-array where most elements will never be used. + * - Initially, a new node will be marked as terminating, TERMIN. + * If this node is used at a later stage, its mark will be changed. + * - Only nodes with several used nodes will be associated with a + * node-array. Such nodes are marked LOOKUP. + * - The remaining nodes are marked SEARCH. They are linked together + * in a search-list, where a field, NODE->alt, points at an alternative + * following color. + * - It is hardly feasible exactly to predict which nodes will have most + * used node pointers. The theory here is that the very first node as + * well as the first couple of nodes which need at least one alternative + * color, will be among the ones with many nodes ("... whatever that + * means", as my tutor in Num. Analysis and programming used to say). + * - The number of possible LOOKUP nodes depends on the size of the color + * map. Large color maps will have many SEARCH nodes; small color maps + * will probably have many LOOKUP nodes. +*/ + +#include +#include +#include +#ifdef MEMDBG +#include +#endif + +#define BLOKLEN 255 +#define BUFLEN 1000 +#define TERMIN 'T' +#define LOOKUP 'L' +#define SEARCH 'S' +#define noOfArrays 20 +/* defines the amount of memory set aside in the encoding for the + * LOOKUP type nodes; for a 256 color GIF, the number of LOOKUP + * nodes will be <= noOfArrays, for a 128 color GIF the number of + * LOOKUP nodes will be <= 2 * noOfArrays, etc. */ + +typedef struct GifTree { + char typ; /* terminating, lookup, or search */ + int code; /* the code to be output */ + unsigned char ix; /* the color map index */ + struct GifTree **node, *nxt, *alt; +} GifTree; + +char *AddCodeToBuffer(int, short, char *); +void ClearTree(int, GifTree *); + +extern unsigned int debugFlag; +extern int count; + +int chainlen = 0, maxchainlen = 0, nodecount = 0, lookuptypes = 0, nbits; +short need = 8; +GifTree *empty[256], GifRoot = {LOOKUP, 0, 0, empty, NULL, NULL}, + *topNode, *baseNode, **nodeArray, **lastArray; + + +void GifEncode(FILE *fout, unsigned char *pixels, int depth, int siz) + +{ + GifTree *first = &GifRoot, *newNode, *curNode; + unsigned char *end; + int cc, eoi, next, tel=0; //, dbw=0; + short cLength; + + char *pos, *buffer; + + empty[0] = NULL; + need = 8; + nodeArray = empty; + memmove(++nodeArray, empty, 255*sizeof(GifTree **)); + if (( buffer = (char *)malloc((BUFLEN+1)*sizeof(char))) == NULL ) + printf("No memory for writing"); + buffer++; + + pos = buffer; + buffer[0] = 0x0; + + cc = (depth == 1) ? 0x4 : 1<node = (GifTree **)malloc(256*sizeof(GifTree *)*noOfArrays)) == NULL ) + printf("No memory for search nodes"); + lastArray = nodeArray + ( 256*noOfArrays - cc); + ClearTree(cc, first); + + pos = AddCodeToBuffer(cc, cLength, pos); + + end = pixels+siz; + curNode = first; + while(pixels < end) { + + if ( curNode->node[*pixels] != NULL ) { + curNode = curNode->node[*pixels]; + tel++; + pixels++; + chainlen++; + continue; + } else if ( curNode->typ == SEARCH ) { + newNode = curNode->nxt; + while ( newNode->alt != NULL ) { + if ( newNode->ix == *pixels ) break; + newNode = newNode->alt; + } + if (newNode->ix == *pixels ) { + tel++; + pixels++; + chainlen++; + curNode = newNode; + continue; + } + } + +/* ****************************************************** + * If there is no more thread to follow, we create a new node. If the + * current node is terminating, it will become a SEARCH node. If it is + * a SEARCH node, and if we still have room, it will be converted to a + * LOOKUP node. +*/ + newNode = ++topNode; + switch (curNode->typ ) { + case LOOKUP: + newNode->nxt = NULL; + newNode->alt = NULL, + curNode->node[*pixels] = newNode; + break; + case SEARCH: + if ( nodeArray != lastArray ) { + nodeArray += cc; + curNode->node = nodeArray; + curNode->typ = LOOKUP; + curNode->node[*pixels] = newNode; + curNode->node[(curNode->nxt)->ix] = curNode->nxt; + lookuptypes++; + newNode->nxt = NULL; + newNode->alt = NULL, + curNode->nxt = NULL; + break; + } +/* otherwise do as we do with a TERMIN node */ + case TERMIN: + newNode->alt = curNode->nxt; + newNode->nxt = NULL, + curNode->nxt = newNode; + curNode->typ = SEARCH; + break; + default: + fprintf(stderr, "Silly node type: %d\n", curNode->typ); + } + newNode->code = next; + newNode->ix = *pixels; + newNode->typ = TERMIN; + newNode->node = empty; + nodecount++; +/* +* End of node creation +* ****************************************************** +*/ +#ifdef _WHGDBG + if (debugFlag) { + if (curNode == newNode) fprintf(stderr, "Wrong choice of node\n"); + if ( curNode->typ == LOOKUP && curNode->node[*pixels] != newNode ) fprintf(stderr, "Wrong pixel coding\n"); + if ( curNode->typ == TERMIN ) fprintf(stderr, "Wrong Type coding; frame no = %d; pixel# = %d; nodecount = %d\n", count, tel, nodecount); + } +#endif + pos = AddCodeToBuffer(curNode->code, cLength, pos); + if ( chainlen > maxchainlen ) maxchainlen = chainlen; + chainlen = 0; + if(pos-buffer>BLOKLEN) { + buffer[-1] = BLOKLEN; + fwrite(buffer-1, 1, BLOKLEN+1, fout); + buffer[0] = buffer[BLOKLEN]; + buffer[1] = buffer[BLOKLEN+1]; + buffer[2] = buffer[BLOKLEN+2]; + buffer[3] = buffer[BLOKLEN+3]; + pos -= BLOKLEN; + } + curNode = first; + + if(next == (1<BLOKLEN) { + buffer[-1] = BLOKLEN; + fwrite(buffer-1, 1, BLOKLEN+1, fout); + buffer[0] = buffer[BLOKLEN]; + buffer[1] = buffer[BLOKLEN+1]; + buffer[2] = buffer[BLOKLEN+2]; + buffer[3] = buffer[BLOKLEN+3]; + pos -= BLOKLEN; + } + next = cc+2; + cLength = (short) ((depth == 1)?3:depth+1); + } + } + + pos = AddCodeToBuffer(curNode->code, cLength, pos); + if(pos-buffer>BLOKLEN-3) { + buffer[-1] = BLOKLEN-3; + fwrite(buffer-1, 1, BLOKLEN-2, fout); + buffer[0] = buffer[BLOKLEN-3]; + buffer[1] = buffer[BLOKLEN-2]; + buffer[2] = buffer[BLOKLEN-1]; + buffer[3] = buffer[BLOKLEN]; + buffer[4] = buffer[BLOKLEN+1]; + pos -= BLOKLEN-3; + } + pos = AddCodeToBuffer(eoi, cLength, pos); + pos = AddCodeToBuffer(0x0, -1, pos); + buffer[-1] = (char) (pos-buffer); + + fwrite(buffer-1, pos-buffer+1, 1, fout); + free(buffer-1); free(first->node); free(baseNode); + buffer=NULL;first->node=NULL;baseNode=NULL; +#ifdef _WHGDBG + if (debugFlag) fprintf(stderr, "pixel count = %d; nodeCount = %d lookup nodes = %d\n", tel, nodecount, lookuptypes); +#endif + return; + +} + +void ClearTree(int cc, GifTree *root) +{ + int i; + GifTree *newNode, **xx; + +#ifdef _WHGDBG + if (debugFlag>1) fprintf(stderr, "Clear Tree cc= %d\n", cc); + if (debugFlag>1) fprintf(stderr, "nodeCount = %d lookup nodes = %d\n", nodecount, lookuptypes); +#endif + maxchainlen=0; lookuptypes = 1; + nodecount = 0; + nodeArray = root->node; + xx= nodeArray; + for (i = 0; i < noOfArrays; i++ ) { + memmove (xx, empty, 256*sizeof(GifTree **)); + xx += 256; + } + topNode = baseNode; + for(i=0; inode[i] = newNode = ++topNode; + newNode->nxt = NULL; + newNode->alt = NULL; + newNode->code = i; + newNode->ix = (unsigned char) i; + newNode->typ = TERMIN; + newNode->node = empty; + nodecount++; + } +} + +char *AddCodeToBuffer(int code, short n, char *buf) +{ + int mask; + + if(n<0) { + if(need<8) { + buf++; + *buf = 0x0; + } + need = 8; + return buf; + } + + while(n>=need) { + mask = (1<>need; + n -= need; + need = 8; + } + if(n) { + mask = (1< +#include + +#ifdef _USE_STRINGS_H +#include +#else +#include +#endif + +#ifdef _FOPEN_TXT_OR_BIN +#define WRIBIN "wb" +#define REATXT "rt" +#define REABIN "rb" +#else +/* Usually there is no need to distinguish between binary and txt */ +#define WRIBIN "w" +#define REATXT "r" +#define REABIN "r" +#endif + +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + +/* define constants and defaults */ + /* Default amount of inter-frame time */ +#define DEFAULT_TIME 10 + /* If set to 1, Netscape 'loop' code will be added by default */ +#define DEFAULT_LOOP 0 + /* If set to 1, use the colormaps from all images, not just the first */ +#define DEFAULT_USE_COLORMAP 0 + + /* Used in calculating the transparent color */ +#define TRANS_NONE 1 +#define TRANS_RGB 2 +#define TRANS_MAP 3 + +#define DISP_NONE 0 +#define DISP_NOT 1 +#define DISP_BACK 2 +#define DISP_PREV 3 +#define DEFAULT_DISPOSAL DISP_NONE + /* set default disposal method here to any of the DISP_XXXX values */ + +#define BIGSTRING 256 +#define MAXVAL 4100 /* maxval of lzw coding size */ +#define MAXVALP 4200 +#define TERMIN 'T' +#define LOOKUP 'L' +#define SEARCH 'S' +#define noOfArrays 20 +/* defines the amount of memory set aside in the encoding for the + * LOOKUP type nodes; for a 256 color GIF, the number of LOOKUP + * nodes will be <= noOfArrays, for a 128 color GIF the number of + * LOOKUP nodes will be <= 2 * noOfArrays, etc. */ + +/* define shorthand for various types */ +#define LONG int +#define ULONG unsigned int +#define BYTE char +#define UBYTE unsigned char +#define SHORT short +#define USHORT unsigned short +#define WORD short int +#define UWORD unsigned short int + +int chainlen = 0, maxchainlen = 0, nodecount = 0, lookuptypes = 0, nbits; + +short need = 8; + + + + +unsigned int debugFlag, verbose; +int count; + +/* definition of various structures */ +typedef struct Transparency { + int type; + UBYTE valid; + UBYTE map; + UBYTE red; + UBYTE green; + UBYTE blue; + } Transparency; + +typedef struct Global { + Transparency trans; + int left; + int top; + unsigned int time; + unsigned short disposal; + } Global; + +typedef struct GifScreenHdr { + int width; + int height; + UBYTE m; + UBYTE cres; + UBYTE pixbits; + UBYTE bc; + UBYTE aspect; + } GifScreenHdr; + +typedef union GifColor { + struct cmap { + UBYTE red; + UBYTE green; + UBYTE blue; + UBYTE pad; + } cmap; + ULONG pixel; + } GifColor; + +typedef struct GifImageHdr { + int left; + int top; + int width; + int height; + UBYTE m; + UBYTE i; + UBYTE pixbits; + UBYTE reserved; + } GifImageHdr; + +typedef struct GifTable { + UBYTE valid; + UBYTE data; + UBYTE first; + UBYTE res; + int last; + } GifTable; + +typedef struct GifTree { + char typ; /* terminating, lookup, or search */ + int code; /* the code to be output */ + UBYTE ix; /* the color map index */ + struct GifTree **node, *nxt, *alt; +} GifTree; + +GifTree *empty[256], GifRoot = {LOOKUP, 0, 0, empty, NULL, NULL}, +*topNode, *baseNode, **nodeArray, **lastArray; + +/* define inline functions */ +#define GifPutShort(i, fout) {fputc(i&0xff, fout); fputc(i>>8, fout);} +#define GifGetShort(fin) (Xgetc(fin) | Xgetc(fin)<<8) + +/* forward declaration of the functions */ +void CalcTrans(); +void GifAddToTable(); +void GifClearTable(); +void GifComment(); +void GifDecode(); +void GifEncode(); +ULONG GifGetCode(); +void GifGetNextEntry(); +void GifLoop(); +void GifReadFile(); +void GifScreenHeader(); +UBYTE *GifSendData(); +void ReadImageHeader(); +void SetOffset(); +void TheEnd(); +void TheEnd1(); +void Usage(); +void WriteImageHeader(); +UBYTE Xgetc(); +void ClearTree(int cc, GifTree *root); +char *AddCodeToBuffer(int code, short n, char *buf); diff --git a/tool/tilem-src/gui/gtk-compat.h b/tool/tilem-src/gui/gtk-compat.h new file mode 100644 index 0000000..f817781 --- /dev/null +++ b/tool/tilem-src/gui/gtk-compat.h @@ -0,0 +1,11 @@ +#if !GTK_CHECK_VERSION(2, 14, 0) +# define gtk_dialog_get_content_area(d) ((d)->vbox) +# define gtk_widget_get_window(w) ((w)->window) +# define gtk_selection_data_get_data(s) ((s)->data) +#endif +#if !GTK_CHECK_VERSION(2, 18, 0) +# define gtk_widget_get_allocation(w, a) (*(a) = (w)->allocation) +# define gtk_widget_get_visible(w) GTK_WIDGET_VISIBLE(w) +# define gtk_widget_set_can_default(w, v) g_object_set((w), "can-default", v, NULL) +# define gtk_widget_set_can_focus(w, v) g_object_set((w), "can-focus", v, NULL) +#endif diff --git a/tool/tilem-src/gui/gui.h b/tool/tilem-src/gui/gui.h new file mode 100644 index 0000000..0e48c2d --- /dev/null +++ b/tool/tilem-src/gui/gui.h @@ -0,0 +1,386 @@ +/* + * TilEm II + * + * Copyright (c) 2010-2011 Thibault Duponchelle + * Copyright (c) 2010-2011 Benjamin Moody + * + * 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 . + */ + +#include "animation.h" +#include "emulator.h" +#include "skinops.h" +#include "emuwin.h" +#include "debugger.h" + +#include "gtk-compat.h" + +/* This struture is a wrapper for VarEntry with additionnal informations used by tilem */ +typedef struct { + int model; + + VarEntry *ve; /* Original variable info retrieved + from calculator */ + int slot; /* Slot number */ + + /* Strings for display (UTF-8) */ + char *name_str; /* Variable name */ + char *type_str; /* Variable type */ + char *slot_str; /* Program slot */ + char *file_ext; /* Default file extension */ + char *filetype_desc; /* File format description */ + + int size; /* Variable size */ + gboolean archived; /* Is archived */ + gboolean can_group; /* Can be stored in group file */ + +} TilemVarEntry; + +/* Screenshot view (widgets and flags) */ +typedef struct _TilemScreenshotDialog { + TilemCalcEmulator *emu; + + GtkWidget* window; /* The window itself */ + + /* Buttons */ + GtkWidget* screenshot; /* Grab button */ + GtkWidget* record; /* Record button */ + GtkWidget* stop; /* Stop button */ + + /* Screenshot menu */ + GtkWidget* screenshot_preview_image; /* Review pixbuf */ + GtkWidget* ss_ext_combo; /* Combo box for file format */ + GtkWidget* ss_size_combo; /* Combo box for size */ + GtkWidget* width_spin; /* The width of the gif */ + GtkWidget* height_spin; /* The height of the gif */ + GtkWidget* grayscale_tb; /* Toggle Button for enabling/disabling grayscale */ + GtkWidget* animation_speed; /* A scale for the speed of the animation */ + GtkWidget* background_color; /* Color chooser : Color used for pixel-off */ + GtkWidget* foreground_color; /* Color chooser : Color used for pixel-on */ + + TilemAnimation *current_anim; + gboolean current_anim_grayscale; +} TilemScreenshotDialog; + +/* This struture is used by receive menu */ +typedef struct _TilemReceiveDialog { + TilemCalcEmulator *emu; + + GSList *vars; /* The list of vars */ + + GtkWidget* window; /* The window itself */ + + GtkWidget* treeview; /* The treeview to print the list of vars */ + GtkTreeModel* model; /* The model used by the treeview */ + + /* Radio buttons */ + GtkWidget* mode_box; + GtkWidget* multiple_rb; /* Write multiple files */ + GtkWidget* group_rb; /* Write a single group file */ + + gboolean refresh_pending; +} TilemReceiveDialog; + +/* Handle the ilp progress stuff */ +typedef struct _TilemLinkProgress { + TilemCalcEmulator *emu; + + GtkProgressBar* progress_bar; /* progress bar (total) */ + GtkLabel* title_lbl; + GtkLabel* status_lbl; + GtkWidget* window; +} TilemLinkProgress; + +#define LABEL_X_ALIGN 0.0 + + +/* ###### event.c ##### */ + +/* Dialog mesg */ +void show_about(); + +/* Launch the debugger */ +void launch_debugger(TilemEmulatorWindow *ewin); + +/* Button-press event */ +gboolean mouse_press_event(GtkWidget* w, GdkEventButton *event, gpointer data); + +/* Pointer-motion event */ +gboolean pointer_motion_event(GtkWidget* w, GdkEventMotion *event, gpointer data); + +/* Button-release event */ +gboolean mouse_release_event(GtkWidget* w, GdkEventButton *event, gpointer data); + +/* Key-press event */ +gboolean key_press_event(GtkWidget* w, GdkEventKey *event, gpointer data); + +/* Key-release event */ +gboolean key_release_event(GtkWidget* w, GdkEventKey *event, gpointer data); + +/* Pop up menu on main window */ +gboolean popup_menu_event(GtkWidget* w, gpointer data); + +/* Handle drag and drop */ +void drag_data_received(GtkWidget *win, GdkDragContext *dc, gint x, gint y, + GtkSelectionData *seldata, guint info, guint t, + gpointer data); + + +/* ###### emuwin.c ##### */ + +/* Display the lcd image into the terminal */ +void display_lcdimage_into_terminal(TilemEmulatorWindow *ewin); + +/* Redraw the screen with or without skin */ +void redraw_screen(TilemEmulatorWindow *ewin); + + +/* ##### preferences.c ##### */ + +/* Run preferences dialog. */ +void tilem_preferences_dialog(TilemEmulatorWindow *ewin); + + +/* ##### address.c ##### */ + +/* Convert address to a displayable string. */ +char * tilem_format_addr(TilemDebugger *dbg, dword addr, gboolean physical); + +/* Parse physical address expressed as page and offset. */ +gboolean tilem_parse_paged_addr(TilemDebugger *dbg, const char *pagestr, + const char *offsstr, dword *value); + +/* Parse an address or hex constant. If PHYSICAL is null, only a + logical address (simple hex value or symbol) is allowed. If + PHYSICAL is non-null, physical addresses in the form "PAGE:OFFSET" + are also allowed. *PHYSICAL will be set to true if the user + entered a physical address. */ +gboolean tilem_parse_addr(TilemDebugger *dbg, const char *string, + dword *value, gboolean *physical); + +/* Open a dialog box prompting the user to enter an address. PARENT + is the transient-for window; TITLE is the dialog's title; PROMPT is + a label for the input. */ +gboolean tilem_prompt_address(TilemDebugger *dbg, GtkWindow *parent, + const char *title, const char *prompt, + dword *value, gboolean physical, + gboolean usedefault); + + +/* ##### tool.c ##### */ + +/* Get model name (abbreviation) for a TilEm model ID. */ +const char * model_to_name(int model); + +/* Convert model name to a model ID. */ +int name_to_model(const char *name); + +/* Convert TilEm model ID to tifiles2 model ID. */ +CalcModel model_to_calcmodel(int model); + +/* Convert tifiles2 model ID to TilEm model ID. */ +int calcmodel_to_model(CalcModel model); + +/* Get model ID for a given file. */ +int file_to_model(const char *name); + +/* Get "base" model for file type support. */ +int model_to_base_model(int calc_model); + +/* Check if calc is compatible with given file type. */ +gboolean model_supports_file(int calc_model, int file_model); + +/* Create a frame around the given widget */ +GtkWidget* new_frame(const gchar* label, GtkWidget* contents); + +/* The popup to choose what kind of rom you are trying to load (at startup)*/ +char choose_rom_popup(GtkWidget *parent_window, const char *filename, char default_model); + +/* Convert UTF-8 to filename encoding. Use ASCII digits in place of + subscripts if necessary. If conversion fails utterly, fall back to + the UTF-8 name, which is broken but better than nothing. */ +char * utf8_to_filename(const char *utf8str); + +/* Convert UTF-8 to a subset of UTF-8 that is compatible with the + locale */ +char * utf8_to_restricted_utf8(const char *utf8str); + +/* Generate default filename (UTF-8) for a variable */ +char * get_default_filename(const TilemVarEntry *tve); + + +/* ##### config.c ##### */ + +/* Retrieve settings from configuration file. GROUP is the + configuration group; following arguments are a series of OPTION + strings, each followed by a pointer to a variable that will receive + the value. The list of options is terminated by NULL. + + Each OPTION is a string of the form "KEY/TYPE" or "KEY/TYPE=VALUE", + where KEY is the name of the configuration property, and TYPE is + either 'f' for a filename (char*), 's' for a UTF-8 string (char*), + 'i' for an integer (int), 'r' for a real number (double), or 'b' + for a boolean (int). + + VALUE, if specified, is the default value for the option if it has + not been defined by the user. If no VALUE is specified, the option + defaults to zero or NULL. + + Strings returned by this function must be freed by the caller + (using g_free().) */ +void tilem_config_get(const char *group, const char *option, ...) + G_GNUC_NULL_TERMINATED; + +/* Save settings to the configuration file. Arguments are a series of + option names, as above, each followed by the new value of the + option. The list is terminated by NULL. */ +void tilem_config_set(const char *group, const char *option, ...) + G_GNUC_NULL_TERMINATED; + + +/* ##### link.c ##### */ + +/* This structure is used to send a file (usually slot=-1, first=TRUE, last=TRUE)*/ +struct TilemSendFileInfo { + char *filename; + char *display_name; + int slot; + int first; + int last; + char *error_message; +}; + +/* This structure is used to receive a file */ +struct TilemReceiveFileInfo { + GSList *entries; + char* destination; + char *error_message; + gboolean output_tig; +}; + +/* Copy a TilemVarEntry structure */ +TilemVarEntry *tilem_var_entry_copy(const TilemVarEntry *tve); + +/* Free a previous allocated TilemVarEntry */ +void tilem_var_entry_free(TilemVarEntry *tve); + +/* Send a file to the calculator through the GUI. SLOT is the + destination program slot (for TI-81.) FIRST must be true if this + is the first variable in a series; LAST must be true if this is the + last in a series. */ +void tilem_link_send_file(TilemCalcEmulator *emu, const char *filename, + int slot, gboolean first, gboolean last); + +/* The effective send file function. If there's no good reason, use tilem_link_send_file instead. */ +gboolean send_file_main(TilemCalcEmulator *emu, gpointer data); + +/* Request directory listing. */ +void tilem_link_get_dirlist(TilemCalcEmulator *emu); + +/* Get the calc model as needed by ticalcs functions */ +int get_calc_model(TilemCalc *calc); + +/* Show error */ +void show_error(TilemCalcEmulator *emu, const char *title, const char *message); + +/* Receive a variable and write it to a file. */ +void tilem_link_receive_file(TilemCalcEmulator *emu, + const TilemVarEntry* varentry, + const char* destination); + +/* Receive a list of variables (GSList of TilemVarEntries) and save + them to a group file. */ +void tilem_link_receive_group(TilemCalcEmulator *emu, + GSList *entries, + const char *destination); + +/* Receive variables with names matching a pattern. PATTERN is a + glob-like pattern in UTF-8. Files will be written out to + DESTDIR. */ +void tilem_link_receive_matching(TilemCalcEmulator *emu, + const char *pattern, + const char *destdir); + + +/* ##### pbar.c ##### */ + +/* Create or update the progress bar */ +void progress_bar_update(TilemCalcEmulator* emu); + + + +/* ##### animatedgif.c ##### */ + +/* Save a TilemAnimation to a GIF file. */ +void tilem_animation_write_gif(TilemAnimation *anim, byte* palette, int palette_size, FILE *fp); + + +/* ##### gifencod.c ##### */ + +/* Encode gif data */ +void GifEncode(FILE *fout, unsigned char *pixels, int depth, int siz); + + +/* ##### screenshot.c ##### */ + +/* create the screenshot popup */ +void popup_screenshot_window(TilemEmulatorWindow* ewin); + +/* Take a single screenshot */ +void quick_screenshot(TilemEmulatorWindow *ewin); + + +/* ##### keybindings.c ##### */ + +/* Load the keybindings */ +void tilem_keybindings_init(TilemCalcEmulator* emu, const char* model); + + +/* ##### menu.c ##### */ + +/* Build the menu (do not print it) */ +void build_menu(TilemEmulatorWindow* ewin); + + +/* ##### sendfile.c ##### */ + +/* Load a list of files through the GUI. The list of filenames must + end with NULL. */ +void load_files(TilemEmulatorWindow *ewin, char **filenames); + +/* Load a list of files from the command line. Filenames may begin + with an optional slot designation. */ +void load_files_cmdline(TilemEmulatorWindow *ewin, char **filenames); + +/* Prompt user to load a file from PC to TI */ +void load_file_dialog(TilemEmulatorWindow *ewin); + + +/* ##### rcvmenu.c ##### */ + +/* Createe the popup dialog */ +void popup_receive_menu(TilemEmulatorWindow *ewin); + +/* Create a TilemReceiveDialog */ +TilemReceiveDialog* tilem_receive_dialog_new(TilemCalcEmulator *emu); + +/* Destroy a TilemReceiveDialog */ +void tilem_receive_dialog_free(TilemReceiveDialog *rcvdlg); + +/* Update TilemReceiveDialog with directory listing. VARLIST is a + GSList of TilemVarEntries; the dialog assumes ownership of this + list. Display the dialog if it's currently hidden. */ +void tilem_receive_dialog_update(TilemReceiveDialog *rcvdlg, + GSList *varlist); + diff --git a/tool/tilem-src/gui/icons.c b/tool/tilem-src/gui/icons.c new file mode 100644 index 0000000..b1818a4 --- /dev/null +++ b/tool/tilem-src/gui/icons.c @@ -0,0 +1,71 @@ +/* + * TilEm II + * + * Copyright (c) 2011 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "icons.h" +#include "files.h" + +static const char * const custom_icons[] = { + /* Disassembly icons */ + "tilem-disasm-pc", + "tilem-disasm-break", + "tilem-disasm-break-pc", + + /* Debugger actions */ + "tilem-db-step", + "tilem-db-step-over", + "tilem-db-finish" +}; + +/* Set up custom icons. */ +void init_custom_icons() +{ + GtkIconTheme *theme; + GtkIconFactory *factory; + GtkIconSet *set; + GtkIconSource *source; + char *path; + gsize i; + + path = get_shared_dir_path("icons", NULL); + if (path) { + theme = gtk_icon_theme_get_default(); + gtk_icon_theme_append_search_path(theme, path); + g_free(path); + } + + factory = gtk_icon_factory_new(); + for (i = 0; i < G_N_ELEMENTS(custom_icons); i++) { + set = gtk_icon_set_new(); + source = gtk_icon_source_new(); + gtk_icon_source_set_icon_name(source, custom_icons[i]); + gtk_icon_set_add_source(set, source); + gtk_icon_source_free(source); + gtk_icon_factory_add(factory, custom_icons[i], set); + gtk_icon_set_unref(set); + } + gtk_icon_factory_add_default(factory); + g_object_unref(factory); +} diff --git a/tool/tilem-src/gui/icons.h b/tool/tilem-src/gui/icons.h new file mode 100644 index 0000000..3096f4c --- /dev/null +++ b/tool/tilem-src/gui/icons.h @@ -0,0 +1,20 @@ +/* + * TilEm II + * + * Copyright (c) 2011 Benjamin Moody + * + * 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 . + */ + +void init_custom_icons(void); diff --git a/tool/tilem-src/gui/keybindings.c b/tool/tilem-src/gui/keybindings.c new file mode 100644 index 0000000..cbf4afd --- /dev/null +++ b/tool/tilem-src/gui/keybindings.c @@ -0,0 +1,255 @@ +/* + * TilEm II + * + * Copyright (c) 2010-2011 Thibault Duponchelle + * Copyright (c) 2010-2011 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include + +#include "gui.h" +#include "msgbox.h" +#include "files.h" + +/* Get the associated calculator key name */ +static int calc_key_from_name(const TilemCalc *calc, const char *name) +{ + int i; + + for (i = 0; i < 64; i++) + if (calc->hw.keynames[i] + && !strcmp(calc->hw.keynames[i], name)) + return i + 1; + + /* kludge: accept aliases for a few keys */ + for (i = 0; i < 64; i++) { + if (!calc->hw.keynames[i]) + continue; + + if (!strcmp(name, "Matrix") + && !strcmp(calc->hw.keynames[i], "Apps")) + return i + 1; + if (!strcmp(name, "Apps") + && !strcmp(calc->hw.keynames[i], "AppsMenu")) + return i + 1; + if (!strcmp(name, "List") + && !strcmp(calc->hw.keynames[i], "StatEd")) + return i + 1; + if (!strcmp(name, "Power") + && !strcmp(calc->hw.keynames[i], "Expon")) + return i + 1; + if (!strcmp(name, "Stat") + && !strcmp(calc->hw.keynames[i], "Table")) + return i + 1; + } + + return 0; +} + +/* Parse a line of the group (model) in the keybindings file */ +static gboolean parse_binding(TilemKeyBinding *kb, + const char *pckeys, const char *tikeys, + const TilemCalc *calc) +{ + const char *p; + char *s; + int n, k; + + kb->modifiers = 0; + kb->keysym = 0; + kb->nscancodes = 0; + kb->scancodes = NULL; + + /* Parse modifiers */ + + while ((p = strchr(pckeys, '+'))) { + s = g_strndup(pckeys, p - pckeys); + g_strstrip(s); + if (!g_ascii_strcasecmp(s, "ctrl") + || !g_ascii_strcasecmp(s, "control")) + kb->modifiers |= GDK_CONTROL_MASK; + else if (!g_ascii_strcasecmp(s, "shift")) + kb->modifiers |= GDK_SHIFT_MASK; + else if (!g_ascii_strcasecmp(s, "alt") + || !g_ascii_strcasecmp(s, "mod1")) + kb->modifiers |= GDK_MOD1_MASK; + else if (!g_ascii_strcasecmp(s, "mod2")) + kb->modifiers |= GDK_MOD2_MASK; + else if (!g_ascii_strcasecmp(s, "mod3")) + kb->modifiers |= GDK_MOD3_MASK; + else if (!g_ascii_strcasecmp(s, "mod4")) + kb->modifiers |= GDK_MOD4_MASK; + else if (!g_ascii_strcasecmp(s, "mod5")) + kb->modifiers |= GDK_MOD5_MASK; + else if (!g_ascii_strcasecmp(s, "lock") + || !g_ascii_strcasecmp(s, "capslock")) + kb->modifiers |= GDK_LOCK_MASK; + else { + g_free(s); + return FALSE; + } + g_free(s); + pckeys = p + 1; + } + + /* Parse keysym */ + + s = g_strstrip(g_strdup(pckeys)); + kb->keysym = gdk_keyval_from_name(s); + g_free(s); + if (!kb->keysym) + return FALSE; + + /* Parse calculator keys */ + + /* FIXME: allow combinations of simultaneous keys (separated + by '+'); current TilemKeyBinding struct doesn't provide for + this */ + + n = 0; + do { + if ((p = strchr(tikeys, ','))) + s = g_strndup(tikeys, p - tikeys); + else + s = g_strdup(tikeys); + g_strstrip(s); + + k = calc_key_from_name(calc, s); + g_free(s); + + if (!k) { + g_free(kb->scancodes); + kb->scancodes = NULL; + return FALSE; + } + + kb->nscancodes++; + if (kb->nscancodes >= n) { + n = kb->nscancodes * 2; + kb->scancodes = g_renew(byte, kb->scancodes, n); + } + kb->scancodes[kb->nscancodes - 1] = k; + + tikeys = (p ? p + 1 : NULL); + } while (tikeys); + + return TRUE; +} + +/* Parse a group (model) in the keybindings file */ +static void parse_binding_group(TilemCalcEmulator *emu, GKeyFile *gkf, + const char *group, int maxdepth) +{ + gchar **keys, **groups; + char *k, *v; + int i, n; + + keys = g_key_file_get_keys(gkf, group, NULL, NULL); + if (!keys) { + printf("no bindings for %s\n", group); + return; + } + + for (i = 0; keys[i]; i++) + ; + + n = emu->nkeybindings; + emu->keybindings = g_renew(TilemKeyBinding, emu->keybindings, n + i); + + for(i = 0; keys[i]; i++) { + k = keys[i]; + if (!strcmp(k, "INHERIT")) + continue; + + v = g_key_file_get_value(gkf, group, k, NULL); + if (!v) + continue; + + if (parse_binding(&emu->keybindings[n], k, v, emu->calc)) + n++; + else + g_printerr("syntax error in key bindings: '%s=%s'\n", + k, v); + g_free(v); + } + + emu->nkeybindings = n; + + g_strfreev(keys); + + /* Include all bindings from groups marked as INHERIT */ + + if (maxdepth == 0) + return; + + groups = g_key_file_get_string_list(gkf, group, "INHERIT", + NULL, NULL); + for (i = 0; groups && groups[i]; i++) + parse_binding_group(emu, gkf, groups[i], maxdepth - 1); + g_strfreev(groups); + +} + +/* Init the keybindings struct and open the keybindings file */ +void tilem_keybindings_init(TilemCalcEmulator *emu, const char *model) +{ + char *kfname = get_shared_file_path("keybindings.ini", NULL); + char *dname; + GKeyFile *gkf; + GError *err = NULL; + + g_return_if_fail(emu != NULL); + g_return_if_fail(emu != NULL); + g_return_if_fail(emu->calc != NULL); + + if (kfname == NULL) { + messagebox00(NULL, GTK_MESSAGE_ERROR, + "Unable to load key bindings", + "The file keybindings.ini could not be found." + " TilEm may not have been installed correctly."); + return; + } + + gkf = g_key_file_new(); + if (!g_key_file_load_from_file(gkf, kfname, 0, &err)) { + dname = g_filename_display_name(kfname); + messagebox02(NULL, GTK_MESSAGE_ERROR, + "Unable to load key bindings", + "An error occurred while reading %s: %s", + dname, err->message); + g_error_free(err); + g_free(dname); + g_free(kfname); + return; + } + + g_free(emu->keybindings); + emu->keybindings = NULL; + emu->nkeybindings = 0; + + parse_binding_group(emu, gkf, model, 5); + + g_key_file_free(gkf); + g_free(kfname); +} diff --git a/tool/tilem-src/gui/keypaddlg.c b/tool/tilem-src/gui/keypaddlg.c new file mode 100644 index 0000000..e099d20 --- /dev/null +++ b/tool/tilem-src/gui/keypaddlg.c @@ -0,0 +1,305 @@ +/* + * TilEm II + * + * Copyright (c) 2011 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include + +#include "gui.h" + +#define NGROUPS 7 +#define NKEYS 8 + +/* Check-button toggled */ +static void group_toggled(GtkToggleButton *btn, gpointer data) +{ + TilemKeypadDialog *kpdlg = data; + TilemCalcEmulator *emu; + int i; + gboolean state; + + if (kpdlg->refreshing) + return; + + g_return_if_fail(kpdlg->dbg != NULL); + g_return_if_fail(kpdlg->dbg->emu != NULL); + emu = kpdlg->dbg->emu; + + state = gtk_toggle_button_get_active(btn); + + for (i = 0; i < NGROUPS; i++) { + if (GTK_WIDGET(btn) == kpdlg->output[i]) { + tilem_calc_emulator_lock(emu); + if (state) + emu->calc->keypad.group &= ~(1 << i); + else + emu->calc->keypad.group |= (1 << i); + tilem_calc_emulator_unlock(emu); + + tilem_keypad_dialog_refresh(kpdlg); + return; + } + } + + g_return_if_reached(); +} + +/* Key toggled */ +static void key_toggled(GtkToggleButton *btn, gpointer data) +{ + TilemKeypadDialog *kpdlg = data; + TilemCalcEmulator *emu; + int i, j, k; + gboolean state; + + if (kpdlg->refreshing) + return; + + g_return_if_fail(kpdlg->dbg != NULL); + g_return_if_fail(kpdlg->dbg->emu != NULL); + emu = kpdlg->dbg->emu; + + state = gtk_toggle_button_get_active(btn); + + for (i = 0; i < NGROUPS; i++) { + for (j = 0; j < NKEYS; j++) { + if (GTK_WIDGET(btn) == kpdlg->keys[i][j]) { + k = i * 8 + j + 1; + if (state) + tilem_calc_emulator_press_key(emu, k); + else + tilem_calc_emulator_release_key(emu, k); + return; + } + } + } + + g_return_if_reached(); +} + +/* Create a new TilemKeypadDialog. */ +TilemKeypadDialog *tilem_keypad_dialog_new(TilemDebugger *dbg) +{ + TilemKeypadDialog *kpdlg; + GtkWidget *tbl1, *tbl2, *hbox, *vbox, *btn, *lbl; + int i, j; + char buf[20]; + + g_return_val_if_fail(dbg != NULL, NULL); + + kpdlg = g_slice_new0(TilemKeypadDialog); + kpdlg->dbg = dbg; + + kpdlg->window = gtk_dialog_new_with_buttons + ("Keypad", NULL, 0, + GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, + NULL); + + g_signal_connect(kpdlg->window, "delete-event", + G_CALLBACK(gtk_widget_hide_on_delete), NULL); + + tbl1 = gtk_table_new(NGROUPS, NKEYS, TRUE); + hbox = gtk_hbox_new(TRUE, 0); + vbox = gtk_vbox_new(TRUE, 0); + + /* Keypad buttons (labels will be filled in, and buttons + shown/hidden, by tilem_keypad_dialog_calc_changed()) + + Buttons are displayed right to left, top to bottom; this + way, the layout of groups 1-5 roughly corresponds to the + physical layout of the keys, and the "input" value can be + read across the bottom as a binary number. */ + + for (i = 0; i < NGROUPS; i++) { + for (j = 0; j < NKEYS; j++) { + btn = gtk_toggle_button_new_with_label(""); + kpdlg->keys[i][j] = btn; + gtk_table_attach(GTK_TABLE(tbl1), btn, + NKEYS - j - 1, NKEYS - j, + i, i + 1, + GTK_FILL, GTK_FILL, 2, 2); + + g_signal_connect(btn, "toggled", + G_CALLBACK(key_toggled), kpdlg); + + gtk_widget_set_no_show_all(btn, TRUE); + } + } + + /* Check buttons for key groups (output bits) */ + + for (i = 0; i < NGROUPS; i++) { + g_snprintf(buf, sizeof(buf), "Group %d", i); + btn = gtk_check_button_new_with_label(buf); + kpdlg->output[i] = btn; + gtk_box_pack_start(GTK_BOX(vbox), btn, FALSE, TRUE, 2); + + g_signal_connect(btn, "toggled", + G_CALLBACK(group_toggled), kpdlg); + } + + /* Labels for input bits */ + + for (j = NKEYS - 1; j >= 0; j--) { + kpdlg->input[j] = lbl = gtk_label_new(""); + gtk_box_pack_start(GTK_BOX(hbox), lbl, FALSE, TRUE, 2); + } + + tbl2 = gtk_table_new(3, 2, FALSE); + gtk_container_set_border_width(GTK_CONTAINER(tbl2), 6); + gtk_table_set_row_spacings(GTK_TABLE(tbl2), 12); + gtk_table_set_col_spacings(GTK_TABLE(tbl2), 12); + + lbl = gtk_label_new(NULL); + gtk_label_set_markup(GTK_LABEL(lbl), "Scan Groups"); + gtk_table_attach(GTK_TABLE(tbl2), lbl, 0, 1, 0, 1, + GTK_FILL, GTK_FILL, 0, 0); + + lbl = gtk_label_new(NULL); + gtk_label_set_markup(GTK_LABEL(lbl), "Keys"); + gtk_table_attach(GTK_TABLE(tbl2), lbl, 1, 2, 0, 1, + GTK_FILL, GTK_FILL, 0, 0); + + lbl = gtk_label_new("Input Value:"); + gtk_table_attach(GTK_TABLE(tbl2), lbl, 0, 1, 2, 3, + GTK_FILL, GTK_FILL, 0, 0); + + gtk_table_attach(GTK_TABLE(tbl2), vbox, 0, 1, 1, 2, + GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(tbl2), tbl1, 1, 2, 1, 2, + GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(tbl2), hbox, 1, 2, 2, 3, + GTK_FILL, GTK_FILL, 0, 0); + + gtk_widget_show_all(tbl2); + + vbox = gtk_dialog_get_content_area(GTK_DIALOG(kpdlg->window)); + gtk_box_pack_start(GTK_BOX(vbox), tbl2, FALSE, FALSE, 0); + + tilem_keypad_dialog_calc_changed(kpdlg); + + return kpdlg; +} + +/* Free a TilemKeypadDialog. */ +void tilem_keypad_dialog_free(TilemKeypadDialog *kpdlg) +{ + g_return_if_fail(kpdlg != NULL); + if (kpdlg->window) + gtk_widget_destroy(kpdlg->window); + g_slice_free(TilemKeypadDialog, kpdlg); +} + +/* New calculator loaded. */ +void tilem_keypad_dialog_calc_changed(TilemKeypadDialog *kpdlg) +{ + TilemCalc *calc; + int i, j, k; + GtkWidget *btn, *lbl; + + g_return_if_fail(kpdlg != NULL); + g_return_if_fail(kpdlg->dbg != NULL); + g_return_if_fail(kpdlg->dbg->emu != NULL); + g_return_if_fail(kpdlg->dbg->emu->calc != NULL); + calc = kpdlg->dbg->emu->calc; + + for (i = 0; i < NGROUPS; i++) { + for (j = 0; j < NKEYS; j++) { + btn = kpdlg->keys[i][j]; + k = i * 8 + j + 1; + if (k != TILEM_KEY_ON + && calc->hw.keynames[k - 1] != NULL) { + lbl = gtk_bin_get_child(GTK_BIN(btn)); + gtk_label_set_text(GTK_LABEL(lbl), + calc->hw.keynames[k - 1]); + gtk_widget_show(btn); + } + else { + gtk_widget_hide(btn); + } + } + } + + tilem_keypad_dialog_refresh(kpdlg); +} + +/* Refresh key states. */ +void tilem_keypad_dialog_refresh(TilemKeypadDialog *kpdlg) +{ + int i, j; + byte keys[NGROUPS], inval, outval; + TilemCalcEmulator *emu; + GtkWidget *btn, *lbl; + + g_return_if_fail(kpdlg != NULL); + g_return_if_fail(kpdlg->dbg != NULL); + g_return_if_fail(kpdlg->dbg->emu != NULL); + emu = kpdlg->dbg->emu; + + if (kpdlg->refreshing) + return; + + kpdlg->refreshing = TRUE; + + tilem_calc_emulator_lock(emu); + for (i = 0; i < NGROUPS; i++) + keys[i] = emu->calc->keypad.keysdown[i]; + outval = emu->calc->keypad.group; + inval = tilem_keypad_read_keys(emu->calc); + tilem_calc_emulator_unlock(emu); + + for (i = 0; i < NGROUPS; i++) { + for (j = 0; j < NKEYS; j++) { + btn = kpdlg->keys[i][j]; + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(btn), + (keys[i] & (1 << j))); + } + } + + + for (i = 0; i < NGROUPS; i++) { + btn = kpdlg->output[i]; + if (emu->paused) { + gtk_widget_set_sensitive(btn, TRUE); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(btn), + !(outval & (1 << i))); + } + else { + gtk_widget_set_sensitive(btn, FALSE); + } + } + + for (j = 0; j < NKEYS; j++) { + lbl = kpdlg->input[j]; + gtk_label_set_text(GTK_LABEL(lbl), + (emu->paused + ? (inval & (1 << j) ? "1" : "0") + : "")); + + } + + kpdlg->refreshing = FALSE; +} diff --git a/tool/tilem-src/gui/link.c b/tool/tilem-src/gui/link.c new file mode 100644 index 0000000..6a3ecc6 --- /dev/null +++ b/tool/tilem-src/gui/link.c @@ -0,0 +1,1301 @@ +/* + * TilEm II + * + * Copyright (c) 2010-2011 Thibault Duponchelle + * Copyright (c) 2010-2011 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gui.h" +#include "emucore.h" +#include "ti81prg.h" +#include "msgbox.h" + +/**************** Internal link emulation ****************/ + +/* Open cable */ +static int ilp_open(CableHandle* cbl) +{ + TilemCalcEmulator* emu = cbl->priv; + + tilem_em_lock(emu); + + if (emu->ilp_active) { + fprintf(stderr, "INTERNAL ERROR: cable already opened\n"); + tilem_em_unlock(emu); + return 1; + } + + emu->ilp_active = TRUE; + tilem_linkport_graylink_reset(emu->calc); + tilem_em_unlock(emu); + return 0; +} + +/* Close cable */ +static int ilp_close(CableHandle* cbl) +{ + TilemCalcEmulator* emu = cbl->priv; + + tilem_em_lock(emu); + + if (!emu->ilp_active) { + fprintf(stderr, "INTERNAL ERROR: cable already closed\n"); + tilem_em_unlock(emu); + return 1; + } + + emu->ilp_active = FALSE; + emu->calc->linkport.linkemu = TILEM_LINK_EMULATOR_NONE; + tilem_linkport_graylink_reset(emu->calc); + tilem_em_unlock(emu); + return 0; +} + +/* Reset cable */ +static int ilp_reset(CableHandle* cbl) +{ + TilemCalcEmulator* emu = cbl->priv; + + tilem_em_lock(emu); + tilem_linkport_graylink_reset(emu->calc); + tilem_em_unlock(emu); + return 0; +} + +/* Send data to calc */ +static int ilp_send(CableHandle* cbl, uint8_t* data, uint32_t count) +{ + TilemCalcEmulator* emu = cbl->priv; + int timeout = cbl->timeout * 100000; + + tilem_em_lock(emu); + while (count > 0) { + if (tilem_em_send_byte(emu, data[0], timeout, TRUE)) { + tilem_em_unlock(emu); + return ERROR_WRITE_TIMEOUT; + } + data++; + count--; + } + tilem_em_unlock(emu); + return 0; +} + +/* cool-down period required after receiving and before sending */ +#define COOLDOWN 10000 + +/* Receive data from calc */ +static int ilp_recv(CableHandle* cbl, uint8_t* data, uint32_t count) +{ + TilemCalcEmulator* emu = cbl->priv; + int timeout = cbl->timeout * 100000; + int value; + + tilem_em_lock(emu); + while (count > 0) { + value = tilem_em_get_byte(emu, timeout, TRUE); + if (value < 0) { + tilem_em_unlock(emu); + return ERROR_READ_TIMEOUT; + } + data[0] = value; + data++; + count--; + } + tilem_em_delay(emu, COOLDOWN, TRUE); + tilem_em_unlock(emu); + return 0; +} + +/* Check if ready */ +static int ilp_check(CableHandle* cbl, int* status) +{ + TilemCalcEmulator* emu = cbl->priv; + + tilem_em_lock(emu); + + *status = STATUS_NONE; + if (emu->calc->linkport.lines) + *status |= STATUS_RX; + if (emu->calc->linkport.extlines) + *status |= STATUS_TX; + + tilem_em_unlock(emu); + return 0; +} + +/* Open a cable */ +static CableHandle* internal_link_handle_new(TilemCalcEmulator* emu) +{ + CableHandle* cbl; + + cbl = ticables_handle_new(CABLE_ILP, PORT_0); + if (!cbl) + return NULL; + + cbl->priv = emu; + cbl->cable->open = ilp_open; + cbl->cable->close = ilp_close; + cbl->cable->reset = ilp_reset; + cbl->cable->send = ilp_send; + cbl->cable->recv = ilp_recv; + cbl->cable->check = ilp_check; + + return cbl; +} + +/**************** Automatic link menu ****************/ + +/* Run a key (wait, press, wait; release; wait) */ +static void run_with_key(TilemCalcEmulator* emu, int key) +{ + tilem_em_delay(emu, 50000, TRUE); + tilem_keypad_press_key(emu->calc, key); + tilem_em_delay(emu, 50000, TRUE); + tilem_keypad_release_key(emu->calc, key); + tilem_em_delay(emu, 50000, TRUE); +} + +/* Automatically press key to be in the receive mode (ti82 and ti85) */ +static void prepare_for_link_send(TilemCalcEmulator* emu) +{ + tilem_em_lock(emu); + tilem_em_wake_up(emu, TRUE); + if (emu->calc->hw.model_id == TILEM_CALC_TI82) { + run_with_key(emu, TILEM_KEY_2ND); + run_with_key(emu, TILEM_KEY_MODE); + run_with_key(emu, TILEM_KEY_2ND); + run_with_key(emu, TILEM_KEY_GRAPHVAR); + run_with_key(emu, TILEM_KEY_RIGHT); + run_with_key(emu, TILEM_KEY_ENTER); + } + else if (emu->calc->hw.model_id == TILEM_CALC_TI85) { + run_with_key(emu, TILEM_KEY_MODE); + run_with_key(emu, TILEM_KEY_MODE); + run_with_key(emu, TILEM_KEY_MODE); + run_with_key(emu, TILEM_KEY_2ND); + run_with_key(emu, TILEM_KEY_GRAPHVAR); + run_with_key(emu, TILEM_KEY_WINDOW); + } + tilem_em_unlock(emu); +} + +/* Automatically press key to be in the send mode (ti82 and ti85) */ +static void prepare_for_link_receive(TilemCalcEmulator *emu) +{ + tilem_em_lock(emu); + tilem_em_wake_up(emu, TRUE); + if (emu->calc->hw.model_id == TILEM_CALC_TI82) { + run_with_key(emu, TILEM_KEY_2ND); + run_with_key(emu, TILEM_KEY_MODE); + run_with_key(emu, TILEM_KEY_2ND); + run_with_key(emu, TILEM_KEY_GRAPHVAR); + run_with_key(emu, TILEM_KEY_ENTER); + tilem_em_delay(emu, 10000000, TRUE); + run_with_key(emu, TILEM_KEY_RIGHT); + run_with_key(emu, TILEM_KEY_ENTER); + } + else if (emu->calc->hw.model_id == TILEM_CALC_TI85) { + run_with_key(emu, TILEM_KEY_MODE); + run_with_key(emu, TILEM_KEY_MODE); + run_with_key(emu, TILEM_KEY_MODE); + run_with_key(emu, TILEM_KEY_2ND); + run_with_key(emu, TILEM_KEY_GRAPHVAR); + run_with_key(emu, TILEM_KEY_YEQU); + run_with_key(emu, TILEM_KEY_GRAPH); + tilem_em_delay(emu, 10000000, TRUE); + run_with_key(emu, TILEM_KEY_ZOOM); + tilem_em_delay(emu, 10000000, TRUE); + run_with_key(emu, TILEM_KEY_YEQU); + } + tilem_em_unlock(emu); +} + +/**************** Calc handle ****************/ + +static GStaticPrivate current_emu_key = G_STATIC_PRIVATE_INIT; + +/* ticalcs progress bar callback */ +static void pbar_do_update() +{ + TilemCalcEmulator *emu = g_static_private_get(¤t_emu_key); + CalcUpdate *upd = emu->link_update; + gdouble frac; + + if (upd->max1 > 0 && upd->max2 > 0) + frac = ((gdouble) upd->cnt1 / upd->max1 + upd->cnt2) / upd->max2; + else if (upd->max1 > 0) + frac = ((gdouble) upd->cnt1 / upd->max1); + else if (upd->max2 > 0) + frac = ((gdouble) upd->cnt2 / upd->max2); + else + frac = -1.0; + + tilem_em_set_progress(emu, frac, upd->text); +} + +/* Get the calc model (compatible for ticalcs) */ +int get_calc_model(TilemCalc *calc) +{ + return model_to_calcmodel(calc->hw.model_id); +} + +/* Create a calc handle */ +void begin_link(TilemCalcEmulator *emu, CableHandle **cbl, CalcHandle **ch, + const char *title) +{ + tilem_em_unlock(emu); + + *cbl = internal_link_handle_new(emu); + + emu->link_update->max1 = 0; + emu->link_update->max2 = 0; + emu->link_update->text[0] = 0; + + emu->link_update->pbar = &pbar_do_update; + emu->link_update->label = &pbar_do_update; + + g_static_private_set(¤t_emu_key, emu, NULL); + + tilem_em_set_progress_title(emu, title); + + *ch = ticalcs_handle_new(get_calc_model(emu->calc)); + if (!*ch) { + g_critical("unsupported calc"); + return; + } + + ticalcs_update_set(*ch, emu->link_update); + ticalcs_cable_attach(*ch, *cbl); +} + +/* Destroy calc handle */ +void end_link(TilemCalcEmulator *emu, CableHandle *cbl, CalcHandle *ch) +{ + tilem_em_set_progress_title(emu, NULL); + + ticalcs_cable_detach(ch); + ticalcs_handle_del(ch); + ticables_handle_del(cbl); + + tilem_em_lock(emu); +} + +/**************** Error messages ****************/ + +static char * get_tilibs_error(int errcode) +{ + char *p = NULL; + + if (!ticalcs_error_get(errcode, &p) + || !ticables_error_get(errcode, &p) + || !tifiles_error_get(errcode, &p)) + return p; + else + return g_strdup_printf("Unknown error (%d)", errcode); +} + +static char * get_ti81_error(int errcode) +{ + switch (errcode) { + case TI81_ERR_FILE_IO: + return g_strdup("File I/O error"); + + case TI81_ERR_INVALID_FILE: + return g_strdup("Not a valid PRG file"); + + case TI81_ERR_MEMORY: + return g_strdup("The calculator does not have enough free memory" + " to load the program."); + + case TI81_ERR_SLOTS_FULL: + return g_strdup("All calculator program slots are in use. " + " You must delete an existing program before" + " loading a new program."); + + case TI81_ERR_BUSY: + return g_strdup("The calculator is currently busy. Please" + " exit to the home screen before loading" + " programs."); + + default: + return g_strdup_printf("Unknown error code (%d)", errcode); + } +} + +void show_error(TilemCalcEmulator *emu, + const char *title, const char *message) +{ + if (emu->ewin) + messagebox11(emu->ewin->window, GTK_MESSAGE_ERROR, + "%s", title, "%s", message); + else + g_printerr("\n=== %s ===\n%s\n\n", title, message); +} + +/**************** Sending files ****************/ + +/* Send a file to TI-81 */ +static gboolean send_file_ti81(TilemCalcEmulator *emu, struct TilemSendFileInfo *sf) +{ + TI81Program *prgm = NULL; + FILE *f; + int errnum; + sf->error_message = NULL; + + f = g_fopen(sf->filename, "rb"); + if (!f) { + sf->error_message = g_strdup_printf + ("Failed to open %s for reading: %s", + sf->display_name, g_strerror(errno)); + return FALSE; + } + + if (ti81_read_prg_file(f, &prgm)) { + sf->error_message = g_strdup_printf + ("The file %s is not a valid TI-81 program file.", + sf->display_name); + fclose(f); + return FALSE; + } + + fclose(f); + + tilem_em_wake_up(emu, TRUE); + + prgm->info.slot = sf->slot; + errnum = ti81_load_program(emu->calc, prgm); + ti81_program_free(prgm); + + if (errnum && !emu->task_abort) + sf->error_message = get_ti81_error(errnum); + return (errnum == 0); +} + +/* Get application name */ +static gboolean get_app_name(const FlashContent *flashc, char *name) +{ + int i; + const unsigned char *data; + unsigned int type, length; + + if (flashc->num_pages < 1 || flashc->pages[0]->size < 6 + || flashc->pages[0]->data[0] != 0x80 + || flashc->pages[0]->data[1] != 0x0f) + return FALSE; + + i = 6; + data = flashc->pages[0]->data; + while (i < flashc->pages[0]->size && i < 128) { + type = (data[i] << 8 | (data[i + 1] & 0xf0)); + length = data[i + 1] & 0x0f; + i += 2; + + if (length == 0x0d) { + length = data[i]; + i++; + } + else if (length == 0x0e) { + length = (data[i] << 8 | data[i + 1]); + i += 2; + } + else if (length == 0x0f) { + return FALSE; + } + + if (type == 0x8070) + return FALSE; + + if (type == 0x8040) { + memcpy(name, data + i, length > 8 ? 8 : length); + return TRUE; + } + } + return FALSE; +} + +/* Try to delete an existing Flash app before we send a replacement */ +static void try_delete_app(CalcHandle *ch, const FlashContent *flashc) +{ + VarRequest vr; + + /* TI-73 does not support remote deletion */ + if (ch->model == CALC_TI73) + return; + + memset(&vr, 0, sizeof(VarRequest)); + if (!get_app_name(flashc, vr.name)) + return; + + /* Why does this use type 0x14 and not 0x24? I don't know. */ + vr.type = 0x14; + ticalcs_calc_del_var(ch, &vr); + /* if an error occurs, ignore it */ +} + +/* Send a file using ticalcs2 */ +static gboolean send_file_linkport(TilemCalcEmulator *emu, struct TilemSendFileInfo *sf) +{ + CalcModel model; + FileClass cls; + CableHandle *cbl; + CalcHandle *ch; + FileContent *filec; + BackupContent *backupc; + FlashContent *flashc; + TigContent *tigc; + CalcMode mode; + int e; + char *desc; + + model = get_calc_model(emu->calc); + cls = tifiles_file_get_class(sf->filename); + + desc = g_strdup_printf("Sending %s", sf->display_name); + + /* Read input file */ + + switch (cls) { + case TIFILE_SINGLE: + case TIFILE_GROUP: + case TIFILE_REGULAR: + filec = tifiles_content_create_regular(model); + e = tifiles_file_read_regular(sf->filename, filec); + if (!e) { + begin_link(emu, &cbl, &ch, desc); + if (sf->first) + prepare_for_link_send(emu); + mode = (sf->last ? MODE_SEND_LAST_VAR : MODE_NORMAL); + e = ticalcs_calc_send_var(ch, mode, filec); + end_link(emu, cbl, ch); + } + tifiles_content_delete_regular(filec); + break; + + case TIFILE_BACKUP: + backupc = tifiles_content_create_backup(model); + e = tifiles_file_read_backup(sf->filename, backupc); + if (!e) { + begin_link(emu, &cbl, &ch, desc); + prepare_for_link_send(emu); + e = ticalcs_calc_send_backup(ch, backupc); + end_link(emu, cbl, ch); + } + tifiles_content_delete_backup(backupc); + break; + + case TIFILE_FLASH: + case TIFILE_OS: + case TIFILE_APP: + flashc = tifiles_content_create_flash(model); + e = tifiles_file_read_flash(sf->filename, flashc); + if (!e) { + begin_link(emu, &cbl, &ch, desc); + ticables_options_set_timeout(cbl, 30 * 10); + prepare_for_link_send(emu); + if (tifiles_file_is_os(sf->filename)) + e = ticalcs_calc_send_os(ch, flashc); + else if (tifiles_file_is_app(sf->filename)) { + try_delete_app(ch, flashc); + e = ticalcs_calc_send_app(ch, flashc); + } + else + e = ticalcs_calc_send_cert(ch, flashc); + end_link(emu, cbl, ch); + } + tifiles_content_delete_flash(flashc); + break; + + case TIFILE_TIGROUP: + tigc = tifiles_content_create_tigroup(model, 0); + e = tifiles_file_read_tigroup(sf->filename, tigc); + if (!e) { + begin_link(emu, &cbl, &ch, desc); + prepare_for_link_send(emu); + e = ticalcs_calc_send_tigroup(ch, tigc, TIG_ALL); + end_link(emu, cbl, ch); + } + tifiles_content_delete_tigroup(tigc); + break; + + default: + g_free(desc); + sf->error_message = g_strdup_printf + ("The file %s is not a valid program or" + " variable file.", + sf->display_name); + return FALSE; + } + + g_free(desc); + if (e && !emu->task_abort) + sf->error_message = get_tilibs_error(e); + return (e == 0); +} + +gboolean send_file_main(TilemCalcEmulator *emu, gpointer data) +{ + struct TilemSendFileInfo *sf = data; + /*emu->ilp.finished_cond = g_cond_new(); */ + + if (emu->calc->hw.model_id == TILEM_CALC_TI81) + return send_file_ti81(emu, sf); + else + return send_file_linkport(emu, sf); +} + +static void send_file_finished(TilemCalcEmulator *emu, gpointer data, + gboolean cancelled) +{ + struct TilemSendFileInfo *sf = data; + + if (sf->error_message && !cancelled) + show_error(emu, "Unable to send file", sf->error_message); + + g_free(sf->filename); + g_free(sf->display_name); + g_free(sf->error_message); + g_slice_free(struct TilemSendFileInfo, sf); + + /*g_cond_broadcast(emu->ilp.finished_cond);*/ + + +} + +void tilem_link_send_file(TilemCalcEmulator *emu, const char *filename, + int slot, gboolean first, gboolean last) +{ + struct TilemSendFileInfo *sf; + + sf = g_slice_new0(struct TilemSendFileInfo); + sf->filename = g_strdup(filename); + sf->display_name = g_filename_display_basename(filename); + sf->slot = slot; + sf->first = first; + sf->last = last; + + tilem_calc_emulator_begin(emu, &send_file_main, + &send_file_finished, sf); +} + +/**************** Get directory listing ****************/ + +/* Make a copy of a TilemVarEntry */ +TilemVarEntry *tilem_var_entry_copy(const TilemVarEntry *tve) +{ + TilemVarEntry *nve; + + g_return_val_if_fail(tve != NULL, NULL); + + nve = g_slice_new(TilemVarEntry); + *nve = *tve; + + if (tve->ve) { + nve->ve = g_slice_new(VarEntry); + *nve->ve = *tve->ve; + nve->ve->data = g_memdup(tve->ve->data, tve->ve->size); + } + if (tve->name_str) + nve->name_str = g_strdup(tve->name_str); + if (tve->type_str) + nve->type_str = g_strdup(tve->type_str); + if (tve->slot_str) + nve->slot_str = g_strdup(tve->slot_str); + if (tve->file_ext) + nve->file_ext = g_strdup(tve->file_ext); + if (tve->filetype_desc) + nve->filetype_desc = g_strdup(tve->filetype_desc); + + return nve; +} + +/* Free a TilemVarEntry */ +void tilem_var_entry_free(TilemVarEntry *tve) +{ + g_return_if_fail(tve != NULL); + if (tve->ve) { + g_free(tve->ve->data); + g_slice_free(VarEntry, tve->ve); + } + g_free(tve->name_str); + g_free(tve->type_str); + g_free(tve->slot_str); + g_free(tve->file_ext); + g_free(tve->filetype_desc); + g_slice_free(TilemVarEntry, tve); +} + +struct dirlistinfo { + GSList *list; + char *error_message; + gboolean aborted; + gboolean no_gui; +}; + +/* Convert tifiles VarEntry into a TilemVarEntry */ +static TilemVarEntry *convert_ve(TilemCalcEmulator *emu, VarEntry *ve, + gboolean is_flash) +{ + TilemVarEntry *tve = g_slice_new0(TilemVarEntry); + CalcModel tfmodel = get_calc_model(emu->calc); + const char *model_str; + const char *type_str; + const char *fext; + + tve->model = emu->calc->hw.model_id; + + tve->ve = g_slice_new(VarEntry); + *tve->ve = *ve; + if (ve->data) + tve->ve->data = g_memdup(ve->data, ve->size); + + tve->size = ve->size; + tve->archived = (ve->attr & ATTRB_ARCHIVED ? TRUE : FALSE); + tve->can_group = TRUE; + + tve->name_str = ticonv_varname_to_utf8(tfmodel, ve->name, ve->type); + g_strchomp(tve->name_str); + tve->type_str = g_strdup(tifiles_vartype2string(tfmodel, ve->type)); + fext = tifiles_vartype2fext(tfmodel, ve->type); + tve->file_ext = g_ascii_strdown(fext, -1); + + /* FIXME: the filetype_desc string is used as a description in + the file chooser. It should be written in the same style + as other such strings (e.g., "TI-83 Plus programs" rather + than "TI83+ Program".) But this is better than nothing. */ + model_str = tifiles_model_to_string(tfmodel); + type_str = tifiles_vartype2type(tfmodel, ve->type); + tve->filetype_desc = g_strdup_printf("%s %s", model_str, type_str); + + tve->can_group = !is_flash; + + return tve; +} + +/* Convert a complete directory listing */ +static void convert_dir_list(TilemCalcEmulator *emu, GNode *root, + gboolean is_flash, GSList **list) +{ + GNode *dir, *var; + VarEntry *ve; + TilemVarEntry *tve; + + if (!root) + return; + + for (dir = root->children; dir; dir = dir->next) { + for (var = dir->children; var; var = var->next) { + ve = var->data; + tve = convert_ve(emu, ve, is_flash); + *list = g_slist_prepend(*list, tve); + } + } +} + +/* Request directory listing using ticalcs */ +static gboolean get_dirlist_silent(TilemCalcEmulator *emu, + struct dirlistinfo *dl) +{ + CableHandle *cbl; + CalcHandle *ch; + GNode *vars = NULL, *apps = NULL; + GSList *list = NULL; + int e = 0; + + begin_link(emu, &cbl, &ch, "Reading variable list"); + prepare_for_link_receive(emu); + + if (ticalcs_calc_features(ch) & OPS_DIRLIST) { + e = ticalcs_calc_get_dirlist(ch, &vars, &apps); + if (!e) { + convert_dir_list(emu, vars, FALSE, &list); + convert_dir_list(emu, apps, TRUE, &list); + } + ticalcs_dirlist_destroy(&vars); + ticalcs_dirlist_destroy(&apps); + } + + end_link(emu, cbl, ch); + + dl->list = g_slist_reverse(list); + + dl->aborted = emu->task_abort; + + if (e && !emu->task_abort) + dl->error_message = get_tilibs_error(e); + return (e == 0); +} + +/* Transfer variables non-silently using ticalcs */ +static gboolean get_dirlist_nonsilent(TilemCalcEmulator *emu, + struct dirlistinfo *dl) +{ + CableHandle *cbl; + CalcHandle *ch; + FileContent *fc; + VarEntry *head_entry; + TilemVarEntry *tve; + GSList *list = NULL; + int e, i; + + begin_link(emu, &cbl, &ch, "Receiving variables"); + prepare_for_link_receive(emu); + + fc = tifiles_content_create_regular(ch->model); + e = ticalcs_calc_recv_var_ns(ch, MODE_BACKUP, fc, &head_entry); + if (!e) { + for (i = 0; i < fc->num_entries; i++) { + tve = convert_ve(emu, fc->entries[i], FALSE); + list = g_slist_prepend(list, tve); + } + } + if (head_entry) + tifiles_ve_delete(head_entry); + tifiles_content_delete_regular(fc); + + end_link(emu, cbl, ch); + + dl->list = g_slist_reverse(list); + + dl->aborted = emu->task_abort; + + if (e && !emu->task_abort) + dl->error_message = get_tilibs_error(e); + return (e == 0); +} + +/* Get TI-81 directory listing */ +static gboolean get_dirlist_ti81(TilemCalcEmulator *emu, + struct dirlistinfo *dl) +{ + int i, slot; + TI81ProgInfo info; + GSList *list = NULL; + TilemVarEntry *tve; + int e; + + tilem_em_wake_up(emu, TRUE); + + for (i = 0; i <= TI81_SLOT_MAX; i++) { + /* put Prgm0 after Prgm9, the way it appears in the menu */ + if (i < 9) + slot = i + 1; + else if (i == 9) + slot = 0; + else + slot = i; + + if ((e = ti81_get_program_info(emu->calc, slot, &info))) + break; + + if (info.size == 0) + continue; + + tve = g_slice_new0(TilemVarEntry); + tve->model = TILEM_CALC_TI81; + tve->slot = info.slot; + tve->name_str = ti81_program_name_to_string(info.name); + tve->slot_str = ti81_program_slot_to_string(info.slot); + tve->file_ext = g_strdup("prg"); + tve->filetype_desc = g_strdup("TI-81 programs"); + tve->size = info.size; + tve->archived = FALSE; + tve->can_group = FALSE; + + list = g_slist_prepend(list, tve); + } + + dl->list = g_slist_reverse(list); + + if (e && !emu->task_abort) + dl->error_message = get_ti81_error(e); + return (e == 0); +} + +static gboolean get_dirlist_main(TilemCalcEmulator *emu, gpointer data) +{ + switch (emu->calc->hw.model_id) { + case TILEM_CALC_TI81: + return get_dirlist_ti81(emu, data); + + case TILEM_CALC_TI82: + case TILEM_CALC_TI85: + return get_dirlist_nonsilent(emu, data); + + default: + return get_dirlist_silent(emu, data); + } +} + +static void get_dirlist_finished(TilemCalcEmulator *emu, gpointer data, + gboolean cancelled) +{ + GSList *l; + struct dirlistinfo *dl = data; + + if (dl->error_message && !cancelled) + show_error(emu, "Unable to receive variable list", + dl->error_message); + else if (!cancelled && !dl->aborted && emu->ewin && !dl->no_gui) { + if (!emu->rcvdlg) + emu->rcvdlg = tilem_receive_dialog_new(emu); + tilem_receive_dialog_update(emu->rcvdlg, dl->list); + dl->list = NULL; + } + + if (!dl->no_gui && emu->rcvdlg) + emu->rcvdlg->refresh_pending = FALSE; + + for (l = dl->list; l; l = l->next) + tilem_var_entry_free(l->data); + + g_slist_free(dl->list); + g_slice_free(struct dirlistinfo, dl); +} + +void tilem_link_get_dirlist(TilemCalcEmulator *emu) +{ + struct dirlistinfo *dl = g_slice_new0(struct dirlistinfo); + tilem_calc_emulator_begin(emu, &get_dirlist_main, + &get_dirlist_finished, dl); +} + +/**************** Receiving files ****************/ + +static gboolean write_output(FileContent **vars, FlashContent **apps, + const char *filename, gboolean output_tig, + char **error_message) +{ + FileContent *group = NULL; + TigContent *tig = NULL; + int e, nvars, napps; + + for (nvars = 0; vars && vars[nvars]; nvars++) + ; + for (napps = 0; apps && apps[napps]; napps++) + ; + + g_return_val_if_fail(nvars > 0 || napps > 0, FALSE); + + if (output_tig) { + e = tifiles_tigroup_contents(vars, apps, &tig); + if (!e) + e = tifiles_file_write_tigroup(filename, tig); + } + else if (nvars > 1 && napps == 0) { + e = tifiles_group_contents(vars, &group); + if (!e) + e = tifiles_file_write_regular(filename, group, NULL); + } + else if (nvars == 0 && napps == 1) { + e = tifiles_file_write_flash(filename, apps[0]); + } + else if (nvars == 1 && napps == 0) { + e = tifiles_file_write_regular(filename, vars[0], NULL); + } + else { + *error_message = g_strdup + ("Applications cannot be saved in an XXg group" + " file. Try using TIG format or saving apps" + " individually."); + return FALSE; + } + + if (e) + *error_message = get_tilibs_error(e); + + if (tig) + tifiles_content_delete_tigroup(tig); + if (group) + tifiles_content_delete_regular(group); + + return (e == 0); +} + +static gboolean receive_files_silent(TilemCalcEmulator* emu, + struct TilemReceiveFileInfo *rf) +{ + CableHandle *cbl; + CalcHandle *ch; + FileContent **vars, *filec; + FlashContent **apps, *flashc; + GSList *l; + TilemVarEntry *tve; + int e, i, nvars, napps; + + g_return_val_if_fail(rf->entries != NULL, FALSE); + + i = g_slist_length(rf->entries); + + vars = g_new0(FileContent *, i + 1); + apps = g_new0(FlashContent *, i + 1); + nvars = napps = 0; + + begin_link(emu, &cbl, &ch, "Receiving variables"); + + for (l = rf->entries; l; l = l->next) { + tve = l->data; + + if (tve->ve->type == tifiles_flash_type(ch->model)) { + flashc = tifiles_content_create_flash(ch->model); + e = ticalcs_calc_recv_app(ch, flashc, tve->ve); + apps[napps++] = flashc; + } + else { + filec = tifiles_content_create_regular(ch->model); + e = ticalcs_calc_recv_var(ch, MODE_NORMAL, + filec, tve->ve); + vars[nvars++] = filec; + } + if (e) + break; + } + + if (e && !emu->task_abort) + rf->error_message = get_tilibs_error(e); + + end_link(emu, cbl, ch); + + if (!e) + e = !write_output(vars, apps, rf->destination, + rf->output_tig, &rf->error_message); + + for (i = 0; i < nvars; i++) + tifiles_content_delete_regular(vars[i]); + for (i = 0; i < napps; i++) + tifiles_content_delete_flash(apps[i]); + + return (e == 0); +} + +static gboolean receive_files_ti81(TilemCalcEmulator* emu, + struct TilemReceiveFileInfo *rf) +{ + TilemVarEntry *tve; + TI81Program *prgm = NULL; + int e; + FILE *f; + char *dname; + + g_return_val_if_fail(rf->entries != NULL, FALSE); + + if (rf->entries->next) { + rf->error_message = g_strdup + ("TI-81 programs cannot be saved in a group file." + " Try saving programs individually."); + return FALSE; + } + + tve = rf->entries->data; + e = ti81_get_program(emu->calc, tve->slot, &prgm); + if (e) { + rf->error_message = get_ti81_error(e); + return FALSE; + } + + f = g_fopen(rf->destination, "wb"); + if (!f) { + e = errno; + dname = g_filename_display_basename(rf->destination); + rf->error_message = g_strdup_printf + ("Failed to open %s for writing: %s", + dname, g_strerror(e)); + g_free(dname); + ti81_program_free(prgm); + return FALSE; + } + + e = ti81_write_prg_file(f, prgm); + if (fclose(f) || e) { + e = errno; + dname = g_filename_display_basename(rf->destination); + rf->error_message = g_strdup_printf + ("Error writing %s: %s", + dname, g_strerror(e)); + g_free(dname); + ti81_program_free(prgm); + return FALSE; + } + + ti81_program_free(prgm); + return TRUE; +} + +static gboolean receive_files_nonsilent(TilemCalcEmulator *emu, + struct TilemReceiveFileInfo *rf) +{ + const TilemVarEntry *tve; + FileContent **vars, *fc; + int i, nvars; + GSList *l; + gboolean status; + + nvars = g_slist_length(rf->entries); + + vars = g_new0(FileContent *, nvars + 1); + i = 0; + for (l = rf->entries; l; l = l->next) { + tve = l->data; + g_return_val_if_fail(tve->ve != NULL, FALSE); + g_return_val_if_fail(tve->ve->data != NULL, FALSE); + + /* avoid copying variable data */ + fc = tifiles_content_create_regular(get_calc_model(emu->calc)); + fc->entries = g_new(VarEntry *, 1); + fc->num_entries = 1; + fc->entries[0] = tve->ve; + vars[i++] = fc; + } + + status = write_output(vars, NULL, rf->destination, rf->output_tig, + &rf->error_message); + + for (i = 0; i < nvars; i++) { + if (vars[i]) { + vars[i]->num_entries = 0; + g_free(vars[i]->entries); + vars[i]->entries = NULL; + tifiles_content_delete_regular(vars[i]); + } + } + g_free(vars); + + return status; +} + +static gboolean receive_files_main(TilemCalcEmulator *emu, gpointer data) +{ + struct TilemReceiveFileInfo *rf = data; + TilemVarEntry *tve; + + g_return_val_if_fail(rf->entries != NULL, FALSE); + + tve = rf->entries->data; + + if (emu->calc->hw.model_id == TILEM_CALC_TI81) + return receive_files_ti81(emu, rf); + else if (tve->ve && tve->ve->data) + return receive_files_nonsilent(emu, rf); + else + return receive_files_silent(emu, rf); +} + +static void receive_files_finished(TilemCalcEmulator *emu, gpointer data, + gboolean cancelled) +{ + struct TilemReceiveFileInfo *rf = data; + GSList *l; + + if (rf->error_message && !cancelled) + show_error(emu, "Unable to save file", rf->error_message); + + g_free(rf->destination); + g_free(rf->error_message); + for (l = rf->entries; l; l = l->next) + tilem_var_entry_free(l->data); + g_slist_free(rf->entries); + g_slice_free(struct TilemReceiveFileInfo, rf); +} + +void tilem_link_receive_group(TilemCalcEmulator *emu, + GSList *entries, + const char *destination) +{ + struct TilemReceiveFileInfo *rf; + GSList *l; + TilemVarEntry *tve; + const char *p; + gboolean output_tig = FALSE; + + g_return_if_fail(emu != NULL); + g_return_if_fail(emu->calc != NULL); + g_return_if_fail(entries != NULL); + g_return_if_fail(destination != NULL); + + for (l = entries; l; l = l->next) { + tve = l->data; + g_return_if_fail(emu->calc->hw.model_id == tve->model); + } + + p = strrchr(destination, '.'); + if (p && (!g_ascii_strcasecmp(p, ".tig") + || !g_ascii_strcasecmp(p, ".zip"))) + output_tig = TRUE; + + rf = g_slice_new0(struct TilemReceiveFileInfo); + rf->destination = g_strdup(destination); + rf->output_tig = output_tig; + + tve = entries->data; + if (tve->ve && tve->ve->data) { + /* non-silent: we already have the data; save the file + right now */ + rf->entries = entries; + receive_files_nonsilent(emu, rf); + rf->entries = NULL; + receive_files_finished(emu, rf, FALSE); + } + else { + /* silent: retrieve and save data in background */ + for (l = entries; l; l = l->next) { + tve = tilem_var_entry_copy(l->data); + rf->entries = g_slist_prepend(rf->entries, tve); + } + rf->entries = g_slist_reverse(rf->entries); + + tilem_calc_emulator_begin(emu, &receive_files_main, + &receive_files_finished, rf); + } +} + +void tilem_link_receive_file(TilemCalcEmulator *emu, + const TilemVarEntry *varentry, + const char* destination) +{ + GSList *l; + l = g_slist_prepend(NULL, (gpointer) varentry); + tilem_link_receive_group(emu, l, destination); + g_slist_free(l); +} + +/**************** Receive matching files ****************/ + +struct recmatchinfo { + char *pattern; + char *destdir; + struct dirlistinfo *dl; + struct TilemReceiveFileInfo *rf; +}; + +static gboolean receive_matching_main(TilemCalcEmulator *emu, gpointer data) +{ + struct recmatchinfo *rm = data; + GSList *l, *selected = NULL; + TilemVarEntry *tve; + char *defname, *defname_r, *defname_l; + GPatternSpec *pat; + gboolean status = TRUE; + + if (!get_dirlist_main(emu, rm->dl)) + return FALSE; + + /* Find variables that match the pattern */ + + pat = g_pattern_spec_new(rm->pattern); + + for (l = rm->dl->list; l; l = l->next) { + tve = l->data; + + defname = get_default_filename(tve); + defname_r = g_utf8_normalize(defname, -1, G_NORMALIZE_NFKD); + + if (g_pattern_match(pat, strlen(defname_r), defname_r, NULL)) + selected = g_slist_prepend(selected, tve); + + g_free(defname); + g_free(defname_r); + } + + g_pattern_spec_free(pat); + + if (!selected) { + rm->rf->error_message = g_strdup_printf + ("Variable %s not found", rm->pattern); + return FALSE; + } + + /* Receive variables */ + + selected = g_slist_reverse(selected); + + for (l = selected; l; l = l->next) { + tve = l->data; + + g_free(rm->rf->destination); + + defname = get_default_filename(tve); + defname_l = utf8_to_filename(defname); + rm->rf->destination = g_build_filename(rm->destdir, + defname_l, NULL); + g_free(defname); + g_free(defname_l); + + rm->rf->entries = g_slist_prepend(NULL, tve); + status = receive_files_main(emu, rm->rf); + g_slist_free(rm->rf->entries); + rm->rf->entries = NULL; + + if (!status) + break; + } + + g_slist_free(selected); + + return status; +} + +static void receive_matching_finished(TilemCalcEmulator *emu, gpointer data, + gboolean cancelled) +{ + struct recmatchinfo *rm = data; + + get_dirlist_finished(emu, rm->dl, cancelled); + receive_files_finished(emu, rm->rf, cancelled); + g_free(rm->pattern); + g_free(rm->destdir); + g_slice_free(struct recmatchinfo, rm); +} + +/* Receive variables with names matching a pattern. PATTERN is a + glob-like pattern in UTF-8. Files will be written out to + DESTDIR. */ +void tilem_link_receive_matching(TilemCalcEmulator *emu, + const char *pattern, + const char *destdir) +{ + struct recmatchinfo *rm; + + g_return_if_fail(emu != NULL); + g_return_if_fail(pattern != NULL); + g_return_if_fail(destdir != NULL); + + rm = g_slice_new0(struct recmatchinfo); + rm->pattern = g_utf8_normalize(pattern, -1, G_NORMALIZE_NFKD); + rm->destdir = g_strdup(destdir); + + rm->dl = g_slice_new0(struct dirlistinfo); + rm->dl->no_gui = TRUE; + rm->rf = g_slice_new0(struct TilemReceiveFileInfo); + + tilem_calc_emulator_begin(emu, &receive_matching_main, + &receive_matching_finished, rm); +} diff --git a/tool/tilem-src/gui/macro.c b/tool/tilem-src/gui/macro.c new file mode 100644 index 0000000..ae8db8b --- /dev/null +++ b/tool/tilem-src/gui/macro.c @@ -0,0 +1,274 @@ +/* + * TilEm II + * + * Copyright (c) 2010-2011 Thibault Duponchelle + * + * 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 . + * + */ +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include + +#include "gui.h" +#include "filedlg.h" +#include "emucore.h" + + +/* Allocate a new TilemMacro structure which is empty */ +static TilemMacro* tilem_macro_new() { + TilemMacro *macro = g_new(TilemMacro, 1); + macro->n = 0; + macro->actions = NULL; + return macro; +} + +/* New or renew the table of actions (each TilemMacroAtom is an action) */ +static TilemMacroAtom** tilem_macro_actions_new(TilemMacro *macro, int n) { + TilemMacroAtom **atom; + + if(n == 0) { + atom = g_new(TilemMacroAtom*, n); + } else { + atom = g_renew(TilemMacroAtom*, macro->actions, n); + } + return atom; +} + +/* Try to destroy the TilemMacro if really allocated */ +static void tilem_macro_finalize(TilemMacro* macro) { + if(macro) { + if(macro->actions) + g_free(macro->actions); + g_free(macro); + } +} + +/* Firstly free the memory then create a new TilemMacro */ +void tilem_macro_start(TilemCalcEmulator *emu) { + emu->isMacroRecording = TRUE; + + /* Firstly destroy the macro if exists */ + tilem_macro_finalize(emu->macro); + + /* Then allocate a new one */ + emu->macro = tilem_macro_new(emu); +} + +/* Add an action to the macro. The action could be : + * A keypress (type == 0) + * A file load (type == 1) + * Or something else if I implement it :) + */ +void tilem_macro_add_action(TilemMacro* macro, int type, char * value) { + + int n = macro->n; + + /* We want to allocate for 1 object, but index is 0 */ + macro->actions = tilem_macro_actions_new(macro, n + 1); + + /* Then we need to save the action */ + macro->actions[n] = g_new(char, strlen(value)); /* FIXME : gcc says : "assignment from incompatible pointer type" ??? */ + macro->actions[n]->value = g_strdup(value); + macro->actions[n]->type = type; + macro->n++; +} + +/* Stop the macro */ +void tilem_macro_stop(TilemCalcEmulator *emu) +{ + if(emu->isMacroRecording) + emu->isMacroRecording = FALSE; +} + +/* Print the macro actions content (debug) */ +void tilem_macro_print(TilemMacro *macro) { + int i = 0; + + printf("macro->n : %d\n", macro->n); + for(i = 0; i < macro->n; i++ ){ + printf("type : %d value : %s\n", macro->actions[i]->type, macro->actions[i]->value); + } +} + +/* Write a file using TilemMacro structure */ +void tilem_macro_write_file(TilemCalcEmulator *emu) { + char *dir, *filename; + tilem_config_get("macro", + "directory/f", &dir, + NULL); + + filename = prompt_save_file("Save macro", + GTK_WINDOW(emu->ewin->window), + NULL, + dir, + "Macro files", "*.txt", + "All files", "*", + NULL); + if(filename) { + FILE * fp = g_fopen(filename, "w"); + if(fp) { + int i = 0; + for(i = 0; i< emu->macro->n; i++ ){ + printf("type : %d value : %s\n", emu->macro->actions[i]->type, emu->macro->actions[i]->value); + /* Test if it's a key press or a file loading action */ + if(emu->macro->actions[i]->type == 1) { + char * lengthchar = g_new0(char, 4); + int length = strlen(emu->macro->actions[i]->value); + fwrite("file=", 1, 5, fp); + sprintf(lengthchar, "%04d", strlen(emu->macro->actions[i]->value)); + fwrite(lengthchar, 1, sizeof(int), fp); + fwrite("-", 1, 1, fp); + fwrite(emu->macro->actions[i]->value, 1, length, fp); + g_free(lengthchar); + } else { + fwrite(emu->macro->actions[i]->value, 1, 4, fp); + fwrite(",", 1, 1, fp); + } + } + tilem_config_set("macro", "directory/f", g_path_get_dirname(filename), NULL); + fclose(fp); + } + g_free(filename); + g_free(dir); + } +} + +#define MACRO_KEYPRESS 0 +#define MACRO_FILE 1 + +/* Play the macro (macro should be created or loaded before else it does nothing) */ +static gboolean tilem_macro_play_main(TilemCalcEmulator *emu, G_GNUC_UNUSED gpointer data) { + + if(!emu->macro) { + printf("Nothing to play\n"); + return FALSE; + } + + int i; + for(i = 0; i < emu->macro->n; i++ ){ + if(emu->macro->actions[i]->type == MACRO_FILE) { + /* Type == 1 is load file */ + struct TilemSendFileInfo *sf; + sf = g_slice_new0(struct TilemSendFileInfo); + sf->filename = g_strdup(emu->macro->actions[i]->value); + sf->display_name = g_filename_display_basename(emu->macro->actions[i]->value); + sf->slot = -1; + sf->first = TRUE; + sf->last = TRUE; + send_file_main(emu, sf); + + } else { + /* type == 0 is keypress */ + int code = atoi(emu->macro->actions[i]->value); + tilem_em_unlock(emu); + run_with_key_slowly(emu->calc, code); + tilem_em_lock(emu); + + } + } + + + return TRUE; +} + + +static void tilem_macro_play_finished(G_GNUC_UNUSED TilemCalcEmulator *emu, G_GNUC_UNUSED gpointer data, + G_GNUC_UNUSED gboolean cancelled) { + +} + +/* Play the macro */ +void tilem_macro_play(TilemCalcEmulator* emu) { + + tilem_calc_emulator_begin(emu, &tilem_macro_play_main, &tilem_macro_play_finished, NULL); +} + +/* Load a macro (when finished, task manager will normally call tilem_macro_play) */ +static gboolean tilem_macro_load_main(TilemCalcEmulator* emu, gpointer data) { + + char* filename = (char*) data; + char c = 'a'; + + if(filename) { + FILE * fp = g_fopen(filename, "r"); + /* printf("filename : %s\n", filename); */ + + tilem_macro_start(emu); + while(c != EOF) { + char* codechar = g_new0(char, 4); + fread(codechar, 1, 4, fp); + if(strcmp(codechar, "file") == 0) { + c = fgetc(fp); /* Drop the "="*/ + char *lengthchar = g_new0(char, 4); + fread(lengthchar, 1, 4, fp); + c = fgetc(fp); /* Drop the "-"*/ + int length = atoi(lengthchar); + char* filetoload= g_new0(char, length); + fread(filetoload, 1, length, fp); + tilem_macro_add_action(emu->macro, 1, filetoload); + g_free(lengthchar); + g_free(filetoload); + } else { + int code = atoi(codechar); + if(code <= 0) + break; + /*printf("code : %d, codechar : %s\n",code, codechar); */ + tilem_macro_add_action(emu->macro, 0, codechar); + c = fgetc(fp); + } + } + tilem_macro_stop(emu); + fclose(fp); + } + + return TRUE; +} + +/* When the macro is totally loaded, then we can play it ! */ +static void tilem_macro_load_finished(G_GNUC_UNUSED TilemCalcEmulator *emu, G_GNUC_UNUSED gpointer data, + G_GNUC_UNUSED gboolean cancelled) +{ + tilem_calc_emulator_begin(emu, &tilem_macro_play_main, &tilem_macro_play_finished, NULL); +} + +/* Load a macro from filename. + * If filename == NULL prompt the user + */ +void tilem_macro_load(TilemCalcEmulator *emu, char* filename) { + + /* printf("tilem_macro_load : filename : %s\n", filename); */ + if(!filename) { + char *dir; + tilem_config_get("macro", "directory/f", &dir, NULL); + + filename = prompt_open_file("Open macro", + GTK_WINDOW(emu->ewin->window), + dir, + "Macro files", "*.txt", + "All files", "*", + NULL); + if(dir) + g_free(dir); + } + tilem_calc_emulator_begin(emu, &tilem_macro_load_main, &tilem_macro_load_finished, filename); +} + diff --git a/tool/tilem-src/gui/memmodel.c b/tool/tilem-src/gui/memmodel.c new file mode 100644 index 0000000..eefe43d --- /dev/null +++ b/tool/tilem-src/gui/memmodel.c @@ -0,0 +1,529 @@ +/* + * TilEm II + * + * Copyright (c) 2011-2012 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include + +#include "gui.h" +#include "memmodel.h" +#include "charmap.h" + +/* GTK+ requires us to supply several property values for every byte, + and we might have hundreds of bytes that need to be refreshed each + time the window is repainted. To avoid locking and unlocking the + calc for every call to tilem_mem_model_get_value(), we can retrieve + information for an entire block of memory and keep it in cache. + + For each address, we cache the current byte value (8 bits), whether + or not it is editable (1 bit), and its physical address (up to 22 + bits for current calculator models), so everything fits in a + guint32. For future models, this scheme might need to be + modified. */ + +#define CACHE_BLOCK_SIZE 256 +#define CACHE_NUM_BLOCKS 16 + +typedef struct { + dword address; + guint32 *info; +} MemModelCacheBlock; + +/* Check if a given physical address is editable (i.e., located in RAM + or in a non-protected Flash sector) */ +static gboolean address_editable(TilemCalc *calc, dword a) +{ + int start, end, i; + + if (a >= calc->hw.romsize) + /* address is in RAM */ + return TRUE; + + if (!(calc->hw.flags & TILEM_CALC_HAS_FLASH)) + /* calc does not use Flash */ + return FALSE; + + /* address is in Flash -> check if sector is protected */ + start = 0; + end = calc->hw.nflashsectors; + while (start < end) { + i = (start + end) / 2; + if (a < calc->hw.flashsectors[i].start) + end = i; + else if (a >= (calc->hw.flashsectors[i].start + + calc->hw.flashsectors[i].size)) + start = i + 1; + else + return !(calc->hw.flashsectors[i].protectgroup + & ~calc->flash.overridegroup); + } + + g_return_val_if_reached(FALSE); +} + +/* Copy calc memory contents into cache. */ +static void fill_cache_block(TilemMemModel *mm, MemModelCacheBlock *cb) +{ + TilemCalc *calc; + dword i, addr, phys; + byte value, editable; + + g_return_if_fail(mm->emu != NULL); + + tilem_calc_emulator_lock(mm->emu); + calc = mm->emu->calc; + if (!calc) { + tilem_calc_emulator_unlock(mm->emu); + return; + } + + for (i = 0; i < CACHE_BLOCK_SIZE; i++) { + addr = (cb->address + i) % mm->wrap_addr; + + if (mm->use_logical) + phys = (*calc->hw.mem_ltop)(calc, addr); + else + phys = addr; + + editable = address_editable(calc, phys); + value = calc->mem[phys]; + + cb->info[i] = (value + | (editable << 8) + | (phys << 9)); + } + + tilem_calc_emulator_unlock(mm->emu); +} + +/* Retrieve info for given address. */ +static guint32 get_mem_info(TilemMemModel *mm, dword addr) +{ + GList *l; + MemModelCacheBlock *cb; + dword start, index; + + start = addr & ~(CACHE_BLOCK_SIZE - 1); + index = addr & (CACHE_BLOCK_SIZE - 1); + + for (l = mm->cache->head; l; l = l->next) { + cb = l->data; + if (cb->address == start) { + if (l->prev) { + /* Move this cache block to the start + of the list */ + g_queue_unlink(mm->cache, l); + g_queue_push_head_link(mm->cache, l); + } + + return cb->info[index]; + } + } + + /* Data not found in cache; drop the least recently used block + and retrieve the requested block from the calc */ + l = g_queue_pop_tail_link(mm->cache); + g_queue_push_head_link(mm->cache, l); + cb = l->data; + cb->address = start; + fill_cache_block(mm, cb); + return cb->info[index]; +} + +/* Get address's byte value. */ +static byte get_value(TilemMemModel *mm, dword addr) +{ + return (get_mem_info(mm, addr) & 0xff); +} + +/* Get address's editability. */ +static gboolean get_editable(TilemMemModel *mm, dword addr) +{ + return ((get_mem_info(mm, addr) >> 8) & 1); +} + +/* Get address's corresponding physical address. */ +static dword get_phys_addr(TilemMemModel *mm, dword addr) +{ + return (get_mem_info(mm, addr) >> 9); +} + +/* Clear cache. This function should be called any time something + happens that might affect memory contents. */ +void tilem_mem_model_clear_cache(TilemMemModel *mm) +{ + GList *l; + MemModelCacheBlock *cb; + + g_return_if_fail(TILEM_IS_MEM_MODEL(mm)); + + for (l = mm->cache->head; l; l = l->next) { + cb = l->data; + cb->address = (dword) -1; + } +} + +/* Get flags for the model */ +static GtkTreeModelFlags +tilem_mem_model_get_flags(G_GNUC_UNUSED GtkTreeModel *model) +{ + return (GTK_TREE_MODEL_LIST_ONLY | GTK_TREE_MODEL_ITERS_PERSIST); +} + +/* Get the number of columns */ +static int +tilem_mem_model_get_n_columns(GtkTreeModel *model) +{ + TilemMemModel *mm; + g_return_val_if_fail(TILEM_IS_MEM_MODEL(model), 0); + mm = TILEM_MEM_MODEL(model); + return (MM_COLUMNS_PER_BYTE * mm->row_size); +} + +/* Get type of data for the given column. Currently all columns are + strings. */ +static GType +tilem_mem_model_get_column_type(G_GNUC_UNUSED GtkTreeModel *model, + int index) +{ + index %= MM_COLUMNS_PER_BYTE; + + switch (index) { + case MM_COL_ADDRESS_0: + case MM_COL_HEX_0: + case MM_COL_CHAR_0: + return G_TYPE_STRING; + + case MM_COL_BYTE_PTR_0: + return G_TYPE_POINTER; + + case MM_COL_EDITABLE_0: + return G_TYPE_BOOLEAN; + + default: + g_return_val_if_reached(G_TYPE_INVALID); + } +} + +/* Get an iterator pointing to the nth row */ +static gboolean get_nth_iter(GtkTreeModel *model, GtkTreeIter *iter, int n) +{ + TilemMemModel *mm; + + g_return_val_if_fail(TILEM_IS_MEM_MODEL(model), FALSE); + mm = TILEM_MEM_MODEL(model); + + if (n >= mm->num_rows) + return FALSE; + + iter->stamp = mm->stamp; + iter->user_data = GINT_TO_POINTER(n); + iter->user_data2 = NULL; + iter->user_data3 = NULL; + return TRUE; +} + +/* Get row number for the given iterator */ +static int get_row_number(GtkTreeModel *model, GtkTreeIter *iter) +{ + TilemMemModel *mm; + int n; + + g_return_val_if_fail(TILEM_IS_MEM_MODEL(model), 0); + mm = TILEM_MEM_MODEL(model); + g_return_val_if_fail(iter != NULL, 0); + g_return_val_if_fail(iter->stamp == mm->stamp, 0); + n = GPOINTER_TO_INT(iter->user_data); + g_return_val_if_fail(n < mm->num_rows, 0); + return n; +} + +/* Get iterator for a given path */ +static gboolean tilem_mem_model_get_iter(GtkTreeModel *model, + GtkTreeIter *iter, + GtkTreePath *path) +{ + int *indices; + + if (gtk_tree_path_get_depth(path) != 1) + return FALSE; + + indices = gtk_tree_path_get_indices(path); + return get_nth_iter(model, iter, indices[0]); +} + +/* Get path for an iterator */ +static GtkTreePath * tilem_mem_model_get_path(GtkTreeModel *model, + GtkTreeIter *iter) +{ + int n; + n = get_row_number(model, iter); + return gtk_tree_path_new_from_indices(n, -1); +} + +/* Get next (sibling) iterator */ +static gboolean tilem_mem_model_iter_next(GtkTreeModel *model, + GtkTreeIter *iter) +{ + int n; + n = get_row_number(model, iter); + return get_nth_iter(model, iter, n + 1); +} + +/* Check if iterator has a child */ +static gboolean +tilem_mem_model_iter_has_child(G_GNUC_UNUSED GtkTreeModel *model, + G_GNUC_UNUSED GtkTreeIter *iter) +{ + return FALSE; +} + +/* Get number of children (iter = NULL means get number of root + nodes) */ +static gint tilem_mem_model_iter_n_children(GtkTreeModel *model, + GtkTreeIter *iter) +{ + TilemMemModel *mm; + + g_return_val_if_fail(TILEM_IS_MEM_MODEL(model), 0); + mm = TILEM_MEM_MODEL(model); + + if (iter) + return 0; + else + return (mm->num_rows); +} + +/* Get nth child (parent = NULL means get nth root node */ +static gboolean tilem_mem_model_iter_nth_child( GtkTreeModel *model, + GtkTreeIter *iter, + GtkTreeIter *parent, + gint n) +{ + G_GNUC_UNUSED TilemMemModel* mm; + + g_return_val_if_fail(TILEM_IS_MEM_MODEL(model), FALSE); + mm = TILEM_MEM_MODEL(model); + + if (parent) + return FALSE; + else + return get_nth_iter(model, iter, n); +} + +/* Get first child */ +static gboolean tilem_mem_model_iter_children(GtkTreeModel *model, + GtkTreeIter *iter, + GtkTreeIter *parent) +{ + return tilem_mem_model_iter_nth_child(model, iter, parent, 0); +} + +/* Get parent */ +static gboolean tilem_mem_model_iter_parent(G_GNUC_UNUSED GtkTreeModel *model, + G_GNUC_UNUSED GtkTreeIter *iter, + G_GNUC_UNUSED GtkTreeIter *child) +{ + return FALSE; +} + +/* Retrieve value for a given column */ +static void tilem_mem_model_get_value(GtkTreeModel *model, + GtkTreeIter *iter, + gint column, + GValue *value) +{ + TilemMemModel *mm; + dword n, addr, phys; + TilemCalc *calc; + char buf[100], *s; + + g_return_if_fail(TILEM_IS_MEM_MODEL(model)); + mm = TILEM_MEM_MODEL(model); + + g_return_if_fail(mm->emu != NULL); + g_return_if_fail(mm->emu->calc != NULL); + + n = get_row_number(model, iter); + + calc = mm->emu->calc; + + addr = (mm->start_addr + + n * mm->row_size + + column / MM_COLUMNS_PER_BYTE) % mm->wrap_addr; + + column %= MM_COLUMNS_PER_BYTE; + + switch (column) { + case MM_COL_ADDRESS_0: + s = tilem_format_addr(mm->emu->dbg, addr, !mm->use_logical); + g_value_init(value, G_TYPE_STRING); + g_value_set_string(value, s); + g_free(s); + break; + + case MM_COL_HEX_0: + g_snprintf(buf, sizeof(buf), "%02X", get_value(mm, addr)); + g_value_init(value, G_TYPE_STRING); + g_value_set_string(value, buf); + break; + + case MM_COL_CHAR_0: + s = ti_to_unicode(calc->hw.model_id, get_value(mm, addr)); + g_value_init(value, G_TYPE_STRING); + g_value_set_string(value, s); + g_free(s); + break; + + case MM_COL_BYTE_PTR_0: + phys = get_phys_addr(mm, addr); + g_value_init(value, G_TYPE_POINTER); + g_value_set_pointer(value, &calc->mem[phys]); + break; + + case MM_COL_EDITABLE_0: + g_value_init(value, G_TYPE_BOOLEAN); + g_value_set_boolean(value, get_editable(mm, addr)); + break; + } +} + +static void tilem_mem_model_init(TilemMemModel *mm) +{ + int i; + MemModelCacheBlock *cb; + + mm->stamp = g_random_int(); + mm->row_size = 1; + + mm->cache = g_queue_new(); + for (i = 0; i < CACHE_NUM_BLOCKS; i++) { + cb = g_slice_new(MemModelCacheBlock); + cb->address = (dword) -1; + cb->info = g_new(guint32, CACHE_BLOCK_SIZE); + g_queue_push_head(mm->cache, cb); + } +} + +static void tilem_mem_model_finalize(GObject *obj) +{ + TilemMemModel *mm; + MemModelCacheBlock *cb; + + g_return_if_fail(TILEM_IS_MEM_MODEL(obj)); + mm = TILEM_MEM_MODEL(obj); + + while ((cb = g_queue_pop_head(mm->cache))) { + g_free(cb->info); + g_slice_free(MemModelCacheBlock, cb); + } +} + +static void tilem_mem_model_class_init(TilemMemModelClass *klass) +{ + GObjectClass *obj_class = G_OBJECT_CLASS(klass); + + obj_class->finalize = &tilem_mem_model_finalize; +} + +static void tilem_mem_tree_model_init(GtkTreeModelIface *iface) +{ + iface->get_flags = &tilem_mem_model_get_flags; + iface->get_n_columns = &tilem_mem_model_get_n_columns; + iface->get_column_type = &tilem_mem_model_get_column_type; + iface->get_iter = &tilem_mem_model_get_iter; + iface->get_path = &tilem_mem_model_get_path; + iface->get_value = &tilem_mem_model_get_value; + iface->iter_next = &tilem_mem_model_iter_next; + iface->iter_children = &tilem_mem_model_iter_children; + iface->iter_has_child = &tilem_mem_model_iter_has_child; + iface->iter_n_children = &tilem_mem_model_iter_n_children; + iface->iter_nth_child = &tilem_mem_model_iter_nth_child; + iface->iter_parent = &tilem_mem_model_iter_parent; +} + +GType tilem_mem_model_get_type(void) +{ + static GType type = 0; + + static const GTypeInfo type_info = { + sizeof(TilemMemModelClass), + NULL, + NULL, + (GClassInitFunc) tilem_mem_model_class_init, + NULL, + NULL, + sizeof(TilemMemModel), + 0, + (GInstanceInitFunc) tilem_mem_model_init, + NULL + }; + + static const GInterfaceInfo tree_model_info = { + (GInterfaceInitFunc) tilem_mem_tree_model_init, + NULL, + NULL + }; + + if (!type) { + type = g_type_register_static(G_TYPE_OBJECT, "TilemMemModel", + &type_info, 0); + g_type_add_interface_static(type, GTK_TYPE_TREE_MODEL, + &tree_model_info); + } + + return type; +} + +GtkTreeModel * tilem_mem_model_new(TilemCalcEmulator* emu, + int rowsize, dword start, + gboolean logical) +{ + TilemMemModel* mm; + + g_return_val_if_fail(emu != NULL, NULL); + g_return_val_if_fail(emu->calc != NULL, NULL); + g_return_val_if_fail(rowsize > 0, NULL); + + mm = g_object_new(TILEM_TYPE_MEM_MODEL, NULL); + + mm->emu = emu; + mm->row_size = rowsize; + mm->start_addr = start; + + if (logical) { + mm->use_logical = TRUE; + mm->wrap_addr = 0x10000; + } + else { + mm->use_logical = FALSE; + mm->wrap_addr = (emu->calc->hw.romsize + + emu->calc->hw.ramsize); + } + + mm->num_rows = (mm->wrap_addr + rowsize - 1) / rowsize; + + return GTK_TREE_MODEL(mm); +} diff --git a/tool/tilem-src/gui/memmodel.h b/tool/tilem-src/gui/memmodel.h new file mode 100644 index 0000000..58f84f4 --- /dev/null +++ b/tool/tilem-src/gui/memmodel.h @@ -0,0 +1,77 @@ +/* + * TilEm II + * + * Copyright (c) 2011-2012 Benjamin Moody + * + * 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 . + */ + +#include + +/* TilemMemModel object: an efficient GtkTreeModel interface for + viewing and editing calculator's memory */ + +G_BEGIN_DECLS + +/* Column numbers (repeated for each byte in a given row) */ +enum { + MM_COL_ADDRESS_0 = 0, /* Address (hexadecimal) */ + MM_COL_HEX_0, /* Byte value (hexadecimal) */ + MM_COL_CHAR_0, /* Byte value (character, converted to + UTF-8) */ + MM_COL_BYTE_PTR_0, /* Pointer to corresponding memory byte */ + MM_COL_EDITABLE_0, /* TRUE if byte is editable */ + MM_COLUMNS_PER_BYTE +}; + +#define MM_COL_ADDRESS(n) (MM_COL_ADDRESS_0 + (n) * MM_COLUMNS_PER_BYTE) +#define MM_COL_HEX(n) (MM_COL_HEX_0 + (n) * MM_COLUMNS_PER_BYTE) +#define MM_COL_CHAR(n) (MM_COL_CHAR_0 + (n) * MM_COLUMNS_PER_BYTE) +#define MM_COL_BYTE_PTR(n) (MM_COL_BYTE_PTR_0 + (n) * MM_COLUMNS_PER_BYTE) +#define MM_COL_EDITABLE(n) (MM_COL_EDITABLE_0 + (n) * MM_COLUMNS_PER_BYTE) + +/* GObject stuff */ + +#define TILEM_TYPE_MEM_MODEL (tilem_mem_model_get_type()) +#define TILEM_MEM_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), TILEM_TYPE_MEM_MODEL, TilemMemModel)) +#define TILEM_MEM_MODEL_CLASS(cls) (G_TYPE_CHECK_CLASS_CAST((cls), TILEM_TYPE_MEM_MODEL, TilemMemModelClass)) +#define TILEM_IS_MEM_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), TILEM_TYPE_MEM_MODEL)) +#define TILEM_IS_MEM_MODEL_CLASS(cls) (G_TYPE_CHECK_CLASS_TYPE((cls), TILEM_TYPE_MEM_MODEL)) +#define TILEM_MEM_MODEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), TILEM_TYPE_MEM_MODEL, TilemMemModelClass)) + +typedef struct _TilemMemModel { + GObject parent; + TilemCalcEmulator *emu; + gint stamp; + int row_size; + int num_rows; + dword start_addr; + dword wrap_addr; + gboolean use_logical; + GQueue *cache; +} TilemMemModel; + +typedef struct _TilemMemModelClass { + GObjectClass parent_class; +} TilemMemModelClass; + +GType tilem_mem_model_get_type(void) G_GNUC_CONST; + +GtkTreeModel * tilem_mem_model_new(TilemCalcEmulator* emu, + int rowsize, dword start, + gboolean logical); + +void tilem_mem_model_clear_cache(TilemMemModel *mm); + +G_END_DECLS diff --git a/tool/tilem-src/gui/memory.c b/tool/tilem-src/gui/memory.c new file mode 100644 index 0000000..03b09a1 --- /dev/null +++ b/tool/tilem-src/gui/memory.c @@ -0,0 +1,101 @@ +/* + * TilEm II + * + * Copyright (c) 2010-2011 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include + +/* Memory management */ + +void tilem_free(void* p) +{ + g_free(p); +} + +void* tilem_malloc(size_t s) +{ + return g_malloc(s); +} + +void* tilem_realloc(void* p, size_t s) +{ + return g_realloc(p, s); +} + +void* tilem_try_malloc(size_t s) +{ + return g_try_malloc(s); +} + +void* tilem_malloc0(size_t s) +{ + return g_malloc0(s); +} + +void* tilem_try_malloc0(size_t s) +{ + return g_try_malloc0(s); +} + +void* tilem_malloc_atomic(size_t s) +{ + return g_malloc(s); +} + +void* tilem_try_malloc_atomic(size_t s) +{ + return g_try_malloc(s); +} + +/* Logging */ + +void tilem_message(TilemCalc* calc, const char* msg, ...) +{ + va_list ap; + va_start(ap, msg); + fprintf(stderr, "x%c: ", calc->hw.model_id); + vfprintf(stderr, msg, ap); + fputc('\n', stderr); + va_end(ap); +} + +void tilem_warning(TilemCalc* calc, const char* msg, ...) +{ + va_list ap; + va_start(ap, msg); + fprintf(stderr, "x%c: WARNING: ", calc->hw.model_id); + vfprintf(stderr, msg, ap); + fputc('\n', stderr); + va_end(ap); +} + +void tilem_internal(TilemCalc* calc, const char* msg, ...) +{ + va_list ap; + va_start(ap, msg); + fprintf(stderr, "x%c: INTERNAL ERROR: ", calc->hw.model_id); + vfprintf(stderr, msg, ap); + fputc('\n', stderr); + va_end(ap); +} diff --git a/tool/tilem-src/gui/memview.c b/tool/tilem-src/gui/memview.c new file mode 100644 index 0000000..28d96bf --- /dev/null +++ b/tool/tilem-src/gui/memview.c @@ -0,0 +1,291 @@ +/* + * TilEm II + * + * Copyright (c) 2010-2011 Thibault Duponchelle + * Copyright (c) 2010-2011 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gui.h" +#include "memmodel.h" +#include "fixedtreeview.h" + +static int get_column_index(GtkWidget *view, GtkTreeViewColumn *col) +{ + GList *cols; + int i; + + cols = gtk_tree_view_get_columns(GTK_TREE_VIEW(view)); + i = g_list_index(cols, col); + g_list_free(cols); + return -1; +} + +/* Determine current position in the memory view. */ +static void get_mem_view_position(GtkWidget *mem_view, dword *row_addr, + dword *col_addr, gboolean *cur_hex) +{ + GtkTreePath *path; + GtkTreeViewColumn *col; + GtkTreeModel *model; + TilemMemModel *mm; + const int *indices; + int n; + + *row_addr = *col_addr = (dword) -1; + *cur_hex = FALSE; + + gtk_tree_view_get_cursor(GTK_TREE_VIEW(mem_view), &path, &col); + model = gtk_tree_view_get_model(GTK_TREE_VIEW(mem_view)); + if (!TILEM_IS_MEM_MODEL(model)) + return; + + mm = TILEM_MEM_MODEL(model); + + if (!path) + return; + + indices = gtk_tree_path_get_indices(path); + *row_addr = mm->start_addr + indices[0] * mm->row_size; + + n = get_column_index(mem_view, col); + if (n > 0 && n <= mm->row_size) { + *col_addr = *row_addr + n - 1; + *cur_hex = TRUE; + } + else if (n > mm->row_size && n < mm->row_size * 2) { + *col_addr = *row_addr + n - mm->row_size - 1; + *cur_hex = FALSE; + } + + gtk_tree_path_free(path); +} + +static void addr_to_pos(TilemMemModel *mm, dword addr, + int *rownum, int *colnum) +{ + if (addr < mm->start_addr) + addr += mm->wrap_addr; + addr -= mm->start_addr; + if (rownum) *rownum = (addr / mm->row_size); + if (colnum) *colnum = (addr % mm->row_size); +} + +/* Move memory view cursor */ +static void set_mem_view_position(GtkWidget *mem_view, dword row_addr, + dword col_addr, gboolean cur_hex) +{ + int rownum, colnum; + GtkTreePath *path = NULL; + GtkTreeViewColumn *col = NULL; + GtkTreeModel *model; + TilemMemModel *mm; + + model = gtk_tree_view_get_model(GTK_TREE_VIEW(mem_view)); + if (!TILEM_IS_MEM_MODEL(model)) + return; + + mm = TILEM_MEM_MODEL(model); + + if (col_addr != (dword) -1) { + addr_to_pos(mm, col_addr, &rownum, &colnum); + path = gtk_tree_path_new_from_indices(rownum, -1); + + if (!cur_hex) + colnum += mm->row_size; + + col = gtk_tree_view_get_column(GTK_TREE_VIEW(mem_view), + colnum + 1); + } + else if (row_addr != (dword) -1) { + addr_to_pos(mm, row_addr, &rownum, NULL); + path = gtk_tree_path_new_from_indices(rownum, -1); + } + + if (path) { + gtk_tree_view_set_cursor(GTK_TREE_VIEW(mem_view), + path, col, FALSE); + gtk_tree_path_free(path); + } +} + +/* Cell edited in memory view */ +static void hex_cell_edited(GtkCellRendererText *renderer, + gchar *pathstr, gchar *text, + gpointer data) +{ + GtkTreeView *mem_view = data; + TilemDebugger *dbg; + GtkTreeModel *model; + GtkTreePath *path; + GtkTreeIter iter; + byte *bptr = NULL; + int col; + int value; + char *end; + + value = strtol(text, &end, 16); + if (end == text || *end != 0) + return; + + dbg = g_object_get_data(G_OBJECT(mem_view), "tilem-debugger"); + g_return_if_fail(dbg != NULL); + + col = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(renderer), + "tilem-mem-column")); + + model = gtk_tree_view_get_model(mem_view); + path = gtk_tree_path_new_from_string(pathstr); + gtk_tree_model_get_iter(model, &iter, path); + gtk_tree_path_free(path); + + gtk_tree_model_get(model, &iter, MM_COL_BYTE_PTR(col), &bptr, -1); + g_return_if_fail(bptr != NULL); + + *bptr = (byte) value; + tilem_debugger_refresh(dbg, TRUE); +} + +/* Create the GtkTreeView to show the memory */ +GtkWidget *tilem_debugger_mem_view_new(TilemDebugger *dbg) +{ + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + GtkWidget *treeview; + + /* Create the memory list tree view and set title invisible */ + treeview = gtk_tree_view_new(); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE); + gtk_tree_view_set_fixed_height_mode(GTK_TREE_VIEW(treeview), TRUE); + gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview), TRUE); + + g_object_set_data(G_OBJECT(treeview), "tilem-debugger", dbg); + + /* Create the columns */ + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes + ("ADDR", renderer, "text", MM_COL_ADDRESS(0), NULL); + + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_expand(column, TRUE); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + + return treeview; +} + +static void create_columns(GtkWidget *mem_view, int width) +{ + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + int i; + + for (i = 0; i < width; i++) { + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes + (NULL, renderer, + "text", MM_COL_HEX(i), + "editable", MM_COL_EDITABLE(i), + NULL); + + g_object_set_data(G_OBJECT(renderer), "tilem-mem-column", + GINT_TO_POINTER(i)); + g_signal_connect(renderer, "edited", + G_CALLBACK(hex_cell_edited), mem_view); + + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_expand(column, (i == width - 1)); + gtk_tree_view_append_column(GTK_TREE_VIEW(mem_view), column); + } + + for (i = 0; i < width; i++) { + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes + (NULL, renderer, "text", MM_COL_CHAR(i), NULL); + + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_expand(column, (i == width - 1)); + gtk_tree_view_append_column(GTK_TREE_VIEW(mem_view), column); + } +} + +static dword translate_addr(TilemCalcEmulator *emu, dword a, gboolean ptol) +{ + if (!emu->calc || a == (dword) -1) + return a; + if (ptol) + return (*emu->calc->hw.mem_ptol)(emu->calc, a); + else + return (*emu->calc->hw.mem_ltop)(emu->calc, a & 0xffff); +} + +void tilem_debugger_mem_view_configure(GtkWidget *mem_view, + TilemCalcEmulator *emu, + int rowsize, int start, + gboolean logical) +{ + GtkTreeModel *model; + dword row_addr, col_addr; + gboolean cur_hex; + GList *cols, *l; + int old_rowsize; + + get_mem_view_position(mem_view, &row_addr, &col_addr, &cur_hex); + + model = gtk_tree_view_get_model(GTK_TREE_VIEW(mem_view)); + if (TILEM_IS_MEM_MODEL(model) + && TILEM_MEM_MODEL(model)->use_logical != logical) { + tilem_calc_emulator_lock(emu); + row_addr = translate_addr(emu, row_addr, logical); + col_addr = translate_addr(emu, col_addr, logical); + tilem_calc_emulator_unlock(emu); + } + + cols = gtk_tree_view_get_columns(GTK_TREE_VIEW(mem_view)); + old_rowsize = (g_list_length(cols) - 1) / 2; + if (old_rowsize != rowsize) + for (l = g_list_next(cols); l; l = l->next) + gtk_tree_view_remove_column(GTK_TREE_VIEW(mem_view), + l->data); + g_list_free(cols); + + model = tilem_mem_model_new(emu, rowsize, start, logical); + gtk_tree_view_set_model(GTK_TREE_VIEW(mem_view), model); + g_object_unref(model); + + if (old_rowsize != rowsize) + create_columns(mem_view, rowsize); + + fixed_tree_view_init(mem_view, MM_COLUMNS_PER_BYTE, + MM_COL_ADDRESS_0, "DD:DDDD ", + MM_COL_HEX_0, "DD ", + MM_COL_CHAR_0, "M ", + MM_COL_EDITABLE_0, TRUE, + -1); + + set_mem_view_position(mem_view, row_addr, col_addr, cur_hex); +} diff --git a/tool/tilem-src/gui/menu.c b/tool/tilem-src/gui/menu.c new file mode 100644 index 0000000..debf60a --- /dev/null +++ b/tool/tilem-src/gui/menu.c @@ -0,0 +1,318 @@ +/* + * TilEm II + * + * Copyright (c) 2010-2011 Thibault Duponchelle + * Copyright (c) 2011-2012 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include + +#include "gui.h" +#include "msgbox.h" + +static void action_send_file(G_GNUC_UNUSED GtkAction *act, gpointer data) +{ + TilemEmulatorWindow *ewin = data; + load_file_dialog(ewin); +} + +static void action_receive_file(G_GNUC_UNUSED GtkAction *act, gpointer data) +{ + TilemEmulatorWindow *ewin = data; + //tilem_rcvmenu_new(ewin->emu); + //get_var(ewin->emu); + popup_receive_menu(ewin); +} + +static void action_start_debugger(G_GNUC_UNUSED GtkAction *act, gpointer data) +{ + TilemEmulatorWindow *ewin = data; + launch_debugger(ewin); +} + +static void action_open_calc(G_GNUC_UNUSED GtkAction *act, gpointer data) +{ + TilemEmulatorWindow *ewin = data; + tilem_calc_emulator_prompt_open_rom(ewin->emu); +} + +static void action_save_calc(G_GNUC_UNUSED GtkAction *act, G_GNUC_UNUSED gpointer data) +{ + TilemEmulatorWindow *ewin = data; + GError *err = NULL; + + if (!tilem_calc_emulator_save_state(ewin->emu, &err)) { + messagebox01(GTK_WINDOW(ewin->window), GTK_MESSAGE_ERROR, + "Unable to save calculator state", + "%s", err->message); + g_error_free(err); + } +} + +static void action_revert_calc(G_GNUC_UNUSED GtkAction *act, G_GNUC_UNUSED gpointer data) +{ + TilemEmulatorWindow *ewin = data; + GError *err = NULL; + + if (!tilem_calc_emulator_revert_state(ewin->emu, &err)) { + messagebox01(GTK_WINDOW(ewin->window), GTK_MESSAGE_ERROR, + "Unable to load calculator state", + "%s", err->message); + g_error_free(err); + } +} + +static void action_reset_calc(G_GNUC_UNUSED GtkAction *act, gpointer data) +{ + TilemEmulatorWindow *ewin = data; + tilem_calc_emulator_reset(ewin->emu); +} + +static void action_begin_macro(G_GNUC_UNUSED GtkAction *act, gpointer data) +{ + TilemEmulatorWindow *ewin = data; + tilem_macro_start(ewin->emu); +} + +static void action_end_macro(G_GNUC_UNUSED GtkAction *act, gpointer data) +{ + TilemEmulatorWindow *ewin = data; + tilem_macro_stop(ewin->emu); + /* tilem_macro_print(ewin->emu->macro); */ +} + +static void action_play_macro(G_GNUC_UNUSED GtkAction *act, gpointer data) +{ + TilemEmulatorWindow *ewin = data; + tilem_macro_play(ewin->emu); +} + +static void action_open_macro(G_GNUC_UNUSED GtkAction *act, G_GNUC_UNUSED gpointer data) +{ + TilemEmulatorWindow *ewin = data; + tilem_macro_load(ewin->emu, NULL); +} + +/* I will improve macro creation by saving it firstly into a macro object + * Save macro will only be done if user choose to save it */ +static void action_save_macro(G_GNUC_UNUSED GtkAction *act, G_GNUC_UNUSED gpointer data) +{ + TilemEmulatorWindow *ewin = data; + tilem_macro_write_file(ewin->emu); +} + +static void action_screenshot(G_GNUC_UNUSED GtkAction *act, gpointer data) +{ + TilemEmulatorWindow *ewin = data; + popup_screenshot_window(ewin); +} + +static void action_quick_screenshot(G_GNUC_UNUSED GtkAction *act, + gpointer data) +{ + TilemEmulatorWindow *ewin = data; + quick_screenshot(ewin); +} + +static void action_preferences(G_GNUC_UNUSED GtkAction *act, + gpointer data) +{ + TilemEmulatorWindow *ewin = data; + tilem_preferences_dialog(ewin); +} + +static void action_about(G_GNUC_UNUSED GtkAction *act, + G_GNUC_UNUSED gpointer data) +{ + show_about(); +} + +static void action_quit(G_GNUC_UNUSED GtkAction *act, + G_GNUC_UNUSED gpointer data) +{ + + TilemEmulatorWindow *ewin = data; + gtk_widget_destroy(ewin->window); +} + +static const GtkActionEntry main_action_ents[] = + {{ "send-file", + GTK_STOCK_OPEN, "Send _File...", "O", + "Send a program or variable file to the calculator", + G_CALLBACK(action_send_file) }, + + { "receive-file", + GTK_STOCK_SAVE_AS, "Re_ceive File...", "S", + "Receive a program or variable from the calculator", + G_CALLBACK(action_receive_file) }, + + { "open-calc", + GTK_STOCK_OPEN, "_Open Calculator...", "O", + "Open a calculator ROM file", + G_CALLBACK(action_open_calc) }, + { "save-calc", + GTK_STOCK_SAVE, "_Save Calculator", "S", + "Save current calculator state", + G_CALLBACK(action_save_calc) }, + { "revert-calc", + GTK_STOCK_REVERT_TO_SAVED, "Re_vert Calculator State", 0, + "Revert to saved calculator state", + G_CALLBACK(action_revert_calc) }, + { "reset-calc", + GTK_STOCK_CLEAR, "_Reset Calculator", "Delete", + "Reset the calculator", + G_CALLBACK(action_reset_calc) }, + + { "start-debugger", + 0, "_Debugger", "Pause", + "Pause emulation and start the debugger", + G_CALLBACK(action_start_debugger) }, + + { "begin-macro", + GTK_STOCK_MEDIA_RECORD, "_Record", 0, + "Begin recording a macro", + G_CALLBACK(action_begin_macro) }, + { "end-macro", + GTK_STOCK_MEDIA_STOP, "S_top", 0, + "Begin recording a macro", + G_CALLBACK(action_end_macro) }, + { "play-macro", + GTK_STOCK_MEDIA_PLAY, "_Play", 0, + "Play back the current macro", + G_CALLBACK(action_play_macro) }, + { "open-macro", + GTK_STOCK_OPEN, "_Open Macro File...", "", + "Load a macro from a file", + G_CALLBACK(action_open_macro) }, + { "save-macro", + GTK_STOCK_SAVE_AS, "_Save Macro File...", "", + "Save current macro to a file", + G_CALLBACK(action_save_macro) }, + + { "screenshot", + 0, "S_creenshot...", "Print", + "Save a screenshot", + G_CALLBACK(action_screenshot) }, + { "quick-screenshot", + 0, "_Quick Screenshot", "Print", + "Save a screenshot using default settings", + G_CALLBACK(action_quick_screenshot) }, + + { "preferences", + GTK_STOCK_PREFERENCES, 0, 0, + "Edit emulator settings", + G_CALLBACK(action_preferences) }, + + { "about", + GTK_STOCK_ABOUT, "_About", "", + "Print some informations about TilEm 2 and its authors", + G_CALLBACK(action_about) }, + + { "quit", + GTK_STOCK_QUIT, "_Quit", "Q", + "Quit the application", + G_CALLBACK(action_quit) }}; + +static GtkWidget *add_item(GtkWidget *menu, GtkAccelGroup *accelgrp, + GtkActionGroup *actions, const char *name) +{ + GtkAction *action; + GtkWidget *item; + + action = gtk_action_group_get_action(actions, name); + g_return_val_if_fail(action != NULL, NULL); + + gtk_action_set_accel_group(action, accelgrp); + item = gtk_action_create_menu_item(action); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); + gtk_widget_show(item); + return item; +} + +static GtkWidget *add_separator(GtkWidget *menu) +{ + GtkWidget *item; + item = gtk_separator_menu_item_new(); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); + gtk_widget_show(item); + return item; +} + +static GtkWidget *add_submenu(GtkWidget *menu, const char *label) +{ + GtkWidget *item, *submenu; + + item = gtk_menu_item_new_with_mnemonic(label); + submenu = gtk_menu_new(); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); + gtk_widget_show(item); + return submenu; +} + +/* Build the menu */ +void build_menu(TilemEmulatorWindow* ewin) +{ + GtkActionGroup *acts; + GtkAccelGroup *ag; + GtkWidget *menu, *submenu; + + ewin->actions = acts = gtk_action_group_new("Emulator"); + gtk_action_group_add_actions(ewin->actions, main_action_ents, + G_N_ELEMENTS(main_action_ents), ewin); + + ag = gtk_accel_group_new(); + gtk_window_add_accel_group(GTK_WINDOW(ewin->window), ag); + + ewin->popup_menu = menu = gtk_menu_new(); + + add_item(menu, ag, acts, "send-file"); + add_item(menu, ag, acts, "receive-file"); + add_separator(menu); + + add_item(menu, ag, acts, "open-calc"); + add_item(menu, ag, acts, "save-calc"); + add_item(menu, ag, acts, "revert-calc"); + add_item(menu, ag, acts, "reset-calc"); + add_separator(menu); + + add_item(menu, ag, acts, "start-debugger"); + + submenu = add_submenu(menu, "_Macro"); + add_item(submenu, ag, acts, "begin-macro"); + add_item(submenu, ag, acts, "end-macro"); + add_item(submenu, ag, acts, "play-macro"); + add_separator(submenu); + add_item(submenu, ag, acts, "open-macro"); + add_item(submenu, ag, acts, "save-macro"); + + add_item(menu, ag, acts, "screenshot"); + add_item(menu, ag, acts, "quick-screenshot"); + add_separator(menu); + + add_item(menu, ag, acts, "preferences"); + add_separator(menu); + + add_item(menu, ag, acts, "about"); + add_item(menu, ag, acts, "quit"); +} diff --git a/tool/tilem-src/gui/msgbox.h b/tool/tilem-src/gui/msgbox.h new file mode 100644 index 0000000..7d88efd --- /dev/null +++ b/tool/tilem-src/gui/msgbox.h @@ -0,0 +1,67 @@ +/* + * Tilem II + * Copyright (c) 2011 Benjamin Moody + * + * 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 . + */ + +/* Message box macros */ + +#define messagebox00(prnt, mtyp, tprm, tsec) \ + do { \ + GtkWidget* mbx; \ + mbx = gtk_message_dialog_new(GTK_WINDOW(prnt), GTK_DIALOG_MODAL, \ + mtyp, GTK_BUTTONS_OK, tprm); \ + gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(mbx), \ + tsec); \ + gtk_dialog_set_default_response(GTK_DIALOG(mbx), GTK_RESPONSE_OK); \ + gtk_dialog_run(GTK_DIALOG(mbx)); \ + gtk_widget_destroy(mbx); \ + } while(0) + +#define messagebox01(prnt, mtyp, tprm, tsec, aaaa) \ + do { \ + GtkWidget* mbx; \ + mbx = gtk_message_dialog_new(GTK_WINDOW(prnt), GTK_DIALOG_MODAL, \ + mtyp, GTK_BUTTONS_OK, tprm); \ + gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(mbx), \ + tsec, (aaaa)); \ + gtk_dialog_set_default_response(GTK_DIALOG(mbx), GTK_RESPONSE_OK); \ + gtk_dialog_run(GTK_DIALOG(mbx)); \ + gtk_widget_destroy(mbx); \ + } while(0) + +#define messagebox02(prnt, mtyp, tprm, tsec, aaaa, bbbb) \ + do { \ + GtkWidget* mbx; \ + mbx = gtk_message_dialog_new(GTK_WINDOW(prnt), GTK_DIALOG_MODAL, \ + mtyp, GTK_BUTTONS_OK, tprm); \ + gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(mbx), \ + tsec, (aaaa), (bbbb)); \ + gtk_dialog_set_default_response(GTK_DIALOG(mbx), GTK_RESPONSE_OK); \ + gtk_dialog_run(GTK_DIALOG(mbx)); \ + gtk_widget_destroy(mbx); \ + } while(0) + +#define messagebox11(prnt, mtyp, tprm, aaaa, tsec, bbbb) \ + do { \ + GtkWidget* mbx; \ + mbx = gtk_message_dialog_new(GTK_WINDOW(prnt), GTK_DIALOG_MODAL, \ + mtyp, GTK_BUTTONS_OK, tprm, (aaaa)); \ + gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(mbx), \ + tsec, (bbbb)); \ + gtk_dialog_set_default_response(GTK_DIALOG(mbx), GTK_RESPONSE_OK); \ + gtk_dialog_run(GTK_DIALOG(mbx)); \ + gtk_widget_destroy(mbx); \ + } while(0) diff --git a/tool/tilem-src/gui/pbar.c b/tool/tilem-src/gui/pbar.c new file mode 100644 index 0000000..0d6354e --- /dev/null +++ b/tool/tilem-src/gui/pbar.c @@ -0,0 +1,156 @@ +/* + * TilEm II + * + * Copyright (c) 2010-2011 Thibault Duponchelle + * Copyright (c) 2011 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include + +#include "gui.h" + +/* Update the progress_bar */ +static void progress_bar_update_activity(TilemLinkProgress *linkpb) +{ + char *s; + gdouble f; + + if (!linkpb->window || !linkpb->emu->pbar_title) + return; + + gtk_window_set_title(GTK_WINDOW(linkpb->window), linkpb->emu->pbar_title); + + s = g_strdup_printf("%s", linkpb->emu->pbar_title); + gtk_label_set_markup(linkpb->title_lbl, s); + g_free(s); + + if (linkpb->emu->paused && linkpb->emu->pbar_status) { + s = g_strconcat(linkpb->emu->pbar_status, " (paused)", NULL); + gtk_label_set_text(linkpb->status_lbl, s); + g_free(s); + } + else if (linkpb->emu->paused) + gtk_label_set_text(linkpb->status_lbl, "(paused)"); + else + gtk_label_set_text(linkpb->status_lbl, linkpb->emu->pbar_status); + + if (linkpb->emu->pbar_progress < 0.0) { + gtk_progress_bar_pulse(linkpb->progress_bar); + } + else { + f = CLAMP(linkpb->emu->pbar_progress, 0.0, 1.0); + gtk_progress_bar_set_fraction(linkpb->progress_bar, f); + } +} + +/* Callback to destroy the progress bar */ +static void destroy_progress(G_GNUC_UNUSED GtkDialog *dlg, + G_GNUC_UNUSED gint response, + gpointer data) +{ + TilemLinkProgress* linkpb = data; + tilem_calc_emulator_cancel_tasks(linkpb->emu); + gtk_widget_destroy(linkpb->window); + linkpb->window = NULL; + linkpb->progress_bar = NULL; + linkpb->title_lbl = NULL; + linkpb->status_lbl = NULL; +} + +/* Create the progress bar window */ +static void progress_bar_init(TilemLinkProgress* linkpb) +{ + GtkWidget *pw, *parent, *vbox, *vbox2, *lbl, *pb; + + if (linkpb->emu->ewin) + parent = linkpb->emu->ewin->window; + else + parent = NULL; + + pw = gtk_dialog_new_with_buttons("", GTK_WINDOW(parent), 0, + GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL, + NULL); + linkpb->window = pw; + + gtk_window_set_resizable(GTK_WINDOW(pw), FALSE); + + vbox = gtk_dialog_get_content_area(GTK_DIALOG(pw)); + + vbox2 = gtk_vbox_new(FALSE, 6); + gtk_container_set_border_width(GTK_CONTAINER(vbox2), 6); + + lbl = gtk_label_new(NULL); + gtk_label_set_width_chars(GTK_LABEL(lbl), 35); + gtk_misc_set_alignment(GTK_MISC(lbl), 0.0, 0.5); + gtk_box_pack_start(GTK_BOX(vbox2), lbl, FALSE, FALSE, 0); + linkpb->title_lbl = GTK_LABEL(lbl); + + pb = gtk_progress_bar_new(); + gtk_box_pack_start(GTK_BOX(vbox2), pb, FALSE, FALSE, 0); + linkpb->progress_bar = GTK_PROGRESS_BAR(pb); + + lbl = gtk_label_new(NULL); + gtk_misc_set_alignment(GTK_MISC(lbl), 0.0, 0.5); + gtk_box_pack_start(GTK_BOX(vbox2), lbl, FALSE, FALSE, 0); + linkpb->status_lbl = GTK_LABEL(lbl); + + gtk_box_pack_start(GTK_BOX(vbox), vbox2, FALSE, FALSE, 6); + + g_signal_connect(pw, "response", G_CALLBACK(destroy_progress), linkpb); + + progress_bar_update_activity(linkpb); + + gtk_widget_show_all(pw); +} + +/* Create or update the progress bar */ +void progress_bar_update(TilemCalcEmulator* emu) +{ + g_return_if_fail(emu != NULL); + + g_mutex_lock(emu->pbar_mutex); + + if (!emu->linkpb) { + emu->linkpb = g_slice_new0(TilemLinkProgress); + emu->linkpb->emu = emu; + } + + if (!emu->linkpb->window && emu->pbar_title) { + progress_bar_init(emu->linkpb); + } + else if (emu->linkpb->window && !emu->pbar_title) { + gtk_widget_destroy(emu->linkpb->window); + emu->linkpb->window = NULL; + emu->linkpb->title_lbl = NULL; + emu->linkpb->status_lbl = NULL; + emu->linkpb->progress_bar = NULL; + } + else { + progress_bar_update_activity(emu->linkpb); + } + + emu->pbar_update_pending = FALSE; + g_mutex_unlock(emu->pbar_mutex); +} + diff --git a/tool/tilem-src/gui/preferences.c b/tool/tilem-src/gui/preferences.c new file mode 100644 index 0000000..7758d38 --- /dev/null +++ b/tool/tilem-src/gui/preferences.c @@ -0,0 +1,270 @@ +/* + * TilEm II + * + * Copyright (c) 2011 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include + +#include "gui.h" +#include "files.h" +#include "filedlg.h" + +/* Convert to an absolute path */ +static char *canonicalize_filename(const char *name) +{ +#ifdef G_OS_WIN32 + static const char delim[] = "/\\"; +#else + static const char delim[] = G_DIR_SEPARATOR_S; +#endif + char *result, **parts, *p; + int i; + + if (name == NULL || g_path_is_absolute(name)) + return g_strdup(name); + + result = g_get_current_dir(); + parts = g_strsplit_set(name, delim, -1); + for (i = 0; parts[i]; i++) { + if (!strcmp(parts[i], "..")) { + p = g_path_get_dirname(result); + g_free(result); + result = p; + } + else if (strcmp(parts[i], ".") + && strcmp(parts[i], "")) { + p = g_build_filename(result, parts[i], NULL); + g_free(result); + result = p; + } + } + g_strfreev(parts); + return result; +} + +/* check if two file names are equivalent (of course, if this fails, + it doesn't necessarily mean the files are distinct) */ +static gboolean file_names_equal(const char *a, const char *b) +{ + char *ca, *cb; + gboolean status; + + if (a == NULL && b == NULL) + return TRUE; + else if (a == NULL || b == NULL) + return FALSE; + + ca = canonicalize_filename(a); + cb = canonicalize_filename(b); + status = !strcmp(ca, cb); + g_free(ca); + g_free(cb); + return status; +} + +static void save_skin_name(TilemEmulatorWindow *ewin) +{ + const char *model = ewin->emu->calc->hw.name; + char *base, *shared; + + /* don't save pref unless skin was actually loaded */ + if (!ewin->skin_file_name || !ewin->skin) + return; + + /* if file is stored in shared skins directory, save + only the relative path; otherwise, save the + absolute path */ + base = g_path_get_basename(ewin->skin_file_name); + shared = get_shared_file_path("skins", base, NULL); + + if (file_names_equal(shared, ewin->skin_file_name)) + tilem_config_set(model, + "skin/f", base, + NULL); + else + tilem_config_set(model, + "skin/f", ewin->skin_file_name, + NULL); + + g_free(base); + g_free(shared); +} + +static void speed_changed(GtkToggleButton *btn, gpointer data) +{ + TilemEmulatorWindow *ewin = data; + gboolean setting = gtk_toggle_button_get_active(btn); + tilem_calc_emulator_set_limit_speed(ewin->emu, setting); + tilem_config_set("emulation", + "limit_speed/b", setting, + NULL); +} + +static void grayscale_changed(GtkToggleButton *btn, gpointer data) +{ + TilemEmulatorWindow *ewin = data; + gboolean setting = gtk_toggle_button_get_active(btn); + tilem_calc_emulator_set_grayscale(ewin->emu, setting); + tilem_config_set("emulation", + "grayscale/b", setting, + NULL); +} + +static void smooth_changed(GtkToggleButton *btn, gpointer data) +{ + TilemEmulatorWindow *ewin = data; + gboolean setting = gtk_toggle_button_get_active(btn); + ewin->lcd_smooth_scale = setting; + tilem_config_set("settings", + "smooth_scaling/b", setting, + NULL); +} + + +static void skin_enable_changed(GtkToggleButton *btn, gpointer data) +{ + TilemEmulatorWindow *ewin = data; + gboolean enable = gtk_toggle_button_get_active(btn); + + if (ewin->skin_disabled == !enable) + return; + + tilem_emulator_window_set_skin_disabled(ewin, !enable); + tilem_config_set("settings", + "skin_disabled/b", !enable, + NULL); + + save_skin_name(ewin); +} + +static void skin_file_changed(GtkWidget *fe, gpointer data) +{ + TilemEmulatorWindow *ewin = data; + char *fname = file_entry_get_filename(fe); + + if (fname && !file_names_equal(fname, ewin->skin_file_name)) { + tilem_emulator_window_set_skin(ewin, fname); + save_skin_name(ewin); + g_free(fname); + } +} + +/* Run preferences dialog. */ +void tilem_preferences_dialog(TilemEmulatorWindow *ewin) +{ + GtkWidget *dlg, *vbox1, *vbox2, *frame, *slow_rb, *fast_rb, + *grayscale_cb, *smooth_cb, *hbox, *skin_cb, *skin_entry; + + g_return_if_fail(ewin != NULL); + g_return_if_fail(ewin->emu != NULL); + + dlg = gtk_dialog_new_with_buttons("Preferences", + GTK_WINDOW(ewin->window), + GTK_DIALOG_MODAL, + GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, + NULL); + + vbox1 = gtk_vbox_new(FALSE, 12); + gtk_container_set_border_width(GTK_CONTAINER(vbox1), 6); + + /* Emulation speed */ + + vbox2 = gtk_vbox_new(FALSE, 6); + + slow_rb = gtk_radio_button_new_with_mnemonic + (NULL, "_Limit to actual calculator speed"); + gtk_box_pack_start(GTK_BOX(vbox2), slow_rb, FALSE, FALSE, 0); + + fast_rb = gtk_radio_button_new_with_mnemonic_from_widget + (GTK_RADIO_BUTTON(slow_rb), "As _fast as possible"); + gtk_box_pack_start(GTK_BOX(vbox2), fast_rb, FALSE, FALSE, 0); + + if (!ewin->emu->limit_speed) + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(fast_rb), TRUE); + + g_signal_connect(slow_rb, "toggled", + G_CALLBACK(speed_changed), ewin); + + frame = new_frame("Emulation Speed", vbox2); + gtk_box_pack_start(GTK_BOX(vbox1), frame, FALSE, FALSE, 0); + + /* Display settings */ + + vbox2 = gtk_vbox_new(FALSE, 6); + + grayscale_cb = gtk_check_button_new_with_mnemonic("Emulate _grayscale"); + gtk_box_pack_start(GTK_BOX(vbox2), grayscale_cb, FALSE, FALSE, 0); + + if (ewin->emu->grayscale) + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(grayscale_cb), TRUE); + + g_signal_connect(grayscale_cb, "toggled", + G_CALLBACK(grayscale_changed), ewin); + + smooth_cb = gtk_check_button_new_with_mnemonic("Use _smooth scaling"); + gtk_box_pack_start(GTK_BOX(vbox2), smooth_cb, FALSE, FALSE, 0); + + if (ewin->lcd_smooth_scale) + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(smooth_cb), TRUE); + + g_signal_connect(smooth_cb, "toggled", + G_CALLBACK(smooth_changed), ewin); + + hbox = gtk_hbox_new(FALSE, 6); + + skin_cb = gtk_check_button_new_with_mnemonic("Use s_kin:"); + gtk_box_pack_start(GTK_BOX(hbox), skin_cb, FALSE, FALSE, 0); + + skin_entry = file_entry_new("Select Skin", + "Skin files", "*.skn", + "All files", "*", + NULL); + gtk_box_pack_start(GTK_BOX(hbox), skin_entry, TRUE, TRUE, 0); + + gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, FALSE, 0); + + if (!ewin->skin_disabled) + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(skin_cb), TRUE); + + if (ewin->skin_file_name) + file_entry_set_filename(skin_entry, ewin->skin_file_name); + + g_signal_connect(skin_cb, "toggled", + G_CALLBACK(skin_enable_changed), ewin); + + g_signal_connect(skin_entry, "selection-changed", + G_CALLBACK(skin_file_changed), ewin); + + frame = new_frame("Display", vbox2); + gtk_box_pack_start(GTK_BOX(vbox1), frame, FALSE, FALSE, 0); + + vbox2 = gtk_dialog_get_content_area(GTK_DIALOG(dlg)); + gtk_box_pack_start(GTK_BOX(vbox2), vbox1, FALSE, FALSE, 0); + gtk_widget_show_all(vbox1); + + gtk_dialog_run(GTK_DIALOG(dlg)); + gtk_widget_destroy(dlg); +} diff --git a/tool/tilem-src/gui/rcvmenu.c b/tool/tilem-src/gui/rcvmenu.c new file mode 100644 index 0000000..22ec546 --- /dev/null +++ b/tool/tilem-src/gui/rcvmenu.c @@ -0,0 +1,665 @@ +/* + * TilEm II + * + * Copyright (c) 2010-2011 Thibault Duponchelle + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gui.h" +#include "disasmview.h" +#include "memmodel.h" +#include "files.h" +#include "filedlg.h" +#include "msgbox.h" +#include "fixedtreeview.h" + +static GtkTreeModel* fill_varlist(TilemReceiveDialog *rcvdialog); +TilemReceiveDialog* create_receive_menu(TilemCalcEmulator *emu); + +/* Columns */ +enum +{ + COL_ENTRY = 0, + COL_SLOT_STR, + COL_NAME_STR, + COL_TYPE_STR, + COL_SIZE_STR, + COL_SIZE, + NUM_COLS +}; + +#define RESPONSE_REFRESH 1 + +/* Prompt to overwrite a list of files. */ +static gboolean prompt_overwrite(GtkWindow *win, const char *dirname, + char **filenames) +{ + int i; + char *dname; + GString *conflicts = NULL; + int nconflicts = 0; + GtkWidget *dlg, *btn; + int response; + + for (i = 0; filenames[i]; i++) { + if (g_file_test(filenames[i], G_FILE_TEST_EXISTS)) { + if (conflicts) + g_string_append_c(conflicts, '\n'); + else + conflicts = g_string_new(NULL); + dname = g_filename_display_basename(filenames[i]); + g_string_append(conflicts, dname); + g_free(dname); + nconflicts++; + } + } + + if (!conflicts) + return TRUE; + + dname = g_filename_display_basename(dirname); + + dlg = gtk_message_dialog_new + (win, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, + (nconflicts == 1 + ? "Replace existing file?" + : "Replace existing files?")); + + gtk_message_dialog_format_secondary_text + (GTK_MESSAGE_DIALOG(dlg), + (nconflicts == 1 + ? "The file \"%2$s\" already exists in \"%1$s\"." + " Replacing it will overwrite its contents." + : "The following files already exist in \"%s\"." + " Replacing them will overwrite their contents:\n%s"), + dname, conflicts->str); + + g_free(dname); + g_string_free(conflicts, TRUE); + + gtk_dialog_add_button(GTK_DIALOG(dlg), + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); + + btn = gtk_button_new_with_mnemonic("_Replace"); + gtk_button_set_image(GTK_BUTTON(btn), + gtk_image_new_from_stock(GTK_STOCK_SAVE, + GTK_ICON_SIZE_BUTTON)); + gtk_widget_show(btn); + gtk_dialog_add_action_widget(GTK_DIALOG(dlg), btn, + GTK_RESPONSE_ACCEPT); + + gtk_dialog_set_alternative_button_order(GTK_DIALOG(dlg), + GTK_RESPONSE_ACCEPT, + GTK_RESPONSE_CANCEL, + -1); + + response = gtk_dialog_run(GTK_DIALOG(dlg)); + gtk_widget_destroy(dlg); + return (response == GTK_RESPONSE_ACCEPT); +} + +/* #### SIGNALS CALLBACK #### */ + +/* Prompt to save a single file. */ +static gboolean prompt_save_single(TilemReceiveDialog *rcvdialog, TilemVarEntry *tve) +{ + char *dir, *default_filename, *default_filename_r, *filename, *pattern; + + default_filename = get_default_filename(tve); + default_filename_r = utf8_to_restricted_utf8(default_filename); + g_free(default_filename); + + tilem_config_get("download", "receivefile_recentdir/f", &dir, NULL); + if (!dir) dir = g_get_current_dir(); + + pattern = g_strconcat("*.", tve->file_ext, NULL); + + filename = prompt_save_file("Save File", GTK_WINDOW(rcvdialog->window), + default_filename_r, dir, + tve->filetype_desc, pattern, + "All files", "*", + NULL); + g_free(default_filename_r); + g_free(pattern); + g_free(dir); + + if (!filename) + return FALSE; + + dir = g_path_get_dirname(filename); + tilem_config_set("download", "receivefile_recentdir/f", dir, NULL); + g_free(dir); + + tilem_link_receive_file(rcvdialog->emu, tve, filename); + g_free(filename); + return TRUE; +} + +/* Prompt to save a list of variables as a group file. */ +static gboolean prompt_save_group(TilemReceiveDialog *rcvdialog, GList *rows) +{ + char *dir, *default_filename, *pattern_desc, *pattern, *filename, *fext; + int tfmodel; + gboolean can_group = TRUE; + const char *model_str; + GList *l; + GtkTreePath *path; + GtkTreeIter iter; + TilemVarEntry *tve; + GSList *velist = NULL; + + tilem_config_get("download", "receivefile_recentdir/f", &dir, NULL); + if (!dir) dir = g_get_current_dir(); + + for (l = rows; l; l = l->next) { + path = (GtkTreePath*) l->data; + gtk_tree_model_get_iter(rcvdialog->model, &iter, path); + gtk_tree_model_get(rcvdialog->model, &iter, COL_ENTRY, &tve, -1); + velist = g_slist_prepend(velist, tve); + if (!tve->can_group) + can_group = FALSE; + } + + velist = g_slist_reverse(velist); + + tfmodel = get_calc_model(rcvdialog->emu->calc); + + fext = g_ascii_strdown(tifiles_fext_of_group(tfmodel), -1); + pattern = g_strconcat("*.", fext, NULL); + default_filename = g_strdup_printf("untitled.%s", + (can_group ? fext : "tig")); + g_free(fext); + + model_str = tifiles_model_to_string(tfmodel); + pattern_desc = g_strdup_printf("%s group files", model_str); + + filename = prompt_save_file("Save File", GTK_WINDOW(rcvdialog->window), + default_filename, dir, + pattern_desc, (can_group ? pattern : ""), + "TIGroup files", "*.tig", + "All files", "*", + NULL); + + g_free(default_filename); + g_free(dir); + g_free(pattern_desc); + g_free(pattern); + + if (!filename) { + g_slist_free(velist); + return FALSE; + } + + dir = g_path_get_dirname(filename); + tilem_config_set("download", + "receivefile_recentdir/f", dir, + "save_as_group/b", TRUE, + NULL); + g_free(dir); + + tilem_link_receive_group(rcvdialog->emu, velist, filename); + + g_free(filename); + g_slist_free(velist); + return TRUE; +} + +/* Prompt to save a list of files. Input is a list of GtkTreePaths */ +static gboolean prompt_save_multiple(TilemReceiveDialog *rcvdialog, GList *rows) +{ + char *dir, *dir_selected, *default_filename, *default_filename_f; + GList *l; + GtkTreePath *path; + GtkTreeIter iter; + TilemVarEntry *tve, **vars; + char **names; + gboolean is_81, use_group; + int i; + + is_81 = (rcvdialog->emu->calc->hw.model_id == TILEM_CALC_TI81); + use_group = gtk_toggle_button_get_active + (GTK_TOGGLE_BUTTON(rcvdialog->group_rb)); + + if (use_group && !is_81) + return prompt_save_group(rcvdialog, rows); + + tilem_config_get("download", "receivefile_recentdir/f", &dir, NULL); + if (!dir) dir = g_get_current_dir(); + + dir_selected = prompt_select_dir("Save Files to Directory", + GTK_WINDOW(rcvdialog->window), + dir); + g_free(dir); + + if (!dir_selected) + return FALSE; + + tilem_config_set("download", + "receivefile_recentdir/f", dir_selected, + "save_as_group/b", use_group, + NULL); + + vars = g_new(TilemVarEntry *, g_list_length(rows) + 1); + names = g_new(char *, g_list_length(rows) + 1); + + for (l = rows, i = 0; l; l = l->next, i++) { + path = (GtkTreePath*) l->data; + gtk_tree_model_get_iter(rcvdialog->model, &iter, path); + gtk_tree_model_get(rcvdialog->model, &iter, COL_ENTRY, &tve, -1); + + vars[i] = tve; + + default_filename = get_default_filename(tve); + default_filename_f = utf8_to_filename(default_filename); + names[i] = g_build_filename(dir_selected, + default_filename_f, NULL); + g_free(default_filename); + g_free(default_filename_f); + } + + vars[i] = NULL; + names[i] = NULL; + + if (!prompt_overwrite(GTK_WINDOW(rcvdialog->window), + dir_selected, names)) { + g_free(vars); + g_strfreev(names); + g_free(dir_selected); + return FALSE; + } + + for (i = 0; vars[i]; i++) + tilem_link_receive_file(rcvdialog->emu, vars[i], names[i]); + + g_free(vars); + g_strfreev(names); + g_free(dir_selected); + return TRUE; +} + +/* Event called on Send button click. Get the selected var/app and save it. */ +static gboolean prompt_save(TilemReceiveDialog *rcvdialog) +{ + TilemVarEntry *tve; /* Variable entry */ + GtkTreeSelection* selection = NULL; /* GtkTreeSelection */ + GtkTreeModel *model; + GtkTreeIter iter; + GList *rows, *l; + GtkTreePath *path; + gboolean status; + + /* Get the selected entry */ + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(rcvdialog->treeview)); + rows = gtk_tree_selection_get_selected_rows(selection, &model); + + if (!rows) + return FALSE; + + if (!rows->next) { + path = (GtkTreePath*) rows->data; + gtk_tree_model_get_iter(model, &iter, path); + gtk_tree_model_get(model, &iter, COL_ENTRY, &tve, -1); + status = prompt_save_single(rcvdialog, tve); + } + else { + status = prompt_save_multiple(rcvdialog, rows); + } + + for (l = rows; l; l = l->next) + gtk_tree_path_free(l->data); + g_list_free(rows); + return status; +} + +/* Dialog response button clicked */ +static void dialog_response(GtkDialog *dlg, gint response, gpointer data) +{ + TilemReceiveDialog* rcvdialog = (TilemReceiveDialog*) data; + + switch (response) { + case RESPONSE_REFRESH: + if (!rcvdialog->refresh_pending) { + rcvdialog->refresh_pending = TRUE; + tilem_link_get_dirlist(rcvdialog->emu); + } + break; + + case GTK_RESPONSE_ACCEPT: + if (!prompt_save(rcvdialog)) + break; + default: + gtk_widget_hide(GTK_WIDGET(dlg)); + } +} + +/* Selection changed */ +static void selection_changed(GtkTreeSelection *sel, gpointer data) +{ + TilemReceiveDialog* rcvdialog = data; + int n = gtk_tree_selection_count_selected_rows(sel); + + gtk_dialog_set_response_sensitive(GTK_DIALOG(rcvdialog->window), + GTK_RESPONSE_ACCEPT, (n > 0)); + gtk_widget_set_sensitive(rcvdialog->mode_box, (n > 1)); +} + +/* Row activated in tree view */ +static void row_activated(G_GNUC_UNUSED GtkTreeView *treeview, + G_GNUC_UNUSED GtkTreePath *path, + G_GNUC_UNUSED GtkTreeViewColumn *col, + gpointer data) +{ + TilemReceiveDialog* rcvdialog = (TilemReceiveDialog*) data; + gtk_dialog_response(GTK_DIALOG(rcvdialog->window), GTK_RESPONSE_ACCEPT); +} + +/* #### WIDGET CREATION #### */ + +/* Create a new scrolled window with sensible default settings. */ +static GtkWidget *new_scrolled_window(GtkWidget *contents) +{ + GtkWidget *sw; + sw = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), + GTK_POLICY_NEVER, + GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), + GTK_SHADOW_IN); + gtk_container_add(GTK_CONTAINER(sw), contents); + return sw; +} + +/* Create the (empty) GtkTreeView to show the vars list */ +static GtkWidget *create_varlist(TilemReceiveDialog *rcvdialog) +{ + GtkCellRenderer *renderer; + GtkWidget *treeview; + GtkTreeSelection *sel; + GtkTreeViewColumn *c1, *c2, *c3, *c4; + gboolean is_81; + + g_return_val_if_fail(rcvdialog->emu != NULL, NULL); + g_return_val_if_fail(rcvdialog->emu->calc != NULL, NULL); + + is_81 = (rcvdialog->emu->calc->hw.model_id == TILEM_CALC_TI81); + + /* Create the stack list tree view and set title invisible */ + treeview = gtk_tree_view_new(); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), TRUE); + gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(treeview), TRUE); + gtk_tree_view_set_fixed_height_mode(GTK_TREE_VIEW(treeview), TRUE); + + /* Allow multiple selection */ + sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); + gtk_tree_selection_set_mode(sel, GTK_SELECTION_MULTIPLE); + + /* Create the columns */ + renderer = gtk_cell_renderer_text_new(); + + if (is_81) { + c1 = gtk_tree_view_column_new_with_attributes + ("Slot", renderer, "text", COL_SLOT_STR, NULL); + + gtk_tree_view_column_set_sizing(c1, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_sort_column_id(c1, COL_SLOT_STR); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), c1); + } + + c2 = gtk_tree_view_column_new_with_attributes + ("Name", renderer, "text", COL_NAME_STR, NULL); + + gtk_tree_view_column_set_sizing(c2, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_sort_column_id(c2, COL_NAME_STR); + gtk_tree_view_column_set_expand(c2, TRUE); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), c2); + + if (!is_81) { + c3 = gtk_tree_view_column_new_with_attributes + ("Type", renderer, "text", COL_TYPE_STR, NULL); + + gtk_tree_view_column_set_sizing(c3, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_sort_column_id(c3, COL_TYPE_STR); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), c3); + } + + renderer = gtk_cell_renderer_text_new(); + g_object_set(renderer, "xalign", 1.0, NULL); + c4 = gtk_tree_view_column_new_with_attributes + ("Size", renderer, "text", COL_SIZE_STR, NULL); + + gtk_tree_view_column_set_sizing(c4, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_sort_column_id(c4, COL_SIZE); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), c4); + + g_signal_connect(sel, "changed", + G_CALLBACK(selection_changed), rcvdialog); + + g_signal_connect(treeview, "row-activated", + G_CALLBACK(row_activated), rcvdialog); + + return treeview; +} + +/* Fill the list of vars. In fact, add all vars from list to a GtkListStore */ +static GtkTreeModel* fill_varlist(TilemReceiveDialog *rcvdialog) +{ + GSList *l; + TilemVarEntry *tve; + GtkListStore *store; + GtkTreeIter iter; + char *size_str; + + store = gtk_list_store_new(6, + G_TYPE_POINTER, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_INT); + + for (l = rcvdialog->vars; l; l = l->next) { + tve = l->data; + gtk_list_store_append(store, &iter); +#ifdef G_OS_WIN32 + size_str = g_strdup_printf("%d", tve->size); +#else + size_str = g_strdup_printf("%'d", tve->size); +#endif + gtk_list_store_set(store, &iter, + COL_ENTRY, tve, + COL_SLOT_STR, tve->slot_str, + COL_NAME_STR, tve->name_str, + COL_TYPE_STR, tve->type_str, + COL_SIZE_STR, size_str, + COL_SIZE, tve->size, + -1); + g_free(size_str); + } + + return GTK_TREE_MODEL(store); +} + +/* Create a new menu for receiving vars. */ +/* Previous allocated and filled varlist is needed */ +TilemReceiveDialog* tilem_receive_dialog_new(TilemCalcEmulator *emu) +{ + TilemReceiveDialog* rcvdialog = g_slice_new0(TilemReceiveDialog); + GtkWidget *scroll, *btn, *vbox, *lbl, *rb, *vbox2; + int defheight = 300; + gboolean is_81; + gboolean use_group; + + g_return_val_if_fail(emu != NULL, NULL); + g_return_val_if_fail(emu->ewin != NULL, NULL); + g_return_val_if_fail(emu->calc != NULL, NULL); + + rcvdialog->emu = emu; + emu->rcvdlg = rcvdialog; + + is_81 = (emu->calc->hw.model_id == TILEM_CALC_TI81); + + rcvdialog->window = gtk_dialog_new(); + gtk_window_set_transient_for(GTK_WINDOW(rcvdialog->window), + GTK_WINDOW(emu->ewin->window)); + + gtk_window_set_title(GTK_WINDOW(rcvdialog->window), "Receive File"); + + btn = gtk_dialog_add_button(GTK_DIALOG(rcvdialog->window), + GTK_STOCK_REFRESH, RESPONSE_REFRESH); + + if (is_81) + gtk_widget_hide(btn); + + gtk_dialog_add_button(GTK_DIALOG(rcvdialog->window), + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); + gtk_dialog_add_button(GTK_DIALOG(rcvdialog->window), + GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT); + + gtk_dialog_set_default_response(GTK_DIALOG(rcvdialog->window), + GTK_RESPONSE_ACCEPT); + gtk_dialog_set_alternative_button_order(GTK_DIALOG(rcvdialog->window), + RESPONSE_REFRESH, + GTK_RESPONSE_ACCEPT, + GTK_RESPONSE_CANCEL, + -1); + + /* Set the size of the dialog */ + gtk_window_set_default_size(GTK_WINDOW(rcvdialog->window), -1, defheight); + + /* Create and fill tree view */ + rcvdialog->treeview = create_varlist(rcvdialog); + + /* Allow scrolling the list because we can't know how many vars the calc contains */ + scroll = new_scrolled_window(rcvdialog->treeview); + + vbox = gtk_vbox_new(FALSE, 6); + gtk_container_set_border_width(GTK_CONTAINER(vbox), 6); + gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(scroll), TRUE, TRUE, 0); + + rcvdialog->mode_box = gtk_hbox_new(FALSE, 6); + lbl = gtk_label_new("Save as:"); + gtk_box_pack_start(GTK_BOX(rcvdialog->mode_box), lbl, FALSE, FALSE, 0); + + rb = gtk_radio_button_new_with_mnemonic(NULL, "S_eparate files"); + gtk_box_pack_start(GTK_BOX(rcvdialog->mode_box), rb, FALSE, FALSE, 0); + rcvdialog->multiple_rb = rb; + + rb = gtk_radio_button_new_with_mnemonic_from_widget + (GTK_RADIO_BUTTON(rb), "_Group file"); + gtk_box_pack_start(GTK_BOX(rcvdialog->mode_box), rb, FALSE, FALSE, 0); + rcvdialog->group_rb = rb; + + tilem_config_get("download", "save_as_group/b=1", &use_group, NULL); + if (use_group) + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rb), TRUE); + + if (is_81) + gtk_widget_set_no_show_all(rcvdialog->mode_box, TRUE); + + gtk_box_pack_start(GTK_BOX(vbox), rcvdialog->mode_box, FALSE, FALSE, 0); + vbox2 = gtk_dialog_get_content_area(GTK_DIALOG(rcvdialog->window)); + gtk_box_pack_start(GTK_BOX(vbox2), vbox, TRUE, TRUE, 0); + + /* Signals callback */ + g_signal_connect(rcvdialog->window, "response", + G_CALLBACK(dialog_response), rcvdialog); + g_signal_connect(rcvdialog->window, "delete-event", + G_CALLBACK(gtk_widget_hide_on_delete), NULL); + + gtk_widget_show_all(vbox); + + return rcvdialog; +} + +/* Destroy a TilemReceiveDialog */ +void tilem_receive_dialog_free(TilemReceiveDialog *rcvdialog) +{ + GSList *l; + + g_return_if_fail(rcvdialog != NULL); + + gtk_widget_destroy(rcvdialog->window); + + for (l = rcvdialog->vars; l; l = l->next) + tilem_var_entry_free(l->data); + g_slist_free(rcvdialog->vars); + + g_slice_free(TilemReceiveDialog, rcvdialog); +} + +void tilem_receive_dialog_update(TilemReceiveDialog *rcvdialog, GSList *varlist) +{ + GSList *l; + + g_return_if_fail(rcvdialog != NULL); + + rcvdialog->refresh_pending = FALSE; + + for (l = rcvdialog->vars; l; l = l->next) + tilem_var_entry_free(l->data); + g_slist_free(rcvdialog->vars); + + rcvdialog->vars = varlist; + rcvdialog->model = fill_varlist(rcvdialog); + gtk_tree_view_set_model(GTK_TREE_VIEW(rcvdialog->treeview), rcvdialog->model); + + fixed_tree_view_init(rcvdialog->treeview, 0, + COL_SLOT_STR, "PrgmM ", + COL_NAME_STR, "MMMMMMMMM ", + COL_TYPE_STR, "MMMMMM ", + COL_SIZE_STR, "00,000,000", + -1); + + gtk_widget_grab_focus(rcvdialog->treeview); + gtk_window_present(GTK_WINDOW(rcvdialog->window)); +} + +/* Popup the receive window */ +/* This is the entry point */ +void popup_receive_menu(TilemEmulatorWindow *ewin) +{ + g_return_if_fail(ewin != NULL); + g_return_if_fail(ewin->emu != NULL); + g_return_if_fail(ewin->emu->calc != NULL); + + if (ewin->emu->rcvdlg && ewin->emu->rcvdlg->refresh_pending) + return; + + /* TI-81 takes no time to refresh, so do it automatically */ + if (!ewin->emu->rcvdlg + || ewin->emu->calc->hw.model_id == TILEM_CALC_TI81) { + tilem_link_get_dirlist(ewin->emu); + } + else { + gtk_widget_grab_focus(ewin->emu->rcvdlg->treeview); + gtk_window_present(GTK_WINDOW(ewin->emu->rcvdlg->window)); + } +} diff --git a/tool/tilem-src/gui/screenshot.c b/tool/tilem-src/gui/screenshot.c new file mode 100644 index 0000000..d8b7e51 --- /dev/null +++ b/tool/tilem-src/gui/screenshot.c @@ -0,0 +1,810 @@ +/* + * TilEm II + * + * Copyright (c) 2010-2011 Thibault Duponchelle + * Copyright (c) 2011 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include "gui.h" +#include "files.h" +#include "filedlg.h" +#include "msgbox.h" + +#define DEFAULT_WIDTH_96 192 +#define DEFAULT_HEIGHT_96 128 +#define DEFAULT_WIDTH_128 256 +#define DEFAULT_HEIGHT_128 128 +#define DEFAULT_FORMAT "png" + +struct imgsize { + int width; + int height; +}; + +static const struct imgsize normal_sizes[] = + { { 96, 64 }, { 192, 128 }, { 288, 192 } }; + +static const struct imgsize wide_sizes[] = + /* actual aspect ratio is 92:55 or 1.673:1 */ + { { 128, 64 }, { 128, 77 }, + { 214, 128 }, { 256, 128 }, { 256, 153 }, + { 321, 192 }, { 384, 192 } }; + +static void grab_screen(GtkButton *btn, TilemScreenshotDialog *ssdlg); +static void begin_animation(GtkButton *btn, TilemScreenshotDialog *ssdlg); +static void end_animation(GtkButton *btn, TilemScreenshotDialog *ssdlg); +static gboolean save_output(TilemScreenshotDialog *ssdlg); + +static char* find_free_filename(const char* directory, + const char* filename, + const char* extension); + +/* Test if the calc has a wide screen (ti86) */ +static gboolean is_wide_screen(TilemCalcEmulator *emu) +{ + g_return_val_if_fail(emu != NULL, FALSE); + g_return_val_if_fail(emu->calc != NULL, FALSE); + + return (emu->calc->hw.lcdwidth == 128); +} + +/* Quick screenshot: save a screenshot with predefined settings, + without prompting the user */ +void quick_screenshot(TilemEmulatorWindow *ewin) +{ + char *folder, *filename, *format; + int grayscale, w96, h96, w128, h128, width, height; + TilemAnimation *anim; + GError *err = NULL; + GdkColor fg, bg; + + tilem_config_get("screenshot", + "directory/f", &folder, + "format/s", &format, + "grayscale/b=1", &grayscale, + "width_96x64/i", &w96, + "height_96x64/i", &h96, + "width_128x64/i", &w128, + "height_128x64/i", &h128, + "foreground/c=#000", &fg, + "background/c=#fff", &bg, + NULL); + + anim = tilem_calc_emulator_get_screenshot(ewin->emu, grayscale); + if (!anim) { + g_free(folder); + g_free(format); + return; + } + + if (is_wide_screen(ewin->emu)) { + width = (w128 > 0 ? w128 : DEFAULT_WIDTH_128); + height = (h128 > 0 ? h128 : DEFAULT_HEIGHT_128); + } + else { + width = (w96 > 0 ? w96 : DEFAULT_WIDTH_96); + height = (h96 > 0 ? h96 : DEFAULT_HEIGHT_96); + } + + tilem_animation_set_size(anim, width, height); + tilem_animation_set_colors(anim, &fg, &bg); + + if (!folder) + folder = get_config_file_path("screenshots", NULL); + + if (!format) + format = g_strdup(DEFAULT_FORMAT); + + g_mkdir_with_parents(folder, 0755); + + filename = find_free_filename(folder, "screenshot", format); + if (!filename) { + g_free(folder); + g_free(format); + g_object_unref(anim); + return; + } + + printf("screenshot saved : %s\n", filename); + + if (!tilem_animation_save(anim, filename, format, NULL, NULL, &err)) { + messagebox01(ewin->window, GTK_MESSAGE_ERROR, + "Unable to save screenshot", + "%s", err->message); + g_error_free(err); + } + + g_object_unref(anim); + g_free(filename); + g_free(folder); + g_free(format); +} + +/* Look for a free filename by testing [folder]/[basename]000.[extension] to [folder]/[basename]999.[extension] + Return a newly allocated string if success + Return null if no filename found */ +static char* find_free_filename(const char* folder, + const char* basename, + const char* extension) +{ + int i; + char *filename, *prefix; + + if(folder) + prefix = g_build_filename(folder, basename, NULL); + else + prefix = g_build_filename(basename, NULL); + + /* I do not use a while and limit number to 1000 because for any reason, if there's a problem in this scope + I don't want to freeze tilem (if tilem don't find a free filename and never return anything) + Limit to 1000 prevent this problem but if you prefer we could use a while wich wait a valid filename... */ + for(i=0; i<999; i++) { + filename = g_strdup_printf("%s%03d.%s", prefix, i, extension); + if(!g_file_test(filename, G_FILE_TEST_IS_REGULAR)) { + g_free(prefix); + return filename; + } + g_free(filename); + } + + g_free(prefix); + return NULL; +} + +/* Change the review image to set the current animation */ +static void set_current_animation(TilemScreenshotDialog *ssdlg, + TilemAnimation *anim) +{ + GtkImage *img = GTK_IMAGE(ssdlg->screenshot_preview_image); + int width, height; + GdkColor fg, bg; + gdouble speed; + + if (anim) + g_object_ref(anim); + if (ssdlg->current_anim) + g_object_unref(ssdlg->current_anim); + ssdlg->current_anim = anim; + + if (!anim) { + gtk_image_set_from_animation(img, NULL); + gtk_dialog_set_response_sensitive(GTK_DIALOG(ssdlg->window), + GTK_RESPONSE_ACCEPT, FALSE); + } + else { + width = gtk_spin_button_get_value_as_int + (GTK_SPIN_BUTTON(ssdlg->width_spin)); + height = gtk_spin_button_get_value_as_int + (GTK_SPIN_BUTTON(ssdlg->height_spin)); + tilem_animation_set_size(anim, width, height); + + gtk_color_button_get_color + (GTK_COLOR_BUTTON(ssdlg->foreground_color), &fg); + gtk_color_button_get_color + (GTK_COLOR_BUTTON(ssdlg->background_color), &bg); + tilem_animation_set_colors(anim, &fg, &bg); + + speed = gtk_spin_button_get_value + (GTK_SPIN_BUTTON(ssdlg->animation_speed)); + tilem_animation_set_speed(anim, speed); + + gtk_image_set_from_animation(img, GDK_PIXBUF_ANIMATION(anim)); + + /* Need to call gtk_widget_show because we hide it + while recording */ + gtk_widget_show(ssdlg->screenshot_preview_image); + + gtk_dialog_set_response_sensitive(GTK_DIALOG(ssdlg->window), + GTK_RESPONSE_ACCEPT, TRUE); + } +} + +static void dialog_response(G_GNUC_UNUSED GtkDialog *dialog, gint response, gpointer data) +{ + TilemScreenshotDialog *ssdlg = data; + + if (response == GTK_RESPONSE_ACCEPT) { + if (!save_output(ssdlg)) + return; + } + + gtk_widget_hide(GTK_WIDGET(dialog)); + end_animation(NULL, ssdlg); + set_current_animation(ssdlg, NULL); +} + +static void set_size_spin_buttons(TilemScreenshotDialog *ssdlg, + int width, int height) +{ + gtk_spin_button_set_value(GTK_SPIN_BUTTON(ssdlg->width_spin), width); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(ssdlg->height_spin), height); +} + +enum { + COL_TEXT, + COL_WIDTH, + COL_HEIGHT +}; + +static void animation_speed_changed(GtkSpinButton *animation_speed, + gpointer data) +{ + TilemScreenshotDialog *ssdlg = data; + TilemAnimation * anim = ssdlg->current_anim; + gdouble value = gtk_spin_button_get_value(animation_speed); + tilem_animation_set_speed(anim, value); +} + +/* Combo box changed. Update spin buttons accordingly. */ +static void size_combo_changed(GtkComboBox *combo, + TilemScreenshotDialog *ssdlg) +{ + GtkTreeModel *model; + GtkTreeIter iter; + int width, height; + + if (gtk_combo_box_get_active_iter(combo, &iter)) { + model = gtk_combo_box_get_model(combo); + gtk_tree_model_get(model, &iter, + COL_WIDTH, &width, + COL_HEIGHT, &height, + -1); + if (width && height) + set_size_spin_buttons(ssdlg, width, height); + } +} + +static void size_spin_changed(G_GNUC_UNUSED GtkSpinButton *sb, + TilemScreenshotDialog *ssdlg) +{ + GtkComboBox *combo = GTK_COMBO_BOX(ssdlg->ss_size_combo); + GtkTreeModel *model; + GtkTreeIter iter; + int width, height, w, h; + + model = gtk_combo_box_get_model(combo); + if (!model || !gtk_tree_model_get_iter_first(model, &iter)) + return; + + width = gtk_spin_button_get_value_as_int + (GTK_SPIN_BUTTON(ssdlg->width_spin)); + height = gtk_spin_button_get_value_as_int + (GTK_SPIN_BUTTON(ssdlg->height_spin)); + + do { + gtk_tree_model_get(model, &iter, + COL_WIDTH, &w, + COL_HEIGHT, &h, + -1); + + if ((w == 0 && h == 0) || (w == width && h == height)) { + gtk_combo_box_set_active_iter(combo, &iter); + break; + } + } while (gtk_tree_model_iter_next(model, &iter)); + + set_current_animation(ssdlg, ssdlg->current_anim); +} + +static void fill_size_combobox(GtkComboBox *combo, + const struct imgsize *sizes, + int nsizes) +{ + GtkListStore *store; + GtkTreeIter iter; + int i; + char *s; + + store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT); + + for (i = 0; i < nsizes; i++) { + s = g_strdup_printf("%d \303\227 %d", + sizes[i].width, + sizes[i].height); + + gtk_list_store_append(store, &iter); + gtk_list_store_set(store, &iter, + COL_TEXT, s, + COL_WIDTH, sizes[i].width, + COL_HEIGHT, sizes[i].height, + -1); + g_free(s); + } + + gtk_list_store_append(store, &iter); + gtk_list_store_set(store, &iter, + COL_TEXT, "Custom", + COL_WIDTH, 0, + COL_HEIGHT, 0, + -1); + + gtk_combo_box_set_model(GTK_COMBO_BOX(combo), GTK_TREE_MODEL(store)); +} + +/* This method is called when a color is set (foreground or background) + * It set a new palette based on new custom colors + * It refresh the screen to print new colors + */ +static void color_changed(G_GNUC_UNUSED GtkSpinButton *sb, + TilemScreenshotDialog *ssdlg) +{ + set_current_animation(ssdlg, ssdlg->current_anim); +} + +/* Create the screenshot menu */ +static TilemScreenshotDialog * create_screenshot_window(TilemCalcEmulator *emu) +{ + TilemScreenshotDialog *ssdlg = g_slice_new0(TilemScreenshotDialog); + GtkWidget *main_table, *vbox, *frame, *config_expander, + *tbl, *lbl, *align; + GtkCellRenderer *cell; + + ssdlg->emu = emu; + + ssdlg->window = gtk_dialog_new_with_buttons + ("Screenshot", + (emu->ewin ? GTK_WINDOW(emu->ewin->window) : NULL), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, + NULL); + + gtk_window_set_resizable(GTK_WINDOW(ssdlg->window), FALSE); + + gtk_dialog_set_alternative_button_order(GTK_DIALOG(ssdlg->window), + GTK_RESPONSE_ACCEPT, + GTK_RESPONSE_CANCEL, + -1); + + gtk_dialog_set_default_response(GTK_DIALOG(ssdlg->window), + GTK_RESPONSE_ACCEPT); + + g_signal_connect(ssdlg->window, "response", + G_CALLBACK(dialog_response), ssdlg); + + g_signal_connect(ssdlg->window, "delete-event", + G_CALLBACK(gtk_widget_hide_on_delete), NULL); + + main_table = gtk_table_new(2, 2, FALSE); + gtk_table_set_row_spacings(GTK_TABLE(main_table), 6); + gtk_table_set_col_spacings(GTK_TABLE(main_table), 12); + gtk_container_set_border_width(GTK_CONTAINER(main_table), 6); + + /* Preview */ + + frame = gtk_frame_new("Preview"); + gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_NONE); + + ssdlg->screenshot_preview_image = gtk_image_new(); + align = gtk_alignment_new(0.0, 0.0, 0.0, 0.0); + gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 0, 12, 0); + gtk_container_add(GTK_CONTAINER(align), ssdlg->screenshot_preview_image); + + gtk_container_add(GTK_CONTAINER(frame), align); + gtk_table_attach(GTK_TABLE(main_table), frame, 0, 1, 0, 1, + GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); + + /* Buttons */ + + vbox = gtk_vbutton_box_new(); + gtk_button_box_set_layout(GTK_BUTTON_BOX(vbox), GTK_BUTTONBOX_START); + gtk_box_set_spacing(GTK_BOX(vbox), 6); + + ssdlg->screenshot = gtk_button_new_with_mnemonic("_Grab"); + gtk_box_pack_start(GTK_BOX(vbox), ssdlg->screenshot, FALSE, FALSE, 0); + + ssdlg->record = gtk_button_new_with_mnemonic("_Record"); + gtk_box_pack_start(GTK_BOX(vbox), ssdlg->record, FALSE, FALSE, 0); + + ssdlg->stop = gtk_button_new_with_mnemonic("_Stop"); + gtk_box_pack_start(GTK_BOX(vbox), ssdlg->stop, FALSE, FALSE, 0); + gtk_widget_set_sensitive(GTK_WIDGET(ssdlg->stop), FALSE); + + gtk_table_attach(GTK_TABLE(main_table), vbox, 1, 2, 0, 2, + GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); + + /* Options */ + + config_expander = gtk_expander_new("Options"); + + tbl = gtk_table_new(7, 2, FALSE); + gtk_table_set_row_spacings(GTK_TABLE(tbl), 6); + gtk_table_set_col_spacings(GTK_TABLE(tbl), 6); + + ssdlg->grayscale_tb = gtk_check_button_new_with_mnemonic("Gra_yscale"); + gtk_table_attach(GTK_TABLE(tbl), ssdlg->grayscale_tb, + 0, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); + + lbl = gtk_label_new_with_mnemonic("Image si_ze:"); + gtk_misc_set_alignment(GTK_MISC(lbl), LABEL_X_ALIGN, 0.5); + gtk_table_attach(GTK_TABLE(tbl), lbl, + 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0); + + ssdlg->ss_size_combo = gtk_combo_box_new(); + cell = gtk_cell_renderer_text_new(); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(ssdlg->ss_size_combo), + cell, TRUE); + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(ssdlg->ss_size_combo), + cell, "text", COL_TEXT, NULL); + gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), ssdlg->ss_size_combo); + gtk_table_attach(GTK_TABLE(tbl), ssdlg->ss_size_combo, + 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); + + lbl = gtk_label_new_with_mnemonic("_Width:"); + gtk_misc_set_alignment(GTK_MISC(lbl), LABEL_X_ALIGN, 0.5); + gtk_table_attach(GTK_TABLE(tbl), lbl, + 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0); + + ssdlg->width_spin = gtk_spin_button_new_with_range(1, 750, 1); + gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), ssdlg->width_spin); + align = gtk_alignment_new(0.0, 0.5, 0.0, 1.0); + gtk_container_add(GTK_CONTAINER(align), ssdlg->width_spin); + gtk_table_attach(GTK_TABLE(tbl), align, + 1, 2, 2, 3, GTK_FILL, GTK_FILL, 0, 0); + + lbl = gtk_label_new_with_mnemonic("_Height:"); + gtk_misc_set_alignment(GTK_MISC(lbl), LABEL_X_ALIGN, 0.5); + gtk_table_attach(GTK_TABLE(tbl), lbl, + 0, 1, 3, 4, GTK_FILL, GTK_FILL, 0, 0); + + ssdlg->height_spin = gtk_spin_button_new_with_range(1, 500, 1); + gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), ssdlg->height_spin); + align = gtk_alignment_new(0.0, 0.5, 0.0, 1.0); + gtk_container_add(GTK_CONTAINER(align), ssdlg->height_spin); + gtk_table_attach(GTK_TABLE(tbl), align, + 1, 2, 3, 4, GTK_FILL, GTK_FILL, 0, 0); + + + lbl = gtk_label_new_with_mnemonic("Animation s_peed:"); + gtk_misc_set_alignment(GTK_MISC(lbl), LABEL_X_ALIGN, 0.5); + gtk_table_attach(GTK_TABLE(tbl), lbl, + 0, 1, 4, 5, GTK_FILL, GTK_FILL, 0, 0); + + ssdlg->animation_speed = gtk_spin_button_new_with_range(0.1, 100.0, 0.1); + gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), ssdlg->animation_speed); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(ssdlg->animation_speed), 1.0); + align = gtk_alignment_new(0.0, 0.5, 0.0, 1.0); + gtk_container_add(GTK_CONTAINER(align), ssdlg->animation_speed); + gtk_table_attach(GTK_TABLE(tbl), align, + 1, 2, 4, 5, GTK_FILL, GTK_FILL, 0, 0); + + /* Foreground color and background color */ + lbl = gtk_label_new_with_mnemonic("_Foreground:"); + gtk_misc_set_alignment(GTK_MISC(lbl), LABEL_X_ALIGN, 0.5); + gtk_table_attach(GTK_TABLE(tbl), lbl, + 0, 1, 5, 6, GTK_FILL, GTK_FILL, 0, 0); + + ssdlg->foreground_color = gtk_color_button_new(); + gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), ssdlg->foreground_color); + align = gtk_alignment_new(0.0, 0.5, 0.0, 1.0); + gtk_container_add(GTK_CONTAINER(align), ssdlg->foreground_color); + gtk_table_attach(GTK_TABLE(tbl), align, + 1, 2, 5, 6, GTK_FILL, GTK_FILL, 0, 0); + + lbl = gtk_label_new_with_mnemonic("_Background:"); + gtk_misc_set_alignment(GTK_MISC(lbl), LABEL_X_ALIGN, 0.5); + gtk_table_attach(GTK_TABLE(tbl), lbl, + 0, 1, 6, 7, GTK_FILL, GTK_FILL, 0, 0); + + ssdlg->background_color = gtk_color_button_new(); + gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), ssdlg->background_color); + align = gtk_alignment_new(0.0, 0.5, 0.0, 1.0); + gtk_container_add(GTK_CONTAINER(align), ssdlg->background_color); + gtk_table_attach(GTK_TABLE(tbl), align, + 1, 2, 6, 7, GTK_FILL, GTK_FILL, 0, 0); + + align = gtk_alignment_new(0.5, 0.5, 1.0, 1.0); + gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 0, 12, 0); + gtk_container_add(GTK_CONTAINER(align), tbl); + + gtk_container_add(GTK_CONTAINER(config_expander), align); + + gtk_table_attach(GTK_TABLE(main_table), config_expander, 0, 1, 1, 2, + GTK_FILL, GTK_FILL, 0, 0); + + g_signal_connect(ssdlg->screenshot, "clicked", + G_CALLBACK(grab_screen), ssdlg); + g_signal_connect(ssdlg->record, "clicked", + G_CALLBACK(begin_animation), ssdlg); + g_signal_connect(ssdlg->stop, "clicked", + G_CALLBACK(end_animation), ssdlg); + + g_signal_connect(ssdlg->ss_size_combo, "changed", + G_CALLBACK(size_combo_changed), ssdlg); + g_signal_connect(ssdlg->width_spin, "value-changed", + G_CALLBACK(size_spin_changed), ssdlg); + g_signal_connect(ssdlg->height_spin, "value-changed", + G_CALLBACK(size_spin_changed), ssdlg); + g_signal_connect(ssdlg->animation_speed, "value-changed", + G_CALLBACK(animation_speed_changed), ssdlg); + + g_signal_connect(ssdlg->foreground_color, "color-set", + G_CALLBACK(color_changed), ssdlg); + g_signal_connect(ssdlg->background_color, "color-set", + G_CALLBACK(color_changed), ssdlg); + /*g_signal_connect(config_expander, "activate", + G_CALLBACK(on_config_expander_activate), ssdlg); + */ + vbox = gtk_dialog_get_content_area(GTK_DIALOG(ssdlg->window)); + gtk_container_add(GTK_CONTAINER(vbox), main_table); + gtk_widget_show_all(main_table); + + return ssdlg; +} + +/* Popup the screenshot window */ +void popup_screenshot_window(TilemEmulatorWindow *ewin) +{ + TilemScreenshotDialog *ssdlg; + int w96, h96, w128, h128, width, height, grayscale; + GdkColor fg, bg; + + g_return_if_fail(ewin != NULL); + g_return_if_fail(ewin->emu != NULL); + + if (!ewin->emu->ssdlg) + ewin->emu->ssdlg = create_screenshot_window(ewin->emu); + ssdlg = ewin->emu->ssdlg; + + tilem_config_get("screenshot", + "grayscale/b=1", &grayscale, + "width_96x64/i", &w96, + "height_96x64/i", &h96, + "width_128x64/i", &w128, + "height_128x64/i", &h128, + "foreground/c=#000", &fg, + "background/c=#fff", &bg, + NULL); + + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ssdlg->grayscale_tb), + grayscale); + + if (is_wide_screen(ewin->emu)) { + fill_size_combobox(GTK_COMBO_BOX(ssdlg->ss_size_combo), + wide_sizes, G_N_ELEMENTS(wide_sizes)); + width = (w128 > 0 ? w128 : DEFAULT_WIDTH_128); + height = (h128 > 0 ? h128 : DEFAULT_HEIGHT_128); + } + else { + fill_size_combobox(GTK_COMBO_BOX(ssdlg->ss_size_combo), + normal_sizes, G_N_ELEMENTS(normal_sizes)); + width = (w96 > 0 ? w96 : DEFAULT_WIDTH_96); + height = (h96 > 0 ? h96 : DEFAULT_HEIGHT_96); + } + + set_size_spin_buttons(ssdlg, width, height); + size_spin_changed(NULL, ssdlg); + + gtk_color_button_set_color(GTK_COLOR_BUTTON(ssdlg->foreground_color), &fg); + gtk_color_button_set_color(GTK_COLOR_BUTTON(ssdlg->background_color), &bg); + + grab_screen(NULL, ssdlg); + gtk_window_present(GTK_WINDOW(ssdlg->window)); +} + +/* Save the current (static) output */ +static gboolean save_output(TilemScreenshotDialog *ssdlg) +{ + char *dir, *format, *filename, *basename; + TilemAnimation *anim = ssdlg->current_anim; + GdkPixbufAnimation *ganim = GDK_PIXBUF_ANIMATION(anim); + const char *format_opt, *width_opt, *height_opt; + gboolean is_static; + int width, height; + GdkColor fg, bg; + GError *err = NULL; + + g_return_val_if_fail(anim != NULL, FALSE); + + is_static = gdk_pixbuf_animation_is_static_image(ganim); + width = gdk_pixbuf_animation_get_width(ganim); + height = gdk_pixbuf_animation_get_height(ganim); + + gtk_color_button_get_color + (GTK_COLOR_BUTTON(ssdlg->foreground_color), &fg); + gtk_color_button_get_color + (GTK_COLOR_BUTTON(ssdlg->background_color), &bg); + + tilem_config_get("screenshot", + "directory/f", &dir, + "static_format/s", &format, + NULL); + + if (!dir) + dir = g_get_current_dir(); + + if (!is_static) { + g_free(format); + format = g_strdup("gif"); + } + else if (!format) { + format = g_strdup(DEFAULT_FORMAT); + } + + filename = find_free_filename(dir, "screenshot", format); + basename = (filename ? g_filename_display_basename(filename) : NULL); + g_free(filename); + g_free(format); + + if (!is_static) { + filename = prompt_save_file("Save Screenshot", + GTK_WINDOW(ssdlg->window), + basename, dir, + "GIF images", "*.gif", + "All files", "*", + NULL); + } + else { + /* FIXME: perhaps check the list of supported output + formats (gdk_pixbuf_get_formats()) - e.g., tiff is + usually supported, although it requires libtiff + installed (png and jpeg also require external + libraries, but we need those libraries anyway for + other reasons) */ + filename = prompt_save_file("Save Screenshot", + GTK_WINDOW(ssdlg->window), + basename, dir, + "PNG images", "*.png", + "GIF images", "*.gif", + "BMP images", "*.bmp", + "JPEG images", "*.jpg;*.jpe;*.jpeg", + "All files", "*", + NULL); + } + + g_free(basename); + g_free(dir); + + if (!filename) + return FALSE; + + if (!is_static) { + format = g_strdup("gif"); + } + else { + basename = g_path_get_basename(filename); + format = strrchr(basename, '.'); + if (!format) { + messagebox00(ssdlg->window, GTK_MESSAGE_ERROR, + "Unable to save screenshot", + "File name does not have a" + " recognized suffix"); + g_free(filename); + g_free(basename); + return FALSE; + } + else { + format = g_strdup(format + 1); + } + } + + tilem_animation_save(anim, filename, format, NULL, NULL, &err); + + dir = g_path_get_dirname(filename); + + if (err) { + messagebox01(ssdlg->window, GTK_MESSAGE_ERROR, + "Unable to save screenshot", + "%s", err->message); + g_error_free(err); + g_free(dir); + g_free(filename); + g_free(format); + return FALSE; + } + + if (is_static) + format_opt = "static_format/s"; + else + format_opt = NULL; + + if (is_wide_screen(ssdlg->emu)) { + width_opt = "width_128x64/i"; + height_opt = "height_128x64/i"; + } + else { + width_opt = "width_96x64/i"; + height_opt = "height_96x64/i"; + } + + tilem_config_set("screenshot", + "directory/f", dir, + "grayscale/b", ssdlg->current_anim_grayscale, + "foreground/c", &fg, + "background/c", &bg, + width_opt, width, + height_opt, height, + format_opt, format, + NULL); + + g_free(dir); + g_free(filename); + g_free(format); + return TRUE; +} + +/* Callback for record button */ +static void begin_animation(G_GNUC_UNUSED GtkButton *btn, + TilemScreenshotDialog *ssdlg) +{ + gboolean grayscale = gtk_toggle_button_get_active + (GTK_TOGGLE_BUTTON(ssdlg->grayscale_tb)); + + gtk_widget_set_sensitive(GTK_WIDGET(ssdlg->animation_speed), FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(ssdlg->screenshot), FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(ssdlg->record), FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(ssdlg->stop), TRUE); + gtk_dialog_set_response_sensitive(GTK_DIALOG(ssdlg->window), + GTK_RESPONSE_ACCEPT, FALSE); + + tilem_calc_emulator_begin_animation(ssdlg->emu, grayscale); + ssdlg->current_anim_grayscale = grayscale; + + /* You can choose to hide current animation while recording or not + It's as you prefer... For the moment I hide it */ + /*gtk_widget_hide(GTK_WIDGET(ssdlg->screenshot_preview_image)); */ + + //set_current_animation(ssdlg, NULL); +} + +/* Callback for stop button (stop the recording) */ +static void end_animation(G_GNUC_UNUSED GtkButton *btn, + TilemScreenshotDialog *ssdlg) +{ + TilemAnimation *anim; + + if (ssdlg->emu->anim) { + anim = tilem_calc_emulator_end_animation(ssdlg->emu); + set_current_animation(ssdlg, anim); + g_object_unref(anim); + } + else { + set_current_animation(ssdlg, NULL); + } + + gtk_widget_set_sensitive(GTK_WIDGET(ssdlg->animation_speed), TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(ssdlg->screenshot), TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(ssdlg->record), TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(ssdlg->stop), FALSE); +} + +/* Callback for screenshot button (take a screenshot) */ +static void grab_screen(G_GNUC_UNUSED GtkButton *btn, + TilemScreenshotDialog *ssdlg) +{ + TilemAnimation *anim; + + gboolean grayscale = gtk_toggle_button_get_active + (GTK_TOGGLE_BUTTON(ssdlg->grayscale_tb)); + + anim = tilem_calc_emulator_get_screenshot(ssdlg->emu, grayscale); + ssdlg->current_anim_grayscale = grayscale; + set_current_animation(ssdlg, anim); + g_object_unref(anim); +} + diff --git a/tool/tilem-src/gui/sendfile.c b/tool/tilem-src/gui/sendfile.c new file mode 100644 index 0000000..13eb32d --- /dev/null +++ b/tool/tilem-src/gui/sendfile.c @@ -0,0 +1,526 @@ +/* + * TilEm II + * + * Copyright (c) 2010-2011 Thibault Duponchelle + * Copyright (c) 2010-2011 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include + +#include "gui.h" +#include "emucore.h" +#include "filedlg.h" +#include "ti81prg.h" + + +/* Send a series of files */ +static void send_files(TilemCalcEmulator *emu, char **filenames, int *slots) +{ + int i; + + for (i = 0; filenames[i]; i++) { + tilem_link_send_file(emu, filenames[i], + slots ? slots[i] : -1, + (i == 0), + (filenames[i + 1] == NULL)); + + /* FIXME: macros should record slot numbers */ + if (emu->isMacroRecording) + tilem_macro_add_action(emu->macro, 1, filenames[i]); + } +} + +static int string_to_slot(const char *str) +{ + if (!g_ascii_strncasecmp(str, "prgm", 4)) + str += 4; + else if (!g_ascii_strncasecmp(str, "ti81_", 5)) + str += 5; + else + return TI81_SLOT_AUTO; + + if (g_ascii_isdigit(str[0]) && !g_ascii_isalnum(str[1])) + return TI81_SLOT_0 + str[0] - '0'; + else if (g_ascii_isalpha(str[0]) && !g_ascii_isalnum(str[1])) + return TI81_SLOT_A + g_ascii_toupper(str[0]) - 'A'; + else if (str[0] == '@' + || !g_ascii_strncasecmp(str, "theta", 5) + || !strncmp(str, "\316\270", 2) + || !strncmp(str, "\316\230", 2)) + return TI81_SLOT_THETA; + else + return TI81_SLOT_AUTO; +} + +/* Guess program slot for a filename */ +static int guess_slot(const char *filename) +{ + char *base; + int slot; + base = g_filename_display_basename(filename); + slot = string_to_slot(base); + g_free(base); + return slot; +} + +static int display_index_to_slot(int i) +{ + if (i < 9) + return i + 1; + else if (i == 9) + return 0; + else + return i; +} + +struct slotdialog { + int nfiles; + char **filenames; + int *slots; + TI81ProgInfo info[TI81_SLOT_MAX + 1]; + GtkTreeModel *prgm_model; + GtkTreeModel *slot_model; +}; + +static void slot_edited(G_GNUC_UNUSED GtkCellRendererText *cell, + gchar *pathstr, gchar *text, gpointer data) +{ + struct slotdialog *slotdlg = data; + GtkTreeIter iter; + int n, slot; + char *end; + + slot = string_to_slot(text); + if (slot < 0) + return; + + n = strtol(pathstr, &end, 10); + gtk_tree_model_iter_nth_child(slotdlg->prgm_model, &iter, NULL, n); + gtk_list_store_set(GTK_LIST_STORE(slotdlg->prgm_model), + &iter, 1, text, -1); + + slotdlg->slots[n] = slot; +} + +/* Prompt user to assign program slots to filenames */ +static void prompt_program_slots(TilemCalcEmulator *emu, + struct slotdialog *slotdlg) +{ + GtkWidget *parent, *dlg, *vbox, *vbox2, *sw, *tv, *lbl; + GtkListStore *prgmstore, *slotstore; + GtkTreeIter iter; + GtkCellRenderer *cell; + GtkTreeViewColumn *col; + int i, j, slot; + int used[TI81_SLOT_MAX + 1]; + char *slotstr, *namestr; + char *slotlabel[TI81_SLOT_MAX + 1]; + + if (emu->ewin) + parent = emu->ewin->window; + else + parent = NULL; + + /* Generate list of existing programs */ + + slotstore = gtk_list_store_new(1, G_TYPE_STRING); + slotdlg->slot_model = GTK_TREE_MODEL(slotstore); + + for (i = 0; i <= TI81_SLOT_MAX; i++) { + slot = display_index_to_slot(i); + slotstr = ti81_program_slot_to_string(slot); + namestr = ti81_program_name_to_string(slotdlg->info[slot].name); + + if (slotdlg->info[slot].size == 0) { + slotlabel[slot] = g_strdup(slotstr); + used[slot] = 0; + } + else if (namestr && namestr[0]) { + slotlabel[slot] = g_strdup_printf("%s (in use: %s)", + slotstr, namestr); + used[slot] = 1; + } + else { + slotlabel[slot] = g_strdup_printf("%s (in use)", slotstr); + used[slot] = 1; + } + + gtk_list_store_append(slotstore, &iter); + gtk_list_store_set(slotstore, &iter, 0, slotlabel[slot], -1); + g_free(slotstr); + g_free(namestr); + } + + /* Assign default slots to files */ + + for (i = 0; i < slotdlg->nfiles; i++) { + slot = guess_slot(slotdlg->filenames[i]); + if (slotdlg->slots[i] < 0) + slotdlg->slots[i] = slot; + if (slot >= 0) + used[slot] = 1; + } + + for (i = 0; i < slotdlg->nfiles; i++) { + if (slotdlg->slots[i] < 0) { + for (j = 0; j <= TI81_SLOT_MAX; j++) { + slot = display_index_to_slot(j); + if (!used[slot]) { + slotdlg->slots[i] = slot; + used[slot] = 1; + break; + } + } + } + + if (slotdlg->slots[i] < 0) + slotdlg->slots[i] = TI81_SLOT_1; + } + + /* Generate list of filenames and assigned slots */ + + prgmstore = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING); + slotdlg->prgm_model = GTK_TREE_MODEL(prgmstore); + + for (i = 0; i < slotdlg->nfiles; i++) { + namestr = g_filename_display_basename(slotdlg->filenames[i]); + slot = slotdlg->slots[i]; + + gtk_list_store_append(prgmstore, &iter); + gtk_list_store_set(prgmstore, &iter, + 0, namestr, + 1, slotlabel[slot], + -1); + g_free(namestr); + } + + for (i = 0; i <= TI81_SLOT_MAX; i++) + g_free(slotlabel[i]); + + /* Create tree view */ + + tv = gtk_tree_view_new_with_model(slotdlg->prgm_model); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tv), TRUE); + + cell = gtk_cell_renderer_text_new(); + col = gtk_tree_view_column_new_with_attributes + ("File", cell, "text", 0, NULL); + gtk_tree_view_column_set_expand(col, TRUE); + gtk_tree_view_append_column(GTK_TREE_VIEW(tv), col); + + cell = gtk_cell_renderer_combo_new(); + g_object_set(cell, "model", slotstore, "text-column", 0, + "editable", TRUE, "has-entry", FALSE, NULL); + col = gtk_tree_view_column_new_with_attributes + ("Slot", cell, "text", 1, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(tv), col); + + g_signal_connect(cell, "edited", G_CALLBACK(slot_edited), slotdlg); + + /* Create dialog */ + + dlg = gtk_dialog_new_with_buttons("Select Program Slots", + GTK_WINDOW(parent), GTK_DIALOG_MODAL, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_set_alternative_button_order(GTK_DIALOG(dlg), + GTK_RESPONSE_OK, + GTK_RESPONSE_CANCEL, + -1); + gtk_dialog_set_default_response(GTK_DIALOG(dlg), GTK_RESPONSE_OK); + + gtk_window_set_default_size(GTK_WINDOW(dlg), -1, 250); + + sw = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), + GTK_POLICY_NEVER, + GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), + GTK_SHADOW_IN); + gtk_container_add(GTK_CONTAINER(sw), tv); + + vbox = gtk_vbox_new(FALSE, 6); + gtk_container_set_border_width(GTK_CONTAINER(vbox), 6); + + lbl = gtk_label_new("Select a slot where each program should be" + " loaded. If a program slot is already in use," + " its contents will be overwritten."); + gtk_misc_set_alignment(GTK_MISC(lbl), 0.0, 0.0); + gtk_label_set_line_wrap(GTK_LABEL(lbl), TRUE); + gtk_label_set_width_chars(GTK_LABEL(lbl), 45); + gtk_box_pack_start(GTK_BOX(vbox), lbl, FALSE, FALSE, 0); + + gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0); + gtk_widget_show_all(vbox); + + vbox2 = gtk_dialog_get_content_area(GTK_DIALOG(dlg)); + gtk_box_pack_start(GTK_BOX(vbox2), vbox, TRUE, TRUE, 0); + + if (gtk_dialog_run(GTK_DIALOG(dlg)) == GTK_RESPONSE_OK) + send_files(emu, slotdlg->filenames, slotdlg->slots); + + gtk_widget_destroy(dlg); +} + +/* Check status of existing programs */ +static gboolean check_prog_slots_main(TilemCalcEmulator *emu, gpointer data) +{ + struct slotdialog *slotdlg = data; + int i; + + tilem_em_wake_up(emu, TRUE); + for (i = 0; i <= TI81_SLOT_MAX; i++) + ti81_get_program_info(emu->calc, i, &slotdlg->info[i]); + + return TRUE; +} + +static void check_prog_slots_finished(TilemCalcEmulator *emu, gpointer data, + gboolean cancelled) +{ + struct slotdialog *slotdlg = data; + + if (!cancelled) + prompt_program_slots(emu, slotdlg); + + g_free(slotdlg->slots); + g_strfreev(slotdlg->filenames); + g_slice_free(struct slotdialog, slotdlg); +} + + +#define PAT_TI81 "*.prg" +#define PAT_TI73 "*.73?" +#define PAT_TI73_NUM "*.73n;*.73l;*.73m;*.73i" +#define PAT_TI82 "*.82?" +#define PAT_TI82_NUM "*.82n;*.82l;*.82m;*.82i" +#define PAT_TI82_TEXT "*.82s;*.82y;*.82p" +#define PAT_TI83 "*.83?" +#define PAT_TI83_NUM "*.83n;*.83l;*.83m;*.83i" +#define PAT_TI83_TEXT "*.83s;*.83y;*.83p" +#define PAT_TI83P "*.8x?;*.8xgrp" +#define PAT_TI83P_NUM "*.8xn;*.8xl;*.8xm;*.8xi" +#define PAT_TI83P_TEXT "*.8xs;*.8xy;*.8xp" +#define PAT_TI85 "*.85?" +#define PAT_TI86 "*.86?" +#define PAT_TIG "*.tig" + +#define FLT_TI81 "TI-81 programs", PAT_TI81 +#define FLT_TI73 "TI-73 files", PAT_TI73 +#define FLT_TI82 "TI-82 files", PAT_TI82 +#define FLT_TI83 "TI-83 files", PAT_TI83 +#define FLT_TI83P "TI-83 Plus files", PAT_TI83P +#define FLT_TI85 "TI-85 files", PAT_TI85 +#define FLT_TI86 "TI-86 files", PAT_TI86 +#define FLT_TIG "TIGroup files", PAT_TIG +#define FLT_ALL "All files", "*" + +#define DESC_COMPAT "All compatible files" + +#define FLT_TI73_COMPAT DESC_COMPAT, (PAT_TI73 ";" PAT_TIG ";" \ + PAT_TI82_NUM ";" \ + PAT_TI83_NUM ";" \ + PAT_TI83P_NUM) + +#define FLT_TI82_COMPAT DESC_COMPAT, (PAT_TI82 ";" PAT_TIG ";" \ + PAT_TI83_TEXT ";" PAT_TI83_NUM ";" \ + PAT_TI83P_TEXT ";" PAT_TI83P_NUM ";" \ + PAT_TI73_NUM) + +#define FLT_TI83_COMPAT DESC_COMPAT, (PAT_TI83 ";" PAT_TIG ";" \ + PAT_TI82_TEXT ";" PAT_TI82_NUM ";" \ + PAT_TI83P_TEXT ";" PAT_TI83P_NUM ";" \ + PAT_TI73_NUM) + +#define FLT_TI83P_COMPAT DESC_COMPAT, (PAT_TI83P ";" PAT_TIG ";" \ + PAT_TI82_TEXT ";" PAT_TI82_NUM ";" \ + PAT_TI83_TEXT ";" PAT_TI83_NUM ";" \ + PAT_TI73_NUM) + +#define FLT_TI8586_COMPAT DESC_COMPAT, (PAT_TI85 ";" PAT_TI86 ";" PAT_TIG) + +static char ** prompt_link_files(const char *title, + GtkWindow *parent, + const char *dir, + int model) +{ + switch (model) { + case TILEM_CALC_TI73: + return prompt_open_files(title, parent, dir, + FLT_TI73_COMPAT, FLT_TI73, + FLT_TI82, FLT_TI83, FLT_TI83P, + FLT_TIG, FLT_ALL, NULL); + case TILEM_CALC_TI81: + return prompt_open_files(title, parent, dir, + FLT_TI81, FLT_ALL, NULL); + case TILEM_CALC_TI82: + return prompt_open_files(title, parent, dir, + FLT_TI82_COMPAT, FLT_TI73, + FLT_TI82, FLT_TI83, FLT_TI83P, + FLT_TIG, FLT_ALL, NULL); + case TILEM_CALC_TI83: + case TILEM_CALC_TI76: + return prompt_open_files(title, parent, dir, + FLT_TI83_COMPAT, FLT_TI73, + FLT_TI82, FLT_TI83, FLT_TI83P, + FLT_TIG, FLT_ALL, NULL); + case TILEM_CALC_TI83P: + case TILEM_CALC_TI83P_SE: + case TILEM_CALC_TI84P: + case TILEM_CALC_TI84P_SE: + case TILEM_CALC_TI84P_NSPIRE: + return prompt_open_files(title, parent, dir, + FLT_TI83P_COMPAT, FLT_TI73, + FLT_TI82, FLT_TI83, FLT_TI83P, + FLT_TIG, FLT_ALL, NULL); + case TILEM_CALC_TI85: + case TILEM_CALC_TI86: + return prompt_open_files(title, parent, dir, + FLT_TI8586_COMPAT, FLT_TI85, + FLT_TI86, FLT_TIG, FLT_ALL, NULL); + default: + return prompt_open_files(title, parent, dir, FLT_ALL, NULL); + } +} + +/* Load a list of files through the GUI. The list of filenames must + end with NULL. */ +void load_files(TilemEmulatorWindow *ewin, char **filenames) +{ + struct slotdialog *slotdlg; + int i; + + g_return_if_fail(ewin->emu->calc != NULL); + + if (ewin->emu->calc->hw.model_id == TILEM_CALC_TI81) { + slotdlg = g_slice_new0(struct slotdialog); + slotdlg->filenames = g_strdupv(filenames); + slotdlg->nfiles = g_strv_length(filenames); + slotdlg->slots = g_new(int, slotdlg->nfiles); + for (i = 0; i < slotdlg->nfiles; i++) + slotdlg->slots[i] = TI81_SLOT_AUTO; + tilem_calc_emulator_begin(ewin->emu, &check_prog_slots_main, + &check_prog_slots_finished, slotdlg); + } + else { + send_files(ewin->emu, filenames, NULL); + } +} + +static int get_cmdline_slot(const char *str, const char **name) +{ + char *e; + int n; + + n = strtol(str, &e, 10); + if (*e == '=') { + *name = e + 1; + return n; + } + + if (g_ascii_isalpha(str[0]) && str[1] == '=') { + *name = str + 2; + return TI81_SLOT_A + g_ascii_toupper(str[0]) - 'A'; + } + + if (str[0] == '@' && str[1] == '=') { + *name = str + 2; + return TI81_SLOT_THETA; + } + + if (!g_ascii_strncasecmp(str, "theta=", 6)) { + *name = str + 6; + return TI81_SLOT_THETA; + } + + *name = str; + return TI81_SLOT_AUTO; +} + +/* Load a list of files from the command line. Filenames may begin + with an optional slot designation. */ +void load_files_cmdline(TilemEmulatorWindow *ewin, char **filenames) +{ + struct slotdialog *slotdlg; + int i; + gboolean need_prompt = FALSE; + const char *name; + + g_return_if_fail(ewin->emu->calc != NULL); + + slotdlg = g_slice_new0(struct slotdialog); + slotdlg->nfiles = g_strv_length(filenames); + slotdlg->slots = g_new(int, slotdlg->nfiles); + slotdlg->filenames = g_new0(char *, slotdlg->nfiles + 1); + + for (i = 0; i < slotdlg->nfiles; i++) { + slotdlg->slots[i] = get_cmdline_slot(filenames[i], &name); + slotdlg->filenames[i] = g_strdup(name); + + if (slotdlg->slots[i] < 0) + need_prompt = TRUE; + } + + if (need_prompt && ewin->emu->calc->hw.model_id == TILEM_CALC_TI81) { + tilem_calc_emulator_begin(ewin->emu, &check_prog_slots_main, + &check_prog_slots_finished, slotdlg); + } + else { + send_files(ewin->emu, slotdlg->filenames, slotdlg->slots); + g_free(slotdlg->slots); + g_strfreev(slotdlg->filenames); + g_slice_free(struct slotdialog, slotdlg); + } +} + +/* Prompt user to load a file */ +void load_file_dialog(TilemEmulatorWindow *ewin) +{ + char **filenames, *dir; + + tilem_config_get("upload", + "sendfile_recentdir/f", &dir, + NULL); + + filenames = prompt_link_files("Send File", + GTK_WINDOW(ewin->window), + dir, ewin->emu->calc->hw.model_id); + g_free(dir); + + if (!filenames || !filenames[0]) { + g_free(filenames); + return; + } + + dir = g_path_get_dirname(filenames[0]); + tilem_config_set("upload", + "sendfile_recentdir/f", dir, + NULL); + g_free(dir); + + load_files(ewin, filenames); + g_strfreev(filenames); +} diff --git a/tool/tilem-src/gui/skinops.c b/tool/tilem-src/gui/skinops.c new file mode 100644 index 0000000..6a23acc --- /dev/null +++ b/tool/tilem-src/gui/skinops.c @@ -0,0 +1,299 @@ +/* + * skinedit - a skin editor for the TiEmu emulator + * Copyright (C) 2002 Julien BLACHE + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* +contra-sh : + This file is a (quasi) perfect copy of the tiemu skinops.c file ... + Thank's to rom's and JB for this wonderful work. +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "skinops.h" + +#include +#include + +#define SKIN_ERROR g_quark_from_static_string("skin-error") +enum { + SKIN_ERROR_INVALID +}; + +/* + Determine skin type +*/ +int skin_get_type(SKIN_INFOS *si, const char *filename) +{ + FILE *fp; + char str[17]; + + fp = g_fopen(filename, "rb"); + if (fp == NULL) { + fprintf(stderr, "Unable to open this file: <%s>\n", filename); + return -1; + } + + memset(str, 0, sizeof(str)); + fread(str, 16, 1, fp); + + if(!strncmp(str, "TiEmu v2.00", 16)) + si->type = SKIN_TYPE_TIEMU; + else if(!strncmp(str, "TilEm v2.00 ", 16)) + si->type = SKIN_TYPE_TIEMU; + else if(!strncmp(str, "VTIv2.1 ", 8)) + si->type = SKIN_TYPE_OLD_VTI; + else if(!strncmp(str, "VTIv2.5 ", 8)) + si->type = SKIN_TYPE_VTI; + else { + fprintf(stderr, "Bad skin format\n"); + return -1; + } + + return 0; +} + +/* + Read TilEm skin informations (header) +*/ +int skin_read_header(SKIN_INFOS *si, FILE *fp) +{ + int i; + uint32_t endian; + uint32_t jpeg_offset; + uint32_t length; + char str[17]; + + /* signature & offsets */ + fread(str, 16, 1, fp); + if ((strncmp(str, "TilEm v2.00", 16)) + && (strncmp(str, "TiEmu v2.00", 16))) { + return -1; + } + fread(&endian, 4, 1, fp); + fread(&jpeg_offset, 4, 1, fp); + + if (endian != ENDIANNESS_FLAG) + jpeg_offset = GUINT32_SWAP_LE_BE(jpeg_offset); + + /* Skin name */ + fread(&length, 4, 1, fp); + if (endian != ENDIANNESS_FLAG) + length = GUINT32_SWAP_LE_BE(length); + + if (length > 0) { + si->name = (char *)malloc(length + 1); + if (si->name == NULL) + return -1; + + memset(si->name, 0, length + 1); + fread(si->name, length, 1, fp); + } + + /* Skin author */ + fread(&length, 4, 1, fp); + if (endian != ENDIANNESS_FLAG) + length = GUINT32_SWAP_LE_BE(length); + + if (length > 0) { + si->author = (char *)malloc(length + 1); + if (si->author == NULL) + return -1; + + memset(si->author, 0, length + 1); + fread(si->author, length, 1, fp); + } + + /* LCD colors */ + fread(&si->colortype, 4, 1, fp); + fread(&si->lcd_white, 4, 1, fp); + fread(&si->lcd_black, 4, 1, fp); + + /* Calc type */ + fread(si->calc, 8, 1, fp); + + /* LCD position */ + fread(&si->lcd_pos.left, 4, 1, fp); + fread(&si->lcd_pos.top, 4, 1, fp); + fread(&si->lcd_pos.right, 4, 1, fp); + fread(&si->lcd_pos.bottom, 4, 1, fp); + + /* Number of RECT struct to read */ + fread(&length, 4, 1, fp); + if (endian != ENDIANNESS_FLAG) + length = GUINT32_SWAP_LE_BE(length); + + if (length > SKIN_KEYS) + return -1; + + for (i = 0; i < (int)length; i++) { + fread(&si->keys_pos[i].left, 4, 1, fp); + fread(&si->keys_pos[i].top, 4, 1, fp); + fread(&si->keys_pos[i].right, 4, 1, fp); + fread(&si->keys_pos[i].bottom, 4, 1, fp); + } + + if (endian != ENDIANNESS_FLAG) { + si->colortype = GUINT32_SWAP_LE_BE(si->colortype); + si->lcd_white = GUINT32_SWAP_LE_BE(si->lcd_white); + si->lcd_black = GUINT32_SWAP_LE_BE(si->lcd_black); + + si->lcd_pos.top = GUINT32_SWAP_LE_BE(si->lcd_pos.top); + si->lcd_pos.left = GUINT32_SWAP_LE_BE(si->lcd_pos.left); + si->lcd_pos.bottom = GUINT32_SWAP_LE_BE(si->lcd_pos.bottom); + si->lcd_pos.right = GUINT32_SWAP_LE_BE(si->lcd_pos.right); + + for (i = 0; i < (int)length; i++) { + si->keys_pos[i].top = GUINT32_SWAP_LE_BE(si->keys_pos[i].top); + si->keys_pos[i].bottom = GUINT32_SWAP_LE_BE(si->keys_pos[i].bottom); + si->keys_pos[i].left = GUINT32_SWAP_LE_BE(si->keys_pos[i].left); + si->keys_pos[i].right = GUINT32_SWAP_LE_BE(si->keys_pos[i].right); + } + } + + si->jpeg_offset = ftell(fp); + + return 0; +} + +/* + Read skin image (pure jpeg data) +*/ +int skin_read_image(SKIN_INFOS *si, FILE *fp, GError **err) +{ + GdkPixbufLoader *loader; + gboolean result; + guchar *buf; + gsize count; + struct stat st; + + // Extract image from skin + fseek(fp, si->jpeg_offset, SEEK_SET); + fstat(fileno(fp), &st); + count = st.st_size - si->jpeg_offset; + + buf = g_malloc(count * sizeof(guchar)); + count = fread(buf, sizeof(guchar), count, fp); + + // Feed the pixbuf loader with our jpeg data + loader = gdk_pixbuf_loader_new(); + result = gdk_pixbuf_loader_write(loader, buf, count, err); + g_free(buf); + + if(result == FALSE) { + g_object_unref(loader); + return -1; + } + + result = gdk_pixbuf_loader_close(loader, err); + if(result == FALSE) { + g_object_unref(loader); + return -1; + } + + // and get the pixbuf + si->raw = gdk_pixbuf_loader_get_pixbuf(loader); + if(si->raw == NULL) { + g_set_error(err, SKIN_ERROR, SKIN_ERROR_INVALID, + "Unable to load background image"); + g_object_unref(loader); + return -1; + } + + si->sx = si->sy = 1.0; + si->image = g_object_ref(si->raw); + g_object_ref(si->raw); + + // Get new skin size + si->width = gdk_pixbuf_get_width(si->image); + si->height = gdk_pixbuf_get_height(si->image); + + g_object_unref(loader); + + return 0; +} + +/* Load a skin (TilEm v2.00 only) */ +int skin_load(SKIN_INFOS *si, const char *filename, GError **err) +{ + FILE *fp; + int ret = 0, errnum; + char *dname; + + g_return_val_if_fail(err == NULL || *err == NULL, -1); + + fp = g_fopen(filename, "rb"); + if (fp == NULL) { + errnum = errno; + dname = g_filename_display_basename(filename); + g_set_error(err, G_FILE_ERROR, g_file_error_from_errno(errnum), + "Unable to open %s for reading: %s", + dname, g_strerror(errnum)); + g_free(dname); + return -1; + } + + ret = skin_read_header(si, fp); + if (ret) { + fclose(fp); + dname = g_filename_display_basename(filename); + g_set_error(err, SKIN_ERROR, SKIN_ERROR_INVALID, + "The file %s is not a valid skin.", dname); + g_free(dname); + return -1; + } + + ret = skin_read_image(si, fp, err); + + fclose(fp); + + return ret; +} + +/* Unload skin by freeing allocated memory */ +int skin_unload(SKIN_INFOS *si) +{ + if (si->image != NULL) { + g_object_unref(si->image); + si->image = NULL; + } + + if (si->raw) { + g_object_unref(si->raw); + si->raw = NULL; + } + + free(si->name); + free(si->author); + + memset(si, 0, sizeof(SKIN_INFOS)); + + return 0; +} + diff --git a/tool/tilem-src/gui/skinops.h b/tool/tilem-src/gui/skinops.h new file mode 100644 index 0000000..8c5c5a6 --- /dev/null +++ b/tool/tilem-src/gui/skinops.h @@ -0,0 +1,133 @@ +/* Hey EMACS -*- linux-c -*- */ +/* $Id$ */ + +/* + * skinedit - a skin editor for the TiEmu emulator + * Copyright (C) 2002 Julien BLACHE + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +/* +From Romain Lievins(?) : + Most of these definitions and code comes from the JB's SkinEdit + which is based on TiEmu skin code. TiEmu skin code is also based on + VTi's skin code. + +contra-sh : + This file is a (quasi ?) perfect copy of the tiemu skinops.h file ... + Thank's to Romain Lievins and Julien Blache for this wonderful work. + +*/ + + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + + +/***************/ +/* Definitions */ +/***************/ + +#define LCD_COLORTYPE_LOW 0 +#define LCD_COLORTYPE_HIGH 1 +#define LCD_COLORTYPE_CUSTOM 2 + +#define LCD_HI_WHITE 0xb0ccae +#define LCD_HI_BLACK 0x8a6f53 + +#define LCD_LOW_WHITE 0xcfe0cc +#define LCD_LOW_BLACK 0x222e31 + +#define MAX_COLORS (256 - 16) // we need to keep 16 colors for grayscales +#define SKIN_KEYS 80 + +#define SKIN_TI73 "TI-73" +#define SKIN_TI82 "TI-82" +#define SKIN_TI83 "TI-83" +#define SKIN_TI83P "TI-83+" +#define SKIN_TI85 "TI-85" +#define SKIN_TI86 "TI-86" +#define SKIN_TI89 "TI-89" +#define SKIN_TI92 "TI-92" +#define SKIN_TI92P "TI-92+" +#define SKIN_V200 "V200PLT" +#define SKIN_TI89T "TI-89TM" + +#define SKIN_TYPE_TIEMU 10 +#define SKIN_TYPE_VTI 2 +#define SKIN_TYPE_OLD_VTI 1 +#define SKIN_TYPE_NEW 0 + +#define ENDIANNESS_FLAG 0xfeedbabe +#define TIEMU_SKIN_ID "TiEmu v2.00" + + + +/*********/ +/* Types */ +/*********/ + + +typedef struct +{ + uint32_t left; + uint32_t top; + uint32_t right; + uint32_t bottom; +} RECT; + + +typedef struct +{ + int type; + + GdkPixbuf *image; + + int width; + int height; + + GdkPixbuf *raw; // raw jpeg image + double sx, sy; // scaling factor + + char calc[9]; + uint32_t colortype; + + uint32_t lcd_black; + uint32_t lcd_white; + + char *name; + char *author; + + RECT lcd_pos; + RECT keys_pos[SKIN_KEYS]; + + long jpeg_offset; + +} SKIN_INFOS; + +/*************/ +/* Functions */ +/*************/ + +int skin_load(SKIN_INFOS *infos, const char *filename, GError **err); +int skin_unload(SKIN_INFOS *infos); + diff --git a/tool/tilem-src/gui/ti81prg.c b/tool/tilem-src/gui/ti81prg.c new file mode 100644 index 0000000..afd407e --- /dev/null +++ b/tool/tilem-src/gui/ti81prg.c @@ -0,0 +1,410 @@ +/* + * TilEm II + * + * Copyright (c) 2011 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include + +#include "ti81prg.h" + +#define tSpace 0x56 +#define t0 0x10 +#define t9 0x19 +#define tDecPt 0x1A +#define tA 0x59 +#define tZ 0x72 +#define tTheta 0x73 + +#define ramStart 0xE000 +#define cxCurApp 0xE347 +#define cxOldApp (cxCurApp + 1) +#define DimX_old 0xEEF9 +#define DimX_new 0xF12D +#define prgm0Name 0xF1D3 +#define prgm0Start 0xF2FB +#define prgm0End (prgm0Start + 2) +#define prgmThetaEnd (prgm0End + 36*2) +#define progMem 0xF347 +#define progMemEnd 0xFCA6 + +#define cxPrgmEdit 2 +#define cxPrgmExec 10 +#define cxMenu 11 + +TI81Program * ti81_program_new(int size) +{ + TI81Program *prgm = tilem_new0(TI81Program, 1); + + prgm->info.slot = TI81_SLOT_AUTO; + memset(prgm->info.name, tSpace, 8); + + if (size > 0) { + prgm->info.size = size; + prgm->data = tilem_new_atomic(byte, size); + } + + return prgm; +} + +void ti81_program_free(TI81Program *prgm) +{ + if (!prgm) + return; + + if (prgm->data) + tilem_free(prgm->data); + tilem_free(prgm); +} + +static byte *get_byte_ptr(const TilemCalc *calc, dword addr) +{ + if (addr < ramStart || addr > 0xffff) + return NULL; + + return &calc->ram[addr - ramStart]; +} + +static int read_byte(const TilemCalc *calc, dword addr) +{ + const byte *p = get_byte_ptr(calc, addr); + + if (!p) + return -1; + else + return *p; +} + +static dword read_word(const TilemCalc *calc, dword addr) +{ + const byte *p = get_byte_ptr(calc, addr); + + if (!p) + return 0; + else + return (p[0] | p[1] << 8); +} + +static void write_word(TilemCalc *calc, dword addr, dword value) +{ + byte *p = get_byte_ptr(calc, addr); + + if (p) { + p[0] = value & 0xff; + p[1] = (value >> 8) & 0xff; + } +} + +static int check_busy(const TilemCalc *calc) +{ + int cur, old; + + cur = read_byte(calc, cxCurApp); + old = read_byte(calc, cxCurApp); + + if (cur == cxPrgmEdit || cur == cxPrgmExec) + return 1; + else if (cur == cxMenu && (old == cxPrgmEdit || old == cxPrgmExec)) + return 1; + else + return 0; +} + +static dword get_free_mem_end(const TilemCalc *calc) +{ + const byte *p; + int n, i; + + p = get_byte_ptr(calc, DimX_new); + + /* DimX is always a small positive integer, so the first byte + must be between 80h and 82h, and the last five bytes must + always be zero. On 1.1K, DimX_new is part of textShadow, + so none of these byte values make any sense. */ + + if (p[0] < 0x80 || p[0] > 0x82 || p[7] != 0) + p = get_byte_ptr(calc, DimX_old); + + if (p[0] < 0x80 || p[0] > 0x82) + return 0; + + for (i = 3; i < 7; i++) + if (p[i]) + return 0; + + n = ((p[2] & 0xf) + + ((p[2] >> 4) * 10) + + ((p[1] & 0xf) * 100) + + ((p[1] >> 4) * 1000)); + + for (i = p[0]; i < 0x83; i++) { + if (n % 10) + return 0; + n /= 10; + } + + return (progMemEnd + 1 - 16 * n); +} + +int ti81_get_program_info(const TilemCalc *calc, int slot, TI81ProgInfo *info) +{ + const byte *p; + dword progstart, progend; + + if (slot < 0 || slot > TI81_SLOT_MAX) + return TI81_ERR_INTERNAL; + + if (check_busy(calc)) + return TI81_ERR_BUSY; + + progstart = read_word(calc, prgm0Start + 2 * slot); + progend = read_word(calc, prgm0Start + 2 * slot + 2); + + if (progstart < ramStart || progend < ramStart || progend < progstart) + return TI81_ERR_BUSY; + + info->slot = slot; + info->size = progend - progstart; + info->addr = progstart; + + p = get_byte_ptr(calc, prgm0Name + 8 * slot); + if (!p) return TI81_ERR_INTERNAL; + memcpy(info->name, p, 8); + + return 0; +} + +int ti81_get_program(const TilemCalc *calc, int slot, TI81Program **prgm) +{ + TI81ProgInfo info; + const byte *p; + int s; + + if ((s = ti81_get_program_info(calc, slot, &info))) { + *prgm = NULL; + return s; + } + + *prgm = ti81_program_new(info.size); + (*prgm)->info = info; + if (info.size > 0 && (p = get_byte_ptr(calc, info.addr))) + memcpy((*prgm)->data, p, info.size); + + return 0; +} + +int ti81_load_program(TilemCalc *calc, const TI81Program *prgm) +{ + TI81ProgInfo info; + int slot = prgm->info.slot; + int s, i; + dword progs_start, progs_end, mem_end, x; + byte *p; + + if (slot == TI81_SLOT_AUTO) { + for (slot = 0; slot <= TI81_SLOT_MAX; slot++) { + if ((s = ti81_get_program_info(calc, slot, &info))) + return s; + if (info.size == 0 && info.name[0] == tSpace) + break; + } + + if (slot > TI81_SLOT_MAX) + return TI81_ERR_SLOTS_FULL; + } + + if ((s = ti81_get_program_info(calc, slot, &info))) + return s; + + /* move later programs forward/backward in memory */ + + progs_start = info.addr + info.size; + progs_end = read_word(calc, prgmThetaEnd); + if (progs_end < progs_start) + return TI81_ERR_BUSY; + + mem_end = get_free_mem_end(calc); + if (progs_end + prgm->info.size - info.size > mem_end) + return TI81_ERR_MEMORY; + + if (prgm->info.size != info.size && progs_start != progs_end) { + p = get_byte_ptr(calc, progs_start); + if (!p) return TI81_ERR_INTERNAL; + memmove(p + prgm->info.size - info.size, p, + progs_end - progs_start); + } + + /* update program pointers */ + + for (i = slot; i <= TI81_SLOT_MAX; i++) { + x = read_word(calc, prgm0End + 2 * i); + write_word(calc, prgm0End + 2 * i, + x + prgm->info.size - info.size); + } + + /* copy program data */ + + if (prgm->info.size != 0) { + p = get_byte_ptr(calc, info.addr); + if (!p) return TI81_ERR_INTERNAL; + memcpy(p, prgm->data, prgm->info.size); + } + + /* copy program name */ + + p = get_byte_ptr(calc, prgm0Name + 8 * slot); + if (!p) return TI81_ERR_INTERNAL; + memcpy(p, prgm->info.name, 8); + + return 0; +} + +int ti81_read_prg_file(FILE *f, TI81Program **prgm) +{ + byte buf[20]; + unsigned int size, i; + unsigned int sum = 0; + TI81Program *p; + + *prgm = NULL; + + if (fread(buf, 1, 20, f) != 20) + return TI81_ERR_INVALID_FILE; + + if (strcmp((char *) buf, "**TI81**") || buf[9] != 0x6e) + return TI81_ERR_INVALID_FILE; + + size = buf[10] | buf[11] << 8; + + p = ti81_program_new(size); + + memcpy(p->info.name, buf + 12, 8); + + for (i = 0; i < 8; i++) + sum += buf[12 + i]; + + if (fread(p->data, 1, size, f) != size) { + ti81_program_free(p); + return TI81_ERR_INVALID_FILE; + } + + for (i = 0; i < size; i++) + sum += p->data[i]; + + if (fread(buf, 1, 2, f) != 2) { + ti81_program_free(p); + return TI81_ERR_INVALID_FILE; + } + + sum -= (buf[0] | buf[1] << 8); + if (sum & 0xffff) + fprintf(stderr, "warning: checksum incorrect\n"); + + *prgm = p; + return 0; +} + +int ti81_write_prg_file(FILE *f, const TI81Program *prgm) +{ + byte buf[20]; + unsigned int size, i; + unsigned int sum = 0; + + memcpy(buf, "**TI81**\0n", 10); + size = prgm->info.size; + buf[10] = size & 0xff; + buf[11] = (size >> 8) & 0xff; + + memcpy(buf + 12, prgm->info.name, 8); + + for (i = 0; i < 8; i++) + sum += buf[12 + i]; + + if (fwrite(buf, 1, 20, f) != 20) + return TI81_ERR_FILE_IO; + + if (fwrite(prgm->data, 1, size, f) != size) + return TI81_ERR_FILE_IO; + + for (i = 0; i < size; i++) + sum += prgm->data[i]; + + buf[0] = sum & 0xff; + buf[1] = (sum >> 8) & 0xff; + if (fwrite(buf, 1, 2, f) != 2) + return TI81_ERR_FILE_IO; + + return 0; +} + +char * ti81_program_slot_to_string(int slot) +{ + char buf[50]; + char *s; + + if (slot == TI81_SLOT_AUTO) + strcpy(buf, "Automatic"); + else if (slot < 0 || slot > 36) + strcpy(buf, "?"); + else if (slot < 10) + sprintf(buf, "Prgm%c", slot + '0'); + else if (slot < 36) + sprintf(buf, "Prgm%c", slot + 'A' - 10); + else + strcpy(buf, "Prgm\316\270"); + + s = tilem_new_atomic(char, strlen(buf) + 1); + strcpy(s, buf); + return s; +} + +char * ti81_program_name_to_string(const byte *prgname) +{ + char buf[50]; + char *s; + int i, j; + + for (i = j = 0; i < 8; i++) { + if (prgname[i] == tSpace) + buf[j++] = '_'; + else if (prgname[i] == tDecPt) + buf[j++] = '.'; + else if (prgname[i] == tTheta) { + buf[j++] = '\316'; + buf[j++] = '\270'; + } + else if (prgname[i] >= t0 && prgname[i] <= t9) + buf[j++] = '0' + prgname[i] - t0; + else if (prgname[i] >= tA && prgname[i] <= tZ) + buf[j++] = 'A' + prgname[i] - tA; + else + buf[j++] = '?'; + } + + while (j > 0 && buf[j - 1] == '_') + j--; + buf[j] = 0; + + s = tilem_new_atomic(char, strlen(buf) + 1); + strcpy(s, buf); + return s; +} diff --git a/tool/tilem-src/gui/ti81prg.h b/tool/tilem-src/gui/ti81prg.h new file mode 100644 index 0000000..fc65224 --- /dev/null +++ b/tool/tilem-src/gui/ti81prg.h @@ -0,0 +1,89 @@ +/* + * TilEm II + * + * Copyright (c) 2011 Benjamin Moody + * + * 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 . + */ + +enum { + TI81_SLOT_AUTO = -1, + TI81_SLOT_0, TI81_SLOT_1, TI81_SLOT_2, TI81_SLOT_3, TI81_SLOT_4, + TI81_SLOT_5, TI81_SLOT_6, TI81_SLOT_7, TI81_SLOT_8, TI81_SLOT_9, + TI81_SLOT_A, TI81_SLOT_B, TI81_SLOT_C, TI81_SLOT_D, TI81_SLOT_E, + TI81_SLOT_F, TI81_SLOT_G, TI81_SLOT_H, TI81_SLOT_I, TI81_SLOT_J, + TI81_SLOT_K, TI81_SLOT_L, TI81_SLOT_M, TI81_SLOT_N, TI81_SLOT_O, + TI81_SLOT_P, TI81_SLOT_Q, TI81_SLOT_R, TI81_SLOT_S, TI81_SLOT_T, + TI81_SLOT_U, TI81_SLOT_V, TI81_SLOT_W, TI81_SLOT_X, TI81_SLOT_Y, + TI81_SLOT_Z, TI81_SLOT_THETA +}; + +#define TI81_SLOT_MAX TI81_SLOT_THETA + +typedef struct _TI81ProgInfo { + int slot; /* program slot number */ + int size; /* size of program contents */ + dword addr; /* address of program contents */ + byte name[8]; /* program name, tokens */ +} TI81ProgInfo; + +typedef struct _TI81Program { + TI81ProgInfo info; + byte *data; +} TI81Program; + +/* Error codes */ +enum { + TI81_ERR_FILE_IO = 1, /* File I/O error */ + TI81_ERR_INVALID_FILE, /* PRG file is invalid */ + TI81_ERR_MEMORY, /* Not enough memory to load program */ + TI81_ERR_SLOTS_FULL, /* No free program slots */ + TI81_ERR_BUSY, /* Calculator is busy and unable + to load/save programs */ + TI81_ERR_INTERNAL +}; + +/* Create a new TI81Program with the given size. */ +TI81Program * ti81_program_new(int size) + TILEM_ATTR_MALLOC; + +/* Free a TI81Program. */ +void ti81_program_free(TI81Program *prgm); + +/* Get information about the program in the given slot. */ +int ti81_get_program_info(const TilemCalc *calc, int slot, TI81ProgInfo *info); + +/* Retrieve a program from calculator memory. Free the resulting + program with ti81_program_free() when you're done with it. */ +int ti81_get_program(const TilemCalc *calc, int slot, TI81Program **prgm); + +/* Load a program into calculator memory. */ +int ti81_load_program(TilemCalc *calc, const TI81Program *prgm); + +/* Read a program from a PRG file. Free the resulting program with + ti81_program_free() when you're done with it. */ +int ti81_read_prg_file(FILE *f, TI81Program **prgm); + +/* Write a program to a PRG file. */ +int ti81_write_prg_file(FILE *f, const TI81Program *prgm); + +/* Convert program slot number into a UTF-8 string. Free the result + with tilem_free() when you're done with it. */ +char * ti81_program_slot_to_string(int slot) + TILEM_ATTR_MALLOC; + +/* Convert program name to a UTF-8 string. Free the result with + tilem_free() when you're done with it. */ +char * ti81_program_name_to_string(const byte *prgname) + TILEM_ATTR_MALLOC; diff --git a/tool/tilem-src/gui/tilem2.c b/tool/tilem-src/gui/tilem2.c new file mode 100644 index 0000000..4be876a --- /dev/null +++ b/tool/tilem-src/gui/tilem2.c @@ -0,0 +1,309 @@ +/* + * TilEm II + * + * Copyright (c) 2010-2011 Thibault Duponchelle + * Copyright (c) 2010-2012 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include + +#include "gui.h" +#include "files.h" +#include "icons.h" +#include "msgbox.h" + +/* CMD LINE OPTIONS */ +static gchar* cl_romfile = NULL; +static gchar* cl_skinfile = NULL; +static gchar* cl_model = NULL; +static gchar* cl_statefile = NULL; +static gchar** cl_files_to_load = NULL; +static gboolean cl_skinless_flag = FALSE; +static gboolean cl_reset_flag = FALSE; +static gchar* cl_getvar = NULL; +static gchar* cl_macro_to_run = NULL; +static gboolean cl_debug_flag = FALSE; +static gboolean cl_normalspeed_flag = FALSE; +static gboolean cl_fullspeed_flag = FALSE; + + +static GOptionEntry entries[] = +{ + { "rom", 'r', 0, G_OPTION_ARG_FILENAME, &cl_romfile, "The rom file to run", "FILE" }, + { "skin", 'k', 0, G_OPTION_ARG_FILENAME, &cl_skinfile, "The skin file to use", "FILE" }, + { "model", 'm', 0, G_OPTION_ARG_STRING, &cl_model, "The model to use", "NAME" }, + { "state-file", 's', 0, G_OPTION_ARG_FILENAME, &cl_statefile, "The state-file to use", "FILE" }, + { "without-skin", 'l', 0, G_OPTION_ARG_NONE, &cl_skinless_flag, "Start in skinless mode", NULL }, + { "reset", 0, 0, G_OPTION_ARG_NONE, &cl_reset_flag, "Reset the calc at startup", NULL }, + { "get-var", 0, 0, G_OPTION_ARG_STRING, &cl_getvar, "Get a var at startup", "FILE" }, + { "play-macro", 'p', 0, G_OPTION_ARG_FILENAME, &cl_macro_to_run, "Run this macro at startup", "FILE" }, + { "debug", 'd', 0, G_OPTION_ARG_NONE, &cl_debug_flag, "Launch debugger", NULL }, + { "normal-speed", 0, 0, G_OPTION_ARG_NONE, &cl_normalspeed_flag, "Run at normal speed", NULL }, + { "full-speed", 0, 0, G_OPTION_ARG_NONE, &cl_fullspeed_flag, "Run at maximum speed", NULL }, + { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &cl_files_to_load, NULL, "FILE" }, + { 0, 0, 0, 0, 0, 0, 0 } +}; + + +/* ######### MAIN ######### */ + +/* Order of preference for automatic model selection. */ +static const char model_search_order[] = + { TILEM_CALC_TI81, + TILEM_CALC_TI73, + TILEM_CALC_TI82, + TILEM_CALC_TI83, + TILEM_CALC_TI76, + TILEM_CALC_TI84P_SE, + TILEM_CALC_TI84P, + TILEM_CALC_TI83P_SE, + TILEM_CALC_TI83P, + TILEM_CALC_TI84P_NSPIRE, + TILEM_CALC_TI85, + TILEM_CALC_TI86, 0 }; + +/* Check if given calc model should be used for these file types. */ +static gboolean check_file_types(int calc_model, + const int *file_models, + int nfiles) +{ + /* Only choose a calc model if it supports all of the given + file types, and at least one of the files is of the calc's + "preferred" type. This means if we have a mixture of 82Ps + and 83Ps, we can use either a TI-83 or TI-76.fr ROM image, + but not a TI-83 Plus. */ + + gboolean preferred = FALSE; + int i; + + calc_model = model_to_base_model(calc_model); + + for (i = 0; i < nfiles; i++) { + if (file_models[i] == calc_model) + preferred = TRUE; + else if (!model_supports_file(calc_model, file_models[i])) + return FALSE; + } + + return preferred; +} + +static void load_initial_rom(TilemCalcEmulator *emu, + const char *cmdline_rom_name, + const char *cmdline_state_name, + char **cmdline_files, + int model) +{ + GError *err = NULL; + char *modelname; + int nfiles, *file_models, i; + + /* If a ROM file is specified on the command line, use that + (and no other) */ + + if (cmdline_rom_name) { + if (tilem_calc_emulator_load_state(emu, cmdline_rom_name, + cmdline_state_name, + model, &err)) + return; + else if (!err) + exit(0); + else { + g_printerr("%s\n", err->message); + exit(1); + } + } + + /* Choose model by file names */ + + if (!model && cmdline_files) { + nfiles = g_strv_length(cmdline_files); + file_models = g_new(int, nfiles); + + /* determine model for each filename */ + for (i = 0; i < nfiles; i++) + file_models[i] = file_to_model(cmdline_files[i]); + + /* iterate over all known models... */ + for (i = 0; model_search_order[i]; i++) { + model = model_search_order[i]; + + /* check if this model supports the named files */ + if (!check_file_types(model, file_models, nfiles)) + continue; + + /* try to load model, but no error message if + no ROM is present in config */ + if (tilem_calc_emulator_load_state(emu, NULL, NULL, + model, &err)) { + g_free(file_models); + return; + } + else if (!err) + exit(0); + else if (!g_error_matches(err, TILEM_EMULATOR_ERROR, + TILEM_EMULATOR_ERROR_NO_ROM)) { + messagebox01(NULL, GTK_MESSAGE_ERROR, + "Unable to load calculator state", + "%s", err->message); + } + g_clear_error(&err); + } + + g_free(file_models); + model = 0; + } + + /* If no model specified on command line (either explicitly or + implicitly), then choose the most recently used model */ + + if (!model && !cmdline_files) { + tilem_config_get("recent", "last_model/s", &modelname, NULL); + if (modelname) + model = name_to_model(modelname); + } + + /* Try to load the most recently used ROM for chosen model */ + + if (model) { + if (tilem_calc_emulator_load_state(emu, NULL, NULL, + model, &err)) + return; + else if (!err) + exit(0); + else { + messagebox01(NULL, GTK_MESSAGE_ERROR, + "Unable to load calculator state", + "%s", err->message); + g_clear_error(&err); + } + } + + /* Prompt user for a ROM file */ + + while (!emu->calc) { + if (!tilem_calc_emulator_prompt_open_rom(emu)) + exit(0); + } +} + +int main(int argc, char **argv) +{ + TilemCalcEmulator* emu; + char *menurc_path; + GOptionContext *context; + GError *error = NULL; + int model = 0; + + g_thread_init(NULL); + gtk_init(&argc, &argv); + set_program_path(argv[0]); + g_set_application_name("TilEm"); + + menurc_path = get_shared_file_path("menurc", NULL); + if (menurc_path) + gtk_accel_map_load(menurc_path); + g_free(menurc_path); + + init_custom_icons(); + gtk_window_set_default_icon_name("tilem"); + + emu = tilem_calc_emulator_new(); + + context = g_option_context_new(NULL); + g_option_context_add_main_entries(context, entries, NULL); + g_option_context_add_group(context, gtk_get_option_group(TRUE)); + if (!g_option_context_parse(context, &argc, &argv, &error)) + { + g_printerr("%s: %s\n", g_get_prgname(), error->message); + exit (1); + } + + if (cl_model) { + model = name_to_model(cl_model); + if (!model) { + g_printerr("%s: unknown model %s\n", + g_get_prgname(), cl_model); + return 1; + } + } + + load_initial_rom(emu, cl_romfile, cl_statefile, cl_files_to_load, model); + + emu->ewin = tilem_emulator_window_new(emu); + + if (cl_skinless_flag) + tilem_emulator_window_set_skin_disabled(emu->ewin, TRUE); + else if (cl_skinfile) { + tilem_emulator_window_set_skin(emu->ewin, cl_skinfile); + tilem_emulator_window_set_skin_disabled(emu->ewin, FALSE); + } + + gtk_widget_show(emu->ewin->window); + + ticables_library_init(); + tifiles_library_init(); + ticalcs_library_init(); + + if (cl_reset_flag) + tilem_calc_emulator_reset(emu); + + if (cl_fullspeed_flag) + tilem_calc_emulator_set_limit_speed(emu, FALSE); + else if (cl_normalspeed_flag) + tilem_calc_emulator_set_limit_speed(emu, TRUE); + + if (cl_files_to_load) + load_files_cmdline(emu->ewin, cl_files_to_load); + if (cl_macro_to_run) + tilem_macro_load(emu, cl_macro_to_run); + if (cl_getvar) + tilem_link_receive_matching(emu, cl_getvar, "."); + + if (cl_debug_flag) + launch_debugger(emu->ewin); + else + tilem_calc_emulator_run(emu); + + g_signal_connect(emu->ewin->window, "destroy", + G_CALLBACK(gtk_main_quit), NULL); + + gtk_main(); + + tilem_calc_emulator_pause(emu); + + tilem_emulator_window_free(emu->ewin); + tilem_calc_emulator_free(emu); + + menurc_path = get_config_file_path("menurc", NULL); + gtk_accel_map_save(menurc_path); + g_free(menurc_path); + + ticables_library_exit(); + tifiles_library_exit(); + ticalcs_library_exit(); + + return 0; +} diff --git a/tool/tilem-src/gui/tilem2.ico b/tool/tilem-src/gui/tilem2.ico new file mode 100644 index 0000000000000000000000000000000000000000..633d49c70b47a2278053a5c4cee466d861d1b8ce GIT binary patch literal 23558 zcmeHP2V7N0)<4gfH740aj3(LaW<%JRN)nAGn-~q&h+RMwEMTEYQBZp4(G)=hQA80H zP>NDSx-=!eF%}!XGHJvIRO}kI2}BBi|?i{-Xgr<$^%*#@ zPaje$_dyNEQ&$HD+NHASsOYbz#wS!$BT_?Z8nnCLe}7SxPhd7rxIc=dbZuy2LE8F; zG}F+C_U0GS+D)73YrVPT?CVFXyu9d0^(m5vgwght44R@pkL)}== zODJMn42_?uM}F%a>=7B;A+PsZs%rm0Ws*^Nj zjv?Al(n2d+iqFiWpoq=13;Axq%ms^S%yeDao0Uz)M~~C!$T@F2w}B~U;_6gkP|5 zC^j<_{Z9e+I3?v2PzCZsfE`K6G;_YOc<%P)=8@L4SyXnsngTXPQ91JEZr*h8$T2Df zjGLiHUrm`oT7dZdxwOK?lV;3cL?(9jG~djUrp%pBVLRe!D)Ld<)5yu!7x%Ve$HiKff{M{a3X5X=)9gFkE}Vm+GHPpEAGiOq7Qp{pq<;OLPq1 z9@4*`=Gb|^H|ewJgGC0tY zufT)sSM-ORtcM(9kmC$;ieb-SkY5aPS>%v)4EqDae!w8Z#JaE#DEdRr*FzpN$asdm zf?;o9*n1e{9)rAQkhu)|41>I5*n=4MBL?}Z=nolNkNto_E_MnaR~cljqCezwJ>)&Z z{sFaswaIbAM7@;rc_63T^zTexK8EOjRH=W}i7wBN{k3KO=Kg$siAE`JZ%urD>}hTK zOMO&x)iHQ~?1ioRV^40yBWVoPzP#LCf9Mqqdp5&<|4_jG$Z*dU^F!yT$G&(Uy2E|! z!wh?3yTG318nNd$ zLf>e_KK@VWG`FEQ{1trJPH5`LEz{I>}>2`GT>u^sx6H*hQf zI)IUYf#6fOlO$)^fYHB)agO$qd;;Z)8*Tq0$yk>P*hM`f`X_;Qe%WC=q2J1YnkL$rYgHe{L z4Ny~);e+gHlv~h=+AGVrLfxEryKJCH(8K%4MEOmgpu0ms@0E5wGIV|L#n z-cOb6mcX!$l#yRZ4n97VQCvnd=NVIWQ3=JsPN}M?r6qQb(4`&e)cFhK8N8k>UA@T0 z#hoJJ637PE^UbYj0bomFiqOxEt?h)Za}@TDgYRnC5&mRiYfq+t;4RxJ1W;9Xj$-#^ zlh)Lkv^y=Gyn@!k?$M>BtUTBX`ZN)+F)oq3!XhapznJV{gI=h}phZ?IXsW?{azMEf zw$b7hE9nYsjr0rq$=u$V%pBY(G$xLg;W~WV4$@y@PICYSmB(mzRz97%d_~w=ll110 zt%nb3&o-ommNpa^9!^mSd&wVmlbt*eb1V>c4Y#AXU9&wYiJW0GK{nCJ+Oy;q5Ja;V zn^MiW3sh8b2zJe7*hLm(Xl8}+t1z})*nH8ulgZd}xv;B_z|P_JR8~O|?MP06UA740 z`O_@qxg`h5C15RCta75zZLy@k*o+De9Thelx6QcS%yrVHYK+o zxowI4hL+ga(&1CJlzKXo(#~Yk`Yl_99X1#CZSBR&bo^i@ZHbGg$X&^_B|d=;9Y2ZZ z=K!tr_9sW!jM2&I6t_1;*jk}cQFPgF~Giy`zbafhh`g_P#p3xunRp`2h&*O z%N*Tk4(wEJt477f(L4(qS^$^~oBT=YE(fOhS_JO>WObU?%}E=(I`vQYpo|J*PX$^0`^>S=ctWhYTAQlQ#B?FJA9A`-{wX`UVGEj_MZ>lzhUcyPdB1{zGzQ&+WmE8o8)M=H05Q{ zzGvubMn-y(`;6BADN@_$&yH$FMw*eoGcx!p`jw`3brYG)Fw$8jlSg{XWEuW4*{a9| zGTGDW$<6I;25+iR-_yzV{_nPzY!v-R_yx6mD5&`}rlq~T<{+i^mfn6+?;uiYf7JaI zG%HQyr#ydq2ukhkHU9_u=lpiX#I|XOg8x0c|6$Yn?3nSw?+2!S__kwYq@zdP;w;V2 zmRlwM<{4}L{H%QcscoCHr@Xl z5eZ7Q|6O{DdJ|=mqNPNqbQ!#9(<@cAb+4CJRcjX29U4`5rb0_VUBzf#7Z$xkOM>Wx zJtH#;N`^^gp6^P}{EXvCP+493`H@p~T8C?DM@n^4&gbFtNptg@+bG=sz-@o*j|}?} zgYLnwPcrOB!iNC8fMIWA&;c0sSzKE%?B~K>gZ|XYZ-Bj*VeezuZ(G&#@v-kU@cG)z z5C4U-@1d*L+&2MTfI**wkK;0fP9%ICybOJYLEjRzK)2{{e&_)Vx|aa#=VJZPr5N-r z0nqapbVvrBsHqM<3+QwVIwsb9SpfIZNb^f|&=oqIpZibvnxPLe=oSJv9njwx^Z^Ax zA7s!s6=mKAollGn-HJgcWY9y!+My$fGOvT4C~)|FZjb-)<%s#Aw=n3dO@M3YvkbbM z0-zr;=wga8Z-b63#+L3`NB5umtlFC&dbOBe8lxvU_jN&!7WYJT9M0#?%nv(&aeo$n zwxRDc*aYxfIWp*840`8(Y7F`!gHFhxb2I4d40>ZL-aub&fBu@& z_0VmF&klNeyS|GD`7}DJ=l(bTJB1$3pkp$ApW9nM^w4_P9Sk-NgB~vcy1$?Ux~M2a zFNSZf$+yD&bQ}-%i16{jUQ+afJtO+TMiOxGW5sDqx&px-OXuo(mn_Zv!M!Tw`>eCXUA&fgI)d)mh5=X~yH{XLzd zqyC+lA9gW=ecI~)`%duxVe5yj+s60Wp8t^V@lrkZ5?+Ky>%lo};!e-c$CAc=Sl-c` z$~1Ll{)f$}+TIx&x-$Qh^*`SG- z{SJJ+ZS;Sfl|{f8{tx)-{{=tlZTMGj!`JyY_@{q@AH5#F(_i3=ZG=C$5q{|ge(ni> zbTb@lfd97v{^v%H2OsUv@Z<1yBL__vDz2b-Z7U_BHnAquweA~LggqV+Mcg&-a+m;5(uqKXrUS(`hLg2Fe@R-A?84iuk~O6#I`klUJI#Kz4c@6~JQF1t^= z_UGVS!klc}JgK@g8!>Mi5pQ;aCgXerH=ed6?WOFz9J+YpCgSjH$q(lxhihsmwK|g= z{Q@bwxP;sg?>9<&Dis&x(D5^8NzZr*Wqg~8vkwlGA}kchLl0CJW4;;iiq=^8Dj?DE58?%+&$hmTR%_Bfog z=~3M`S7@HOCGElapRK14rRU}234fCQ=Qyw?2)J~Df`p%8~a?I2*{#M#ZZ%0K1^IUuJcBLNi8t;h8)?eyVw6vbp(3qp8 zWu&eBxhnoEzP`SnYO9%Z?F2OQB+dpytH(vC1N*rlQIwt>M&ZPoE3w9{Q?%=lD$`0G!< z8?F8ITI+WwIrG&h*1MxMJrS*!swg=`MJ0$rhxpTZ`heqwT12P|eAl+)Pq()=F?6#t z50N*gXZFNAH$HB%8t*W;HNM4kueo{>o@)NuAT{k*TjNjPGbAuDMK0eH7}y8sUjzom z$mPod1Ai-*F9{5Ee1DS4_=a-J5hH?)sle19Z2#`hO;`EOM5Rf$$9w;5lhUA3s$di?S7-CG`kw@gM2>r;!ow>_)L+df&Ryx+x{`n>r3tO<+Kbqz*1{0^I(hDOvbj~D*f zZ&doQ39%o4<`W+8rGzhCro9|D`#m3@_?P2(nmzlyxOh{k?SCWZb{h9Cx5>S+KCt92 zU*;Q6@~-lMp@UX?d{yB$kNaz}Q`I@QiQa0;o_s&yz@z5C+K5Plx{Ke;Ep;VR#Nu*hA$q2Y-E!kx5&gZC2hbJ@Pj87$*U6Y%TQ znoRLd$9!{Z20xDgajw0{RK!25!kIQ==Eb`gvykfACC5is@!qR)vIK7c4ASU9_iBs&@sWSpjoxjA+@YoGN z_1O!G`r;#1iZx#N_IeNKFB9}1$j@e_cvnY)w47Wqe$?(gY|W-<1#C%55%oL|RD* zTl(wD5$BYi)rLkMYryF@Tj|uMEdcQkye+e&oaL2O3aF|*E8=c={7)s`wUX-75Rbxf zIb7-i|1*or?eg0>al;2gJueY!HyJ^xhpI3fZ!E@z#E?>Xd z?dLzMq@v68^ZOFBHyv?6X$shem>?eO!`qZ;OU^mKvJV~-&y@6gRc`0kmv7waHTt(E zrQ$uqP2#y&>E(;~C0Di>aZEh65ARX2i8?szdBA&A()ka6uaCcL$j^Ux9F!^IcN}qU z7ZARgMeW|(YJHskD>u7OKX`MO^U)FUShEp>#m}B3Iv!Q7vv4u9$64fN#4ri^Z+zEn z{>LPz-s8NQhWIW^2NwZ6Zc3t^w@LLTD^@A$c{`7VlG-@0r9NhM4vPA*O7FcHEyFo# z^Bi1`@pm!ZgVurn-*=mSD<{|ceBQW}bXJ0QP&pJ;9%Yks=L&jwOqf*9^TpP-qMqNY z66~Q;+lH8(qTbrsO;N|&Jl6z^dL6{nl^kxtkKDOS)bn@uuHNcC{bqKKf`0xksl*$e zOMEj#e5-Oj-_Q7ZC*i$B<@$vd)}kKgLaplOV87$|U+d0kRd0m&QR#kNyY<7*-Q9n2 zuLb?mSdSyW_T684Kz|ee9|zsioY%ka0sSkR=%0mmnEAWH|0$Siuu$>*^n`x%X8Iii zLxhE`8b{XIGPL$)3%zr>g|oYY{u@91*zM;>nf}hws*2ZD+ByECpr12PmA1~7ySj!) zL4RjyRmJNn?Y+x?Cm}z7tRH9 zPoIC)H9f4{Tk=Pl{_gOxyU$#2(Qm23|E{j#VSIj2d+*WjqIiC~O1p&rAR0TW?=|`z zTIlD`f<#ki^Nwij=-KKm`mL1c?<~!#c->h;Z_~fR%a60`SId7ZSMM&OVc+TgqyKw1_PjK+x zx^jN!BA16CcK(vRm)B1&zP|tP3tj)?hHWu_-IzDY{ zw4Y;kC;l@$dfRQ^b?bh_I|l!-_w@Xivs`}F$FFtV^6?4Be~HDq`uU~1`ui8T`1&8koM$lKw@yCtoBRw@0!{ + +101 ICON "@srcdir@/tilem2.ico" + +VS_VERSION_INFO VERSIONINFO + FILEVERSION BUILD_VERSION + PRODUCTVERSION BUILD_VERSION + FILEFLAGSMASK 0 + FILEFLAGS 0 + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + BEGIN + VALUE "CompanyName", "Linux Programmer Group" + VALUE "FileDescription", "TilEm" + VALUE "FileVersion", "@PACKAGE_VERSION@" + VALUE "InternalName", "tilem2" + VALUE "LegalCopyright", "Copyright \xa9 2012 The TilEm Project" + VALUE "OriginalFilename", "tilem2.exe" + VALUE "ProductName", "@PACKAGE_NAME@" + VALUE "ProductVersion", "@PACKAGE_VERSION@" + VALUE "Comments", "Licensed under the GNU GPLv3+ (see http://www.gnu.org/licenses/.)" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END + END diff --git a/tool/tilem-src/gui/tool.c b/tool/tilem-src/gui/tool.c new file mode 100644 index 0000000..417df05 --- /dev/null +++ b/tool/tilem-src/gui/tool.c @@ -0,0 +1,433 @@ +/* + * TilEm II + * + * Copyright (c) 2010-2011 Thibault Duponchelle + * Copyright (c) 2010 Benjamin Moody + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include "gui.h" + +/* Create a frame around the given widget, with a boldface label in + the GNOME style */ +GtkWidget* new_frame(const gchar* label, GtkWidget* contents) +{ + GtkWidget *frame, *align; + char *str; + + str = g_strconcat("", label, "", NULL); + frame = gtk_frame_new(str); + g_free(str); + + g_object_set(gtk_frame_get_label_widget(GTK_FRAME(frame)), + "use-markup", TRUE, NULL); + gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_NONE); + + align = gtk_alignment_new(0.5, 0.5, 1.0, 1.0); + gtk_alignment_set_padding(GTK_ALIGNMENT(align), 6, 0, 12, 0); + gtk_widget_show(align); + gtk_container_add(GTK_CONTAINER(frame), align); + gtk_container_add(GTK_CONTAINER(align), contents); + gtk_widget_show(frame); + + return frame; +} + +/* Get model name (abbreviation) for a TilEm model ID. */ +const char * model_to_name(int model) +{ + const TilemHardware **models; + int nmodels, i; + + tilem_get_supported_hardware(&models, &nmodels); + for (i = 0; i < nmodels; i++) + if (models[i]->model_id == model) + return models[i]->name; + + return NULL; +} + +/* Convert model name to a model ID. */ +int name_to_model(const char *name) +{ + char *s; + const TilemHardware **models; + int nmodels, i, j; + + s = g_new(char, strlen(name) + 1); + for (i = j = 0; name[i]; i++) { + if (name[i] == '+') + s[j++] = 'p'; + else if (name[i] != '-') + s[j++] = g_ascii_tolower(name[i]); + } + s[j] = 0; + + tilem_get_supported_hardware(&models, &nmodels); + for (i = 0; i < nmodels; i++) { + if (!strcmp(s, models[i]->name)) { + g_free(s); + return models[i]->model_id; + } + } + + g_free(s); + return 0; +} + +/* Convert TilEm model ID to tifiles2 model ID. */ +CalcModel model_to_calcmodel(int model) +{ + switch (model) { + case TILEM_CALC_TI73: + return CALC_TI73; + + case TILEM_CALC_TI82: + return CALC_TI82; + + case TILEM_CALC_TI83: + case TILEM_CALC_TI76: + return CALC_TI83; + + case TILEM_CALC_TI83P: + case TILEM_CALC_TI83P_SE: + return CALC_TI83P; + + case TILEM_CALC_TI84P: + case TILEM_CALC_TI84P_SE: + case TILEM_CALC_TI84P_NSPIRE: + return CALC_TI84P; + + case TILEM_CALC_TI85: + return CALC_TI85; + + case TILEM_CALC_TI86: + return CALC_TI86; + + default: + return CALC_NONE; + } +} + +/* Convert tifiles2 model ID to TilEm model ID. */ +int calcmodel_to_model(CalcModel model) +{ + switch (model) { + case CALC_TI73: + return TILEM_CALC_TI73; + case CALC_TI82: + return TILEM_CALC_TI82; + case CALC_TI83: + return TILEM_CALC_TI83; + case CALC_TI83P: + return TILEM_CALC_TI83P; + case CALC_TI84P: + return TILEM_CALC_TI84P; + case CALC_TI85: + return TILEM_CALC_TI85; + case CALC_TI86: + return TILEM_CALC_TI86; + default: + return 0; + } +} + +/* Get model ID for a given file. */ +int file_to_model(const char *name) +{ + const char *p; + TigContent *tig; + int model; + + p = strrchr(name, '.'); + if (!p || strlen(p) < 4 || strchr(p, '/') || strchr(p, '\\')) + return 0; + p++; + + if (!g_ascii_strcasecmp(p, "prg")) + return TILEM_CALC_TI81; + + if (!g_ascii_strncasecmp(p, "73", 2)) + return TILEM_CALC_TI73; + if (!g_ascii_strncasecmp(p, "82", 2)) + return TILEM_CALC_TI82; + if (!g_ascii_strncasecmp(p, "83", 2)) + return TILEM_CALC_TI83; + if (!g_ascii_strncasecmp(p, "8x", 2)) + return TILEM_CALC_TI83P; + if (!g_ascii_strncasecmp(p, "85", 2)) + return TILEM_CALC_TI85; + if (!g_ascii_strncasecmp(p, "86", 2)) + return TILEM_CALC_TI86; + + if (!g_ascii_strcasecmp(p, "tig") + || !g_ascii_strcasecmp(p, "zip")) { + /* read file and see what tifiles thinks the type is */ + tig = tifiles_content_create_tigroup(CALC_NONE, 0); + tifiles_file_read_tigroup(name, tig); + model = calcmodel_to_model(tig->model); + tifiles_content_delete_tigroup(tig); + return model; + } + + return 0; +} + +/* Get "base" model for file type support. */ +int model_to_base_model(int calc_model) +{ + switch (calc_model) { + case TILEM_CALC_TI83: + case TILEM_CALC_TI76: + return TILEM_CALC_TI83; + + case TILEM_CALC_TI83P: + case TILEM_CALC_TI83P_SE: + case TILEM_CALC_TI84P: + case TILEM_CALC_TI84P_SE: + case TILEM_CALC_TI84P_NSPIRE: + return TILEM_CALC_TI83P; + + default: + return calc_model; + } +} + +/* Check if calc is compatible with given file type. */ +gboolean model_supports_file(int calc_model, int file_model) +{ + calc_model = model_to_base_model(calc_model); + file_model = model_to_base_model(file_model); + + if (file_model == calc_model) + return TRUE; + + if (file_model == TILEM_CALC_TI82 + && (calc_model == TILEM_CALC_TI83 + || calc_model == TILEM_CALC_TI83P)) + return TRUE; + + if (file_model == TILEM_CALC_TI83 + && (calc_model == TILEM_CALC_TI83P)) + return TRUE; + + if (file_model == TILEM_CALC_TI85 + && (calc_model == TILEM_CALC_TI86)) + return TRUE; + + return FALSE; +} + +/* A popup which is used to let the user choose the model at startup */ +char choose_rom_popup(GtkWidget *parent_window, const char *filename, + char default_model) +{ + const TilemHardware **models; + GtkWidget *dlg, *vbox, *frame, *btn; + GtkToggleButton **btns; + char *ids, id = 0; + int nmodels, noptions, i, j, defoption = 0, response; + dword romsize; + char *fn, *msg; + + tilem_get_supported_hardware(&models, &nmodels); + + /* determine ROM size for default model */ + for (i = 0; i < nmodels; i++) + if (models[i]->model_id == default_model) + break; + + g_return_val_if_fail(i < nmodels, 0); + + romsize = models[i]->romsize; + + /* all other models with same ROM size are candidates */ + noptions = 0; + for (i = 0; i < nmodels; i++) { + if (models[i]->model_id == default_model) + defoption = noptions; + if (models[i]->romsize == romsize) + noptions++; + } + + if (noptions < 2) /* no choice */ + return default_model; + + dlg = gtk_dialog_new_with_buttons("Select Calculator Type", + GTK_WINDOW(parent_window), + GTK_DIALOG_MODAL, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_set_alternative_button_order(GTK_DIALOG(dlg), + GTK_RESPONSE_OK, + GTK_RESPONSE_CANCEL, + -1); + gtk_dialog_set_default_response(GTK_DIALOG(dlg), + GTK_RESPONSE_OK); + + vbox = gtk_vbox_new(TRUE, 0); + + /* create radio buttons */ + + btns = g_new(GtkToggleButton*, noptions); + ids = g_new(char, noptions); + btn = NULL; + for (i = j = 0; i < nmodels; i++) { + if (models[i]->romsize == romsize) { + btn = gtk_radio_button_new_with_label_from_widget + (GTK_RADIO_BUTTON(btn), models[i]->desc); + btns[j] = GTK_TOGGLE_BUTTON(btn); + ids[j] = models[i]->model_id; + gtk_box_pack_start(GTK_BOX(vbox), btn, TRUE, TRUE, 3); + j++; + } + } + + gtk_toggle_button_set_active(btns[defoption], TRUE); + + fn = g_filename_display_basename(filename); + msg = g_strdup_printf("Calculator type for %s:", fn); + frame = new_frame(msg, vbox); + g_free(fn); + g_free(msg); + + gtk_container_set_border_width(GTK_CONTAINER(frame), 6); + gtk_widget_show_all(frame); + + vbox = gtk_dialog_get_content_area(GTK_DIALOG(dlg)); + gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); + + response = gtk_dialog_run(GTK_DIALOG(dlg)); + + if (response == GTK_RESPONSE_OK) { + for (i = 0; i < noptions; i++) { + if (gtk_toggle_button_get_active(btns[i])) { + id = ids[i]; + break; + } + } + } + else { + id = 0; + } + + gtk_widget_destroy(dlg); + g_free(btns); + g_free(ids); + + return id; +} + +/* Convert UTF-8 to filename encoding. Use ASCII digits in place of + subscripts if necessary. If conversion fails utterly, fall back to + the UTF-8 name, which is broken but better than nothing. */ +char * utf8_to_filename(const char *utf8str) +{ + gchar *result, *ibuf, *obuf, *p; + gsize icount, ocount; + const gchar **charsets; + GIConv ic; + gunichar c; + + if (g_get_filename_charsets(&charsets)) + return g_strdup(utf8str); + + ic = g_iconv_open(charsets[0], "UTF-8"); + if (!ic) { + g_warning("utf8_to_filename: unsupported charset %s", + charsets[0]); + return g_strdup(utf8str); + } + + ibuf = (gchar*) utf8str; + icount = strlen(utf8str); + ocount = icount * 2; /* be generous */ + result = obuf = g_new(gchar, ocount + 1); + + while (g_iconv(ic, &ibuf, &icount, &obuf, &ocount) == (gsize) -1) { + if (errno != EILSEQ) { + g_warning("utf8_to_filename: error in conversion"); + g_free(result); + g_iconv_close(ic); + return g_strdup(utf8str); + } + + c = g_utf8_get_char(ibuf); + if (c >= 0x2080 && c <= 0x2089) + *obuf = c - 0x2080 + '0'; + else + *obuf = '_'; + obuf++; + ocount--; + + p = g_utf8_next_char(ibuf); + icount -= p - ibuf; + ibuf = p; + } + + *obuf = 0; + g_iconv_close(ic); + return result; +} + +/* Convert UTF-8 to a subset of UTF-8 that is compatible with the + locale */ +char * utf8_to_restricted_utf8(const char *utf8str) +{ + char *p, *q; + p = utf8_to_filename(utf8str); + q = g_filename_to_utf8(p, -1, NULL, NULL, NULL); + g_free(p); + if (q) + return q; + else + return g_strdup(utf8str); +} + +/* Generate default filename (UTF-8) for a variable */ +char * get_default_filename(const TilemVarEntry *tve) +{ + GString *str = g_string_new(""); + + if (tve->slot_str) { + g_string_append(str, tve->slot_str); + if (tve->name_str && tve->name_str[0]) { + g_string_append_c(str, '-'); + g_string_append(str, tve->name_str); + } + } + else if (tve->name_str && tve->name_str[0]) { + g_string_append(str, tve->name_str); + } + else { + g_string_append(str, "untitled"); + } + g_string_append_c(str, '.'); + g_string_append(str, tve->file_ext); + return g_string_free(str, FALSE); +} diff --git a/tool/tilem-src/install-sh b/tool/tilem-src/install-sh new file mode 100755 index 0000000..6781b98 --- /dev/null +++ b/tool/tilem-src/install-sh @@ -0,0 +1,520 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2009-04-28.21; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +nl=' +' +IFS=" "" $nl" + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit=${DOITPROG-} +if test -z "$doit"; then + doit_exec=exec +else + doit_exec=$doit +fi + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_glob='?' +initialize_posix_glob=' + test "$posix_glob" != "?" || { + if (set -f) 2>/dev/null; then + posix_glob= + else + posix_glob=: + fi + } +' + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +no_target_directory= + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *' '* | *' +'* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) dst_arg=$2 + shift;; + + -T) no_target_directory=true;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call `install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + trap '(exit $?); exit' 1 2 13 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names starting with `-'. + case $src in + -*) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + + dst=$dst_arg + # Protect names starting with `-'. + case $dst in + -*) dst=./$dst;; + esac + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| . 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q' + ` + + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writeable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + -*) prefix='./';; + *) prefix='';; + esac + + eval "$initialize_posix_glob" + + oIFS=$IFS + IFS=/ + $posix_glob set -f + set fnord $dstdir + shift + $posix_glob set +f + IFS=$oIFS + + prefixes= + + for d + do + test -z "$d" && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + + eval "$initialize_posix_glob" && + $posix_glob set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + $posix_glob set +f && + + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/tool/tilem-src/installer/win32/COPYING-PIXMAN b/tool/tilem-src/installer/win32/COPYING-PIXMAN new file mode 100644 index 0000000..42c4912 --- /dev/null +++ b/tool/tilem-src/installer/win32/COPYING-PIXMAN @@ -0,0 +1,39 @@ +License for pixman +------------------ + + Copyright 1987, 1988, 1989, 1998 The Open Group + Copyright 1987, 1988, 1989 Digital Equipment Corporation + Copyright 1999, 2004, 2008 Keith Packard + Copyright 2000 SuSE, Inc. + Copyright 2000 Keith Packard, member of The XFree86 Project, Inc. + Copyright 2004, 2005, 2007, 2008, 2009, 2010 Red Hat, Inc. + Copyright 2004 Nicholas Miell + Copyright 2005 Lars Knoll & Zack Rusin, Trolltech + Copyright 2005 Trolltech AS + Copyright 2007 Luca Barbato + Copyright 2008 Aaron Plattner, NVIDIA Corporation + Copyright 2008 Rodrigo Kumpera + Copyright 2008 André Tupinambá + Copyright 2008 Mozilla Corporation + Copyright 2008 Frederic Plourde + Copyright 2009, Oracle and/or its affiliates. All rights reserved. + Copyright 2009, 2010 Nokia Corporation + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice (including the next + paragraph) shall be included in all copies or substantial portions of the + Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. diff --git a/tool/tilem-src/installer/win32/COPYING-ZLIB b/tool/tilem-src/installer/win32/COPYING-ZLIB new file mode 100644 index 0000000..ad5a38c --- /dev/null +++ b/tool/tilem-src/installer/win32/COPYING-ZLIB @@ -0,0 +1,23 @@ +License for zlib +---------------- + + (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 diff --git a/tool/tilem-src/installer/win32/Makefile.in b/tool/tilem-src/installer/win32/Makefile.in new file mode 100644 index 0000000..898f1b9 --- /dev/null +++ b/tool/tilem-src/installer/win32/Makefile.in @@ -0,0 +1,184 @@ +MAKENSIS = @MAKENSIS@ +STRIP = @STRIP@ +OBJDUMP = @OBJDUMP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +SHELL = @SHELL@ +LN_S = @LN_S@ + +abs_builddir = @abs_builddir@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +srcdir = @srcdir@ +VPATH = @srcdir@ +@SET_MAKE@ + +main_program = tilem2.exe + +docs = README KEYS NEWS COPYING CHANGELOG THANKS +extra_docs = COPYING-PIXMAN COPYING-ZLIB + +install_files = $(main_program) *.dll *.txt +install_subdirs = etc lib share + +extra_gtk_files = lib/gtk-2.0/2.10.0/engines/libwimp.dll +extra_dlls = + +GTK_BINDIR = @GTK_BINDIR@ +TICALCS_BINDIR = @TICALCS_BINDIR@ +DLLPATH = @DLLPATH@ +PATH_SEPARATOR = @PATH_SEPARATOR@ + +system_dlls = advapi32.dll cfgmgr32.dll comctl32.dll comdlg32.dll dnsapi.dll \ + gdi32.dll gdiplus.dll imm32.dll kernel32.dll msimg32.dll \ + msvcrt.dll ole32.dll setupapi.dll shell32.dll shlwapi.dll \ + user32.dll usp10.dll winspool.drv ws2_32.dll wsock32.dll + +all: install + +#### Build the installer + +dist: install installer.nsi + rm -f files.nsi rmfiles.nsi rmdirs.nsi + set -e ; for file in $(install_files) ; do \ + name=`echo "$$file" | sed 's,/,\\\\,g'` ; \ + echo "File \"$$name\"" >> files.nsi ; \ + echo "Delete \"\$$INSTDIR\\$$name\"" >> rmfiles.nsi ; \ + done + set -e ; for dir in $(install_subdirs) ; do \ + if [ -d $$dir ] ; then \ + echo "File /r \"$$dir\"" >> files.nsi ; \ + fi ; \ + done + set -e ; LC_ALL=C ; export LC_ALL ; \ + for file in `find -L $(install_subdirs) | sort -r` ; do \ + name=`echo "$$file" | sed 's,/,\\\\,g'` ; \ + if [ -d $$file ] ; then \ + echo "RmDir \"\$$INSTDIR\\$$name\"" >> rmdirs.nsi ; \ + else \ + echo "Delete \"\$$INSTDIR\\$$name\"" >> rmfiles.nsi ; \ + fi ; \ + done + $(MAKENSIS) installer.nsi + +installer.nsi: installer.nsi.in $(top_builddir)/config.status + cd $(top_builddir) && $(SHELL) ./config.status installer/win32/installer.nsi + +#### Install files into this directory + +install: install-bin install-data install-config install-extra install-libs + +# Install the program itself and data files + +install-bin: $(main_program) + +$(main_program): $(top_builddir)/gui/$(main_program) + cd $(top_builddir)/gui && $(MAKE) install bindir=$(abs_builddir) + $(STRIP) $(main_program) + +install-data: + cd $(top_builddir)/data && $(MAKE) install prefix=$(abs_builddir) + rm -rf share/mime + rm -rf share/applications + rm -rf share/icons + set -e ; for file in $(docs) ; do \ + sed 's/\r*$$/\r/' < $(top_srcdir)/$$file > $$file.txt ; \ + done + set -e ; for file in $(extra_docs) ; do \ + sed 's/\r*$$/\r/' < $(srcdir)/$$file > $$file.txt ; \ + done + +# Install GTK+ configuration + +install-config: + $(INSTALL) -d -m 755 etc/gtk-2.0 + $(INSTALL_DATA) $(srcdir)/gtkrc etc/gtk-2.0 + +# Install additional files + +install-extra: install-extra-stamp + +install-extra-stamp: + set -e ; for file in $(extra_gtk_files) ; do \ + rm -f $$file ; \ + $(INSTALL) -d -m 755 `dirname $$file` ; \ + for dir in `echo $(DLLPATH) | tr $(PATH_SEPARATOR) ' '` ; do \ + if [ -d $$dir ] && [ -f $$dir/../$$file ] ; then \ + $(LN_S) $$dir/../$$file $$file ; \ + break ; \ + fi ; \ + done ; \ + if ! [ -f $$file ] ; then \ + echo "** Cannot find $$file **" ; \ + echo ; \ + echo " Directories searched: $(DLLPATH)" ; \ + echo ; \ + exit 1 ; \ + fi ; \ + done + touch install-extra-stamp + +# Install required libraries + +install-libs: install-libs-stamp + +install-libs-stamp: $(main_program) install-extra-stamp + rm -f dlls missing-dlls + echo $(main_program) > binfiles + ls $(extra_gtk_files) | grep 'dll$$' >> binfiles + echo $(extra_dlls) > dlls + set -e ; LC_ALL=C ; export LC_ALL ; \ + while [ -s binfiles ] ; do \ + for bin in `cat binfiles` ; do \ + $(OBJDUMP) -p $$bin | \ + sed -n '/DLL Name:/{s/.*DLL Name: *\([^ ]*\).*/\1/;p}' | \ + tr A-Z a-z >> dlls ; \ + done ; \ + rm -f binfiles ; \ + for lib in `cat dlls` ; do \ + if ! [ -f ./$$lib ] && ! echo $(system_dlls) | grep -q $$lib ; then \ + for dir in `echo $(DLLPATH) | tr $(PATH_SEPARATOR) ' '` ; do \ + if [ -d $$dir ] && [ -f $$dir/$$lib ] ; then \ + $(LN_S) $$dir/$$lib . ; \ + echo $$lib >> binfiles ; \ + break ; \ + fi ; \ + done ; \ + if ! [ -f $$lib ] ; then \ + echo $$lib >> missing-dlls ; \ + fi ; \ + fi ; \ + done ; \ + rm -f dlls ; \ + done + @if [ -s missing-dlls ] ; then \ + echo "** Cannot find the following libraries **" ; \ + cat missing-dlls ; \ + echo ; \ + echo " If these libraries are part of a standard Windows" ; \ + echo " installation, add them to the list of 'system_dlls'" ; \ + echo " in Makefile.in." ; \ + echo ; \ + echo " Directories searched: $(DLLPATH)" ; \ + echo ; \ + exit 1 ; \ + fi + touch install-libs-stamp + + +clean: + rm -f install-libs-stamp install-extra-stamp + rm -f $(install_files) + rm -rf $(install_subdirs) + rm -f dlls missing-dlls binfiles + rm -f files.nsi rmfiles.nsi rmdirs.nsi + + +Makefile: Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && $(SHELL) ./config.status + +$(top_builddir)/config.status: $(top_srcdir)/configure + cd $(top_builddir) && $(SHELL) ./config.status --recheck + +.PRECIOUS: Makefile $(top_builddir)/config.status +.PHONY: all clean install install-bin install-data install-config install-libraries install-extra diff --git a/tool/tilem-src/installer/win32/gtkrc b/tool/tilem-src/installer/win32/gtkrc new file mode 100644 index 0000000..8942b20 --- /dev/null +++ b/tool/tilem-src/installer/win32/gtkrc @@ -0,0 +1,75 @@ +gtk-icon-sizes = "gtk-menu=13,13:gtk-small-toolbar=16,16:gtk-large-toolbar=24,24:gtk-dnd=32,32" +gtk-toolbar-icon-size = small-toolbar +gtk-toolbar-style = GTK_TOOLBAR_ICONS + +# disable images in buttons. i've only seen ugly delphi apps use this feature. +gtk-button-images = 0 + +# enable/disable images in menus. most "stock" microsoft apps don't use these, except sparingly. +# the office apps use them heavily, though. +gtk-menu-images = 0 + +# use the win32 button ordering instead of the GNOME HIG one, where applicable +gtk-alternative-button-order = 1 + +# use the win32 sort indicators direction, as in Explorer +gtk-alternative-sort-arrows = 1 + +# Windows users don't expect the PC Speaker beeping at them when they backspace in an empty textview and stuff like that +gtk-error-bell = 0 + +style "msw-default" +{ + GtkWidget::interior-focus = 1 + GtkOptionMenu::indicator-size = { 9, 5 } + GtkOptionMenu::indicator-spacing = { 7, 5, 2, 2 } + GtkSpinButton::shadow-type = in + + # Owen and I disagree that these should be themable + #GtkUIManager::add-tearoffs = 0 + #GtkComboBox::add-tearoffs = 0 + + GtkComboBox::appears-as-list = 1 + GtkComboBox::focus-on-click = 0 + + GOComboBox::add_tearoffs = 0 + + GtkTreeView::allow-rules = 0 + GtkTreeView::expander-size = 12 + + GtkExpander::expander-size = 12 + + GtkScrolledWindow::scrollbar_spacing = 1 + + GtkSeparatorMenuItem::horizontal-padding = 2 + + engine "wimp" + { + } +} +class "*" style "msw-default" + +binding "ms-windows-tree-view" +{ + bind "Right" { "expand-collapse-cursor-row" (1,1,0) } + bind "Left" { "expand-collapse-cursor-row" (1,0,0) } +} + +class "GtkTreeView" binding "ms-windows-tree-view" + +style "msw-combobox-thickness" = "msw-default" +{ + xthickness = 0 + ythickness = 0 +} + +widget_class "*TreeView*ComboBox*" style "msw-combobox-thickness" +widget_class "*ComboBox*GtkFrame*" style "msw-combobox-thickness" + +# work around issue with "list-style" cellrenderercombos not emitting +# the "edited" signal - GNOME bug #317387 +style "menu-style-combo" +{ + GtkComboBox::appears-as-list = 0 +} +widget_class "*.GtkTreeView.GtkComboBox" style "menu-style-combo" diff --git a/tool/tilem-src/installer/win32/installer.nsi.in b/tool/tilem-src/installer/win32/installer.nsi.in new file mode 100644 index 0000000..f662691 --- /dev/null +++ b/tool/tilem-src/installer/win32/installer.nsi.in @@ -0,0 +1,82 @@ +Name "@PACKAGE_NAME@" +OutFile "@PACKAGE_TARNAME@-@PACKAGE_VERSION@.exe" +SetCompressor /solid lzma + +!define MULTIUSER_EXECUTIONLEVEL Highest +!define MULTIUSER_MUI +!define MULTIUSER_INSTALLMODE_INSTDIR "@PACKAGE_NAME@" +!include "MultiUser.nsh" +!include "MUI2.nsh" + +Var StartMenuFolder + +!define MUI_FINISHPAGE_RUN "" +!define MUI_FINISHPAGE_RUN_TEXT "Create a desktop shortcut" +!define MUI_FINISHPAGE_RUN_FUNCTION desktopicon + +!insertmacro MUI_PAGE_WELCOME +!insertmacro MULTIUSER_PAGE_INSTALLMODE +!insertmacro MUI_PAGE_DIRECTORY +!insertmacro MUI_PAGE_STARTMENU Application $StartMenuFolder +!insertmacro MUI_PAGE_INSTFILES +!insertmacro MUI_PAGE_FINISH + +!insertmacro MUI_UNPAGE_WELCOME +!insertmacro MUI_UNPAGE_INSTFILES +!insertmacro MUI_UNPAGE_FINISH + +!insertmacro MUI_LANGUAGE "English" + +Function .onInit + !insertmacro MULTIUSER_INIT +FunctionEnd + +Function un.onInit + UserInfo::GetAccountType + Pop $MultiUser.Privileges + ReadINIStr $0 "$INSTDIR\uninstall.ini" "Uninstall" "InstallMode" + ${if} $0 == "AllUsers" + call un.MultiUser.InstallMode.AllUsers + ${else} + call un.MultiUser.InstallMode.CurrentUser + ${endif} +FunctionEnd + +Function desktopicon + SetShellVarContext current + CreateShortCut "$DESKTOP\TilEm.lnk" "$INSTDIR\tilem2.exe" +FunctionEnd + +Section + SetOutPath "$INSTDIR" + !include "files.nsi" + + !insertmacro MUI_STARTMENU_WRITE_BEGIN Application + CreateDirectory "$SMPROGRAMS\$StartMenuFolder" + CreateShortCut "$SMPROGRAMS\$StartMenuFolder\TilEm.lnk" "$INSTDIR\tilem2.exe" + CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Uninstall TilEm.lnk" "$INSTDIR\uninstall.exe" + WriteINIStr "$INSTDIR\uninstall.ini" "Uninstall" "StartMenuFolder" $StartMenuFolder + !insertmacro MUI_STARTMENU_WRITE_END + + WriteINIStr "$INSTDIR\uninstall.ini" "Uninstall" "InstallMode" $MultiUser.InstallMode + WriteUninstaller "$INSTDIR\uninstall.exe" +SectionEnd + +Section "Uninstall" + !include "rmfiles.nsi" + !include "rmdirs.nsi" + + ReadINIStr $StartMenuFolder "$INSTDIR\uninstall.ini" "Uninstall" "StartMenuFolder" + ${if} $StartMenuFolder != "" + Delete "$SMPROGRAMS\$StartMenuFolder\TilEm.lnk" + Delete "$SMPROGRAMS\$StartMenuFolder\Uninstall TilEm.lnk" + RmDir "$SMPROGRAMS\$StartMenuFolder" + ${endif} + + SetShellVarContext current + Delete "$DESKTOP\TilEm.lnk" + + Delete "$INSTDIR\uninstall.ini" + Delete "$INSTDIR\uninstall.exe" + RmDir "$INSTDIR" +SectionEnd